@mastra/deployer-vercel 1.2.38 → 1.2.39-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/index.cjs +3 -6
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +2 -4
  4. package/dist/index.js.map +1 -1
  5. package/dist/studio/assets/CodeDiff.es-yDX8ENTX.js +305 -0
  6. package/dist/studio/assets/{ada-C5qYipkI.js → ada-X3Y2mlq2.js} +1 -1
  7. package/dist/studio/assets/{ahk-CA9gdOdF.js → ahk-DwADkxyd.js} +1 -1
  8. package/dist/studio/assets/{angular-html-DolB2A6S.js → angular-html-BswFT_28.js} +1 -1
  9. package/dist/studio/assets/angular-html-DOLkzBtu.js +1 -0
  10. package/dist/studio/assets/{angular-ts-B1PKGDnJ.js → angular-ts-DOMhGxLQ.js} +1 -1
  11. package/dist/studio/assets/{apl-BmC_IO_Q.js → apl-Dio8Ke0X.js} +1 -1
  12. package/dist/studio/assets/{astro-SDMRz_OH.js → astro-CN6YWUG3.js} +1 -1
  13. package/dist/studio/assets/babel-B_E7dii_.js +16 -0
  14. package/dist/studio/assets/beancount-C2IN4Vk8.js +1 -0
  15. package/dist/studio/assets/{blade-B6w4c-X9.js → blade-BrDpNfUX.js} +1 -1
  16. package/dist/studio/assets/{cobol-CtA7PaQL.js → cobol-BvqUwMCV.js} +1 -1
  17. package/dist/studio/assets/coq-CGaSfhwR.js +1 -0
  18. package/dist/studio/assets/{crystal-BezZpOOT.js → crystal-DEF7AEJQ.js} +1 -1
  19. package/dist/studio/assets/csharp-B3DbjJyj.js +1 -0
  20. package/dist/studio/assets/csharp-CFKDkFDZ.js +1 -0
  21. package/dist/studio/assets/css-BGIxQoYs.js +1 -0
  22. package/dist/studio/assets/css-DgaLhXQH.js +1 -0
  23. package/dist/studio/assets/dart-DjhkpiWP.js +1 -0
  24. package/dist/studio/assets/dart-_dH3dQdM.js +1 -0
  25. package/dist/studio/assets/{dist-D73uoo3G.js → dist-BVq4x0k2.js} +1 -1
  26. package/dist/studio/assets/dist-BZ0nnT2j.js +1 -0
  27. package/dist/studio/assets/dist-BcV0fxOe.js +23 -0
  28. package/dist/studio/assets/dist-CmRzlq9h.js +1 -0
  29. package/dist/studio/assets/dist-Dcq2nGKl.js +6 -0
  30. package/dist/studio/assets/dist-DjFwFQ6-.js +1 -0
  31. package/dist/studio/assets/dist-DkOJ_COt.js +1 -0
  32. package/dist/studio/assets/dist-rcSvr8nT.js +13 -0
  33. package/dist/studio/assets/dist-t_wjP-TL.js +1 -0
  34. package/dist/studio/assets/dotenv-CuH5my32.js +1 -0
  35. package/dist/studio/assets/{edge-D7PqnmbS.js → edge-B_SBzXGF.js} +1 -1
  36. package/dist/studio/assets/{elixir-DeblBytM.js → elixir-BL8v4QDr.js} +1 -1
  37. package/dist/studio/assets/elixir-BN3BkYei.js +1 -0
  38. package/dist/studio/assets/emacs-lisp-DR2vtWaj.js +1 -0
  39. package/dist/studio/assets/{erb-BfjjH6As.js → erb-BjlLGk-_.js} +1 -1
  40. package/dist/studio/assets/{estree-vwDM3qKy.js → estree-CvDFpEmC.js} +1 -1
  41. package/dist/studio/assets/{glimmer-js-DHbJ63Uk.js → glimmer-js-CIdbWayl.js} +1 -1
  42. package/dist/studio/assets/{glimmer-ts-78YraEOQ.js → glimmer-ts-B16xCo2k.js} +1 -1
  43. package/dist/studio/assets/gn-CAXYAgV-.js +1 -0
  44. package/dist/studio/assets/{hack-i70bJskv.js → hack-C30D-q0p.js} +1 -1
  45. package/dist/studio/assets/haml-BU6KMePS.js +1 -0
  46. package/dist/studio/assets/{haml-CAMQ1nWo.js → haml-C1zHJAQt.js} +1 -1
  47. package/dist/studio/assets/handlebars-WZCg7K7Q.js +1 -0
  48. package/dist/studio/assets/handlebars-g-3gLrXt.js +1 -0
  49. package/dist/studio/assets/html-BCy9P6D2.js +1 -0
  50. package/dist/studio/assets/{html-B2cKP6UN.js → html-DSw1lh5G.js} +1 -1
  51. package/dist/studio/assets/{html-derivative-Dhubv07u.js → html-derivative-DyzJkWO6.js} +1 -1
  52. package/dist/studio/assets/html-derivative-ekTk9Unt.js +1 -0
  53. package/dist/studio/assets/{index-DgdkTeTy.js → index-CStRllzQ.js} +2 -2
  54. package/dist/studio/assets/{jinja-CRuWSMeX.js → jinja-dRcm23Ea.js} +1 -1
  55. package/dist/studio/assets/julia-C8a5hZkp.js +1 -0
  56. package/dist/studio/assets/{julia-3RSkklau.js → julia-hqywDEUR.js} +1 -1
  57. package/dist/studio/assets/{just-G7MH58_L.js → just-CP_wDfXI.js} +1 -1
  58. package/dist/studio/assets/latex-B_Ztlc7G.js +1 -0
  59. package/dist/studio/assets/latex-Bn9nYtub.js +1 -0
  60. package/dist/studio/assets/lib-DRuii7jc.js +1 -0
  61. package/dist/studio/assets/{liquid-DdvxCDBI.js → liquid-CQNtsgCr.js} +1 -1
  62. package/dist/studio/assets/livekit-client.esm-DMHgtGvw.js +39 -0
  63. package/dist/studio/assets/luau-VGWVLoqX.js +1 -0
  64. package/dist/studio/assets/main-DW5us475.js +699 -0
  65. package/dist/studio/assets/marko-DPS0EkZ1.js +1 -0
  66. package/dist/studio/assets/{mdc-Cm3Vtzgo.js → mdc-C6srEd4p.js} +1 -1
  67. package/dist/studio/assets/monokai-BscAjiQZ.js +1 -0
  68. package/dist/studio/assets/moonbit-D9W784E_.js +1 -0
  69. package/dist/studio/assets/{nextflow-groovy-C6U6GzKG.js → nextflow-groovy-C770ykRh.js} +1 -1
  70. package/dist/studio/assets/nextflow-groovy-D5vAge1Z.js +1 -0
  71. package/dist/studio/assets/nextflow-uA5IJerx.js +1 -0
  72. package/dist/studio/assets/nim-DN3EGtL-.js +1 -0
  73. package/dist/studio/assets/{nim-CkcqHVhZ.js → nim-ZjzS1dcU.js} +1 -1
  74. package/dist/studio/assets/nushell--0fT3PI1.js +1 -0
  75. package/dist/studio/assets/one-dark-pro-C6YyR8OD.js +1 -0
  76. package/dist/studio/assets/{org-BIKsc680.js → org-BRAbLUOJ.js} +1 -1
  77. package/dist/studio/assets/p-map-D81h6UuU.js +1 -0
  78. package/dist/studio/assets/perl-Ciba4h2-.js +1 -0
  79. package/dist/studio/assets/{perl-CrgxsDZk.js → perl-sgZsTtaf.js} +1 -1
  80. package/dist/studio/assets/php-D9QpVhjP.js +1 -0
  81. package/dist/studio/assets/php-DBfnyu6d.js +1 -0
  82. package/dist/studio/assets/powershell-Blb2ISmZ.js +1 -0
  83. package/dist/studio/assets/{powershell-CB0_OCr_.js → powershell-CItYMEtV.js} +1 -1
  84. package/dist/studio/assets/pug-C_nSP9Mg.js +1 -0
  85. package/dist/studio/assets/{pug-ikVFMdBJ.js → pug-nGRwXpob.js} +1 -1
  86. package/dist/studio/assets/{razor-Ble7Vzo2.js → razor-UAq-8THt.js} +1 -1
  87. package/dist/studio/assets/red-CYlAq2b0.js +1 -0
  88. package/dist/studio/assets/{rst-CkovH8lR.js → rst-BCaXiUC4.js} +1 -1
  89. package/dist/studio/assets/ruby-C4ARPOX3.js +1 -0
  90. package/dist/studio/assets/{ruby-Dg1QxBW5.js → ruby-Dl3oLoVp.js} +1 -1
  91. package/dist/studio/assets/rust-Ch0zZBV0.js +1 -0
  92. package/dist/studio/assets/rust-DBZE5Si3.js +1 -0
  93. package/dist/studio/assets/{sas-2IEyvoFV.js → sas-BowjnAvi.js} +1 -1
  94. package/dist/studio/assets/{scss-CPpsOPrU.js → scss-CWs8DVSa.js} +1 -1
  95. package/dist/studio/assets/scss-D3wBkj3d.js +1 -0
  96. package/dist/studio/assets/solarized-dark-b97czJOk.js +1 -0
  97. package/dist/studio/assets/solarized-light-DFPxpIYQ.js +1 -0
  98. package/dist/studio/assets/{soy-A62BAwxz.js → soy-CUUUw2U6.js} +1 -1
  99. package/dist/studio/assets/sql-CNu3Or2W.js +1 -0
  100. package/dist/studio/assets/sql-CfM2IJm3.js +1 -0
  101. package/dist/studio/assets/{stata-BGsmlsHF.js → stata-Dj4sbAEx.js} +1 -1
  102. package/dist/studio/assets/style-IQMl5TX8.css +3 -0
  103. package/dist/studio/assets/{svelte-DcpG3o7o.js → svelte-BaCIHHWd.js} +1 -1
  104. package/dist/studio/assets/{templ-CvnTbAXa.js → templ-BfgLc4ra.js} +1 -1
  105. package/dist/studio/assets/{ts-tags--pZs7vYD.js → ts-tags-DLz2GTd3.js} +1 -1
  106. package/dist/studio/assets/twig-HaHkB3PH.js +1 -0
  107. package/dist/studio/assets/twig-lMQ09cjh.js +1 -0
  108. package/dist/studio/assets/typespec-BGhR2SqG.js +1 -0
  109. package/dist/studio/assets/{typst-Czf1dSai.js → typst-DDNSzYFN.js} +1 -1
  110. package/dist/studio/assets/{vue-CAw-zJtI.js → vue-qH43U_rv.js} +1 -1
  111. package/dist/studio/assets/{vue-vine-DPTR_ZYD.js → vue-vine-6XI2pIvQ.js} +1 -1
  112. package/dist/studio/assets/yaml-BEzOWJ7L.js +1 -0
  113. package/dist/studio/index.html +2 -2
  114. package/dist/studio/routes-manifest.json +3 -0
  115. package/package.json +11 -11
  116. package/dist/studio/assets/CodeDiff.es-CLiWZRni.js +0 -305
  117. package/dist/studio/assets/angular-html-06u8ifAB.js +0 -1
  118. package/dist/studio/assets/babel-qZlmxQ8K.js +0 -16
  119. package/dist/studio/assets/beancount-D-usSTwE.js +0 -1
  120. package/dist/studio/assets/cn-CQUhN5Jx-DGfaIrHO.js +0 -1
  121. package/dist/studio/assets/coq-DuBRPxYg.js +0 -1
  122. package/dist/studio/assets/csharp-BviNWcUb.js +0 -1
  123. package/dist/studio/assets/csharp-DoUovMB6.js +0 -1
  124. package/dist/studio/assets/css-BN7bbgzh.js +0 -1
  125. package/dist/studio/assets/css-LbU1hoFO.js +0 -1
  126. package/dist/studio/assets/dart-BcpK88xC.js +0 -1
  127. package/dist/studio/assets/dart-zFqxHoQA.js +0 -1
  128. package/dist/studio/assets/dist-BeXC2sV7.js +0 -1
  129. package/dist/studio/assets/dist-BgTAL0Im.js +0 -1
  130. package/dist/studio/assets/dist-C4qaiM5N.js +0 -1
  131. package/dist/studio/assets/dist-CTvjM30z.js +0 -1
  132. package/dist/studio/assets/dist-CXMb7aeG.js +0 -13
  133. package/dist/studio/assets/dist-CgVs1BGt.js +0 -1
  134. package/dist/studio/assets/dist-DIJvMGBR.js +0 -23
  135. package/dist/studio/assets/dist-DOBwC-Vj.js +0 -6
  136. package/dist/studio/assets/dotenv-_5a1GRtc.js +0 -1
  137. package/dist/studio/assets/elixir-BjfTbpsD.js +0 -1
  138. package/dist/studio/assets/emacs-lisp-c_oH4hRZ.js +0 -1
  139. package/dist/studio/assets/gn-ilITqXS6.js +0 -1
  140. package/dist/studio/assets/haml-3Fo4mycZ.js +0 -1
  141. package/dist/studio/assets/handlebars-B5qiZlCO.js +0 -1
  142. package/dist/studio/assets/handlebars-CXhBu6gL.js +0 -1
  143. package/dist/studio/assets/html-Bls34fXK.js +0 -1
  144. package/dist/studio/assets/html-derivative-CPgLVSxm.js +0 -1
  145. package/dist/studio/assets/julia-DKmDyKMZ.js +0 -1
  146. package/dist/studio/assets/latex-CLPpIAp7.js +0 -1
  147. package/dist/studio/assets/latex-YWqeWI-c.js +0 -1
  148. package/dist/studio/assets/livekit-client.esm-D6tj57cg.js +0 -39
  149. package/dist/studio/assets/luau-C2pBCSgt.js +0 -1
  150. package/dist/studio/assets/main-CPed5rup.js +0 -695
  151. package/dist/studio/assets/marko-DJ3i0CIR.js +0 -1
  152. package/dist/studio/assets/monokai-B_bV9PQ9.js +0 -1
  153. package/dist/studio/assets/moonbit-DgjMoLWr.js +0 -1
  154. package/dist/studio/assets/nextflow-groovy-DQJ40bag.js +0 -1
  155. package/dist/studio/assets/nextflow-rSIivlom.js +0 -1
  156. package/dist/studio/assets/nim-BLCC9zUt.js +0 -1
  157. package/dist/studio/assets/nushell-DHYfO66s.js +0 -1
  158. package/dist/studio/assets/one-dark-pro-CLwyXe_n.js +0 -1
  159. package/dist/studio/assets/p-map-C_4OPQuz.js +0 -1
  160. package/dist/studio/assets/perl-DldNfCGA.js +0 -1
  161. package/dist/studio/assets/php-B1kreupY.js +0 -1
  162. package/dist/studio/assets/php-kBxV6T2i.js +0 -1
  163. package/dist/studio/assets/powershell-BAeOcVkI.js +0 -1
  164. package/dist/studio/assets/pug-B0eKJDyz.js +0 -1
  165. package/dist/studio/assets/red-DX1BQOs8.js +0 -1
  166. package/dist/studio/assets/ruby-DfKa-Cpp.js +0 -1
  167. package/dist/studio/assets/rust-08ePcFzV.js +0 -1
  168. package/dist/studio/assets/rust-CSjmjZYD.js +0 -1
  169. package/dist/studio/assets/scss-CTp9_vex.js +0 -1
  170. package/dist/studio/assets/solarized-dark-UdsmMDCL.js +0 -1
  171. package/dist/studio/assets/solarized-light-C1IUL_tW.js +0 -1
  172. package/dist/studio/assets/sql-CP0rg-5b.js +0 -1
  173. package/dist/studio/assets/sql-DOnR2rig.js +0 -1
  174. package/dist/studio/assets/style-pt4pqfuW.css +0 -3
  175. package/dist/studio/assets/twig-BL9b48tu.js +0 -1
  176. package/dist/studio/assets/twig-CiXWCF20.js +0 -1
  177. package/dist/studio/assets/typespec-BRdr0IET.js +0 -1
  178. package/dist/studio/assets/yaml-DjjjKWKb.js +0 -1
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region \0rolldown/runtime.js
2
+ // \0rolldown/runtime.js
3
3
  var __create = Object.create;
