@mastra/deployer 1.58.0-alpha.1 → 1.58.0-alpha.12

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 (59) hide show
  1. package/CHANGELOG.md +150 -0
  2. package/dist/_types/@mastra_hono/dist/index.d.ts +24 -1
  3. package/dist/{analyze-D100622N.cjs → analyze-BIrkd7zx.cjs} +2 -2
  4. package/dist/{analyze-D100622N.cjs.map → analyze-BIrkd7zx.cjs.map} +1 -1
  5. package/dist/{analyze-7xxwhB5F.js → analyze-CNv6Qdaz.js} +2 -2
  6. package/dist/{analyze-7xxwhB5F.js.map → analyze-CNv6Qdaz.js.map} +1 -1
  7. package/dist/build/analyze.cjs +1 -1
  8. package/dist/build/analyze.js +1 -1
  9. package/dist/build/bundler.cjs +1 -1
  10. package/dist/build/bundler.d.ts +2 -1
  11. package/dist/build/bundler.d.ts.map +1 -1
  12. package/dist/build/bundler.js +1 -1
  13. package/dist/build/fs-routing/codegen.d.ts +5 -4
  14. package/dist/build/fs-routing/codegen.d.ts.map +1 -1
  15. package/dist/build/fs-routing/discover.d.ts +12 -5
  16. package/dist/build/fs-routing/discover.d.ts.map +1 -1
  17. package/dist/build/index.cjs +4 -4
  18. package/dist/build/index.js +4 -4
  19. package/dist/build/types.d.ts +11 -0
  20. package/dist/build/types.d.ts.map +1 -1
  21. package/dist/build/watcher.d.ts.map +1 -1
  22. package/dist/{build-33wIyA35.cjs → build-BERX35Pi.cjs} +30 -18
  23. package/dist/build-BERX35Pi.cjs.map +1 -0
  24. package/dist/{build-xd6t8qiR.js → build-kZfvpuh9.js} +30 -18
  25. package/dist/build-kZfvpuh9.js.map +1 -0
  26. package/dist/bundler/entries.d.ts +12 -0
  27. package/dist/bundler/entries.d.ts.map +1 -0
  28. package/dist/bundler/index.cjs +6 -506
  29. package/dist/bundler/index.d.ts +1 -1
  30. package/dist/bundler/index.d.ts.map +1 -1
  31. package/dist/bundler/index.js +1 -497
  32. package/dist/bundler-Ct1ToG6x.js +565 -0
  33. package/dist/bundler-Ct1ToG6x.js.map +1 -0
  34. package/dist/{bundler-u9WOUtpl.cjs → bundler-DCGtF4jP.cjs} +7 -3
  35. package/dist/{bundler-u9WOUtpl.cjs.map → bundler-DCGtF4jP.cjs.map} +1 -1
  36. package/dist/bundler-DLXwkS7b.cjs +598 -0
  37. package/dist/bundler-DLXwkS7b.cjs.map +1 -0
  38. package/dist/{bundler-U9F2---r.js → bundler-gff4vn1T.js} +8 -4
  39. package/dist/bundler-gff4vn1T.js.map +1 -0
  40. package/dist/{bundlerOptions-CYRir4LE.cjs → bundlerOptions-CjjAPZYp.cjs} +2 -2
  41. package/dist/{bundlerOptions-CYRir4LE.cjs.map → bundlerOptions-CjjAPZYp.cjs.map} +1 -1
  42. package/dist/{bundlerOptions-9DigsVhY.js → bundlerOptions-NMtZPD7p.js} +2 -2
  43. package/dist/{bundlerOptions-9DigsVhY.js.map → bundlerOptions-NMtZPD7p.js.map} +1 -1
  44. package/dist/docs/SKILL.md +1 -1
  45. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  46. package/dist/index.cjs +4 -4
  47. package/dist/index.cjs.map +1 -1
  48. package/dist/index.js +3 -3
  49. package/dist/server/index.cjs +77 -3
  50. package/dist/server/index.cjs.map +1 -1
  51. package/dist/server/index.d.ts.map +1 -1
  52. package/dist/server/index.js +78 -4
  53. package/dist/server/index.js.map +1 -1
  54. package/package.json +8 -8
  55. package/dist/build-33wIyA35.cjs.map +0 -1
  56. package/dist/build-xd6t8qiR.js.map +0 -1
  57. package/dist/bundler/index.cjs.map +0 -1
  58. package/dist/bundler/index.js.map +0 -1
  59. package/dist/bundler-U9F2---r.js.map +0 -1
