@frontmcp/sdk 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +3 -3
  2. package/package.json +8 -19
  3. package/src/adapter/adapter.instance.js +5 -0
  4. package/src/adapter/adapter.instance.js.map +1 -1
  5. package/src/auth/authorization/authorization.class.d.ts +1 -4
  6. package/src/auth/authorization/authorization.class.js +6 -13
  7. package/src/auth/authorization/authorization.class.js.map +1 -1
  8. package/src/auth/flows/session.verify.flow.d.ts +1 -0
  9. package/src/auth/flows/session.verify.flow.js +11 -1
  10. package/src/auth/flows/session.verify.flow.js.map +1 -1
  11. package/src/auth/flows/well-known.jwks.flow.js +2 -2
  12. package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
  13. package/src/auth/jwks/dev-key-persistence.d.ts +63 -0
  14. package/src/auth/jwks/dev-key-persistence.js +219 -0
  15. package/src/auth/jwks/dev-key-persistence.js.map +1 -0
  16. package/src/auth/jwks/index.d.ts +1 -0
  17. package/src/auth/jwks/index.js +1 -0
  18. package/src/auth/jwks/index.js.map +1 -1
  19. package/src/auth/jwks/jwks.service.d.ts +7 -4
  20. package/src/auth/jwks/jwks.service.js +81 -12
  21. package/src/auth/jwks/jwks.service.js.map +1 -1
  22. package/src/auth/jwks/jwks.types.d.ts +7 -0
  23. package/src/auth/jwks/jwks.types.js.map +1 -1
  24. package/src/auth/machine-id.d.ts +5 -0
  25. package/src/auth/machine-id.js +32 -0
  26. package/src/auth/machine-id.js.map +1 -0
  27. package/src/auth/session/index.d.ts +1 -0
  28. package/src/auth/session/index.js +3 -1
  29. package/src/auth/session/index.js.map +1 -1
  30. package/src/auth/session/record/session.base.js +5 -3
  31. package/src/auth/session/record/session.base.js.map +1 -1
  32. package/src/auth/session/record/session.stateless.d.ts +2 -2
  33. package/src/auth/session/record/session.stateless.js +5 -3
  34. package/src/auth/session/record/session.stateless.js.map +1 -1
  35. package/src/auth/session/redis-session.store.d.ts +64 -0
  36. package/src/auth/session/redis-session.store.js +204 -0
  37. package/src/auth/session/redis-session.store.js.map +1 -0
  38. package/src/auth/session/session.service.d.ts +0 -2
  39. package/src/auth/session/session.service.js +1 -7
  40. package/src/auth/session/session.service.js.map +1 -1
  41. package/src/auth/session/transport-session.manager.js +3 -5
  42. package/src/auth/session/transport-session.manager.js.map +1 -1
  43. package/src/auth/session/transport-session.types.d.ts +4 -0
  44. package/src/auth/session/transport-session.types.js +4 -3
  45. package/src/auth/session/transport-session.types.js.map +1 -1
  46. package/src/auth/session/utils/session-id.utils.d.ts +12 -1
  47. package/src/auth/session/utils/session-id.utils.js +48 -9
  48. package/src/auth/session/utils/session-id.utils.js.map +1 -1
  49. package/src/auth/ui/base-layout.d.ts +0 -8
  50. package/src/auth/ui/base-layout.js +1 -14
  51. package/src/auth/ui/base-layout.js.map +1 -1
  52. package/src/auth/ui/index.d.ts +3 -4
  53. package/src/auth/ui/index.js +10 -11
  54. package/src/auth/ui/index.js.map +1 -1
  55. package/src/auth/ui/{htmx-templates.d.ts → templates.d.ts} +5 -6
  56. package/src/auth/ui/{htmx-templates.js → templates.js} +8 -15
  57. package/src/auth/ui/templates.js.map +1 -0
  58. package/src/common/decorators/decorator-utils.js.map +1 -1
  59. package/src/common/decorators/front-mcp.decorator.js +28 -2
  60. package/src/common/decorators/front-mcp.decorator.js.map +1 -1
  61. package/src/common/index.d.ts +0 -1
  62. package/src/common/index.js +0 -1
  63. package/src/common/index.js.map +1 -1
  64. package/src/common/interfaces/adapter.interface.d.ts +6 -0
  65. package/src/common/interfaces/adapter.interface.js.map +1 -1
  66. package/src/common/interfaces/execution-context.interface.d.ts +52 -3
  67. package/src/common/interfaces/execution-context.interface.js +88 -3
  68. package/src/common/interfaces/execution-context.interface.js.map +1 -1
  69. package/src/common/interfaces/flow.interface.d.ts +13 -0
  70. package/src/common/interfaces/flow.interface.js +24 -0
  71. package/src/common/interfaces/flow.interface.js.map +1 -1
  72. package/src/common/interfaces/server.interface.d.ts +9 -0
  73. package/src/common/interfaces/server.interface.js.map +1 -1
  74. package/src/common/metadata/app.metadata.d.ts +108 -0
  75. package/src/common/metadata/front-mcp.metadata.d.ts +659 -2
  76. package/src/common/metadata/front-mcp.metadata.js +3 -1
  77. package/src/common/metadata/front-mcp.metadata.js.map +1 -1
  78. package/src/common/metadata/provider.metadata.d.ts +14 -0
  79. package/src/common/metadata/provider.metadata.js +18 -2
  80. package/src/common/metadata/provider.metadata.js.map +1 -1
  81. package/src/common/metadata/tool.metadata.d.ts +33 -1
  82. package/src/common/metadata/tool.metadata.js.map +1 -1
  83. package/src/common/migrate/auth-transport.migrate.d.ts +62 -0
  84. package/src/common/migrate/auth-transport.migrate.js +140 -0
  85. package/src/common/migrate/auth-transport.migrate.js.map +1 -0
  86. package/src/common/migrate/index.d.ts +1 -0
  87. package/src/common/migrate/index.js +6 -0
  88. package/src/common/migrate/index.js.map +1 -0
  89. package/src/common/schemas/http-output.schema.d.ts +10 -2
  90. package/src/common/schemas/index.d.ts +1 -0
  91. package/src/common/schemas/index.js +1 -0
  92. package/src/common/schemas/index.js.map +1 -1
  93. package/src/common/schemas/session-header.schema.d.ts +16 -0
  94. package/src/common/schemas/session-header.schema.js +42 -0
  95. package/src/common/schemas/session-header.schema.js.map +1 -0
  96. package/src/common/tokens/front-mcp.tokens.js +3 -1
  97. package/src/common/tokens/front-mcp.tokens.js.map +1 -1
  98. package/src/common/types/options/auth.options.d.ts +233 -3
  99. package/src/common/types/options/auth.options.js +29 -40
  100. package/src/common/types/options/auth.options.js.map +1 -1
  101. package/src/common/types/options/index.d.ts +2 -0
  102. package/src/common/types/options/index.js +2 -0
  103. package/src/common/types/options/index.js.map +1 -1
  104. package/src/common/types/options/redis.options.d.ts +22 -0
  105. package/src/common/types/options/redis.options.js +45 -0
  106. package/src/common/types/options/redis.options.js.map +1 -0
  107. package/src/common/types/options/transport.options.d.ts +84 -0
  108. package/src/common/types/options/transport.options.js +121 -0
  109. package/src/common/types/options/transport.options.js.map +1 -0
  110. package/src/completion/flows/complete.flow.d.ts +17 -2
  111. package/src/context/frontmcp-context-storage.d.ts +94 -0
  112. package/src/context/frontmcp-context-storage.js +183 -0
  113. package/src/context/frontmcp-context-storage.js.map +1 -0
  114. package/src/context/frontmcp-context.d.ts +269 -0
  115. package/src/context/frontmcp-context.js +360 -0
  116. package/src/context/frontmcp-context.js.map +1 -0
  117. package/src/context/frontmcp-context.provider.d.ts +43 -0
  118. package/src/context/frontmcp-context.provider.js +61 -0
  119. package/src/context/frontmcp-context.provider.js.map +1 -0
  120. package/src/context/index.d.ts +34 -0
  121. package/src/context/index.js +64 -0
  122. package/src/context/index.js.map +1 -0
  123. package/src/context/request-context-storage.d.ts +89 -0
  124. package/src/context/request-context-storage.js +183 -0
  125. package/src/context/request-context-storage.js.map +1 -0
  126. package/src/context/request-context.d.ts +184 -0
  127. package/src/context/request-context.js +209 -0
  128. package/src/context/request-context.js.map +1 -0
  129. package/src/context/request-context.provider.d.ts +37 -0
  130. package/src/context/request-context.provider.js +51 -0
  131. package/src/context/request-context.provider.js.map +1 -0
  132. package/src/context/session-key.provider.d.ts +45 -0
  133. package/src/context/session-key.provider.js +65 -0
  134. package/src/context/session-key.provider.js.map +1 -0
  135. package/src/context/trace-context.d.ts +43 -0
  136. package/src/context/trace-context.js +142 -0
  137. package/src/context/trace-context.js.map +1 -0
  138. package/src/errors/index.d.ts +1 -1
  139. package/src/errors/index.js +3 -1
  140. package/src/errors/index.js.map +1 -1
  141. package/src/errors/mcp.error.d.ts +7 -0
  142. package/src/errors/mcp.error.js +11 -1
  143. package/src/errors/mcp.error.js.map +1 -1
  144. package/src/flows/flow.instance.d.ts +16 -0
  145. package/src/flows/flow.instance.js +166 -80
  146. package/src/flows/flow.instance.js.map +1 -1
  147. package/src/flows/flow.registry.d.ts +5 -0
  148. package/src/flows/flow.registry.js +45 -3
  149. package/src/flows/flow.registry.js.map +1 -1
  150. package/src/front-mcp/front-mcp.d.ts +12 -0
  151. package/src/front-mcp/front-mcp.js +22 -3
  152. package/src/front-mcp/front-mcp.js.map +1 -1
  153. package/src/front-mcp/front-mcp.providers.d.ts +266 -1
  154. package/src/front-mcp/front-mcp.providers.js +2 -1
  155. package/src/front-mcp/front-mcp.providers.js.map +1 -1
  156. package/src/front-mcp/serverless-handler.d.ts +28 -0
  157. package/src/front-mcp/serverless-handler.js +61 -0
  158. package/src/front-mcp/serverless-handler.js.map +1 -0
  159. package/src/hooks/hooks.utils.d.ts +1 -1
  160. package/src/hooks/hooks.utils.js +10 -3
  161. package/src/hooks/hooks.utils.js.map +1 -1
  162. package/src/index.d.ts +8 -4
  163. package/src/index.js +20 -1
  164. package/src/index.js.map +1 -1
  165. package/src/logger/instances/instance.logger.js +0 -1
  166. package/src/logger/instances/instance.logger.js.map +1 -1
  167. package/src/logging/flows/set-level.flow.d.ts +17 -2
  168. package/src/notification/notification.service.js +5 -1
  169. package/src/notification/notification.service.js.map +1 -1
  170. package/src/prompt/flows/get-prompt.flow.d.ts +97 -2
  171. package/src/prompt/flows/prompts-list.flow.d.ts +12 -1
  172. package/src/provider/provider.registry.d.ts +97 -5
  173. package/src/provider/provider.registry.js +306 -9
  174. package/src/provider/provider.registry.js.map +1 -1
  175. package/src/provider/provider.types.d.ts +21 -3
  176. package/src/provider/provider.types.js.map +1 -1
  177. package/src/resource/flows/read-resource.flow.d.ts +22 -3
  178. package/src/resource/flows/resource-templates-list.flow.d.ts +20 -1
  179. package/src/resource/flows/resources-list.flow.d.ts +20 -1
  180. package/src/resource/flows/subscribe-resource.flow.d.ts +17 -2
  181. package/src/resource/flows/unsubscribe-resource.flow.d.ts +17 -2
  182. package/src/scope/flows/http.request.flow.js +43 -7
  183. package/src/scope/flows/http.request.flow.js.map +1 -1
  184. package/src/scope/scope.instance.js +12 -5
  185. package/src/scope/scope.instance.js.map +1 -1
  186. package/src/server/adapters/base.host.adapter.d.ts +9 -0
  187. package/src/server/adapters/base.host.adapter.js.map +1 -1
  188. package/src/server/adapters/express.host.adapter.d.ts +12 -0
  189. package/src/server/adapters/express.host.adapter.js +21 -1
  190. package/src/server/adapters/express.host.adapter.js.map +1 -1
  191. package/src/server/server.instance.d.ts +3 -0
  192. package/src/server/server.instance.js +14 -7
  193. package/src/server/server.instance.js.map +1 -1
  194. package/src/tool/flows/call-tool.flow.d.ts +118 -13
  195. package/src/tool/flows/call-tool.flow.js +240 -194
  196. package/src/tool/flows/call-tool.flow.js.map +1 -1
  197. package/src/tool/flows/tools-list.flow.d.ts +25 -11
  198. package/src/tool/flows/tools-list.flow.js +82 -31
  199. package/src/tool/flows/tools-list.flow.js.map +1 -1
  200. package/src/tool/tool.instance.d.ts +1 -4
  201. package/src/transport/adapters/transport.streamable-http.adapter.js +1 -0
  202. package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
  203. package/src/transport/flows/handle.sse.flow.js +9 -2
  204. package/src/transport/flows/handle.sse.flow.js.map +1 -1
  205. package/src/transport/flows/handle.streamable-http.flow.js +63 -6
  206. package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
  207. package/src/transport/mcp-handlers/complete-request.handler.d.ts +27 -1
  208. package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +52 -1
  209. package/src/transport/mcp-handlers/index.d.ts +413 -7
  210. package/src/transport/mcp-handlers/initialize-request.handler.js +12 -2
  211. package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
  212. package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +27 -1
  213. package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +32 -1
  214. package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +32 -1
  215. package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +30 -1
  216. package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +20 -0
  217. package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +27 -1
  218. package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +20 -0
  219. package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +20 -0
  220. package/src/transport/transport.registry.d.ts +68 -4
  221. package/src/transport/transport.registry.js +313 -11
  222. package/src/transport/transport.registry.js.map +1 -1
  223. package/src/auth/ui/htmx-templates.js.map +0 -1
  224. package/src/common/providers/session.provider.d.ts +0 -13
  225. package/src/common/providers/session.provider.js +0 -27
  226. package/src/common/providers/session.provider.js.map +0 -1
