libmodulor 0.29.0 → 0.31.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.
- package/CHANGELOG.md +66 -0
- package/README.md +2 -2
- package/dist/esm/apps/Helper/src/lib/layers/product.js +1 -1
- package/dist/esm/apps/Helper/src/lib/layers/project.js +7 -7
- package/dist/esm/apps/Helper/src/lib/layers/target.js +27 -11
- package/dist/esm/convention.d.ts +2 -0
- package/dist/esm/convention.js +1 -0
- package/dist/esm/dt/base/TObject.js +13 -5
- package/dist/esm/dt/index.d.ts +1 -1
- package/dist/esm/dt/targets/json-schema.d.ts +23 -11
- package/dist/esm/error/funcs.d.ts +1 -0
- package/dist/esm/error/funcs.js +4 -0
- package/dist/esm/error/index.d.ts +1 -1
- package/dist/esm/error/index.js +1 -1
- package/dist/esm/i18n/WordingManager.js +12 -4
- package/dist/esm/i18n/locales/de.js +2 -0
- package/dist/esm/i18n/locales/en.js +2 -0
- package/dist/esm/i18n/locales/es.js +2 -0
- package/dist/esm/i18n/locales/fr.js +2 -0
- package/dist/esm/i18n/types.d.ts +1 -1
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.instrumentation-otl.d.ts +1 -0
- package/dist/esm/index.instrumentation-otl.js +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.node-express.d.ts +2 -0
- package/dist/esm/index.node-express.js +1 -0
- package/dist/esm/index.node-hono.d.ts +2 -0
- package/dist/esm/index.node-hono.js +1 -0
- package/dist/esm/index.node-mcp-express.d.ts +3 -0
- package/dist/esm/index.node-mcp-express.js +2 -0
- package/dist/esm/index.node-mcp-hono.d.ts +3 -0
- package/dist/esm/index.node-mcp-hono.js +2 -0
- package/dist/esm/index.node-mcp.d.ts +3 -1
- package/dist/esm/index.node-mcp.js +3 -1
- package/dist/esm/instrumentation/instrumentation-otl.d.ts +12 -0
- package/dist/esm/instrumentation/instrumentation-otl.js +119 -0
- package/dist/esm/products/Helper/i18n.d.ts +2 -0
- package/dist/esm/std/CryptoManager.d.ts +1 -1
- package/dist/esm/std/HTTPAPICaller.d.ts +2 -1
- package/dist/esm/std/impl/JoseJWTManager.js +9 -4
- package/dist/esm/std/impl/SimpleHTTPAPICaller.js +13 -7
- package/dist/esm/std/lib/settings.js +4 -5
- package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.d.ts +2 -0
- package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.js +3 -0
- package/dist/esm/target/index.d.ts +1 -1
- package/dist/esm/target/index.js +1 -1
- package/dist/esm/target/lib/client/AuthDataStore.d.ts +5 -0
- package/dist/esm/target/lib/client/impl/InMemoryAuthDataStore.d.ts +7 -0
- package/dist/esm/target/lib/client/impl/InMemoryAuthDataStore.js +20 -0
- package/dist/esm/target/lib/client/impl/MixedServerClientManager.d.ts +15 -0
- package/dist/esm/target/lib/client/impl/MixedServerClientManager.js +44 -0
- package/dist/esm/target/lib/json-schema/error.d.ts +3 -0
- package/dist/esm/target/lib/json-schema/error.js +14 -0
- package/dist/esm/target/lib/json-schema/input.d.ts +16 -0
- package/dist/esm/target/lib/json-schema/input.js +67 -0
- package/dist/esm/target/lib/json-schema/output.d.ts +19 -0
- package/dist/esm/target/lib/json-schema/output.js +128 -0
- package/dist/esm/target/lib/manifest.d.ts +32 -1
- package/dist/esm/target/lib/manifest.js +22 -1
- package/dist/esm/target/lib/mcp-server/MCPServerRequestChecker.d.ts +22 -0
- package/dist/esm/target/lib/mcp-server/MCPServerRequestChecker.js +71 -0
- package/dist/esm/target/lib/mcp-server/MCPServerRequestHandler.d.ts +16 -0
- package/dist/esm/target/lib/mcp-server/MCPServerRequestHandler.js +54 -0
- package/dist/esm/target/lib/mcp-server/consts.d.ts +1 -0
- package/dist/esm/target/lib/mcp-server/consts.js +1 -0
- package/dist/esm/target/lib/mcp-server/funcs.d.ts +13 -0
- package/dist/esm/target/lib/mcp-server/funcs.js +84 -0
- package/dist/esm/target/lib/mcp-server/http/MCPHTTPRequestHandlerBuilder.d.ts +14 -0
- package/dist/esm/target/lib/mcp-server/http/MCPHTTPRequestHandlerBuilder.js +1 -0
- package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressFakeRequestHandlerBuilder.d.ts +5 -0
- package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressFakeRequestHandlerBuilder.js +18 -0
- package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.d.ts +17 -0
- package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.js +100 -0
- package/dist/esm/target/lib/mcp-server/http/express/types.d.ts +3 -0
- package/dist/esm/target/lib/mcp-server/http/express/types.js +1 -0
- package/dist/esm/target/lib/mcp-server/http/funcs.d.ts +6 -0
- package/dist/esm/target/lib/mcp-server/http/funcs.js +50 -0
- package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoFakeRequestHandlerBuilder.d.ts +5 -0
- package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoFakeRequestHandlerBuilder.js +18 -0
- package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.d.ts +17 -0
- package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.js +100 -0
- package/dist/esm/target/lib/mcp-server/http/hono/types.d.ts +3 -0
- package/dist/esm/target/lib/mcp-server/http/hono/types.js +1 -0
- package/dist/esm/target/lib/mcp-server/stdio/MCPStdioRequestHandler.d.ts +31 -0
- package/dist/esm/target/lib/mcp-server/stdio/MCPStdioRequestHandler.js +108 -0
- package/dist/esm/target/lib/mcp-server/stdio/MCPStdioUCClientConfirmManager.d.ts +7 -0
- package/dist/esm/target/lib/mcp-server/stdio/MCPStdioUCClientConfirmManager.js +36 -0
- package/dist/esm/target/lib/mcp-server/stdio/consts.d.ts +2 -0
- package/dist/esm/target/lib/mcp-server/stdio/consts.js +3 -0
- package/dist/esm/target/lib/mcp-server/stdio/funcs.d.ts +2 -0
- package/dist/esm/target/lib/mcp-server/stdio/funcs.js +10 -0
- package/dist/esm/target/lib/mcp-server/stdio/input.d.ts +10 -0
- package/dist/esm/target/lib/mcp-server/stdio/input.js +15 -0
- package/dist/esm/target/lib/mcp-server/types.d.ts +2 -0
- package/dist/esm/target/lib/mcp-server/types.js +1 -0
- package/dist/esm/target/lib/openapi/OpenAPISpecBuilder.js +8 -4
- package/dist/esm/target/lib/openapi/funcs.d.ts +4 -9
- package/dist/esm/target/lib/openapi/funcs.js +18 -119
- package/dist/esm/target/lib/openapi/types.d.ts +5 -16
- package/dist/esm/target/lib/react/useAction.js +0 -1
- package/dist/esm/target/lib/react/useUC.js +0 -3
- package/dist/esm/target/lib/server/AuthenticationChecker.js +15 -10
- package/dist/esm/target/lib/server/JWTAuthenticationChecker.d.ts +1 -0
- package/dist/esm/target/lib/server/JWTAuthenticationChecker.js +11 -2
- package/dist/esm/target/lib/server/ServerBooter.d.ts +1 -1
- package/dist/esm/target/lib/server/ServerBooter.js +10 -0
- package/dist/esm/target/lib/server/ServerManager.d.ts +10 -0
- package/dist/esm/target/lib/server/ServerRequestHandler.d.ts +10 -5
- package/dist/esm/target/lib/server/ServerRequestHandler.js +35 -25
- package/dist/esm/target/lib/server/consts.js +4 -0
- package/dist/esm/target/lib/server-express/funcs.js +2 -6
- package/dist/esm/target/lib/server-hono/funcs.js +4 -2
- package/dist/esm/target/lib/shared.d.ts +1 -0
- package/dist/esm/target/lib/shared.js +1 -0
- package/dist/esm/target/nextjs-server/NextJSServerManager.d.ts +2 -0
- package/dist/esm/target/nextjs-server/NextJSServerManager.js +3 -0
- package/dist/esm/target/node-express-server/NodeExpressServerManager.d.ts +6 -2
- package/dist/esm/target/node-express-server/NodeExpressServerManager.js +15 -6
- package/dist/esm/target/node-hono-server/NodeHonoServerManager.d.ts +6 -2
- package/dist/esm/target/node-hono-server/NodeHonoServerManager.js +15 -6
- package/dist/esm/target/{node-mcp-server/NodeLocalStdioMCPServerManager.d.ts → node-mcp-server-stdio/NodeMCPStdioServerManager.d.ts} +9 -20
- package/dist/esm/target/node-mcp-server-stdio/NodeMCPStdioServerManager.js +108 -0
- package/dist/esm/target/react-native-pure/UCFormFieldControl.js +0 -1
- package/dist/esm/testing/impl/NodeAppTesterConfigurator.js +7 -0
- package/dist/esm/testing/impl/newNodeAppTester.js +12 -0
- package/dist/esm/uc/cardinality.d.ts +7 -0
- package/dist/esm/uc/cardinality.js +14 -0
- package/dist/esm/uc/examples.d.ts +2 -0
- package/dist/esm/uc/examples.js +12 -0
- package/dist/esm/uc/helpers/UCOutputReader.d.ts +2 -2
- package/dist/esm/uc/helpers/UCOutputReader.js +2 -2
- package/dist/esm/uc/index.d.ts +2 -0
- package/dist/esm/uc/index.js +2 -0
- package/dist/esm/uc/input-field.d.ts +3 -6
- package/dist/esm/uc/input-field.js +5 -21
- package/dist/esm/uc/opi.d.ts +3 -1
- package/dist/esm/uc/opi.js +4 -1
- package/dist/esm/uc/output-field.d.ts +13 -1
- package/dist/esm/uc/output-field.js +9 -11
- package/dist/esm/utils/bundling/funcs.js +1 -1
- package/dist/esm/utils/bundling/vite/plugin.d.ts +1 -1
- package/dist/esm/utils/index.d.ts +1 -0
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/streams/funcs.d.ts +2 -0
- package/dist/esm/utils/streams/funcs.js +10 -0
- package/dist/esm/utils/strings/humanize.js +4 -1
- package/package.json +47 -20
- package/dist/esm/target/lib/openapi/consts.d.ts +0 -2
- package/dist/esm/target/lib/openapi/consts.js +0 -1
- package/dist/esm/target/lib/openapi/input.d.ts +0 -16
- package/dist/esm/target/lib/openapi/input.js +0 -33
- package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.js +0 -188
- package/dist/esm/target/node-mcp-server/funcs.d.ts +0 -7
- package/dist/esm/target/node-mcp-server/funcs.js +0 -45
- package/dist/esm/target/node-mcp-server/types.d.ts +0 -15
- /package/dist/esm/target/{node-mcp-server/types.js → lib/client/AuthDataStore.js} +0 -0
|
@@ -5,7 +5,6 @@ export function useAction({ action, autoExec = false, confirm, onError, onInit,
|
|
|
5
5
|
const [errMsg, setErrMsg] = useState(null);
|
|
6
6
|
const [execRes, setExecRes] = useState(null);
|
|
7
7
|
const [execState, setExecState] = useState(onInit ? UCExecState.INITIALIZING : UCExecState.IDLE);
|
|
8
|
-
// biome-ignore lint/correctness/useExhaustiveDependencies : must run only once
|
|
9
8
|
useEffect(() => {
|
|
10
9
|
(async () => {
|
|
11
10
|
if (execState === UCExecState.INITIALIZING) {
|
|
@@ -21,9 +21,6 @@ export function useUC(appManifest, def, auth, opts) {
|
|
|
21
21
|
}
|
|
22
22
|
return v;
|
|
23
23
|
});
|
|
24
|
-
// biome-ignore lint/correctness/useExhaustiveDependencies(appManifest): avoid infinite re-rendering
|
|
25
|
-
// biome-ignore lint/correctness/useExhaustiveDependencies(def): avoid infinite re-rendering
|
|
26
|
-
// biome-ignore lint/correctness/useExhaustiveDependencies(opts?.fillWith): avoid infinite re-rendering
|
|
27
24
|
useEffect(() => {
|
|
28
25
|
const v = new UC(appManifest, def, auth);
|
|
29
26
|
if (opts?.fillWith) {
|
|
@@ -30,19 +30,20 @@ let AuthenticationChecker = class AuthenticationChecker {
|
|
|
30
30
|
this.ucPolicyFactory = ucPolicyFactory;
|
|
31
31
|
}
|
|
32
32
|
async exec({ authCookie, authorizationHeader, uc, }) {
|
|
33
|
+
const { lifecycle: { server }, sec, } = uc.def;
|
|
34
|
+
const authType = sec?.authType ?? DEFAULT_UC_SEC_AT;
|
|
33
35
|
this.logger.trace('Checking auth', {
|
|
34
36
|
authCookie,
|
|
35
37
|
authorizationHeader,
|
|
38
|
+
authType,
|
|
36
39
|
});
|
|
37
40
|
const output = {
|
|
38
41
|
allowed: false, // By default it's not allowed
|
|
39
42
|
auth: null,
|
|
40
43
|
};
|
|
41
|
-
const { lifecycle: { server }, sec, } = uc.def;
|
|
42
44
|
if (typeof server !== 'object') {
|
|
43
45
|
return output;
|
|
44
46
|
}
|
|
45
|
-
const authType = sec?.authType ?? DEFAULT_UC_SEC_AT;
|
|
46
47
|
const policy = (await this.ucPolicyFactory(server.policy));
|
|
47
48
|
const canBeExecutedPreAuth = await policy.canBeExecutedPreAuth();
|
|
48
49
|
if (canBeExecutedPreAuth) {
|
|
@@ -53,29 +54,33 @@ let AuthenticationChecker = class AuthenticationChecker {
|
|
|
53
54
|
}
|
|
54
55
|
else {
|
|
55
56
|
// Follows the OpenAPI spec : https://swagger.io/docs/specification/authentication
|
|
57
|
+
const fromAuthHeader = authorizationHeader && !Array.isArray(authorizationHeader)
|
|
58
|
+
? authorizationHeader
|
|
59
|
+
: undefined;
|
|
60
|
+
const fromCookie = authCookie && !Array.isArray(authCookie)
|
|
61
|
+
? authCookie
|
|
62
|
+
: undefined;
|
|
56
63
|
switch (authType) {
|
|
57
64
|
case 'apiKey':
|
|
58
|
-
if (
|
|
59
|
-
!Array.isArray(authorizationHeader)) {
|
|
65
|
+
if (fromAuthHeader) {
|
|
60
66
|
output.auth =
|
|
61
67
|
await this.privateApiKeyAuthenticationChecker.exec({
|
|
62
|
-
rawValue:
|
|
68
|
+
rawValue: fromAuthHeader,
|
|
63
69
|
});
|
|
64
70
|
}
|
|
65
71
|
break;
|
|
66
72
|
case 'basic':
|
|
67
|
-
if (
|
|
68
|
-
!Array.isArray(authorizationHeader)) {
|
|
73
|
+
if (fromAuthHeader) {
|
|
69
74
|
output.auth =
|
|
70
75
|
await this.basicAuthenticationChecker.exec({
|
|
71
|
-
rawValue:
|
|
76
|
+
rawValue: fromAuthHeader,
|
|
72
77
|
});
|
|
73
78
|
}
|
|
74
79
|
break;
|
|
75
80
|
case 'jwt':
|
|
76
|
-
if (
|
|
81
|
+
if (fromCookie || fromAuthHeader) {
|
|
77
82
|
output.auth = await this.jwtAuthenticationChecker.exec({
|
|
78
|
-
rawValue:
|
|
83
|
+
rawValue: fromCookie ?? fromAuthHeader,
|
|
79
84
|
});
|
|
80
85
|
}
|
|
81
86
|
break;
|
|
@@ -9,6 +9,7 @@ export declare class JWTAuthenticationChecker implements Configurable<S>, Worker
|
|
|
9
9
|
private jwtManager;
|
|
10
10
|
private logger;
|
|
11
11
|
private settingsManager;
|
|
12
|
+
private static PREFIXES;
|
|
12
13
|
constructor(jwtManager: JWTManager, logger: Logger, settingsManager: SettingsManager<S>);
|
|
13
14
|
s(): S;
|
|
14
15
|
exec({ rawValue }: Input): Promise<Output | null>;
|
|
@@ -10,12 +10,18 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
|
+
var JWTAuthenticationChecker_1;
|
|
13
14
|
import { inject, injectable } from 'inversify';
|
|
14
15
|
import { UnauthorizedError } from '../../../error/index.js';
|
|
15
16
|
let JWTAuthenticationChecker = class JWTAuthenticationChecker {
|
|
17
|
+
static { JWTAuthenticationChecker_1 = this; }
|
|
16
18
|
jwtManager;
|
|
17
19
|
logger;
|
|
18
20
|
settingsManager;
|
|
21
|
+
static PREFIXES = [
|
|
22
|
+
'Bearer',
|
|
23
|
+
'JWT',
|
|
24
|
+
];
|
|
19
25
|
constructor(jwtManager, logger, settingsManager) {
|
|
20
26
|
this.jwtManager = jwtManager;
|
|
21
27
|
this.logger = logger;
|
|
@@ -27,7 +33,10 @@ let JWTAuthenticationChecker = class JWTAuthenticationChecker {
|
|
|
27
33
|
};
|
|
28
34
|
}
|
|
29
35
|
async exec({ rawValue }) {
|
|
30
|
-
|
|
36
|
+
let value = rawValue;
|
|
37
|
+
for (const p of JWTAuthenticationChecker_1.PREFIXES) {
|
|
38
|
+
value = value?.replaceAll(`${p} `, '');
|
|
39
|
+
}
|
|
31
40
|
if (!value) {
|
|
32
41
|
return null;
|
|
33
42
|
}
|
|
@@ -68,7 +77,7 @@ let JWTAuthenticationChecker = class JWTAuthenticationChecker {
|
|
|
68
77
|
return false;
|
|
69
78
|
}
|
|
70
79
|
};
|
|
71
|
-
JWTAuthenticationChecker = __decorate([
|
|
80
|
+
JWTAuthenticationChecker = JWTAuthenticationChecker_1 = __decorate([
|
|
72
81
|
injectable(),
|
|
73
82
|
__param(0, inject('JWTManager')),
|
|
74
83
|
__param(1, inject('Logger')),
|
|
@@ -5,7 +5,7 @@ import type { TargetEntrypointInput } from '../entrypoint.js';
|
|
|
5
5
|
import { OpenAPISpecBuilder } from '../openapi/OpenAPISpecBuilder.js';
|
|
6
6
|
import { ServerInstaller } from './ServerInstaller.js';
|
|
7
7
|
import type { ServerManager, ServerManagerSettings } from './ServerManager.js';
|
|
8
|
-
type S = Pick<ServerManagerSettings, 'server_expose_openapi_spec' | 'server_expose_openapi_spec_at' | 'server_static_dir_path' | 'server_tmp_path'>;
|
|
8
|
+
type S = Pick<ServerManagerSettings, 'server_expose_mcp' | 'server_expose_mcp_at' | 'server_expose_openapi_spec' | 'server_expose_openapi_spec_at' | 'server_static_dir_path' | 'server_tmp_path'>;
|
|
9
9
|
type Input = TargetEntrypointInput & {
|
|
10
10
|
autoMountUCs?: boolean;
|
|
11
11
|
};
|
|
@@ -43,6 +43,8 @@ let ServerBooter = class ServerBooter {
|
|
|
43
43
|
}
|
|
44
44
|
s() {
|
|
45
45
|
return {
|
|
46
|
+
server_expose_mcp: this.settingsManager.get()('server_expose_mcp'),
|
|
47
|
+
server_expose_mcp_at: this.settingsManager.get()('server_expose_mcp_at'),
|
|
46
48
|
server_expose_openapi_spec: this.settingsManager.get()('server_expose_openapi_spec'),
|
|
47
49
|
server_expose_openapi_spec_at: this.settingsManager.get()('server_expose_openapi_spec_at'),
|
|
48
50
|
server_static_dir_path: this.settingsManager.get()('server_static_dir_path'),
|
|
@@ -97,6 +99,14 @@ let ServerBooter = class ServerBooter {
|
|
|
97
99
|
});
|
|
98
100
|
await this.serverManager.mountOpenAPISpec(spec, at);
|
|
99
101
|
}
|
|
102
|
+
if (this.s().server_expose_mcp) {
|
|
103
|
+
const at = this.s().server_expose_mcp_at;
|
|
104
|
+
this.logger.info('Mounting MCP', {
|
|
105
|
+
at,
|
|
106
|
+
mountedUCs: mountedUCs.length,
|
|
107
|
+
});
|
|
108
|
+
await this.serverManager.mountMCP(mountedUCs, at);
|
|
109
|
+
}
|
|
100
110
|
await this.serverManager.warmUp();
|
|
101
111
|
await this.serverManager.start();
|
|
102
112
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AppManifest } from '../../../app/index.js';
|
|
2
2
|
import type { ApiKey, DirPath, FilePath, HostPort, HTTPMethod, Password, URL, URLPath, Username } from '../../../dt/index.js';
|
|
3
|
+
import type { ProductUCsLoaderOutput } from '../../../product/index.js';
|
|
3
4
|
import type { Settings } from '../../../std/index.js';
|
|
4
5
|
import type { UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../../uc/index.js';
|
|
5
6
|
import type { HTTPCSPValue } from '../../../utils/http/types.js';
|
|
@@ -25,8 +26,12 @@ export interface ServerManagerSettings extends ServerManagerAuthSettings, Settin
|
|
|
25
26
|
server_cors_headers: HTTPHeaderName[];
|
|
26
27
|
server_cors_methods: HTTPMethod[];
|
|
27
28
|
server_cors_origins: URL[];
|
|
29
|
+
server_expose_mcp: boolean;
|
|
30
|
+
server_expose_mcp_at: URLPath;
|
|
28
31
|
server_expose_openapi_spec: boolean;
|
|
29
32
|
server_expose_openapi_spec_at: URLPath;
|
|
33
|
+
server_mcp_dangerously_skip_pub_api_key_check: boolean;
|
|
34
|
+
server_mcp_dangerously_skip_auth_check: boolean;
|
|
30
35
|
server_public_api_key_header_name: PublicApiKeyHeaderName;
|
|
31
36
|
server_public_url: URL;
|
|
32
37
|
server_ssl_fullchain_path: FilePath | null;
|
|
@@ -51,6 +56,11 @@ export interface ServerManager extends Initializable {
|
|
|
51
56
|
* @param contract
|
|
52
57
|
*/
|
|
53
58
|
mountSync<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract): void;
|
|
59
|
+
/**
|
|
60
|
+
* Mount the MCP endpoint
|
|
61
|
+
* @param spec
|
|
62
|
+
*/
|
|
63
|
+
mountMCP(ucs: ProductUCsLoaderOutput, at: URLPath): Promise<void>;
|
|
54
64
|
/**
|
|
55
65
|
* Mount the OpenAPI spec
|
|
56
66
|
* @param spec
|
|
@@ -26,12 +26,15 @@ export interface ServerRequestHandlerRes {
|
|
|
26
26
|
redirect: (location: URL | URLPath) => Promise<void>;
|
|
27
27
|
setCookie: (info: AuthCookieCreatorOutput) => Promise<void>;
|
|
28
28
|
}
|
|
29
|
-
interface
|
|
29
|
+
export interface ServerRequestHandlerInput<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined> {
|
|
30
30
|
appManifest: AppManifest;
|
|
31
|
+
dangerouslySkipAuthCheck?: boolean | undefined;
|
|
32
|
+
dangerouslySkipPubApiKeyCheck?: boolean | undefined;
|
|
31
33
|
envelope: HTTPDataEnvelope;
|
|
32
34
|
execOpts?: UCManagerExecServerOpts<OPI0, OPI1> | undefined;
|
|
33
35
|
req: ServerRequestHandlerReq;
|
|
34
36
|
res: ServerRequestHandlerRes;
|
|
37
|
+
skipSideEffects?: boolean | undefined;
|
|
35
38
|
ucd: UCDef<I, OPI0, OPI1>;
|
|
36
39
|
/**
|
|
37
40
|
* It is not injected in the handler constructor because it must be the same as the one used in ServerManager.
|
|
@@ -41,15 +44,18 @@ interface Input<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBas
|
|
|
41
44
|
ucManager: UCManager;
|
|
42
45
|
}
|
|
43
46
|
type BodylessStatus = 204 | 302;
|
|
44
|
-
type Output<OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined> = {
|
|
47
|
+
type Output<OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined> = ({
|
|
45
48
|
body: undefined;
|
|
46
49
|
status: BodylessStatus;
|
|
47
50
|
} | {
|
|
48
51
|
body: UCOutput<OPI0, OPI1> | object;
|
|
52
|
+
rawErr?: Error;
|
|
49
53
|
status: Exclude<HTTPStatusNumber, BodylessStatus>;
|
|
54
|
+
}) & {
|
|
55
|
+
rawErr?: Error;
|
|
50
56
|
};
|
|
51
57
|
type S = Pick<ServerManagerSettings, 'server_cookies_name_auth' | 'server_public_api_key_header_name'>;
|
|
52
|
-
export declare class ServerRequestHandler implements Worker<
|
|
58
|
+
export declare class ServerRequestHandler implements Worker<ServerRequestHandlerInput, Promise<Output>> {
|
|
53
59
|
private authCookieCreator;
|
|
54
60
|
private authenticationChecker;
|
|
55
61
|
private customerFacingErrorBuilder;
|
|
@@ -58,10 +64,9 @@ export declare class ServerRequestHandler implements Worker<Input, Promise<Outpu
|
|
|
58
64
|
private requestLogger;
|
|
59
65
|
private settingsManager;
|
|
60
66
|
private ucBuilder;
|
|
61
|
-
private static X_FORWARDED_PROTO_HEADER_NAME;
|
|
62
67
|
constructor(authCookieCreator: AuthCookieCreator, authenticationChecker: AuthenticationChecker, customerFacingErrorBuilder: CustomerFacingErrorBuilder, publicApiKeyChecker: PublicApiKeyChecker, requestChecker: RequestChecker, requestLogger: RequestLogger, settingsManager: SettingsManager<S>, ucBuilder: UCBuilder);
|
|
63
68
|
s(): S;
|
|
64
|
-
exec<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>({ appManifest, envelope, execOpts, req, res, ucd, ucManager, }:
|
|
69
|
+
exec<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>({ appManifest, dangerouslySkipAuthCheck, dangerouslySkipPubApiKeyCheck, envelope, execOpts, req, res, skipSideEffects, ucd, ucManager, }: ServerRequestHandlerInput<I, OPI0, OPI1>): Promise<Output<OPI0, OPI1>>;
|
|
65
70
|
private fill;
|
|
66
71
|
private applySideEffects;
|
|
67
72
|
private applyClearAuthSideEffect;
|
|
@@ -10,11 +10,10 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
|
-
var ServerRequestHandler_1;
|
|
14
13
|
import { inject, injectable } from 'inversify';
|
|
15
|
-
import { IllegalArgumentError, isEmptyJSON } from '../../../error/index.js';
|
|
14
|
+
import { IllegalArgumentError, isEmptyJSON, logDevWarning, } from '../../../error/index.js';
|
|
16
15
|
import { UCBuilder, UCOutputReader, UCOutputSideEffectType, } from '../../../uc/index.js';
|
|
17
|
-
import { AUTHORIZATION_HEADER_NAME } from '../shared.js';
|
|
16
|
+
import { AUTHORIZATION_HEADER_NAME, X_FORWARDED_PROTO_HEADER_NAME, } from '../shared.js';
|
|
18
17
|
import { AuthCookieCreator, } from './AuthCookieCreator.js';
|
|
19
18
|
import { AuthenticationChecker } from './AuthenticationChecker.js';
|
|
20
19
|
import { CustomerFacingErrorBuilder } from './CustomerFacingErrorBuilder.js';
|
|
@@ -22,7 +21,6 @@ import { PublicApiKeyChecker } from './PublicApiKeyChecker.js';
|
|
|
22
21
|
import { RequestChecker } from './RequestChecker.js';
|
|
23
22
|
import { RequestLogger } from './RequestLogger.js';
|
|
24
23
|
let ServerRequestHandler = class ServerRequestHandler {
|
|
25
|
-
static { ServerRequestHandler_1 = this; }
|
|
26
24
|
authCookieCreator;
|
|
27
25
|
authenticationChecker;
|
|
28
26
|
customerFacingErrorBuilder;
|
|
@@ -31,7 +29,6 @@ let ServerRequestHandler = class ServerRequestHandler {
|
|
|
31
29
|
requestLogger;
|
|
32
30
|
settingsManager;
|
|
33
31
|
ucBuilder;
|
|
34
|
-
static X_FORWARDED_PROTO_HEADER_NAME = 'X-Forwarded-Proto';
|
|
35
32
|
constructor(authCookieCreator, authenticationChecker, customerFacingErrorBuilder, publicApiKeyChecker, requestChecker, requestLogger, settingsManager, ucBuilder) {
|
|
36
33
|
this.authCookieCreator = authCookieCreator;
|
|
37
34
|
this.authenticationChecker = authenticationChecker;
|
|
@@ -48,7 +45,7 @@ let ServerRequestHandler = class ServerRequestHandler {
|
|
|
48
45
|
server_public_api_key_header_name: this.settingsManager.get()('server_public_api_key_header_name'),
|
|
49
46
|
};
|
|
50
47
|
}
|
|
51
|
-
async exec({ appManifest, envelope, execOpts, req, res, ucd, ucManager, }) {
|
|
48
|
+
async exec({ appManifest, dangerouslySkipAuthCheck = false, dangerouslySkipPubApiKeyCheck = false, envelope, execOpts, req, res, skipSideEffects = false, ucd, ucManager, }) {
|
|
52
49
|
try {
|
|
53
50
|
const { bodyRaw, cookie, header, method, secure, url } = req;
|
|
54
51
|
this.requestLogger.exec({
|
|
@@ -59,34 +56,46 @@ let ServerRequestHandler = class ServerRequestHandler {
|
|
|
59
56
|
this.requestChecker.exec({
|
|
60
57
|
secure,
|
|
61
58
|
url,
|
|
62
|
-
xForwardedProtoHeader: await header(
|
|
59
|
+
xForwardedProtoHeader: await header(X_FORWARDED_PROTO_HEADER_NAME),
|
|
63
60
|
});
|
|
64
61
|
const { ext, sec } = ucd;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
62
|
+
if (dangerouslySkipPubApiKeyCheck) {
|
|
63
|
+
logDevWarning('Skipping pub api key check');
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
await this.publicApiKeyChecker.exec({
|
|
67
|
+
checkType: sec?.publicApiKeyCheckType,
|
|
68
|
+
value: await header(this.s().server_public_api_key_header_name),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
69
71
|
const uc = this.ucBuilder.exec({
|
|
70
72
|
appManifest,
|
|
71
73
|
auth: null,
|
|
72
74
|
def: ucd,
|
|
73
75
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
if (dangerouslySkipAuthCheck) {
|
|
77
|
+
logDevWarning('Skipping auth check');
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const { auth } = await this.authenticationChecker.exec({
|
|
81
|
+
authCookie: await cookie(this.s().server_cookies_name_auth),
|
|
82
|
+
authorizationHeader: await header(AUTHORIZATION_HEADER_NAME),
|
|
83
|
+
uc,
|
|
84
|
+
});
|
|
85
|
+
if (auth) {
|
|
86
|
+
uc.auth = auth;
|
|
87
|
+
}
|
|
81
88
|
}
|
|
82
89
|
await this.fill(req, envelope, uc);
|
|
83
90
|
const output = await ucManager.execServer(uc, execOpts);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
91
|
+
if (!skipSideEffects) {
|
|
92
|
+
const { status } = await this.applySideEffects(res, ucd, output);
|
|
93
|
+
if (status !== undefined) {
|
|
94
|
+
return {
|
|
95
|
+
body: undefined,
|
|
96
|
+
status,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
90
99
|
}
|
|
91
100
|
if (!output) {
|
|
92
101
|
return {
|
|
@@ -106,6 +115,7 @@ let ServerRequestHandler = class ServerRequestHandler {
|
|
|
106
115
|
});
|
|
107
116
|
return {
|
|
108
117
|
body: error.toObj(),
|
|
118
|
+
rawErr: err,
|
|
109
119
|
status: error.httpStatus,
|
|
110
120
|
};
|
|
111
121
|
}
|
|
@@ -186,7 +196,7 @@ let ServerRequestHandler = class ServerRequestHandler {
|
|
|
186
196
|
res.setCookie(output);
|
|
187
197
|
}
|
|
188
198
|
};
|
|
189
|
-
ServerRequestHandler =
|
|
199
|
+
ServerRequestHandler = __decorate([
|
|
190
200
|
injectable(),
|
|
191
201
|
__param(0, inject(AuthCookieCreator)),
|
|
192
202
|
__param(1, inject(AuthenticationChecker)),
|
|
@@ -17,8 +17,12 @@ export const TARGET_DEFAULT_SERVER_MANAGER_SETTINGS = {
|
|
|
17
17
|
server_csp_default_src: [],
|
|
18
18
|
server_csp_img_src: [],
|
|
19
19
|
server_csp_script_src: [],
|
|
20
|
+
server_expose_mcp: false,
|
|
21
|
+
server_expose_mcp_at: '/mcp',
|
|
20
22
|
server_expose_openapi_spec: false,
|
|
21
23
|
server_expose_openapi_spec_at: '/api/openapi.json',
|
|
24
|
+
server_mcp_dangerously_skip_auth_check: false,
|
|
25
|
+
server_mcp_dangerously_skip_pub_api_key_check: false,
|
|
22
26
|
server_private_api_key_entries: [],
|
|
23
27
|
server_public_api_key_entries: [unsafeDefaultSetting()],
|
|
24
28
|
server_public_api_key_header_name: 'X-API-Key',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import cookieParser from 'cookie-parser';
|
|
2
2
|
import express, {} from 'express';
|
|
3
3
|
import fileUpload from 'express-fileupload';
|
|
4
|
-
import { fmtSingleDataMsg, fmtSSEError, isError, SSE_HEADERS, } from '../../../utils/index.js';
|
|
4
|
+
import { defaultStreamOnClose, fmtSingleDataMsg, fmtSSEError, isError, SSE_HEADERS, } from '../../../utils/index.js';
|
|
5
5
|
export function buildHandler(appManifest, ucd, contract, serverRequestHandler, ucManager) {
|
|
6
6
|
const { envelope } = contract;
|
|
7
7
|
const handler = async (req, res) => {
|
|
@@ -15,11 +15,7 @@ export function buildHandler(appManifest, ucd, contract, serverRequestHandler, u
|
|
|
15
15
|
let streamedOnce = false;
|
|
16
16
|
execOpts = {
|
|
17
17
|
stream: {
|
|
18
|
-
onClose:
|
|
19
|
-
if (streamedOnce) {
|
|
20
|
-
throw new Error('execOpts.stream.onClose needs to be set in the UC ServerMain');
|
|
21
|
-
}
|
|
22
|
-
},
|
|
18
|
+
onClose: defaultStreamOnClose(streamedOnce),
|
|
23
19
|
onData: async (output) => {
|
|
24
20
|
streamedOnce = true;
|
|
25
21
|
if (!output) {
|
|
@@ -3,7 +3,7 @@ import { deleteCookie, getCookie, setCookie } from 'hono/cookie';
|
|
|
3
3
|
import { logger } from 'hono/logger';
|
|
4
4
|
import { secureHeaders } from 'hono/secure-headers';
|
|
5
5
|
import { NotFoundError } from '../../../error/index.js';
|
|
6
|
-
import { fmtSingleDataMsg, fmtSSEError, fromFormData, isError, SSE_HEADERS, } from '../../../utils/index.js';
|
|
6
|
+
import { defaultStreamOnClose, fmtSingleDataMsg, fmtSSEError, fromFormData, isError, SSE_HEADERS, } from '../../../utils/index.js';
|
|
7
7
|
export function buildHandler(appManifest, ucd, contract, serverRequestHandler, ucManager, beforeExec) {
|
|
8
8
|
const { envelope } = contract;
|
|
9
9
|
const handler = async (c) => {
|
|
@@ -28,10 +28,12 @@ export function buildHandler(appManifest, ucd, contract, serverRequestHandler, u
|
|
|
28
28
|
ctrl.close();
|
|
29
29
|
closed = true;
|
|
30
30
|
};
|
|
31
|
+
let streamedOnce = false;
|
|
31
32
|
execOpts = {
|
|
32
33
|
stream: {
|
|
33
|
-
onClose:
|
|
34
|
+
onClose: defaultStreamOnClose(streamedOnce),
|
|
34
35
|
onData: async (output) => {
|
|
36
|
+
streamedOnce = true;
|
|
35
37
|
if (!output || closed) {
|
|
36
38
|
return;
|
|
37
39
|
}
|
|
@@ -3,4 +3,5 @@ import type { HTTPHeaderName } from '../../utils/index.js';
|
|
|
3
3
|
export type AuthCookieName = 'auth';
|
|
4
4
|
export type PublicApiKeyHeaderName = 'X-API-Key' | (string & {});
|
|
5
5
|
export declare const AUTHORIZATION_HEADER_NAME: HTTPHeaderName;
|
|
6
|
+
export declare const X_FORWARDED_PROTO_HEADER_NAME: HTTPHeaderName;
|
|
6
7
|
export declare const DEFAULT_VERSION: SemVerVersion;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AppManifest } from '../../app/index.js';
|
|
2
2
|
import type { DirPath, URLPath } from '../../dt/index.js';
|
|
3
|
+
import type { ProductUCsLoaderOutput } from '../../product/index.js';
|
|
3
4
|
import type { UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../uc/index.js';
|
|
4
5
|
import type { OpenAPISpec } from '../lib/openapi/types.js';
|
|
5
6
|
import type { ServerManager } from '../lib/server/ServerManager.js';
|
|
@@ -9,6 +10,7 @@ export declare class NextJSServerManager implements ServerManager {
|
|
|
9
10
|
initSync(): void;
|
|
10
11
|
mount<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(_appManifest: AppManifest, _ucd: UCDef<I, OPI0, OPI1>, _contract: UCHTTPContract): Promise<void>;
|
|
11
12
|
mountSync<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(_appManifest: AppManifest, _ucd: UCDef<I, OPI0, OPI1>, _contract: UCHTTPContract): void;
|
|
13
|
+
mountMCP(_ucs: ProductUCsLoaderOutput, _at: URLPath): Promise<void>;
|
|
12
14
|
mountOpenAPISpec(_spec: OpenAPISpec, _at: URLPath): Promise<void>;
|
|
13
15
|
mountStaticDir(_dirPath: DirPath): Promise<void>;
|
|
14
16
|
start(): Promise<void>;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { type Express } from 'express';
|
|
1
|
+
import { type Express, type RequestHandler } from 'express';
|
|
2
2
|
import type { AppManifest } from '../../app/index.js';
|
|
3
3
|
import type { DirPath, URLPath } from '../../dt/index.js';
|
|
4
|
+
import type { ProductUCsLoaderOutput } from '../../product/index.js';
|
|
4
5
|
import type { Configurable, EnvironmentManager, Logger, LoggerSettings, SettingsManager } from '../../std/index.js';
|
|
5
6
|
import type { UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../uc/index.js';
|
|
7
|
+
import type { MCPHTTPRequestHandlerBuilder } from '../lib/mcp-server/http/MCPHTTPRequestHandlerBuilder.js';
|
|
6
8
|
import type { OpenAPISpec } from '../lib/openapi/types.js';
|
|
7
9
|
import { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBuilder.js';
|
|
8
10
|
import { EntrypointsBuilder } from '../lib/server/EntrypointsBuilder.js';
|
|
@@ -20,13 +22,14 @@ export declare class NodeExpressServerManager implements Configurable<S>, Server
|
|
|
20
22
|
protected environmentManager: EnvironmentManager;
|
|
21
23
|
private helmetMiddlewareBuilder;
|
|
22
24
|
protected logger: Logger;
|
|
25
|
+
private mcpHTTPRequestHandlerBuilder;
|
|
23
26
|
private serverRequestHandler;
|
|
24
27
|
private serverSSLCertLoader;
|
|
25
28
|
private settingsManager;
|
|
26
29
|
private ucManager;
|
|
27
30
|
protected runtime: Express;
|
|
28
31
|
private server;
|
|
29
|
-
constructor(corsMiddlewareBuilder: CORSMiddlewareBuilder, customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, helmetMiddlewareBuilder: HelmetMiddlewareBuilder, logger: Logger, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
|
|
32
|
+
constructor(corsMiddlewareBuilder: CORSMiddlewareBuilder, customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, helmetMiddlewareBuilder: HelmetMiddlewareBuilder, logger: Logger, mcpHTTPRequestHandlerBuilder: MCPHTTPRequestHandlerBuilder<RequestHandler>, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
|
|
30
33
|
s(): S;
|
|
31
34
|
getRuntime(): Express;
|
|
32
35
|
overrideUCManager(ucManager: UCManager): void;
|
|
@@ -34,6 +37,7 @@ export declare class NodeExpressServerManager implements Configurable<S>, Server
|
|
|
34
37
|
initSync(): void;
|
|
35
38
|
mount<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract): Promise<void>;
|
|
36
39
|
mountSync<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract): void;
|
|
40
|
+
mountMCP(ucs: ProductUCsLoaderOutput, at: URLPath): Promise<void>;
|
|
37
41
|
mountOpenAPISpec(spec: OpenAPISpec, at: URLPath): Promise<void>;
|
|
38
42
|
mountStaticDir(dirPath: DirPath): Promise<void>;
|
|
39
43
|
start(): Promise<void>;
|
|
@@ -30,19 +30,21 @@ let NodeExpressServerManager = class NodeExpressServerManager {
|
|
|
30
30
|
environmentManager;
|
|
31
31
|
helmetMiddlewareBuilder;
|
|
32
32
|
logger;
|
|
33
|
+
mcpHTTPRequestHandlerBuilder;
|
|
33
34
|
serverRequestHandler;
|
|
34
35
|
serverSSLCertLoader;
|
|
35
36
|
settingsManager;
|
|
36
37
|
ucManager;
|
|
37
38
|
runtime;
|
|
38
39
|
server;
|
|
39
|
-
constructor(corsMiddlewareBuilder, customerFacingErrorBuilder, entrypointsBuilder, environmentManager, helmetMiddlewareBuilder, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
|
|
40
|
+
constructor(corsMiddlewareBuilder, customerFacingErrorBuilder, entrypointsBuilder, environmentManager, helmetMiddlewareBuilder, logger, mcpHTTPRequestHandlerBuilder, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
|
|
40
41
|
this.corsMiddlewareBuilder = corsMiddlewareBuilder;
|
|
41
42
|
this.customerFacingErrorBuilder = customerFacingErrorBuilder;
|
|
42
43
|
this.entrypointsBuilder = entrypointsBuilder;
|
|
43
44
|
this.environmentManager = environmentManager;
|
|
44
45
|
this.helmetMiddlewareBuilder = helmetMiddlewareBuilder;
|
|
45
46
|
this.logger = logger;
|
|
47
|
+
this.mcpHTTPRequestHandlerBuilder = mcpHTTPRequestHandlerBuilder;
|
|
46
48
|
this.serverRequestHandler = serverRequestHandler;
|
|
47
49
|
this.serverSSLCertLoader = serverSSLCertLoader;
|
|
48
50
|
this.settingsManager = settingsManager;
|
|
@@ -79,6 +81,12 @@ let NodeExpressServerManager = class NodeExpressServerManager {
|
|
|
79
81
|
mountSync(appManifest, ucd, contract) {
|
|
80
82
|
this.mountCommon(appManifest, ucd, contract);
|
|
81
83
|
}
|
|
84
|
+
async mountMCP(ucs, at) {
|
|
85
|
+
this.runtime.post(at, this.mcpHTTPRequestHandlerBuilder.exec({
|
|
86
|
+
ucManager: this.ucManager,
|
|
87
|
+
ucs,
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
82
90
|
async mountOpenAPISpec(spec, at) {
|
|
83
91
|
this.runtime.get(at, (_req, res) => {
|
|
84
92
|
res.send(spec);
|
|
@@ -119,13 +127,14 @@ NodeExpressServerManager = __decorate([
|
|
|
119
127
|
__param(3, inject('EnvironmentManager')),
|
|
120
128
|
__param(4, inject(HelmetMiddlewareBuilder)),
|
|
121
129
|
__param(5, inject('Logger')),
|
|
122
|
-
__param(6, inject(
|
|
123
|
-
__param(7, inject(
|
|
124
|
-
__param(8, inject(
|
|
125
|
-
__param(9, inject('
|
|
130
|
+
__param(6, inject('MCPHTTPRequestHandlerBuilder')),
|
|
131
|
+
__param(7, inject(ServerRequestHandler)),
|
|
132
|
+
__param(8, inject(ServerSSLCertLoader)),
|
|
133
|
+
__param(9, inject('SettingsManager')),
|
|
134
|
+
__param(10, inject('UCManager')),
|
|
126
135
|
__metadata("design:paramtypes", [CORSMiddlewareBuilder,
|
|
127
136
|
CustomerFacingErrorBuilder,
|
|
128
|
-
EntrypointsBuilder, Object, HelmetMiddlewareBuilder, Object, ServerRequestHandler,
|
|
137
|
+
EntrypointsBuilder, Object, HelmetMiddlewareBuilder, Object, Object, ServerRequestHandler,
|
|
129
138
|
ServerSSLCertLoader, Object, Object])
|
|
130
139
|
], NodeExpressServerManager);
|
|
131
140
|
export { NodeExpressServerManager };
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type { Hono } from 'hono';
|
|
1
|
+
import type { Hono, MiddlewareHandler } from 'hono';
|
|
2
2
|
import type { AppManifest } from '../../app/index.js';
|
|
3
3
|
import type { DirPath, URLPath } from '../../dt/index.js';
|
|
4
|
+
import type { ProductUCsLoaderOutput } from '../../product/index.js';
|
|
4
5
|
import type { Configurable, EnvironmentManager, Logger, SettingsManager } from '../../std/index.js';
|
|
5
6
|
import type { UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../uc/index.js';
|
|
7
|
+
import type { MCPHTTPRequestHandlerBuilder } from '../lib/mcp-server/http/MCPHTTPRequestHandlerBuilder.js';
|
|
6
8
|
import type { OpenAPISpec } from '../lib/openapi/types.js';
|
|
7
9
|
import { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBuilder.js';
|
|
8
10
|
import { EntrypointsBuilder } from '../lib/server/EntrypointsBuilder.js';
|
|
@@ -18,13 +20,14 @@ export declare class NodeHonoServerManager implements Configurable<S>, ServerMan
|
|
|
18
20
|
private entrypointsBuilder;
|
|
19
21
|
protected environmentManager: EnvironmentManager;
|
|
20
22
|
private logger;
|
|
23
|
+
private mcpHTTPRequestHandlerBuilder;
|
|
21
24
|
private serverRequestHandler;
|
|
22
25
|
private serverSSLCertLoader;
|
|
23
26
|
private settingsManager;
|
|
24
27
|
private ucManager;
|
|
25
28
|
protected runtime: Hono;
|
|
26
29
|
private server;
|
|
27
|
-
constructor(corsMiddlewareBuilder: CORSMiddlewareBuilder, customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, logger: Logger, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
|
|
30
|
+
constructor(corsMiddlewareBuilder: CORSMiddlewareBuilder, customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, logger: Logger, mcpHTTPRequestHandlerBuilder: MCPHTTPRequestHandlerBuilder<MiddlewareHandler>, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
|
|
28
31
|
s(): S;
|
|
29
32
|
getRuntime(): Hono;
|
|
30
33
|
overrideUCManager(ucManager: UCManager): void;
|
|
@@ -32,6 +35,7 @@ export declare class NodeHonoServerManager implements Configurable<S>, ServerMan
|
|
|
32
35
|
initSync(): void;
|
|
33
36
|
mount<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract): Promise<void>;
|
|
34
37
|
mountSync<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract): void;
|
|
38
|
+
mountMCP(ucs: ProductUCsLoaderOutput, at: URLPath): Promise<void>;
|
|
35
39
|
mountOpenAPISpec(spec: OpenAPISpec, at: URLPath): Promise<void>;
|
|
36
40
|
mountStaticDir(dirPath: DirPath): Promise<void>;
|
|
37
41
|
start(): Promise<void>;
|