@mastra/server 1.60.0-alpha.8 → 1.60.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 (294) hide show
  1. package/CHANGELOG.md +140 -0
  2. package/dist/{a2a-Eeib3vfP.cjs → a2a-BtXFFv-0.cjs} +4 -4
  3. package/dist/{a2a-Eeib3vfP.cjs.map → a2a-BtXFFv-0.cjs.map} +1 -1
  4. package/dist/{a2a-B5m54dOP.js → a2a-DZhtQeFL.js} +3 -3
  5. package/dist/{a2a-B5m54dOP.js.map → a2a-DZhtQeFL.js.map} +1 -1
  6. package/dist/{agent-versions-xeysPGel.cjs → agent-versions-MYjO6Wl1.cjs} +2 -2
  7. package/dist/{agent-versions-xeysPGel.cjs.map → agent-versions-MYjO6Wl1.cjs.map} +1 -1
  8. package/dist/{agent-versions-CWEnD62A.js → agent-versions-mFXaw5ma.js} +2 -2
  9. package/dist/{agent-versions-CWEnD62A.js.map → agent-versions-mFXaw5ma.js.map} +1 -1
  10. package/dist/{api-schema-manifest-BKTXRheC.js → api-schema-manifest-Bx_zU5qw.js} +2 -2
  11. package/dist/{api-schema-manifest-BKTXRheC.js.map → api-schema-manifest-Bx_zU5qw.js.map} +1 -1
  12. package/dist/{api-schema-manifest-BbNdh5Ck.cjs → api-schema-manifest-DPgfugJT.cjs} +4 -3
  13. package/dist/{api-schema-manifest-BbNdh5Ck.cjs.map → api-schema-manifest-DPgfugJT.cjs.map} +1 -1
  14. package/dist/{background-tasks-C5G2jJax.cjs → background-tasks-8M9W_27g.cjs} +2 -2
  15. package/dist/{background-tasks-C5G2jJax.cjs.map → background-tasks-8M9W_27g.cjs.map} +1 -1
  16. package/dist/{builder-registry-CyaUg_iP.cjs → builder-registry-Dcd_ApmT.cjs} +3 -3
  17. package/dist/{builder-registry-CyaUg_iP.cjs.map → builder-registry-Dcd_ApmT.cjs.map} +1 -1
  18. package/dist/{builder-registry-CqLsr39q.js → builder-registry-DnEa4qnF.js} +2 -2
  19. package/dist/{builder-registry-CqLsr39q.js.map → builder-registry-DnEa4qnF.js.map} +1 -1
  20. package/dist/{channels-BnFQESMf.js → channels-BO3Zd38V.js} +2 -2
  21. package/dist/{channels-BnFQESMf.js.map → channels-BO3Zd38V.js.map} +1 -1
  22. package/dist/{channels-Dzy6VM3w.cjs → channels-D9WRnKzU.cjs} +3 -3
  23. package/dist/{channels-Dzy6VM3w.cjs.map → channels-D9WRnKzU.cjs.map} +1 -1
  24. package/dist/{constants-CutMu4A_.js → constants-0jFCWoex.js} +13 -2
  25. package/dist/constants-0jFCWoex.js.map +1 -0
  26. package/dist/{constants-CXPpy-Ef.cjs → constants-4IJp_uzj.cjs} +18 -1
  27. package/dist/constants-4IJp_uzj.cjs.map +1 -0
  28. package/dist/{conversations-CcFLCCeF.cjs → conversations-PF0eKhIu.cjs} +3 -3
  29. package/dist/{conversations-CcFLCCeF.cjs.map → conversations-PF0eKhIu.cjs.map} +1 -1
  30. package/dist/{dist-CAVC0nWG.cjs → dist-2zVeGGHi.cjs} +3 -2
  31. package/dist/{dist-CAVC0nWG.cjs.map → dist-2zVeGGHi.cjs.map} +1 -1
  32. package/dist/{dist-D7GkGue6.cjs → dist-8-Z5v77M.cjs} +3 -2
  33. package/dist/{dist-D7GkGue6.cjs.map → dist-8-Z5v77M.cjs.map} +1 -1
  34. package/dist/{dist-SKhVwZMV.cjs → dist-Be7Caz3Z.cjs} +3 -2
  35. package/dist/{dist-SKhVwZMV.cjs.map → dist-Be7Caz3Z.cjs.map} +1 -1
  36. package/dist/{dist-18h28zlO.cjs → dist-BfVTO0pC.cjs} +3 -2
  37. package/dist/{dist-18h28zlO.cjs.map → dist-BfVTO0pC.cjs.map} +1 -1
  38. package/dist/{dist-BD0I5lxM.js → dist-CHJcZQdS.js} +2 -2
  39. package/dist/{dist-BD0I5lxM.js.map → dist-CHJcZQdS.js.map} +1 -1
  40. package/dist/{dist-BpRGQqjE.cjs → dist-CJKQBH69.cjs} +2 -2
  41. package/dist/{dist-BpRGQqjE.cjs.map → dist-CJKQBH69.cjs.map} +1 -1
  42. package/dist/{dist-sUhxlnJz.js → dist-CRgxcDTg.js} +2 -2
  43. package/dist/{dist-sUhxlnJz.js.map → dist-CRgxcDTg.js.map} +1 -1
  44. package/dist/{dist-JdnTASYe.js → dist-CscF1cF8.js} +2 -2
  45. package/dist/{dist-JdnTASYe.js.map → dist-CscF1cF8.js.map} +1 -1
  46. package/dist/{dist-CpxQhZED.js → dist-Cw-T1gX6.js} +2818 -309
  47. package/dist/dist-Cw-T1gX6.js.map +1 -0
  48. package/dist/{dist-DBP9kw_8.cjs → dist-D4NzuG3G.cjs} +3 -2
  49. package/dist/{dist-DBP9kw_8.cjs.map → dist-D4NzuG3G.cjs.map} +1 -1
  50. package/dist/{dist-CpaK1qK1.cjs → dist-DERatX43.cjs} +2819 -310
  51. package/dist/dist-DERatX43.cjs.map +1 -0
  52. package/dist/{dist-mcwHCl2a.js → dist-F_Ql1co6.js} +2 -2
  53. package/dist/{dist-mcwHCl2a.js.map → dist-F_Ql1co6.js.map} +1 -1
  54. package/dist/{dist-C-9xUY65.js → dist-Jn3uXsoB.js} +2 -2
  55. package/dist/{dist-C-9xUY65.js.map → dist-Jn3uXsoB.js.map} +1 -1
  56. package/dist/{dist-DyBO3IVt.js → dist-bAFqx06T.js} +2 -2
  57. package/dist/{dist-DyBO3IVt.js.map → dist-bAFqx06T.js.map} +1 -1
  58. package/dist/docs/SKILL.md +1 -1
  59. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  60. package/dist/{dynamic-workflows-C-6vmau5.cjs → dynamic-workflows-BZ5ru36x.cjs} +3 -3
  61. package/dist/{dynamic-workflows-C-6vmau5.cjs.map → dynamic-workflows-BZ5ru36x.cjs.map} +1 -1
  62. package/dist/{dynamic-workflows-B0TE8mjA.js → dynamic-workflows-C6U0Rdoc.js} +2 -2
  63. package/dist/{dynamic-workflows-B0TE8mjA.js.map → dynamic-workflows-C6U0Rdoc.js.map} +1 -1
  64. package/dist/{editor-builder-1L3OIY4K.cjs → editor-builder-BmRQift0.cjs} +2 -2
  65. package/dist/{editor-builder-1L3OIY4K.cjs.map → editor-builder-BmRQift0.cjs.map} +1 -1
  66. package/dist/{helpers-C54OMiDG.cjs → helpers-BWxRRShz.cjs} +2 -2
  67. package/dist/{helpers-C54OMiDG.cjs.map → helpers-BWxRRShz.cjs.map} +1 -1
  68. package/dist/{helpers-Da9nPOFL.js → helpers-DBAYsA50.js} +2 -2
  69. package/dist/{helpers-Da9nPOFL.js.map → helpers-DBAYsA50.js.map} +1 -1
  70. package/dist/index.cjs +1 -0
  71. package/dist/index.cjs.map +1 -1
  72. package/dist/{observability-new-endpoints-BC-dasRY.cjs → observability-new-endpoints-gRCFhnRr.cjs} +2 -2
  73. package/dist/{observability-new-endpoints-BC-dasRY.cjs.map → observability-new-endpoints-gRCFhnRr.cjs.map} +1 -1
  74. package/dist/{probe-image-size-C2F59z8Z.cjs → probe-image-size-CDCRrXNo.cjs} +140 -33
  75. package/dist/probe-image-size-CDCRrXNo.cjs.map +1 -0
  76. package/dist/{probe-image-size-mXCWYNrz.js → probe-image-size-Tf8sNZhU.js} +137 -33
  77. package/dist/probe-image-size-Tf8sNZhU.js.map +1 -0
  78. package/dist/{responses-BI25doe1.cjs → responses-CKNdSRkS.cjs} +2 -2
  79. package/dist/{responses-BI25doe1.cjs.map → responses-CKNdSRkS.cjs.map} +1 -1
  80. package/dist/{rolldown-runtime-CVvi-lCc.cjs → rolldown-runtime-Bd6kNlEP.cjs} +21 -0
  81. package/dist/{rolldown-runtime-DuvcJU0W.js → rolldown-runtime-maW3aOIk.js} +10 -1
  82. package/dist/{route-builder-BAAedfru.cjs → route-builder-CWsok5ci.cjs} +2 -2
  83. package/dist/{route-builder-BAAedfru.cjs.map → route-builder-CWsok5ci.cjs.map} +1 -1
  84. package/dist/{routes-iUe0w9eL.js → routes-Bh2p-WqG.js} +5 -5
  85. package/dist/{routes-iUe0w9eL.js.map → routes-Bh2p-WqG.js.map} +1 -1
  86. package/dist/{routes-mK_LlDMo.cjs → routes-CdbboDwv.cjs} +10 -10
  87. package/dist/{routes-mK_LlDMo.cjs.map → routes-CdbboDwv.cjs.map} +1 -1
  88. package/dist/{schedules-DOK225ZZ.cjs → schedules-7YUg_TRM.cjs} +2 -2
  89. package/dist/{schedules-DOK225ZZ.cjs.map → schedules-7YUg_TRM.cjs.map} +1 -1
  90. package/dist/{schema-Bv9OdW1f-CHHI-NTr.cjs → schema-Bv9OdW1f-CxTiW8RD.cjs} +2 -2
  91. package/dist/{schema-Bv9OdW1f-CHHI-NTr.cjs.map → schema-Bv9OdW1f-CxTiW8RD.cjs.map} +1 -1
  92. package/dist/schema-CNKnRmv1.cjs +1 -0
  93. package/dist/{scorer-versions-CdVjOtQO.js → scorer-versions-D0_KP67E.js} +2 -2
  94. package/dist/{scorer-versions-CdVjOtQO.js.map → scorer-versions-D0_KP67E.js.map} +1 -1
  95. package/dist/{scorer-versions-CYXtxMTU.cjs → scorer-versions-mL--H4LL.cjs} +2 -2
  96. package/dist/{scorer-versions-CYXtxMTU.cjs.map → scorer-versions-mL--H4LL.cjs.map} +1 -1
  97. package/dist/server/a2a/store.cjs +1 -0
  98. package/dist/server/a2a/store.cjs.map +1 -1
  99. package/dist/server/auth/index.cjs +3 -2
  100. package/dist/server/auth/index.js +2 -2
  101. package/dist/server/browser-stream/index.cjs +1 -0
  102. package/dist/server/browser-stream/index.cjs.map +1 -1
  103. package/dist/server/constants.d.ts +11 -0
  104. package/dist/server/constants.d.ts.map +1 -1
  105. package/dist/server/handlers/a2a.cjs +2 -1
  106. package/dist/server/handlers/a2a.js +1 -1
  107. package/dist/server/handlers/agent-builder.cjs +4 -4
  108. package/dist/server/handlers/agent-builder.js +3 -3
  109. package/dist/server/handlers/agent-controller.cjs +53 -36
  110. package/dist/server/handlers/agent-controller.cjs.map +1 -1
  111. package/dist/server/handlers/agent-controller.d.ts +22 -2
  112. package/dist/server/handlers/agent-controller.d.ts.map +1 -1
  113. package/dist/server/handlers/agent-controller.js +51 -35
  114. package/dist/server/handlers/agent-controller.js.map +1 -1
  115. package/dist/server/handlers/agent-versions.cjs +4 -3
  116. package/dist/server/handlers/agent-versions.cjs.map +1 -1
  117. package/dist/server/handlers/agent-versions.js +2 -2
  118. package/dist/server/handlers/agents.cjs +8 -8
  119. package/dist/server/handlers/agents.d.ts +8 -0
  120. package/dist/server/handlers/agents.d.ts.map +1 -1
  121. package/dist/server/handlers/agents.js +5 -5
  122. package/dist/server/handlers/auth.cjs +16 -7
  123. package/dist/server/handlers/auth.cjs.map +1 -1
  124. package/dist/server/handlers/auth.d.ts +10 -4
  125. package/dist/server/handlers/auth.d.ts.map +1 -1
  126. package/dist/server/handlers/auth.js +14 -6
  127. package/dist/server/handlers/auth.js.map +1 -1
  128. package/dist/server/handlers/author-enrichment.cjs +1 -0
  129. package/dist/server/handlers/author-enrichment.cjs.map +1 -1
  130. package/dist/server/handlers/authorship.cjs +2 -1
  131. package/dist/server/handlers/authorship.cjs.map +1 -1
  132. package/dist/server/handlers/authorship.js +1 -1
  133. package/dist/server/handlers/background-tasks.cjs +2 -1
  134. package/dist/server/handlers/builder-registry.cjs +2 -1
  135. package/dist/server/handlers/builder-registry.js +1 -1
  136. package/dist/server/handlers/channels.cjs +2 -1
  137. package/dist/server/handlers/channels.js +1 -1
  138. package/dist/server/handlers/conversations.cjs +4 -4
  139. package/dist/server/handlers/conversations.js +2 -2
  140. package/dist/server/handlers/datasets.cjs +3 -2
  141. package/dist/server/handlers/datasets.cjs.map +1 -1
  142. package/dist/server/handlers/datasets.d.ts +6 -6
  143. package/dist/server/handlers/datasets.js +1 -1
  144. package/dist/server/handlers/dynamic-workflows.cjs +2 -1
  145. package/dist/server/handlers/dynamic-workflows.js +1 -1
  146. package/dist/server/handlers/editor-builder.cjs +2 -1
  147. package/dist/server/handlers/error.cjs +1 -0
  148. package/dist/server/handlers/error.cjs.map +1 -1
  149. package/dist/server/handlers/favorites-enrichment.cjs +2 -1
  150. package/dist/server/handlers/favorites-enrichment.cjs.map +1 -1
  151. package/dist/server/handlers/gateway-memory-client.cjs +1 -0
  152. package/dist/server/handlers/gateway-memory-client.cjs.map +1 -1
  153. package/dist/server/handlers/logs.cjs +3 -3
  154. package/dist/server/handlers/logs.js +2 -2
  155. package/dist/server/handlers/mcp-client-versions.cjs +3 -2
  156. package/dist/server/handlers/mcp-client-versions.cjs.map +1 -1
  157. package/dist/server/handlers/mcp-client-versions.js +1 -1
  158. package/dist/server/handlers/mcp.cjs +2 -2
  159. package/dist/server/handlers/mcp.js +1 -1
  160. package/dist/server/handlers/memory.cjs +3 -3
  161. package/dist/server/handlers/memory.js +2 -2
  162. package/dist/server/handlers/observability-list-query-schemas.cjs +1 -0
  163. package/dist/server/handlers/observability-list-query-schemas.cjs.map +1 -1
  164. package/dist/server/handlers/observability-new-endpoints.cjs +2 -1
  165. package/dist/server/handlers/observability-shared.cjs +2 -1
  166. package/dist/server/handlers/observability-shared.cjs.map +1 -1
  167. package/dist/server/handlers/observability-storage-schemas.cjs +1 -1
  168. package/dist/server/handlers/observability.cjs +8 -5
  169. package/dist/server/handlers/observability.cjs.map +1 -1
  170. package/dist/server/handlers/observability.d.ts.map +1 -1
  171. package/dist/server/handlers/observability.js +7 -4
  172. package/dist/server/handlers/observability.js.map +1 -1
  173. package/dist/server/handlers/plans.cjs +3 -3
  174. package/dist/server/handlers/plans.js +2 -2
  175. package/dist/server/handlers/processor-providers.cjs +2 -1
  176. package/dist/server/handlers/processor-providers.cjs.map +1 -1
  177. package/dist/server/handlers/processors.cjs +2 -1
  178. package/dist/server/handlers/processors.cjs.map +1 -1
  179. package/dist/server/handlers/prompt-block-versions.cjs +3 -2
  180. package/dist/server/handlers/prompt-block-versions.cjs.map +1 -1
  181. package/dist/server/handlers/prompt-block-versions.js +1 -1
  182. package/dist/server/handlers/responses.adapter.cjs +1 -0
  183. package/dist/server/handlers/responses.adapter.cjs.map +1 -1
  184. package/dist/server/handlers/responses.cjs +4 -4
  185. package/dist/server/handlers/responses.js +2 -2
  186. package/dist/server/handlers/responses.storage.cjs +2 -1
  187. package/dist/server/handlers/responses.storage.cjs.map +1 -1
  188. package/dist/server/handlers/responses.storage.js +1 -1
  189. package/dist/server/handlers/schedules-workflows-shim.cjs +1 -1
  190. package/dist/server/handlers/schedules.cjs +2 -1
  191. package/dist/server/handlers/scorer-versions.cjs +4 -3
  192. package/dist/server/handlers/scorer-versions.cjs.map +1 -1
  193. package/dist/server/handlers/scorer-versions.js +2 -2
  194. package/dist/server/handlers/scores.cjs +2 -2
  195. package/dist/server/handlers/scores.js +1 -1
  196. package/dist/server/handlers/skills-sh-shared.cjs +1 -0
  197. package/dist/server/handlers/skills-sh-shared.cjs.map +1 -1
  198. package/dist/server/handlers/stored-agent-favorites.cjs +5 -4
  199. package/dist/server/handlers/stored-agent-favorites.cjs.map +1 -1
  200. package/dist/server/handlers/stored-agent-favorites.js +2 -2
  201. package/dist/server/handlers/stored-agents.cjs +7 -5
  202. package/dist/server/handlers/stored-agents.cjs.map +1 -1
  203. package/dist/server/handlers/stored-agents.d.ts +32 -0
  204. package/dist/server/handlers/stored-agents.d.ts.map +1 -1
  205. package/dist/server/handlers/stored-agents.js +4 -3
  206. package/dist/server/handlers/stored-agents.js.map +1 -1
  207. package/dist/server/handlers/stored-mcp-clients.cjs +3 -2
  208. package/dist/server/handlers/stored-mcp-clients.cjs.map +1 -1
  209. package/dist/server/handlers/stored-mcp-clients.js +1 -1
  210. package/dist/server/handlers/stored-prompt-blocks.cjs +3 -2
  211. package/dist/server/handlers/stored-prompt-blocks.cjs.map +1 -1
  212. package/dist/server/handlers/stored-prompt-blocks.js +1 -1
  213. package/dist/server/handlers/stored-scorers.cjs +4 -3
  214. package/dist/server/handlers/stored-scorers.cjs.map +1 -1
  215. package/dist/server/handlers/stored-scorers.js +2 -2
  216. package/dist/server/handlers/stored-skill-favorites.cjs +4 -3
  217. package/dist/server/handlers/stored-skill-favorites.cjs.map +1 -1
  218. package/dist/server/handlers/stored-skill-favorites.js +1 -1
  219. package/dist/server/handlers/stored-skills.cjs +4 -3
  220. package/dist/server/handlers/stored-skills.cjs.map +1 -1
  221. package/dist/server/handlers/stored-skills.js +1 -1
  222. package/dist/server/handlers/stored-workspaces.cjs +3 -2
  223. package/dist/server/handlers/stored-workspaces.cjs.map +1 -1
  224. package/dist/server/handlers/stored-workspaces.js +1 -1
  225. package/dist/server/handlers/system.cjs +3 -2
  226. package/dist/server/handlers/system.cjs.map +1 -1
  227. package/dist/server/handlers/system.js +1 -1
  228. package/dist/server/handlers/test-utils.cjs +1 -0
  229. package/dist/server/handlers/test-utils.cjs.map +1 -1
  230. package/dist/server/handlers/tool-providers.cjs +3 -2
  231. package/dist/server/handlers/tool-providers.cjs.map +1 -1
  232. package/dist/server/handlers/tool-providers.js +1 -1
  233. package/dist/server/handlers/tool-schema-overrides.cjs +1 -0
  234. package/dist/server/handlers/tool-schema-overrides.cjs.map +1 -1
  235. package/dist/server/handlers/tools.cjs +6 -6
  236. package/dist/server/handlers/tools.js +3 -3
  237. package/dist/server/handlers/utils.cjs +2 -1
  238. package/dist/server/handlers/utils.js +1 -1
  239. package/dist/server/handlers/validate-agent-instructions.cjs +2 -1
  240. package/dist/server/handlers/validate-agent-instructions.cjs.map +1 -1
  241. package/dist/server/handlers/validate-agent-instructions.js +1 -1
  242. package/dist/server/handlers/validate-avatar.cjs +1 -0
  243. package/dist/server/handlers/validate-avatar.cjs.map +1 -1
  244. package/dist/server/handlers/vector.cjs +2 -2
  245. package/dist/server/handlers/vector.js +1 -1
  246. package/dist/server/handlers/version-helpers.cjs +1 -0
  247. package/dist/server/handlers/version-helpers.cjs.map +1 -1
  248. package/dist/server/handlers/voice.cjs +1 -1
  249. package/dist/server/handlers/voice.js +1 -1
  250. package/dist/server/handlers/workflows.cjs +4 -4
  251. package/dist/server/handlers/workflows.js +3 -3
  252. package/dist/server/handlers/workspace.cjs +2 -2
  253. package/dist/server/handlers/workspace.js +1 -1
  254. package/dist/server/handlers.cjs +3 -2
  255. package/dist/server/handlers.js +2 -2
  256. package/dist/server/schemas/datasets.d.ts +3 -3
  257. package/dist/server/schemas/index.cjs +7 -6
  258. package/dist/server/schemas/index.js +4 -4
  259. package/dist/server/schemas/stored-agents.d.ts +40 -7
  260. package/dist/server/schemas/stored-agents.d.ts.map +1 -1
  261. package/dist/server/server-adapter/index.cjs +6 -5
  262. package/dist/server/server-adapter/index.cjs.map +1 -1
  263. package/dist/server/server-adapter/index.js +4 -4
  264. package/dist/server/server-adapter/routes/datasets.d.ts +6 -6
  265. package/dist/{stored-agents-CPxfYRH9.cjs → stored-agents-D6JEb3zN.cjs} +15 -3
  266. package/dist/stored-agents-D6JEb3zN.cjs.map +1 -0
  267. package/dist/{stored-agents-BRBZM-Xl.js → stored-agents-DMW5wrF7.js} +15 -3
  268. package/dist/stored-agents-DMW5wrF7.js.map +1 -0
  269. package/dist/{stored-scorers-B__LF0Cy.js → stored-scorers-BA4suzgn.js} +2 -2
  270. package/dist/{stored-scorers-B__LF0Cy.js.map → stored-scorers-BA4suzgn.js.map} +1 -1
  271. package/dist/{stored-scorers-Cml7jPJv.cjs → stored-scorers-D8IwVM0S.cjs} +2 -2
  272. package/dist/{stored-scorers-Cml7jPJv.cjs.map → stored-scorers-D8IwVM0S.cjs.map} +1 -1
  273. package/dist/{sync-djJ8Lmds.js → sync-BG15Yae1.js} +22 -22
  274. package/dist/{sync-djJ8Lmds.js.map → sync-BG15Yae1.js.map} +1 -1
  275. package/dist/{sync-BHatXKfg.cjs → sync-C4LbbSKR.cjs} +22 -22
  276. package/dist/{sync-BHatXKfg.cjs.map → sync-C4LbbSKR.cjs.map} +1 -1
  277. package/dist/{utils-CljhO7OY.js → utils-B2vd77Fi.js} +2 -2
  278. package/dist/{utils-CljhO7OY.js.map → utils-B2vd77Fi.js.map} +1 -1
  279. package/dist/{utils-BkPZAGxS.cjs → utils-CmYnjLcY.cjs} +4 -4
  280. package/dist/{utils-BkPZAGxS.cjs.map → utils-CmYnjLcY.cjs.map} +1 -1
  281. package/dist/{utils-CXbhpYYv.cjs → utils-DJMUhfvY.cjs} +3 -3
  282. package/dist/{utils-CXbhpYYv.cjs.map → utils-DJMUhfvY.cjs.map} +1 -1
  283. package/dist/{utils-qMLbyf2U.js → utils-Hz8Hc2cd.js} +2 -2
  284. package/dist/{utils-qMLbyf2U.js.map → utils-Hz8Hc2cd.js.map} +1 -1
  285. package/package.json +8 -8
  286. package/dist/constants-CXPpy-Ef.cjs.map +0 -1
  287. package/dist/constants-CutMu4A_.js.map +0 -1
  288. package/dist/dist-CpaK1qK1.cjs.map +0 -1
  289. package/dist/dist-CpxQhZED.js.map +0 -1
  290. package/dist/probe-image-size-C2F59z8Z.cjs.map +0 -1
  291. package/dist/probe-image-size-mXCWYNrz.js.map +0 -1
  292. package/dist/schema-DkBbires.cjs +0 -1
  293. package/dist/stored-agents-BRBZM-Xl.js.map +0 -1
  294. package/dist/stored-agents-CPxfYRH9.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"test-utils.cjs","names":["RequestContext"],"sources":["../../../src/server/handlers/test-utils.ts"],"sourcesContent":["import type { Mastra } from '@mastra/core';\nimport { RequestContext } from '@mastra/core/request-context';\nimport type { ServerContext } from '../server-adapter';\n\nexport function createTestServerContext({ mastra }: { mastra: Mastra }): ServerContext {\n return {\n mastra,\n requestContext: new RequestContext(),\n abortSignal: new AbortController().signal,\n };\n}\n"],"mappings":";;;AAIA,SAAgB,wBAAwB,EAAE,UAA6C;CACrF,OAAO;EACL;EACA,gBAAgB,IAAIA,6BAAAA,eAAe;EACnC,aAAa,IAAI,gBAAgB,CAAC,CAAC;CACrC;AACF"}