@@ -4,13 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.ExecutionContextBase = void 0;
5
5
  const crypto_1 = require("crypto");
6
6
  const flow_interface_1 = require("./flow.interface");
7
+ const context_1 = require("../../context");
8
+ const mcp_error_1 = require("../../errors/mcp.error");
7
9
  /**
8
10
  * Abstract base class for execution contexts (tools, resources, prompts, etc.).
9
11
  * Provides common functionality for dependency injection, logging, and flow control.
10
12
  */
11
13
  class ExecutionContextBase {
12
14
  providers;
13
- authInfo;
15
+ /**
16
+ * @deprecated Use `context.authInfo` instead. Will be removed in v2.0.
17
+ */
18
+ _authInfo;
14
19
  /** Unique identifier for this execution run */
15
20
  runId;
16
21
  logger;
@@ -23,7 +28,75 @@ class ExecutionContextBase {
23
28
  this.runId = (0, crypto_1.randomUUID)();
24
29
  this.providers = providers;
25
30
  this.logger = logger;
26
- this.authInfo = authInfo;
31
+ this._authInfo = authInfo;
32
+ }
33
+ /**
34
+ * Get the current FrontMcpContext.
35
+ *
36
+ * Provides access to requestId, traceId, sessionId, authInfo,
37
+ * timing marks, request metadata, transport, and context-aware fetch.
38
+ *
39
+ * @throws RequestContextNotAvailableError if called outside of a context scope
40
+ */
41
+ get context() {
42
+ try {
43
+ return this.providers.get(context_1.FRONTMCP_CONTEXT);
44
+ }
45
+ catch {
46
+ // Context not available (likely called during initialization or outside request scope)
47
+ throw new mcp_error_1.RequestContextNotAvailableError();
48
+ }
49
+ }
50
+ /**
51
+ * Try to get the context, returning undefined if not available.
52
+ *
53
+ * Use this when context may not be available (e.g., during initialization).
54
+ */
55
+ tryGetContext() {
56
+ try {
57
+ return this.providers.get(context_1.FRONTMCP_CONTEXT);
58
+ }
59
+ catch {
60
+ return undefined;
61
+ }
62
+ }
63
+ /**
64
+ * @deprecated Use `context.authInfo` instead. Will be removed in v2.0.
65
+ *
66
+ * Get authentication information for the current request.
67
+ */
68
+ get authInfo() {
69
+ return this._authInfo;
70
+ }
71
+ /**
72
+ * Get authentication information for the current request.
73
+ *
74
+ * Prefers context.authInfo when available (the recommended source),
75
+ * falls back to the legacy authInfo property for backward compatibility.
76
+ *
77
+ * Returns Partial<AuthInfo> because auth info is progressively populated
78
+ * during the request lifecycle. Callers should check for required fields.
79
+ */
80
+ getAuthInfo() {
81
+ const ctx = this.tryGetContext();
82
+ if (ctx) {
83
+ return ctx.authInfo;
84
+ }
85
+ return this._authInfo;
86
+ }
87
+ /**
88
+ * Get a child logger with request context attached.
89
+ *
90
+ * The logger includes requestId, traceId, and sessionId in its context.
91
+ */
92
+ get contextLogger() {
93
+ try {
94
+ return this.context.getLogger(this.logger);
95
+ }
96
+ catch {
97
+ // Fallback if context not available
98
+ return this.logger;
99
+ }
27
100
  }
28
101
  /**
29
102
  * Get a dependency from the provider registry.
@@ -65,9 +138,21 @@ class ExecutionContextBase {
65
138
  this.activeStage = stage;
66
139
  }
67
140
  /**
68
- * Fetch a URL using the standard fetch API.
141
+ * Fetch a URL with context-aware header injection.
142
+ *
143
+ * When FrontMcpContext is available, delegates to ctx.fetch() which:
144
+ * - Auto-injects Authorization header (if authInfo.token is available)
145
+ * - Auto-injects W3C traceparent header for distributed tracing
146
+ * - Auto-injects x-request-id header
147
+ * - Auto-injects custom headers from request metadata
148
+ *
149
+ * Falls back to standard fetch if context is not available.
69
150
  */
70
151
  fetch(input, init) {
152
+ const ctx = this.tryGetContext();
153
+ if (ctx) {
154
+ return ctx.fetch(input, init);
155
+ }
71
156
  return fetch(input, init);
72
157
  }
73
158
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"execution-context.interface.js","sourceRoot":"","sources":["../../../../src/common/interfaces/execution-context.interface.ts"],"names":[],"mappings":";AAAA,sEAAsE;;;AAEtE,mCAAoC;AAIpC,qDAA+C;AAc/C;;;GAGG;AACH,MAAsB,oBAAoB;IAChC,SAAS,CAA4B;IACpC,QAAQ,CAAW;IAE5B,+CAA+C;IAC5B,KAAK,CAAS;IACd,MAAM,CAAiB;IAE1C,gDAAgD;IACtC,WAAW,GAAG,MAAM,CAAC;IAE/B,gCAAgC;IACxB,MAAM,CAAS;IAEvB,YAAY,IAA8B;QACxC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,GAAG,CAAI,KAAe;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,MAAM,CAAI,KAAe;QACvB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;YACpE,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACO,IAAI,CAAC,GAAU;QACvB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAClB,4BAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,KAAa;QAChB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAwB,EAAE,IAAkB;QAChD,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAc,KAAK;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AA9ED,oDA8EC","sourcesContent":["// file: libs/sdk/src/common/interfaces/execution-context.interface.ts\n\nimport { randomUUID } from 'crypto';\nimport { Token } from './base.interface';\nimport { ProviderRegistryInterface } from './internal';\nimport { FrontMcpLogger } from './logger.interface';\nimport { FlowControl } from './flow.interface';\nimport { URL } from 'url';\nimport { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport { ScopeEntry } from '../entries';\n\n/**\n * Base constructor arguments for all execution contexts.\n */\nexport type ExecutionContextBaseArgs = {\n providers: ProviderRegistryInterface;\n logger: FrontMcpLogger;\n authInfo: AuthInfo;\n};\n\n/**\n * Abstract base class for execution contexts (tools, resources, prompts, etc.).\n * Provides common functionality for dependency injection, logging, and flow control.\n */\nexport abstract class ExecutionContextBase<Out = unknown> {\n private providers: ProviderRegistryInterface;\n readonly authInfo: AuthInfo;\n\n /** Unique identifier for this execution run */\n protected readonly runId: string;\n protected readonly logger: FrontMcpLogger;\n\n /** Current stage name for tracking/debugging */\n protected activeStage = 'init';\n\n /** Error if execution failed */\n private _error?: Error;\n\n constructor(args: ExecutionContextBaseArgs) {\n const { providers, logger, authInfo } = args;\n this.runId = randomUUID();\n this.providers = providers;\n this.logger = logger;\n this.authInfo = authInfo;\n }\n\n /**\n * Get a dependency from the provider registry.\n * @throws Error if the dependency is not found\n */\n get<T>(token: Token<T>): T {\n return this.providers.get(token);\n }\n\n /**\n * Get the current scope.\n */\n get scope(): ScopeEntry {\n return this.providers.getScope();\n }\n\n /**\n * Try to get a dependency, returning undefined if not found.\n */\n tryGet<T>(token: Token<T>): T | undefined {\n try {\n return this.providers.get(token);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n this.logger.warn(`Failed to get provider ${String(token)}: ${msg}`);\n return undefined;\n }\n }\n\n /**\n * Fail the execution and trigger error handling.\n */\n protected fail(err: Error): never {\n this._error = err;\n FlowControl.fail(err);\n }\n\n /**\n * Mark the current execution stage (for debugging/tracking).\n */\n mark(stage: string): void {\n this.activeStage = stage;\n }\n\n /**\n * Fetch a URL using the standard fetch API.\n */\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n }\n\n /**\n * Get the current error, if any.\n */\n protected get error(): Error | undefined {\n return this._error;\n }\n}\n"]}
1
+ {"version":3,"file":"execution-context.interface.js","sourceRoot":"","sources":["../../../../src/common/interfaces/execution-context.interface.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/sdk/src/common/interfaces/execution-context.interface.ts\n\nimport { randomUUID } from 'crypto';\nimport { Token } from './base.interface';\nimport { ProviderRegistryInterface } from './internal';\nimport { FrontMcpLogger } from './logger.interface';\nimport { FlowControl } from './flow.interface';\nimport { URL } from 'url';\nimport { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport { ScopeEntry } from '../entries';\nimport { FrontMcpContext, FRONTMCP_CONTEXT } from '../../context';\nimport { RequestContextNotAvailableError } from '../../errors/mcp.error';\n\n/**\n * Base constructor arguments for all execution contexts.\n */\nexport type ExecutionContextBaseArgs = {\n providers: ProviderRegistryInterface;\n logger: FrontMcpLogger;\n authInfo: Partial<AuthInfo>;\n};\n\n/**\n * Abstract base class for execution contexts (tools, resources, prompts, etc.).\n * Provides common functionality for dependency injection, logging, and flow control.\n */\nexport abstract class ExecutionContextBase<Out = unknown> {\n private providers: ProviderRegistryInterface;\n\n /**\n * @deprecated Use `context.authInfo` instead. Will be removed in v2.0.\n */\n private readonly _authInfo: Partial<AuthInfo>;\n\n /** Unique identifier for this execution run */\n protected readonly runId: string;\n protected readonly logger: FrontMcpLogger;\n\n /** Current stage name for tracking/debugging */\n protected activeStage = 'init';\n\n /** Error if execution failed */\n private _error?: Error;\n\n constructor(args: ExecutionContextBaseArgs) {\n const { providers, logger, authInfo } = args;\n this.runId = randomUUID();\n this.providers = providers;\n this.logger = logger;\n this._authInfo = authInfo;\n }\n\n /**\n * Get the current FrontMcpContext.\n *\n * Provides access to requestId, traceId, sessionId, authInfo,\n * timing marks, request metadata, transport, and context-aware fetch.\n *\n * @throws RequestContextNotAvailableError if called outside of a context scope\n */\n get context(): FrontMcpContext {\n try {\n return this.providers.get(FRONTMCP_CONTEXT as Token<FrontMcpContext>);\n } catch {\n // Context not available (likely called during initialization or outside request scope)\n throw new RequestContextNotAvailableError();\n }\n }\n\n /**\n * Try to get the context, returning undefined if not available.\n *\n * Use this when context may not be available (e.g., during initialization).\n */\n tryGetContext(): FrontMcpContext | undefined {\n try {\n return this.providers.get(FRONTMCP_CONTEXT as Token<FrontMcpContext>);\n } catch {\n return undefined;\n }\n }\n\n /**\n * @deprecated Use `context.authInfo` instead. Will be removed in v2.0.\n *\n * Get authentication information for the current request.\n */\n get authInfo(): Partial<AuthInfo> {\n return this._authInfo;\n }\n\n /**\n * Get authentication information for the current request.\n *\n * Prefers context.authInfo when available (the recommended source),\n * falls back to the legacy authInfo property for backward compatibility.\n *\n * Returns Partial<AuthInfo> because auth info is progressively populated\n * during the request lifecycle. Callers should check for required fields.\n */\n getAuthInfo(): Partial<AuthInfo> {\n const ctx = this.tryGetContext();\n if (ctx) {\n return ctx.authInfo;\n }\n return this._authInfo;\n }\n\n /**\n * Get a child logger with request context attached.\n *\n * The logger includes requestId, traceId, and sessionId in its context.\n */\n protected get contextLogger(): FrontMcpLogger {\n try {\n return this.context.getLogger(this.logger);\n } catch {\n // Fallback if context not available\n return this.logger;\n }\n }\n\n /**\n * Get a dependency from the provider registry.\n * @throws Error if the dependency is not found\n */\n get<T>(token: Token<T>): T {\n return this.providers.get(token);\n }\n\n /**\n * Get the current scope.\n */\n get scope(): ScopeEntry {\n return this.providers.getScope();\n }\n\n /**\n * Try to get a dependency, returning undefined if not found.\n */\n tryGet<T>(token: Token<T>): T | undefined {\n try {\n return this.providers.get(token);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n this.logger.warn(`Failed to get provider ${String(token)}: ${msg}`);\n return undefined;\n }\n }\n\n /**\n * Fail the execution and trigger error handling.\n */\n protected fail(err: Error): never {\n this._error = err;\n FlowControl.fail(err);\n }\n\n /**\n * Mark the current execution stage (for debugging/tracking).\n */\n mark(stage: string): void {\n this.activeStage = stage;\n }\n\n /**\n * Fetch a URL with context-aware header injection.\n *\n * When FrontMcpContext is available, delegates to ctx.fetch() which:\n * - Auto-injects Authorization header (if authInfo.token is available)\n * - Auto-injects W3C traceparent header for distributed tracing\n * - Auto-injects x-request-id header\n * - Auto-injects custom headers from request metadata\n *\n * Falls back to standard fetch if context is not available.\n */\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const ctx = this.tryGetContext();\n if (ctx) {\n return ctx.fetch(input, init);\n }\n return fetch(input, init);\n }\n\n /**\n * Get the current error, if any.\n */\n protected get error(): Error | undefined {\n return this._error;\n }\n}\n"]}
@@ -4,6 +4,7 @@ import { z } from 'zod';
4
4
  import { HookEntry, ScopeEntry } from '../entries';