4
4
  var __defProp = Object.defineProperty;
5
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -20,7 +20,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
20
20
  value: mod,
21
21
  enumerable: true
22
22
  }) : target, mod));
23
- //#endregion
24
23
  let fs = require("fs");
25
24
  let path = require("path");
26
25
  let process = require("process");
@@ -29,7 +28,7 @@ let url = require("url");
29
28
  let _mastra_deployer = require("@mastra/deployer");
30
29
  let _mastra_deployer_build = require("@mastra/deployer/build");
31
30
  let fs_extra_esm = require("fs-extra/esm");
32
- //#region src/routes.ts
31
+ // src/routes.ts
33
32
  const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
34
33
  function getVercelRoutes({ studio, studioRouteRoots = [] }) {
35
34
  if (!studio) return [{
@@ -53,8 +52,7 @@ function getVercelRoutes({ studio, studioRouteRoots = [] }) {
53
52
  }
54
53
  ];
55
54
  }
56
- //#endregion
57
- //#region src/index.ts
55
+ // src/index.ts
58
56
  var VercelDeployer = class extends _mastra_deployer.Deployer {
59
57
  vcConfigOverrides = {};
60
58
  studio;
@@ -193,7 +191,6 @@ export const HEAD = handle(app);
193
191
  }
194
192
  }
