@mastra/koa 1.5.13-alpha.3 → 1.5.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 CHANGED
@@ -1,5 +1,25 @@
1
1
  # @mastra/koa
2
2
 
3
+ ## 1.5.13
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated to support dual auth system. Adapters now check for both `studio.auth` and `server.auth` when gating RBAC, and route requests to the correct auth provider based on the `x-mastra-client-type` header. ([#17722](https://github.com/mastra-ai/mastra/pull/17722))
8
+
9
+ - Updated dependencies [[`d468acb`](https://github.com/mastra-ai/mastra/commit/d468acb07aec1bb19a2cb0ada8042b05b46746b2), [`575f815`](https://github.com/mastra-ai/mastra/commit/575f815c5c3567b71c0b83cbb7fa98c8253a9d9c), [`34839c1`](https://github.com/mastra-ai/mastra/commit/34839c1910b6964bf59ed0cee58844efebbb684e), [`053735a`](https://github.com/mastra-ai/mastra/commit/053735a75c2c18e23ce34d9468007efa4a45f4c4), [`306909a`](https://github.com/mastra-ai/mastra/commit/306909a693de77d709b38706e2673c9547d24a28), [`5191af8`](https://github.com/mastra-ai/mastra/commit/5191af80c799eea25357c545fc05d91b3883531d), [`43bd3d4`](https://github.com/mastra-ai/mastra/commit/43bd3d421987463fdf35386a45199c49499ed069), [`e6fa79e`](https://github.com/mastra-ai/mastra/commit/e6fa79ec72a2ddffdd25e85270398951e9d552a4), [`e6fa79e`](https://github.com/mastra-ai/mastra/commit/e6fa79ec72a2ddffdd25e85270398951e9d552a4), [`904bcdf`](https://github.com/mastra-ai/mastra/commit/904bcdf7b8004aa7be823f9f70ca63580e47e470), [`7f5ee1d`](https://github.com/mastra-ai/mastra/commit/7f5ee1dca46daee8d2817f2ebe49e6335da81956), [`1e9aab5`](https://github.com/mastra-ai/mastra/commit/1e9aab50ff11e6e88fde4d7cbf512c44a9fe8d61), [`2bccba4`](https://github.com/mastra-ai/mastra/commit/2bccba4c03cadc815c2d54cbf4dd43a922140a8d), [`57879dd`](https://github.com/mastra-ai/mastra/commit/57879dd3eea869cec0a6696fc9a8aa6459faf4b3), [`3abfa15`](https://github.com/mastra-ai/mastra/commit/3abfa158881ad3b187f69392cc64fe3a5aeed5c3), [`bf8eb6d`](https://github.com/mastra-ai/mastra/commit/bf8eb6d0ec213a403eb9265a594ad283c44ab3dc), [`e9be4e7`](https://github.com/mastra-ai/mastra/commit/e9be4e747ec3d8b65548bff92f9377db06105376), [`493a328`](https://github.com/mastra-ai/mastra/commit/493a328f4346a1deeb9f1e2e44c8f2a3a4d7591b), [`d53cfc2`](https://github.com/mastra-ai/mastra/commit/d53cfc2c7f8d78343a4aa84ec4e129ba25f3325e), [`65799d4`](https://github.com/mastra-ai/mastra/commit/65799d4d549e5ebb9c848fbe3f51ac090f64becf), [`c268c89`](https://github.com/mastra-ai/mastra/commit/c268c89f4c63a93ee474d3cffdf3ea60bf00d4f2), [`34839c1`](https://github.com/mastra-ai/mastra/commit/34839c1910b6964bf59ed0cee58844efebbb684e), [`014e00f`](https://github.com/mastra-ai/mastra/commit/014e00f2b3a597a016b72f9901c6ab27d491f822), [`029a414`](https://github.com/mastra-ai/mastra/commit/029a4141719793bd3e898a39eb5a0466a55f5f3a), [`d468acb`](https://github.com/mastra-ai/mastra/commit/d468acb07aec1bb19a2cb0ada8042b05b46746b2), [`b147b29`](https://github.com/mastra-ai/mastra/commit/b147b2907f0cd1aa812efe6d6e3f58d22e66fc88), [`d371ac1`](https://github.com/mastra-ai/mastra/commit/d371ac1d9820afaaf7cfdbc380a475946a994d8f), [`2bccba4`](https://github.com/mastra-ai/mastra/commit/2bccba4c03cadc815c2d54cbf4dd43a922140a8d), [`0c72f03`](https://github.com/mastra-ai/mastra/commit/0c72f032abb13254df5a7856d64be2f207b8006d), [`cf182b7`](https://github.com/mastra-ai/mastra/commit/cf182b7fb495767946d9840ef29f19cfa906f31f), [`3b45ea9`](https://github.com/mastra-ai/mastra/commit/3b45ea95015557a6cb9d70dc5252af54ab1b78ac), [`983aa20`](https://github.com/mastra-ai/mastra/commit/983aa20f65c57cd893ef1ffd5ae4c07bb6e1d345), [`a049c2a`](https://github.com/mastra-ai/mastra/commit/a049c2a9dfb41d0ee2e7a28874a88cd64fd5669f), [`f084be1`](https://github.com/mastra-ai/mastra/commit/f084be1fcbe33ad7480913e44d6130c421c0976f), [`b147b29`](https://github.com/mastra-ai/mastra/commit/b147b2907f0cd1aa812efe6d6e3f58d22e66fc88), [`65d3320`](https://github.com/mastra-ai/mastra/commit/65d3320bade087db166caff07eb461c008590ee8), [`2a96528`](https://github.com/mastra-ai/mastra/commit/2a9652848dfa3c5a2426f952e9d93554c26fd90f), [`44d2c09`](https://github.com/mastra-ai/mastra/commit/44d2c0989186b7294d624bc6dd17722bdb2dcf72), [`f2ab060`](https://github.com/mastra-ai/mastra/commit/f2ab060162bea81505fda553e2cee29c1979fd04), [`5d302c8`](https://github.com/mastra-ai/mastra/commit/5d302c8eda1a6ac74eab5e442c4f64db6cc97a06), [`34839c1`](https://github.com/mastra-ai/mastra/commit/34839c1910b6964bf59ed0cee58844efebbb684e), [`a952852`](https://github.com/mastra-ai/mastra/commit/a952852c971a21fb646cd907c75fcf4443cdc963), [`2656d9c`](https://github.com/mastra-ai/mastra/commit/2656d9c2976d4f3354253bfbbbf9b88a1b2bbf34), [`0d062e5`](https://github.com/mastra-ai/mastra/commit/0d062e538a23ed54e15a42cb9e9f1dff2d27d946), [`63e3fe1`](https://github.com/mastra-ai/mastra/commit/63e3fe13cc1ea96f91d7c68aea92f400faf9e4da), [`1d4ce8d`](https://github.com/mastra-ai/mastra/commit/1d4ce8daaa54511f325c1b609d31b8e54009d677), [`8c68372`](https://github.com/mastra-ai/mastra/commit/8c68372e85fe0b066ec12c58bd29ffb93e54c552)]:
10
+ - @mastra/core@1.42.0
11
+ - @mastra/server@1.42.0
12
+
13
+ ## 1.5.13-alpha.4
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated to support dual auth system. Adapters now check for both `studio.auth` and `server.auth` when gating RBAC, and route requests to the correct auth provider based on the `x-mastra-client-type` header. ([#17722](https://github.com/mastra-ai/mastra/pull/17722))
18
+
19
+ - Updated dependencies [[`575f815`](https://github.com/mastra-ai/mastra/commit/575f815c5c3567b71c0b83cbb7fa98c8253a9d9c), [`306909a`](https://github.com/mastra-ai/mastra/commit/306909a693de77d709b38706e2673c9547d24a28), [`5191af8`](https://github.com/mastra-ai/mastra/commit/5191af80c799eea25357c545fc05d91b3883531d), [`43bd3d4`](https://github.com/mastra-ai/mastra/commit/43bd3d421987463fdf35386a45199c49499ed069), [`e6fa79e`](https://github.com/mastra-ai/mastra/commit/e6fa79ec72a2ddffdd25e85270398951e9d552a4), [`e6fa79e`](https://github.com/mastra-ai/mastra/commit/e6fa79ec72a2ddffdd25e85270398951e9d552a4), [`904bcdf`](https://github.com/mastra-ai/mastra/commit/904bcdf7b8004aa7be823f9f70ca63580e47e470), [`7f5ee1d`](https://github.com/mastra-ai/mastra/commit/7f5ee1dca46daee8d2817f2ebe49e6335da81956), [`1e9aab5`](https://github.com/mastra-ai/mastra/commit/1e9aab50ff11e6e88fde4d7cbf512c44a9fe8d61), [`3abfa15`](https://github.com/mastra-ai/mastra/commit/3abfa158881ad3b187f69392cc64fe3a5aeed5c3), [`bf8eb6d`](https://github.com/mastra-ai/mastra/commit/bf8eb6d0ec213a403eb9265a594ad283c44ab3dc), [`493a328`](https://github.com/mastra-ai/mastra/commit/493a328f4346a1deeb9f1e2e44c8f2a3a4d7591b), [`029a414`](https://github.com/mastra-ai/mastra/commit/029a4141719793bd3e898a39eb5a0466a55f5f3a), [`b147b29`](https://github.com/mastra-ai/mastra/commit/b147b2907f0cd1aa812efe6d6e3f58d22e66fc88), [`d371ac1`](https://github.com/mastra-ai/mastra/commit/d371ac1d9820afaaf7cfdbc380a475946a994d8f), [`cf182b7`](https://github.com/mastra-ai/mastra/commit/cf182b7fb495767946d9840ef29f19cfa906f31f), [`983aa20`](https://github.com/mastra-ai/mastra/commit/983aa20f65c57cd893ef1ffd5ae4c07bb6e1d345), [`a049c2a`](https://github.com/mastra-ai/mastra/commit/a049c2a9dfb41d0ee2e7a28874a88cd64fd5669f), [`b147b29`](https://github.com/mastra-ai/mastra/commit/b147b2907f0cd1aa812efe6d6e3f58d22e66fc88), [`2a96528`](https://github.com/mastra-ai/mastra/commit/2a9652848dfa3c5a2426f952e9d93554c26fd90f), [`2656d9c`](https://github.com/mastra-ai/mastra/commit/2656d9c2976d4f3354253bfbbbf9b88a1b2bbf34), [`0d062e5`](https://github.com/mastra-ai/mastra/commit/0d062e538a23ed54e15a42cb9e9f1dff2d27d946), [`63e3fe1`](https://github.com/mastra-ai/mastra/commit/63e3fe13cc1ea96f91d7c68aea92f400faf9e4da), [`1d4ce8d`](https://github.com/mastra-ai/mastra/commit/1d4ce8daaa54511f325c1b609d31b8e54009d677), [`8c68372`](https://github.com/mastra-ai/mastra/commit/8c68372e85fe0b066ec12c58bd29ffb93e54c552)]:
20
+ - @mastra/core@1.42.0-alpha.4
21
+ - @mastra/server@1.42.0-alpha.4
22
+
3
23
  ## 1.5.13-alpha.3
4
24
 
5
25
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -393,14 +393,16 @@ var MastraServer = class extends serverAdapter.MastraServer {
393
393
  tools: ctx.state.tools,
394
394
  taskStore: ctx.state.taskStore,
395
395
  abortSignal: ctx.state.abortSignal,
396
- routePrefix: prefix
396
+ routePrefix: prefix,
397
+ request: toWebRequest2(ctx)
397
398
  };
398
- const authConfig = this.mastra.getServer()?.auth;
399
- if (authConfig) {
399
+ const requestContext = ctx.state.requestContext;
400
+ const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;
401
+ if (hasAuth) {
400
402
  const hasPermission = await loadHasPermission();
401
403
  if (hasPermission) {
402
- const userPermissions = ctx.state.requestContext.get("mastra__userPermissions");
403
- const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);
404
+ const userPermissions = requestContext.get("mastra__userPermissions");
405
+ const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission, requestContext);
404
406
  if (permissionError) {
405
407
  ctx.status = permissionError.status;
406
408
  ctx.body = {
@@ -411,7 +413,7 @@ var MastraServer = class extends serverAdapter.MastraServer {
411
413
  }
412
414
  }
413
415
  }
414
- const fgaError = await serverAdapter.checkRouteFGA(this.mastra, route, ctx.state.requestContext, {
416
+ const fgaError = await serverAdapter.checkRouteFGA(this.mastra, route, requestContext, {
415
417
  ...params.urlParams,
416
418
  ...params.queryParams,
417
419
  ...typeof params.body === "object" ? params.body : {}
@@ -759,20 +761,26 @@ var MastraServer = class extends serverAdapter.MastraServer {
759
761
  return;
760
762
  }
761
763
  }
762
- const authConfig = server.mastra.getServer()?.auth;
763
- if (authConfig) {
764
- const hasPermission = await loadHasPermission();
765
- if (hasPermission) {
766
- const userPermissions = ctx.state.requestContext.get("mastra__userPermissions");
767
- const permissionError = server.checkRoutePermission(serverRoute, userPermissions, hasPermission);
768
- if (permissionError) {
769
- ctx.status = permissionError.status;
770
- ctx.body = {
771
- error: permissionError.error,
772
- message: permissionError.message
773
- };
774
- return;
775
- }
764
+ }
765
+ const requestContext = ctx.state.requestContext;
766
+ const hasAuth = server.mastra.getStudio()?.auth || server.mastra.getServer()?.auth;
767
+ if (hasAuth) {
768
+ const hasPermission = await loadHasPermission();
769
+ if (hasPermission) {
770
+ const userPermissions = requestContext.get("mastra__userPermissions");
771
+ const permissionError = server.checkRoutePermission(
772
+ serverRoute,
773
+ userPermissions,
774
+ hasPermission,
775
+ requestContext
776
+ );
777
+ if (permissionError) {
778
+ ctx.status = permissionError.status;
779
+ ctx.body = {
780
+ error: permissionError.error,
781
+ message: permissionError.message
782
+ };
783
+ return;
776
784
  }
777
785
  }
778
786
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth-middleware.ts","../src/index.ts"],"names":["RequestContext","coreAuthMiddleware","toWebRequest","MastraServerBase","isZodError","checkRouteFGA","redactStreamChunk","normalizeQueryParams","busboy","Busboy","findMatchingCustomRoute","isProtectedCustomRoute"],"mappings":";;;;;;;;AAUA,SAAS,aAAa,GAAA,EAAkC;AACtD,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,IAAY,MAAA;AACjC,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,WAAA;AACzB,EAAA,MAAM,MAAM,CAAA,EAAG,QAAQ,MAAM,IAAI,CAAA,EAAG,IAAI,GAAG,CAAA,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACtD,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,QAAQ,CAAA,CAAA,KAAK,OAAA,CAAQ,MAAA,CAAO,GAAA,EAAK,CAAC,CAAC,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,UAAA,CAAW,OAAA,CAAQ,GAAA,EAAK;AAAA,IACjC,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ;AAAA,GACD,CAAA;AACH;AAEO,SAAS,oBAAA,CAAqB,EAAE,MAAA,EAAQ,YAAA,GAAe,MAAK,EAAyC;AAC1G,EAAA,OAAO,OAAO,KAAc,IAAA,KAAe;AACzC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAA,EAAK;AACX,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,SAAA,EAAU,EAAG,IAAA;AACvC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAA,EAAK;AACX,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,KAAA,CAAM,cAAA,KAAmB,IAAIA,6BAAA,EAAe;AAChD,IAAA,GAAA,CAAI,MAAM,MAAA,KAAW,MAAA;AAErB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,GAAG,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,KAAK,CAAA;AACzC,IAAA,MAAM,wBAAwB,IAAI,GAAA,CAAqB,IAAI,KAAA,CAAM,qBAAA,IAAyB,EAAE,CAAA;AAC5F,IAAA,qBAAA,CAAsB,IAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,IAAI,IAAI,CAAA;AAEnD,IAAA,MAAM,UAAA,GAAa,IAAI,OAAA,CAAQ,aAAA;AAC/B,IAAA,IAAI,QAAuB,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,GAAI,IAAA;AAC5E,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAS,GAAA,CAAI,MAAM,MAAA,IAAqB,IAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,MAAA,GAAS,MAAMC,uBAAA,CAAmB;AAAA,MACtC,IAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAW,CAAA,IAAA,KAAQ,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAAA,MACjD,MAAA;AAAA,MACA,UAAA;AAAA,MACA,qBAAA;AAAA,MACA,cAAA,EAAgB,IAAI,KAAA,CAAM,cAAA;AAAA,MAC1B,UAAA,EAAY,aAAa,GAAG,CAAA;AAAA,MAC5B,KAAA;AAAA,MACA,qBAAA,EAAuB,MAAM,YAAA,CAAa,GAAG;AAAA,KAC9C,CAAA;AAED,IAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAA,EAAK;AACX,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA;AACpB,IAAA,GAAA,CAAI,OAAO,MAAA,CAAO,IAAA;AAAA,EACpB,CAAA;AACF;;;AC/CA,IAAI,qBAAA;AACJ,SAAS,iBAAA,GAA0D;AACjE,EAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,IAAA,qBAAA,GAAwB,OAAO,sBAAsB,CAAA,CAClD,IAAA,CAAK,OAAK,CAAA,CAAE,aAAa,CAAA,CACzB,KAAA,CAAM,MAAM;AACX,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACL;AACA,EAAA,OAAO,qBAAA;AACT;AAKA,SAASC,cAAa,GAAA,EAAkC;AACtD,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,IAAY,MAAA;AACjC,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,WAAA;AACzB,EAAA,MAAM,MAAM,CAAA,EAAG,QAAQ,MAAM,IAAI,CAAA,EAAG,IAAI,GAAG,CAAA,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACtD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,QAAA,KAAA,CAAM,QAAQ,CAAA,CAAA,KAAK,OAAA,CAAQ,MAAA,CAAO,GAAA,EAAK,CAAC,CAAC,CAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,UAAA,CAAW,OAAA,CAAQ,GAAA,EAAK;AAAA,IACjC,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ;AAAA,GACD,CAAA;AACH;AAiBO,IAAM,YAAA,GAAN,cAA2BC,0BAAA,CAAwC;AAAA,EACvD,sBAAA,uBAA6B,OAAA,EAAmC;AAAA,EAEjF,MAAM,IAAA,GAAO;AACX,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,IAAA,MAAM,MAAM,IAAA,EAAK;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,uBAAA,GAAgC;AACtC,IAAA,MAAM,MAAA,GAAS,IAAA;AAEf,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,eAAe,mBAAA,CAAoB,KAAc,IAAA,EAAY;AACxE,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,EAAK;AAAA,MACb,SAAS,GAAA,EAAK;AAGZ,QAAA,IAAI,MAAM,MAAA,CAAO,aAAA,CAAc,GAAA,EAAK,GAAG,CAAA,EAAG;AACxC,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,QAAA,IAAI,MAAA,GAAS,GAAA;AACb,QAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,UAAA,IAAI,YAAY,GAAA,EAAK;AACnB,YAAA,MAAA,GAAU,GAAA,CAAY,MAAA;AAAA,UACxB,CAAA,MAAA,IACE,SAAA,IAAa,GAAA,IACZ,GAAA,CAAY,OAAA,IACb,OAAQ,GAAA,CAAY,OAAA,KAAY,QAAA,IAChC,QAAA,IAAa,GAAA,CAAY,OAAA,EACzB;AACA,YAAA,MAAA,GAAU,IAAY,OAAA,CAAQ,MAAA;AAAA,UAChC;AAAA,QACF;AACA,QAAA,GAAA,CAAI,MAAA,GAAS,MAAA;AACb,QAAA,GAAA,CAAI,IAAA,GAAO,EAAE,KAAA,EAAO,KAAA,CAAM,WAAW,eAAA,EAAgB;AAIrD,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,GAAA,EAAK,GAAG,CAAA;AAAA,MAChC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,aAAA,CAAc,GAAA,EAAc,GAAA,EAAgC;AAExE,IAAA,IAAK,GAAA,CAAY,yBAAyB,OAAO,KAAA;AACjD,IAAC,IAAY,uBAAA,GAA0B,IAAA;AAEvC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,OAAA;AACzC,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAErB,IAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAGhE,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,IAAA,EAAM,CAAC,IAAA,EAAe,MAAA,GAAiB,GAAA,KACrC,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,QACjC,MAAA;AAAA,QACA,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,OAC/C,CAAA;AAAA,MACH,GAAA,EAAK;AAAA,QACH,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,MAAA,EAAQ,CAAC,IAAA,KAAiB;AACxB,UAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAC5C,UAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAChD,UAAA,OAAO,KAAA;AAAA,QACT,CAAA;AAAA,QACA,KAAK,GAAA,CAAI;AAAA;AACX,KACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,KAAA,EAAO,WAAkB,CAAA;AAExD,MAAA,GAAA,CAAI,SAAS,QAAA,CAAS,MAAA;AACtB,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAC5D,MAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC5C,QAAA,GAAA,CAAI,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAAA,MACjC;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,iCAAA,EAAmC;AAAA,QAChE,KAAA,EAAO,UAAA,YAAsB,KAAA,GAAQ,EAAE,OAAA,EAAS,WAAW,OAAA,EAAS,KAAA,EAAO,UAAA,CAAW,KAAA,EAAM,GAAI;AAAA,OACjG,CAAA;AACD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,uBAAA,GAAsC;AACpC,IAAA,MAAM,MAAA,GAAS,IAAA;AAEf,IAAA,OAAO,eAAe,oBAAA,CAAqB,GAAA,EAAc,IAAA,EAAY;AAEnE,MAAA,IAAI,kBAAA;AACJ,MAAA,IAAI,oBAAA;AAGJ,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,GAAA,CAAI,WAAW,KAAA,EAAO;AACjD,QAAA,MAAM,WAAA,GAAc,GAAA,CAAI,OAAA,CAAQ,cAAc,CAAA;AAC9C,QAAA,IAAI,aAAa,QAAA,CAAS,kBAAkB,CAAA,IAAK,GAAA,CAAI,QAAQ,IAAA,EAAM;AACjE,UAAA,MAAM,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAA;AACzB,UAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,YAAA,kBAAA,GAAqB,IAAA,CAAK,cAAA;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,GAAA,CAAI,WAAW,KAAA,EAAO;AACxB,QAAA,IAAI;AACF,UAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,UAAA,MAAM,wBAAwB,KAAA,CAAM,cAAA;AACpC,UAAA,IAAI,OAAO,0BAA0B,QAAA,EAAU;AAE7C,YAAA,IAAI;AACF,cAAA,oBAAA,GAAuB,IAAA,CAAK,MAAM,qBAAqB,CAAA;AAAA,YACzD,CAAA,CAAA,MAAQ;AAEN,cAAA,IAAI;AACF,gBAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,uBAAuB,QAAQ,CAAA,CAAE,SAAS,OAAO,CAAA;AAC1E,gBAAA,oBAAA,GAAuB,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,cACxC,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,MAAM,iBAAiB,MAAA,CAAO,mBAAA,CAAoB,EAAE,oBAAA,EAAsB,oBAAoB,CAAA;AAC9F,MAAA,MAAA,CAAO,6BAAA,CAA8B;AAAA,QACnC,cAAA;AAAA,QACA,SAAA,EAAW,CAAA,IAAA,KAAQ,GAAA,CAAI,GAAA,CAAI,IAAI;AAAA,OAChC,CAAA;AAGD,MAAA,GAAA,CAAI,MAAM,cAAA,GAAiB,cAAA;AAC3B,MAAA,GAAA,CAAI,KAAA,CAAM,SAAS,MAAA,CAAO,MAAA;AAC1B,MAAA,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAC;AACnC,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,GAAA,CAAI,KAAA,CAAM,YAAY,MAAA,CAAO,SAAA;AAAA,MAC/B;AACA,MAAA,GAAA,CAAI,KAAA,CAAM,wBAAwB,MAAA,CAAO,qBAAA;AAGzC,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,MAAM;AAExB,QAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,aAAA,EAAe;AAC1B,UAAA,UAAA,CAAW,KAAA,EAAM;AAAA,QACnB;AAAA,MACF,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,KAAA,CAAM,cAAc,UAAA,CAAW,MAAA;AAEnC,MAAA,MAAM,IAAA,EAAK;AAAA,IACb,CAAA;AAAA,EACF;AAAA,EAEQ,wBAAwB,GAAA,EAAgC;AAQ9D,IAAA,MAAM,kBAAmB,GAAA,CAAiC,UAAA;AAC1D,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA;AAEnD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,sBAAA,CAAuB,GAAA,CAAI,GAAG,CAAA;AACvD,MAAA,IAAI,WAAA,IAAe,eAAA,CAAgB,MAAA,KAAW,WAAA,CAAY,4BAAA,EAA8B;AACtF,QAAA,OAAO,WAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAA8B;AAAA,MAClC,QAAQ,EAAC;AAAA,MACT,4BAAA,EAA8B;AAAA,KAChC;AACA,IAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,+BAAA,CAAgC,KAAK,CAAC,CAAA;AAEnD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,KAAA,CAAM,4BAAA,GAAgC,IAAkC,UAAA,CAAW,MAAA;AACnF,MAAA,IAAA,CAAK,sBAAA,CAAuB,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,gCAAgC,KAAA,EAAyC;AAC/E,IAAA,MAAM,MAAA,GAAS,IAAA;AAEf,IAAA,OAAO,eAAe,qBAAA,CAAsB,GAAA,EAAc,IAAA,EAAY;AACpE,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,mBAAA,CAAoB,KAAA,CAAM,QAAQ,GAAG,CAAA;AAEjE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,MAAM,IAAA,EAAK;AACX,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,CAAO,kBAAA,CAAmB,YAAA,EAAc,GAAG,CAAA;AAAA,IACnD,CAAA;AAAA,EACF;AAAA,EAEQ,mBAAA,CAAoB,QAA8B,GAAA,EAA8C;AACtG,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,WAAA,EAAY;AAEtC,IAAA,KAAA,MAAW,mBAAmB,MAAA,EAAQ;AACpC,MAAA,IACE,eAAA,CAAgB,KAAA,CAAM,MAAA,CAAO,WAAA,EAAY,KAAM,KAAA,IAC/C,MAAA,KAAW,eAAA,CAAgB,KAAA,CAAM,MAAA,CAAO,WAAA,EAAY,EACpD;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,SAAA,CAAU,IAAA,CAAK,IAAI,IAAI,CAAA;AACrD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA;AAAA,MACF;AAEA,MAAA,GAAA,CAAI,SAAS,EAAC;AACd,MAAA,eAAA,CAAgB,UAAA,CAAW,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAClD,QAAA,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,MACpC,CAAC,CAAA;AAED,MAAA,OAAO,eAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,kBAAA,CAAmB,eAAA,EAAqC,GAAA,EAA6B;AACjG,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,eAAA;AAE1B,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO;AAAA,MACjD,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,GAAG,CAAA;AAAA,MAC5B,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,KAAK,CAAA;AAAA,MAClC,WAAW,CAAA,IAAA,KAAQ,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAAA,MACjD,QAAA,EAAU,CAAA,IAAA,KAAS,GAAA,CAAI,KAAA,CAAiC,IAAI,CAAA;AAAA,MAC5D,cAAA,EAAgB,IAAI,KAAA,CAAM,cAAA;AAAA,MAC1B,OAAA,EAASD,cAAa,GAAG,CAAA;AAAA,MACzB,qBAAA,EAAuB,MAAMA,aAAAA,CAAa,GAAG;AAAA,KAC9C,CAAA;AAED,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAA,EAAG;AAC5D,UAAA,GAAA,CAAI,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,QACpB;AAAA,MACF;AAGA,MAAA,IAAI,UAAU,KAAA,EAAO;AACnB,QAAA,GAAA,CAAI,SAAS,SAAA,CAAU,MAAA;AACvB,QAAA,GAAA,CAAI,IAAA,GAAO,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,EAAM;AACpC,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AAG9C,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,GAAA,CAAI,MAAA,GAAS,GAAA;AACb,MAAA,GAAA,CAAI,IAAA,GAAO;AAAA,QACT,KAAA,EAAO,sBAAA;AAAA,QACP,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,QAAQ,OAAA,EAAS,MAAA,CAAO,cAAA,CAAe,OAAA,EAAS;AAAA,OACpE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,cAAc,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,OAAO,WAAW,CAAA;AAAA,MAC5E,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,4BAAA,EAA8B;AAAA,UAC3D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,SAClF,CAAA;AACD,QAAA,IAAIE,wBAAA,CAAW,KAAK,CAAA,EAAG;AACrB,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,OAAO,OAAO,CAAA;AAClE,UAAA,GAAA,CAAI,SAAS,QAAA,CAAS,MAAA;AACtB,UAAA,GAAA,CAAI,OAAO,QAAA,CAAS,IAAA;AACpB,UAAA;AAAA,QACF;AACA,QAAA,GAAA,CAAI,MAAA,GAAS,GAAA;AACb,QAAA,GAAA,CAAI,IAAA,GAAO;AAAA,UACT,KAAA,EAAO,0BAAA;AAAA,UACP,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA,EAAiB;AAAA,SAClG;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,MACvD,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,oBAAA,EAAsB;AAAA,UACnD,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,SAClF,CAAA;AACD,QAAA,IAAIA,wBAAA,CAAW,KAAK,CAAA,EAAG;AACrB,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,OAAO,MAAM,CAAA;AACjE,UAAA,GAAA,CAAI,SAAS,QAAA,CAAS,MAAA;AACtB,UAAA,GAAA,CAAI,OAAO,QAAA,CAAS,IAAA;AACpB,UAAA;AAAA,QACF;AACA,QAAA,GAAA,CAAI,MAAA,GAAS,GAAA;AACb,QAAA,GAAA,CAAI,IAAA,GAAO;AAAA,UACT,KAAA,EAAO,sBAAA;AAAA,UACP,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA,EAAiB;AAAA,SAClG;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,YAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,OAAO,SAAS,CAAA;AAAA,MACvE,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,2BAAA,EAA6B;AAAA,UAC1D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,SAClF,CAAA;AACD,QAAA,IAAIA,wBAAA,CAAW,KAAK,CAAA,EAAG;AACrB,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,OAAO,MAAM,CAAA;AACjE,UAAA,GAAA,CAAI,SAAS,QAAA,CAAS,MAAA;AACtB,UAAA,GAAA,CAAI,OAAO,QAAA,CAAS,IAAA;AACpB,UAAA;AAAA,QACF;AACA,QAAA,GAAA,CAAI,MAAA,GAAS,GAAA;AACb,QAAA,GAAA,CAAI,IAAA,GAAO;AAAA,UACT,KAAA,EAAO,yBAAA;AAAA,UACP,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA,EAAiB;AAAA,SAClG;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,GAAG,MAAA,CAAO,SAAA;AAAA,MACV,GAAG,MAAA,CAAO,WAAA;AAAA,MACV,GAAI,OAAO,MAAA,CAAO,SAAS,QAAA,GAAW,MAAA,CAAO,OAAO,EAAC;AAAA,MACrD,cAAA,EAAgB,IAAI,KAAA,CAAM,cAAA;AAAA,MAC1B,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAA,EAAO,IAAI,KAAA,CAAM,KAAA;AAAA,MACjB,SAAA,EAAW,IAAI,KAAA,CAAM,SAAA;AAAA,MACrB,WAAA,EAAa,IAAI,KAAA,CAAM,WAAA;AAAA,MACvB,WAAA,EAAa;AAAA,KACf;AAKA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,IAAA;AAC5C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,aAAA,GAAgB,MAAM,iBAAA,EAAkB;AAC9C,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,eAAA,GAAkB,GAAA,CAAI,KAAA,CAAM,cAAA,CAAe,IAAI,yBAAyB,CAAA;AAC9E,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,iBAAiB,aAAa,CAAA;AAEvF,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,GAAA,CAAI,SAAS,eAAA,CAAgB,MAAA;AAC7B,UAAA,GAAA,CAAI,IAAA,GAAO;AAAA,YACT,OAAO,eAAA,CAAgB,KAAA;AAAA,YACvB,SAAS,eAAA,CAAgB;AAAA,WAC3B;AACA,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,MAAMC,2BAAA,CAAc,IAAA,CAAK,QAAQ,KAAA,EAAO,GAAA,CAAI,MAAM,cAAA,EAAgB;AAAA,MACjF,GAAG,MAAA,CAAO,SAAA;AAAA,MACV,GAAG,MAAA,CAAO,WAAA;AAAA,MACV,GAAI,OAAO,MAAA,CAAO,SAAS,QAAA,GAAW,MAAA,CAAO,OAAO;AAAC,KACtD,CAAA;AACD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,GAAA,CAAI,SAAS,QAAA,CAAS,MAAA;AACtB,MAAA,GAAA,CAAI,OAAO,EAAE,KAAA,EAAO,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,OAAA,EAAQ;AAC9D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA;AAChD,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,GAAA,EAAK,QAAQ,MAAM,CAAA;AAAA,IACpD,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,uBAAA,EAAyB;AAAA,QACtD,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI,KAAA;AAAA,QACjF,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,QAAQ,KAAA,CAAM;AAAA,OACf,CAAA;AAED,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,QAAA,IAAI,EAAE,YAAY,KAAA,CAAA,EAAQ;AAExB,UAAA,IAAI,SAAA,IAAa,KAAA,IAAS,KAAA,CAAM,OAAA,IAAW,OAAO,MAAM,OAAA,KAAY,QAAA,IAAY,QAAA,IAAY,KAAA,CAAM,OAAA,EAAS;AACzG,YAAC,KAAA,CAAc,MAAA,GAAU,KAAA,CAAM,OAAA,CAAgB,MAAA;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,MAAM,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,GAAG,CAAA,EAAG;AACxC,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,CAAO,KAAA,EAAoB,GAAA,EAAc,MAAA,EAAuD;AAEpG,IAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AAEd,IAAA,MAAM,YAAA,GAAe,MAAM,YAAA,IAAgB,QAAA;AAG3C,IAAA,MAAM,UAAA,GACJ,iBAAiB,KAAA,GACb;AAAA,MACE,cAAA,EAAgB,mBAAA;AAAA,MAChB,eAAA,EAAiB,UAAA;AAAA,MACjB,UAAA,EAAY,YAAA;AAAA,MACZ,mBAAA,EAAqB;AAAA,KACvB,GACA;AAAA,MACE,cAAA,EAAgB;AAAA,KAClB;AAEN,IAAA,GAAA,CAAI,GAAA,CAAI,UAAU,GAAA,EAAK;AAAA,MACrB,GAAG,UAAA;AAAA,MACH,mBAAA,EAAqB;AAAA,KACtB,CAAA;AAED,IAAA,IAAI,YAAA,KAAiB,KAAA,IAAS,KAAA,CAAM,iBAAA,EAAmB;AACrD,MAAA,GAAA,CAAI,GAAA,CAAI,MAAM,iBAAiB,CAAA;AAAA,IACjC;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAA,YAAkB,cAAA,GAAiB,MAAA,GAAS,MAAA,CAAO,UAAA;AAC1E,IAAA,MAAM,MAAA,GAAS,eAAe,SAAA,EAAU;AAExC,IAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,MAAM;AACxB,MAAA,KAAK,MAAA,CAAO,OAAO,iBAAiB,CAAA;AAAA,IACtC,CAAC,CAAA;AAED,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AAEV,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAI,YAAA,KAAiB,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAChF,YAAA,GAAA,CAAI,GAAA,CAAI,MAAM,KAAK,CAAA;AACnB,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,EAAe,MAAA,IAAU,IAAA;AACnD,UAAA,MAAM,WAAA,GAAc,YAAA,GAAeC,+BAAA,CAAkB,KAAK,CAAA,GAAI,KAAA;AAC9D,UAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,YAAA,GAAA,CAAI,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC;;AAAA,CAAM,CAAA;AAAA,UAC1D,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,IAAI,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,WAAW,IAAI,GAAM,CAAA;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,4BAAA,EAA8B;AAAA,QAC3D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,OAClF,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,GAAA,CAAI,IAAI,GAAA,EAAI;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAoB,GAAA,EAA4C;AAC9E,IAAA,MAAM,SAAA,GAAa,GAAA,CAAI,MAAA,IAAU,EAAC;AAElC,IAAA,MAAM,WAAA,GAAcC,kCAAA,CAAsB,GAAA,CAAI,KAAA,IAAS,EAA8B,CAAA;AACrF,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,cAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,IAAU,KAAA,CAAM,MAAA,KAAW,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,OAAA,IAAW,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU;AAC9G,MAAA,MAAM,WAAA,GAAc,GAAA,CAAI,OAAA,CAAQ,cAAc,CAAA,IAAK,EAAA;AAEnD,MAAA,IAAI,WAAA,CAAY,QAAA,CAAS,qBAAqB,CAAA,EAAG;AAC/C,QAAA,IAAI;AACF,UAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,IAAA,CAAK,gBAAA,EAAkB,OAAA;AAChE,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,sBAAA,CAAuB,GAAA,EAAK,WAAW,CAAA;AAAA,QAC3D,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,qCAAA,EAAuC;AAAA,YACpE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,WAClF,CAAA;AAED,UAAA,IAAI,KAAA,YAAiB,SAAS,KAAA,CAAM,OAAA,CAAQ,aAAY,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1E,YAAA,MAAM,KAAA;AAAA,UACR;AACA,UAAA,cAAA,GAAiB;AAAA,YACf,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WACpD;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,cAAA,EAAe;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,sBAAA,CAAuB,KAAc,WAAA,EAAwD;AACnG,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,SAAkC,EAAC;AAEzC,MAAA,MAAMC,QAAA,GAAS,IAAIC,aAAA,CAAO;AAAA,QACxB,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,GAAA,CAAI,OAAA,CAAQ,cAAc;AAAA,SAC5C;AAAA,QACA,MAAA,EAAQ,WAAA,GAAc,EAAE,QAAA,EAAU,aAAY,GAAI;AAAA,OACnD,CAAA;AAED,MAAAD,QAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,SAAA,EAAmB,IAAA,KAAgC;AACpE,QAAA,MAAM,SAAmB,EAAC;AAC1B,QAAA,IAAI,aAAA,GAAgB,KAAA;AAEpB,QAAA,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AACjC,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,QACnB,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,EAAA,CAAG,SAAS,MAAM;AACrB,UAAA,aAAA,GAAgB,IAAA;AAChB,UAAA,MAAA,CAAO,IAAI,MAAM,CAAA,wBAAA,EAA2B,WAAA,GAAc,UAAU,WAAW,CAAA,OAAA,CAAA,GAAY,EAAE,CAAA,CAAE,CAAC,CAAA;AAAA,QAClG,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,EAAA,CAAG,OAAO,MAAM;AACnB,UAAA,IAAI,CAAC,aAAA,EAAe;AAClB,YAAA,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,UAC1C;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAED,MAAAA,QAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,SAAA,EAAmB,KAAA,KAAkB;AAEvD,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,QACtC,CAAA,CAAA,MAAQ;AACN,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,KAAA;AAAA,QACtB;AAAA,MACF,CAAC,CAAA;AAED,MAAAA,QAAA,CAAO,EAAA,CAAG,UAAU,MAAM;AACxB,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChB,CAAC,CAAA;AAED,MAAAA,QAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAiB;AACnC,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,CAAC,CAAA;AAGD,MAAA,GAAA,CAAI,GAAA,CAAI,KAAKA,QAAM,CAAA;AAAA,IACrB,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,YAAA,CAAa,KAAA,EAAoB,GAAA,EAAc,QAAiB,MAAA,EAAgC;AACpG,IAAA,MAAM,cAAA,GAAiB,MAAA,IAAU,IAAA,CAAK,MAAA,IAAU,EAAA;AAGhD,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,sBAAsB,MAAA,EAAQ;AACxE,MAAA,MAAM,iBAAkB,MAAA,CAAe,gBAAA;AACvC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AACzD,QAAA,GAAA,CAAI,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MACpB;AACA,MAAA,OAAQ,MAAA,CAAe,gBAAA;AAAA,IACzB;AAEA,IAAA,IAAI,KAAA,CAAM,iBAAiB,MAAA,EAAQ;AAGjC,MAAA,GAAA,CAAI,IAAA,GAAO,kBAAA;AACX,MAAA,GAAA,CAAI,IAAA,GAAO,WAAW,IAAA,IAAQ,MAAA,KAAW,SAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,MAAA;AAAA,IAC9E,CAAA,MAAA,IAAW,KAAA,CAAM,YAAA,KAAiB,QAAA,EAAU;AAC1C,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,GAAA,EAAK,MAAwC,CAAA;AAAA,IACxE,CAAA,MAAA,IAAW,KAAA,CAAM,YAAA,KAAiB,qBAAA,EAAuB;AAGvD,MAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AAEd,MAAA,MAAM,aAAA,GAAgB,MAAA;AACtB,MAAA,MAAM,UAAkC,EAAC;AACzC,MAAA,aAAA,CAAc,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC5C,QAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,MACjB,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,aAAA,CAAc,MAAA,EAAQ,OAAO,CAAA;AAE/C,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,SAAA,EAAU;AAE5C,QAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAiB;AACnC,UAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,mCAAA,EAAqC;AAAA,YAClE,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,EAAE,OAAA,EAAS,IAAI,OAAA,EAAS,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM,GAAI;AAAA,WAC5E,CAAA;AACD,UAAA,KAAK,MAAA,CAAO,OAAO,sBAAsB,CAAA;AAAA,QAC3C,CAAA;AACA,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA;AAEhC,QAAA,IAAI;AACF,UAAA,OAAO,IAAA,EAAM;AACX,YAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,YAAA,IAAI,IAAA,EAAM;AACV,YAAA,GAAA,CAAI,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,UACrB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,gCAAA,EAAkC;AAAA,YAC/D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,WAClF,CAAA;AAAA,QACH,CAAA,SAAE;AACA,UAAA,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,OAAA,EAAS,UAAU,CAAA;AAC/B,UAAA,GAAA,CAAI,IAAI,GAAA,EAAI;AAAA,QACd;AAAA,MACF,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,IAAI,GAAA,EAAI;AAAA,MACd;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,YAAA,KAAiB,UAAA,EAAY;AAG5C,MAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AAEd,MAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,UAAA,EAAY,iBAAgB,GAAI,MAAA;AAE1D,MAAA,IAAI;AAEF,QAAA,MAAM,SAAS,GAAA,CAAI,GAAA;AACnB,QAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAW;AAClC,UAAA,MAAA,CAAO,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAA;AAAA,QAC5B;AAGA,QAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,UAAA,EAAY,GAAG,eAAA,EAAgB;AAEzD,QAAA,MAAM,OAAO,SAAA,CAAU;AAAA,UACrB,GAAA,EAAK,IAAI,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,OAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,UAClD,QAAA,EAAU,CAAA,EAAG,cAAc,CAAA,EAAG,QAAQ,CAAA,CAAA;AAAA,UACtC,GAAA,EAAK,MAAA;AAAA,UACL,KAAK,GAAA,CAAI,GAAA;AAAA,UACT,SAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IAAI,OAAA,GAAU;AAAA,SACtD,CAAA;AAAA,MAEH,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa;AACxB,UAAA,GAAA,CAAI,IAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AAC7D,UAAA,GAAA,CAAI,GAAA,CAAI,GAAA;AAAA,YACN,KAAK,SAAA,CAAU;AAAA,cACb,OAAA,EAAS,KAAA;AAAA,cACT,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,uBAAA,EAAwB;AAAA,cACxD,EAAA,EAAI;AAAA,aACL;AAAA,WACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,YAAA,KAAiB,SAAA,EAAW;AAG3C,MAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AAEd,MAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,WAAA,EAAY,GAAI,MAAA;AAEzC,MAAA,IAAI;AAEF,QAAA,MAAM,SAAS,GAAA,CAAI,GAAA;AACnB,QAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAW;AAClC,UAAA,MAAA,CAAO,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAA;AAAA,QAC5B;AAEA,QAAA,MAAM,OAAO,QAAA,CAAS;AAAA,UACpB,GAAA,EAAK,IAAI,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,OAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,UAClD,OAAA,EAAS,CAAA,EAAG,cAAc,CAAA,EAAG,OAAO,CAAA,CAAA;AAAA,UACpC,WAAA,EAAa,CAAA,EAAG,cAAc,CAAA,EAAG,WAAW,CAAA,CAAA;AAAA,UAC5C,GAAA,EAAK,MAAA;AAAA,UACL,KAAK,GAAA,CAAI;AAAA,SACV,CAAA;AAAA,MAEH,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa;AACxB,UAAA,GAAA,CAAI,IAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AAC7D,UAAA,GAAA,CAAI,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,gCAAA,EAAkC,CAAC,CAAA;AAAA,QACzE;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,MAAA,GAAS,GAAA;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,GAAA,EAAU,KAAA,EAAoB,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAyB,EAAC,EAAkB;AAElH,IAAA,MAAM,MAAA,GAAS,WAAA,IAAe,IAAA,CAAK,MAAA,IAAU,EAAA;AAE7C,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,MAAM,CAAA,EAAG,MAAM,IAAI,CAAA,CAAA;AAGvC,IAAA,MAAM,OAAA,GAAU,QAAA;AAEhB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,uBAAA,CAAwB,GAAG,CAAA;AAC9C,IAAA,KAAA,CAAM,OAAO,IAAA,CAAK;AAAA,MAChB,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAAA,MACnC,UAAA,EAAY,IAAA,CAAK,iBAAA,CAAkB,OAAO;AAAA,KAC3C,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,IAAA,EAAsB;AAExC,IAAA,MAAM,iBAAA,GAAoB,WAAA;AAC1B,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,iBAAiB,CAAA;AAGtE,IAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAG9E,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,OAAA,CAAQ,IAAI,MAAA,CAAO,iBAAA,EAAmB,GAAG,CAAA,EAAG,SAAS,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA;AAEzG,IAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,IAAA,EAAwB;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,SAAS,KAAK,EAAC;AAC1C,IAAA,OAAO,QAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,uBAAA,GAAyC;AAC7C,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,uBAAA,EAAwB,EAAI;AAE7C,IAAA,MAAM,MAAA,GAAS,IAAA;AAEf,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,eAAe,2BAAA,CAA4B,KAAc,IAAA,EAAY;AAEhF,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,GAAG,CAAA;AACnC,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,KAAK,CAAA;AACzC,MAAA,MAAM,YAAA,GAAeE,4BAAA;AAAA,QACnB,IAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA,CAAO,eAAA,IAAmB,MAAA,CAAO,MAAA,CAAO,WAAU,EAAG;AAAA,OACvD;AACA,MAAA,MAAM,wBAAA,GAA2BC,2BAAA,CAAuB,IAAA,EAAM,MAAA,EAAQ,OAAO,qBAAqB,CAAA;AAClG,MAAA,MAAM,uBAAA,GAA0B,CAAC,CAAC,YAAA,EAAc,KAAA,CAAM,GAAA;AAEtD,MAAA,MAAM,0BAAA,GAA6B,IAAI,eAAA,EAAgB;AACvD,MAAA,MAAM,mBAAmB,MAAM;AAC7B,QAAA,0BAAA,CAA2B,KAAA,EAAM;AAAA,MACnC,CAAA;AACA,MAAA,MAAM,yBAAyB,MAAM;AACnC,QAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,aAAA,EAAe;AAC1B,UAAA,gBAAA,EAAiB;AAAA,QACnB;AAAA,MACF,CAAA;AAEA,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,sBAAsB,CAAA;AAC5C,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,sBAAsB,CAAA;AAE5C,MAAA,IAAI;AACF,QAAA,IAAI,4BAA4B,uBAAA,EAAyB;AACvD,UAAA,MAAM,WAAA,GAA2B;AAAA,YAC/B,MAAA,EAAS,YAAA,EAAc,KAAA,CAAM,MAAA,IAAU,MAAA;AAAA,YACvC,IAAA,EAAM,YAAA,EAAc,KAAA,CAAM,IAAA,IAAQ,IAAA;AAAA,YAClC,YAAA,EAAc,MAAA;AAAA,YACd,SAAS,YAAY;AAAA,YAAC,CAAA;AAAA,YACtB,YAAA,EAAc,cAAc,KAAA,CAAM,YAAA;AAAA,YAClC,kBAAA,EAAoB,cAAc,KAAA,CAAM,kBAAA;AAAA,YACxC,GAAA,EAAK,cAAc,KAAA,CAAM;AAAA,WAC3B;AAEA,UAAA,IAAI,wBAAA,EAA0B;AAC5B,YAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,cAAA,CAAe,WAAA,EAAa;AAAA,cACzD,IAAA;AAAA,cACA,MAAA;AAAA,cACA,WAAW,CAAA,IAAA,KAAQ,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAAA,cACjD,QAAA,EAAU,CAAA,IAAA,KAAS,GAAA,CAAI,KAAA,CAAiC,IAAI,CAAA;AAAA,cAC5D,cAAA,EAAgB,IAAI,KAAA,CAAM,cAAA;AAAA,cAC1B,OAAA,EAAST,cAAa,GAAG,CAAA;AAAA,cACzB,qBAAA,EAAuB,MAAMA,aAAAA,CAAa,GAAG;AAAA,aAC9C,CAAA;AAED,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,IAAI,UAAU,OAAA,EAAS;AACrB,gBAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAA,EAAG;AAC5D,kBAAA,GAAA,CAAI,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,gBACpB;AAAA,cACF;AACA,cAAA,IAAI,UAAU,KAAA,EAAO;AACnB,gBAAA,GAAA,CAAI,SAAS,SAAA,CAAU,MAAA;AACvB,gBAAA,GAAA,CAAI,IAAA,GAAO,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,EAAM;AACpC,gBAAA;AAAA,cACF;AAAA,YACF;AAEA,YAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,SAAA,EAAU,EAAG,IAAA;AAC9C,YAAA,IAAI,UAAA,EAAY;AACd,cAAA,MAAM,aAAA,GAAgB,MAAM,iBAAA,EAAkB;AAC9C,cAAA,IAAI,aAAA,EAAe;AACjB,gBAAA,MAAM,eAAA,GAAkB,GAAA,CAAI,KAAA,CAAM,cAAA,CAAe,IAAI,yBAAyB,CAAA;AAC9E,gBAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,oBAAA,CAAqB,WAAA,EAAa,iBAAiB,aAAa,CAAA;AAC/F,gBAAA,IAAI,eAAA,EAAiB;AACnB,kBAAA,GAAA,CAAI,SAAS,eAAA,CAAgB,MAAA;AAC7B,kBAAA,GAAA,CAAI,IAAA,GAAO;AAAA,oBACT,OAAO,eAAA,CAAgB,KAAA;AAAA,oBACvB,SAAS,eAAA,CAAgB;AAAA,mBAC3B;AACA,kBAAA;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAGA,UAAA,MAAM,QAAA,GAAW,MAAMG,2BAAA,CAAc,MAAA,CAAO,QAAQ,WAAA,EAAa,GAAA,CAAI,MAAM,cAAA,EAAgB;AAAA,YACzF,GAAI,YAAA,EAAc,MAAA,IAAU,EAAC;AAAA,YAC7B,GAAI,GAAA,CAAI,KAAA;AAAA,YACR,GAAI,OAAO,GAAA,CAAI,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,OAAA,CAAQ,IAAA,KAAS,IAAA,GAC5D,GAAA,CAAI,OAAA,CAAQ,OACb;AAAC,WACN,CAAA;AACD,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,GAAA,CAAI,SAAS,QAAA,CAAS,MAAA;AACtB,YAAA,GAAA,CAAI,OAAO,EAAE,KAAA,EAAO,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,OAAA,EAAQ;AAC9D,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,wBAAA;AAAA,UAC5B,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,GAAA,EAAM,GAAA,CAAI,IAAI,CAAA,EAAG,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,GAAG,CAAA,CAAA;AAAA,UAC1D,GAAA,CAAI,MAAA;AAAA,UACJ,GAAA,CAAI,OAAA;AAAA,UACJ,IAAI,OAAA,CAAQ,IAAA;AAAA,UACZ,IAAI,KAAA,CAAM,cAAA;AAAA,UACV,0BAAA,CAA2B;AAAA,SAC7B;AACA,QAAA,IAAI,CAAC,QAAA,EAAU,OAAO,IAAA,EAAK;AAC3B,QAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AACd,QAAA,MAAM,OAAO,wBAAA,CAAyB,QAAA,EAAU,GAAA,CAAI,GAAA,EAAK,2BAA2B,MAAM,CAAA;AAAA,MAC5F,CAAA,SAAE;AACA,QAAA,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,OAAA,EAAS,sBAAsB,CAAA;AAC3C,QAAA,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,OAAA,EAAS,sBAAsB,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,yBAAA,GAAkC;AAChC,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,uBAAA,EAAyB,CAAA;AAAA,EAC7C;AAAA,EAEA,sBAAA,GAA+B;AAAA,EAG/B;AAAA,EAEA,6BAAA,GAAsC;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,EAAmB,OAAA,EAAS;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA;AAEf,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,eAAe,gBAAA,CAAiB,KAAc,IAAA,EAAY;AACrE,MAAA,IAAI,CAAC,MAAA,CAAO,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA,EAAG;AACtC,QAAA,OAAO,IAAA,EAAK;AAAA,MACd;AAEA,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,MAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,MAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AAEjB,MAAA,MAAM,IAAA,EAAK;AAEX,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC9B,MAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,iBAAA,EAAmB,KAAA,IAAS,MAAA;AAEjD,MAAA,MAAM,OAAA,GAA+B;AAAA,QACnC,MAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA,EAAU,GAAG,QAAQ,CAAA,EAAA;AAAA,OACvB;AAEA,MAAA,IAAI,MAAA,CAAO,mBAAmB,kBAAA,EAAoB;AAChD,QAAA,OAAA,CAAQ,QAAQ,GAAA,CAAI,KAAA;AAAA,MACtB;AAEA,MAAA,IAAI,MAAA,CAAO,mBAAmB,cAAA,EAAgB;AAC5C,QAAA,MAAM,OAAA,GAAU,EAAE,GAAG,GAAA,CAAI,OAAA,EAAQ;AACjC,QAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,iBAAA,CAAkB,aAAA,IAAiB,EAAC;AACjE,QAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,KAAc;AACnC,UAAA,MAAM,GAAA,GAAM,EAAE,WAAA,EAAY;AAC1B,UAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,KAAM,MAAA,EAAW;AAC9B,YAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,YAAA;AAAA,UACjB;AAAA,QACF,CAAC,CAAA;AACD,QAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAAA,MACpB;AAEA,MAAA,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,CAAA,EAAM,OAAO,CAAA;AAAA,IAC3E,CAAC,CAAA;AAAA,EACH;AACF","file":"index.cjs","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { Context, Middleware, Next } from 'koa';\n\nexport interface KoaAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nfunction toWebRequest(ctx: Context): globalThis.Request {\n const protocol = ctx.protocol || 'http';\n const host = ctx.host || 'localhost';\n const url = `${protocol}://${host}${ctx.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(ctx.headers)) {\n if (!value) continue;\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n return new globalThis.Request(url, {\n method: ctx.method,\n headers,\n });\n}\n\nexport function createAuthMiddleware({ mastra, requiresAuth = true }: KoaAuthMiddlewareOptions): Middleware {\n return async (ctx: Context, next: Next) => {\n if (!requiresAuth) {\n await next();\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n await next();\n return;\n }\n\n ctx.state.requestContext ??= new RequestContext();\n ctx.state.mastra ??= mastra;\n\n const path = String(ctx.path || '/');\n const method = String(ctx.method || 'GET');\n const customRouteAuthConfig = new Map<string, boolean>(ctx.state.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = ctx.headers.authorization;\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token) {\n token = (ctx.query.apiKey as string) || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext: ctx.state.requestContext,\n rawRequest: toWebRequest(ctx),\n token,\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (result.action === 'next') {\n await next();\n return;\n }\n\n ctx.status = result.status;\n ctx.body = result.body;\n };\n}\n","import { Busboy } from '@fastify/busboy';\nimport type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\nimport { findMatchingCustomRoute, isProtectedCustomRoute } from '@mastra/server/auth';\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type Koa from 'koa';\nimport type { Context, Middleware, Next } from 'koa';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { KoaAuthMiddlewareOptions } from './auth-middleware';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\ntype RegisteredKoaRoute = {\n route: ServerRoute;\n prefix: string;\n koaPath: string;\n pathRegex: RegExp;\n paramNames: string[];\n};\ntype RouteDispatcherGroup = {\n routes: RegisteredKoaRoute[];\n stackLengthAfterRegistration: number;\n};\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/koa] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n/**\n * Convert Koa context to Web API Request for cookie-based auth providers.\n */\nfunction toWebRequest(ctx: Context): globalThis.Request {\n const protocol = ctx.protocol || 'http';\n const host = ctx.host || 'localhost';\n const url = `${protocol}://${host}${ctx.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(ctx.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n }\n\n return new globalThis.Request(url, {\n method: ctx.method,\n headers,\n });\n}\n\n// Extend Koa types to include Mastra context\ndeclare module 'koa' {\n interface DefaultState {\n mastra: Mastra;\n requestContext: RequestContext;\n tools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n }\n interface Request {\n body?: unknown;\n }\n}\n\nexport class MastraServer extends MastraServerBase<Koa, Context, Context> {\n private readonly activeRouteDispatchers = new WeakMap<Koa, RouteDispatcherGroup>();\n\n async init() {\n this.registerErrorMiddleware();\n await super.init();\n }\n\n /**\n * Register a global error-handling middleware at the top of the middleware chain.\n * This acts as a safety net for errors that propagate past route handlers\n * (e.g., from auth middleware, context middleware, or when route handlers re-throw).\n *\n * When `server.onError` is configured, calls it and uses the response.\n * Otherwise provides a default JSON error response.\n *\n * Errors are emitted on the app for logging (Koa convention) but NOT re-thrown,\n * so this middleware is the final error boundary. Users who need custom error handling\n * should use `server.onError` or register their own middleware between this and the routes.\n */\n private registerErrorMiddleware(): void {\n const server = this;\n\n this.app.use(async function mastraErrorBoundary(ctx: Context, next: Next) {\n try {\n await next();\n } catch (err) {\n // Try onError first (may have already been called in registerRoute,\n // but this catches errors from other middleware too)\n if (await server.handleOnError(err, ctx)) {\n return;\n }\n\n // Default error handling\n const error = err instanceof Error ? err : new Error(String(err));\n let status = 500;\n if (err && typeof err === 'object') {\n if ('status' in err) {\n status = (err as any).status;\n } else if (\n 'details' in err &&\n (err as any).details &&\n typeof (err as any).details === 'object' &&\n 'status' in (err as any).details\n ) {\n status = (err as any).details.status;\n }\n }\n ctx.status = status;\n ctx.body = { error: error.message || 'Unknown error' };\n\n // Emit the error for logging (standard Koa pattern) but don't re-throw\n // since this middleware is the final error boundary.\n ctx.app.emit('error', err, ctx);\n }\n });\n }\n\n /**\n * Try to handle an error using the `server.onError` hook.\n * Creates a minimal context shim compatible with the Hono-style onError signature.\n *\n * @returns true if the error was handled and the response was set on ctx\n */\n private async handleOnError(err: unknown, ctx: Context): Promise<boolean> {\n // Guard against double invocation (route catch → re-throw → error middleware)\n if ((ctx as any)._mastraOnErrorAttempted) return false;\n (ctx as any)._mastraOnErrorAttempted = true;\n\n const onError = this.mastra.getServer()?.onError;\n if (!onError) return false;\n\n const error = err instanceof Error ? err : new Error(String(err));\n\n // Create a minimal context shim compatible with the onError signature\n const shimContext = {\n json: (data: unknown, status: number = 200) =>\n new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json' },\n }),\n req: {\n path: ctx.path,\n method: ctx.method,\n header: (name: string) => {\n const value = ctx.headers[name.toLowerCase()];\n if (Array.isArray(value)) return value.join(', ');\n return value;\n },\n url: ctx.url,\n },\n };\n\n try {\n const response = await onError(error, shimContext as any);\n // Apply the Response from onError to the Koa context\n ctx.status = response.status;\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n ctx.body = await response.json();\n } else {\n ctx.body = await response.text();\n }\n return true;\n } catch (onErrorErr) {\n this.mastra.getLogger()?.error('Error in custom onError handler', {\n error: onErrorErr instanceof Error ? { message: onErrorErr.message, stack: onErrorErr.stack } : onErrorErr,\n });\n return false;\n }\n }\n\n createContextMiddleware(): Middleware {\n const server = this;\n\n return async function mastraRequestContext(ctx: Context, next: Next) {\n // Parse request context from request body and add to context\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n const contentType = ctx.headers['content-type'];\n if (contentType?.includes('application/json') && ctx.request.body) {\n const body = ctx.request.body as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (ctx.method === 'GET') {\n try {\n const query = ctx.query;\n const encodedRequestContext = query.requestContext;\n if (typeof encodedRequestContext === 'string') {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = server.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n server.applyRequestMetadataToContext({\n requestContext,\n getHeader: name => ctx.get(name),\n });\n\n // Set context in state object\n ctx.state.requestContext = requestContext;\n ctx.state.mastra = server.mastra;\n ctx.state.tools = server.tools || {};\n if (server.taskStore) {\n ctx.state.taskStore = server.taskStore;\n }\n ctx.state.customRouteAuthConfig = server.customRouteAuthConfig;\n\n // Create abort controller for request cancellation\n const controller = new AbortController();\n ctx.req.on('close', () => {\n // Only abort if the response wasn't successfully completed\n if (!ctx.res.writableEnded) {\n controller.abort();\n }\n });\n ctx.state.abortSignal = controller.signal;\n\n await next();\n };\n }\n\n private getRouteDispatcherGroup(app: Koa): RouteDispatcherGroup {\n // The dispatcher-reuse optimization needs to observe app.middleware.length\n // to detect when other middleware was registered between our route\n // registrations (in which case we must start a new dispatcher group to\n // preserve middleware ordering). Subclasses may pass an app-like object\n // (e.g., a koa-router or a mounted sub-app) that only exposes `use` and\n // has no `middleware` array. In that case, skip reuse and register a fresh\n // dispatcher per call — equivalent to the pre-1.5.0 per-route behavior.\n const middlewareStack = (app as { middleware?: unknown }).middleware;\n const supportsReuse = Array.isArray(middlewareStack);\n\n if (supportsReuse) {\n const activeGroup = this.activeRouteDispatchers.get(app);\n if (activeGroup && middlewareStack.length === activeGroup.stackLengthAfterRegistration) {\n return activeGroup;\n }\n }\n\n const group: RouteDispatcherGroup = {\n routes: [],\n stackLengthAfterRegistration: 0,\n };\n app.use(this.createRouteDispatcherMiddleware(group));\n\n if (supportsReuse) {\n group.stackLengthAfterRegistration = (app as { middleware: unknown[] }).middleware.length;\n this.activeRouteDispatchers.set(app, group);\n }\n\n return group;\n }\n\n private createRouteDispatcherMiddleware(group: RouteDispatcherGroup): Middleware {\n const server = this;\n\n return async function mastraRouteDispatcher(ctx: Context, next: Next) {\n const matchedRoute = server.findRegisteredRoute(group.routes, ctx);\n\n if (!matchedRoute) {\n await next();\n return;\n }\n\n await server.handleMatchedRoute(matchedRoute, ctx);\n };\n }\n\n private findRegisteredRoute(routes: RegisteredKoaRoute[], ctx: Context): RegisteredKoaRoute | undefined {\n const method = ctx.method.toUpperCase();\n\n for (const registeredRoute of routes) {\n if (\n registeredRoute.route.method.toUpperCase() !== 'ALL' &&\n method !== registeredRoute.route.method.toUpperCase()\n ) {\n continue;\n }\n\n const match = registeredRoute.pathRegex.exec(ctx.path);\n if (!match) {\n continue;\n }\n\n ctx.params = {};\n registeredRoute.paramNames.forEach((name, index) => {\n ctx.params[name] = match[index + 1];\n });\n\n return registeredRoute;\n }\n\n return undefined;\n }\n\n private async handleMatchedRoute(registeredRoute: RegisteredKoaRoute, ctx: Context): Promise<void> {\n const { route, prefix } = registeredRoute;\n\n const authError = await this.checkRouteAuth(route, {\n path: String(ctx.path || '/'),\n method: String(ctx.method || 'GET'),\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => (ctx.query as Record<string, string>)[name],\n requestContext: ctx.state.requestContext,\n request: toWebRequest(ctx),\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (authError) {\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n ctx.set(key, value);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authError.error) {\n ctx.status = authError.status;\n ctx.body = { error: authError.error };\n return;\n }\n }\n\n const params = await this.getParams(route, ctx);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed multipart data)\n if (params.bodyParseError) {\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n };\n return;\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'query');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n if (params.body) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'body');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'path');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: ctx.state.requestContext,\n mastra: this.mastra,\n tools: ctx.state.tools,\n taskStore: ctx.state.taskStore,\n abortSignal: ctx.state.abortSignal,\n routePrefix: prefix,\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.state.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);\n\n if (permissionError) {\n ctx.status = permissionError.status;\n ctx.body = {\n error: permissionError.error,\n message: permissionError.message,\n };\n return;\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, ctx.state.requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n ctx.status = fgaError.status;\n ctx.body = { error: fgaError.error, message: fgaError.message };\n return;\n }\n\n try {\n const result = await route.handler(handlerParams);\n await this.sendResponse(route, ctx, result, prefix);\n } catch (error) {\n this.mastra.getLogger()?.error('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n // Attach status code to the error for upstream middleware\n if (error && typeof error === 'object') {\n if (!('status' in error)) {\n // Check for MastraError with status in details\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n (error as any).status = (error.details as any).status;\n }\n }\n }\n\n // Try to call server.onError if configured\n if (await this.handleOnError(error, ctx)) {\n return;\n }\n\n // Re-throw so the error propagates up Koa's middleware chain\n throw error;\n }\n }\n\n async stream(route: ServerRoute, ctx: Context, result: { fullStream: ReadableStream }): Promise<void> {\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const streamFormat = route.streamFormat || 'stream';\n\n // Set status and headers via ctx.res directly since we're bypassing Koa's response\n const sseHeaders =\n streamFormat === 'sse'\n ? {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n }\n : {\n 'Content-Type': 'text/plain',\n };\n\n ctx.res.writeHead(200, {\n ...sseHeaders,\n 'Transfer-Encoding': 'chunked',\n });\n\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n ctx.res.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n ctx.res.on('close', () => {\n void reader.cancel('request aborted');\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n ctx.res.write(value);\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n if (streamFormat === 'sse') {\n ctx.res.write(`data: ${JSON.stringify(outputValue)}\\n\\n`);\n } else {\n ctx.res.write(JSON.stringify(outputValue) + '\\x1E');\n }\n }\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n ctx.res.end();\n }\n }\n\n async getParams(route: ServerRoute, ctx: Context): Promise<ParsedRequestParams> {\n const urlParams = (ctx.params || {}) as Record<string, string>;\n // Koa's ctx.query is ParsedUrlQuery which is Record<string, string | string[]>\n const queryParams = normalizeQueryParams((ctx.query || {}) as Record<string, unknown>);\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = ctx.headers['content-type'] || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const maxFileSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n body = await this.parseMultipartFormData(ctx, maxFileSize);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors, let others fall through to validation\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else {\n body = ctx.request.body;\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse multipart/form-data using @fastify/busboy.\n * Converts file uploads to Buffers and parses JSON field values.\n *\n * @param ctx - The Koa context object\n * @param maxFileSize - Optional maximum file size in bytes\n */\n private parseMultipartFormData(ctx: Context, maxFileSize?: number): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const result: Record<string, unknown> = {};\n\n const busboy = new Busboy({\n headers: {\n 'content-type': ctx.headers['content-type'] as string,\n },\n limits: maxFileSize ? { fileSize: maxFileSize } : undefined,\n });\n\n busboy.on('file', (fieldname: string, file: NodeJS.ReadableStream) => {\n const chunks: Buffer[] = [];\n let limitExceeded = false;\n\n file.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n file.on('limit', () => {\n limitExceeded = true;\n reject(new Error(`File size limit exceeded${maxFileSize ? ` (max: ${maxFileSize} bytes)` : ''}`));\n });\n\n file.on('end', () => {\n if (!limitExceeded) {\n result[fieldname] = Buffer.concat(chunks);\n }\n });\n });\n\n busboy.on('field', (fieldname: string, value: string) => {\n // Try to parse JSON strings (like 'options')\n try {\n result[fieldname] = JSON.parse(value);\n } catch {\n result[fieldname] = value;\n }\n });\n\n busboy.on('finish', () => {\n resolve(result);\n });\n\n busboy.on('error', (error: Error) => {\n reject(error);\n });\n\n // Pipe the raw request to busboy\n ctx.req.pipe(busboy);\n });\n }\n\n async sendResponse(route: ServerRoute, ctx: Context, result: unknown, prefix?: string): Promise<void> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n ctx.set(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n // Explicitly set content-type and handle null/undefined to ensure proper JSON response\n // Koa sets 204 No Content when body is null, but we want to return JSON null\n ctx.type = 'application/json';\n ctx.body = result === null || result === undefined ? JSON.stringify(null) : result;\n } else if (route.responseType === 'stream') {\n await this.stream(route, ctx, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n // Handle AI SDK Response objects - pipe Response.body to Koa response\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const fetchResponse = result as globalThis.Response;\n const headers: Record<string, string> = {};\n fetchResponse.headers.forEach((value, key) => {\n headers[key] = value;\n });\n ctx.res.writeHead(fetchResponse.status, headers);\n\n if (fetchResponse.body) {\n const reader = fetchResponse.body.getReader();\n\n const onResError = (err: unknown) => {\n this.mastra.getLogger()?.error('Error writing datastream response', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n void reader.cancel('response write error');\n };\n ctx.res.once('error', onResError);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n ctx.res.write(value);\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in datastream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n ctx.res.off('error', onResError);\n ctx.res.end();\n }\n } else {\n ctx.res.end();\n }\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n try {\n // Attach parsed body to raw request so MCP server's readJsonBody can use it\n const rawReq = ctx.req as typeof ctx.req & { body?: unknown };\n if (ctx.request.body !== undefined) {\n rawReq.body = ctx.request.body;\n }\n\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n await server.startHTTP({\n url: new URL(ctx.url, `http://${ctx.headers.host}`),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req: rawReq,\n res: ctx.res,\n options: Object.keys(options).length > 0 ? options : undefined,\n });\n // Response handled by startHTTP\n } catch {\n if (!ctx.res.headersSent) {\n ctx.res.writeHead(500, { 'Content-Type': 'application/json' });\n ctx.res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n }),\n );\n }\n }\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n // Attach parsed body to raw request so MCP server's readJsonBody can use it\n const rawReq = ctx.req as typeof ctx.req & { body?: unknown };\n if (ctx.request.body !== undefined) {\n rawReq.body = ctx.request.body;\n }\n\n await server.startSSE({\n url: new URL(ctx.url, `http://${ctx.headers.host}`),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req: rawReq,\n res: ctx.res,\n });\n // Response handled by startSSE\n } catch {\n if (!ctx.res.headersSent) {\n ctx.res.writeHead(500, { 'Content-Type': 'application/json' });\n ctx.res.end(JSON.stringify({ error: 'Error handling MCP SSE request' }));\n }\n }\n } else {\n ctx.status = 500;\n }\n }\n\n async registerRoute(app: Koa, route: ServerRoute, { prefix: prefixParam }: { prefix?: string } = {}): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n const fullPath = `${prefix}${route.path}`;\n\n // Convert Express-style :param to Koa-style :param (they're the same)\n const koaPath = fullPath;\n\n const group = this.getRouteDispatcherGroup(app);\n group.routes.push({\n route,\n prefix,\n koaPath,\n pathRegex: this.pathToRegex(koaPath),\n paramNames: this.extractParamNames(koaPath),\n });\n }\n\n /**\n * Convert Express-style path to regex for matching\n */\n private pathToRegex(path: string): RegExp {\n // First replace :param with a placeholder that won't be affected by escaping\n const PARAM_PLACEHOLDER = '\\x00PARAM\\x00';\n const pathWithPlaceholders = path.replace(/:[^/]+/g, PARAM_PLACEHOLDER);\n\n // Escape all regex meta-characters so the path is treated literally\n const escapedPath = pathWithPlaceholders.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // Replace placeholders with capture groups and escape forward slashes\n const regexPath = escapedPath.replace(new RegExp(PARAM_PLACEHOLDER, 'g'), '([^/]+)').replace(/\\//g, '\\\\/');\n\n return new RegExp(`^${regexPath}$`);\n }\n\n /**\n * Extract parameter names from path\n */\n private extractParamNames(path: string): string[] {\n const matches = path.match(/:[^/]+/g) || [];\n return matches.map(m => m.slice(1)); // Remove the leading ':'\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n const server = this;\n\n this.app.use(async function mastraCustomRouteDispatcher(ctx: Context, next: Next) {\n // Check if this request matches a protected custom route and run auth\n const path = String(ctx.path || '/');\n const method = String(ctx.method || 'GET');\n const matchedRoute = findMatchingCustomRoute(\n path,\n method,\n server.customApiRoutes ?? server.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, method, server.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n const customRouteAbortController = new AbortController();\n const abortCustomRoute = () => {\n customRouteAbortController.abort();\n };\n const abortCustomRouteIfOpen = () => {\n if (!ctx.res.writableEnded) {\n abortCustomRoute();\n }\n };\n\n ctx.res.once('close', abortCustomRouteIfOpen);\n ctx.res.once('error', abortCustomRouteIfOpen);\n\n try {\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? method) as any,\n path: matchedRoute?.route.path ?? path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: matchedRoute?.route.requiresAuth,\n requiresPermission: matchedRoute?.route.requiresPermission,\n fga: matchedRoute?.route.fga,\n };\n\n if (shouldRunCustomRouteAuth) {\n const authError = await server.checkRouteAuth(serverRoute, {\n path,\n method,\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => (ctx.query as Record<string, string>)[name],\n requestContext: ctx.state.requestContext,\n request: toWebRequest(ctx),\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (authError) {\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n ctx.set(key, value);\n }\n }\n if (authError.error) {\n ctx.status = authError.status;\n ctx.body = { error: authError.error };\n return;\n }\n }\n\n const authConfig = server.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.state.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = server.checkRoutePermission(serverRoute, userPermissions, hasPermission);\n if (permissionError) {\n ctx.status = permissionError.status;\n ctx.body = {\n error: permissionError.error,\n message: permissionError.message,\n };\n return;\n }\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(server.mastra, serverRoute, ctx.state.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(ctx.query as Record<string, string>),\n ...(typeof ctx.request.body === 'object' && ctx.request.body !== null\n ? (ctx.request.body as Record<string, unknown>)\n : {}),\n });\n if (fgaError) {\n ctx.status = fgaError.status;\n ctx.body = { error: fgaError.error, message: fgaError.message };\n return;\n }\n }\n\n const response = await server.handleCustomRouteRequest(\n `${ctx.protocol}://${ctx.host}${ctx.originalUrl || ctx.url}`,\n ctx.method,\n ctx.headers as Record<string, string | string[] | undefined>,\n ctx.request.body,\n ctx.state.requestContext,\n customRouteAbortController.signal,\n );\n if (!response) return next();\n ctx.respond = false;\n await server.writeCustomRouteResponse(response, ctx.res, customRouteAbortController.signal);\n } finally {\n ctx.res.off('close', abortCustomRouteIfOpen);\n ctx.res.off('error', abortCustomRouteIfOpen);\n }\n });\n }\n\n registerContextMiddleware(): void {\n this.app.use(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n const server = this;\n\n this.app.use(async function mastraHttpLogger(ctx: Context, next: Next) {\n if (!server.shouldLogRequest(ctx.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = ctx.method;\n const path = ctx.path;\n\n await next();\n\n const duration = Date.now() - start;\n const status = ctx.status;\n const level = server.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (server.httpLoggingConfig?.includeQueryParams) {\n logData.query = ctx.query;\n }\n\n if (server.httpLoggingConfig?.includeHeaders) {\n const headers = { ...ctx.headers };\n const redactHeaders = server.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach((h: string) => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n server.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/auth-middleware.ts","../src/index.ts"],"names":["RequestContext","coreAuthMiddleware","toWebRequest","MastraServerBase","isZodError","checkRouteFGA","redactStreamChunk","normalizeQueryParams","busboy","Busboy","findMatchingCustomRoute","isProtectedCustomRoute"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { Context, Middleware, Next } from 'koa';\n\nexport interface KoaAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nfunction toWebRequest(ctx: Context): globalThis.Request {\n const protocol = ctx.protocol || 'http';\n const host = ctx.host || 'localhost';\n const url = `${protocol}://${host}${ctx.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(ctx.headers)) {\n if (!value) continue;\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n return new globalThis.Request(url, {\n method: ctx.method,\n headers,\n });\n}\n\nexport function createAuthMiddleware({ mastra, requiresAuth = true }: KoaAuthMiddlewareOptions): Middleware {\n return async (ctx: Context, next: Next) => {\n if (!requiresAuth) {\n await next();\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n await next();\n return;\n }\n\n ctx.state.requestContext ??= new RequestContext();\n ctx.state.mastra ??= mastra;\n\n const path = String(ctx.path || '/');\n const method = String(ctx.method || 'GET');\n const customRouteAuthConfig = new Map<string, boolean>(ctx.state.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = ctx.headers.authorization;\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token) {\n token = (ctx.query.apiKey as string) || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext: ctx.state.requestContext,\n rawRequest: toWebRequest(ctx),\n token,\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (result.action === 'next') {\n await next();\n return;\n }\n\n ctx.status = result.status;\n ctx.body = result.body;\n };\n}\n","import { Busboy } from '@fastify/busboy';\nimport type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\nimport { findMatchingCustomRoute, isProtectedCustomRoute } from '@mastra/server/auth';\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type Koa from 'koa';\nimport type { Context, Middleware, Next } from 'koa';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { KoaAuthMiddlewareOptions } from './auth-middleware';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\ntype RegisteredKoaRoute = {\n route: ServerRoute;\n prefix: string;\n koaPath: string;\n pathRegex: RegExp;\n paramNames: string[];\n};\ntype RouteDispatcherGroup = {\n routes: RegisteredKoaRoute[];\n stackLengthAfterRegistration: number;\n};\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/koa] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n/**\n * Convert Koa context to Web API Request for cookie-based auth providers.\n */\nfunction toWebRequest(ctx: Context): globalThis.Request {\n const protocol = ctx.protocol || 'http';\n const host = ctx.host || 'localhost';\n const url = `${protocol}://${host}${ctx.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(ctx.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n }\n\n return new globalThis.Request(url, {\n method: ctx.method,\n headers,\n });\n}\n\n// Extend Koa types to include Mastra context\ndeclare module 'koa' {\n interface DefaultState {\n mastra: Mastra;\n requestContext: RequestContext;\n tools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n }\n interface Request {\n body?: unknown;\n }\n}\n\nexport class MastraServer extends MastraServerBase<Koa, Context, Context> {\n private readonly activeRouteDispatchers = new WeakMap<Koa, RouteDispatcherGroup>();\n\n async init() {\n this.registerErrorMiddleware();\n await super.init();\n }\n\n /**\n * Register a global error-handling middleware at the top of the middleware chain.\n * This acts as a safety net for errors that propagate past route handlers\n * (e.g., from auth middleware, context middleware, or when route handlers re-throw).\n *\n * When `server.onError` is configured, calls it and uses the response.\n * Otherwise provides a default JSON error response.\n *\n * Errors are emitted on the app for logging (Koa convention) but NOT re-thrown,\n * so this middleware is the final error boundary. Users who need custom error handling\n * should use `server.onError` or register their own middleware between this and the routes.\n */\n private registerErrorMiddleware(): void {\n const server = this;\n\n this.app.use(async function mastraErrorBoundary(ctx: Context, next: Next) {\n try {\n await next();\n } catch (err) {\n // Try onError first (may have already been called in registerRoute,\n // but this catches errors from other middleware too)\n if (await server.handleOnError(err, ctx)) {\n return;\n }\n\n // Default error handling\n const error = err instanceof Error ? err : new Error(String(err));\n let status = 500;\n if (err && typeof err === 'object') {\n if ('status' in err) {\n status = (err as any).status;\n } else if (\n 'details' in err &&\n (err as any).details &&\n typeof (err as any).details === 'object' &&\n 'status' in (err as any).details\n ) {\n status = (err as any).details.status;\n }\n }\n ctx.status = status;\n ctx.body = { error: error.message || 'Unknown error' };\n\n // Emit the error for logging (standard Koa pattern) but don't re-throw\n // since this middleware is the final error boundary.\n ctx.app.emit('error', err, ctx);\n }\n });\n }\n\n /**\n * Try to handle an error using the `server.onError` hook.\n * Creates a minimal context shim compatible with the Hono-style onError signature.\n *\n * @returns true if the error was handled and the response was set on ctx\n */\n private async handleOnError(err: unknown, ctx: Context): Promise<boolean> {\n // Guard against double invocation (route catch → re-throw → error middleware)\n if ((ctx as any)._mastraOnErrorAttempted) return false;\n (ctx as any)._mastraOnErrorAttempted = true;\n\n const onError = this.mastra.getServer()?.onError;\n if (!onError) return false;\n\n const error = err instanceof Error ? err : new Error(String(err));\n\n // Create a minimal context shim compatible with the onError signature\n const shimContext = {\n json: (data: unknown, status: number = 200) =>\n new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json' },\n }),\n req: {\n path: ctx.path,\n method: ctx.method,\n header: (name: string) => {\n const value = ctx.headers[name.toLowerCase()];\n if (Array.isArray(value)) return value.join(', ');\n return value;\n },\n url: ctx.url,\n },\n };\n\n try {\n const response = await onError(error, shimContext as any);\n // Apply the Response from onError to the Koa context\n ctx.status = response.status;\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n ctx.body = await response.json();\n } else {\n ctx.body = await response.text();\n }\n return true;\n } catch (onErrorErr) {\n this.mastra.getLogger()?.error('Error in custom onError handler', {\n error: onErrorErr instanceof Error ? { message: onErrorErr.message, stack: onErrorErr.stack } : onErrorErr,\n });\n return false;\n }\n }\n\n createContextMiddleware(): Middleware {\n const server = this;\n\n return async function mastraRequestContext(ctx: Context, next: Next) {\n // Parse request context from request body and add to context\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n const contentType = ctx.headers['content-type'];\n if (contentType?.includes('application/json') && ctx.request.body) {\n const body = ctx.request.body as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (ctx.method === 'GET') {\n try {\n const query = ctx.query;\n const encodedRequestContext = query.requestContext;\n if (typeof encodedRequestContext === 'string') {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = server.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n server.applyRequestMetadataToContext({\n requestContext,\n getHeader: name => ctx.get(name),\n });\n\n // Set context in state object\n ctx.state.requestContext = requestContext;\n ctx.state.mastra = server.mastra;\n ctx.state.tools = server.tools || {};\n if (server.taskStore) {\n ctx.state.taskStore = server.taskStore;\n }\n ctx.state.customRouteAuthConfig = server.customRouteAuthConfig;\n\n // Create abort controller for request cancellation\n const controller = new AbortController();\n ctx.req.on('close', () => {\n // Only abort if the response wasn't successfully completed\n if (!ctx.res.writableEnded) {\n controller.abort();\n }\n });\n ctx.state.abortSignal = controller.signal;\n\n await next();\n };\n }\n\n private getRouteDispatcherGroup(app: Koa): RouteDispatcherGroup {\n // The dispatcher-reuse optimization needs to observe app.middleware.length\n // to detect when other middleware was registered between our route\n // registrations (in which case we must start a new dispatcher group to\n // preserve middleware ordering). Subclasses may pass an app-like object\n // (e.g., a koa-router or a mounted sub-app) that only exposes `use` and\n // has no `middleware` array. In that case, skip reuse and register a fresh\n // dispatcher per call — equivalent to the pre-1.5.0 per-route behavior.\n const middlewareStack = (app as { middleware?: unknown }).middleware;\n const supportsReuse = Array.isArray(middlewareStack);\n\n if (supportsReuse) {\n const activeGroup = this.activeRouteDispatchers.get(app);\n if (activeGroup && middlewareStack.length === activeGroup.stackLengthAfterRegistration) {\n return activeGroup;\n }\n }\n\n const group: RouteDispatcherGroup = {\n routes: [],\n stackLengthAfterRegistration: 0,\n };\n app.use(this.createRouteDispatcherMiddleware(group));\n\n if (supportsReuse) {\n group.stackLengthAfterRegistration = (app as { middleware: unknown[] }).middleware.length;\n this.activeRouteDispatchers.set(app, group);\n }\n\n return group;\n }\n\n private createRouteDispatcherMiddleware(group: RouteDispatcherGroup): Middleware {\n const server = this;\n\n return async function mastraRouteDispatcher(ctx: Context, next: Next) {\n const matchedRoute = server.findRegisteredRoute(group.routes, ctx);\n\n if (!matchedRoute) {\n await next();\n return;\n }\n\n await server.handleMatchedRoute(matchedRoute, ctx);\n };\n }\n\n private findRegisteredRoute(routes: RegisteredKoaRoute[], ctx: Context): RegisteredKoaRoute | undefined {\n const method = ctx.method.toUpperCase();\n\n for (const registeredRoute of routes) {\n if (\n registeredRoute.route.method.toUpperCase() !== 'ALL' &&\n method !== registeredRoute.route.method.toUpperCase()\n ) {\n continue;\n }\n\n const match = registeredRoute.pathRegex.exec(ctx.path);\n if (!match) {\n continue;\n }\n\n ctx.params = {};\n registeredRoute.paramNames.forEach((name, index) => {\n ctx.params[name] = match[index + 1];\n });\n\n return registeredRoute;\n }\n\n return undefined;\n }\n\n private async handleMatchedRoute(registeredRoute: RegisteredKoaRoute, ctx: Context): Promise<void> {\n const { route, prefix } = registeredRoute;\n\n const authError = await this.checkRouteAuth(route, {\n path: String(ctx.path || '/'),\n method: String(ctx.method || 'GET'),\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => (ctx.query as Record<string, string>)[name],\n requestContext: ctx.state.requestContext,\n request: toWebRequest(ctx),\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (authError) {\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n ctx.set(key, value);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authError.error) {\n ctx.status = authError.status;\n ctx.body = { error: authError.error };\n return;\n }\n }\n\n const params = await this.getParams(route, ctx);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed multipart data)\n if (params.bodyParseError) {\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n };\n return;\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'query');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n if (params.body) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'body');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'path');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: ctx.state.requestContext,\n mastra: this.mastra,\n tools: ctx.state.tools,\n taskStore: ctx.state.taskStore,\n abortSignal: ctx.state.abortSignal,\n routePrefix: prefix,\n request: toWebRequest(ctx),\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const requestContext = ctx.state.requestContext;\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission, requestContext);\n\n if (permissionError) {\n ctx.status = permissionError.status;\n ctx.body = {\n error: permissionError.error,\n message: permissionError.message,\n };\n return;\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n ctx.status = fgaError.status;\n ctx.body = { error: fgaError.error, message: fgaError.message };\n return;\n }\n\n try {\n const result = await route.handler(handlerParams);\n await this.sendResponse(route, ctx, result, prefix);\n } catch (error) {\n this.mastra.getLogger()?.error('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n // Attach status code to the error for upstream middleware\n if (error && typeof error === 'object') {\n if (!('status' in error)) {\n // Check for MastraError with status in details\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n (error as any).status = (error.details as any).status;\n }\n }\n }\n\n // Try to call server.onError if configured\n if (await this.handleOnError(error, ctx)) {\n return;\n }\n\n // Re-throw so the error propagates up Koa's middleware chain\n throw error;\n }\n }\n\n async stream(route: ServerRoute, ctx: Context, result: { fullStream: ReadableStream }): Promise<void> {\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const streamFormat = route.streamFormat || 'stream';\n\n // Set status and headers via ctx.res directly since we're bypassing Koa's response\n const sseHeaders =\n streamFormat === 'sse'\n ? {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n }\n : {\n 'Content-Type': 'text/plain',\n };\n\n ctx.res.writeHead(200, {\n ...sseHeaders,\n 'Transfer-Encoding': 'chunked',\n });\n\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n ctx.res.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n ctx.res.on('close', () => {\n void reader.cancel('request aborted');\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n ctx.res.write(value);\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n if (streamFormat === 'sse') {\n ctx.res.write(`data: ${JSON.stringify(outputValue)}\\n\\n`);\n } else {\n ctx.res.write(JSON.stringify(outputValue) + '\\x1E');\n }\n }\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n ctx.res.end();\n }\n }\n\n async getParams(route: ServerRoute, ctx: Context): Promise<ParsedRequestParams> {\n const urlParams = (ctx.params || {}) as Record<string, string>;\n // Koa's ctx.query is ParsedUrlQuery which is Record<string, string | string[]>\n const queryParams = normalizeQueryParams((ctx.query || {}) as Record<string, unknown>);\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = ctx.headers['content-type'] || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const maxFileSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n body = await this.parseMultipartFormData(ctx, maxFileSize);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors, let others fall through to validation\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else {\n body = ctx.request.body;\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse multipart/form-data using @fastify/busboy.\n * Converts file uploads to Buffers and parses JSON field values.\n *\n * @param ctx - The Koa context object\n * @param maxFileSize - Optional maximum file size in bytes\n */\n private parseMultipartFormData(ctx: Context, maxFileSize?: number): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const result: Record<string, unknown> = {};\n\n const busboy = new Busboy({\n headers: {\n 'content-type': ctx.headers['content-type'] as string,\n },\n limits: maxFileSize ? { fileSize: maxFileSize } : undefined,\n });\n\n busboy.on('file', (fieldname: string, file: NodeJS.ReadableStream) => {\n const chunks: Buffer[] = [];\n let limitExceeded = false;\n\n file.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n file.on('limit', () => {\n limitExceeded = true;\n reject(new Error(`File size limit exceeded${maxFileSize ? ` (max: ${maxFileSize} bytes)` : ''}`));\n });\n\n file.on('end', () => {\n if (!limitExceeded) {\n result[fieldname] = Buffer.concat(chunks);\n }\n });\n });\n\n busboy.on('field', (fieldname: string, value: string) => {\n // Try to parse JSON strings (like 'options')\n try {\n result[fieldname] = JSON.parse(value);\n } catch {\n result[fieldname] = value;\n }\n });\n\n busboy.on('finish', () => {\n resolve(result);\n });\n\n busboy.on('error', (error: Error) => {\n reject(error);\n });\n\n // Pipe the raw request to busboy\n ctx.req.pipe(busboy);\n });\n }\n\n async sendResponse(route: ServerRoute, ctx: Context, result: unknown, prefix?: string): Promise<void> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n ctx.set(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n // Explicitly set content-type and handle null/undefined to ensure proper JSON response\n // Koa sets 204 No Content when body is null, but we want to return JSON null\n ctx.type = 'application/json';\n ctx.body = result === null || result === undefined ? JSON.stringify(null) : result;\n } else if (route.responseType === 'stream') {\n await this.stream(route, ctx, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n // Handle AI SDK Response objects - pipe Response.body to Koa response\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const fetchResponse = result as globalThis.Response;\n const headers: Record<string, string> = {};\n fetchResponse.headers.forEach((value, key) => {\n headers[key] = value;\n });\n ctx.res.writeHead(fetchResponse.status, headers);\n\n if (fetchResponse.body) {\n const reader = fetchResponse.body.getReader();\n\n const onResError = (err: unknown) => {\n this.mastra.getLogger()?.error('Error writing datastream response', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n void reader.cancel('response write error');\n };\n ctx.res.once('error', onResError);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n ctx.res.write(value);\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in datastream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n ctx.res.off('error', onResError);\n ctx.res.end();\n }\n } else {\n ctx.res.end();\n }\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n try {\n // Attach parsed body to raw request so MCP server's readJsonBody can use it\n const rawReq = ctx.req as typeof ctx.req & { body?: unknown };\n if (ctx.request.body !== undefined) {\n rawReq.body = ctx.request.body;\n }\n\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n await server.startHTTP({\n url: new URL(ctx.url, `http://${ctx.headers.host}`),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req: rawReq,\n res: ctx.res,\n options: Object.keys(options).length > 0 ? options : undefined,\n });\n // Response handled by startHTTP\n } catch {\n if (!ctx.res.headersSent) {\n ctx.res.writeHead(500, { 'Content-Type': 'application/json' });\n ctx.res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n }),\n );\n }\n }\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n // Attach parsed body to raw request so MCP server's readJsonBody can use it\n const rawReq = ctx.req as typeof ctx.req & { body?: unknown };\n if (ctx.request.body !== undefined) {\n rawReq.body = ctx.request.body;\n }\n\n await server.startSSE({\n url: new URL(ctx.url, `http://${ctx.headers.host}`),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req: rawReq,\n res: ctx.res,\n });\n // Response handled by startSSE\n } catch {\n if (!ctx.res.headersSent) {\n ctx.res.writeHead(500, { 'Content-Type': 'application/json' });\n ctx.res.end(JSON.stringify({ error: 'Error handling MCP SSE request' }));\n }\n }\n } else {\n ctx.status = 500;\n }\n }\n\n async registerRoute(app: Koa, route: ServerRoute, { prefix: prefixParam }: { prefix?: string } = {}): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n const fullPath = `${prefix}${route.path}`;\n\n // Convert Express-style :param to Koa-style :param (they're the same)\n const koaPath = fullPath;\n\n const group = this.getRouteDispatcherGroup(app);\n group.routes.push({\n route,\n prefix,\n koaPath,\n pathRegex: this.pathToRegex(koaPath),\n paramNames: this.extractParamNames(koaPath),\n });\n }\n\n /**\n * Convert Express-style path to regex for matching\n */\n private pathToRegex(path: string): RegExp {\n // First replace :param with a placeholder that won't be affected by escaping\n const PARAM_PLACEHOLDER = '\\x00PARAM\\x00';\n const pathWithPlaceholders = path.replace(/:[^/]+/g, PARAM_PLACEHOLDER);\n\n // Escape all regex meta-characters so the path is treated literally\n const escapedPath = pathWithPlaceholders.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // Replace placeholders with capture groups and escape forward slashes\n const regexPath = escapedPath.replace(new RegExp(PARAM_PLACEHOLDER, 'g'), '([^/]+)').replace(/\\//g, '\\\\/');\n\n return new RegExp(`^${regexPath}$`);\n }\n\n /**\n * Extract parameter names from path\n */\n private extractParamNames(path: string): string[] {\n const matches = path.match(/:[^/]+/g) || [];\n return matches.map(m => m.slice(1)); // Remove the leading ':'\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n const server = this;\n\n this.app.use(async function mastraCustomRouteDispatcher(ctx: Context, next: Next) {\n // Check if this request matches a protected custom route and run auth\n const path = String(ctx.path || '/');\n const method = String(ctx.method || 'GET');\n const matchedRoute = findMatchingCustomRoute(\n path,\n method,\n server.customApiRoutes ?? server.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, method, server.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n const customRouteAbortController = new AbortController();\n const abortCustomRoute = () => {\n customRouteAbortController.abort();\n };\n const abortCustomRouteIfOpen = () => {\n if (!ctx.res.writableEnded) {\n abortCustomRoute();\n }\n };\n\n ctx.res.once('close', abortCustomRouteIfOpen);\n ctx.res.once('error', abortCustomRouteIfOpen);\n\n try {\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? method) as any,\n path: matchedRoute?.route.path ?? path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: matchedRoute?.route.requiresAuth,\n requiresPermission: matchedRoute?.route.requiresPermission,\n fga: matchedRoute?.route.fga,\n };\n\n if (shouldRunCustomRouteAuth) {\n const authError = await server.checkRouteAuth(serverRoute, {\n path,\n method,\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => (ctx.query as Record<string, string>)[name],\n requestContext: ctx.state.requestContext,\n request: toWebRequest(ctx),\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (authError) {\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n ctx.set(key, value);\n }\n }\n\n if (authError.error) {\n ctx.status = authError.status;\n ctx.body = { error: authError.error };\n return;\n }\n }\n }\n\n const requestContext = ctx.state.requestContext;\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = server.mastra.getStudio()?.auth || server.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = server.checkRoutePermission(\n serverRoute,\n userPermissions,\n hasPermission,\n requestContext,\n );\n if (permissionError) {\n ctx.status = permissionError.status;\n ctx.body = {\n error: permissionError.error,\n message: permissionError.message,\n };\n return;\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(server.mastra, serverRoute, ctx.state.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(ctx.query as Record<string, string>),\n ...(typeof ctx.request.body === 'object' && ctx.request.body !== null\n ? (ctx.request.body as Record<string, unknown>)\n : {}),\n });\n if (fgaError) {\n ctx.status = fgaError.status;\n ctx.body = { error: fgaError.error, message: fgaError.message };\n return;\n }\n }\n\n const response = await server.handleCustomRouteRequest(\n `${ctx.protocol}://${ctx.host}${ctx.originalUrl || ctx.url}`,\n ctx.method,\n ctx.headers as Record<string, string | string[] | undefined>,\n ctx.request.body,\n ctx.state.requestContext,\n customRouteAbortController.signal,\n );\n if (!response) return next();\n ctx.respond = false;\n await server.writeCustomRouteResponse(response, ctx.res, customRouteAbortController.signal);\n } finally {\n ctx.res.off('close', abortCustomRouteIfOpen);\n ctx.res.off('error', abortCustomRouteIfOpen);\n }\n });\n }\n\n registerContextMiddleware(): void {\n this.app.use(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n const server = this;\n\n this.app.use(async function mastraHttpLogger(ctx: Context, next: Next) {\n if (!server.shouldLogRequest(ctx.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = ctx.method;\n const path = ctx.path;\n\n await next();\n\n const duration = Date.now() - start;\n const status = ctx.status;\n const level = server.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (server.httpLoggingConfig?.includeQueryParams) {\n logData.query = ctx.query;\n }\n\n if (server.httpLoggingConfig?.includeHeaders) {\n const headers = { ...ctx.headers };\n const redactHeaders = server.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach((h: string) => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n server.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACtF,OAAO,EACL,YAAY,IAAI,gBAAgB,EAKjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAuDlE,OAAO,QAAQ,KAAK,CAAC;IACnB,UAAU,YAAY;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,cAAc,EAAE,cAAc,CAAC;QAC/B,KAAK,EAAE,UAAU,CAAC;QAClB,WAAW,EAAE,WAAW,CAAC;QACzB,SAAS,EAAE,iBAAiB,CAAC;QAC7B,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9C;IACD,UAAU,OAAO;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB;CACF;AAED,qBAAa,YAAa,SAAQ,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC;IACvE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA4C;IAE7E,IAAI;IAKV;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,uBAAuB;IAsC/B;;;;;OAKG;YACW,aAAa;IAgD3B,uBAAuB,IAAI,UAAU;IAwErC,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,+BAA+B;IAevC,OAAO,CAAC,mBAAmB;YA2Bb,kBAAkB;IAsL1B,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE;QAAE,UAAU,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiE/F,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkC/E;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAqDxB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiI/F,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBnH;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKnB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAqH9C,yBAAyB,IAAI,IAAI;IAIjC,sBAAsB,IAAI,IAAI;IAK9B,6BAA6B,IAAI,IAAI;CAgDtC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACtF,OAAO,EACL,YAAY,IAAI,gBAAgB,EAKjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAuDlE,OAAO,QAAQ,KAAK,CAAC;IACnB,UAAU,YAAY;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,cAAc,EAAE,cAAc,CAAC;QAC/B,KAAK,EAAE,UAAU,CAAC;QAClB,WAAW,EAAE,WAAW,CAAC;QACzB,SAAS,EAAE,iBAAiB,CAAC;QAC7B,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9C;IACD,UAAU,OAAO;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB;CACF;AAED,qBAAa,YAAa,SAAQ,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC;IACvE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA4C;IAE7E,IAAI;IAKV;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,uBAAuB;IAsC/B;;;;;OAKG;YACW,aAAa;IAgD3B,uBAAuB,IAAI,UAAU;IAwErC,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,+BAA+B;IAevC,OAAO,CAAC,mBAAmB;YA2Bb,kBAAkB;IAyL1B,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE;QAAE,UAAU,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiE/F,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkC/E;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAqDxB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiI/F,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBnH;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKnB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IA6H9C,yBAAyB,IAAI,IAAI;IAIjC,sBAAsB,IAAI,IAAI;IAK9B,6BAA6B,IAAI,IAAI;CAgDtC"}
package/dist/index.js CHANGED
@@ -391,14 +391,16 @@ var MastraServer = class extends MastraServer$1 {
391
391
  tools: ctx.state.tools,
392
392
  taskStore: ctx.state.taskStore,
393
393
  abortSignal: ctx.state.abortSignal,
394
- routePrefix: prefix
394
+ routePrefix: prefix,
395
+ request: toWebRequest2(ctx)
395
396
  };
396
- const authConfig = this.mastra.getServer()?.auth;
397
- if (authConfig) {
397
+ const requestContext = ctx.state.requestContext;
398
+ const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;
399
+ if (hasAuth) {
398
400
  const hasPermission = await loadHasPermission();
399
401
  if (hasPermission) {
400
- const userPermissions = ctx.state.requestContext.get("mastra__userPermissions");
401
- const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);
402
+ const userPermissions = requestContext.get("mastra__userPermissions");
403
+ const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission, requestContext);
402
404
  if (permissionError) {
403
405
  ctx.status = permissionError.status;
404
406
  ctx.body = {
@@ -409,7 +411,7 @@ var MastraServer = class extends MastraServer$1 {
409
411
  }
410
412
  }
411
413
  }
412
- const fgaError = await checkRouteFGA(this.mastra, route, ctx.state.requestContext, {
414
+ const fgaError = await checkRouteFGA(this.mastra, route, requestContext, {
413
415
  ...params.urlParams,
414
416
  ...params.queryParams,
415
417
  ...typeof params.body === "object" ? params.body : {}
@@ -757,20 +759,26 @@ var MastraServer = class extends MastraServer$1 {
757
759
  return;
758
760
  }
759
761
  }
760
- const authConfig = server.mastra.getServer()?.auth;
761
- if (authConfig) {
762
- const hasPermission = await loadHasPermission();
763
- if (hasPermission) {
764
- const userPermissions = ctx.state.requestContext.get("mastra__userPermissions");
765
- const permissionError = server.checkRoutePermission(serverRoute, userPermissions, hasPermission);
766
- if (permissionError) {
767
- ctx.status = permissionError.status;
768
- ctx.body = {
769
- error: permissionError.error,
770
- message: permissionError.message
771
- };
772
- return;
773
- }
762
+ }
763
+ const requestContext = ctx.state.requestContext;
764
+ const hasAuth = server.mastra.getStudio()?.auth || server.mastra.getServer()?.auth;
765
+ if (hasAuth) {
766
+ const hasPermission = await loadHasPermission();
767
+ if (hasPermission) {
768
+ const userPermissions = requestContext.get("mastra__userPermissions");
769
+ const permissionError = server.checkRoutePermission(
770
+ serverRoute,
771
+ userPermissions,
772
+ hasPermission,
773
+ requestContext
774
+ );
775
+ if (permissionError) {
776
+ ctx.status = permissionError.status;
777
+ ctx.body = {
778
+ error: permissionError.error,
779
+ message: permissionError.message
780
+ };
781
+ return;
774
782
  }
775
783
  }
776
784
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth-middleware.ts","../src/index.ts"],"names":["toWebRequest","MastraServerBase"],"mappings":"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","file":"index.js","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { Context, Middleware, Next } from 'koa';\n\nexport interface KoaAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nfunction toWebRequest(ctx: Context): globalThis.Request {\n const protocol = ctx.protocol || 'http';\n const host = ctx.host || 'localhost';\n const url = `${protocol}://${host}${ctx.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(ctx.headers)) {\n if (!value) continue;\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n return new globalThis.Request(url, {\n method: ctx.method,\n headers,\n });\n}\n\nexport function createAuthMiddleware({ mastra, requiresAuth = true }: KoaAuthMiddlewareOptions): Middleware {\n return async (ctx: Context, next: Next) => {\n if (!requiresAuth) {\n await next();\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n await next();\n return;\n }\n\n ctx.state.requestContext ??= new RequestContext();\n ctx.state.mastra ??= mastra;\n\n const path = String(ctx.path || '/');\n const method = String(ctx.method || 'GET');\n const customRouteAuthConfig = new Map<string, boolean>(ctx.state.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = ctx.headers.authorization;\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token) {\n token = (ctx.query.apiKey as string) || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext: ctx.state.requestContext,\n rawRequest: toWebRequest(ctx),\n token,\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (result.action === 'next') {\n await next();\n return;\n }\n\n ctx.status = result.status;\n ctx.body = result.body;\n };\n}\n","import { Busboy } from '@fastify/busboy';\nimport type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\nimport { findMatchingCustomRoute, isProtectedCustomRoute } from '@mastra/server/auth';\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type Koa from 'koa';\nimport type { Context, Middleware, Next } from 'koa';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { KoaAuthMiddlewareOptions } from './auth-middleware';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\ntype RegisteredKoaRoute = {\n route: ServerRoute;\n prefix: string;\n koaPath: string;\n pathRegex: RegExp;\n paramNames: string[];\n};\ntype RouteDispatcherGroup = {\n routes: RegisteredKoaRoute[];\n stackLengthAfterRegistration: number;\n};\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/koa] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n/**\n * Convert Koa context to Web API Request for cookie-based auth providers.\n */\nfunction toWebRequest(ctx: Context): globalThis.Request {\n const protocol = ctx.protocol || 'http';\n const host = ctx.host || 'localhost';\n const url = `${protocol}://${host}${ctx.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(ctx.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n }\n\n return new globalThis.Request(url, {\n method: ctx.method,\n headers,\n });\n}\n\n// Extend Koa types to include Mastra context\ndeclare module 'koa' {\n interface DefaultState {\n mastra: Mastra;\n requestContext: RequestContext;\n tools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n }\n interface Request {\n body?: unknown;\n }\n}\n\nexport class MastraServer extends MastraServerBase<Koa, Context, Context> {\n private readonly activeRouteDispatchers = new WeakMap<Koa, RouteDispatcherGroup>();\n\n async init() {\n this.registerErrorMiddleware();\n await super.init();\n }\n\n /**\n * Register a global error-handling middleware at the top of the middleware chain.\n * This acts as a safety net for errors that propagate past route handlers\n * (e.g., from auth middleware, context middleware, or when route handlers re-throw).\n *\n * When `server.onError` is configured, calls it and uses the response.\n * Otherwise provides a default JSON error response.\n *\n * Errors are emitted on the app for logging (Koa convention) but NOT re-thrown,\n * so this middleware is the final error boundary. Users who need custom error handling\n * should use `server.onError` or register their own middleware between this and the routes.\n */\n private registerErrorMiddleware(): void {\n const server = this;\n\n this.app.use(async function mastraErrorBoundary(ctx: Context, next: Next) {\n try {\n await next();\n } catch (err) {\n // Try onError first (may have already been called in registerRoute,\n // but this catches errors from other middleware too)\n if (await server.handleOnError(err, ctx)) {\n return;\n }\n\n // Default error handling\n const error = err instanceof Error ? err : new Error(String(err));\n let status = 500;\n if (err && typeof err === 'object') {\n if ('status' in err) {\n status = (err as any).status;\n } else if (\n 'details' in err &&\n (err as any).details &&\n typeof (err as any).details === 'object' &&\n 'status' in (err as any).details\n ) {\n status = (err as any).details.status;\n }\n }\n ctx.status = status;\n ctx.body = { error: error.message || 'Unknown error' };\n\n // Emit the error for logging (standard Koa pattern) but don't re-throw\n // since this middleware is the final error boundary.\n ctx.app.emit('error', err, ctx);\n }\n });\n }\n\n /**\n * Try to handle an error using the `server.onError` hook.\n * Creates a minimal context shim compatible with the Hono-style onError signature.\n *\n * @returns true if the error was handled and the response was set on ctx\n */\n private async handleOnError(err: unknown, ctx: Context): Promise<boolean> {\n // Guard against double invocation (route catch → re-throw → error middleware)\n if ((ctx as any)._mastraOnErrorAttempted) return false;\n (ctx as any)._mastraOnErrorAttempted = true;\n\n const onError = this.mastra.getServer()?.onError;\n if (!onError) return false;\n\n const error = err instanceof Error ? err : new Error(String(err));\n\n // Create a minimal context shim compatible with the onError signature\n const shimContext = {\n json: (data: unknown, status: number = 200) =>\n new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json' },\n }),\n req: {\n path: ctx.path,\n method: ctx.method,\n header: (name: string) => {\n const value = ctx.headers[name.toLowerCase()];\n if (Array.isArray(value)) return value.join(', ');\n return value;\n },\n url: ctx.url,\n },\n };\n\n try {\n const response = await onError(error, shimContext as any);\n // Apply the Response from onError to the Koa context\n ctx.status = response.status;\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n ctx.body = await response.json();\n } else {\n ctx.body = await response.text();\n }\n return true;\n } catch (onErrorErr) {\n this.mastra.getLogger()?.error('Error in custom onError handler', {\n error: onErrorErr instanceof Error ? { message: onErrorErr.message, stack: onErrorErr.stack } : onErrorErr,\n });\n return false;\n }\n }\n\n createContextMiddleware(): Middleware {\n const server = this;\n\n return async function mastraRequestContext(ctx: Context, next: Next) {\n // Parse request context from request body and add to context\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n const contentType = ctx.headers['content-type'];\n if (contentType?.includes('application/json') && ctx.request.body) {\n const body = ctx.request.body as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (ctx.method === 'GET') {\n try {\n const query = ctx.query;\n const encodedRequestContext = query.requestContext;\n if (typeof encodedRequestContext === 'string') {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = server.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n server.applyRequestMetadataToContext({\n requestContext,\n getHeader: name => ctx.get(name),\n });\n\n // Set context in state object\n ctx.state.requestContext = requestContext;\n ctx.state.mastra = server.mastra;\n ctx.state.tools = server.tools || {};\n if (server.taskStore) {\n ctx.state.taskStore = server.taskStore;\n }\n ctx.state.customRouteAuthConfig = server.customRouteAuthConfig;\n\n // Create abort controller for request cancellation\n const controller = new AbortController();\n ctx.req.on('close', () => {\n // Only abort if the response wasn't successfully completed\n if (!ctx.res.writableEnded) {\n controller.abort();\n }\n });\n ctx.state.abortSignal = controller.signal;\n\n await next();\n };\n }\n\n private getRouteDispatcherGroup(app: Koa): RouteDispatcherGroup {\n // The dispatcher-reuse optimization needs to observe app.middleware.length\n // to detect when other middleware was registered between our route\n // registrations (in which case we must start a new dispatcher group to\n // preserve middleware ordering). Subclasses may pass an app-like object\n // (e.g., a koa-router or a mounted sub-app) that only exposes `use` and\n // has no `middleware` array. In that case, skip reuse and register a fresh\n // dispatcher per call — equivalent to the pre-1.5.0 per-route behavior.\n const middlewareStack = (app as { middleware?: unknown }).middleware;\n const supportsReuse = Array.isArray(middlewareStack);\n\n if (supportsReuse) {\n const activeGroup = this.activeRouteDispatchers.get(app);\n if (activeGroup && middlewareStack.length === activeGroup.stackLengthAfterRegistration) {\n return activeGroup;\n }\n }\n\n const group: RouteDispatcherGroup = {\n routes: [],\n stackLengthAfterRegistration: 0,\n };\n app.use(this.createRouteDispatcherMiddleware(group));\n\n if (supportsReuse) {\n group.stackLengthAfterRegistration = (app as { middleware: unknown[] }).middleware.length;\n this.activeRouteDispatchers.set(app, group);\n }\n\n return group;\n }\n\n private createRouteDispatcherMiddleware(group: RouteDispatcherGroup): Middleware {\n const server = this;\n\n return async function mastraRouteDispatcher(ctx: Context, next: Next) {\n const matchedRoute = server.findRegisteredRoute(group.routes, ctx);\n\n if (!matchedRoute) {\n await next();\n return;\n }\n\n await server.handleMatchedRoute(matchedRoute, ctx);\n };\n }\n\n private findRegisteredRoute(routes: RegisteredKoaRoute[], ctx: Context): RegisteredKoaRoute | undefined {\n const method = ctx.method.toUpperCase();\n\n for (const registeredRoute of routes) {\n if (\n registeredRoute.route.method.toUpperCase() !== 'ALL' &&\n method !== registeredRoute.route.method.toUpperCase()\n ) {\n continue;\n }\n\n const match = registeredRoute.pathRegex.exec(ctx.path);\n if (!match) {\n continue;\n }\n\n ctx.params = {};\n registeredRoute.paramNames.forEach((name, index) => {\n ctx.params[name] = match[index + 1];\n });\n\n return registeredRoute;\n }\n\n return undefined;\n }\n\n private async handleMatchedRoute(registeredRoute: RegisteredKoaRoute, ctx: Context): Promise<void> {\n const { route, prefix } = registeredRoute;\n\n const authError = await this.checkRouteAuth(route, {\n path: String(ctx.path || '/'),\n method: String(ctx.method || 'GET'),\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => (ctx.query as Record<string, string>)[name],\n requestContext: ctx.state.requestContext,\n request: toWebRequest(ctx),\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (authError) {\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n ctx.set(key, value);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authError.error) {\n ctx.status = authError.status;\n ctx.body = { error: authError.error };\n return;\n }\n }\n\n const params = await this.getParams(route, ctx);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed multipart data)\n if (params.bodyParseError) {\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n };\n return;\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'query');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n if (params.body) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'body');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'path');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: ctx.state.requestContext,\n mastra: this.mastra,\n tools: ctx.state.tools,\n taskStore: ctx.state.taskStore,\n abortSignal: ctx.state.abortSignal,\n routePrefix: prefix,\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.state.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);\n\n if (permissionError) {\n ctx.status = permissionError.status;\n ctx.body = {\n error: permissionError.error,\n message: permissionError.message,\n };\n return;\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, ctx.state.requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n ctx.status = fgaError.status;\n ctx.body = { error: fgaError.error, message: fgaError.message };\n return;\n }\n\n try {\n const result = await route.handler(handlerParams);\n await this.sendResponse(route, ctx, result, prefix);\n } catch (error) {\n this.mastra.getLogger()?.error('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n // Attach status code to the error for upstream middleware\n if (error && typeof error === 'object') {\n if (!('status' in error)) {\n // Check for MastraError with status in details\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n (error as any).status = (error.details as any).status;\n }\n }\n }\n\n // Try to call server.onError if configured\n if (await this.handleOnError(error, ctx)) {\n return;\n }\n\n // Re-throw so the error propagates up Koa's middleware chain\n throw error;\n }\n }\n\n async stream(route: ServerRoute, ctx: Context, result: { fullStream: ReadableStream }): Promise<void> {\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const streamFormat = route.streamFormat || 'stream';\n\n // Set status and headers via ctx.res directly since we're bypassing Koa's response\n const sseHeaders =\n streamFormat === 'sse'\n ? {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n }\n : {\n 'Content-Type': 'text/plain',\n };\n\n ctx.res.writeHead(200, {\n ...sseHeaders,\n 'Transfer-Encoding': 'chunked',\n });\n\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n ctx.res.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n ctx.res.on('close', () => {\n void reader.cancel('request aborted');\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n ctx.res.write(value);\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n if (streamFormat === 'sse') {\n ctx.res.write(`data: ${JSON.stringify(outputValue)}\\n\\n`);\n } else {\n ctx.res.write(JSON.stringify(outputValue) + '\\x1E');\n }\n }\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n ctx.res.end();\n }\n }\n\n async getParams(route: ServerRoute, ctx: Context): Promise<ParsedRequestParams> {\n const urlParams = (ctx.params || {}) as Record<string, string>;\n // Koa's ctx.query is ParsedUrlQuery which is Record<string, string | string[]>\n const queryParams = normalizeQueryParams((ctx.query || {}) as Record<string, unknown>);\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = ctx.headers['content-type'] || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const maxFileSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n body = await this.parseMultipartFormData(ctx, maxFileSize);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors, let others fall through to validation\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else {\n body = ctx.request.body;\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse multipart/form-data using @fastify/busboy.\n * Converts file uploads to Buffers and parses JSON field values.\n *\n * @param ctx - The Koa context object\n * @param maxFileSize - Optional maximum file size in bytes\n */\n private parseMultipartFormData(ctx: Context, maxFileSize?: number): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const result: Record<string, unknown> = {};\n\n const busboy = new Busboy({\n headers: {\n 'content-type': ctx.headers['content-type'] as string,\n },\n limits: maxFileSize ? { fileSize: maxFileSize } : undefined,\n });\n\n busboy.on('file', (fieldname: string, file: NodeJS.ReadableStream) => {\n const chunks: Buffer[] = [];\n let limitExceeded = false;\n\n file.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n file.on('limit', () => {\n limitExceeded = true;\n reject(new Error(`File size limit exceeded${maxFileSize ? ` (max: ${maxFileSize} bytes)` : ''}`));\n });\n\n file.on('end', () => {\n if (!limitExceeded) {\n result[fieldname] = Buffer.concat(chunks);\n }\n });\n });\n\n busboy.on('field', (fieldname: string, value: string) => {\n // Try to parse JSON strings (like 'options')\n try {\n result[fieldname] = JSON.parse(value);\n } catch {\n result[fieldname] = value;\n }\n });\n\n busboy.on('finish', () => {\n resolve(result);\n });\n\n busboy.on('error', (error: Error) => {\n reject(error);\n });\n\n // Pipe the raw request to busboy\n ctx.req.pipe(busboy);\n });\n }\n\n async sendResponse(route: ServerRoute, ctx: Context, result: unknown, prefix?: string): Promise<void> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n ctx.set(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n // Explicitly set content-type and handle null/undefined to ensure proper JSON response\n // Koa sets 204 No Content when body is null, but we want to return JSON null\n ctx.type = 'application/json';\n ctx.body = result === null || result === undefined ? JSON.stringify(null) : result;\n } else if (route.responseType === 'stream') {\n await this.stream(route, ctx, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n // Handle AI SDK Response objects - pipe Response.body to Koa response\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const fetchResponse = result as globalThis.Response;\n const headers: Record<string, string> = {};\n fetchResponse.headers.forEach((value, key) => {\n headers[key] = value;\n });\n ctx.res.writeHead(fetchResponse.status, headers);\n\n if (fetchResponse.body) {\n const reader = fetchResponse.body.getReader();\n\n const onResError = (err: unknown) => {\n this.mastra.getLogger()?.error('Error writing datastream response', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n void reader.cancel('response write error');\n };\n ctx.res.once('error', onResError);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n ctx.res.write(value);\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in datastream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n ctx.res.off('error', onResError);\n ctx.res.end();\n }\n } else {\n ctx.res.end();\n }\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n try {\n // Attach parsed body to raw request so MCP server's readJsonBody can use it\n const rawReq = ctx.req as typeof ctx.req & { body?: unknown };\n if (ctx.request.body !== undefined) {\n rawReq.body = ctx.request.body;\n }\n\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n await server.startHTTP({\n url: new URL(ctx.url, `http://${ctx.headers.host}`),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req: rawReq,\n res: ctx.res,\n options: Object.keys(options).length > 0 ? options : undefined,\n });\n // Response handled by startHTTP\n } catch {\n if (!ctx.res.headersSent) {\n ctx.res.writeHead(500, { 'Content-Type': 'application/json' });\n ctx.res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n }),\n );\n }\n }\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n // Attach parsed body to raw request so MCP server's readJsonBody can use it\n const rawReq = ctx.req as typeof ctx.req & { body?: unknown };\n if (ctx.request.body !== undefined) {\n rawReq.body = ctx.request.body;\n }\n\n await server.startSSE({\n url: new URL(ctx.url, `http://${ctx.headers.host}`),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req: rawReq,\n res: ctx.res,\n });\n // Response handled by startSSE\n } catch {\n if (!ctx.res.headersSent) {\n ctx.res.writeHead(500, { 'Content-Type': 'application/json' });\n ctx.res.end(JSON.stringify({ error: 'Error handling MCP SSE request' }));\n }\n }\n } else {\n ctx.status = 500;\n }\n }\n\n async registerRoute(app: Koa, route: ServerRoute, { prefix: prefixParam }: { prefix?: string } = {}): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n const fullPath = `${prefix}${route.path}`;\n\n // Convert Express-style :param to Koa-style :param (they're the same)\n const koaPath = fullPath;\n\n const group = this.getRouteDispatcherGroup(app);\n group.routes.push({\n route,\n prefix,\n koaPath,\n pathRegex: this.pathToRegex(koaPath),\n paramNames: this.extractParamNames(koaPath),\n });\n }\n\n /**\n * Convert Express-style path to regex for matching\n */\n private pathToRegex(path: string): RegExp {\n // First replace :param with a placeholder that won't be affected by escaping\n const PARAM_PLACEHOLDER = '\\x00PARAM\\x00';\n const pathWithPlaceholders = path.replace(/:[^/]+/g, PARAM_PLACEHOLDER);\n\n // Escape all regex meta-characters so the path is treated literally\n const escapedPath = pathWithPlaceholders.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // Replace placeholders with capture groups and escape forward slashes\n const regexPath = escapedPath.replace(new RegExp(PARAM_PLACEHOLDER, 'g'), '([^/]+)').replace(/\\//g, '\\\\/');\n\n return new RegExp(`^${regexPath}$`);\n }\n\n /**\n * Extract parameter names from path\n */\n private extractParamNames(path: string): string[] {\n const matches = path.match(/:[^/]+/g) || [];\n return matches.map(m => m.slice(1)); // Remove the leading ':'\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n const server = this;\n\n this.app.use(async function mastraCustomRouteDispatcher(ctx: Context, next: Next) {\n // Check if this request matches a protected custom route and run auth\n const path = String(ctx.path || '/');\n const method = String(ctx.method || 'GET');\n const matchedRoute = findMatchingCustomRoute(\n path,\n method,\n server.customApiRoutes ?? server.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, method, server.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n const customRouteAbortController = new AbortController();\n const abortCustomRoute = () => {\n customRouteAbortController.abort();\n };\n const abortCustomRouteIfOpen = () => {\n if (!ctx.res.writableEnded) {\n abortCustomRoute();\n }\n };\n\n ctx.res.once('close', abortCustomRouteIfOpen);\n ctx.res.once('error', abortCustomRouteIfOpen);\n\n try {\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? method) as any,\n path: matchedRoute?.route.path ?? path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: matchedRoute?.route.requiresAuth,\n requiresPermission: matchedRoute?.route.requiresPermission,\n fga: matchedRoute?.route.fga,\n };\n\n if (shouldRunCustomRouteAuth) {\n const authError = await server.checkRouteAuth(serverRoute, {\n path,\n method,\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => (ctx.query as Record<string, string>)[name],\n requestContext: ctx.state.requestContext,\n request: toWebRequest(ctx),\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (authError) {\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n ctx.set(key, value);\n }\n }\n if (authError.error) {\n ctx.status = authError.status;\n ctx.body = { error: authError.error };\n return;\n }\n }\n\n const authConfig = server.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.state.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = server.checkRoutePermission(serverRoute, userPermissions, hasPermission);\n if (permissionError) {\n ctx.status = permissionError.status;\n ctx.body = {\n error: permissionError.error,\n message: permissionError.message,\n };\n return;\n }\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(server.mastra, serverRoute, ctx.state.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(ctx.query as Record<string, string>),\n ...(typeof ctx.request.body === 'object' && ctx.request.body !== null\n ? (ctx.request.body as Record<string, unknown>)\n : {}),\n });\n if (fgaError) {\n ctx.status = fgaError.status;\n ctx.body = { error: fgaError.error, message: fgaError.message };\n return;\n }\n }\n\n const response = await server.handleCustomRouteRequest(\n `${ctx.protocol}://${ctx.host}${ctx.originalUrl || ctx.url}`,\n ctx.method,\n ctx.headers as Record<string, string | string[] | undefined>,\n ctx.request.body,\n ctx.state.requestContext,\n customRouteAbortController.signal,\n );\n if (!response) return next();\n ctx.respond = false;\n await server.writeCustomRouteResponse(response, ctx.res, customRouteAbortController.signal);\n } finally {\n ctx.res.off('close', abortCustomRouteIfOpen);\n ctx.res.off('error', abortCustomRouteIfOpen);\n }\n });\n }\n\n registerContextMiddleware(): void {\n this.app.use(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n const server = this;\n\n this.app.use(async function mastraHttpLogger(ctx: Context, next: Next) {\n if (!server.shouldLogRequest(ctx.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = ctx.method;\n const path = ctx.path;\n\n await next();\n\n const duration = Date.now() - start;\n const status = ctx.status;\n const level = server.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (server.httpLoggingConfig?.includeQueryParams) {\n logData.query = ctx.query;\n }\n\n if (server.httpLoggingConfig?.includeHeaders) {\n const headers = { ...ctx.headers };\n const redactHeaders = server.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach((h: string) => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n server.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/auth-middleware.ts","../src/index.ts"],"names":["toWebRequest","MastraServerBase"],"mappings":"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","file":"index.js","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { Context, Middleware, Next } from 'koa';\n\nexport interface KoaAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nfunction toWebRequest(ctx: Context): globalThis.Request {\n const protocol = ctx.protocol || 'http';\n const host = ctx.host || 'localhost';\n const url = `${protocol}://${host}${ctx.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(ctx.headers)) {\n if (!value) continue;\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n return new globalThis.Request(url, {\n method: ctx.method,\n headers,\n });\n}\n\nexport function createAuthMiddleware({ mastra, requiresAuth = true }: KoaAuthMiddlewareOptions): Middleware {\n return async (ctx: Context, next: Next) => {\n if (!requiresAuth) {\n await next();\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n await next();\n return;\n }\n\n ctx.state.requestContext ??= new RequestContext();\n ctx.state.mastra ??= mastra;\n\n const path = String(ctx.path || '/');\n const method = String(ctx.method || 'GET');\n const customRouteAuthConfig = new Map<string, boolean>(ctx.state.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = ctx.headers.authorization;\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token) {\n token = (ctx.query.apiKey as string) || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext: ctx.state.requestContext,\n rawRequest: toWebRequest(ctx),\n token,\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (result.action === 'next') {\n await next();\n return;\n }\n\n ctx.status = result.status;\n ctx.body = result.body;\n };\n}\n","import { Busboy } from '@fastify/busboy';\nimport type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\nimport { findMatchingCustomRoute, isProtectedCustomRoute } from '@mastra/server/auth';\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type Koa from 'koa';\nimport type { Context, Middleware, Next } from 'koa';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { KoaAuthMiddlewareOptions } from './auth-middleware';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\ntype RegisteredKoaRoute = {\n route: ServerRoute;\n prefix: string;\n koaPath: string;\n pathRegex: RegExp;\n paramNames: string[];\n};\ntype RouteDispatcherGroup = {\n routes: RegisteredKoaRoute[];\n stackLengthAfterRegistration: number;\n};\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/koa] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n/**\n * Convert Koa context to Web API Request for cookie-based auth providers.\n */\nfunction toWebRequest(ctx: Context): globalThis.Request {\n const protocol = ctx.protocol || 'http';\n const host = ctx.host || 'localhost';\n const url = `${protocol}://${host}${ctx.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(ctx.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n }\n\n return new globalThis.Request(url, {\n method: ctx.method,\n headers,\n });\n}\n\n// Extend Koa types to include Mastra context\ndeclare module 'koa' {\n interface DefaultState {\n mastra: Mastra;\n requestContext: RequestContext;\n tools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n }\n interface Request {\n body?: unknown;\n }\n}\n\nexport class MastraServer extends MastraServerBase<Koa, Context, Context> {\n private readonly activeRouteDispatchers = new WeakMap<Koa, RouteDispatcherGroup>();\n\n async init() {\n this.registerErrorMiddleware();\n await super.init();\n }\n\n /**\n * Register a global error-handling middleware at the top of the middleware chain.\n * This acts as a safety net for errors that propagate past route handlers\n * (e.g., from auth middleware, context middleware, or when route handlers re-throw).\n *\n * When `server.onError` is configured, calls it and uses the response.\n * Otherwise provides a default JSON error response.\n *\n * Errors are emitted on the app for logging (Koa convention) but NOT re-thrown,\n * so this middleware is the final error boundary. Users who need custom error handling\n * should use `server.onError` or register their own middleware between this and the routes.\n */\n private registerErrorMiddleware(): void {\n const server = this;\n\n this.app.use(async function mastraErrorBoundary(ctx: Context, next: Next) {\n try {\n await next();\n } catch (err) {\n // Try onError first (may have already been called in registerRoute,\n // but this catches errors from other middleware too)\n if (await server.handleOnError(err, ctx)) {\n return;\n }\n\n // Default error handling\n const error = err instanceof Error ? err : new Error(String(err));\n let status = 500;\n if (err && typeof err === 'object') {\n if ('status' in err) {\n status = (err as any).status;\n } else if (\n 'details' in err &&\n (err as any).details &&\n typeof (err as any).details === 'object' &&\n 'status' in (err as any).details\n ) {\n status = (err as any).details.status;\n }\n }\n ctx.status = status;\n ctx.body = { error: error.message || 'Unknown error' };\n\n // Emit the error for logging (standard Koa pattern) but don't re-throw\n // since this middleware is the final error boundary.\n ctx.app.emit('error', err, ctx);\n }\n });\n }\n\n /**\n * Try to handle an error using the `server.onError` hook.\n * Creates a minimal context shim compatible with the Hono-style onError signature.\n *\n * @returns true if the error was handled and the response was set on ctx\n */\n private async handleOnError(err: unknown, ctx: Context): Promise<boolean> {\n // Guard against double invocation (route catch → re-throw → error middleware)\n if ((ctx as any)._mastraOnErrorAttempted) return false;\n (ctx as any)._mastraOnErrorAttempted = true;\n\n const onError = this.mastra.getServer()?.onError;\n if (!onError) return false;\n\n const error = err instanceof Error ? err : new Error(String(err));\n\n // Create a minimal context shim compatible with the onError signature\n const shimContext = {\n json: (data: unknown, status: number = 200) =>\n new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json' },\n }),\n req: {\n path: ctx.path,\n method: ctx.method,\n header: (name: string) => {\n const value = ctx.headers[name.toLowerCase()];\n if (Array.isArray(value)) return value.join(', ');\n return value;\n },\n url: ctx.url,\n },\n };\n\n try {\n const response = await onError(error, shimContext as any);\n // Apply the Response from onError to the Koa context\n ctx.status = response.status;\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n ctx.body = await response.json();\n } else {\n ctx.body = await response.text();\n }\n return true;\n } catch (onErrorErr) {\n this.mastra.getLogger()?.error('Error in custom onError handler', {\n error: onErrorErr instanceof Error ? { message: onErrorErr.message, stack: onErrorErr.stack } : onErrorErr,\n });\n return false;\n }\n }\n\n createContextMiddleware(): Middleware {\n const server = this;\n\n return async function mastraRequestContext(ctx: Context, next: Next) {\n // Parse request context from request body and add to context\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n const contentType = ctx.headers['content-type'];\n if (contentType?.includes('application/json') && ctx.request.body) {\n const body = ctx.request.body as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (ctx.method === 'GET') {\n try {\n const query = ctx.query;\n const encodedRequestContext = query.requestContext;\n if (typeof encodedRequestContext === 'string') {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = server.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n server.applyRequestMetadataToContext({\n requestContext,\n getHeader: name => ctx.get(name),\n });\n\n // Set context in state object\n ctx.state.requestContext = requestContext;\n ctx.state.mastra = server.mastra;\n ctx.state.tools = server.tools || {};\n if (server.taskStore) {\n ctx.state.taskStore = server.taskStore;\n }\n ctx.state.customRouteAuthConfig = server.customRouteAuthConfig;\n\n // Create abort controller for request cancellation\n const controller = new AbortController();\n ctx.req.on('close', () => {\n // Only abort if the response wasn't successfully completed\n if (!ctx.res.writableEnded) {\n controller.abort();\n }\n });\n ctx.state.abortSignal = controller.signal;\n\n await next();\n };\n }\n\n private getRouteDispatcherGroup(app: Koa): RouteDispatcherGroup {\n // The dispatcher-reuse optimization needs to observe app.middleware.length\n // to detect when other middleware was registered between our route\n // registrations (in which case we must start a new dispatcher group to\n // preserve middleware ordering). Subclasses may pass an app-like object\n // (e.g., a koa-router or a mounted sub-app) that only exposes `use` and\n // has no `middleware` array. In that case, skip reuse and register a fresh\n // dispatcher per call — equivalent to the pre-1.5.0 per-route behavior.\n const middlewareStack = (app as { middleware?: unknown }).middleware;\n const supportsReuse = Array.isArray(middlewareStack);\n\n if (supportsReuse) {\n const activeGroup = this.activeRouteDispatchers.get(app);\n if (activeGroup && middlewareStack.length === activeGroup.stackLengthAfterRegistration) {\n return activeGroup;\n }\n }\n\n const group: RouteDispatcherGroup = {\n routes: [],\n stackLengthAfterRegistration: 0,\n };\n app.use(this.createRouteDispatcherMiddleware(group));\n\n if (supportsReuse) {\n group.stackLengthAfterRegistration = (app as { middleware: unknown[] }).middleware.length;\n this.activeRouteDispatchers.set(app, group);\n }\n\n return group;\n }\n\n private createRouteDispatcherMiddleware(group: RouteDispatcherGroup): Middleware {\n const server = this;\n\n return async function mastraRouteDispatcher(ctx: Context, next: Next) {\n const matchedRoute = server.findRegisteredRoute(group.routes, ctx);\n\n if (!matchedRoute) {\n await next();\n return;\n }\n\n await server.handleMatchedRoute(matchedRoute, ctx);\n };\n }\n\n private findRegisteredRoute(routes: RegisteredKoaRoute[], ctx: Context): RegisteredKoaRoute | undefined {\n const method = ctx.method.toUpperCase();\n\n for (const registeredRoute of routes) {\n if (\n registeredRoute.route.method.toUpperCase() !== 'ALL' &&\n method !== registeredRoute.route.method.toUpperCase()\n ) {\n continue;\n }\n\n const match = registeredRoute.pathRegex.exec(ctx.path);\n if (!match) {\n continue;\n }\n\n ctx.params = {};\n registeredRoute.paramNames.forEach((name, index) => {\n ctx.params[name] = match[index + 1];\n });\n\n return registeredRoute;\n }\n\n return undefined;\n }\n\n private async handleMatchedRoute(registeredRoute: RegisteredKoaRoute, ctx: Context): Promise<void> {\n const { route, prefix } = registeredRoute;\n\n const authError = await this.checkRouteAuth(route, {\n path: String(ctx.path || '/'),\n method: String(ctx.method || 'GET'),\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => (ctx.query as Record<string, string>)[name],\n requestContext: ctx.state.requestContext,\n request: toWebRequest(ctx),\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (authError) {\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n ctx.set(key, value);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authError.error) {\n ctx.status = authError.status;\n ctx.body = { error: authError.error };\n return;\n }\n }\n\n const params = await this.getParams(route, ctx);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed multipart data)\n if (params.bodyParseError) {\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n };\n return;\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'query');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n if (params.body) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'body');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const resolved = this.resolveValidationError(route, error, 'path');\n ctx.status = resolved.status;\n ctx.body = resolved.body;\n return;\n }\n ctx.status = 400;\n ctx.body = {\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n };\n return;\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: ctx.state.requestContext,\n mastra: this.mastra,\n tools: ctx.state.tools,\n taskStore: ctx.state.taskStore,\n abortSignal: ctx.state.abortSignal,\n routePrefix: prefix,\n request: toWebRequest(ctx),\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const requestContext = ctx.state.requestContext;\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission, requestContext);\n\n if (permissionError) {\n ctx.status = permissionError.status;\n ctx.body = {\n error: permissionError.error,\n message: permissionError.message,\n };\n return;\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n ctx.status = fgaError.status;\n ctx.body = { error: fgaError.error, message: fgaError.message };\n return;\n }\n\n try {\n const result = await route.handler(handlerParams);\n await this.sendResponse(route, ctx, result, prefix);\n } catch (error) {\n this.mastra.getLogger()?.error('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n // Attach status code to the error for upstream middleware\n if (error && typeof error === 'object') {\n if (!('status' in error)) {\n // Check for MastraError with status in details\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n (error as any).status = (error.details as any).status;\n }\n }\n }\n\n // Try to call server.onError if configured\n if (await this.handleOnError(error, ctx)) {\n return;\n }\n\n // Re-throw so the error propagates up Koa's middleware chain\n throw error;\n }\n }\n\n async stream(route: ServerRoute, ctx: Context, result: { fullStream: ReadableStream }): Promise<void> {\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const streamFormat = route.streamFormat || 'stream';\n\n // Set status and headers via ctx.res directly since we're bypassing Koa's response\n const sseHeaders =\n streamFormat === 'sse'\n ? {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n }\n : {\n 'Content-Type': 'text/plain',\n };\n\n ctx.res.writeHead(200, {\n ...sseHeaders,\n 'Transfer-Encoding': 'chunked',\n });\n\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n ctx.res.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n ctx.res.on('close', () => {\n void reader.cancel('request aborted');\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n ctx.res.write(value);\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n if (streamFormat === 'sse') {\n ctx.res.write(`data: ${JSON.stringify(outputValue)}\\n\\n`);\n } else {\n ctx.res.write(JSON.stringify(outputValue) + '\\x1E');\n }\n }\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n ctx.res.end();\n }\n }\n\n async getParams(route: ServerRoute, ctx: Context): Promise<ParsedRequestParams> {\n const urlParams = (ctx.params || {}) as Record<string, string>;\n // Koa's ctx.query is ParsedUrlQuery which is Record<string, string | string[]>\n const queryParams = normalizeQueryParams((ctx.query || {}) as Record<string, unknown>);\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = ctx.headers['content-type'] || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const maxFileSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n body = await this.parseMultipartFormData(ctx, maxFileSize);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors, let others fall through to validation\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else {\n body = ctx.request.body;\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse multipart/form-data using @fastify/busboy.\n * Converts file uploads to Buffers and parses JSON field values.\n *\n * @param ctx - The Koa context object\n * @param maxFileSize - Optional maximum file size in bytes\n */\n private parseMultipartFormData(ctx: Context, maxFileSize?: number): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const result: Record<string, unknown> = {};\n\n const busboy = new Busboy({\n headers: {\n 'content-type': ctx.headers['content-type'] as string,\n },\n limits: maxFileSize ? { fileSize: maxFileSize } : undefined,\n });\n\n busboy.on('file', (fieldname: string, file: NodeJS.ReadableStream) => {\n const chunks: Buffer[] = [];\n let limitExceeded = false;\n\n file.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n file.on('limit', () => {\n limitExceeded = true;\n reject(new Error(`File size limit exceeded${maxFileSize ? ` (max: ${maxFileSize} bytes)` : ''}`));\n });\n\n file.on('end', () => {\n if (!limitExceeded) {\n result[fieldname] = Buffer.concat(chunks);\n }\n });\n });\n\n busboy.on('field', (fieldname: string, value: string) => {\n // Try to parse JSON strings (like 'options')\n try {\n result[fieldname] = JSON.parse(value);\n } catch {\n result[fieldname] = value;\n }\n });\n\n busboy.on('finish', () => {\n resolve(result);\n });\n\n busboy.on('error', (error: Error) => {\n reject(error);\n });\n\n // Pipe the raw request to busboy\n ctx.req.pipe(busboy);\n });\n }\n\n async sendResponse(route: ServerRoute, ctx: Context, result: unknown, prefix?: string): Promise<void> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n ctx.set(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n // Explicitly set content-type and handle null/undefined to ensure proper JSON response\n // Koa sets 204 No Content when body is null, but we want to return JSON null\n ctx.type = 'application/json';\n ctx.body = result === null || result === undefined ? JSON.stringify(null) : result;\n } else if (route.responseType === 'stream') {\n await this.stream(route, ctx, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n // Handle AI SDK Response objects - pipe Response.body to Koa response\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const fetchResponse = result as globalThis.Response;\n const headers: Record<string, string> = {};\n fetchResponse.headers.forEach((value, key) => {\n headers[key] = value;\n });\n ctx.res.writeHead(fetchResponse.status, headers);\n\n if (fetchResponse.body) {\n const reader = fetchResponse.body.getReader();\n\n const onResError = (err: unknown) => {\n this.mastra.getLogger()?.error('Error writing datastream response', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n void reader.cancel('response write error');\n };\n ctx.res.once('error', onResError);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n ctx.res.write(value);\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in datastream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n ctx.res.off('error', onResError);\n ctx.res.end();\n }\n } else {\n ctx.res.end();\n }\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n try {\n // Attach parsed body to raw request so MCP server's readJsonBody can use it\n const rawReq = ctx.req as typeof ctx.req & { body?: unknown };\n if (ctx.request.body !== undefined) {\n rawReq.body = ctx.request.body;\n }\n\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n await server.startHTTP({\n url: new URL(ctx.url, `http://${ctx.headers.host}`),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req: rawReq,\n res: ctx.res,\n options: Object.keys(options).length > 0 ? options : undefined,\n });\n // Response handled by startHTTP\n } catch {\n if (!ctx.res.headersSent) {\n ctx.res.writeHead(500, { 'Content-Type': 'application/json' });\n ctx.res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n }),\n );\n }\n }\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport\n // Tell Koa we're handling the response ourselves\n ctx.respond = false;\n\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n // Attach parsed body to raw request so MCP server's readJsonBody can use it\n const rawReq = ctx.req as typeof ctx.req & { body?: unknown };\n if (ctx.request.body !== undefined) {\n rawReq.body = ctx.request.body;\n }\n\n await server.startSSE({\n url: new URL(ctx.url, `http://${ctx.headers.host}`),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req: rawReq,\n res: ctx.res,\n });\n // Response handled by startSSE\n } catch {\n if (!ctx.res.headersSent) {\n ctx.res.writeHead(500, { 'Content-Type': 'application/json' });\n ctx.res.end(JSON.stringify({ error: 'Error handling MCP SSE request' }));\n }\n }\n } else {\n ctx.status = 500;\n }\n }\n\n async registerRoute(app: Koa, route: ServerRoute, { prefix: prefixParam }: { prefix?: string } = {}): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n const fullPath = `${prefix}${route.path}`;\n\n // Convert Express-style :param to Koa-style :param (they're the same)\n const koaPath = fullPath;\n\n const group = this.getRouteDispatcherGroup(app);\n group.routes.push({\n route,\n prefix,\n koaPath,\n pathRegex: this.pathToRegex(koaPath),\n paramNames: this.extractParamNames(koaPath),\n });\n }\n\n /**\n * Convert Express-style path to regex for matching\n */\n private pathToRegex(path: string): RegExp {\n // First replace :param with a placeholder that won't be affected by escaping\n const PARAM_PLACEHOLDER = '\\x00PARAM\\x00';\n const pathWithPlaceholders = path.replace(/:[^/]+/g, PARAM_PLACEHOLDER);\n\n // Escape all regex meta-characters so the path is treated literally\n const escapedPath = pathWithPlaceholders.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // Replace placeholders with capture groups and escape forward slashes\n const regexPath = escapedPath.replace(new RegExp(PARAM_PLACEHOLDER, 'g'), '([^/]+)').replace(/\\//g, '\\\\/');\n\n return new RegExp(`^${regexPath}$`);\n }\n\n /**\n * Extract parameter names from path\n */\n private extractParamNames(path: string): string[] {\n const matches = path.match(/:[^/]+/g) || [];\n return matches.map(m => m.slice(1)); // Remove the leading ':'\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n const server = this;\n\n this.app.use(async function mastraCustomRouteDispatcher(ctx: Context, next: Next) {\n // Check if this request matches a protected custom route and run auth\n const path = String(ctx.path || '/');\n const method = String(ctx.method || 'GET');\n const matchedRoute = findMatchingCustomRoute(\n path,\n method,\n server.customApiRoutes ?? server.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, method, server.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n const customRouteAbortController = new AbortController();\n const abortCustomRoute = () => {\n customRouteAbortController.abort();\n };\n const abortCustomRouteIfOpen = () => {\n if (!ctx.res.writableEnded) {\n abortCustomRoute();\n }\n };\n\n ctx.res.once('close', abortCustomRouteIfOpen);\n ctx.res.once('error', abortCustomRouteIfOpen);\n\n try {\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? method) as any,\n path: matchedRoute?.route.path ?? path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: matchedRoute?.route.requiresAuth,\n requiresPermission: matchedRoute?.route.requiresPermission,\n fga: matchedRoute?.route.fga,\n };\n\n if (shouldRunCustomRouteAuth) {\n const authError = await server.checkRouteAuth(serverRoute, {\n path,\n method,\n getHeader: name => ctx.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => (ctx.query as Record<string, string>)[name],\n requestContext: ctx.state.requestContext,\n request: toWebRequest(ctx),\n buildAuthorizeContext: () => toWebRequest(ctx),\n });\n\n if (authError) {\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n ctx.set(key, value);\n }\n }\n\n if (authError.error) {\n ctx.status = authError.status;\n ctx.body = { error: authError.error };\n return;\n }\n }\n }\n\n const requestContext = ctx.state.requestContext;\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = server.mastra.getStudio()?.auth || server.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = server.checkRoutePermission(\n serverRoute,\n userPermissions,\n hasPermission,\n requestContext,\n );\n if (permissionError) {\n ctx.status = permissionError.status;\n ctx.body = {\n error: permissionError.error,\n message: permissionError.message,\n };\n return;\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(server.mastra, serverRoute, ctx.state.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(ctx.query as Record<string, string>),\n ...(typeof ctx.request.body === 'object' && ctx.request.body !== null\n ? (ctx.request.body as Record<string, unknown>)\n : {}),\n });\n if (fgaError) {\n ctx.status = fgaError.status;\n ctx.body = { error: fgaError.error, message: fgaError.message };\n return;\n }\n }\n\n const response = await server.handleCustomRouteRequest(\n `${ctx.protocol}://${ctx.host}${ctx.originalUrl || ctx.url}`,\n ctx.method,\n ctx.headers as Record<string, string | string[] | undefined>,\n ctx.request.body,\n ctx.state.requestContext,\n customRouteAbortController.signal,\n );\n if (!response) return next();\n ctx.respond = false;\n await server.writeCustomRouteResponse(response, ctx.res, customRouteAbortController.signal);\n } finally {\n ctx.res.off('close', abortCustomRouteIfOpen);\n ctx.res.off('error', abortCustomRouteIfOpen);\n }\n });\n }\n\n registerContextMiddleware(): void {\n this.app.use(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n const server = this;\n\n this.app.use(async function mastraHttpLogger(ctx: Context, next: Next) {\n if (!server.shouldLogRequest(ctx.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = ctx.method;\n const path = ctx.path;\n\n await next();\n\n const duration = Date.now() - start;\n const status = ctx.status;\n const level = server.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (server.httpLoggingConfig?.includeQueryParams) {\n logData.query = ctx.query;\n }\n\n if (server.httpLoggingConfig?.includeHeaders) {\n const headers = { ...ctx.headers };\n const redactHeaders = server.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach((h: string) => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n server.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/koa",
3
- "version": "1.5.13-alpha.3",
3
+ "version": "1.5.13",
4
4
  "description": "Mastra Koa adapter for the server",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -21,7 +21,7 @@
21
21
  "license": "Apache-2.0",
22
22
  "dependencies": {
23
23
  "@fastify/busboy": "^3.2.0",
24
- "@mastra/server": "1.42.0-alpha.3"
24
+ "@mastra/server": "1.42.0"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@ai-sdk/openai": "^2.0.106",
@@ -35,14 +35,14 @@
35
35
  "typescript": "^6.0.3",
36
36
  "vitest": "4.1.5",
37
37
  "zod": "^4.4.3",
38
- "@internal/lint": "0.0.103",
39
- "@internal/storage-test-utils": "0.0.99",
40
38
  "@internal/server-adapter-test-utils": "0.0.24",
41
- "@internal/types-builder": "0.0.78",
42
- "@mastra/core": "1.42.0-alpha.3",
43
- "@mastra/libsql": "1.12.1",
44
- "@mastra/evals": "1.2.4",
45
- "@mastra/memory": "1.20.2",
39
+ "@internal/lint": "0.0.104",
40
+ "@internal/storage-test-utils": "0.0.100",
41
+ "@internal/types-builder": "0.0.79",
42
+ "@mastra/core": "1.42.0",
43
+ "@mastra/libsql": "1.13.0",
44
+ "@mastra/evals": "1.3.0",
45
+ "@mastra/memory": "1.20.3",
46
46
  "@mastra/observability": "1.14.1"
47
47
  },
48
48
  "peerDependencies": {