5
5
  import { FlowStateOf } from './internal/flow.utils';
6
6
  import { FrontMcpLogger } from './logger.interface';
7
+ import type { FrontMcpContext } from '../../context/frontmcp-context';
7
8
  export type FlowInputOf<N extends FlowName> = z.infer<ExtendFlows[N]['input']>;
8
9
  export type FlowOutputOf<N extends FlowName> = z.infer<ExtendFlows[N]['output']>;
9
10
  export type FlowPlanOf<N extends FlowName> = ExtendFlows[N]['plan'];
@@ -37,5 +38,17 @@ export declare abstract class FlowBase<N extends FlowName = FlowName> {
37
38
  protected abort(message: string): void;
38
39
  protected next(): void;
39
40
  protected handled(): void;
41
+ /**
42
+ * Get the current FrontMcpContext from AsyncLocalStorage.
43
+ * Available in all stages after context initialization.
44
+ *
45
+ * @throws Error if not in a context scope
46
+ */
47
+ protected get context(): FrontMcpContext;
48
+ /**
49
+ * Safely try to get FrontMcpContext (returns undefined if not available).
50
+ * Use this when context might not be available (e.g., non-HTTP flows).
51
+ */
52
+ protected tryGetContext(): FrontMcpContext | undefined;
40
53
  }