195
193
  };
196
- //#endregion
197
194
  exports.VercelDeployer = VercelDeployer;
198
195
 
199
196
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["Deployer","join","__filename","fileURLToPath","__dirname","dirname","copy","readFileSync","injectStudioHtmlConfig","escapeStudioHtmlValue","move"],"sources":["../src/routes.ts","../src/index.ts"],"sourcesContent":["type VercelRoutesOptions = {\n studio: boolean;\n /** Studio's top-level route segments, read from the Studio build's routes-manifest.json. */\n studioRouteRoots?: string[];\n};\n\nconst escapeRegExp = (value: string) => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nexport function getVercelRoutes({ studio, studioRouteRoots = [] }: VercelRoutesOptions) {\n if (!studio) {\n return [{ src: '/(.*)', dest: '/' }];\n }\n\n // Studio owns a known set of SPA paths; everything else belongs to the server function.\n // The function has to be the catch-all because custom `registerApiRoute()` paths are mounted\n // at the root of the server (never under `apiPrefix`), so the CDN cannot tell them apart from\n // an unknown path — an SPA catch-all would swallow every one of them.\n const spaRoots = studioRouteRoots.map(escapeRegExp).join('|');\n\n return [\n { src: '^/$', dest: '/index.html' },\n ...(spaRoots ? [{ src: `^/(?:${spaRoots})(?:/.*)?$`, dest: '/index.html' }] : []),\n { handle: 'filesystem' as const },\n { src: '/(.*)', dest: '/' },\n ];\n}\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport process from 'node:process';\nimport { fileURLToPath } from 'node:url';\nimport type { Config } from '@mastra/core/mastra';\nimport { Deployer } from '@mastra/deployer';\nimport { escapeStudioHtmlValue, injectStudioHtmlConfig } from '@mastra/deployer/build';\nimport { copy, move } from 'fs-extra/esm';\nimport { getVercelRoutes } from './routes';\nimport type { VcConfig, VcConfigOverrides, VercelDeployerOptions } from './types';\n\nexport class VercelDeployer extends Deployer {\n private vcConfigOverrides: VcConfigOverrides = {};\n private studio: boolean;\n\n constructor(options: VercelDeployerOptions = {}) {\n super({ name: 'VERCEL' });\n this.outputDir = join('.vercel', 'output', 'functions', 'index.func');\n this.studio = options.studio ?? false;\n\n const { studio, ...overrides } = options;\n this.vcConfigOverrides = { ...overrides };\n }\n\n protected async getUserBundlerOptions(\n mastraEntryFile: string,\n outputDirectory: string,\n ): Promise<NonNullable<Config['bundler']>> {\n const bundlerOptions = await super.getUserBundlerOptions(mastraEntryFile, outputDirectory);\n\n // Always force externals: true for Vercel deployments.\n // Vercel serverless functions resolve dependencies from node_modules,\n // so bundling them inline serves no purpose. Bundling inline can also cause\n // circular module evaluation deadlocks when dynamic imports produce chunks\n // that depend back on the entry module via static imports, resulting in\n // \"Detected unsettled top-level await\" errors (Node.js exit code 13).\n // See: https://github.com/mastra-ai/mastra/issues/14860\n return {\n ...bundlerOptions,\n externals: true,\n };\n }\n\n async prepare(outputDirectory: string): Promise<void> {\n await super.prepare(outputDirectory);\n\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n const studioSource = join(dirname(__dirname), 'dist', 'studio');\n\n this.writeVercelJSON(\n join(outputDirectory, this.outputDir, '..', '..'),\n this.studio ? this.readStudioRouteRoots(studioSource) : [],\n );\n\n if (this.studio) {\n const staticDir = join(outputDirectory, '.vercel', 'output', 'static');\n\n try {\n await copy(studioSource, staticDir, { overwrite: true });\n } catch (err) {\n throw new Error(\n `Failed to copy studio assets from \"${studioSource}\" to \"${staticDir}\": ${err instanceof Error ? err.message : err}`,\n );\n }\n\n this.injectStudioConfig(staticDir);\n }\n }\n\n /**\n * Studio's top-level route segments, emitted by the Studio build alongside index.html.\n * The Vercel route table needs them explicitly: custom `registerApiRoute()` paths are mounted\n * at the root of the server, so the function has to own every path Studio doesn't claim.\n */\n private readStudioRouteRoots(studioSource: string): string[] {\n const manifestPath = join(studioSource, 'routes-manifest.json');\n\n try {\n const roots = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n if (!Array.isArray(roots) || roots.some(root => typeof root !== 'string')) {\n throw new Error('expected an array of route segments');\n }\n return roots;\n } catch (err) {\n throw new Error(\n `Failed to read studio routes manifest at \"${manifestPath}\": ${err instanceof Error ? err.message : err}`,\n );\n }\n }\n\n private getEntry(): string {\n return `\nimport { handle } from 'hono/vercel'\nimport { mastra } from '#mastra';\nimport { createHonoServer, getToolExports } from '#server';\nimport { tools } from '#tools';\nimport { scoreTracesWorkflow } from '@mastra/core/evals/scoreTraces';\n\nif (mastra.getStorage()) {\n mastra.__registerInternalWorkflow(scoreTracesWorkflow);\n}\n\nconst app = await createHonoServer(mastra, { tools: getToolExports(tools) });\n\nexport const GET = handle(app);\nexport const POST = handle(app);\nexport const PUT = handle(app);\nexport const DELETE = handle(app);\nexport const PATCH = handle(app);\nexport const OPTIONS = handle(app);\nexport const HEAD = handle(app);\n`;\n }\n\n private injectStudioConfig(staticDir: string) {\n const indexPath = join(staticDir, 'index.html');\n let html = readFileSync(indexPath, 'utf-8');\n\n /**\n * Use window.location expressions so the SPA constructs the correct same-origin endpoint.\n * Port uses a ternary: window.location.port is '' for default ports (80/443), and the SPA falls back to 4111 for empty strings, so we return the default port explicitly instead.\n */\n html = injectStudioHtmlConfig(html, {\n host: `window.location.hostname`,\n port: `(window.location.port || (window.location.protocol === 'https:' ? '443' : '80'))`,\n protocol: `window.location.protocol.replace(':', '')`,\n apiPrefix: `'/api'`,\n basePath: '',\n hideCloudCta: `'true'`,\n templates: `'false'`,\n cloudApiEndpoint: `''`,\n experimentalFeatures: `'false'`,\n telemetryDisabled: `''`,\n requestContextPresets: `''`,\n experimentalUI: `'false'`,\n agentSignals: process.env.MASTRA_AGENT_SIGNALS === 'false' ? `'false'` : `'true'`,\n signalsUI: process.env.MASTRA_SIGNALS_UI === 'true' ? `'true'` : `'false'`,\n organizationId: `'${escapeStudioHtmlValue(process.env.MASTRA_ORGANIZATION_ID || '')}'`,\n platformProjectId: `'${escapeStudioHtmlValue(process.env.MASTRA_PLATFORM_PROJECT_ID || '')}'`,\n platformObservabilityEndpoint: `'${escapeStudioHtmlValue(process.env.MASTRA_PLATFORM_OBSERVABILITY_ENDPOINT || '')}'`,\n });\n\n writeFileSync(indexPath, html);\n }\n\n private writeVercelJSON(outputDirectory: string, studioRouteRoots: string[]) {\n writeFileSync(\n join(outputDirectory, 'config.json'),\n JSON.stringify({ version: 3, routes: getVercelRoutes({ studio: this.studio, studioRouteRoots }) }),\n );\n }\n\n async bundle(\n entryFile: string,\n outputDirectory: string,\n { toolsPaths, projectRoot }: { toolsPaths: (string | string[])[]; projectRoot: string },\n ): Promise<void> {\n const result = await this._bundle(\n this.getEntry(),\n entryFile,\n { outputDirectory, projectRoot },\n toolsPaths,\n join(outputDirectory, this.outputDir),\n );\n\n const nodeVersion = process.version?.split('.')?.[0]?.replace('v', '') ?? '22';\n\n const vcConfig: VcConfig = {\n handler: 'index.mjs',\n launcherType: 'Nodejs',\n runtime: `nodejs${nodeVersion}.x`,\n shouldAddHelpers: true,\n };\n\n // Merge supported overrides\n const { maxDuration, memory, regions } = this.vcConfigOverrides;\n if (typeof maxDuration === 'number') vcConfig.maxDuration = maxDuration;\n if (typeof memory === 'number') vcConfig.memory = memory;\n if (Array.isArray(regions) && regions.length > 0) vcConfig.regions = regions;\n\n writeFileSync(join(outputDirectory, this.outputDir, '.vc-config.json'), JSON.stringify(vcConfig, null, 2));\n\n await move(join(outputDirectory, '.vercel', 'output'), join(process.cwd(), '.vercel', 'output'), {\n overwrite: true,\n });\n\n return result;\n }\n\n async deploy(): Promise<void> {\n this.logger?.info('Deploying to Vercel is deprecated. Please use the Vercel dashboard to deploy.');\n }\n\n async lint(entryFile: string, outputDirectory: string, toolsPaths: (string | string[])[]): Promise<void> {\n await super.lint(entryFile, outputDirectory, toolsPaths);\n\n const hasLibsql = (await this.deps.checkDependencies(['@mastra/libsql'])) === `ok`;\n\n if (hasLibsql) {\n this.logger.error(\n `Vercel Deployer does not support @libsql/client(which may have been installed by @mastra/libsql) as a dependency. \n\t\t\t\tUse other Mastra Storage options instead e.g @mastra/pg`,\n );\n process.exit(1);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["Deployer","join","__filename","fileURLToPath","__dirname","dirname","copy","readFileSync","injectStudioHtmlConfig","escapeStudioHtmlValue","move"],"sources":["../src/routes.ts","../src/index.ts"],"sourcesContent":["type VercelRoutesOptions = {\n studio: boolean;\n /** Studio's top-level route segments, read from the Studio build's routes-manifest.json. */\n studioRouteRoots?: string[];\n};\n\nconst escapeRegExp = (value: string) => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nexport function getVercelRoutes({ studio, studioRouteRoots = [] }: VercelRoutesOptions) {\n if (!studio) {\n return [{ src: '/(.*)', dest: '/' }];\n }\n\n // Studio owns a known set of SPA paths; everything else belongs to the server function.\n // The function has to be the catch-all because custom `registerApiRoute()` paths are mounted\n // at the root of the server (never under `apiPrefix`), so the CDN cannot tell them apart from\n // an unknown path — an SPA catch-all would swallow every one of them.\n const spaRoots = studioRouteRoots.map(escapeRegExp).join('|');\n\n return [\n { src: '^/$', dest: '/index.html' },\n ...(spaRoots ? [{ src: `^/(?:${spaRoots})(?:/.*)?$`, dest: '/index.html' }] : []),\n { handle: 'filesystem' as const },\n { src: '/(.*)', dest: '/' },\n ];\n}\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport process from 'node:process';\nimport { fileURLToPath } from 'node:url';\nimport type { Config } from '@mastra/core/mastra';\nimport { Deployer } from '@mastra/deployer';\nimport { escapeStudioHtmlValue, injectStudioHtmlConfig } from '@mastra/deployer/build';\nimport { copy, move } from 'fs-extra/esm';\nimport { getVercelRoutes } from './routes';\nimport type { VcConfig, VcConfigOverrides, VercelDeployerOptions } from './types';\n\nexport class VercelDeployer extends Deployer {\n private vcConfigOverrides: VcConfigOverrides = {};\n private studio: boolean;\n\n constructor(options: VercelDeployerOptions = {}) {\n super({ name: 'VERCEL' });\n this.outputDir = join('.vercel', 'output', 'functions', 'index.func');\n this.studio = options.studio ?? false;\n\n const { studio, ...overrides } = options;\n this.vcConfigOverrides = { ...overrides };\n }\n\n protected async getUserBundlerOptions(\n mastraEntryFile: string,\n outputDirectory: string,\n ): Promise<NonNullable<Config['bundler']>> {\n const bundlerOptions = await super.getUserBundlerOptions(mastraEntryFile, outputDirectory);\n\n // Always force externals: true for Vercel deployments.\n // Vercel serverless functions resolve dependencies from node_modules,\n // so bundling them inline serves no purpose. Bundling inline can also cause\n // circular module evaluation deadlocks when dynamic imports produce chunks\n // that depend back on the entry module via static imports, resulting in\n // \"Detected unsettled top-level await\" errors (Node.js exit code 13).\n // See: https://github.com/mastra-ai/mastra/issues/14860\n return {\n ...bundlerOptions,\n externals: true,\n };\n }\n\n async prepare(outputDirectory: string): Promise<void> {\n await super.prepare(outputDirectory);\n\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n const studioSource = join(dirname(__dirname), 'dist', 'studio');\n\n this.writeVercelJSON(\n join(outputDirectory, this.outputDir, '..', '..'),\n this.studio ? this.readStudioRouteRoots(studioSource) : [],\n );\n\n if (this.studio) {\n const staticDir = join(outputDirectory, '.vercel', 'output', 'static');\n\n try {\n await copy(studioSource, staticDir, { overwrite: true });\n } catch (err) {\n throw new Error(\n `Failed to copy studio assets from \"${studioSource}\" to \"${staticDir}\": ${err instanceof Error ? err.message : err}`,\n );\n }\n\n this.injectStudioConfig(staticDir);\n }\n }\n\n /**\n * Studio's top-level route segments, emitted by the Studio build alongside index.html.\n * The Vercel route table needs them explicitly: custom `registerApiRoute()` paths are mounted\n * at the root of the server, so the function has to own every path Studio doesn't claim.\n */\n private readStudioRouteRoots(studioSource: string): string[] {\n const manifestPath = join(studioSource, 'routes-manifest.json');\n\n try {\n const roots = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n if (!Array.isArray(roots) || roots.some(root => typeof root !== 'string')) {\n throw new Error('expected an array of route segments');\n }\n return roots;\n } catch (err) {\n throw new Error(\n `Failed to read studio routes manifest at \"${manifestPath}\": ${err instanceof Error ? err.message : err}`,\n );\n }\n }\n\n private getEntry(): string {\n return `\nimport { handle } from 'hono/vercel'\nimport { mastra } from '#mastra';\nimport { createHonoServer, getToolExports } from '#server';\nimport { tools } from '#tools';\nimport { scoreTracesWorkflow } from '@mastra/core/evals/scoreTraces';\n\nif (mastra.getStorage()) {\n mastra.__registerInternalWorkflow(scoreTracesWorkflow);\n}\n\nconst app = await createHonoServer(mastra, { tools: getToolExports(tools) });\n\nexport const GET = handle(app);\nexport const POST = handle(app);\nexport const PUT = handle(app);\nexport const DELETE = handle(app);\nexport const PATCH = handle(app);\nexport const OPTIONS = handle(app);\nexport const HEAD = handle(app);\n`;\n }\n\n private injectStudioConfig(staticDir: string) {\n const indexPath = join(staticDir, 'index.html');\n let html = readFileSync(indexPath, 'utf-8');\n\n /**\n * Use window.location expressions so the SPA constructs the correct same-origin endpoint.\n * Port uses a ternary: window.location.port is '' for default ports (80/443), and the SPA falls back to 4111 for empty strings, so we return the default port explicitly instead.\n */\n html = injectStudioHtmlConfig(html, {\n host: `window.location.hostname`,\n port: `(window.location.port || (window.location.protocol === 'https:' ? '443' : '80'))`,\n protocol: `window.location.protocol.replace(':', '')`,\n apiPrefix: `'/api'`,\n basePath: '',\n hideCloudCta: `'true'`,\n templates: `'false'`,\n cloudApiEndpoint: `''`,\n experimentalFeatures: `'false'`,\n telemetryDisabled: `''`,\n requestContextPresets: `''`,\n experimentalUI: `'false'`,\n agentSignals: process.env.MASTRA_AGENT_SIGNALS === 'false' ? `'false'` : `'true'`,\n signalsUI: process.env.MASTRA_SIGNALS_UI === 'true' ? `'true'` : `'false'`,\n organizationId: `'${escapeStudioHtmlValue(process.env.MASTRA_ORGANIZATION_ID || '')}'`,\n platformProjectId: `'${escapeStudioHtmlValue(process.env.MASTRA_PLATFORM_PROJECT_ID || '')}'`,\n platformObservabilityEndpoint: `'${escapeStudioHtmlValue(process.env.MASTRA_PLATFORM_OBSERVABILITY_ENDPOINT || '')}'`,\n });\n\n writeFileSync(indexPath, html);\n }\n\n private writeVercelJSON(outputDirectory: string, studioRouteRoots: string[]) {\n writeFileSync(\n join(outputDirectory, 'config.json'),\n JSON.stringify({ version: 3, routes: getVercelRoutes({ studio: this.studio, studioRouteRoots }) }),\n );\n }\n\n async bundle(\n entryFile: string,\n outputDirectory: string,\n { toolsPaths, projectRoot }: { toolsPaths: (string | string[])[]; projectRoot: string },\n ): Promise<void> {\n const result = await this._bundle(\n this.getEntry(),\n entryFile,\n { outputDirectory, projectRoot },\n toolsPaths,\n join(outputDirectory, this.outputDir),\n );\n\n const nodeVersion = process.version?.split('.')?.[0]?.replace('v', '') ?? '22';\n\n const vcConfig: VcConfig = {\n handler: 'index.mjs',\n launcherType: 'Nodejs',\n runtime: `nodejs${nodeVersion}.x`,\n shouldAddHelpers: true,\n };\n\n // Merge supported overrides\n const { maxDuration, memory, regions } = this.vcConfigOverrides;\n if (typeof maxDuration === 'number') vcConfig.maxDuration = maxDuration;\n if (typeof memory === 'number') vcConfig.memory = memory;\n if (Array.isArray(regions) && regions.length > 0) vcConfig.regions = regions;\n\n writeFileSync(join(outputDirectory, this.outputDir, '.vc-config.json'), JSON.stringify(vcConfig, null, 2));\n\n await move(join(outputDirectory, '.vercel', 'output'), join(process.cwd(), '.vercel', 'output'), {\n overwrite: true,\n });\n\n return result;\n }\n\n async deploy(): Promise<void> {\n this.logger?.info('Deploying to Vercel is deprecated. Please use the Vercel dashboard to deploy.');\n }\n\n async lint(entryFile: string, outputDirectory: string, toolsPaths: (string | string[])[]): Promise<void> {\n await super.lint(entryFile, outputDirectory, toolsPaths);\n\n const hasLibsql = (await this.deps.checkDependencies(['@mastra/libsql'])) === `ok`;\n\n if (hasLibsql) {\n this.logger.error(\n `Vercel Deployer does not support @libsql/client(which may have been installed by @mastra/libsql) as a dependency. \n\t\t\t\tUse other Mastra Storage options instead e.g @mastra/pg`,\n );\n process.exit(1);\n }\n }\n}\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { fileURLToPath } from "url";
5
5
  import { Deployer } from "@mastra/deployer";
6
6
  import { escapeStudioHtmlValue, injectStudioHtmlConfig } from "@mastra/deployer/build";
7
7
  import { copy, move } from "fs-extra/esm";
8
- //#region src/routes.ts
8
+ // src/routes.ts
9
9
  const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
10
10
  function getVercelRoutes({ studio, studioRouteRoots = [] }) {
11
11
  if (!studio) return [{
@@ -29,8 +29,7 @@ function getVercelRoutes({ studio, studioRouteRoots = [] }) {
29
29
  }
30
30
  ];
31
31
  }
32
- //#endregion
33
- //#region src/index.ts
32
+ // src/index.ts
34
33
  var VercelDeployer = class extends Deployer {
35
34
  vcConfigOverrides = {};
36
35
  studio;
@@ -169,7 +168,6 @@ export const HEAD = handle(app);
169
168
  }
170
169
  }
171
170
  };
172
- //#endregion
173
171
  export { VercelDeployer };
174
172
 
175
173
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/routes.ts","../src/index.ts"],"sourcesContent":["type VercelRoutesOptions = {\n studio: boolean;\n /** Studio's top-level route segments, read from the Studio build's routes-manifest.json. */\n studioRouteRoots?: string[];\n};\n\nconst escapeRegExp = (value: string) => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nexport function getVercelRoutes({ studio, studioRouteRoots = [] }: VercelRoutesOptions) {\n if (!studio) {\n return [{ src: '/(.*)', dest: '/' }];\n }\n\n // Studio owns a known set of SPA paths; everything else belongs to the server function.\n // The function has to be the catch-all because custom `registerApiRoute()` paths are mounted\n // at the root of the server (never under `apiPrefix`), so the CDN cannot tell them apart from\n // an unknown path — an SPA catch-all would swallow every one of them.\n const spaRoots = studioRouteRoots.map(escapeRegExp).join('|');\n\n return [\n { src: '^/$', dest: '/index.html' },\n ...(spaRoots ? [{ src: `^/(?:${spaRoots})(?:/.*)?$`, dest: '/index.html' }] : []),\n { handle: 'filesystem' as const },\n { src: '/(.*)', dest: '/' },\n ];\n}\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport process from 'node:process';\nimport { fileURLToPath } from 'node:url';\nimport type { Config } from '@mastra/core/mastra';\nimport { Deployer } from '@mastra/deployer';\nimport { escapeStudioHtmlValue, injectStudioHtmlConfig } from '@mastra/deployer/build';\nimport { copy, move } from 'fs-extra/esm';\nimport { getVercelRoutes } from './routes';\nimport type { VcConfig, VcConfigOverrides, VercelDeployerOptions } from './types';\n\nexport class VercelDeployer extends Deployer {\n private vcConfigOverrides: VcConfigOverrides = {};\n private studio: boolean;\n\n constructor(options: VercelDeployerOptions = {}) {\n super({ name: 'VERCEL' });\n this.outputDir = join('.vercel', 'output', 'functions', 'index.func');\n this.studio = options.studio ?? false;\n\n const { studio, ...overrides } = options;\n this.vcConfigOverrides = { ...overrides };\n }\n\n protected async getUserBundlerOptions(\n mastraEntryFile: string,\n outputDirectory: string,\n ): Promise<NonNullable<Config['bundler']>> {\n const bundlerOptions = await super.getUserBundlerOptions(mastraEntryFile, outputDirectory);\n\n // Always force externals: true for Vercel deployments.\n // Vercel serverless functions resolve dependencies from node_modules,\n // so bundling them inline serves no purpose. Bundling inline can also cause\n // circular module evaluation deadlocks when dynamic imports produce chunks\n // that depend back on the entry module via static imports, resulting in\n // \"Detected unsettled top-level await\" errors (Node.js exit code 13).\n // See: https://github.com/mastra-ai/mastra/issues/14860\n return {\n ...bundlerOptions,\n externals: true,\n };\n }\n\n async prepare(outputDirectory: string): Promise<void> {\n await super.prepare(outputDirectory);\n\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n const studioSource = join(dirname(__dirname), 'dist', 'studio');\n\n this.writeVercelJSON(\n join(outputDirectory, this.outputDir, '..', '..'),\n this.studio ? this.readStudioRouteRoots(studioSource) : [],\n );\n\n if (this.studio) {\n const staticDir = join(outputDirectory, '.vercel', 'output', 'static');\n\n try {\n await copy(studioSource, staticDir, { overwrite: true });\n } catch (err) {\n throw new Error(\n `Failed to copy studio assets from \"${studioSource}\" to \"${staticDir}\": ${err instanceof Error ? err.message : err}`,\n );\n }\n\n this.injectStudioConfig(staticDir);\n }\n }\n\n /**\n * Studio's top-level route segments, emitted by the Studio build alongside index.html.\n * The Vercel route table needs them explicitly: custom `registerApiRoute()` paths are mounted\n * at the root of the server, so the function has to own every path Studio doesn't claim.\n */\n private readStudioRouteRoots(studioSource: string): string[] {\n const manifestPath = join(studioSource, 'routes-manifest.json');\n\n try {\n const roots = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n if (!Array.isArray(roots) || roots.some(root => typeof root !== 'string')) {\n throw new Error('expected an array of route segments');\n }\n return roots;\n } catch (err) {\n throw new Error(\n `Failed to read studio routes manifest at \"${manifestPath}\": ${err instanceof Error ? err.message : err}`,\n );\n }\n }\n\n private getEntry(): string {\n return `\nimport { handle } from 'hono/vercel'\nimport { mastra } from '#mastra';\nimport { createHonoServer, getToolExports } from '#server';\nimport { tools } from '#tools';\nimport { scoreTracesWorkflow } from '@mastra/core/evals/scoreTraces';\n\nif (mastra.getStorage()) {\n mastra.__registerInternalWorkflow(scoreTracesWorkflow);\n}\n\nconst app = await createHonoServer(mastra, { tools: getToolExports(tools) });\n\nexport const GET = handle(app);\nexport const POST = handle(app);\nexport const PUT = handle(app);\nexport const DELETE = handle(app);\nexport const PATCH = handle(app);\nexport const OPTIONS = handle(app);\nexport const HEAD = handle(app);\n`;\n }\n\n private injectStudioConfig(staticDir: string) {\n const indexPath = join(staticDir, 'index.html');\n let html = readFileSync(indexPath, 'utf-8');\n\n /**\n * Use window.location expressions so the SPA constructs the correct same-origin endpoint.\n * Port uses a ternary: window.location.port is '' for default ports (80/443), and the SPA falls back to 4111 for empty strings, so we return the default port explicitly instead.\n */\n html = injectStudioHtmlConfig(html, {\n host: `window.location.hostname`,\n port: `(window.location.port || (window.location.protocol === 'https:' ? '443' : '80'))`,\n protocol: `window.location.protocol.replace(':', '')`,\n apiPrefix: `'/api'`,\n basePath: '',\n hideCloudCta: `'true'`,\n templates: `'false'`,\n cloudApiEndpoint: `''`,\n experimentalFeatures: `'false'`,\n telemetryDisabled: `''`,\n requestContextPresets: `''`,\n experimentalUI: `'false'`,\n agentSignals: process.env.MASTRA_AGENT_SIGNALS === 'false' ? `'false'` : `'true'`,\n signalsUI: process.env.MASTRA_SIGNALS_UI === 'true' ? `'true'` : `'false'`,\n organizationId: `'${escapeStudioHtmlValue(process.env.MASTRA_ORGANIZATION_ID || '')}'`,\n platformProjectId: `'${escapeStudioHtmlValue(process.env.MASTRA_PLATFORM_PROJECT_ID || '')}'`,\n platformObservabilityEndpoint: `'${escapeStudioHtmlValue(process.env.MASTRA_PLATFORM_OBSERVABILITY_ENDPOINT || '')}'`,\n });\n\n writeFileSync(indexPath, html);\n }\n\n private writeVercelJSON(outputDirectory: string, studioRouteRoots: string[]) {\n writeFileSync(\n join(outputDirectory, 'config.json'),\n JSON.stringify({ version: 3, routes: getVercelRoutes({ studio: this.studio, studioRouteRoots }) }),\n );\n }\n\n async bundle(\n entryFile: string,\n outputDirectory: string,\n { toolsPaths, projectRoot }: { toolsPaths: (string | string[])[]; projectRoot: string },\n ): Promise<void> {\n const result = await this._bundle(\n this.getEntry(),\n entryFile,\n { outputDirectory, projectRoot },\n toolsPaths,\n join(outputDirectory, this.outputDir),\n );\n\n const nodeVersion = process.version?.split('.')?.[0]?.replace('v', '') ?? '22';\n\n const vcConfig: VcConfig = {\n handler: 'index.mjs',\n launcherType: 'Nodejs',\n runtime: `nodejs${nodeVersion}.x`,\n shouldAddHelpers: true,\n };\n\n // Merge supported overrides\n const { maxDuration, memory, regions } = this.vcConfigOverrides;\n if (typeof maxDuration === 'number') vcConfig.maxDuration = maxDuration;\n if (typeof memory === 'number') vcConfig.memory = memory;\n if (Array.isArray(regions) && regions.length > 0) vcConfig.regions = regions;\n\n writeFileSync(join(outputDirectory, this.outputDir, '.vc-config.json'), JSON.stringify(vcConfig, null, 2));\n\n await move(join(outputDirectory, '.vercel', 'output'), join(process.cwd(), '.vercel', 'output'), {\n overwrite: true,\n });\n\n return result;\n }\n\n async deploy(): Promise<void> {\n this.logger?.info('Deploying to Vercel is deprecated. Please use the Vercel dashboard to deploy.');\n }\n\n async lint(entryFile: string, outputDirectory: string, toolsPaths: (string | string[])[]): Promise<void> {\n await super.lint(entryFile, outputDirectory, toolsPaths);\n\n const hasLibsql = (await this.deps.checkDependencies(['@mastra/libsql'])) === `ok`;\n\n if (hasLibsql) {\n this.logger.error(\n `Vercel Deployer does not support @libsql/client(which may have been installed by @mastra/libsql) as a dependency. \n\t\t\t\tUse other Mastra Storage options instead e.g @mastra/pg`,\n );\n process.exit(1);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/routes.ts","../src/index.ts"],"sourcesContent":["type VercelRoutesOptions = {\n studio: boolean;\n /** Studio's top-level route segments, read from the Studio build's routes-manifest.json. */\n studioRouteRoots?: string[];\n};\n\nconst escapeRegExp = (value: string) => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nexport function getVercelRoutes({ studio, studioRouteRoots = [] }: VercelRoutesOptions) {\n if (!studio) {\n return [{ src: '/(.*)', dest: '/' }];\n }\n\n // Studio owns a known set of SPA paths; everything else belongs to the server function.\n // The function has to be the catch-all because custom `registerApiRoute()` paths are mounted\n // at the root of the server (never under `apiPrefix`), so the CDN cannot tell them apart from\n // an unknown path — an SPA catch-all would swallow every one of them.\n const spaRoots = studioRouteRoots.map(escapeRegExp).join('|');\n\n return [\n { src: '^/$', dest: '/index.html' },\n ...(spaRoots ? [{ src: `^/(?:${spaRoots})(?:/.*)?$`, dest: '/index.html' }] : []),\n { handle: 'filesystem' as const },\n { src: '/(.*)', dest: '/' },\n ];\n}\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport process from 'node:process';\nimport { fileURLToPath } from 'node:url';\nimport type { Config } from '@mastra/core/mastra';\nimport { Deployer } from '@mastra/deployer';\nimport { escapeStudioHtmlValue, injectStudioHtmlConfig } from '@mastra/deployer/build';\nimport { copy, move } from 'fs-extra/esm';\nimport { getVercelRoutes } from './routes';\nimport type { VcConfig, VcConfigOverrides, VercelDeployerOptions } from './types';\n\nexport class VercelDeployer extends Deployer {\n private vcConfigOverrides: VcConfigOverrides = {};\n private studio: boolean;\n\n constructor(options: VercelDeployerOptions = {}) {\n super({ name: 'VERCEL' });\n this.outputDir = join('.vercel', 'output', 'functions', 'index.func');\n this.studio = options.studio ?? false;\n\n const { studio, ...overrides } = options;\n this.vcConfigOverrides = { ...overrides };\n }\n\n protected async getUserBundlerOptions(\n mastraEntryFile: string,\n outputDirectory: string,\n ): Promise<NonNullable<Config['bundler']>> {\n const bundlerOptions = await super.getUserBundlerOptions(mastraEntryFile, outputDirectory);\n\n // Always force externals: true for Vercel deployments.\n // Vercel serverless functions resolve dependencies from node_modules,\n // so bundling them inline serves no purpose. Bundling inline can also cause\n // circular module evaluation deadlocks when dynamic imports produce chunks\n // that depend back on the entry module via static imports, resulting in\n // \"Detected unsettled top-level await\" errors (Node.js exit code 13).\n // See: https://github.com/mastra-ai/mastra/issues/14860\n return {\n ...bundlerOptions,\n externals: true,\n };\n }\n\n async prepare(outputDirectory: string): Promise<void> {\n await super.prepare(outputDirectory);\n\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n const studioSource = join(dirname(__dirname), 'dist', 'studio');\n\n this.writeVercelJSON(\n join(outputDirectory, this.outputDir, '..', '..'),\n this.studio ? this.readStudioRouteRoots(studioSource) : [],\n );\n\n if (this.studio) {\n const staticDir = join(outputDirectory, '.vercel', 'output', 'static');\n\n try {\n await copy(studioSource, staticDir, { overwrite: true });\n } catch (err) {\n throw new Error(\n `Failed to copy studio assets from \"${studioSource}\" to \"${staticDir}\": ${err instanceof Error ? err.message : err}`,\n );\n }\n\n this.injectStudioConfig(staticDir);\n }\n }\n\n /**\n * Studio's top-level route segments, emitted by the Studio build alongside index.html.\n * The Vercel route table needs them explicitly: custom `registerApiRoute()` paths are mounted\n * at the root of the server, so the function has to own every path Studio doesn't claim.\n */\n private readStudioRouteRoots(studioSource: string): string[] {\n const manifestPath = join(studioSource, 'routes-manifest.json');\n\n try {\n const roots = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n if (!Array.isArray(roots) || roots.some(root => typeof root !== 'string')) {\n throw new Error('expected an array of route segments');\n }\n return roots;\n } catch (err) {\n throw new Error(\n `Failed to read studio routes manifest at \"${manifestPath}\": ${err instanceof Error ? err.message : err}`,\n );\n }\n }\n\n private getEntry(): string {\n return `\nimport { handle } from 'hono/vercel'\nimport { mastra } from '#mastra';\nimport { createHonoServer, getToolExports } from '#server';\nimport { tools } from '#tools';\nimport { scoreTracesWorkflow } from '@mastra/core/evals/scoreTraces';\n\nif (mastra.getStorage()) {\n mastra.__registerInternalWorkflow(scoreTracesWorkflow);\n}\n\nconst app = await createHonoServer(mastra, { tools: getToolExports(tools) });\n\nexport const GET = handle(app);\nexport const POST = handle(app);\nexport const PUT = handle(app);\nexport const DELETE = handle(app);\nexport const PATCH = handle(app);\nexport const OPTIONS = handle(app);\nexport const HEAD = handle(app);\n`;\n }\n\n private injectStudioConfig(staticDir: string) {\n const indexPath = join(staticDir, 'index.html');\n let html = readFileSync(indexPath, 'utf-8');\n\n /**\n * Use window.location expressions so the SPA constructs the correct same-origin endpoint.\n * Port uses a ternary: window.location.port is '' for default ports (80/443), and the SPA falls back to 4111 for empty strings, so we return the default port explicitly instead.\n */\n html = injectStudioHtmlConfig(html, {\n host: `window.location.hostname`,\n port: `(window.location.port || (window.location.protocol === 'https:' ? '443' : '80'))`,\n protocol: `window.location.protocol.replace(':', '')`,\n apiPrefix: `'/api'`,\n basePath: '',\n hideCloudCta: `'true'`,\n templates: `'false'`,\n cloudApiEndpoint: `''`,\n experimentalFeatures: `'false'`,\n telemetryDisabled: `''`,\n requestContextPresets: `''`,\n experimentalUI: `'false'`,\n agentSignals: process.env.MASTRA_AGENT_SIGNALS === 'false' ? `'false'` : `'true'`,\n signalsUI: process.env.MASTRA_SIGNALS_UI === 'true' ? `'true'` : `'false'`,\n organizationId: `'${escapeStudioHtmlValue(process.env.MASTRA_ORGANIZATION_ID || '')}'`,\n platformProjectId: `'${escapeStudioHtmlValue(process.env.MASTRA_PLATFORM_PROJECT_ID || '')}'`,\n platformObservabilityEndpoint: `'${escapeStudioHtmlValue(process.env.MASTRA_PLATFORM_OBSERVABILITY_ENDPOINT || '')}'`,\n });\n\n writeFileSync(indexPath, html);\n }\n\n private writeVercelJSON(outputDirectory: string, studioRouteRoots: string[]) {\n writeFileSync(\n join(outputDirectory, 'config.json'),\n JSON.stringify({ version: 3, routes: getVercelRoutes({ studio: this.studio, studioRouteRoots }) }),\n );\n }\n\n async bundle(\n entryFile: string,\n outputDirectory: string,\n { toolsPaths, projectRoot }: { toolsPaths: (string | string[])[]; projectRoot: string },\n ): Promise<void> {\n const result = await this._bundle(\n this.getEntry(),\n entryFile,\n { outputDirectory, projectRoot },\n toolsPaths,\n join(outputDirectory, this.outputDir),\n );\n\n const nodeVersion = process.version?.split('.')?.[0]?.replace('v', '') ?? '22';\n\n const vcConfig: VcConfig = {\n handler: 'index.mjs',\n launcherType: 'Nodejs',\n runtime: `nodejs${nodeVersion}.x`,\n shouldAddHelpers: true,\n };\n\n // Merge supported overrides\n const { maxDuration, memory, regions } = this.vcConfigOverrides;\n if (typeof maxDuration === 'number') vcConfig.maxDuration = maxDuration;\n if (typeof memory === 'number') vcConfig.memory = memory;\n if (Array.isArray(regions) && regions.length > 0) vcConfig.regions = regions;\n\n writeFileSync(join(outputDirectory, this.outputDir, '.vc-config.json'), JSON.stringify(vcConfig, null, 2));\n\n await move(join(outputDirectory, '.vercel', 'output'), join(process.cwd(), '.vercel', 'output'), {\n overwrite: true,\n });\n\n return result;\n }\n\n async deploy(): Promise<void> {\n this.logger?.info('Deploying to Vercel is deprecated. Please use the Vercel dashboard to deploy.');\n }\n\n async lint(entryFile: string, outputDirectory: string, toolsPaths: (string | string[])[]): Promise<void> {\n await super.lint(entryFile, outputDirectory, toolsPaths);\n\n const hasLibsql = (await this.deps.checkDependencies(['@mastra/libsql'])) === `ok`;\n\n if (hasLibsql) {\n this.logger.error(\n `Vercel Deployer does not support @libsql/client(which may have been installed by @mastra/libsql) as a dependency. \n\t\t\t\tUse other Mastra Storage options instead e.g @mastra/pg`,\n );\n process.exit(1);\n }\n }\n}\n"],"mappings":"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"}