1
+ {"version":3,"file":"test-utils.cjs","names":["RequestContext"],"sources":["../../../src/server/handlers/test-utils.ts"],"sourcesContent":["import type { Mastra } from '@mastra/core';\nimport { RequestContext } from '@mastra/core/request-context';\nimport type { ServerContext } from '../server-adapter';\n\nexport function createTestServerContext({ mastra }: { mastra: Mastra }): ServerContext {\n return {\n mastra,\n requestContext: new RequestContext(),\n abortSignal: new AbortController().signal,\n };\n}\n"],"mappings":";;;;AAIA,SAAgB,wBAAwB,EAAE,UAA6C;CACrF,OAAO;EACL;EACA,gBAAgB,IAAIA,6BAAAA,eAAe;EACnC,aAAa,IAAI,gBAAgB,CAAC,CAAC;CACrC;AACF"}
@@ -1,7 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../rolldown-runtime-Bd6kNlEP.cjs");
2
3
  const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
3
- const require_route_builder = require("../../route-builder-BAAedfru.cjs");
4
- const require_constants = require("../../constants-CXPpy-Ef.cjs");
4
+ const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
5
+ const require_constants = require("../../constants-4IJp_uzj.cjs");
5
6
  const require_server_handlers_error = require("./error.cjs");
6
7
  const require_tool_providers = require("../../tool-providers-DFQkhO4R.cjs");
7
8
  const require_server_handlers_authorship = require("./authorship.cjs");