41
54
  export type FlowType<Provide = FlowBase<any>> = Type<Provide>;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FlowBase = exports.FlowControl = void 0;
4
4
  const flow_utils_1 = require("./internal/flow.utils");
5
+ const frontmcp_context_storage_1 = require("../../context/frontmcp-context-storage");
5
6
  class FlowControl extends Error {
6
7
  type;
7
8
  output;
@@ -66,6 +67,29 @@ class FlowBase {
66
67
  handled() {
67
68
  throw FlowControl.handled();
68
69
  }
70
+ /**
71
+ * Get the current FrontMcpContext from AsyncLocalStorage.
72
+ * Available in all stages after context initialization.
73
+ *
74
+ * @throws Error if not in a context scope
75
+ */
76
+ get context() {
77
+ const storage = this.scope.providers.get(frontmcp_context_storage_1.FrontMcpContextStorage);
78
+ return storage.getStoreOrThrow();
79
+ }
80
+ /**
81
+ * Safely try to get FrontMcpContext (returns undefined if not available).
82
+ * Use this when context might not be available (e.g., non-HTTP flows).
83
+ */
84
+ tryGetContext() {
85
+ try {
86
+ const storage = this.scope.providers.get(frontmcp_context_storage_1.FrontMcpContextStorage);
87
+ return storage.getStore();
88
+ }
89
+ catch {
90
+ return undefined;
91
+ }
92
+ }
69
93
  }
70
94
  exports.FlowBase = FlowBase;
71
95
  //# sourceMappingURL=flow.interface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flow.interface.js","sourceRoot":"","sources":["../../../../src/common/interfaces/flow.interface.ts"],"names":[],"mappings":";;;AAIA,sDAA+D;AAY/D,MAAa,WAAY,SAAQ,KAAK;IACR;IAAuC;IAAnE,YAA4B,IAAqB,EAAkB,MAAW;QAC5E,KAAK,EAAE,CAAC;QADkB,SAAI,GAAJ,IAAI,CAAiB;QAAkB,WAAM,GAAN,MAAM,CAAK;IAE9E,CAAC;IAED,MAAM,CAAC,OAAO,CAAI,MAAS;QACzB,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,IAAI;QACT,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,OAAO;QACZ,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAY;QACtB,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAc;QACzB,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;CACF;AAxBD,kCAwBC;AAED,uCAAuC;AACvC,MAAsB,QAAQ;IAMP;IACV;IACU;IACA;IACA;IATX,KAAK,CAAiB;IAChC,KAAK,GAAmB,sBAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,WAAW,CAAiB;IAE5B,YACqB,QAAyB,EACnC,QAAuC,EAC7B,KAAiB,EACjB,kBAAgD,EAChD,OAAoC,IAAI,GAAG,EAAE;QAJ7C,aAAQ,GAAR,QAAQ,CAAiB;QACnC,aAAQ,GAAR,QAAQ,CAA+B;QAC7B,UAAK,GAAL,KAAK,CAAY;QACjB,uBAAkB,GAAlB,kBAAkB,CAA8B;QAChD,SAAI,GAAJ,IAAI,CAAyC;QAEhE,IAAI,CAAC,KAAK,GAAI,QAAQ,CAAC,WAAmB,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,GAAG,CAAI,KAAe;QACpB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAM,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,MAAuB;QAC7B,MAAM,WAAW,CAAC,OAAO,CAAE,IAAI,CAAC,QAAQ,CAAC,YAAiC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,CAAC,KAAY;QACf,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAES,KAAK,CAAC,OAAe;QAC7B,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAES,IAAI;QACZ,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAES,OAAO;QACf,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;CACF;AAxCD,4BAwCC","sourcesContent":["import { Token, Type } from './base.interface';\nimport { FlowMetadata, FlowName } from '../metadata';\nimport { z } from 'zod';\nimport { HookEntry, ScopeEntry } from '../entries';\nimport { FlowState, FlowStateOf } from './internal/flow.utils';\nimport { FrontMcpLogger } from './logger.interface';\n\nexport type FlowInputOf<N extends FlowName> = z.infer<ExtendFlows[N]['input']>;\nexport type FlowOutputOf<N extends FlowName> = z.infer<ExtendFlows[N]['output']>;\nexport type FlowPlanOf<N extends FlowName> = ExtendFlows[N]['plan'];\nexport type FlowCtxOf<N extends FlowName> = ExtendFlows[N]['ctx'];\nexport type FlowStagesOf<N extends FlowName> = ExtendFlows[N]['stage'];\nexport type FlowExecuteStagesOf<N extends FlowName> = ExtendFlows[N]['executeStage'];\n\nexport type FlowControlType = 'respond' | 'fail' | 'abort' | 'next' | 'handled';\n\nexport class FlowControl extends Error {\n constructor(public readonly type: FlowControlType, public readonly output: any) {\n super();\n }\n\n static respond<T>(output: T): never {\n throw new FlowControl('respond', output);\n }\n\n static next(): never {\n throw new FlowControl('next', null);\n }\n\n static handled(): never {\n throw new FlowControl('handled', null);\n }\n\n static fail(error: Error): never {\n throw new FlowControl('fail', { error: error.message });\n }\n\n static abort(reason: string): never {\n throw new FlowControl('abort', reason);\n }\n}\n\n// 1) The actual abstract class (value)\nexport abstract class FlowBase<N extends FlowName = FlowName> {\n protected input: FlowInputOf<N>;\n state: FlowStateOf<N> = FlowState.create({});\n scopeLogger: FrontMcpLogger;\n\n constructor(\n protected readonly metadata: FlowMetadata<N>,\n readonly rawInput: Partial<FlowInputOf<N>> | any,\n protected readonly scope: ScopeEntry,\n protected readonly appendContextHooks: (hooks: HookEntry[]) => void,\n protected readonly deps: ReadonlyMap<Token, unknown> = new Map(),\n ) {\n this.input = (metadata.inputSchema as any)?.parse?.(rawInput);\n this.scopeLogger = scope.logger;\n }\n\n get<T>(token: Token<T>): T {\n if (this.deps.has(token)) return this.deps.get(token) as T;\n return this.scope.providers.get(token);\n }\n\n respond(output: FlowOutputOf<N>) {\n throw FlowControl.respond((this.metadata.outputSchema as z.ZodObject<any>).parse(output));\n }\n\n fail(error: Error) {\n throw FlowControl.fail(error);\n }\n\n protected abort(message: string) {\n throw FlowControl.abort(message);\n }\n\n protected next() {\n throw FlowControl.next();\n }\n\n protected handled() {\n throw FlowControl.handled();\n }\n}\n\nexport type FlowType<Provide = FlowBase<any>> = Type<Provide>;\n"]}
1
+ {"version":3,"file":"flow.interface.js","sourceRoot":"","sources":["../../../../src/common/interfaces/flow.interface.ts"],"names":[],"mappings":"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","sourcesContent":["import { Token, Type } from './base.interface';\nimport { FlowMetadata, FlowName } from '../metadata';\nimport { z } from 'zod';\nimport { HookEntry, ScopeEntry } from '../entries';\nimport { FlowState, FlowStateOf } from './internal/flow.utils';\nimport { FrontMcpLogger } from './logger.interface';\nimport type { FrontMcpContext } from '../../context/frontmcp-context';\nimport { FrontMcpContextStorage } from '../../context/frontmcp-context-storage';\n\nexport type FlowInputOf<N extends FlowName> = z.infer<ExtendFlows[N]['input']>;\nexport type FlowOutputOf<N extends FlowName> = z.infer<ExtendFlows[N]['output']>;\nexport type FlowPlanOf<N extends FlowName> = ExtendFlows[N]['plan'];\nexport type FlowCtxOf<N extends FlowName> = ExtendFlows[N]['ctx'];\nexport type FlowStagesOf<N extends FlowName> = ExtendFlows[N]['stage'];\nexport type FlowExecuteStagesOf<N extends FlowName> = ExtendFlows[N]['executeStage'];\n\nexport type FlowControlType = 'respond' | 'fail' | 'abort' | 'next' | 'handled';\n\nexport class FlowControl extends Error {\n constructor(public readonly type: FlowControlType, public readonly output: any) {\n super();\n }\n\n static respond<T>(output: T): never {\n throw new FlowControl('respond', output);\n }\n\n static next(): never {\n throw new FlowControl('next', null);\n }\n\n static handled(): never {\n throw new FlowControl('handled', null);\n }\n\n static fail(error: Error): never {\n throw new FlowControl('fail', { error: error.message });\n }\n\n static abort(reason: string): never {\n throw new FlowControl('abort', reason);\n }\n}\n\n// 1) The actual abstract class (value)\nexport abstract class FlowBase<N extends FlowName = FlowName> {\n protected input: FlowInputOf<N>;\n state: FlowStateOf<N> = FlowState.create({});\n scopeLogger: FrontMcpLogger;\n\n constructor(\n protected readonly metadata: FlowMetadata<N>,\n readonly rawInput: Partial<FlowInputOf<N>> | any,\n protected readonly scope: ScopeEntry,\n protected readonly appendContextHooks: (hooks: HookEntry[]) => void,\n protected readonly deps: ReadonlyMap<Token, unknown> = new Map(),\n ) {\n this.input = (metadata.inputSchema as any)?.parse?.(rawInput);\n this.scopeLogger = scope.logger;\n }\n\n get<T>(token: Token<T>): T {\n if (this.deps.has(token)) return this.deps.get(token) as T;\n return this.scope.providers.get(token);\n }\n\n respond(output: FlowOutputOf<N>) {\n throw FlowControl.respond((this.metadata.outputSchema as z.ZodObject<any>).parse(output));\n }\n\n fail(error: Error) {\n throw FlowControl.fail(error);\n }\n\n protected abort(message: string) {\n throw FlowControl.abort(message);\n }\n\n protected next() {\n throw FlowControl.next();\n }\n\n protected handled() {\n throw FlowControl.handled();\n }\n\n /**\n * Get the current FrontMcpContext from AsyncLocalStorage.\n * Available in all stages after context initialization.\n *\n * @throws Error if not in a context scope\n */\n protected get context(): FrontMcpContext {\n const storage = this.scope.providers.get(FrontMcpContextStorage);\n return storage.getStoreOrThrow();\n }\n\n /**\n * Safely try to get FrontMcpContext (returns undefined if not available).\n * Use this when context might not be available (e.g., non-HTTP flows).\n */\n protected tryGetContext(): FrontMcpContext | undefined {\n try {\n const storage = this.scope.providers.get(FrontMcpContextStorage);\n return storage.getStore();\n } catch {\n return undefined;\n }\n }\n}\n\nexport type FlowType<Provide = FlowBase<any>> = Type<Provide>;\n"]}
@@ -39,6 +39,15 @@ export declare abstract class FrontMcpServer {
39
39
  * with the gateway's request/response processing.
40
40
  */
41
41
  abstract enhancedHandler(handler: ServerRequestHandler): (req: any, res: any, next: () => any) => Promise<void> | void;
42
+ /**
43
+ * Prepares the server routes without starting the HTTP listener.
44
+ * Used for serverless deployments (Vercel, AWS Lambda, etc.)
45
+ */
46
+ abstract prepare(): void;
47
+ /**
48
+ * Returns the underlying HTTP handler for serverless exports.
49
+ */
50
+ abstract getHandler(): unknown;
42
51
  /**
43
52
  * Start the server on the specified port
44
53
  */
@@ -1 +1 @@
1
- {"version":3,"file":"server.interface.js","sourceRoot":"","sources":["../../../../src/common/interfaces/server.interface.ts"],"names":[],"mappings":";;;AAAA,+BAA6E;AAK7E,MAAa,aAAc,SAAQ,sBAAe;IAEhD,IAAI,CAAS;IAGb,KAAK,CAAoC;IACzC,IAAI,CAAO;IACX,WAAW,CAAiB;CAC7B;AARD,sCAQC;AAED,MAAsB,cAAe,SAAQ,qBAAkB;CAU9D;AAVD,wCAUC;AAMD,MAAsB,cAAc;CA+BnC;AA/BD,wCA+BC","sourcesContent":["import { IncomingMessage, ServerResponse as HttpServerResponse } from 'http';\nimport { Authorization } from '../types'; // TODO: move to internal\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';\n\nexport class ServerRequest extends IncomingMessage {\n declare method: HttpMethod;\n path: string;\n declare url: string;\n declare headers: Record<string, string>;\n query: Record<string, string | string[]>;\n body?: any;\n authSession?: Authorization;\n}\n\nexport abstract class ServerResponse extends HttpServerResponse {\n abstract status(code: number): ServerResponse;\n\n abstract json(payload: any): void;\n\n abstract send(payload: any): void;\n\n abstract redirect(url: string): void;\n\n abstract redirect(status: number, url: string): void;\n}\n\nexport type NextFn = () => Promise<void> | void;\n\nexport type ServerRequestHandler = (req: ServerRequest, res: ServerResponse, next: NextFn) => Promise<void> | void;\n\nexport abstract class FrontMcpServer {\n\n /**\n * Register a middleware handler for a specific entry path.\n * @param entryPath - e.g. '' or '/mcp'\n * @param handler - (req, res, next) => {// middleware // next()}\n */\n abstract registerMiddleware(entryPath: string, handler: ServerRequestHandler): Promise<void> | void;\n\n /**\n * Register a route handler for a specific path.\n * @param method - e.g. 'GET' or 'POST'\n * @param path - e.g. '/mcp/invoke'\n * @param handler - (req, res) => {// route handler // res.end() }\n */\n abstract registerRoute(method: HttpMethod, path: string, handler: ServerRequestHandler): Promise<void> | void;\n\n /**\n * Enhance a request handler with request/response processing and error handling.\n * This handle will be stored as the first middleware in the chain to align adapter handler\n * with the gateway's request/response processing.\n */\n abstract enhancedHandler(\n handler: ServerRequestHandler,\n ): (req: any, res: any, next: () => any) => Promise<void> | void;\n\n\n /**\n * Start the server on the specified port\n */\n abstract start(port?: number): Promise<void> | void;\n}"]}
1
+ {"version":3,"file":"server.interface.js","sourceRoot":"","sources":["../../../../src/common/interfaces/server.interface.ts"],"names":[],"mappings":";;;AAAA,+BAA6E;AAK7E,MAAa,aAAc,SAAQ,sBAAe;IAEhD,IAAI,CAAS;IAGb,KAAK,CAAoC;IACzC,IAAI,CAAO;IACX,WAAW,CAAiB;CAC7B;AARD,sCAQC;AAED,MAAsB,cAAe,SAAQ,qBAAkB;CAU9D;AAVD,wCAUC;AAMD,MAAsB,cAAc;CAwCnC;AAxCD,wCAwCC","sourcesContent":["import { IncomingMessage, ServerResponse as HttpServerResponse } from 'http';\nimport { Authorization } from '../types'; // TODO: move to internal\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';\n\nexport class ServerRequest extends IncomingMessage {\n declare method: HttpMethod;\n path: string;\n declare url: string;\n declare headers: Record<string, string>;\n query: Record<string, string | string[]>;\n body?: any;\n authSession?: Authorization;\n}\n\nexport abstract class ServerResponse extends HttpServerResponse {\n abstract status(code: number): ServerResponse;\n\n abstract json(payload: any): void;\n\n abstract send(payload: any): void;\n\n abstract redirect(url: string): void;\n\n abstract redirect(status: number, url: string): void;\n}\n\nexport type NextFn = () => Promise<void> | void;\n\nexport type ServerRequestHandler = (req: ServerRequest, res: ServerResponse, next: NextFn) => Promise<void> | void;\n\nexport abstract class FrontMcpServer {\n /**\n * Register a middleware handler for a specific entry path.\n * @param entryPath - e.g. '' or '/mcp'\n * @param handler - (req, res, next) => {// middleware // next()}\n */\n abstract registerMiddleware(entryPath: string, handler: ServerRequestHandler): Promise<void> | void;\n\n /**\n * Register a route handler for a specific path.\n * @param method - e.g. 'GET' or 'POST'\n * @param path - e.g. '/mcp/invoke'\n * @param handler - (req, res) => {// route handler // res.end() }\n */\n abstract registerRoute(method: HttpMethod, path: string, handler: ServerRequestHandler): Promise<void> | void;\n\n /**\n * Enhance a request handler with request/response processing and error handling.\n * This handle will be stored as the first middleware in the chain to align adapter handler\n * with the gateway's request/response processing.\n */\n abstract enhancedHandler(\n handler: ServerRequestHandler,\n ): (req: any, res: any, next: () => any) => Promise<void> | void;\n\n /**\n * Prepares the server routes without starting the HTTP listener.\n * Used for serverless deployments (Vercel, AWS Lambda, etc.)\n */\n abstract prepare(): void;\n\n /**\n * Returns the underlying HTTP handler for serverless exports.\n */\n abstract getHandler(): unknown;\n\n /**\n * Start the server on the specified port\n */\n abstract start(port?: number): Promise<void> | void;\n}\n"]}
@@ -110,6 +110,19 @@ export declare const frontMcpLocalAppMetadataSchema: z.ZodObject<{
110
110
  enableStatelessHttp: z.ZodDefault<z.ZodBoolean>;
111
111
  enableStatefulHttp: z.ZodDefault<z.ZodBoolean>;
112
112
  requireSessionForStreamable: z.ZodDefault<z.ZodBoolean>;
113
+ recreation: z.ZodOptional<z.ZodLazy<z.ZodObject<{
114
+ enabled: z.ZodDefault<z.ZodBoolean>;
115
+ redis: z.ZodOptional<z.ZodObject<{
116
+ host: z.ZodString;
117
+ port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
118
+ password: z.ZodOptional<z.ZodString>;
119
+ db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
120
+ tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
121
+ keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
122
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
123
+ }, z.core.$strip>>;
124
+ defaultTtlMs: z.ZodDefault<z.ZodNumber>;
125
+ }, z.core.$strip>>>;
113
126
  }, z.core.$strip>>;
114
127
  }, z.core.$strip>, z.ZodObject<{
115
128
  mode: z.ZodLiteral<"transparent">;
@@ -146,6 +159,19 @@ export declare const frontMcpLocalAppMetadataSchema: z.ZodObject<{
146
159
  enableStatelessHttp: z.ZodDefault<z.ZodBoolean>;
147
160
  enableStatefulHttp: z.ZodDefault<z.ZodBoolean>;
148
161
  requireSessionForStreamable: z.ZodDefault<z.ZodBoolean>;
162
+ recreation: z.ZodOptional<z.ZodLazy<z.ZodObject<{
163
+ enabled: z.ZodDefault<z.ZodBoolean>;
164
+ redis: z.ZodOptional<z.ZodObject<{
165
+ host: z.ZodString;
166
+ port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
167
+ password: z.ZodOptional<z.ZodString>;
168
+ db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
169
+ tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
170
+ keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
171
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
172
+ }, z.core.$strip>>;
173
+ defaultTtlMs: z.ZodDefault<z.ZodNumber>;
174
+ }, z.core.$strip>>>;
149
175
  }, z.core.$strip>>;
150
176
  }, z.core.$strip>, z.ZodObject<{
151
177
  mode: z.ZodLiteral<"orchestrated">;
@@ -168,6 +194,7 @@ export declare const frontMcpLocalAppMetadataSchema: z.ZodObject<{
168
194
  db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
169
195
  tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
170
196
  keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
197
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
171
198
  }, z.core.$strip>;
172
199
  }, z.core.$strip>], "type">>;