@@ -2988,6 +2988,54 @@ function toFetchResponse(res) {
2988
2988
  //#endregion
2989
2989
  //#region ../../server-adapters/hono/dist/index.js
2990
2990
  /**
2991
+ * Propagates a client disconnect to the simulated Node response produced by `toReqRes`.
2992
+ *
2993
+ * `fetch-to-node` builds the outgoing body from `res` events but never observes cancellation
2994
+ * of the stream it hands back. When an MCP Streamable HTTP client drops its session, nothing
2995
+ * tells `res` that the socket is gone, so the MCP transport keeps its SSE keep-alive timer
2996
+ * armed. The next keep-alive tick writes into an already-closed stream controller, and because
2997
+ * that write originates in a timer callback the resulting `ERR_INVALID_STATE` is unhandled and
2998
+ * takes down the process.
2999
+ *
3000
+ * Emitting `close` on `res` is the signal the MCP Node transport listens for: it aborts the
3001
+ * request's AbortController, which breaks the write loop and tears down the SSE stream,
3002
+ * clearing the keep-alive timer. No post-disconnect write is ever attempted.
3003
+ */
3004
+ function propagateClientDisconnect(fetchResponse, res) {
3005
+ const upstream = fetchResponse.body;
3006
+ if (!upstream) return fetchResponse;
3007
+ let disconnected = false;
3008
+ const disconnect = () => {
3009
+ if (disconnected) return;
3010
+ disconnected = true;
3011
+ try {
3012
+ res.emit("close");
3013
+ } catch {}
3014
+ reader.read().then(function drain({ done }) {
3015
+ return done ? void 0 : reader.read().then(drain);
3016
+ }, () => {});
3017
+ };
3018
+ const reader = upstream.getReader();
3019
+ const body = new ReadableStream({
3020
+ async pull(controller) {
3021
+ const { done, value } = await reader.read();
3022
+ if (done) {
3023
+ controller.close();
3024
+ return;
3025
+ }
3026
+ controller.enqueue(value);
3027
+ },
3028
+ cancel() {
3029
+ disconnect();
3030
+ }
3031
+ });
3032
+ return new Response(body, {
3033
+ status: fetchResponse.status,
3034
+ statusText: fetchResponse.statusText,
3035
+ headers: fetchResponse.headers
3036
+ });
3037
+ }
3038
+ /**
2991
3039
  * Set up WebSocket-based browser stream endpoint for real-time screencast viewing.
2992
3040
  *
2993
3041
  * Creates a WebSocket route at `/browser/:agentId/stream` that:
@@ -3107,6 +3155,26 @@ function loadHasPermission() {
3107
3155
  });
3108
3156
  return _hasPermissionPromise;
3109
3157
  }
3158
+ /**
3159
+ * Wrap a Hono middleware handler so it becomes a no-op for framework-public
3160
+ * routes (routes registered with `requiresAuth: false`).
3161
+ *
3162
+ * Adapters that expose user-provided middleware — for example `serverMiddleware`
3163
+ * on the Mastra instance or `server.middleware` in Mastra config — MUST wrap
3164
+ * those handlers with this before registering them. This is the framework's
3165
+ * guarantee that user middleware cannot accidentally (or intentionally) 401
3166
+ * routes the framework needs to keep reachable (e.g. Studio sign-in endpoints).
3167
+ *
3168
+ * The framework-public flag is computed once per request by
3169
+ * {@link MastraServer.registerContextMiddleware} and stashed on the Hono
3170
+ * context under `MASTRA_FRAMEWORK_PUBLIC_KEY`.
3171
+ */
3172
+ const skipIfFrameworkPublic = (handler) => {
3173
+ return async (c, next) => {
3174
+ if (c.get(_mastra_server_server_adapter.MASTRA_FRAMEWORK_PUBLIC_KEY)) return next();
3175
+ return handler(c, next);
3176
+ };
3177
+ };
3110
3178
  var MastraServer = class extends _mastra_server_server_adapter.MastraServer {
3111
3179
  createContextMiddleware() {
3112
3180
  return async (c, next) => {
@@ -3307,7 +3375,7 @@ var MastraServer = class extends _mastra_server_server_adapter.MastraServer {
3307
3375
  }
3308
3376
  } catch {}
3309
3377
  });
3310
- return await toFetchResponse(res);
3378
+ return propagateClientDisconnect(await toFetchResponse(res), res);
3311
3379
  } else if (route.responseType === "mcp-sse") {
3312
3380
  const { server, ssePath, messagePath } = result;
3313
3381
  try {
@@ -3566,7 +3634,12 @@ var MastraServer = class extends _mastra_server_server_adapter.MastraServer {
3566
3634
  }
3567
3635
  }
3568
3636
  registerContextMiddleware() {
3637
+ const isFrameworkPublic = this.getFrameworkPublicMatcher();
3569
3638
  this.app.use("*", this.createContextMiddleware());
3639
+ this.app.use("*", async (c, next) => {
3640
+ c.set(_mastra_server_server_adapter.MASTRA_FRAMEWORK_PUBLIC_KEY, isFrameworkPublic(c.req.path, c.req.method));
3641
+ return next();
3642
+ });
3570
3643
  this.app.use("*", async (c, next) => {
3571
3644
  await next();
3572
3645
  this.warnIfUnregisteredChannelWebhook(c.req.path, c.req.method, c.res.status);
@@ -4306,6 +4379,7 @@ const DEFAULT_CORS_ALLOW_METHODS = [
4306
4379
  const DEFAULT_CORS_ALLOW_HEADERS = [
4307
4380
  "Content-Type",
4308
4381
  "Authorization",
4382
+ "A2A-Version",
4309
4383
  "x-mastra-client-type",
4310
4384
  "x-mastra-dev-playground"
4311
4385
  ];
@@ -4389,7 +4463,7 @@ async function createHonoServer(mastra, options = { tools: {} }) {
4389
4463
  });
4390
4464
  honoServerAdapter.registerContextMiddleware();
4391
4465
  const serverMiddleware = mastra.getServerMiddleware?.();
4392
- if (serverMiddleware && serverMiddleware.length > 0) for (const m of serverMiddleware) app.use(m.path, m.handler);
4466
+ if (serverMiddleware && serverMiddleware.length > 0) for (const m of serverMiddleware) app.use(m.path, skipIfFrameworkPublic(m.handler));
4393
4467
  const browserStreamSetup = options.browserStream === false ? null : await setupBrowserStream(app, {
4394
4468
  getToolset: async (agentId) => {
4395
4469
  try {
@@ -4439,7 +4513,7 @@ async function createHonoServer(mastra, options = { tools: {} }) {
4439
4513
  };
4440
4514
  return middleware;
4441
4515
  });
4442
- for (const middleware of middlewares) app.use(middleware.path, middleware.handler);
4516
+ for (const middleware of middlewares) app.use(middleware.path, skipIfFrameworkPublic(middleware.handler));
4443
4517
  }
4444
4518
  await honoServerAdapter.registerCustomApiRoutes();
4445
4519
  if (server?.build?.apiReqLogs) app.use((0, hono_logger.logger)());