@@ -1 +1 @@
1
- {"version":3,"file":"tool-providers.cjs","names":["HTTPException","MASTRA_RESOURCE_ID_KEY","MASTRA_USER_KEY","createRoute","listToolProvidersResponseSchema","handleError","toolProviderIdPathParams","listToolProviderToolkitsResponseSchema","listToolProviderToolsQuerySchema","listToolProviderToolsResponseSchema","toolSlugPathParams","getToolProviderToolSchemaResponseSchema","authorizeToolProviderBodySchema","authorizeToolProviderResponseSchema","toolProviderAuthStatusPathParams","authStatusToolProviderResponseSchema","connectionStatusToolProviderBodySchema","connectionStatusToolProviderResponseSchema","listConnectionsQuerySchema","listConnectionsResponseSchema","hasAdminBypass","listConnectionFieldsQuerySchema","listConnectionFieldsResponseSchema","toolProviderConnectionPathParams","disconnectConnectionQuerySchema","disconnectConnectionResponseSchema","updateConnectionBodySchema","updateConnectionResponseSchema","connectionUsageQuerySchema","connectionUsageResponseSchema","toolProviderHealthResponseSchema"],"sources":["../../../src/server/handlers/tool-providers.ts"],"sourcesContent":["import type { IMastraEditor } from '@mastra/core/editor';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { MASTRA_RESOURCE_ID_KEY } from '@mastra/core/request-context';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type * as ToolProviderModule from '@mastra/core/tool-provider';\nimport type { ToolProvider } from '@mastra/core/tool-provider';\n\nimport { MASTRA_USER_KEY } from '../constants';\nimport { HTTPException } from '../http-exception';\nimport {\n authorizeToolProviderBodySchema,\n authorizeToolProviderResponseSchema,\n authStatusToolProviderResponseSchema,\n connectionStatusToolProviderBodySchema,\n connectionStatusToolProviderResponseSchema,\n connectionUsageQuerySchema,\n connectionUsageResponseSchema,\n disconnectConnectionQuerySchema,\n disconnectConnectionResponseSchema,\n getToolProviderToolSchemaResponseSchema,\n listConnectionFieldsQuerySchema,\n listConnectionFieldsResponseSchema,\n listConnectionsQuerySchema,\n listConnectionsResponseSchema,\n listToolProviderToolkitsResponseSchema,\n listToolProviderToolsQuerySchema,\n listToolProviderToolsResponseSchema,\n listToolProvidersResponseSchema,\n toolProviderAuthStatusPathParams,\n toolProviderConnectionPathParams,\n toolProviderHealthResponseSchema,\n toolProviderIdPathParams,\n toolSlugPathParams,\n updateConnectionBodySchema,\n updateConnectionResponseSchema,\n} from '../schemas/tool-providers';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\nimport { hasAdminBypass } from './authorship';\nimport { handleError } from './error';\n\nconst TOOL_PROVIDERS_RESOURCE = 'tool-providers' as const;\n\n/**\n * Mirrors `@mastra/core/tool-provider#SHARED_BUCKET_ID`. Inlined locally so this\n * module evaluates under any peer-compatible core; a regression test in\n * `tool-providers.test.ts` verifies the literal stays in lockstep with core.\n */\nconst SHARED_BUCKET_ID = 'shared' as const;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Lazily import `@mastra/core/tool-provider` so this server module can evaluate\n * under any peer-compatible core. The new value exports (`UnknownToolProviderError`,\n * `SHARED_BUCKET_ID`) ship in core `>=1.39.0-0`; users on older cores who never\n * configure a `MastraEditor` short-circuit via `requireEditor` long before this\n * runs. ESM caches one module instance per resolved specifier so the\n * `instanceof` check below sees the same class identity that `@mastra/editor`\n * throws.\n */\nlet _toolProviderModule: typeof ToolProviderModule | undefined;\nasync function loadToolProviderModule() {\n if (!_toolProviderModule) {\n _toolProviderModule = await import('@mastra/core/tool-provider');\n }\n return _toolProviderModule;\n}\n\nfunction requireEditor(editor: IMastraEditor | undefined): IMastraEditor {\n if (!editor) {\n throw new HTTPException(500, { message: 'Editor is not configured' });\n }\n return editor;\n}\n\nasync function resolveProvider(editor: IMastraEditor, providerId: string): Promise<ToolProvider> {\n try {\n return editor.getToolProviderOrThrow(providerId);\n } catch (error) {\n const { UnknownToolProviderError } = await loadToolProviderModule();\n if (error instanceof UnknownToolProviderError) {\n throw new HTTPException(404, { message: error.message });\n }\n throw error;\n }\n}\n\n// Emit a single warn per process when the connection-owner fallback fires.\n// Multi-tenant deployments that forget to wire `mapUserToResourceId` (or\n// `MASTRA_USER_KEY`) silently funnel every `caller-supplied` pin into one\n// shared OAuth account — surface that misconfiguration once.\nlet defaultBucketWarned = false;\nfunction warnDefaultBucketFallback(logger: IMastraLogger | undefined): void {\n if (defaultBucketWarned) return;\n defaultBucketWarned = true;\n logger?.warn(\n '[tool-providers] caller-supplied scope falling back to shared \"default\" bucket — ' +\n 'wire mapUserToResourceId or set MASTRA_USER_KEY to avoid cross-tenant OAuth sharing',\n );\n}\n\n/**\n * Resolve the connection owner (provider `userId` bucket) from the caller's\n * `RequestContext`. Mirrors the runtime fan-out fallback to `'default'` when\n * no auth context is present so OSS deployments still work.\n */\nfunction resolveOwnerId(requestContext: RequestContext | undefined, logger: IMastraLogger | undefined): string {\n const resourceId = requestContext?.get(MASTRA_RESOURCE_ID_KEY);\n if (typeof resourceId === 'string' && resourceId.length > 0) {\n return resourceId;\n }\n\n const user = requestContext?.get(MASTRA_USER_KEY);\n if (user && typeof user === 'object' && 'id' in user) {\n const id = (user as { id: unknown }).id;\n if (typeof id === 'string' && id.length > 0) {\n return id;\n }\n }\n\n warnDefaultBucketFallback(logger);\n return 'default';\n}\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /tool-providers — List all registered tool providers with their\n * capabilities (when the provider exposes them).\n */\nexport const LIST_TOOL_PROVIDERS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers',\n responseType: 'json',\n responseSchema: listToolProvidersResponseSchema,\n summary: 'List tool providers',\n description: 'Returns a list of all registered tool providers with their info and capabilities',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const providers = editor.getToolProviders();\n return {\n providers: Object.values(providers).map(provider => ({\n ...provider.info,\n ...(provider.displayName ? { displayName: provider.displayName } : {}),\n ...(provider.capabilities ? { capabilities: provider.capabilities } : {}),\n })),\n };\n } catch (error) {\n return handleError(error, 'Error listing tool providers');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/toolkits — Toolkits exposed by a provider.\n */\nexport const LIST_TOOL_PROVIDER_TOOLKITS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/toolkits',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n responseSchema: listToolProviderToolkitsResponseSchema,\n summary: 'List tool provider toolkits',\n description: 'Returns the toolkits available from a specific tool provider',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (provider.listToolkitsVNext) {\n return await provider.listToolkitsVNext();\n }\n if (provider.listToolkits) {\n return await provider.listToolkits();\n }\n return { data: [] };\n } catch (error) {\n return handleError(error, 'Error listing tool provider toolkits');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/tools — List tools, optionally filtered.\n */\nexport const LIST_TOOL_PROVIDER_TOOLS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/tools',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n queryParamSchema: listToolProviderToolsQuerySchema,\n responseSchema: listToolProviderToolsResponseSchema,\n summary: 'List tool provider tools',\n description: 'Returns the tools available from a specific tool provider, with optional filtering',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, toolkit, search, page, perPage }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n const opts: { toolkit?: string; search?: string; page?: number; perPage?: number } = {};\n if (toolkit !== undefined) opts.toolkit = toolkit;\n if (search !== undefined) opts.search = search;\n if (page !== undefined) opts.page = page;\n if (perPage !== undefined) opts.perPage = perPage;\n if (provider.listToolsVNext) {\n return await provider.listToolsVNext(Object.keys(opts).length > 0 ? opts : undefined);\n }\n return await provider.listTools(Object.keys(opts).length > 0 ? opts : undefined);\n } catch (error) {\n return handleError(error, 'Error listing tool provider tools');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/tools/:toolSlug/schema — Tool schema.\n */\nexport const GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/tools/:toolSlug/schema',\n responseType: 'json',\n pathParamSchema: toolSlugPathParams,\n responseSchema: getToolProviderToolSchemaResponseSchema,\n summary: 'Get tool provider tool schema',\n description: 'Returns the schema for a specific tool from a tool provider',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, toolSlug }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.getToolSchema) {\n throw new HTTPException(404, { message: `Tool provider ${providerId} does not support getToolSchema` });\n }\n const schema = await provider.getToolSchema(toolSlug);\n if (!schema) {\n throw new HTTPException(404, { message: `Schema for tool ${toolSlug} not found in provider ${providerId}` });\n }\n return schema;\n } catch (error) {\n return handleError(error, 'Error getting tool provider tool schema');\n }\n },\n});\n\n/**\n * POST /tool-providers/:providerId/authorize — Start an OAuth flow and persist\n * a `tool_provider_connections` row for label / scope joins.\n */\nexport const AUTHORIZE_TOOL_PROVIDER_ROUTE = createRoute({\n method: 'POST',\n path: '/tool-providers/:providerId/authorize',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n bodySchema: authorizeToolProviderBodySchema,\n responseSchema: authorizeToolProviderResponseSchema,\n summary: 'Authorize tool provider connection',\n description: 'Starts an OAuth flow and returns a redirect URL + opaque auth handle',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, toolkit, connectionId, toolName, config, label, scope, requestContext }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.authorize) {\n throw new HTTPException(400, { message: `Tool provider ${providerId} does not support authorize` });\n }\n // Per-pin scope:\n // - 'shared' buckets under SHARED_BUCKET_ID.\n // - 'caller-supplied' buckets under request-context resourceId (400 if missing).\n // - 'per-author' (default) buckets under the caller's resolved authorId.\n //\n // Precedence: an explicit request `scope` wins, then the provider's\n // config-level `defaultScope` (the app author's tenancy decision), then\n // `'per-author'`. This lets a provider constructed with\n // `defaultScope: 'caller-supplied'` produce per-tenant connections even\n // though no UI control selects a scope.\n const requestedScope = scope ?? provider.defaultScope;\n const effectiveScope: 'shared' | 'per-author' | 'caller-supplied' =\n requestedScope === 'shared' || requestedScope === 'caller-supplied' ? requestedScope : 'per-author';\n const callerResourceId = requestContext?.get(MASTRA_RESOURCE_ID_KEY);\n if (effectiveScope === 'caller-supplied') {\n if (typeof callerResourceId !== 'string' || callerResourceId.length === 0) {\n throw new HTTPException(400, {\n message: `Cannot authorize caller-supplied connection: request context has no '${MASTRA_RESOURCE_ID_KEY}'. Set requestContext.set('${MASTRA_RESOURCE_ID_KEY}', <userId>) before calling /authorize.`,\n });\n }\n }\n const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());\n const ownerAuthorId =\n effectiveScope === 'shared'\n ? SHARED_BUCKET_ID\n : effectiveScope === 'caller-supplied'\n ? (callerResourceId as string)\n : callerAuthorId;\n\n // Fresh connect (no connectionId) uses the resolved owner id as the\n // provider bucket so the adapter creates the connection under the same\n // userId the runtime will resolve to at execution time. Re-auth (caller\n // passed an existing connectionId) is left untouched.\n const bucket = connectionId && connectionId.length > 0 ? connectionId : ownerAuthorId;\n const result = await provider.authorize({ toolkit, connectionId: bucket, toolName, config });\n\n // Persist label + scope. Upsert even when label is null/undefined so the\n // row exists for later list-join in the picker.\n const persistedConnectionId = connectionId && connectionId.length > 0 ? connectionId : result.authId;\n try {\n const storage = mastra.getStorage();\n const store = await storage?.getStore('toolProviderConnections');\n if (store && persistedConnectionId) {\n await store.upsertConnection({\n authorId: ownerAuthorId,\n providerId: provider.info.id,\n toolkit,\n connectionId: persistedConnectionId,\n label: typeof label === 'string' && label.length > 0 ? label : null,\n scope: effectiveScope,\n });\n }\n } catch (upsertError) {\n mastra.getLogger?.()?.warn?.('[tool-providers] failed to upsert tool_provider_connections label', {\n error: upsertError instanceof Error ? upsertError.message : String(upsertError),\n providerId,\n toolkit,\n connectionId: persistedConnectionId,\n });\n }\n\n return result;\n } catch (error) {\n return handleError(error, 'Error authorizing tool provider');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/auth-status/:authId — Poll OAuth flow status.\n */\nexport const GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/auth-status/:authId',\n responseType: 'json',\n pathParamSchema: toolProviderAuthStatusPathParams,\n responseSchema: authStatusToolProviderResponseSchema,\n summary: 'Get tool provider auth status',\n description: 'Polls the OAuth flow status for an outstanding authorize call',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, authId }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.getAuthStatus) {\n throw new HTTPException(400, { message: `Tool provider ${providerId} does not support getAuthStatus` });\n }\n const status = await provider.getAuthStatus(authId);\n return { status };\n } catch (error) {\n return handleError(error, 'Error getting tool provider auth status');\n }\n },\n});\n\n/**\n * POST /tool-providers/:providerId/connection-status — Batch-check connection liveness.\n */\nexport const TOOL_PROVIDER_CONNECTION_STATUS_ROUTE = createRoute({\n method: 'POST',\n path: '/tool-providers/:providerId/connection-status',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n bodySchema: connectionStatusToolProviderBodySchema,\n responseSchema: connectionStatusToolProviderResponseSchema,\n summary: 'Get connection status for a provider',\n description: 'Batch-checks whether a set of (connectionId, toolkit) tuples are still connected',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, items }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.getConnectionStatus) {\n throw new HTTPException(400, { message: `Tool provider ${providerId} does not support getConnectionStatus` });\n }\n const result = await provider.getConnectionStatus({ items });\n return { items: result };\n } catch (error) {\n return handleError(error, 'Error getting connection status');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/connections — Existing provider connections\n * scoped to a toolkit. Admin callers can pass `authorId` and `scope` filters;\n * non-admins always see only their own + shared rows.\n */\nexport const LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/connections',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n queryParamSchema: listConnectionsQuerySchema,\n responseSchema: listConnectionsResponseSchema,\n summary: 'List existing connections',\n description:\n 'Returns existing provider connections on a toolkit, so the picker can offer them for pinning without re-running OAuth',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({\n mastra,\n providerId,\n toolkit,\n authorId: queryAuthorId,\n scope: queryScope,\n page,\n perPage,\n requestContext,\n }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.listConnections) {\n throw new HTTPException(400, { message: `Tool provider ${providerId} does not support listConnections` });\n }\n const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());\n const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;\n\n const requestedAuthorId =\n isAdmin && typeof queryAuthorId === 'string' && queryAuthorId.length > 0 ? queryAuthorId : undefined;\n const effectiveAuthorId = isAdmin ? requestedAuthorId : callerAuthorId;\n\n const storage = mastra.getStorage();\n const store = await storage?.getStore('toolProviderConnections');\n\n // Strategy B: seed userIds[] from persisted rows so admins can enumerate\n // connections owned by other authors.\n let labelRows: Array<{\n authorId: string;\n connectionId: string;\n label: string | null;\n scope: 'shared' | 'per-author' | 'caller-supplied';\n }> = [];\n if (store) {\n try {\n const rows = await store.listConnectionsByAuthor({\n providerId: provider.info.id,\n toolkit,\n });\n labelRows = rows.map(r => ({\n authorId: r.authorId,\n connectionId: r.connectionId,\n label: r.label,\n scope: r.scope ?? 'per-author',\n }));\n } catch (joinError) {\n mastra.getLogger?.()?.warn?.('[tool-providers] failed to join tool_provider_connections labels', {\n error: joinError instanceof Error ? joinError.message : String(joinError),\n providerId,\n toolkit,\n });\n }\n }\n\n const userIdSet = new Set<string>();\n const wantShared = !queryScope || queryScope === 'shared';\n const wantPerAuthor = !queryScope || queryScope === 'per-author';\n const wantCallerSupplied = !queryScope || queryScope === 'caller-supplied';\n const hasSharedRow = labelRows.some(r => r.scope === 'shared');\n if (isAdmin && effectiveAuthorId === undefined) {\n for (const r of labelRows) {\n if (r.scope === 'shared' && wantShared) userIdSet.add(r.authorId);\n if (r.scope === 'per-author' && wantPerAuthor) userIdSet.add(r.authorId);\n if (r.scope === 'caller-supplied' && wantCallerSupplied) userIdSet.add(r.authorId);\n }\n } else if (isAdmin && effectiveAuthorId) {\n if (wantPerAuthor || wantCallerSupplied) userIdSet.add(effectiveAuthorId);\n if (wantShared && hasSharedRow) userIdSet.add(SHARED_BUCKET_ID);\n } else {\n if (wantPerAuthor) userIdSet.add(callerAuthorId);\n if (wantShared && hasSharedRow) userIdSet.add(SHARED_BUCKET_ID);\n // Non-admins never enumerate caller-supplied connections.\n }\n\n const userIds = Array.from(userIdSet);\n if (userIds.length === 0) {\n return {\n items: [],\n pagination: { page: page ?? 1, perPage, hasMore: false },\n };\n }\n\n const adapterResult = await provider.listConnections({\n toolkit,\n userIds,\n ...(typeof page === 'number' ? { page } : {}),\n ...(typeof perPage === 'number' ? { perPage } : {}),\n });\n\n const rowByConnId = new Map(labelRows.map(r => [r.connectionId, r]));\n\n const visibleItems = adapterResult.items.filter(item => {\n if (!queryScope) return true;\n const scope = rowByConnId.get(item.connectionId)?.scope ?? 'per-author';\n return scope === queryScope;\n });\n\n return {\n items: visibleItems.map(item => {\n const row = rowByConnId.get(item.connectionId);\n return {\n ...item,\n label: row?.label ?? null,\n ...(row?.scope ? { scope: row.scope } : {}),\n };\n }),\n pagination: adapterResult.pagination,\n };\n } catch (error) {\n return handleError(error, 'Error listing tool provider connections');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/connection-fields — Dynamic auth fields\n * the picker should collect before authorize (e.g. Confluence subdomain).\n */\nexport const LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/connection-fields',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n queryParamSchema: listConnectionFieldsQuerySchema,\n responseSchema: listConnectionFieldsResponseSchema,\n summary: 'List connection field schema',\n description: 'Returns a list of provider-specific fields the UI should collect before initiating an authorize call',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, toolkit }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.listConnectionFields) {\n return { fields: [] };\n }\n const fields = await provider.listConnectionFields({ toolkit });\n return { fields };\n } catch (error) {\n return handleError(error, 'Error listing tool provider connection fields');\n }\n },\n});\n\n/**\n * DELETE /tool-providers/:providerId/connections/:connectionId — Disconnect.\n * Without `?force=true` rejects when the connection is still pinned by any\n * agent. With `?force=true` revokes at the provider (best-effort) and drops\n * the persisted row.\n */\nexport const DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/tool-providers/:providerId/connections/:connectionId',\n responseType: 'json',\n pathParamSchema: toolProviderConnectionPathParams,\n queryParamSchema: disconnectConnectionQuerySchema,\n responseSchema: disconnectConnectionResponseSchema,\n summary: 'Disconnect a connection',\n description:\n 'Revokes the provider-side connection (if supported) and removes the persisted tool_provider_connections row. Use `?force=true` to bypass usage checks.',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, connectionId, force, requestContext }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());\n const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;\n const isForce = force === true || force === 'true';\n\n const storage = mastra.getStorage();\n const store = await storage?.getStore('toolProviderConnections');\n\n let ownerAuthorId: string | undefined;\n let ownerScope: 'shared' | 'per-author' | 'caller-supplied' | undefined;\n let matched = false;\n if (store) {\n const rows = await store.listConnectionsByAuthor({ providerId: provider.info.id });\n const match = rows.find(r => r.connectionId === connectionId);\n if (match) {\n matched = true;\n ownerAuthorId = match.authorId;\n ownerScope = match.scope;\n }\n }\n\n // Fail closed: if storage is configured and no row matches the\n // requested connectionId, refuse the call for non-admins. Without\n // this guard, a caller could trigger provider-side `revokeConnection`\n // against another tenant's connectionId by guessing it.\n if (store && !matched && !isAdmin) {\n throw new HTTPException(403, {\n message: 'You do not have permission to disconnect this connection',\n });\n }\n\n const effectiveOwner = ownerAuthorId ?? callerAuthorId;\n const isShared = ownerScope === 'shared';\n if (!isShared && effectiveOwner !== callerAuthorId && !isAdmin) {\n throw new HTTPException(403, {\n message: 'You do not have permission to disconnect this connection',\n });\n }\n\n if (!isForce) {\n const usage = await countConnectionUsage(mastra, connectionId);\n if (usage > 0) {\n throw new HTTPException(409, {\n message: `Connection ${connectionId} is still pinned by ${usage} agent(s). Pass ?force=true to disconnect anyway.`,\n });\n }\n }\n\n let revoked = false;\n if (provider.capabilities?.supportsRevoke && typeof provider.revokeConnection === 'function') {\n await provider.revokeConnection(connectionId);\n revoked = true;\n }\n\n if (store) {\n await store.deleteConnection({\n authorId: effectiveOwner,\n providerId: provider.info.id,\n connectionId,\n });\n }\n\n return { ok: true as const, revoked };\n } catch (error) {\n return handleError(error, 'Error disconnecting tool provider connection');\n }\n },\n});\n\n/**\n * PATCH /tool-providers/:providerId/connections/:connectionId — Update a\n * connection's persisted display label. Idempotent. Ownership-gated the same\n * way as DISCONNECT: only the connection owner (or an admin) may rename,\n * unless the row is `scope: 'shared'`.\n *\n * Pass `label: null` (or an empty string) to clear the existing label.\n */\nexport const UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE = createRoute({\n method: 'PATCH',\n path: '/tool-providers/:providerId/connections/:connectionId',\n responseType: 'json',\n pathParamSchema: toolProviderConnectionPathParams,\n bodySchema: updateConnectionBodySchema,\n responseSchema: updateConnectionResponseSchema,\n summary: 'Update a connection label',\n description:\n 'Updates the persisted display label on tool_provider_connections. Returns 403 when caller is neither the owner nor admin (and the row is not shared), 404 when the row does not exist.',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, connectionId, label, requestContext }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());\n const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;\n\n const storage = mastra.getStorage();\n const store = await storage?.getStore('toolProviderConnections');\n if (!store) {\n throw new HTTPException(500, {\n message: 'Tool provider connections storage is not configured',\n });\n }\n\n const rows = await store.listConnectionsByAuthor({ providerId: provider.info.id });\n const match = rows.find(r => r.connectionId === connectionId);\n if (!match) {\n throw new HTTPException(404, {\n message: `Connection ${connectionId} not found for provider ${providerId}`,\n });\n }\n\n const isShared = match.scope === 'shared';\n if (!isShared && match.authorId !== callerAuthorId && !isAdmin) {\n throw new HTTPException(403, {\n message: 'You do not have permission to update this connection',\n });\n }\n\n // Normalize: empty string and explicit null both clear the label.\n const nextLabel: string | null = typeof label === 'string' && label.trim().length > 0 ? label.trim() : null;\n\n await store.upsertConnection({\n authorId: match.authorId,\n providerId: provider.info.id,\n toolkit: match.toolkit,\n connectionId,\n label: nextLabel,\n scope: match.scope,\n });\n\n return { ok: true as const, label: nextLabel };\n } catch (error) {\n return handleError(error, 'Error updating tool provider connection');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/connections/:connectionId/usage — Lists agents\n * that currently pin the given connection in their `toolProviders` config.\n */\nexport const GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/connections/:connectionId/usage',\n responseType: 'json',\n pathParamSchema: toolProviderConnectionPathParams,\n queryParamSchema: connectionUsageQuerySchema,\n responseSchema: connectionUsageResponseSchema,\n summary: 'List agents using a connection',\n description: 'Returns the agents that pin this connection in their toolProviders config',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, connectionId, toolkit, requestContext }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());\n const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;\n\n const storage = mastra.getStorage();\n const store = await storage?.getStore('toolProviderConnections');\n let ownerAuthorId: string | undefined;\n let ownerScope: 'shared' | 'per-author' | 'caller-supplied' | undefined;\n let matched = false;\n if (store) {\n const rows = await store.listConnectionsByAuthor({ providerId: provider.info.id });\n const match = rows.find(r => r.connectionId === connectionId);\n if (match) {\n matched = true;\n ownerAuthorId = match.authorId;\n ownerScope = match.scope;\n }\n }\n\n // Fail closed: if storage is configured and no row matches the\n // requested connectionId, refuse the call for non-admins so callers\n // cannot probe for other tenants' connections.\n if (store && !matched && !isAdmin) {\n throw new HTTPException(403, {\n message: 'You do not have permission to view usage for this connection',\n });\n }\n\n const effectiveOwner = ownerAuthorId ?? callerAuthorId;\n const isShared = ownerScope === 'shared';\n if (!isShared && effectiveOwner !== callerAuthorId && !isAdmin) {\n throw new HTTPException(403, {\n message: 'You do not have permission to view usage for this connection',\n });\n }\n\n const agents = await scanConnectionUsage(mastra, { providerId: provider.info.id, connectionId, toolkit });\n return { agents };\n } catch (error) {\n return handleError(error, 'Error listing tool provider connection usage');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/health — Provider-level health check.\n */\nexport const GET_TOOL_PROVIDER_HEALTH_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/health',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n responseSchema: toolProviderHealthResponseSchema,\n summary: 'Get tool provider health',\n description: 'Returns provider-level health (config, reachability, etc.)',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.getHealth) {\n return { ok: true };\n }\n return await provider.getHealth();\n } catch (error) {\n return handleError(error, 'Error getting tool provider health');\n }\n },\n});\n\n// ============================================================================\n// Usage scan helpers\n// ============================================================================\n\nasync function scanConnectionUsage(\n mastra: any,\n args: { providerId: string; connectionId: string; toolkit?: string },\n): Promise<Array<{ id: string; name: string }>> {\n const storage = mastra.getStorage();\n const agentsStore = await storage?.getStore('agents');\n if (!agentsStore) return [];\n\n const { agents } = await agentsStore.listResolved({ perPage: false });\n const out: Array<{ id: string; name: string }> = [];\n for (const agent of agents) {\n const config = agent?.toolProviders?.[args.providerId];\n if (!config?.connections) continue;\n for (const [toolkit, connections] of Object.entries(config.connections)) {\n if (args.toolkit && toolkit !== args.toolkit) continue;\n const match = (connections as Array<{ connectionId: string }>).some(c => c.connectionId === args.connectionId);\n if (match) {\n out.push({ id: agent.id, name: agent.name ?? agent.id });\n break;\n }\n }\n }\n return out;\n}\n\nasync function countConnectionUsage(mastra: any, connectionId: string): Promise<number> {\n const storage = mastra.getStorage();\n const agentsStore = await storage?.getStore('agents');\n if (!agentsStore) return 0;\n const { agents } = await agentsStore.listResolved({ perPage: false });\n let count = 0;\n for (const agent of agents) {\n const tp = agent?.toolProviders;\n if (!tp) continue;\n for (const config of Object.values(tp) as Array<{\n connections?: Record<string, Array<{ connectionId: string }>>;\n }>) {\n const pinned = Object.values(config?.connections ?? {}).some(arr =>\n arr.some(c => c.connectionId === connectionId),\n );\n if (pinned) {\n count += 1;\n break;\n }\n }\n }\n return count;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tool-providers.cjs","names":["HTTPException","MASTRA_RESOURCE_ID_KEY","MASTRA_USER_KEY","createRoute","listToolProvidersResponseSchema","handleError","toolProviderIdPathParams","listToolProviderToolkitsResponseSchema","listToolProviderToolsQuerySchema","listToolProviderToolsResponseSchema","toolSlugPathParams","getToolProviderToolSchemaResponseSchema","authorizeToolProviderBodySchema","authorizeToolProviderResponseSchema","toolProviderAuthStatusPathParams","authStatusToolProviderResponseSchema","connectionStatusToolProviderBodySchema","connectionStatusToolProviderResponseSchema","listConnectionsQuerySchema","listConnectionsResponseSchema","hasAdminBypass","listConnectionFieldsQuerySchema","listConnectionFieldsResponseSchema","toolProviderConnectionPathParams","disconnectConnectionQuerySchema","disconnectConnectionResponseSchema","updateConnectionBodySchema","updateConnectionResponseSchema","connectionUsageQuerySchema","connectionUsageResponseSchema","toolProviderHealthResponseSchema"],"sources":["../../../src/server/handlers/tool-providers.ts"],"sourcesContent":["import type { IMastraEditor } from '@mastra/core/editor';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { MASTRA_RESOURCE_ID_KEY } from '@mastra/core/request-context';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type * as ToolProviderModule from '@mastra/core/tool-provider';\nimport type { ToolProvider } from '@mastra/core/tool-provider';\n\nimport { MASTRA_USER_KEY } from '../constants';\nimport { HTTPException } from '../http-exception';\nimport {\n authorizeToolProviderBodySchema,\n authorizeToolProviderResponseSchema,\n authStatusToolProviderResponseSchema,\n connectionStatusToolProviderBodySchema,\n connectionStatusToolProviderResponseSchema,\n connectionUsageQuerySchema,\n connectionUsageResponseSchema,\n disconnectConnectionQuerySchema,\n disconnectConnectionResponseSchema,\n getToolProviderToolSchemaResponseSchema,\n listConnectionFieldsQuerySchema,\n listConnectionFieldsResponseSchema,\n listConnectionsQuerySchema,\n listConnectionsResponseSchema,\n listToolProviderToolkitsResponseSchema,\n listToolProviderToolsQuerySchema,\n listToolProviderToolsResponseSchema,\n listToolProvidersResponseSchema,\n toolProviderAuthStatusPathParams,\n toolProviderConnectionPathParams,\n toolProviderHealthResponseSchema,\n toolProviderIdPathParams,\n toolSlugPathParams,\n updateConnectionBodySchema,\n updateConnectionResponseSchema,\n} from '../schemas/tool-providers';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\nimport { hasAdminBypass } from './authorship';\nimport { handleError } from './error';\n\nconst TOOL_PROVIDERS_RESOURCE = 'tool-providers' as const;\n\n/**\n * Mirrors `@mastra/core/tool-provider#SHARED_BUCKET_ID`. Inlined locally so this\n * module evaluates under any peer-compatible core; a regression test in\n * `tool-providers.test.ts` verifies the literal stays in lockstep with core.\n */\nconst SHARED_BUCKET_ID = 'shared' as const;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Lazily import `@mastra/core/tool-provider` so this server module can evaluate\n * under any peer-compatible core. The new value exports (`UnknownToolProviderError`,\n * `SHARED_BUCKET_ID`) ship in core `>=1.39.0-0`; users on older cores who never\n * configure a `MastraEditor` short-circuit via `requireEditor` long before this\n * runs. ESM caches one module instance per resolved specifier so the\n * `instanceof` check below sees the same class identity that `@mastra/editor`\n * throws.\n */\nlet _toolProviderModule: typeof ToolProviderModule | undefined;\nasync function loadToolProviderModule() {\n if (!_toolProviderModule) {\n _toolProviderModule = await import('@mastra/core/tool-provider');\n }\n return _toolProviderModule;\n}\n\nfunction requireEditor(editor: IMastraEditor | undefined): IMastraEditor {\n if (!editor) {\n throw new HTTPException(500, { message: 'Editor is not configured' });\n }\n return editor;\n}\n\nasync function resolveProvider(editor: IMastraEditor, providerId: string): Promise<ToolProvider> {\n try {\n return editor.getToolProviderOrThrow(providerId);\n } catch (error) {\n const { UnknownToolProviderError } = await loadToolProviderModule();\n if (error instanceof UnknownToolProviderError) {\n throw new HTTPException(404, { message: error.message });\n }\n throw error;\n }\n}\n\n// Emit a single warn per process when the connection-owner fallback fires.\n// Multi-tenant deployments that forget to wire `mapUserToResourceId` (or\n// `MASTRA_USER_KEY`) silently funnel every `caller-supplied` pin into one\n// shared OAuth account — surface that misconfiguration once.\nlet defaultBucketWarned = false;\nfunction warnDefaultBucketFallback(logger: IMastraLogger | undefined): void {\n if (defaultBucketWarned) return;\n defaultBucketWarned = true;\n logger?.warn(\n '[tool-providers] caller-supplied scope falling back to shared \"default\" bucket — ' +\n 'wire mapUserToResourceId or set MASTRA_USER_KEY to avoid cross-tenant OAuth sharing',\n );\n}\n\n/**\n * Resolve the connection owner (provider `userId` bucket) from the caller's\n * `RequestContext`. Mirrors the runtime fan-out fallback to `'default'` when\n * no auth context is present so OSS deployments still work.\n */\nfunction resolveOwnerId(requestContext: RequestContext | undefined, logger: IMastraLogger | undefined): string {\n const resourceId = requestContext?.get(MASTRA_RESOURCE_ID_KEY);\n if (typeof resourceId === 'string' && resourceId.length > 0) {\n return resourceId;\n }\n\n const user = requestContext?.get(MASTRA_USER_KEY);\n if (user && typeof user === 'object' && 'id' in user) {\n const id = (user as { id: unknown }).id;\n if (typeof id === 'string' && id.length > 0) {\n return id;\n }\n }\n\n warnDefaultBucketFallback(logger);\n return 'default';\n}\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /tool-providers — List all registered tool providers with their\n * capabilities (when the provider exposes them).\n */\nexport const LIST_TOOL_PROVIDERS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers',\n responseType: 'json',\n responseSchema: listToolProvidersResponseSchema,\n summary: 'List tool providers',\n description: 'Returns a list of all registered tool providers with their info and capabilities',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const providers = editor.getToolProviders();\n return {\n providers: Object.values(providers).map(provider => ({\n ...provider.info,\n ...(provider.displayName ? { displayName: provider.displayName } : {}),\n ...(provider.capabilities ? { capabilities: provider.capabilities } : {}),\n })),\n };\n } catch (error) {\n return handleError(error, 'Error listing tool providers');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/toolkits — Toolkits exposed by a provider.\n */\nexport const LIST_TOOL_PROVIDER_TOOLKITS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/toolkits',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n responseSchema: listToolProviderToolkitsResponseSchema,\n summary: 'List tool provider toolkits',\n description: 'Returns the toolkits available from a specific tool provider',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (provider.listToolkitsVNext) {\n return await provider.listToolkitsVNext();\n }\n if (provider.listToolkits) {\n return await provider.listToolkits();\n }\n return { data: [] };\n } catch (error) {\n return handleError(error, 'Error listing tool provider toolkits');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/tools — List tools, optionally filtered.\n */\nexport const LIST_TOOL_PROVIDER_TOOLS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/tools',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n queryParamSchema: listToolProviderToolsQuerySchema,\n responseSchema: listToolProviderToolsResponseSchema,\n summary: 'List tool provider tools',\n description: 'Returns the tools available from a specific tool provider, with optional filtering',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, toolkit, search, page, perPage }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n const opts: { toolkit?: string; search?: string; page?: number; perPage?: number } = {};\n if (toolkit !== undefined) opts.toolkit = toolkit;\n if (search !== undefined) opts.search = search;\n if (page !== undefined) opts.page = page;\n if (perPage !== undefined) opts.perPage = perPage;\n if (provider.listToolsVNext) {\n return await provider.listToolsVNext(Object.keys(opts).length > 0 ? opts : undefined);\n }\n return await provider.listTools(Object.keys(opts).length > 0 ? opts : undefined);\n } catch (error) {\n return handleError(error, 'Error listing tool provider tools');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/tools/:toolSlug/schema — Tool schema.\n */\nexport const GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/tools/:toolSlug/schema',\n responseType: 'json',\n pathParamSchema: toolSlugPathParams,\n responseSchema: getToolProviderToolSchemaResponseSchema,\n summary: 'Get tool provider tool schema',\n description: 'Returns the schema for a specific tool from a tool provider',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, toolSlug }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.getToolSchema) {\n throw new HTTPException(404, { message: `Tool provider ${providerId} does not support getToolSchema` });\n }\n const schema = await provider.getToolSchema(toolSlug);\n if (!schema) {\n throw new HTTPException(404, { message: `Schema for tool ${toolSlug} not found in provider ${providerId}` });\n }\n return schema;\n } catch (error) {\n return handleError(error, 'Error getting tool provider tool schema');\n }\n },\n});\n\n/**\n * POST /tool-providers/:providerId/authorize — Start an OAuth flow and persist\n * a `tool_provider_connections` row for label / scope joins.\n */\nexport const AUTHORIZE_TOOL_PROVIDER_ROUTE = createRoute({\n method: 'POST',\n path: '/tool-providers/:providerId/authorize',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n bodySchema: authorizeToolProviderBodySchema,\n responseSchema: authorizeToolProviderResponseSchema,\n summary: 'Authorize tool provider connection',\n description: 'Starts an OAuth flow and returns a redirect URL + opaque auth handle',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, toolkit, connectionId, toolName, config, label, scope, requestContext }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.authorize) {\n throw new HTTPException(400, { message: `Tool provider ${providerId} does not support authorize` });\n }\n // Per-pin scope:\n // - 'shared' buckets under SHARED_BUCKET_ID.\n // - 'caller-supplied' buckets under request-context resourceId (400 if missing).\n // - 'per-author' (default) buckets under the caller's resolved authorId.\n //\n // Precedence: an explicit request `scope` wins, then the provider's\n // config-level `defaultScope` (the app author's tenancy decision), then\n // `'per-author'`. This lets a provider constructed with\n // `defaultScope: 'caller-supplied'` produce per-tenant connections even\n // though no UI control selects a scope.\n const requestedScope = scope ?? provider.defaultScope;\n const effectiveScope: 'shared' | 'per-author' | 'caller-supplied' =\n requestedScope === 'shared' || requestedScope === 'caller-supplied' ? requestedScope : 'per-author';\n const callerResourceId = requestContext?.get(MASTRA_RESOURCE_ID_KEY);\n if (effectiveScope === 'caller-supplied') {\n if (typeof callerResourceId !== 'string' || callerResourceId.length === 0) {\n throw new HTTPException(400, {\n message: `Cannot authorize caller-supplied connection: request context has no '${MASTRA_RESOURCE_ID_KEY}'. Set requestContext.set('${MASTRA_RESOURCE_ID_KEY}', <userId>) before calling /authorize.`,\n });\n }\n }\n const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());\n const ownerAuthorId =\n effectiveScope === 'shared'\n ? SHARED_BUCKET_ID\n : effectiveScope === 'caller-supplied'\n ? (callerResourceId as string)\n : callerAuthorId;\n\n // Fresh connect (no connectionId) uses the resolved owner id as the\n // provider bucket so the adapter creates the connection under the same\n // userId the runtime will resolve to at execution time. Re-auth (caller\n // passed an existing connectionId) is left untouched.\n const bucket = connectionId && connectionId.length > 0 ? connectionId : ownerAuthorId;\n const result = await provider.authorize({ toolkit, connectionId: bucket, toolName, config });\n\n // Persist label + scope. Upsert even when label is null/undefined so the\n // row exists for later list-join in the picker.\n const persistedConnectionId = connectionId && connectionId.length > 0 ? connectionId : result.authId;\n try {\n const storage = mastra.getStorage();\n const store = await storage?.getStore('toolProviderConnections');\n if (store && persistedConnectionId) {\n await store.upsertConnection({\n authorId: ownerAuthorId,\n providerId: provider.info.id,\n toolkit,\n connectionId: persistedConnectionId,\n label: typeof label === 'string' && label.length > 0 ? label : null,\n scope: effectiveScope,\n });\n }\n } catch (upsertError) {\n mastra.getLogger?.()?.warn?.('[tool-providers] failed to upsert tool_provider_connections label', {\n error: upsertError instanceof Error ? upsertError.message : String(upsertError),\n providerId,\n toolkit,\n connectionId: persistedConnectionId,\n });\n }\n\n return result;\n } catch (error) {\n return handleError(error, 'Error authorizing tool provider');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/auth-status/:authId — Poll OAuth flow status.\n */\nexport const GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/auth-status/:authId',\n responseType: 'json',\n pathParamSchema: toolProviderAuthStatusPathParams,\n responseSchema: authStatusToolProviderResponseSchema,\n summary: 'Get tool provider auth status',\n description: 'Polls the OAuth flow status for an outstanding authorize call',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, authId }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.getAuthStatus) {\n throw new HTTPException(400, { message: `Tool provider ${providerId} does not support getAuthStatus` });\n }\n const status = await provider.getAuthStatus(authId);\n return { status };\n } catch (error) {\n return handleError(error, 'Error getting tool provider auth status');\n }\n },\n});\n\n/**\n * POST /tool-providers/:providerId/connection-status — Batch-check connection liveness.\n */\nexport const TOOL_PROVIDER_CONNECTION_STATUS_ROUTE = createRoute({\n method: 'POST',\n path: '/tool-providers/:providerId/connection-status',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n bodySchema: connectionStatusToolProviderBodySchema,\n responseSchema: connectionStatusToolProviderResponseSchema,\n summary: 'Get connection status for a provider',\n description: 'Batch-checks whether a set of (connectionId, toolkit) tuples are still connected',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, items }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.getConnectionStatus) {\n throw new HTTPException(400, { message: `Tool provider ${providerId} does not support getConnectionStatus` });\n }\n const result = await provider.getConnectionStatus({ items });\n return { items: result };\n } catch (error) {\n return handleError(error, 'Error getting connection status');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/connections — Existing provider connections\n * scoped to a toolkit. Admin callers can pass `authorId` and `scope` filters;\n * non-admins always see only their own + shared rows.\n */\nexport const LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/connections',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n queryParamSchema: listConnectionsQuerySchema,\n responseSchema: listConnectionsResponseSchema,\n summary: 'List existing connections',\n description:\n 'Returns existing provider connections on a toolkit, so the picker can offer them for pinning without re-running OAuth',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({\n mastra,\n providerId,\n toolkit,\n authorId: queryAuthorId,\n scope: queryScope,\n page,\n perPage,\n requestContext,\n }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.listConnections) {\n throw new HTTPException(400, { message: `Tool provider ${providerId} does not support listConnections` });\n }\n const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());\n const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;\n\n const requestedAuthorId =\n isAdmin && typeof queryAuthorId === 'string' && queryAuthorId.length > 0 ? queryAuthorId : undefined;\n const effectiveAuthorId = isAdmin ? requestedAuthorId : callerAuthorId;\n\n const storage = mastra.getStorage();\n const store = await storage?.getStore('toolProviderConnections');\n\n // Strategy B: seed userIds[] from persisted rows so admins can enumerate\n // connections owned by other authors.\n let labelRows: Array<{\n authorId: string;\n connectionId: string;\n label: string | null;\n scope: 'shared' | 'per-author' | 'caller-supplied';\n }> = [];\n if (store) {\n try {\n const rows = await store.listConnectionsByAuthor({\n providerId: provider.info.id,\n toolkit,\n });\n labelRows = rows.map(r => ({\n authorId: r.authorId,\n connectionId: r.connectionId,\n label: r.label,\n scope: r.scope ?? 'per-author',\n }));\n } catch (joinError) {\n mastra.getLogger?.()?.warn?.('[tool-providers] failed to join tool_provider_connections labels', {\n error: joinError instanceof Error ? joinError.message : String(joinError),\n providerId,\n toolkit,\n });\n }\n }\n\n const userIdSet = new Set<string>();\n const wantShared = !queryScope || queryScope === 'shared';\n const wantPerAuthor = !queryScope || queryScope === 'per-author';\n const wantCallerSupplied = !queryScope || queryScope === 'caller-supplied';\n const hasSharedRow = labelRows.some(r => r.scope === 'shared');\n if (isAdmin && effectiveAuthorId === undefined) {\n for (const r of labelRows) {\n if (r.scope === 'shared' && wantShared) userIdSet.add(r.authorId);\n if (r.scope === 'per-author' && wantPerAuthor) userIdSet.add(r.authorId);\n if (r.scope === 'caller-supplied' && wantCallerSupplied) userIdSet.add(r.authorId);\n }\n } else if (isAdmin && effectiveAuthorId) {\n if (wantPerAuthor || wantCallerSupplied) userIdSet.add(effectiveAuthorId);\n if (wantShared && hasSharedRow) userIdSet.add(SHARED_BUCKET_ID);\n } else {\n if (wantPerAuthor) userIdSet.add(callerAuthorId);\n if (wantShared && hasSharedRow) userIdSet.add(SHARED_BUCKET_ID);\n // Non-admins never enumerate caller-supplied connections.\n }\n\n const userIds = Array.from(userIdSet);\n if (userIds.length === 0) {\n return {\n items: [],\n pagination: { page: page ?? 1, perPage, hasMore: false },\n };\n }\n\n const adapterResult = await provider.listConnections({\n toolkit,\n userIds,\n ...(typeof page === 'number' ? { page } : {}),\n ...(typeof perPage === 'number' ? { perPage } : {}),\n });\n\n const rowByConnId = new Map(labelRows.map(r => [r.connectionId, r]));\n\n const visibleItems = adapterResult.items.filter(item => {\n if (!queryScope) return true;\n const scope = rowByConnId.get(item.connectionId)?.scope ?? 'per-author';\n return scope === queryScope;\n });\n\n return {\n items: visibleItems.map(item => {\n const row = rowByConnId.get(item.connectionId);\n return {\n ...item,\n label: row?.label ?? null,\n ...(row?.scope ? { scope: row.scope } : {}),\n };\n }),\n pagination: adapterResult.pagination,\n };\n } catch (error) {\n return handleError(error, 'Error listing tool provider connections');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/connection-fields — Dynamic auth fields\n * the picker should collect before authorize (e.g. Confluence subdomain).\n */\nexport const LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/connection-fields',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n queryParamSchema: listConnectionFieldsQuerySchema,\n responseSchema: listConnectionFieldsResponseSchema,\n summary: 'List connection field schema',\n description: 'Returns a list of provider-specific fields the UI should collect before initiating an authorize call',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, toolkit }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.listConnectionFields) {\n return { fields: [] };\n }\n const fields = await provider.listConnectionFields({ toolkit });\n return { fields };\n } catch (error) {\n return handleError(error, 'Error listing tool provider connection fields');\n }\n },\n});\n\n/**\n * DELETE /tool-providers/:providerId/connections/:connectionId — Disconnect.\n * Without `?force=true` rejects when the connection is still pinned by any\n * agent. With `?force=true` revokes at the provider (best-effort) and drops\n * the persisted row.\n */\nexport const DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/tool-providers/:providerId/connections/:connectionId',\n responseType: 'json',\n pathParamSchema: toolProviderConnectionPathParams,\n queryParamSchema: disconnectConnectionQuerySchema,\n responseSchema: disconnectConnectionResponseSchema,\n summary: 'Disconnect a connection',\n description:\n 'Revokes the provider-side connection (if supported) and removes the persisted tool_provider_connections row. Use `?force=true` to bypass usage checks.',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, connectionId, force, requestContext }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());\n const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;\n const isForce = force === true || force === 'true';\n\n const storage = mastra.getStorage();\n const store = await storage?.getStore('toolProviderConnections');\n\n let ownerAuthorId: string | undefined;\n let ownerScope: 'shared' | 'per-author' | 'caller-supplied' | undefined;\n let matched = false;\n if (store) {\n const rows = await store.listConnectionsByAuthor({ providerId: provider.info.id });\n const match = rows.find(r => r.connectionId === connectionId);\n if (match) {\n matched = true;\n ownerAuthorId = match.authorId;\n ownerScope = match.scope;\n }\n }\n\n // Fail closed: if storage is configured and no row matches the\n // requested connectionId, refuse the call for non-admins. Without\n // this guard, a caller could trigger provider-side `revokeConnection`\n // against another tenant's connectionId by guessing it.\n if (store && !matched && !isAdmin) {\n throw new HTTPException(403, {\n message: 'You do not have permission to disconnect this connection',\n });\n }\n\n const effectiveOwner = ownerAuthorId ?? callerAuthorId;\n const isShared = ownerScope === 'shared';\n if (!isShared && effectiveOwner !== callerAuthorId && !isAdmin) {\n throw new HTTPException(403, {\n message: 'You do not have permission to disconnect this connection',\n });\n }\n\n if (!isForce) {\n const usage = await countConnectionUsage(mastra, connectionId);\n if (usage > 0) {\n throw new HTTPException(409, {\n message: `Connection ${connectionId} is still pinned by ${usage} agent(s). Pass ?force=true to disconnect anyway.`,\n });\n }\n }\n\n let revoked = false;\n if (provider.capabilities?.supportsRevoke && typeof provider.revokeConnection === 'function') {\n await provider.revokeConnection(connectionId);\n revoked = true;\n }\n\n if (store) {\n await store.deleteConnection({\n authorId: effectiveOwner,\n providerId: provider.info.id,\n connectionId,\n });\n }\n\n return { ok: true as const, revoked };\n } catch (error) {\n return handleError(error, 'Error disconnecting tool provider connection');\n }\n },\n});\n\n/**\n * PATCH /tool-providers/:providerId/connections/:connectionId — Update a\n * connection's persisted display label. Idempotent. Ownership-gated the same\n * way as DISCONNECT: only the connection owner (or an admin) may rename,\n * unless the row is `scope: 'shared'`.\n *\n * Pass `label: null` (or an empty string) to clear the existing label.\n */\nexport const UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE = createRoute({\n method: 'PATCH',\n path: '/tool-providers/:providerId/connections/:connectionId',\n responseType: 'json',\n pathParamSchema: toolProviderConnectionPathParams,\n bodySchema: updateConnectionBodySchema,\n responseSchema: updateConnectionResponseSchema,\n summary: 'Update a connection label',\n description:\n 'Updates the persisted display label on tool_provider_connections. Returns 403 when caller is neither the owner nor admin (and the row is not shared), 404 when the row does not exist.',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, connectionId, label, requestContext }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());\n const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;\n\n const storage = mastra.getStorage();\n const store = await storage?.getStore('toolProviderConnections');\n if (!store) {\n throw new HTTPException(500, {\n message: 'Tool provider connections storage is not configured',\n });\n }\n\n const rows = await store.listConnectionsByAuthor({ providerId: provider.info.id });\n const match = rows.find(r => r.connectionId === connectionId);\n if (!match) {\n throw new HTTPException(404, {\n message: `Connection ${connectionId} not found for provider ${providerId}`,\n });\n }\n\n const isShared = match.scope === 'shared';\n if (!isShared && match.authorId !== callerAuthorId && !isAdmin) {\n throw new HTTPException(403, {\n message: 'You do not have permission to update this connection',\n });\n }\n\n // Normalize: empty string and explicit null both clear the label.\n const nextLabel: string | null = typeof label === 'string' && label.trim().length > 0 ? label.trim() : null;\n\n await store.upsertConnection({\n authorId: match.authorId,\n providerId: provider.info.id,\n toolkit: match.toolkit,\n connectionId,\n label: nextLabel,\n scope: match.scope,\n });\n\n return { ok: true as const, label: nextLabel };\n } catch (error) {\n return handleError(error, 'Error updating tool provider connection');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/connections/:connectionId/usage — Lists agents\n * that currently pin the given connection in their `toolProviders` config.\n */\nexport const GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/connections/:connectionId/usage',\n responseType: 'json',\n pathParamSchema: toolProviderConnectionPathParams,\n queryParamSchema: connectionUsageQuerySchema,\n responseSchema: connectionUsageResponseSchema,\n summary: 'List agents using a connection',\n description: 'Returns the agents that pin this connection in their toolProviders config',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId, connectionId, toolkit, requestContext }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());\n const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;\n\n const storage = mastra.getStorage();\n const store = await storage?.getStore('toolProviderConnections');\n let ownerAuthorId: string | undefined;\n let ownerScope: 'shared' | 'per-author' | 'caller-supplied' | undefined;\n let matched = false;\n if (store) {\n const rows = await store.listConnectionsByAuthor({ providerId: provider.info.id });\n const match = rows.find(r => r.connectionId === connectionId);\n if (match) {\n matched = true;\n ownerAuthorId = match.authorId;\n ownerScope = match.scope;\n }\n }\n\n // Fail closed: if storage is configured and no row matches the\n // requested connectionId, refuse the call for non-admins so callers\n // cannot probe for other tenants' connections.\n if (store && !matched && !isAdmin) {\n throw new HTTPException(403, {\n message: 'You do not have permission to view usage for this connection',\n });\n }\n\n const effectiveOwner = ownerAuthorId ?? callerAuthorId;\n const isShared = ownerScope === 'shared';\n if (!isShared && effectiveOwner !== callerAuthorId && !isAdmin) {\n throw new HTTPException(403, {\n message: 'You do not have permission to view usage for this connection',\n });\n }\n\n const agents = await scanConnectionUsage(mastra, { providerId: provider.info.id, connectionId, toolkit });\n return { agents };\n } catch (error) {\n return handleError(error, 'Error listing tool provider connection usage');\n }\n },\n});\n\n/**\n * GET /tool-providers/:providerId/health — Provider-level health check.\n */\nexport const GET_TOOL_PROVIDER_HEALTH_ROUTE = createRoute({\n method: 'GET',\n path: '/tool-providers/:providerId/health',\n responseType: 'json',\n pathParamSchema: toolProviderIdPathParams,\n responseSchema: toolProviderHealthResponseSchema,\n summary: 'Get tool provider health',\n description: 'Returns provider-level health (config, reachability, etc.)',\n tags: ['Tool Providers'],\n requiresAuth: true,\n handler: async ({ mastra, providerId }) => {\n try {\n const editor = requireEditor(mastra.getEditor());\n const provider = await resolveProvider(editor, providerId);\n if (!provider.getHealth) {\n return { ok: true };\n }\n return await provider.getHealth();\n } catch (error) {\n return handleError(error, 'Error getting tool provider health');\n }\n },\n});\n\n// ============================================================================\n// Usage scan helpers\n// ============================================================================\n\nasync function scanConnectionUsage(\n mastra: any,\n args: { providerId: string; connectionId: string; toolkit?: string },\n): Promise<Array<{ id: string; name: string }>> {\n const storage = mastra.getStorage();\n const agentsStore = await storage?.getStore('agents');\n if (!agentsStore) return [];\n\n const { agents } = await agentsStore.listResolved({ perPage: false });\n const out: Array<{ id: string; name: string }> = [];\n for (const agent of agents) {\n const config = agent?.toolProviders?.[args.providerId];\n if (!config?.connections) continue;\n for (const [toolkit, connections] of Object.entries(config.connections)) {\n if (args.toolkit && toolkit !== args.toolkit) continue;\n const match = (connections as Array<{ connectionId: string }>).some(c => c.connectionId === args.connectionId);\n if (match) {\n out.push({ id: agent.id, name: agent.name ?? agent.id });\n break;\n }\n }\n }\n return out;\n}\n\nasync function countConnectionUsage(mastra: any, connectionId: string): Promise<number> {\n const storage = mastra.getStorage();\n const agentsStore = await storage?.getStore('agents');\n if (!agentsStore) return 0;\n const { agents } = await agentsStore.listResolved({ perPage: false });\n let count = 0;\n for (const agent of agents) {\n const tp = agent?.toolProviders;\n if (!tp) continue;\n for (const config of Object.values(tp) as Array<{\n connections?: Record<string, Array<{ connectionId: string }>>;\n }>) {\n const pinned = Object.values(config?.connections ?? {}).some(arr =>\n arr.some(c => c.connectionId === connectionId),\n );\n if (pinned) {\n count += 1;\n break;\n }\n }\n }\n return count;\n}\n"],"mappings":";;;;;;;;;;AAyCA,MAAM,0BAA0B;;;;;;AAOhC,MAAM,mBAAmB;;;;;;;;;;AAezB,IAAI;AACJ,eAAe,yBAAyB;CACtC,IAAI,CAAC,qBACH,sBAAsB,MAAM,OAAO;CAErC,OAAO;AACT;AAEA,SAAS,cAAc,QAAkD;CACvE,IAAI,CAAC,QACH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,2BAA2B,CAAC;CAEtE,OAAO;AACT;AAEA,eAAe,gBAAgB,QAAuB,YAA2C;CAC/F,IAAI;EACF,OAAO,OAAO,uBAAuB,UAAU;CACjD,SAAS,OAAO;EACd,MAAM,EAAE,6BAA6B,MAAM,uBAAuB;EAClE,IAAI,iBAAiB,0BACnB,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,MAAM,QAAQ,CAAC;EAEzD,MAAM;CACR;AACF;AAMA,IAAI,sBAAsB;AAC1B,SAAS,0BAA0B,QAAyC;CAC1E,IAAI,qBAAqB;CACzB,sBAAsB;CACtB,QAAQ,KACN,wKAEF;AACF;;;;;;AAOA,SAAS,eAAe,gBAA4C,QAA2C;CAC7G,MAAM,aAAa,gBAAgB,IAAIC,6BAAAA,sBAAsB;CAC7D,IAAI,OAAO,eAAe,YAAY,WAAW,SAAS,GACxD,OAAO;CAGT,MAAM,OAAO,gBAAgB,IAAIC,kBAAAA,eAAe;CAChD,IAAI,QAAQ,OAAO,SAAS,YAAY,QAAQ,MAAM;EACpD,MAAM,KAAM,KAAyB;EACrC,IAAI,OAAO,OAAO,YAAY,GAAG,SAAS,GACxC,OAAO;CAEX;CAEA,0BAA0B,MAAM;CAChC,OAAO;AACT;;;;;AAUA,MAAa,4BAA4BC,sBAAAA,YAAY;CACnD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,aAAa;EAC7B,IAAI;GAEF,MAAM,YADS,cAAc,OAAO,UAAU,CACvB,CAAC,CAAC,iBAAiB;GAC1C,OAAO,EACL,WAAW,OAAO,OAAO,SAAS,CAAC,CAAC,KAAI,cAAa;IACnD,GAAG,SAAS;IACZ,GAAI,SAAS,cAAc,EAAE,aAAa,SAAS,YAAY,IAAI,CAAC;IACpE,GAAI,SAAS,eAAe,EAAE,cAAc,SAAS,aAAa,IAAI,CAAC;GACzE,EAAE,EACJ;EACF,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,8BAA8B;EAC1D;CACF;AACF,CAAC;;;;AAKD,MAAa,oCAAoCF,sBAAAA,YAAY;CAC3D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBG,uBAAAA;CACjB,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,iBAAiB;EACzC,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,IAAI,SAAS,mBACX,OAAO,MAAM,SAAS,kBAAkB;GAE1C,IAAI,SAAS,cACX,OAAO,MAAM,SAAS,aAAa;GAErC,OAAO,EAAE,MAAM,CAAC,EAAE;EACpB,SAAS,OAAO;GACd,OAAOF,8BAAAA,YAAY,OAAO,sCAAsC;EAClE;CACF;AACF,CAAC;;;;AAKD,MAAa,iCAAiCF,sBAAAA,YAAY;CACxD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBG,uBAAAA;CACjB,kBAAkBE,uBAAAA;CAClB,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,YAAY,SAAS,QAAQ,MAAM,cAAc;EACzE,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,MAAM,OAA+E,CAAC;GACtF,IAAI,YAAY,KAAA,GAAW,KAAK,UAAU;GAC1C,IAAI,WAAW,KAAA,GAAW,KAAK,SAAS;GACxC,IAAI,SAAS,KAAA,GAAW,KAAK,OAAO;GACpC,IAAI,YAAY,KAAA,GAAW,KAAK,UAAU;GAC1C,IAAI,SAAS,gBACX,OAAO,MAAM,SAAS,eAAe,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,KAAA,CAAS;GAEtF,OAAO,MAAM,SAAS,UAAU,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,KAAA,CAAS;EACjF,SAAS,OAAO;GACd,OAAOJ,8BAAAA,YAAY,OAAO,mCAAmC;EAC/D;CACF;AACF,CAAC;;;;AAKD,MAAa,sCAAsCF,sBAAAA,YAAY;CAC7D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBO,uBAAAA;CACjB,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,YAAY,eAAe;EACnD,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,IAAI,CAAC,SAAS,eACZ,MAAM,IAAIX,uBAAAA,cAAc,KAAK,EAAE,SAAS,iBAAiB,WAAW,iCAAiC,CAAC;GAExG,MAAM,SAAS,MAAM,SAAS,cAAc,QAAQ;GACpD,IAAI,CAAC,QACH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,mBAAmB,SAAS,yBAAyB,aAAa,CAAC;GAE7G,OAAO;EACT,SAAS,OAAO;GACd,OAAOK,8BAAAA,YAAY,OAAO,yCAAyC;EACrE;CACF;AACF,CAAC;;;;;AAMD,MAAa,gCAAgCF,sBAAAA,YAAY;CACvD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBG,uBAAAA;CACjB,YAAYM,uBAAAA;CACZ,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,YAAY,SAAS,cAAc,UAAU,QAAQ,OAAO,OAAO,qBAAqB;EAChH,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,IAAI,CAAC,SAAS,WACZ,MAAM,IAAIb,uBAAAA,cAAc,KAAK,EAAE,SAAS,iBAAiB,WAAW,6BAA6B,CAAC;GAYpG,MAAM,iBAAiB,SAAS,SAAS;GACzC,MAAM,iBACJ,mBAAmB,YAAY,mBAAmB,oBAAoB,iBAAiB;GACzF,MAAM,mBAAmB,gBAAgB,IAAIC,6BAAAA,sBAAsB;GACnE,IAAI,mBAAmB,mBACjB;QAAA,OAAO,qBAAqB,YAAY,iBAAiB,WAAW,GACtE,MAAM,IAAID,uBAAAA,cAAc,KAAK,EAC3B,SAAS,wEAAwEC,6BAAAA,uBAAuB,6BAA6BA,6BAAAA,uBAAuB,yCAC9J,CAAC;GAAA;GAGL,MAAM,iBAAiB,eAAe,gBAAgB,OAAO,UAAU,CAAC;GACxE,MAAM,gBACJ,mBAAmB,WACf,mBACA,mBAAmB,oBAChB,mBACD;GAMR,MAAM,SAAS,gBAAgB,aAAa,SAAS,IAAI,eAAe;GACxE,MAAM,SAAS,MAAM,SAAS,UAAU;IAAE;IAAS,cAAc;IAAQ;IAAU;GAAO,CAAC;GAI3F,MAAM,wBAAwB,gBAAgB,aAAa,SAAS,IAAI,eAAe,OAAO;GAC9F,IAAI;IAEF,MAAM,QAAQ,MADE,OAAO,WACG,CAAC,EAAE,SAAS,yBAAyB;IAC/D,IAAI,SAAS,uBACX,MAAM,MAAM,iBAAiB;KAC3B,UAAU;KACV,YAAY,SAAS,KAAK;KAC1B;KACA,cAAc;KACd,OAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;KAC/D,OAAO;IACT,CAAC;GAEL,SAAS,aAAa;IACpB,OAAO,YAAY,CAAC,EAAE,OAAO,qEAAqE;KAChG,OAAO,uBAAuB,QAAQ,YAAY,UAAU,OAAO,WAAW;KAC9E;KACA;KACA,cAAc;IAChB,CAAC;GACH;GAEA,OAAO;EACT,SAAS,OAAO;GACd,OAAOI,8BAAAA,YAAY,OAAO,iCAAiC;EAC7D;CACF;AACF,CAAC;;;;AAKD,MAAa,sCAAsCF,sBAAAA,YAAY;CAC7D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBW,uBAAAA;CACjB,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,YAAY,aAAa;EACjD,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,IAAI,CAAC,SAAS,eACZ,MAAM,IAAIf,uBAAAA,cAAc,KAAK,EAAE,SAAS,iBAAiB,WAAW,iCAAiC,CAAC;GAGxG,OAAO,EAAE,QAAA,MADY,SAAS,cAAc,MAAM,EAClC;EAClB,SAAS,OAAO;GACd,OAAOK,8BAAAA,YAAY,OAAO,yCAAyC;EACrE;CACF;AACF,CAAC;;;;AAKD,MAAa,wCAAwCF,sBAAAA,YAAY;CAC/D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBG,uBAAAA;CACjB,YAAYU,uBAAAA;CACZ,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,YAAY,YAAY;EAChD,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,IAAI,CAAC,SAAS,qBACZ,MAAM,IAAIjB,uBAAAA,cAAc,KAAK,EAAE,SAAS,iBAAiB,WAAW,uCAAuC,CAAC;GAG9G,OAAO,EAAE,OAAO,MADK,SAAS,oBAAoB,EAAE,MAAM,CAAC,EACpC;EACzB,SAAS,OAAO;GACd,OAAOK,8BAAAA,YAAY,OAAO,iCAAiC;EAC7D;CACF;AACF,CAAC;;;;;;AAOD,MAAa,uCAAuCF,sBAAAA,YAAY;CAC9D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBG,uBAAAA;CACjB,kBAAkBY,uBAAAA;CAClB,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EACd,QACA,YACA,SACA,UAAU,eACV,OAAO,YACP,MACA,SACA,qBACI;EACJ,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,IAAI,CAAC,SAAS,iBACZ,MAAM,IAAInB,uBAAAA,cAAc,KAAK,EAAE,SAAS,iBAAiB,WAAW,mCAAmC,CAAC;GAE1G,MAAM,iBAAiB,eAAe,gBAAgB,OAAO,UAAU,CAAC;GACxE,MAAM,UAAU,iBAAiBoB,mCAAAA,eAAe,gBAAgB,uBAAuB,IAAI;GAE3F,MAAM,oBACJ,WAAW,OAAO,kBAAkB,YAAY,cAAc,SAAS,IAAI,gBAAgB,KAAA;GAC7F,MAAM,oBAAoB,UAAU,oBAAoB;GAGxD,MAAM,QAAQ,MADE,OAAO,WACG,CAAC,EAAE,SAAS,yBAAyB;GAI/D,IAAI,YAKC,CAAC;GACN,IAAI,OACF,IAAI;IAKF,aAAY,MAJO,MAAM,wBAAwB;KAC/C,YAAY,SAAS,KAAK;KAC1B;IACF,CAAC,EAAA,CACgB,KAAI,OAAM;KACzB,UAAU,EAAE;KACZ,cAAc,EAAE;KAChB,OAAO,EAAE;KACT,OAAO,EAAE,SAAS;IACpB,EAAE;GACJ,SAAS,WAAW;IAClB,OAAO,YAAY,CAAC,EAAE,OAAO,oEAAoE;KAC/F,OAAO,qBAAqB,QAAQ,UAAU,UAAU,OAAO,SAAS;KACxE;KACA;IACF,CAAC;GACH;GAGF,MAAM,4BAAY,IAAI,IAAY;GAClC,MAAM,aAAa,CAAC,cAAc,eAAe;GACjD,MAAM,gBAAgB,CAAC,cAAc,eAAe;GACpD,MAAM,qBAAqB,CAAC,cAAc,eAAe;GACzD,MAAM,eAAe,UAAU,MAAK,MAAK,EAAE,UAAU,QAAQ;GAC7D,IAAI,WAAW,sBAAsB,KAAA,GACnC,KAAK,MAAM,KAAK,WAAW;IACzB,IAAI,EAAE,UAAU,YAAY,YAAY,UAAU,IAAI,EAAE,QAAQ;IAChE,IAAI,EAAE,UAAU,gBAAgB,eAAe,UAAU,IAAI,EAAE,QAAQ;IACvE,IAAI,EAAE,UAAU,qBAAqB,oBAAoB,UAAU,IAAI,EAAE,QAAQ;GACnF;QACK,IAAI,WAAW,mBAAmB;IACvC,IAAI,iBAAiB,oBAAoB,UAAU,IAAI,iBAAiB;IACxE,IAAI,cAAc,cAAc,UAAU,IAAI,gBAAgB;GAChE,OAAO;IACL,IAAI,eAAe,UAAU,IAAI,cAAc;IAC/C,IAAI,cAAc,cAAc,UAAU,IAAI,gBAAgB;GAEhE;GAEA,MAAM,UAAU,MAAM,KAAK,SAAS;GACpC,IAAI,QAAQ,WAAW,GACrB,OAAO;IACL,OAAO,CAAC;IACR,YAAY;KAAE,MAAM,QAAQ;KAAG;KAAS,SAAS;IAAM;GACzD;GAGF,MAAM,gBAAgB,MAAM,SAAS,gBAAgB;IACnD;IACA;IACA,GAAI,OAAO,SAAS,WAAW,EAAE,KAAK,IAAI,CAAC;IAC3C,GAAI,OAAO,YAAY,WAAW,EAAE,QAAQ,IAAI,CAAC;GACnD,CAAC;GAED,MAAM,cAAc,IAAI,IAAI,UAAU,KAAI,MAAK,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;GAQnE,OAAO;IACL,OAPmB,cAAc,MAAM,QAAO,SAAQ;KACtD,IAAI,CAAC,YAAY,OAAO;KAExB,QADc,YAAY,IAAI,KAAK,YAAY,CAAC,EAAE,SAAS,kBAC1C;IACnB,CAGoB,CAAC,CAAC,KAAI,SAAQ;KAC9B,MAAM,MAAM,YAAY,IAAI,KAAK,YAAY;KAC7C,OAAO;MACL,GAAG;MACH,OAAO,KAAK,SAAS;MACrB,GAAI,KAAK,QAAQ,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;KAC3C;IACF,CAAC;IACD,YAAY,cAAc;GAC5B;EACF,SAAS,OAAO;GACd,OAAOf,8BAAAA,YAAY,OAAO,yCAAyC;EACrE;CACF;AACF,CAAC;;;;;AAMD,MAAa,6CAA6CF,sBAAAA,YAAY;CACpE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBG,uBAAAA;CACjB,kBAAkBe,uBAAAA;CAClB,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,YAAY,cAAc;EAClD,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,IAAI,CAAC,SAAS,sBACZ,OAAO,EAAE,QAAQ,CAAC,EAAE;GAGtB,OAAO,EAAE,QAAA,MADY,SAAS,qBAAqB,EAAE,QAAQ,CAAC,EAC9C;EAClB,SAAS,OAAO;GACd,OAAOjB,8BAAAA,YAAY,OAAO,+CAA+C;EAC3E;CACF;AACF,CAAC;;;;;;;AAQD,MAAa,4CAA4CF,sBAAAA,YAAY;CACnE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBoB,uBAAAA;CACjB,kBAAkBC,uBAAAA;CAClB,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,YAAY,cAAc,OAAO,qBAAqB;EAC9E,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,MAAM,iBAAiB,eAAe,gBAAgB,OAAO,UAAU,CAAC;GACxE,MAAM,UAAU,iBAAiBL,mCAAAA,eAAe,gBAAgB,uBAAuB,IAAI;GAC3F,MAAM,UAAU,UAAU,QAAQ,UAAU;GAG5C,MAAM,QAAQ,MADE,OAAO,WACG,CAAC,EAAE,SAAS,yBAAyB;GAE/D,IAAI;GACJ,IAAI;GACJ,IAAI,UAAU;GACd,IAAI,OAAO;IAET,MAAM,SAAQ,MADK,MAAM,wBAAwB,EAAE,YAAY,SAAS,KAAK,GAAG,CAAC,EAAA,CAC9D,MAAK,MAAK,EAAE,iBAAiB,YAAY;IAC5D,IAAI,OAAO;KACT,UAAU;KACV,gBAAgB,MAAM;KACtB,aAAa,MAAM;IACrB;GACF;GAMA,IAAI,SAAS,CAAC,WAAW,CAAC,SACxB,MAAM,IAAIpB,uBAAAA,cAAc,KAAK,EAC3B,SAAS,2DACX,CAAC;GAGH,MAAM,iBAAiB,iBAAiB;GAExC,IAAI,EADa,eAAe,aACf,mBAAmB,kBAAkB,CAAC,SACrD,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,2DACX,CAAC;GAGH,IAAI,CAAC,SAAS;IACZ,MAAM,QAAQ,MAAM,qBAAqB,QAAQ,YAAY;IAC7D,IAAI,QAAQ,GACV,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,cAAc,aAAa,sBAAsB,MAAM,mDAClE,CAAC;GAEL;GAEA,IAAI,UAAU;GACd,IAAI,SAAS,cAAc,kBAAkB,OAAO,SAAS,qBAAqB,YAAY;IAC5F,MAAM,SAAS,iBAAiB,YAAY;IAC5C,UAAU;GACZ;GAEA,IAAI,OACF,MAAM,MAAM,iBAAiB;IAC3B,UAAU;IACV,YAAY,SAAS,KAAK;IAC1B;GACF,CAAC;GAGH,OAAO;IAAE,IAAI;IAAe;GAAQ;EACtC,SAAS,OAAO;GACd,OAAOK,8BAAAA,YAAY,OAAO,8CAA8C;EAC1E;CACF;AACF,CAAC;;;;;;;;;AAUD,MAAa,wCAAwCF,sBAAAA,YAAY;CAC/D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBoB,uBAAAA;CACjB,YAAYG,uBAAAA;CACZ,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,YAAY,cAAc,OAAO,qBAAqB;EAC9E,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,MAAM,iBAAiB,eAAe,gBAAgB,OAAO,UAAU,CAAC;GACxE,MAAM,UAAU,iBAAiBP,mCAAAA,eAAe,gBAAgB,uBAAuB,IAAI;GAG3F,MAAM,QAAQ,MADE,OAAO,WACG,CAAC,EAAE,SAAS,yBAAyB;GAC/D,IAAI,CAAC,OACH,MAAM,IAAIpB,uBAAAA,cAAc,KAAK,EAC3B,SAAS,sDACX,CAAC;GAIH,MAAM,SAAQ,MADK,MAAM,wBAAwB,EAAE,YAAY,SAAS,KAAK,GAAG,CAAC,EAAA,CAC9D,MAAK,MAAK,EAAE,iBAAiB,YAAY;GAC5D,IAAI,CAAC,OACH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,cAAc,aAAa,0BAA0B,aAChE,CAAC;GAIH,IAAI,EADa,MAAM,UAAU,aAChB,MAAM,aAAa,kBAAkB,CAAC,SACrD,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,uDACX,CAAC;GAIH,MAAM,YAA2B,OAAO,UAAU,YAAY,MAAM,KAAK,CAAC,CAAC,SAAS,IAAI,MAAM,KAAK,IAAI;GAEvG,MAAM,MAAM,iBAAiB;IAC3B,UAAU,MAAM;IAChB,YAAY,SAAS,KAAK;IAC1B,SAAS,MAAM;IACf;IACA,OAAO;IACP,OAAO,MAAM;GACf,CAAC;GAED,OAAO;IAAE,IAAI;IAAe,OAAO;GAAU;EAC/C,SAAS,OAAO;GACd,OAAOK,8BAAAA,YAAY,OAAO,yCAAyC;EACrE;CACF;AACF,CAAC;;;;;AAMD,MAAa,2CAA2CF,sBAAAA,YAAY;CAClE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBoB,uBAAAA;CACjB,kBAAkBK,uBAAAA;CAClB,gBAAgBC,uBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,YAAY,cAAc,SAAS,qBAAqB;EAChF,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,MAAM,iBAAiB,eAAe,gBAAgB,OAAO,UAAU,CAAC;GACxE,MAAM,UAAU,iBAAiBT,mCAAAA,eAAe,gBAAgB,uBAAuB,IAAI;GAG3F,MAAM,QAAQ,MADE,OAAO,WACG,CAAC,EAAE,SAAS,yBAAyB;GAC/D,IAAI;GACJ,IAAI;GACJ,IAAI,UAAU;GACd,IAAI,OAAO;IAET,MAAM,SAAQ,MADK,MAAM,wBAAwB,EAAE,YAAY,SAAS,KAAK,GAAG,CAAC,EAAA,CAC9D,MAAK,MAAK,EAAE,iBAAiB,YAAY;IAC5D,IAAI,OAAO;KACT,UAAU;KACV,gBAAgB,MAAM;KACtB,aAAa,MAAM;IACrB;GACF;GAKA,IAAI,SAAS,CAAC,WAAW,CAAC,SACxB,MAAM,IAAIpB,uBAAAA,cAAc,KAAK,EAC3B,SAAS,+DACX,CAAC;GAKH,IAAI,EADa,eAAe,cADT,iBAAiB,oBAEJ,kBAAkB,CAAC,SACrD,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,+DACX,CAAC;GAIH,OAAO,EAAE,QAAA,MADY,oBAAoB,QAAQ;IAAE,YAAY,SAAS,KAAK;IAAI;IAAc;GAAQ,CAAC,EACxF;EAClB,SAAS,OAAO;GACd,OAAOK,8BAAAA,YAAY,OAAO,8CAA8C;EAC1E;CACF;AACF,CAAC;;;;AAKD,MAAa,iCAAiCF,sBAAAA,YAAY;CACxD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBG,uBAAAA;CACjB,gBAAgBwB,uBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,gBAAgB;CACvB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,iBAAiB;EACzC,IAAI;GAEF,MAAM,WAAW,MAAM,gBADR,cAAc,OAAO,UAAU,CACF,GAAG,UAAU;GACzD,IAAI,CAAC,SAAS,WACZ,OAAO,EAAE,IAAI,KAAK;GAEpB,OAAO,MAAM,SAAS,UAAU;EAClC,SAAS,OAAO;GACd,OAAOzB,8BAAAA,YAAY,OAAO,oCAAoC;EAChE;CACF;AACF,CAAC;AAMD,eAAe,oBACb,QACA,MAC8C;CAE9C,MAAM,cAAc,MADJ,OAAO,WACS,CAAC,EAAE,SAAS,QAAQ;CACpD,IAAI,CAAC,aAAa,OAAO,CAAC;CAE1B,MAAM,EAAE,WAAW,MAAM,YAAY,aAAa,EAAE,SAAS,MAAM,CAAC;CACpE,MAAM,MAA2C,CAAC;CAClD,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,SAAS,OAAO,gBAAgB,KAAK;EAC3C,IAAI,CAAC,QAAQ,aAAa;EAC1B,KAAK,MAAM,CAAC,SAAS,gBAAgB,OAAO,QAAQ,OAAO,WAAW,GAAG;GACvE,IAAI,KAAK,WAAW,YAAY,KAAK,SAAS;GAE9C,IADe,YAAgD,MAAK,MAAK,EAAE,iBAAiB,KAAK,YACzF,GAAG;IACT,IAAI,KAAK;KAAE,IAAI,MAAM;KAAI,MAAM,MAAM,QAAQ,MAAM;IAAG,CAAC;IACvD;GACF;EACF;CACF;CACA,OAAO;AACT;AAEA,eAAe,qBAAqB,QAAa,cAAuC;CAEtF,MAAM,cAAc,MADJ,OAAO,WACS,CAAC,EAAE,SAAS,QAAQ;CACpD,IAAI,CAAC,aAAa,OAAO;CACzB,MAAM,EAAE,WAAW,MAAM,YAAY,aAAa,EAAE,SAAS,MAAM,CAAC;CACpE,IAAI,QAAQ;CACZ,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,KAAK,OAAO;EAClB,IAAI,CAAC,IAAI;EACT,KAAK,MAAM,UAAU,OAAO,OAAO,EAAE,GAMnC,IAHe,OAAO,OAAO,QAAQ,eAAe,CAAC,CAAC,CAAC,CAAC,MAAK,QAC3D,IAAI,MAAK,MAAK,EAAE,iBAAiB,YAAY,CAEtC,GAAG;GACV,SAAS;GACT;EACF;CAEJ;CACA,OAAO;AACT"}
@@ -1,6 +1,6 @@
1
1
  import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
2
2
  import { n as createRoute } from "../../route-builder-YQ_gLIvW.js";
3
- import { c as MASTRA_USER_KEY } from "../../constants-CutMu4A_.js";
3
+ import { l as MASTRA_USER_KEY } from "../../constants-0jFCWoex.js";
4
4
  import { handleError } from "./error.js";
5
5
  import { C as toolProviderConnectionPathParams, D as toolSlugPathParams, O as updateConnectionBodySchema, T as toolProviderIdPathParams, _ as listToolProviderToolkitsResponseSchema, b as listToolProvidersResponseSchema, c as connectionUsageQuerySchema, d as disconnectConnectionResponseSchema, f as getToolProviderToolSchemaResponseSchema, g as listConnectionsResponseSchema, h as listConnectionsQuerySchema, k as updateConnectionResponseSchema, l as connectionUsageResponseSchema, m as listConnectionFieldsResponseSchema, n as authorizeToolProviderBodySchema, o as connectionStatusToolProviderBodySchema, p as listConnectionFieldsQuerySchema, r as authorizeToolProviderResponseSchema, s as connectionStatusToolProviderResponseSchema, t as authStatusToolProviderResponseSchema, u as disconnectConnectionQuerySchema, v as listToolProviderToolsQuerySchema, w as toolProviderHealthResponseSchema, x as toolProviderAuthStatusPathParams, y as listToolProviderToolsResponseSchema } from "../../tool-providers-CIESXi7M.js";
6
6
  import { hasAdminBypass } from "./authorship.js";
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../rolldown-runtime-Bd6kNlEP.cjs");
2
3
  //#region src/server/handlers/tool-schema-overrides.ts
3
4
  /**
4
5
  * Core's `CoreToolBuilder` injects runtime-only override fields into tool input
@@ -1 +1 @@
1
- {"version":3,"file":"tool-schema-overrides.cjs","names":[],"sources":["../../../src/server/handlers/tool-schema-overrides.ts"],"sourcesContent":["/**\n * Core's `CoreToolBuilder` injects runtime-only override fields into tool input\n * schemas (`_background` for background execution, `suspendedToolRunId` /\n * `resumeData` for resumable tools). Those fields are meant for the LLM tool-call\n * protocol, not for humans filling in a tool-execution form, so we strip them\n * from serialized input schemas returned by the API.\n *\n * `suspendedToolRunId` / `resumeData` are only removed when their description\n * matches the exact injected shape, so a user-authored field with the same name\n * is preserved.\n */\n\nconst INJECTED_OVERRIDE_DESCRIPTIONS: Record<string, string> = {\n suspendedToolRunId: 'The runId of the suspended tool',\n resumeData: 'The resumeData object created from the resumeSchema of suspended tool',\n};\n\nexport function stripInjectedToolOverrideFields<T>(jsonSchema: T): T {\n if (!jsonSchema || typeof jsonSchema !== 'object' || Array.isArray(jsonSchema)) return jsonSchema;\n const schema = jsonSchema as { properties?: Record<string, unknown>; required?: unknown };\n if (!schema.properties || typeof schema.properties !== 'object') return jsonSchema;\n\n const properties = { ...schema.properties };\n let changed = false;\n\n if ('_background' in properties) {\n delete properties._background;\n changed = true;\n }\n\n for (const [key, description] of Object.entries(INJECTED_OVERRIDE_DESCRIPTIONS)) {\n const prop = properties[key];\n if (prop && typeof prop === 'object' && (prop as { description?: string }).description === description) {\n delete properties[key];\n changed = true;\n }\n }\n\n if (!changed) return jsonSchema;\n\n const required = Array.isArray(schema.required) ? schema.required.filter(key => key in properties) : schema.required;\n\n return { ...jsonSchema, properties, ...(required !== undefined ? { required } : {}) };\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,MAAM,iCAAyD;CAC7D,oBAAoB;CACpB,YAAY;AACd;AAEA,SAAgB,gCAAmC,YAAkB;CACnE,IAAI,CAAC,cAAc,OAAO,eAAe,YAAY,MAAM,QAAQ,UAAU,GAAG,OAAO;CACvF,MAAM,SAAS;CACf,IAAI,CAAC,OAAO,cAAc,OAAO,OAAO,eAAe,UAAU,OAAO;CAExE,MAAM,aAAa,EAAE,GAAG,OAAO,WAAW;CAC1C,IAAI,UAAU;CAEd,IAAI,iBAAiB,YAAY;EAC/B,OAAO,WAAW;EAClB,UAAU;CACZ;CAEA,KAAK,MAAM,CAAC,KAAK,gBAAgB,OAAO,QAAQ,8BAA8B,GAAG;EAC/E,MAAM,OAAO,WAAW;EACxB,IAAI,QAAQ,OAAO,SAAS,YAAa,KAAkC,gBAAgB,aAAa;GACtG,OAAO,WAAW;GAClB,UAAU;EACZ;CACF;CAEA,IAAI,CAAC,SAAS,OAAO;CAErB,MAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,SAAS,QAAO,QAAO,OAAO,UAAU,IAAI,OAAO;CAE5G,OAAO;EAAE,GAAG;EAAY;EAAY,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,CAAC;CAAG;AACtF"}
1
+ {"version":3,"file":"tool-schema-overrides.cjs","names":[],"sources":["../../../src/server/handlers/tool-schema-overrides.ts"],"sourcesContent":["/**\n * Core's `CoreToolBuilder` injects runtime-only override fields into tool input\n * schemas (`_background` for background execution, `suspendedToolRunId` /\n * `resumeData` for resumable tools). Those fields are meant for the LLM tool-call\n * protocol, not for humans filling in a tool-execution form, so we strip them\n * from serialized input schemas returned by the API.\n *\n * `suspendedToolRunId` / `resumeData` are only removed when their description\n * matches the exact injected shape, so a user-authored field with the same name\n * is preserved.\n */\n\nconst INJECTED_OVERRIDE_DESCRIPTIONS: Record<string, string> = {\n suspendedToolRunId: 'The runId of the suspended tool',\n resumeData: 'The resumeData object created from the resumeSchema of suspended tool',\n};\n\nexport function stripInjectedToolOverrideFields<T>(jsonSchema: T): T {\n if (!jsonSchema || typeof jsonSchema !== 'object' || Array.isArray(jsonSchema)) return jsonSchema;\n const schema = jsonSchema as { properties?: Record<string, unknown>; required?: unknown };\n if (!schema.properties || typeof schema.properties !== 'object') return jsonSchema;\n\n const properties = { ...schema.properties };\n let changed = false;\n\n if ('_background' in properties) {\n delete properties._background;\n changed = true;\n }\n\n for (const [key, description] of Object.entries(INJECTED_OVERRIDE_DESCRIPTIONS)) {\n const prop = properties[key];\n if (prop && typeof prop === 'object' && (prop as { description?: string }).description === description) {\n delete properties[key];\n changed = true;\n }\n }\n\n if (!changed) return jsonSchema;\n\n const required = Array.isArray(schema.required) ? schema.required.filter(key => key in properties) : schema.required;\n\n return { ...jsonSchema, properties, ...(required !== undefined ? { required } : {}) };\n}\n"],"mappings":";;;;;;;;;;;;;;AAYA,MAAM,iCAAyD;CAC7D,oBAAoB;CACpB,YAAY;AACd;AAEA,SAAgB,gCAAmC,YAAkB;CACnE,IAAI,CAAC,cAAc,OAAO,eAAe,YAAY,MAAM,QAAQ,UAAU,GAAG,OAAO;CACvF,MAAM,SAAS;CACf,IAAI,CAAC,OAAO,cAAc,OAAO,OAAO,eAAe,UAAU,OAAO;CAExE,MAAM,aAAa,EAAE,GAAG,OAAO,WAAW;CAC1C,IAAI,UAAU;CAEd,IAAI,iBAAiB,YAAY;EAC/B,OAAO,WAAW;EAClB,UAAU;CACZ;CAEA,KAAK,MAAM,CAAC,KAAK,gBAAgB,OAAO,QAAQ,8BAA8B,GAAG;EAC/E,MAAM,OAAO,WAAW;EACxB,IAAI,QAAQ,OAAO,SAAS,YAAa,KAAkC,gBAAgB,aAAa;GACtG,OAAO,WAAW;GAClB,UAAU;EACZ;CACF;CAEA,IAAI,CAAC,SAAS,OAAO;CAErB,MAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,SAAS,QAAO,QAAO,OAAO,UAAU,IAAI,OAAO;CAE5G,OAAO;EAAE,GAAG;EAAY;EAAY,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,CAAC;CAAG;AACtF"}
@@ -1,14 +1,14 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_rolldown_runtime = require("../../rolldown-runtime-CVvi-lCc.cjs");
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_common = require("../../common-DQn8jX5T.cjs");
5
5
  const require_agents = require("../../agents-CLv_RFQx.cjs");
6
- const require_schema_Bv9OdW1f = require("../../schema-Bv9OdW1f-CHHI-NTr.cjs");
7
- const require_route_builder = require("../../route-builder-BAAedfru.cjs");
8
- require("../../schema-DkBbires.cjs");
9
- const require_utils = require("../../utils-BkPZAGxS.cjs");
6
+ const require_schema_Bv9OdW1f = require("../../schema-Bv9OdW1f-CxTiW8RD.cjs");
7
+ const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
8
+ require("../../schema-CNKnRmv1.cjs");
9
+ const require_utils = require("../../utils-CmYnjLcY.cjs");
10
10
  const require_server_handlers_error = require("./error.cjs");
11
- const require_utils$1 = require("../../utils-CXbhpYYv.cjs");
11
+ const require_utils$1 = require("../../utils-DJMUhfvY.cjs");
12
12
  const require_server_handlers_tool_schema_overrides = require("./tool-schema-overrides.cjs");
13
13
  const require_server_handlers_agents = require("./agents.cjs");
14
14
  let _mastra_core_tools = require("@mastra/core/tools");
@@ -1,13 +1,13 @@
1
- import { n as __exportAll } from "../../rolldown-runtime-DuvcJU0W.js";
1
+ import { r as __exportAll } from "../../rolldown-runtime-maW3aOIk.js";
2
2
  import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
3
3
  import { o as optionalRunIdSchema } from "../../common-5ZZuR6wj.js";
4
4
  import { W as serializedToolSchema, X as toolIdPathParams, _ as executeToolBodySchema, l as agentToolPathParams, v as executeToolContextBodySchema, w as listToolsResponseSchema, y as executeToolResponseSchema } from "../../agents-BetrUB_N.js";
5
5
  import { n as standardSchemaToJSONSchema, r as toStandardSchema } from "../../schema-Bv9OdW1f-DLSJSqQv.js";
6
6
  import { n as createRoute } from "../../route-builder-YQ_gLIvW.js";
7
7
  import "../../schema-CGeYTFwm.js";
8
- import { l as stringify } from "../../utils-CljhO7OY.js";
8
+ import { l as stringify } from "../../utils-B2vd77Fi.js";
9
9
  import { handleError } from "./error.js";
10
- import { c as validateBody, d as MastraFGAPermissions } from "../../utils-qMLbyf2U.js";
10
+ import { c as validateBody, d as MastraFGAPermissions } from "../../utils-Hz8Hc2cd.js";
11
11
  import { stripInjectedToolOverrideFields } from "./tool-schema-overrides.js";
12
12
  import { getAgentFromSystem } from "./agents.js";
13
13
  import { isProviderDefinedTool, isVercelTool } from "@mastra/core/tools";
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_utils = require("../../utils-CXbhpYYv.cjs");
2
+ require("../../rolldown-runtime-Bd6kNlEP.cjs");
3
+ const require_utils = require("../../utils-DJMUhfvY.cjs");
3
4
  exports.enforceThreadAccess = require_utils.enforceThreadAccess;
4
5
  exports.getEffectiveResourceId = require_utils.getEffectiveResourceId;
5
6
  exports.getEffectiveThreadId = require_utils.getEffectiveThreadId;
@@ -1,2 +1,2 @@
1
- import { a as parsePerPage, c as validateBody, i as parseFilters, l as validateRunOwnership, n as getEffectiveResourceId, o as requireEffectiveResourceId, r as getEffectiveThreadId, s as sanitizeBody, t as enforceThreadAccess, u as validateThreadOwnership } from "../../utils-qMLbyf2U.js";
1
+ import { a as parsePerPage, c as validateBody, i as parseFilters, l as validateRunOwnership, n as getEffectiveResourceId, o as requireEffectiveResourceId, r as getEffectiveThreadId, s as sanitizeBody, t as enforceThreadAccess, u as validateThreadOwnership } from "../../utils-Hz8Hc2cd.js";
2
2
  export { enforceThreadAccess, getEffectiveResourceId, getEffectiveThreadId, parseFilters, parsePerPage, requireEffectiveResourceId, sanitizeBody, validateBody, validateRunOwnership, validateThreadOwnership };
@@ -1,6 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../rolldown-runtime-Bd6kNlEP.cjs");
2
3
  const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
3
- const require_utils = require("../../utils-BkPZAGxS.cjs");
4
+ const require_utils = require("../../utils-CmYnjLcY.cjs");
4
5
  //#region src/server/handlers/validate-agent-instructions.ts
5
6
  const UNPUBLISHED_REFERENCES_MESSAGE = "Unable to use unpublished referenced prompt blocks: {ids}. Publish these prompt blocks and try again.";
6
7
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"validate-agent-instructions.cjs","names":["getStoredResourceScope","HTTPException"],"sources":["../../../src/server/handlers/validate-agent-instructions.ts"],"sourcesContent":["import type { Mastra } from '@mastra/core';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { AgentInstructionBlock } from '@mastra/core/storage';\n\nimport { HTTPException } from '../http-exception';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nconst UNPUBLISHED_REFERENCES_MESSAGE =\n 'Unable to use unpublished referenced prompt blocks: {ids}. Publish these prompt blocks and try again.';\n\n/**\n * Type guard that returns AgentInstructionBlock[] when the input is an array, or undefined otherwise.\n */\nfunction getInstructionBlocks(instructions: unknown): AgentInstructionBlock[] | undefined {\n if (!Array.isArray(instructions)) {\n return undefined;\n }\n\n return instructions as AgentInstructionBlock[];\n}\n\n/**\n * Validates prompt_block_ref references in agent instructions.\n * Checks every referenced prompt block for existence, access scope, and published status with an activeVersionId.\n * Throws an HTTP 400 error listing unresolved or unpublished block IDs when validation fails.\n */\nexport async function validateAgentInstructionReferences({\n instructions,\n mastra,\n requestContext,\n}: {\n instructions: unknown;\n mastra: Pick<Mastra, 'getServer' | 'getStorage'>;\n requestContext: RequestContext | undefined;\n}): Promise<void> {\n const blocks = getInstructionBlocks(instructions);\n if (!blocks) {\n return;\n }\n\n const referenceIds = [\n ...new Set(\n blocks\n .filter(\n (block): block is Extract<AgentInstructionBlock, { type: 'prompt_block_ref' }> =>\n block.type === 'prompt_block_ref',\n )\n .map(block => block.id.trim())\n .filter(Boolean),\n ),\n ];\n if (referenceIds.length === 0) {\n return;\n }\n\n const storage = mastra.getStorage();\n const promptBlocksStore = storage ? await storage.getStore('promptBlocks') : null;\n const scope = await getStoredResourceScope(mastra, requestContext);\n const results = promptBlocksStore\n ? await Promise.allSettled(referenceIds.map(id => promptBlocksStore.getById(id)))\n : referenceIds.map(() => ({ status: 'rejected' as const, reason: new Error('Storage unavailable') }));\n\n const unresolvedIds: string[] = [];\n const unpublishedIds: string[] = [];\n\n for (const [index, result] of results.entries()) {\n const id = referenceIds[index];\n if (!id || result.status === 'rejected' || !result.value) {\n if (id) unresolvedIds.push(id);\n continue;\n }\n\n try {\n assertStoredResourceScope(result.value, scope);\n } catch {\n unresolvedIds.push(id);\n continue;\n }\n\n if (result.value.status !== 'published' || !result.value.activeVersionId) {\n unpublishedIds.push(id);\n }\n }\n\n if (unresolvedIds.length > 0) {\n throw new HTTPException(400, {\n message: `Unable to verify referenced prompt blocks: ${unresolvedIds.join(', ')}. Resolve these references and try again.`,\n });\n }\n\n if (unpublishedIds.length > 0) {\n throw new HTTPException(400, {\n message: UNPUBLISHED_REFERENCES_MESSAGE.replace('{ids}', unpublishedIds.join(', ')),\n });\n }\n}\n"],"mappings":";;;;AAOA,MAAM,iCACJ;;;;AAKF,SAAS,qBAAqB,cAA4D;CACxF,IAAI,CAAC,MAAM,QAAQ,YAAY,GAC7B;CAGF,OAAO;AACT;;;;;;AAOA,eAAsB,mCAAmC,EACvD,cACA,QACA,kBAKgB;CAChB,MAAM,SAAS,qBAAqB,YAAY;CAChD,IAAI,CAAC,QACH;CAGF,MAAM,eAAe,CACnB,GAAG,IAAI,IACL,OACG,QACE,UACC,MAAM,SAAS,kBACnB,CAAC,CACA,KAAI,UAAS,MAAM,GAAG,KAAK,CAAC,CAAC,CAC7B,OAAO,OAAO,CACnB,CACF;CACA,IAAI,aAAa,WAAW,GAC1B;CAGF,MAAM,UAAU,OAAO,WAAW;CAClC,MAAM,oBAAoB,UAAU,MAAM,QAAQ,SAAS,cAAc,IAAI;CAC7E,MAAM,QAAQ,MAAMA,cAAAA,uBAAuB,QAAQ,cAAc;CACjE,MAAM,UAAU,oBACZ,MAAM,QAAQ,WAAW,aAAa,KAAI,OAAM,kBAAkB,QAAQ,EAAE,CAAC,CAAC,IAC9E,aAAa,WAAW;EAAE,QAAQ;EAAqB,wBAAQ,IAAI,MAAM,qBAAqB;CAAE,EAAE;CAEtG,MAAM,gBAA0B,CAAC;CACjC,MAAM,iBAA2B,CAAC;CAElC,KAAK,MAAM,CAAC,OAAO,WAAW,QAAQ,QAAQ,GAAG;EAC/C,MAAM,KAAK,aAAa;EACxB,IAAI,CAAC,MAAM,OAAO,WAAW,cAAc,CAAC,OAAO,OAAO;GACxD,IAAI,IAAI,cAAc,KAAK,EAAE;GAC7B;EACF;EAEA,IAAI;GACF,cAAA,0BAA0B,OAAO,OAAO,KAAK;EAC/C,QAAQ;GACN,cAAc,KAAK,EAAE;GACrB;EACF;EAEA,IAAI,OAAO,MAAM,WAAW,eAAe,CAAC,OAAO,MAAM,iBACvD,eAAe,KAAK,EAAE;CAE1B;CAEA,IAAI,cAAc,SAAS,GACzB,MAAM,IAAIC,uBAAAA,cAAc,KAAK,EAC3B,SAAS,8CAA8C,cAAc,KAAK,IAAI,EAAE,2CAClF,CAAC;CAGH,IAAI,eAAe,SAAS,GAC1B,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,+BAA+B,QAAQ,SAAS,eAAe,KAAK,IAAI,CAAC,EACpF,CAAC;AAEL"}
1
+ {"version":3,"file":"validate-agent-instructions.cjs","names":["getStoredResourceScope","HTTPException"],"sources":["../../../src/server/handlers/validate-agent-instructions.ts"],"sourcesContent":["import type { Mastra } from '@mastra/core';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { AgentInstructionBlock } from '@mastra/core/storage';\n\nimport { HTTPException } from '../http-exception';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nconst UNPUBLISHED_REFERENCES_MESSAGE =\n 'Unable to use unpublished referenced prompt blocks: {ids}. Publish these prompt blocks and try again.';\n\n/**\n * Type guard that returns AgentInstructionBlock[] when the input is an array, or undefined otherwise.\n */\nfunction getInstructionBlocks(instructions: unknown): AgentInstructionBlock[] | undefined {\n if (!Array.isArray(instructions)) {\n return undefined;\n }\n\n return instructions as AgentInstructionBlock[];\n}\n\n/**\n * Validates prompt_block_ref references in agent instructions.\n * Checks every referenced prompt block for existence, access scope, and published status with an activeVersionId.\n * Throws an HTTP 400 error listing unresolved or unpublished block IDs when validation fails.\n */\nexport async function validateAgentInstructionReferences({\n instructions,\n mastra,\n requestContext,\n}: {\n instructions: unknown;\n mastra: Pick<Mastra, 'getServer' | 'getStorage'>;\n requestContext: RequestContext | undefined;\n}): Promise<void> {\n const blocks = getInstructionBlocks(instructions);\n if (!blocks) {\n return;\n }\n\n const referenceIds = [\n ...new Set(\n blocks\n .filter(\n (block): block is Extract<AgentInstructionBlock, { type: 'prompt_block_ref' }> =>\n block.type === 'prompt_block_ref',\n )\n .map(block => block.id.trim())\n .filter(Boolean),\n ),\n ];\n if (referenceIds.length === 0) {\n return;\n }\n\n const storage = mastra.getStorage();\n const promptBlocksStore = storage ? await storage.getStore('promptBlocks') : null;\n const scope = await getStoredResourceScope(mastra, requestContext);\n const results = promptBlocksStore\n ? await Promise.allSettled(referenceIds.map(id => promptBlocksStore.getById(id)))\n : referenceIds.map(() => ({ status: 'rejected' as const, reason: new Error('Storage unavailable') }));\n\n const unresolvedIds: string[] = [];\n const unpublishedIds: string[] = [];\n\n for (const [index, result] of results.entries()) {\n const id = referenceIds[index];\n if (!id || result.status === 'rejected' || !result.value) {\n if (id) unresolvedIds.push(id);\n continue;\n }\n\n try {\n assertStoredResourceScope(result.value, scope);\n } catch {\n unresolvedIds.push(id);\n continue;\n }\n\n if (result.value.status !== 'published' || !result.value.activeVersionId) {\n unpublishedIds.push(id);\n }\n }\n\n if (unresolvedIds.length > 0) {\n throw new HTTPException(400, {\n message: `Unable to verify referenced prompt blocks: ${unresolvedIds.join(', ')}. Resolve these references and try again.`,\n });\n }\n\n if (unpublishedIds.length > 0) {\n throw new HTTPException(400, {\n message: UNPUBLISHED_REFERENCES_MESSAGE.replace('{ids}', unpublishedIds.join(', ')),\n });\n }\n}\n"],"mappings":";;;;;AAOA,MAAM,iCACJ;;;;AAKF,SAAS,qBAAqB,cAA4D;CACxF,IAAI,CAAC,MAAM,QAAQ,YAAY,GAC7B;CAGF,OAAO;AACT;;;;;;AAOA,eAAsB,mCAAmC,EACvD,cACA,QACA,kBAKgB;CAChB,MAAM,SAAS,qBAAqB,YAAY;CAChD,IAAI,CAAC,QACH;CAGF,MAAM,eAAe,CACnB,GAAG,IAAI,IACL,OACG,QACE,UACC,MAAM,SAAS,kBACnB,CAAC,CACA,KAAI,UAAS,MAAM,GAAG,KAAK,CAAC,CAAC,CAC7B,OAAO,OAAO,CACnB,CACF;CACA,IAAI,aAAa,WAAW,GAC1B;CAGF,MAAM,UAAU,OAAO,WAAW;CAClC,MAAM,oBAAoB,UAAU,MAAM,QAAQ,SAAS,cAAc,IAAI;CAC7E,MAAM,QAAQ,MAAMA,cAAAA,uBAAuB,QAAQ,cAAc;CACjE,MAAM,UAAU,oBACZ,MAAM,QAAQ,WAAW,aAAa,KAAI,OAAM,kBAAkB,QAAQ,EAAE,CAAC,CAAC,IAC9E,aAAa,WAAW;EAAE,QAAQ;EAAqB,wBAAQ,IAAI,MAAM,qBAAqB;CAAE,EAAE;CAEtG,MAAM,gBAA0B,CAAC;CACjC,MAAM,iBAA2B,CAAC;CAElC,KAAK,MAAM,CAAC,OAAO,WAAW,QAAQ,QAAQ,GAAG;EAC/C,MAAM,KAAK,aAAa;EACxB,IAAI,CAAC,MAAM,OAAO,WAAW,cAAc,CAAC,OAAO,OAAO;GACxD,IAAI,IAAI,cAAc,KAAK,EAAE;GAC7B;EACF;EAEA,IAAI;GACF,cAAA,0BAA0B,OAAO,OAAO,KAAK;EAC/C,QAAQ;GACN,cAAc,KAAK,EAAE;GACrB;EACF;EAEA,IAAI,OAAO,MAAM,WAAW,eAAe,CAAC,OAAO,MAAM,iBACvD,eAAe,KAAK,EAAE;CAE1B;CAEA,IAAI,cAAc,SAAS,GACzB,MAAM,IAAIC,uBAAAA,cAAc,KAAK,EAC3B,SAAS,8CAA8C,cAAc,KAAK,IAAI,EAAE,2CAClF,CAAC;CAGH,IAAI,eAAe,SAAS,GAC1B,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,+BAA+B,QAAQ,SAAS,eAAe,KAAK,IAAI,CAAC,EACpF,CAAC;AAEL"}
@@ -1,5 +1,5 @@
1
1
  import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
2
- import { i as getStoredResourceScope, n as assertStoredResourceScope } from "../../utils-CljhO7OY.js";
2
+ import { i as getStoredResourceScope, n as assertStoredResourceScope } from "../../utils-B2vd77Fi.js";
3
3
  //#region src/server/handlers/validate-agent-instructions.ts
4
4
  const UNPUBLISHED_REFERENCES_MESSAGE = "Unable to use unpublished referenced prompt blocks: {ids}. Publish these prompt blocks and try again.";
5
5
  /**
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../rolldown-runtime-Bd6kNlEP.cjs");
2
3
  const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
3
4
  //#region src/server/handlers/validate-avatar.ts
4
5
  const AVATAR_MAX_BYTES = 512 * 1024;
@@ -1 +1 @@
1
- {"version":3,"file":"validate-avatar.cjs","names":["HTTPException"],"sources":["../../../src/server/handlers/validate-avatar.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\n\nconst AVATAR_MAX_BYTES = 512 * 1024; // 512 KB\n\n/**\n * Validates `metadata.avatarUrl` if present.\n * Ensures it's a well-formed data URL and the decoded payload is ≤ 512 KB.\n * No-ops when metadata is absent or doesn't contain avatarUrl.\n */\nexport function validateMetadataAvatarUrl(metadata: Record<string, unknown> | undefined): void {\n if (!metadata || !('avatarUrl' in metadata) || metadata.avatarUrl === null || metadata.avatarUrl === undefined)\n return;\n if (typeof metadata.avatarUrl !== 'string') {\n throw new HTTPException(400, { message: 'metadata.avatarUrl must be a string' });\n }\n\n const dataUrl = metadata.avatarUrl;\n const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n throw new HTTPException(400, {\n message: 'metadata.avatarUrl must be a valid data URL (data:<mime>;base64,<data>)',\n });\n }\n\n // `Buffer.from(..., 'base64')` decodes leniently — it silently ignores\n // invalid characters and never throws. Validate the payload format strictly\n // before measuring its byte length so malformed input is rejected.\n const base64Payload = match[2]!;\n const isStrictBase64 =\n base64Payload.length > 0 &&\n base64Payload.length % 4 === 0 &&\n /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(base64Payload);\n if (!isStrictBase64) {\n throw new HTTPException(400, { message: 'metadata.avatarUrl contains invalid base64' });\n }\n const byteLength = Buffer.from(base64Payload, 'base64').byteLength;\n\n if (byteLength === 0) {\n throw new HTTPException(400, { message: 'metadata.avatarUrl is empty' });\n }\n\n if (byteLength > AVATAR_MAX_BYTES) {\n throw new HTTPException(413, {\n message: `metadata.avatarUrl exceeds ${AVATAR_MAX_BYTES}-byte limit (got ${byteLength})`,\n });\n }\n}\n"],"mappings":";;;AAEA,MAAM,mBAAmB,MAAM;;;;;;AAO/B,SAAgB,0BAA0B,UAAqD;CAC7F,IAAI,CAAC,YAAY,EAAE,eAAe,aAAa,SAAS,cAAc,QAAQ,SAAS,cAAc,KAAA,GACnG;CACF,IAAI,OAAO,SAAS,cAAc,UAChC,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,sCAAsC,CAAC;CAIjF,MAAM,QADU,SAAS,UACH,MAAM,4BAA4B;CACxD,IAAI,CAAC,OACH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,0EACX,CAAC;CAMH,MAAM,gBAAgB,MAAM;CAK5B,IAAI,EAHF,cAAc,SAAS,KACvB,cAAc,SAAS,MAAM,KAC7B,mEAAmE,KAAK,aAAa,IAErF,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,6CAA6C,CAAC;CAExF,MAAM,aAAa,OAAO,KAAK,eAAe,QAAQ,CAAC,CAAC;CAExD,IAAI,eAAe,GACjB,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,8BAA8B,CAAC;CAGzE,IAAI,aAAa,kBACf,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,8BAA8B,iBAAiB,mBAAmB,WAAW,GACxF,CAAC;AAEL"}
1
+ {"version":3,"file":"validate-avatar.cjs","names":["HTTPException"],"sources":["../../../src/server/handlers/validate-avatar.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\n\nconst AVATAR_MAX_BYTES = 512 * 1024; // 512 KB\n\n/**\n * Validates `metadata.avatarUrl` if present.\n * Ensures it's a well-formed data URL and the decoded payload is ≤ 512 KB.\n * No-ops when metadata is absent or doesn't contain avatarUrl.\n */\nexport function validateMetadataAvatarUrl(metadata: Record<string, unknown> | undefined): void {\n if (!metadata || !('avatarUrl' in metadata) || metadata.avatarUrl === null || metadata.avatarUrl === undefined)\n return;\n if (typeof metadata.avatarUrl !== 'string') {\n throw new HTTPException(400, { message: 'metadata.avatarUrl must be a string' });\n }\n\n const dataUrl = metadata.avatarUrl;\n const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n throw new HTTPException(400, {\n message: 'metadata.avatarUrl must be a valid data URL (data:<mime>;base64,<data>)',\n });\n }\n\n // `Buffer.from(..., 'base64')` decodes leniently — it silently ignores\n // invalid characters and never throws. Validate the payload format strictly\n // before measuring its byte length so malformed input is rejected.\n const base64Payload = match[2]!;\n const isStrictBase64 =\n base64Payload.length > 0 &&\n base64Payload.length % 4 === 0 &&\n /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(base64Payload);\n if (!isStrictBase64) {\n throw new HTTPException(400, { message: 'metadata.avatarUrl contains invalid base64' });\n }\n const byteLength = Buffer.from(base64Payload, 'base64').byteLength;\n\n if (byteLength === 0) {\n throw new HTTPException(400, { message: 'metadata.avatarUrl is empty' });\n }\n\n if (byteLength > AVATAR_MAX_BYTES) {\n throw new HTTPException(413, {\n message: `metadata.avatarUrl exceeds ${AVATAR_MAX_BYTES}-byte limit (got ${byteLength})`,\n });\n }\n}\n"],"mappings":";;;;AAEA,MAAM,mBAAmB,MAAM;;;;;;AAO/B,SAAgB,0BAA0B,UAAqD;CAC7F,IAAI,CAAC,YAAY,EAAE,eAAe,aAAa,SAAS,cAAc,QAAQ,SAAS,cAAc,KAAA,GACnG;CACF,IAAI,OAAO,SAAS,cAAc,UAChC,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,sCAAsC,CAAC;CAIjF,MAAM,QADU,SAAS,UACH,MAAM,4BAA4B;CACxD,IAAI,CAAC,OACH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,0EACX,CAAC;CAMH,MAAM,gBAAgB,MAAM;CAK5B,IAAI,EAHF,cAAc,SAAS,KACvB,cAAc,SAAS,MAAM,KAC7B,mEAAmE,KAAK,aAAa,IAErF,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,6CAA6C,CAAC;CAExF,MAAM,aAAa,OAAO,KAAK,eAAe,QAAQ,CAAC,CAAC;CAExD,IAAI,eAAe,GACjB,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,8BAA8B,CAAC;CAGzE,IAAI,aAAa,kBACf,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,8BAA8B,iBAAiB,mBAAmB,WAAW,GACxF,CAAC;AAEL"}
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_rolldown_runtime = require("../../rolldown-runtime-CVvi-lCc.cjs");
2
+ const require_rolldown_runtime = require("../../rolldown-runtime-Bd6kNlEP.cjs");
3
3
  const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
4
- const require_route_builder = require("../../route-builder-BAAedfru.cjs");
4
+ const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
5
5
  const require_server_handlers_error = require("./error.cjs");
6
6
  const require_vectors = require("../../vectors-D6uZn2f1.cjs");
7
7
  let _mastra_core_llm = require("@mastra/core/llm");
@@ -1,4 +1,4 @@
1
- import { n as __exportAll } from "../../rolldown-runtime-DuvcJU0W.js";
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-YQ_gLIvW.js";
4
4
  import { handleError } from "./error.js";
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../rolldown-runtime-Bd6kNlEP.cjs");
2
3
  //#region src/server/handlers/version-helpers.ts
3
4
  /**
4
5
  * Generic version management helpers shared across all versioned editor primitives.
@@ -1 +1 @@
1
- {"version":3,"file":"version-helpers.cjs","names":[],"sources":["../../../src/server/handlers/version-helpers.ts"],"sourcesContent":["/**\n * Generic version management helpers shared across all versioned editor primitives.\n * These utilities are domain-agnostic and work with any VersionedStorageDomain.\n */\n\n// Default maximum versions per entity (can be made configurable in the future)\nexport const DEFAULT_MAX_VERSIONS = 50;\n\n/** Snapshot config fields for MCP client versioning. */\nexport const MCP_CLIENT_SNAPSHOT_CONFIG_FIELDS = ['name', 'description', 'servers'] as const;\n\n/**\n * Deep equality comparison for comparing two values.\n * Handles primitives, arrays, objects, and Date instances.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== typeof b) return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => deepEqual(item, b[index]));\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every(key => Object.prototype.hasOwnProperty.call(bObj, key) && deepEqual(aObj[key], bObj[key]));\n }\n\n return false;\n}\n\n/**\n * Generates a unique ID for a version using crypto.randomUUID()\n */\nexport function generateVersionId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Extracts snapshot config fields from a version record.\n * Strips version-metadata fields (id, FK field, versionNumber, changedFields, changeMessage, createdAt).\n */\nexport function extractConfigFromVersion(\n version: Record<string, unknown>,\n snapshotConfigFields: readonly string[],\n): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n for (const field of snapshotConfigFields) {\n if (field in version) {\n config[field] = version[field];\n }\n }\n return config;\n}\n\n/**\n * Compares two snapshots and returns an array of field names that changed.\n */\nexport function calculateChangedFields(\n previous: Record<string, unknown> | null | undefined,\n current: Record<string, unknown>,\n): string[] {\n if (!previous) {\n return Object.keys(current);\n }\n\n const changedFields: string[] = [];\n const allKeys = new Set([...Object.keys(previous), ...Object.keys(current)]);\n\n for (const key of allKeys) {\n if (key === 'updatedAt' || key === 'createdAt') {\n continue;\n }\n\n const prevValue = previous[key];\n const currValue = current[key];\n\n if (!deepEqual(prevValue, currValue)) {\n changedFields.push(key);\n }\n }\n\n return changedFields;\n}\n\n/**\n * Computes detailed diffs between two config snapshots.\n */\nexport function computeVersionDiffs(\n fromConfig: Record<string, unknown>,\n toConfig: Record<string, unknown>,\n): Array<{ field: string; previousValue: unknown; currentValue: unknown }> {\n const diffs: Array<{ field: string; previousValue: unknown; currentValue: unknown }> = [];\n const allKeys = new Set([...Object.keys(fromConfig), ...Object.keys(toConfig)]);\n\n for (const key of allKeys) {\n if (key === 'updatedAt' || key === 'createdAt') {\n continue;\n }\n\n const prevValue = fromConfig[key];\n const currValue = toConfig[key];\n\n if (!deepEqual(prevValue, currValue)) {\n diffs.push({\n field: key,\n previousValue: prevValue,\n currentValue: currValue,\n });\n }\n }\n\n return diffs;\n}\n\n/**\n * Generic store interface for version management operations.\n * Works with any versioned storage domain.\n */\nexport interface VersionedStoreInterface<TEntity = unknown> {\n getLatestVersion: (parentId: string) => Promise<{ id: string; versionNumber: number } | null>;\n getVersion: (id: string) => Promise<{ id: string; versionNumber: number } | null>;\n createVersion: (params: Record<string, unknown>) => Promise<unknown>;\n update: (params: Record<string, unknown>) => Promise<TEntity>;\n listVersions: (params: Record<string, unknown>) => Promise<{\n versions: Array<{ id: string; versionNumber: number }>;\n total: number;\n page: number;\n perPage: number | false;\n hasMore: boolean;\n }>;\n deleteVersion: (id: string) => Promise<void>;\n}\n\n/**\n * Determines if an error is a unique constraint violation on versionNumber.\n */\nfunction isVersionNumberConflictError(error: unknown): boolean {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n (message.includes('unique') && message.includes('constraint')) ||\n message.includes('duplicate key') ||\n message.includes('unique_violation') ||\n message.includes('sqlite_constraint_unique') ||\n message.includes('versionnumber')\n );\n }\n return false;\n}\n\n/**\n * Enforces version retention limit by deleting oldest versions that exceed the maximum.\n * Never deletes the active version.\n */\nexport async function enforceRetentionLimit(\n store: Pick<VersionedStoreInterface, 'listVersions' | 'deleteVersion'>,\n parentId: string,\n parentIdField: string,\n activeVersionId: string | undefined | null,\n maxVersions: number = DEFAULT_MAX_VERSIONS,\n): Promise<{ deletedCount: number }> {\n const { total } = await store.listVersions({ [parentIdField]: parentId, perPage: 1 });\n\n if (total <= maxVersions) {\n return { deletedCount: 0 };\n }\n\n const versionsToDelete = total - maxVersions;\n\n const { versions: oldestVersions } = await store.listVersions({\n [parentIdField]: parentId,\n perPage: versionsToDelete + 1,\n orderBy: { field: 'versionNumber', direction: 'ASC' },\n });\n\n let deletedCount = 0;\n for (const version of oldestVersions) {\n if (deletedCount >= versionsToDelete) {\n break;\n }\n\n if (version.id === activeVersionId) {\n continue;\n }\n\n await store.deleteVersion(version.id);\n deletedCount++;\n }\n\n return { deletedCount };\n}\n\n/**\n * Creates a new version with retry logic for race condition handling.\n */\nexport async function createVersionWithRetry(\n store: Pick<VersionedStoreInterface, 'getLatestVersion' | 'createVersion'>,\n parentId: string,\n parentIdField: string,\n snapshotConfig: Record<string, unknown>,\n changedFields: string[],\n options: {\n changeMessage?: string;\n maxRetries?: number;\n } = {},\n): Promise<{ versionId: string; versionNumber: number }> {\n const { changeMessage, maxRetries = 3 } = options;\n let lastError: unknown;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const latestVersion = await store.getLatestVersion(parentId);\n const versionNumber = latestVersion ? latestVersion.versionNumber + 1 : 1;\n const versionId = generateVersionId();\n\n await store.createVersion({\n ...snapshotConfig,\n id: versionId,\n [parentIdField]: parentId,\n versionNumber,\n changedFields,\n changeMessage,\n });\n\n return { versionId, versionNumber };\n } catch (error) {\n lastError = error;\n\n if (isVersionNumberConflictError(error) && attempt < maxRetries - 1) {\n await new Promise(resolve => setTimeout(resolve, 10 * (attempt + 1)));\n continue;\n }\n\n throw error;\n }\n }\n\n throw lastError;\n}\n\n/**\n * Handles auto-versioning after an entity update.\n * Creates a new version if config fields changed, but does NOT update activeVersionId.\n */\nexport async function handleAutoVersioning<TEntity>(\n store: VersionedStoreInterface<TEntity>,\n parentId: string,\n parentIdField: string,\n snapshotConfigFields: readonly string[],\n existingEntity: TEntity & { activeVersionId?: string },\n updatedEntity: TEntity,\n configFields?: Record<string, unknown>,\n options?: { changeMessage?: string },\n): Promise<{ entity: TEntity; versionCreated: boolean }> {\n if (!configFields || Object.keys(configFields).length === 0) {\n return { entity: updatedEntity, versionCreated: false };\n }\n\n // Always compare against the latest version (not the active/published one).\n // This ensures each draft save is diffed against the last edit, so intermediate\n // draft changes are never silently reverted to the published baseline.\n const versionToCompare = await store.getLatestVersion(parentId);\n\n const previousConfig = versionToCompare\n ? extractConfigFromVersion(versionToCompare as unknown as Record<string, unknown>, snapshotConfigFields)\n : null;\n\n const changedFields = calculateChangedFields(previousConfig, configFields);\n\n if (changedFields.length === 0) {\n return { entity: updatedEntity, versionCreated: false };\n }\n\n const fullConfig: Record<string, unknown> = previousConfig ? { ...previousConfig } : {};\n for (const [key, value] of Object.entries(configFields)) {\n fullConfig[key] = value === null ? undefined : value;\n }\n\n const { versionId } = await createVersionWithRetry(store, parentId, parentIdField, fullConfig, changedFields, {\n changeMessage: options?.changeMessage ?? 'Auto-saved after edit',\n });\n\n // Do NOT update activeVersionId here — the new version stays as a draft.\n // activeVersionId is only updated when the user explicitly publishes/activates a version.\n\n const activeVersionId = existingEntity.activeVersionId || versionId;\n await enforceRetentionLimit(store, parentId, parentIdField, activeVersionId);\n\n return { entity: updatedEntity, versionCreated: true };\n}\n"],"mappings":";;;;;;AAMA,MAAa,uBAAuB;;AAGpC,MAAa,oCAAoC;CAAC;CAAQ;CAAe;AAAS;;;;;AAMlF,SAAgB,UAAU,GAAY,GAAqB;CACzD,IAAI,MAAM,GAAG,OAAO;CACpB,IAAI,KAAK,QAAQ,KAAK,MAAM,OAAO,MAAM;CACzC,IAAI,OAAO,MAAM,OAAO,GAAG,OAAO;CAElC,IAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;EACxC,IAAI,EAAE,WAAW,EAAE,QAAQ,OAAO;EAClC,OAAO,EAAE,OAAO,MAAM,UAAU,UAAU,MAAM,EAAE,MAAM,CAAC;CAC3D;CAEA,IAAI,aAAa,QAAQ,aAAa,MACpC,OAAO,EAAE,QAAQ,MAAM,EAAE,QAAQ;CAGnC,IAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;EAClD,MAAM,OAAO;EACb,MAAM,OAAO;EACb,MAAM,QAAQ,OAAO,KAAK,IAAI;EAC9B,MAAM,QAAQ,OAAO,KAAK,IAAI;EAE9B,IAAI,MAAM,WAAW,MAAM,QAAQ,OAAO;EAC1C,OAAO,MAAM,OAAM,QAAO,OAAO,UAAU,eAAe,KAAK,MAAM,GAAG,KAAK,UAAU,KAAK,MAAM,KAAK,IAAI,CAAC;CAC9G;CAEA,OAAO;AACT;;;;AAKA,SAAgB,oBAA4B;CAC1C,OAAO,OAAO,WAAW;AAC3B;;;;;AAMA,SAAgB,yBACd,SACA,sBACyB;CACzB,MAAM,SAAkC,CAAC;CACzC,KAAK,MAAM,SAAS,sBAClB,IAAI,SAAS,SACX,OAAO,SAAS,QAAQ;CAG5B,OAAO;AACT;;;;AAKA,SAAgB,uBACd,UACA,SACU;CACV,IAAI,CAAC,UACH,OAAO,OAAO,KAAK,OAAO;CAG5B,MAAM,gBAA0B,CAAC;CACjC,MAAM,0BAAU,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,QAAQ,GAAG,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC;CAE3E,KAAK,MAAM,OAAO,SAAS;EACzB,IAAI,QAAQ,eAAe,QAAQ,aACjC;EAGF,MAAM,YAAY,SAAS;EAC3B,MAAM,YAAY,QAAQ;EAE1B,IAAI,CAAC,UAAU,WAAW,SAAS,GACjC,cAAc,KAAK,GAAG;CAE1B;CAEA,OAAO;AACT;;;;AAKA,SAAgB,oBACd,YACA,UACyE;CACzE,MAAM,QAAiF,CAAC;CACxF,MAAM,0BAAU,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,UAAU,GAAG,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC;CAE9E,KAAK,MAAM,OAAO,SAAS;EACzB,IAAI,QAAQ,eAAe,QAAQ,aACjC;EAGF,MAAM,YAAY,WAAW;EAC7B,MAAM,YAAY,SAAS;EAE3B,IAAI,CAAC,UAAU,WAAW,SAAS,GACjC,MAAM,KAAK;GACT,OAAO;GACP,eAAe;GACf,cAAc;EAChB,CAAC;CAEL;CAEA,OAAO;AACT;;;;AAwBA,SAAS,6BAA6B,OAAyB;CAC7D,IAAI,iBAAiB,OAAO;EAC1B,MAAM,UAAU,MAAM,QAAQ,YAAY;EAC1C,OACG,QAAQ,SAAS,QAAQ,KAAK,QAAQ,SAAS,YAAY,KAC5D,QAAQ,SAAS,eAAe,KAChC,QAAQ,SAAS,kBAAkB,KACnC,QAAQ,SAAS,0BAA0B,KAC3C,QAAQ,SAAS,eAAe;CAEpC;CACA,OAAO;AACT;;;;;AAMA,eAAsB,sBACpB,OACA,UACA,eACA,iBACA,cAAA,IACmC;CACnC,MAAM,EAAE,UAAU,MAAM,MAAM,aAAa;GAAG,gBAAgB;EAAU,SAAS;CAAE,CAAC;CAEpF,IAAI,SAAS,aACX,OAAO,EAAE,cAAc,EAAE;CAG3B,MAAM,mBAAmB,QAAQ;CAEjC,MAAM,EAAE,UAAU,mBAAmB,MAAM,MAAM,aAAa;GAC3D,gBAAgB;EACjB,SAAS,mBAAmB;EAC5B,SAAS;GAAE,OAAO;GAAiB,WAAW;EAAM;CACtD,CAAC;CAED,IAAI,eAAe;CACnB,KAAK,MAAM,WAAW,gBAAgB;EACpC,IAAI,gBAAgB,kBAClB;EAGF,IAAI,QAAQ,OAAO,iBACjB;EAGF,MAAM,MAAM,cAAc,QAAQ,EAAE;EACpC;CACF;CAEA,OAAO,EAAE,aAAa;AACxB;;;;AAKA,eAAsB,uBACpB,OACA,UACA,eACA,gBACA,eACA,UAGI,CAAC,GACkD;CACvD,MAAM,EAAE,eAAe,aAAa,MAAM;CAC1C,IAAI;CAEJ,KAAK,IAAI,UAAU,GAAG,UAAU,YAAY,WAC1C,IAAI;EACF,MAAM,gBAAgB,MAAM,MAAM,iBAAiB,QAAQ;EAC3D,MAAM,gBAAgB,gBAAgB,cAAc,gBAAgB,IAAI;EACxE,MAAM,YAAY,kBAAkB;EAEpC,MAAM,MAAM,cAAc;GACxB,GAAG;GACH,IAAI;IACH,gBAAgB;GACjB;GACA;GACA;EACF,CAAC;EAED,OAAO;GAAE;GAAW;EAAc;CACpC,SAAS,OAAO;EACd,YAAY;EAEZ,IAAI,6BAA6B,KAAK,KAAK,UAAU,aAAa,GAAG;GACnE,MAAM,IAAI,SAAQ,YAAW,WAAW,SAAS,MAAM,UAAU,EAAE,CAAC;GACpE;EACF;EAEA,MAAM;CACR;CAGF,MAAM;AACR;;;;;AAMA,eAAsB,qBACpB,OACA,UACA,eACA,sBACA,gBACA,eACA,cACA,SACuD;CACvD,IAAI,CAAC,gBAAgB,OAAO,KAAK,YAAY,CAAC,CAAC,WAAW,GACxD,OAAO;EAAE,QAAQ;EAAe,gBAAgB;CAAM;CAMxD,MAAM,mBAAmB,MAAM,MAAM,iBAAiB,QAAQ;CAE9D,MAAM,iBAAiB,mBACnB,yBAAyB,kBAAwD,oBAAoB,IACrG;CAEJ,MAAM,gBAAgB,uBAAuB,gBAAgB,YAAY;CAEzE,IAAI,cAAc,WAAW,GAC3B,OAAO;EAAE,QAAQ;EAAe,gBAAgB;CAAM;CAGxD,MAAM,aAAsC,iBAAiB,EAAE,GAAG,eAAe,IAAI,CAAC;CACtF,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,YAAY,GACpD,WAAW,OAAO,UAAU,OAAO,KAAA,IAAY;CAGjD,MAAM,EAAE,cAAc,MAAM,uBAAuB,OAAO,UAAU,eAAe,YAAY,eAAe,EAC5G,eAAe,SAAS,iBAAiB,wBAC3C,CAAC;CAMD,MAAM,sBAAsB,OAAO,UAAU,eADrB,eAAe,mBAAmB,SACiB;CAE3E,OAAO;EAAE,QAAQ;EAAe,gBAAgB;CAAK;AACvD"}
1
+ {"version":3,"file":"version-helpers.cjs","names":[],"sources":["../../../src/server/handlers/version-helpers.ts"],"sourcesContent":["/**\n * Generic version management helpers shared across all versioned editor primitives.\n * These utilities are domain-agnostic and work with any VersionedStorageDomain.\n */\n\n// Default maximum versions per entity (can be made configurable in the future)\nexport const DEFAULT_MAX_VERSIONS = 50;\n\n/** Snapshot config fields for MCP client versioning. */\nexport const MCP_CLIENT_SNAPSHOT_CONFIG_FIELDS = ['name', 'description', 'servers'] as const;\n\n/**\n * Deep equality comparison for comparing two values.\n * Handles primitives, arrays, objects, and Date instances.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== typeof b) return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => deepEqual(item, b[index]));\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every(key => Object.prototype.hasOwnProperty.call(bObj, key) && deepEqual(aObj[key], bObj[key]));\n }\n\n return false;\n}\n\n/**\n * Generates a unique ID for a version using crypto.randomUUID()\n */\nexport function generateVersionId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Extracts snapshot config fields from a version record.\n * Strips version-metadata fields (id, FK field, versionNumber, changedFields, changeMessage, createdAt).\n */\nexport function extractConfigFromVersion(\n version: Record<string, unknown>,\n snapshotConfigFields: readonly string[],\n): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n for (const field of snapshotConfigFields) {\n if (field in version) {\n config[field] = version[field];\n }\n }\n return config;\n}\n\n/**\n * Compares two snapshots and returns an array of field names that changed.\n */\nexport function calculateChangedFields(\n previous: Record<string, unknown> | null | undefined,\n current: Record<string, unknown>,\n): string[] {\n if (!previous) {\n return Object.keys(current);\n }\n\n const changedFields: string[] = [];\n const allKeys = new Set([...Object.keys(previous), ...Object.keys(current)]);\n\n for (const key of allKeys) {\n if (key === 'updatedAt' || key === 'createdAt') {\n continue;\n }\n\n const prevValue = previous[key];\n const currValue = current[key];\n\n if (!deepEqual(prevValue, currValue)) {\n changedFields.push(key);\n }\n }\n\n return changedFields;\n}\n\n/**\n * Computes detailed diffs between two config snapshots.\n */\nexport function computeVersionDiffs(\n fromConfig: Record<string, unknown>,\n toConfig: Record<string, unknown>,\n): Array<{ field: string; previousValue: unknown; currentValue: unknown }> {\n const diffs: Array<{ field: string; previousValue: unknown; currentValue: unknown }> = [];\n const allKeys = new Set([...Object.keys(fromConfig), ...Object.keys(toConfig)]);\n\n for (const key of allKeys) {\n if (key === 'updatedAt' || key === 'createdAt') {\n continue;\n }\n\n const prevValue = fromConfig[key];\n const currValue = toConfig[key];\n\n if (!deepEqual(prevValue, currValue)) {\n diffs.push({\n field: key,\n previousValue: prevValue,\n currentValue: currValue,\n });\n }\n }\n\n return diffs;\n}\n\n/**\n * Generic store interface for version management operations.\n * Works with any versioned storage domain.\n */\nexport interface VersionedStoreInterface<TEntity = unknown> {\n getLatestVersion: (parentId: string) => Promise<{ id: string; versionNumber: number } | null>;\n getVersion: (id: string) => Promise<{ id: string; versionNumber: number } | null>;\n createVersion: (params: Record<string, unknown>) => Promise<unknown>;\n update: (params: Record<string, unknown>) => Promise<TEntity>;\n listVersions: (params: Record<string, unknown>) => Promise<{\n versions: Array<{ id: string; versionNumber: number }>;\n total: number;\n page: number;\n perPage: number | false;\n hasMore: boolean;\n }>;\n deleteVersion: (id: string) => Promise<void>;\n}\n\n/**\n * Determines if an error is a unique constraint violation on versionNumber.\n */\nfunction isVersionNumberConflictError(error: unknown): boolean {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n (message.includes('unique') && message.includes('constraint')) ||\n message.includes('duplicate key') ||\n message.includes('unique_violation') ||\n message.includes('sqlite_constraint_unique') ||\n message.includes('versionnumber')\n );\n }\n return false;\n}\n\n/**\n * Enforces version retention limit by deleting oldest versions that exceed the maximum.\n * Never deletes the active version.\n */\nexport async function enforceRetentionLimit(\n store: Pick<VersionedStoreInterface, 'listVersions' | 'deleteVersion'>,\n parentId: string,\n parentIdField: string,\n activeVersionId: string | undefined | null,\n maxVersions: number = DEFAULT_MAX_VERSIONS,\n): Promise<{ deletedCount: number }> {\n const { total } = await store.listVersions({ [parentIdField]: parentId, perPage: 1 });\n\n if (total <= maxVersions) {\n return { deletedCount: 0 };\n }\n\n const versionsToDelete = total - maxVersions;\n\n const { versions: oldestVersions } = await store.listVersions({\n [parentIdField]: parentId,\n perPage: versionsToDelete + 1,\n orderBy: { field: 'versionNumber', direction: 'ASC' },\n });\n\n let deletedCount = 0;\n for (const version of oldestVersions) {\n if (deletedCount >= versionsToDelete) {\n break;\n }\n\n if (version.id === activeVersionId) {\n continue;\n }\n\n await store.deleteVersion(version.id);\n deletedCount++;\n }\n\n return { deletedCount };\n}\n\n/**\n * Creates a new version with retry logic for race condition handling.\n */\nexport async function createVersionWithRetry(\n store: Pick<VersionedStoreInterface, 'getLatestVersion' | 'createVersion'>,\n parentId: string,\n parentIdField: string,\n snapshotConfig: Record<string, unknown>,\n changedFields: string[],\n options: {\n changeMessage?: string;\n maxRetries?: number;\n } = {},\n): Promise<{ versionId: string; versionNumber: number }> {\n const { changeMessage, maxRetries = 3 } = options;\n let lastError: unknown;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const latestVersion = await store.getLatestVersion(parentId);\n const versionNumber = latestVersion ? latestVersion.versionNumber + 1 : 1;\n const versionId = generateVersionId();\n\n await store.createVersion({\n ...snapshotConfig,\n id: versionId,\n [parentIdField]: parentId,\n versionNumber,\n changedFields,\n changeMessage,\n });\n\n return { versionId, versionNumber };\n } catch (error) {\n lastError = error;\n\n if (isVersionNumberConflictError(error) && attempt < maxRetries - 1) {\n await new Promise(resolve => setTimeout(resolve, 10 * (attempt + 1)));\n continue;\n }\n\n throw error;\n }\n }\n\n throw lastError;\n}\n\n/**\n * Handles auto-versioning after an entity update.\n * Creates a new version if config fields changed, but does NOT update activeVersionId.\n */\nexport async function handleAutoVersioning<TEntity>(\n store: VersionedStoreInterface<TEntity>,\n parentId: string,\n parentIdField: string,\n snapshotConfigFields: readonly string[],\n existingEntity: TEntity & { activeVersionId?: string },\n updatedEntity: TEntity,\n configFields?: Record<string, unknown>,\n options?: { changeMessage?: string },\n): Promise<{ entity: TEntity; versionCreated: boolean }> {\n if (!configFields || Object.keys(configFields).length === 0) {\n return { entity: updatedEntity, versionCreated: false };\n }\n\n // Always compare against the latest version (not the active/published one).\n // This ensures each draft save is diffed against the last edit, so intermediate\n // draft changes are never silently reverted to the published baseline.\n const versionToCompare = await store.getLatestVersion(parentId);\n\n const previousConfig = versionToCompare\n ? extractConfigFromVersion(versionToCompare as unknown as Record<string, unknown>, snapshotConfigFields)\n : null;\n\n const changedFields = calculateChangedFields(previousConfig, configFields);\n\n if (changedFields.length === 0) {\n return { entity: updatedEntity, versionCreated: false };\n }\n\n const fullConfig: Record<string, unknown> = previousConfig ? { ...previousConfig } : {};\n for (const [key, value] of Object.entries(configFields)) {\n fullConfig[key] = value === null ? undefined : value;\n }\n\n const { versionId } = await createVersionWithRetry(store, parentId, parentIdField, fullConfig, changedFields, {\n changeMessage: options?.changeMessage ?? 'Auto-saved after edit',\n });\n\n // Do NOT update activeVersionId here — the new version stays as a draft.\n // activeVersionId is only updated when the user explicitly publishes/activates a version.\n\n const activeVersionId = existingEntity.activeVersionId || versionId;\n await enforceRetentionLimit(store, parentId, parentIdField, activeVersionId);\n\n return { entity: updatedEntity, versionCreated: true };\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_rolldown_runtime = require("../../rolldown-runtime-CVvi-lCc.cjs");
2
+ const require_rolldown_runtime = require("../../rolldown-runtime-Bd6kNlEP.cjs");
3
3
  const require_routes = require("../../routes-BKUF5ZHA.cjs");
4
4
  //#region src/server/handlers/voice.ts
5
5
  var voice_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
@@ -1,4 +1,4 @@
1
- import { n as __exportAll } from "../../rolldown-runtime-DuvcJU0W.js";
1
+ import { r as __exportAll } from "../../rolldown-runtime-maW3aOIk.js";
2
2
  import { a as GET_SPEAKERS_ROUTE$1, i as GET_SPEAKERS_DEPRECATED_ROUTE$1, n as GENERATE_SPEECH_ROUTE$1, o as TRANSCRIBE_SPEECH_DEPRECATED_ROUTE$1, r as GET_LISTENER_ROUTE$1, s as TRANSCRIBE_SPEECH_ROUTE$1, t as GENERATE_SPEECH_DEPRECATED_ROUTE$1 } from "../../routes-zHhMx-9S.js";
3
3
  //#region src/server/handlers/voice.ts
4
4
  var voice_exports = /* @__PURE__ */ __exportAll({
@@ -1,13 +1,13 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_rolldown_runtime = require("../../rolldown-runtime-CVvi-lCc.cjs");
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_common = require("../../common-DQn8jX5T.cjs");
5
5
  const require_workflows = require("../../workflows--79xhOOb.cjs");
6
6
  const require_agents = require("../../agents-CLv_RFQx.cjs");
7
- const require_route_builder = require("../../route-builder-BAAedfru.cjs");
8
- const require_utils = require("../../utils-BkPZAGxS.cjs");
7
+ const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
8
+ const require_utils = require("../../utils-CmYnjLcY.cjs");
9
9
  const require_server_handlers_error = require("./error.cjs");
10
- const require_utils$1 = require("../../utils-CXbhpYYv.cjs");
10
+ const require_utils$1 = require("../../utils-DJMUhfvY.cjs");
11
11
  let zod_v4 = require("zod/v4");
12
12
  let _mastra_core_stream = require("@mastra/core/stream");
13
13
  //#region src/server/handlers/workflows.ts
@@ -1,12 +1,12 @@
1
- import { n as __exportAll } from "../../rolldown-runtime-DuvcJU0W.js";
1
+ import { r as __exportAll } from "../../rolldown-runtime-maW3aOIk.js";
2
2
  import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
3
3
  import { l as runIdSchema, o as optionalRunIdSchema } from "../../common-5ZZuR6wj.js";
4
4
  import { _ as workflowRunCountsResponseSchema, a as observeWorkflowQuerySchema, b as workflowRunResultSchema, d as streamWorkflowBodySchema, f as timeTravelBodySchema, g as workflowInfoSchema, h as workflowIdPathParams, i as listWorkflowsResponseSchema, l as startAsyncWorkflowBodySchema, m as workflowExecutionResultSchema, n as createWorkflowRunResponseSchema, o as restartBodySchema, p as workflowControlResponseSchema, r as listWorkflowRunsQuerySchema, s as resumeBodySchema, t as createWorkflowRunBodySchema, v as workflowRunPathParams, x as workflowRunsResponseSchema, y as workflowRunResultQuerySchema } from "../../workflows-B2ooCiwN.js";
5
5
  import { K as streamResponseSchema } from "../../agents-BetrUB_N.js";
6
6
  import { n as createRoute } from "../../route-builder-YQ_gLIvW.js";
7
- import { a as getWorkflowInfo, t as WorkflowRegistry } from "../../utils-CljhO7OY.js";
7
+ import { a as getWorkflowInfo, t as WorkflowRegistry } from "../../utils-B2vd77Fi.js";
8
8
  import { handleError } from "./error.js";
9
- import { d as MastraFGAPermissions, l as validateRunOwnership, n as getEffectiveResourceId } from "../../utils-qMLbyf2U.js";
9
+ import { d as MastraFGAPermissions, l as validateRunOwnership, n as getEffectiveResourceId } from "../../utils-Hz8Hc2cd.js";
10
10
  import { z } from "zod/v4";
11
11
  import { createReplayStream } from "@mastra/core/stream";
12
12
  //#region src/server/handlers/workflows.ts
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_rolldown_runtime = require("../../rolldown-runtime-CVvi-lCc.cjs");
2
+ const require_rolldown_runtime = require("../../rolldown-runtime-Bd6kNlEP.cjs");
3
3
  const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
4
- const require_route_builder = require("../../route-builder-BAAedfru.cjs");
4
+ const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
5
5
  const require_server_handlers_error = require("./error.cjs");
6
6
  const require_workspace = require("../../workspace-Cz9hE2ei.cjs");
7
7
  let _mastra_core_features = require("@mastra/core/features");