173
200
  sessionMode: z.ZodDefault<z.ZodEnum<{
@@ -213,6 +240,19 @@ export declare const frontMcpLocalAppMetadataSchema: z.ZodObject<{
213
240
  enableStatelessHttp: z.ZodDefault<z.ZodBoolean>;
214
241
  enableStatefulHttp: z.ZodDefault<z.ZodBoolean>;
215
242
  requireSessionForStreamable: z.ZodDefault<z.ZodBoolean>;
243
+ recreation: z.ZodOptional<z.ZodLazy<z.ZodObject<{
244
+ enabled: z.ZodDefault<z.ZodBoolean>;
245
+ redis: z.ZodOptional<z.ZodObject<{
246
+ host: z.ZodString;
247
+ port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
248
+ password: z.ZodOptional<z.ZodString>;
249
+ db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
250
+ tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
251
+ keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
252
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
253
+ }, z.core.$strip>>;
254
+ defaultTtlMs: z.ZodDefault<z.ZodNumber>;
255
+ }, z.core.$strip>>>;
216
256
  }, z.core.$strip>>;
217
257
  }, z.core.$strip>, z.ZodObject<{
218
258
  mode: z.ZodLiteral<"orchestrated">;
@@ -252,6 +292,7 @@ export declare const frontMcpLocalAppMetadataSchema: z.ZodObject<{
252
292
  db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
253
293
  tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
254
294
  keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
295
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
255
296
  }, z.core.$strip>;
256
297
  }, z.core.$strip>], "type">>;
