@mastra/deployer 1.58.0-alpha.1 → 1.58.0-alpha.13
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.
- package/CHANGELOG.md +158 -0
- package/dist/_types/@mastra_hono/dist/index.d.ts +24 -1
- package/dist/{analyze-D100622N.cjs → analyze-BIrkd7zx.cjs} +2 -2
- package/dist/{analyze-D100622N.cjs.map → analyze-BIrkd7zx.cjs.map} +1 -1
- package/dist/{analyze-7xxwhB5F.js → analyze-CNv6Qdaz.js} +2 -2
- package/dist/{analyze-7xxwhB5F.js.map → analyze-CNv6Qdaz.js.map} +1 -1
- package/dist/build/analyze.cjs +1 -1
- package/dist/build/analyze.js +1 -1
- package/dist/build/bundler.cjs +1 -1
- package/dist/build/bundler.d.ts +2 -1
- package/dist/build/bundler.d.ts.map +1 -1
- package/dist/build/bundler.js +1 -1
- package/dist/build/fs-routing/codegen.d.ts +5 -4
- package/dist/build/fs-routing/codegen.d.ts.map +1 -1
- package/dist/build/fs-routing/discover.d.ts +12 -5
- package/dist/build/fs-routing/discover.d.ts.map +1 -1
- package/dist/build/index.cjs +4 -4
- package/dist/build/index.js +4 -4
- package/dist/build/types.d.ts +11 -0
- package/dist/build/types.d.ts.map +1 -1
- package/dist/build/watcher.d.ts.map +1 -1
- package/dist/{build-33wIyA35.cjs → build-BERX35Pi.cjs} +30 -18
- package/dist/build-BERX35Pi.cjs.map +1 -0
- package/dist/{build-xd6t8qiR.js → build-kZfvpuh9.js} +30 -18
- package/dist/build-kZfvpuh9.js.map +1 -0
- package/dist/bundler/entries.d.ts +12 -0
- package/dist/bundler/entries.d.ts.map +1 -0
- package/dist/bundler/index.cjs +6 -506
- package/dist/bundler/index.d.ts +1 -1
- package/dist/bundler/index.d.ts.map +1 -1
- package/dist/bundler/index.js +1 -497
- package/dist/bundler-Ct1ToG6x.js +565 -0
- package/dist/bundler-Ct1ToG6x.js.map +1 -0
- package/dist/{bundler-u9WOUtpl.cjs → bundler-DCGtF4jP.cjs} +7 -3
- package/dist/{bundler-u9WOUtpl.cjs.map → bundler-DCGtF4jP.cjs.map} +1 -1
- package/dist/bundler-DLXwkS7b.cjs +598 -0
- package/dist/bundler-DLXwkS7b.cjs.map +1 -0
- package/dist/{bundler-U9F2---r.js → bundler-gff4vn1T.js} +8 -4
- package/dist/bundler-gff4vn1T.js.map +1 -0
- package/dist/{bundlerOptions-CYRir4LE.cjs → bundlerOptions-CjjAPZYp.cjs} +2 -2
- package/dist/{bundlerOptions-CYRir4LE.cjs.map → bundlerOptions-CjjAPZYp.cjs.map} +1 -1
- package/dist/{bundlerOptions-9DigsVhY.js → bundlerOptions-NMtZPD7p.js} +2 -2
- package/dist/{bundlerOptions-9DigsVhY.js.map → bundlerOptions-NMtZPD7p.js.map} +1 -1
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -3
- package/dist/server/index.cjs +86 -7
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +87 -8
- package/dist/server/index.js.map +1 -1
- package/package.json +8 -8
- package/dist/build-33wIyA35.cjs.map +0 -1
- package/dist/build-xd6t8qiR.js.map +0 -1
- package/dist/bundler/index.cjs.map +0 -1
- package/dist/bundler/index.js.map +0 -1
- package/dist/bundler-U9F2---r.js.map +0 -1
package/dist/server/index.cjs
CHANGED
|
@@ -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 {
|
|
@@ -3487,8 +3555,8 @@ var MastraServer = class extends _mastra_server_server_adapter.MastraServer {
|
|
|
3487
3555
|
});
|
|
3488
3556
|
}
|
|
3489
3557
|
async registerCustomApiRoutes() {
|
|
3490
|
-
|
|
3491
|
-
|
|
3558
|
+
const routes = await this.registerSchemaApiRoutes();
|
|
3559
|
+
if (!await this.buildCustomRouteHandler(routes)) return;
|
|
3492
3560
|
for (const route of routes) {
|
|
3493
3561
|
const serverRoute = {
|
|
3494
3562
|
method: route.method,
|
|
@@ -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);
|
|
@@ -4295,6 +4368,9 @@ const getStudioPath = () => {
|
|
|
4295
4368
|
if (require("url").pathToFileURL(__filename).href) __dirname = (0, path.dirname)((0, url.fileURLToPath)(require("url").pathToFileURL(__filename).href));
|
|
4296
4369
|
return process.env.MASTRA_STUDIO_PATH || (0, path.join)(__dirname, "studio");
|
|
4297
4370
|
};
|
|
4371
|
+
function isSchemaApiRoute(route) {
|
|
4372
|
+
return "_mastraSchemaRoute" in route && route._mastraSchemaRoute === true;
|
|
4373
|
+
}
|
|
4298
4374
|
const DEFAULT_CORS_ALLOW_METHODS = [
|
|
4299
4375
|
"GET",
|
|
4300
4376
|
"POST",
|
|
@@ -4306,6 +4382,7 @@ const DEFAULT_CORS_ALLOW_METHODS = [
|
|
|
4306
4382
|
const DEFAULT_CORS_ALLOW_HEADERS = [
|
|
4307
4383
|
"Content-Type",
|
|
4308
4384
|
"Authorization",
|
|
4385
|
+
"A2A-Version",
|
|
4309
4386
|
"x-mastra-client-type",
|
|
4310
4387
|
"x-mastra-dev-playground"
|
|
4311
4388
|
];
|
|
@@ -4325,7 +4402,8 @@ function getCorsConfig(serverCors, credentialsDefault) {
|
|
|
4325
4402
|
};
|
|
4326
4403
|
}
|
|
4327
4404
|
function getRouteCorsConfig(apiRoutes, pathname, method) {
|
|
4328
|
-
|
|
4405
|
+
const route = (0, _mastra_server_auth.findMatchingCustomRoute)(pathname, method, apiRoutes)?.route;
|
|
4406
|
+
return route && !isSchemaApiRoute(route) ? route.cors : void 0;
|
|
4329
4407
|
}
|
|
4330
4408
|
function getToolExports(tools) {
|
|
4331
4409
|
try {
|
|
@@ -4351,7 +4429,8 @@ async function createHonoServer(mastra, options = { tools: {} }) {
|
|
|
4351
4429
|
const apiPrefix = server?.apiPrefix ?? "/api";
|
|
4352
4430
|
const a2aTaskStore = new _mastra_server_a2a_store.InMemoryTaskStore();
|
|
4353
4431
|
const processedRoutes = (server?.apiRoutes)?.map((route) => {
|
|
4354
|
-
if (
|
|
4432
|
+
if (isSchemaApiRoute(route)) return route;
|
|
4433
|
+
if (route.openapi) {
|
|
4355
4434
|
const existingMiddleware = route.middleware ? Array.isArray(route.middleware) ? route.middleware : [route.middleware] : [];
|
|
4356
4435
|
return {
|
|
4357
4436
|
...route,
|
|
@@ -4389,7 +4468,7 @@ async function createHonoServer(mastra, options = { tools: {} }) {
|
|
|
4389
4468
|
});
|
|
4390
4469
|
honoServerAdapter.registerContextMiddleware();
|
|
4391
4470
|
const serverMiddleware = mastra.getServerMiddleware?.();
|
|
4392
|
-
if (serverMiddleware && serverMiddleware.length > 0) for (const m of serverMiddleware) app.use(m.path, m.handler);
|
|
4471
|
+
if (serverMiddleware && serverMiddleware.length > 0) for (const m of serverMiddleware) app.use(m.path, skipIfFrameworkPublic(m.handler));
|
|
4393
4472
|
const browserStreamSetup = options.browserStream === false ? null : await setupBrowserStream(app, {
|
|
4394
4473
|
getToolset: async (agentId) => {
|
|
4395
4474
|
try {
|
|
@@ -4439,7 +4518,7 @@ async function createHonoServer(mastra, options = { tools: {} }) {
|
|
|
4439
4518
|
};
|
|
4440
4519
|
return middleware;
|
|
4441
4520
|
});
|
|
4442
|
-
for (const middleware of middlewares) app.use(middleware.path, middleware.handler);
|
|
4521
|
+
for (const middleware of middlewares) app.use(middleware.path, skipIfFrameworkPublic(middleware.handler));
|
|
4443
4522
|
}
|
|
4444
4523
|
await honoServerAdapter.registerCustomApiRoutes();
|
|
4445
4524
|
if (server?.build?.apiReqLogs) app.use((0, hono_logger.logger)());
|