257
298
  sessionMode: z.ZodDefault<z.ZodEnum<{
@@ -297,6 +338,19 @@ export declare const frontMcpLocalAppMetadataSchema: z.ZodObject<{
297
338
  enableStatelessHttp: z.ZodDefault<z.ZodBoolean>;
298
339
  enableStatefulHttp: z.ZodDefault<z.ZodBoolean>;
299
340
  requireSessionForStreamable: z.ZodDefault<z.ZodBoolean>;
341
+ recreation: z.ZodOptional<z.ZodLazy<z.ZodObject<{
342
+ enabled: z.ZodDefault<z.ZodBoolean>;
343
+ redis: z.ZodOptional<z.ZodObject<{
344
+ host: z.ZodString;
345
+ port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
346
+ password: z.ZodOptional<z.ZodString>;
347
+ db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
348
+ tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
349
+ keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
350
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
351
+ }, z.core.$strip>>;
352
+ defaultTtlMs: z.ZodDefault<z.ZodNumber>;
353
+ }, z.core.$strip>>>;
300
354
  }, z.core.$strip>>;
301
355
  }, z.core.$strip>]>>;
302
356
  standalone: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"includeInParent">, z.ZodBoolean]>>>;
@@ -373,6 +427,19 @@ export declare const frontMcpRemoteAppMetadataSchema: z.ZodObject<{
373
427
  enableStatelessHttp: z.ZodDefault<z.ZodBoolean>;
374
428
  enableStatefulHttp: z.ZodDefault<z.ZodBoolean>;
375
429
  requireSessionForStreamable: z.ZodDefault<z.ZodBoolean>;
430
+ recreation: z.ZodOptional<z.ZodLazy<z.ZodObject<{
431
+ enabled: z.ZodDefault<z.ZodBoolean>;
432
+ redis: z.ZodOptional<z.ZodObject<{
433
+ host: z.ZodString;
434
+ port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
435
+ password: z.ZodOptional<z.ZodString>;
436
+ db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
437
+ tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
438
+ keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
439
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
440
+ }, z.core.$strip>>;
441
+ defaultTtlMs: z.ZodDefault<z.ZodNumber>;
442
+ }, z.core.$strip>>>;
376
443
  }, z.core.$strip>>;
377
444
  }, z.core.$strip>, z.ZodObject<{
378
445
  mode: z.ZodLiteral<"transparent">;
@@ -409,6 +476,19 @@ export declare const frontMcpRemoteAppMetadataSchema: z.ZodObject<{
409
476
  enableStatelessHttp: z.ZodDefault<z.ZodBoolean>;
410
477
  enableStatefulHttp: z.ZodDefault<z.ZodBoolean>;
411
478
  requireSessionForStreamable: z.ZodDefault<z.ZodBoolean>;
479
+ recreation: z.ZodOptional<z.ZodLazy<z.ZodObject<{
480
+ enabled: z.ZodDefault<z.ZodBoolean>;
481
+ redis: z.ZodOptional<z.ZodObject<{
482
+ host: z.ZodString;
483
+ port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
484
+ password: z.ZodOptional<z.ZodString>;
485
+ db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
486
+ tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
487
+ keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
488
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
489
+ }, z.core.$strip>>;
490
+ defaultTtlMs: z.ZodDefault<z.ZodNumber>;
491
+ }, z.core.$strip>>>;
412
492
  }, z.core.$strip>>;
413
493
  }, z.core.$strip>, z.ZodObject<{
414
494
  mode: z.ZodLiteral<"orchestrated">;
@@ -431,6 +511,7 @@ export declare const frontMcpRemoteAppMetadataSchema: z.ZodObject<{
431
511
  db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
432
512
  tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
433
513
  keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
514
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
434
515
  }, z.core.$strip>;
435
516
  }, z.core.$strip>], "type">>;
436
517
  sessionMode: z.ZodDefault<z.ZodEnum<{
@@ -476,6 +557,19 @@ export declare const frontMcpRemoteAppMetadataSchema: z.ZodObject<{
476
557
  enableStatelessHttp: z.ZodDefault<z.ZodBoolean>;
477
558
  enableStatefulHttp: z.ZodDefault<z.ZodBoolean>;
478
559
  requireSessionForStreamable: z.ZodDefault<z.ZodBoolean>;
560
+ recreation: z.ZodOptional<z.ZodLazy<z.ZodObject<{
561
+ enabled: z.ZodDefault<z.ZodBoolean>;
562
+ redis: z.ZodOptional<z.ZodObject<{
563
+ host: z.ZodString;
564
+ port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
565
+ password: z.ZodOptional<z.ZodString>;
566
+ db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
567
+ tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
568
+ keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
569
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
570
+ }, z.core.$strip>>;
571
+ defaultTtlMs: z.ZodDefault<z.ZodNumber>;
572
+ }, z.core.$strip>>>;
479
573
  }, z.core.$strip>>;
480
574
  }, z.core.$strip>, z.ZodObject<{
481
575
  mode: z.ZodLiteral<"orchestrated">;
@@ -515,6 +609,7 @@ export declare const frontMcpRemoteAppMetadataSchema: z.ZodObject<{
515
609
  db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
516
610
  tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
517
611
  keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
612
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
518
613
  }, z.core.$strip>;
519
614
  }, z.core.$strip>], "type">>;
520
615
  sessionMode: z.ZodDefault<z.ZodEnum<{
@@ -560,6 +655,19 @@ export declare const frontMcpRemoteAppMetadataSchema: z.ZodObject<{
560
655
  enableStatelessHttp: z.ZodDefault<z.ZodBoolean>;
561
656
  enableStatefulHttp: z.ZodDefault<z.ZodBoolean>;
562
657
  requireSessionForStreamable: z.ZodDefault<z.ZodBoolean>;
658
+ recreation: z.ZodOptional<z.ZodLazy<z.ZodObject<{
659
+ enabled: z.ZodDefault<z.ZodBoolean>;
660
+ redis: z.ZodOptional<z.ZodObject<{
661
+ host: z.ZodString;
662
+ port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
663
+ password: z.ZodOptional<z.ZodString>;
664
+ db: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
665
+ tls: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
666
+ keyPrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
667
+ defaultTtlMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
668
+ }, z.core.$strip>>;
669
+ defaultTtlMs: z.ZodDefault<z.ZodNumber>;
670
+ }, z.core.$strip>>>;
563
671
  }, z.core.$strip>>;
564
672
  }, z.core.$strip>]>>;
565
673
  standalone: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"includeInParent">, z.ZodBoolean]>>>;