libmodulor 0.28.0 → 0.30.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 +57 -0
- package/README.md +3 -3
- 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/TBase.d.ts +2 -0
- package/dist/esm/dt/base/TBase.js +5 -0
- package/dist/esm/dt/base/TBoolean.d.ts +2 -0
- package/dist/esm/dt/base/TBoolean.js +3 -0
- package/dist/esm/dt/base/TInt.d.ts +2 -0
- package/dist/esm/dt/base/TInt.js +3 -0
- package/dist/esm/dt/base/TNumber.d.ts +2 -0
- package/dist/esm/dt/base/TNumber.js +3 -0
- package/dist/esm/dt/base/TObject.d.ts +2 -0
- package/dist/esm/dt/base/TObject.js +37 -0
- package/dist/esm/dt/final/TApiKey.d.ts +2 -0
- package/dist/esm/dt/final/TApiKey.js +3 -0
- package/dist/esm/dt/final/TDateISO8601.d.ts +2 -0
- package/dist/esm/dt/final/TDateISO8601.js +3 -0
- package/dist/esm/dt/final/TDomainName.d.ts +2 -0
- package/dist/esm/dt/final/TDomainName.js +3 -0
- package/dist/esm/dt/final/TEmail.d.ts +2 -0
- package/dist/esm/dt/final/TEmail.js +3 -0
- package/dist/esm/dt/final/TEncryptionKey.d.ts +2 -0
- package/dist/esm/dt/final/TEncryptionKey.js +3 -0
- package/dist/esm/dt/final/TFile.d.ts +2 -0
- package/dist/esm/dt/final/TFile.js +3 -0
- package/dist/esm/dt/final/TIPv4.d.ts +2 -0
- package/dist/esm/dt/final/TIPv4.js +3 -0
- package/dist/esm/dt/final/TIPv6.d.ts +2 -0
- package/dist/esm/dt/final/TIPv6.js +3 -0
- package/dist/esm/dt/final/TJWT.d.ts +2 -0
- package/dist/esm/dt/final/TJWT.js +3 -0
- package/dist/esm/dt/final/TPassword.d.ts +2 -0
- package/dist/esm/dt/final/TPassword.js +3 -0
- package/dist/esm/dt/final/TSSHPrivateKey.d.ts +2 -0
- package/dist/esm/dt/final/TSSHPrivateKey.js +3 -0
- package/dist/esm/dt/final/TTime.d.ts +2 -0
- package/dist/esm/dt/final/TTime.js +3 -0
- package/dist/esm/dt/final/TURL.d.ts +2 -0
- package/dist/esm/dt/final/TURL.js +3 -0
- package/dist/esm/dt/index.d.ts +1 -0
- package/dist/esm/dt/targets/json-schema.d.ts +36 -0
- package/dist/esm/error/funcs.d.ts +4 -0
- package/dist/esm/error/funcs.js +5 -1
- package/dist/esm/error/index.d.ts +1 -1
- package/dist/esm/error/index.js +1 -1
- 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.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/product/manifest.d.ts +2 -0
- package/dist/esm/products/Helper/i18n.d.ts +2 -0
- package/dist/esm/std/impl/SimpleMapI18nManager.d.ts +1 -1
- package/dist/esm/std/impl/SimpleMapI18nManager.js +4 -2
- package/dist/esm/std/lib/settings.js +4 -5
- package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.d.ts +8 -2
- package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.js +20 -9
- package/dist/esm/target/index.d.ts +2 -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/AuthDataStore.js +1 -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/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 +15 -0
- package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.js +88 -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 +15 -0
- package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.js +88 -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.d.ts +25 -0
- package/dist/esm/target/lib/openapi/OpenAPISpecBuilder.js +135 -0
- package/dist/esm/target/lib/openapi/funcs.d.ts +11 -0
- package/dist/esm/target/lib/openapi/funcs.js +148 -0
- package/dist/esm/target/lib/openapi/types.d.ts +98 -0
- package/dist/esm/target/lib/openapi/types.js +1 -0
- package/dist/esm/target/lib/rn/input.d.ts +3 -0
- package/dist/esm/target/lib/server/AuthCookieCreator.d.ts +2 -1
- package/dist/esm/target/lib/server/ServerBooter.d.ts +4 -2
- package/dist/esm/target/lib/server/ServerBooter.js +44 -11
- package/dist/esm/target/lib/server/ServerManager.d.ts +29 -9
- package/dist/esm/target/lib/server/ServerRequestHandler.d.ts +10 -6
- package/dist/esm/target/lib/server/ServerRequestHandler.js +35 -25
- package/dist/esm/target/lib/server/consts.d.ts +4 -0
- package/dist/esm/target/lib/server/consts.js +26 -0
- package/dist/esm/target/lib/server-express/CORSMiddlewareBuilder.d.ts +15 -0
- package/dist/esm/target/lib/server-express/CORSMiddlewareBuilder.js +55 -0
- package/dist/esm/target/lib/server-express/funcs.d.ts +2 -1
- package/dist/esm/target/lib/server-express/funcs.js +6 -5
- package/dist/esm/target/lib/server-hono/CORSMiddlewareBuilder.d.ts +14 -0
- package/dist/esm/target/lib/server-hono/CORSMiddlewareBuilder.js +46 -0
- package/dist/esm/target/lib/server-hono/funcs.d.ts +2 -1
- package/dist/esm/target/lib/server-hono/funcs.js +6 -3
- package/dist/esm/target/lib/shared.d.ts +5 -0
- package/dist/esm/target/lib/shared.js +3 -1
- package/dist/esm/target/nextjs-server/NextJSServerManager.d.ts +5 -1
- package/dist/esm/target/nextjs-server/NextJSServerManager.js +6 -0
- package/dist/esm/target/node-express-server/NodeExpressServerManager.d.ts +12 -4
- package/dist/esm/target/node-express-server/NodeExpressServerManager.js +34 -15
- package/dist/esm/target/node-hono-server/NodeHonoServerManager.d.ts +11 -3
- package/dist/esm/target/node-hono-server/NodeHonoServerManager.js +31 -12
- package/dist/esm/target/{node-mcp-server/NodeLocalStdioMCPServerManager.d.ts → node-mcp-server-stdio/NodeMCPStdioServerManager.d.ts} +12 -21
- package/dist/esm/target/node-mcp-server-stdio/NodeMCPStdioServerManager.js +108 -0
- package/dist/esm/testing/impl/newNodeAppTester.js +5 -0
- package/dist/esm/uc/UC.d.ts +2 -0
- package/dist/esm/uc/UC.js +16 -1
- 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/metadata.d.ts +7 -0
- package/dist/esm/uc/metadata.js +10 -0
- 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 +14 -1
- package/dist/esm/uc/output-field.js +11 -1
- package/dist/esm/uc/utils/ucHTTPContract.js +1 -1
- package/dist/esm/utils/bundling/funcs.js +1 -1
- package/dist/esm/utils/bundling/vite/plugin.d.ts +1 -1
- package/dist/esm/utils/http/types.d.ts +5 -0
- package/dist/esm/utils/index.d.ts +2 -1
- 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/package.json +25 -14
- package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.js +0 -183
- 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 -19
- /package/dist/esm/{target/node-mcp-server/types.js → dt/targets/json-schema.js} +0 -0
package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
14
|
+
import { inject, injectable } from 'inversify';
|
|
15
|
+
import { WordingManager } from '../../../../../i18n/index.js';
|
|
16
|
+
import { ucMountingPoint, } from '../../../../../uc/index.js';
|
|
17
|
+
import { toReq, toRes } from '../../../server-express/funcs.js';
|
|
18
|
+
import { init, toolConfig } from '../../funcs.js';
|
|
19
|
+
import { MCPServerRequestHandler } from '../../MCPServerRequestHandler.js';
|
|
20
|
+
import { ucStreamExecOpts } from '../funcs.js';
|
|
21
|
+
let MCPHTTPExpressProtocolRequestHandlerBuilder = class MCPHTTPExpressProtocolRequestHandlerBuilder {
|
|
22
|
+
logger;
|
|
23
|
+
productManifest;
|
|
24
|
+
serverRequestHandler;
|
|
25
|
+
wordingManager;
|
|
26
|
+
constructor(logger, productManifest, serverRequestHandler, wordingManager) {
|
|
27
|
+
this.logger = logger;
|
|
28
|
+
this.productManifest = productManifest;
|
|
29
|
+
this.serverRequestHandler = serverRequestHandler;
|
|
30
|
+
this.wordingManager = wordingManager;
|
|
31
|
+
}
|
|
32
|
+
exec({ ucs, ucManager, }) {
|
|
33
|
+
return async (req, res) => {
|
|
34
|
+
const server = init(this.productManifest);
|
|
35
|
+
const transport = new StreamableHTTPServerTransport();
|
|
36
|
+
// In Streamable HTTP, there is usually one request => one transport => one server.
|
|
37
|
+
// So there shouldn't be multiple 'stream' use cases invoked at the same time.
|
|
38
|
+
// But maintaining a Map allows us to handle this case if it occurs.
|
|
39
|
+
// This way, we have all the streams available to close them when the transport is closed.
|
|
40
|
+
const execOptss = new Map();
|
|
41
|
+
for (const uc of ucs) {
|
|
42
|
+
const { def: { ext }, } = uc;
|
|
43
|
+
const mountingPoint = ext?.cmd?.mountAt ?? ucMountingPoint(uc);
|
|
44
|
+
const wording = this.wordingManager.uc(uc.def);
|
|
45
|
+
const config = toolConfig(uc, 'server', wording);
|
|
46
|
+
const transportType = ext?.http?.transportType ?? 'standard';
|
|
47
|
+
server.registerTool(mountingPoint, config, (input, extra) => {
|
|
48
|
+
const execOpts = ucStreamExecOpts(this.logger, transportType, extra);
|
|
49
|
+
if (execOpts) {
|
|
50
|
+
execOptss.set(mountingPoint, execOpts);
|
|
51
|
+
}
|
|
52
|
+
return this.serverRequestHandler.exec({
|
|
53
|
+
appManifest: uc.appManifest,
|
|
54
|
+
envelope: 'json',
|
|
55
|
+
execOpts,
|
|
56
|
+
req: {
|
|
57
|
+
...toReq(req),
|
|
58
|
+
bodyFromJSON: async () => input,
|
|
59
|
+
},
|
|
60
|
+
res: toRes(res),
|
|
61
|
+
ucd: uc.def,
|
|
62
|
+
ucManager,
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
transport.onclose = async () => {
|
|
67
|
+
this.logger.trace('Transport closed => closing streams');
|
|
68
|
+
await Promise.all(execOptss.values().map((eo) => eo.stream?.onClose()));
|
|
69
|
+
};
|
|
70
|
+
res.on('close', async () => {
|
|
71
|
+
this.logger.trace('Connection closed => closing transport');
|
|
72
|
+
await transport.close();
|
|
73
|
+
});
|
|
74
|
+
await server.connect(transport);
|
|
75
|
+
await transport.handleRequest(req, res, req.body);
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
MCPHTTPExpressProtocolRequestHandlerBuilder = __decorate([
|
|
80
|
+
injectable(),
|
|
81
|
+
__param(0, inject('Logger')),
|
|
82
|
+
__param(1, inject('ProductManifest')),
|
|
83
|
+
__param(2, inject(MCPServerRequestHandler)),
|
|
84
|
+
__param(3, inject(WordingManager)),
|
|
85
|
+
__metadata("design:paramtypes", [Object, Object, MCPServerRequestHandler,
|
|
86
|
+
WordingManager])
|
|
87
|
+
], MCPHTTPExpressProtocolRequestHandlerBuilder);
|
|
88
|
+
export { MCPHTTPExpressProtocolRequestHandlerBuilder };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
2
|
+
import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import type { TransportType } from '../../../../dt/index.js';
|
|
4
|
+
import type { Logger } from '../../../../std/index.js';
|
|
5
|
+
import type { UCManagerExecServerOpts, UCOPIBase } from '../../../../uc/index.js';
|
|
6
|
+
export declare function ucStreamExecOpts<OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(logger: Logger, transportType: TransportType, extra: RequestHandlerExtra<ServerRequest, ServerNotification>): UCManagerExecServerOpts<OPI0, OPI1> | undefined;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { defaultStreamOnClose } from '../../../../utils/index.js';
|
|
2
|
+
export function ucStreamExecOpts(logger, transportType, extra) {
|
|
3
|
+
let execOpts;
|
|
4
|
+
switch (transportType) {
|
|
5
|
+
case 'standard':
|
|
6
|
+
// Nothing to do
|
|
7
|
+
break;
|
|
8
|
+
case 'stream': {
|
|
9
|
+
let streamedOnce = false;
|
|
10
|
+
execOpts = {
|
|
11
|
+
stream: {
|
|
12
|
+
onClose: defaultStreamOnClose(streamedOnce),
|
|
13
|
+
onData: async (output) => {
|
|
14
|
+
logger.trace('execOpts.stream.onData', {
|
|
15
|
+
output: JSON.stringify(output),
|
|
16
|
+
});
|
|
17
|
+
streamedOnce = true;
|
|
18
|
+
if (!output) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
await extra.sendNotification({
|
|
23
|
+
method: 'notifications/message',
|
|
24
|
+
params: {
|
|
25
|
+
data: output,
|
|
26
|
+
level: 'info',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (_err) {
|
|
31
|
+
// There are cases where the client (e.g. Claude) has already closed the stream
|
|
32
|
+
// without triggering any lifecycle method (e.g `transport.onclose` or `c.req.raw.signal.addEventListener('abort')` with hono.
|
|
33
|
+
// Sending a notification in this case triggers an error like so : `No connection established for request ID: 1`.
|
|
34
|
+
// So we assume it's closed and force close the stream.
|
|
35
|
+
logger.trace('Connection already closed => force closing stream');
|
|
36
|
+
await execOpts?.stream?.onClose();
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
onDone: async () => {
|
|
40
|
+
logger.trace('execOpts.stream.onDone');
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
default:
|
|
47
|
+
transportType;
|
|
48
|
+
}
|
|
49
|
+
return execOpts;
|
|
50
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { injectable } from 'inversify';
|
|
8
|
+
let MCPHTTPHonoFakeRequestHandlerBuilder = class MCPHTTPHonoFakeRequestHandlerBuilder {
|
|
9
|
+
exec() {
|
|
10
|
+
return async (c) => {
|
|
11
|
+
return c.json({}, 200);
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
MCPHTTPHonoFakeRequestHandlerBuilder = __decorate([
|
|
16
|
+
injectable()
|
|
17
|
+
], MCPHTTPHonoFakeRequestHandlerBuilder);
|
|
18
|
+
export { MCPHTTPHonoFakeRequestHandlerBuilder };
|
package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import { WordingManager } from '../../../../../i18n/index.js';
|
|
3
|
+
import type { ProductManifest } from '../../../../../product/index.js';
|
|
4
|
+
import type { Logger } from '../../../../../std/index.js';
|
|
5
|
+
import { MCPServerRequestHandler } from '../../MCPServerRequestHandler.js';
|
|
6
|
+
import type { MCPHTTPRequestHandlerBuilderInput } from '../MCPHTTPRequestHandlerBuilder.js';
|
|
7
|
+
import type { MCPHTTPHonoRequestHandlerBuilder } from './types.js';
|
|
8
|
+
export declare class MCPHTTPHonoProtocolRequestHandlerBuilder implements MCPHTTPHonoRequestHandlerBuilder {
|
|
9
|
+
private logger;
|
|
10
|
+
private productManifest;
|
|
11
|
+
private serverRequestHandler;
|
|
12
|
+
private wordingManager;
|
|
13
|
+
constructor(logger: Logger, productManifest: ProductManifest, serverRequestHandler: MCPServerRequestHandler, wordingManager: WordingManager);
|
|
14
|
+
exec({ ucs, ucManager, }: MCPHTTPRequestHandlerBuilderInput): MiddlewareHandler;
|
|
15
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
|
|
14
|
+
import { inject, injectable } from 'inversify';
|
|
15
|
+
import { WordingManager } from '../../../../../i18n/index.js';
|
|
16
|
+
import { ucMountingPoint, } from '../../../../../uc/index.js';
|
|
17
|
+
import { toReq, toRes } from '../../../server-hono/funcs.js';
|
|
18
|
+
import { init, toolConfig } from '../../funcs.js';
|
|
19
|
+
import { MCPServerRequestHandler } from '../../MCPServerRequestHandler.js';
|
|
20
|
+
import { ucStreamExecOpts } from '../funcs.js';
|
|
21
|
+
let MCPHTTPHonoProtocolRequestHandlerBuilder = class MCPHTTPHonoProtocolRequestHandlerBuilder {
|
|
22
|
+
logger;
|
|
23
|
+
productManifest;
|
|
24
|
+
serverRequestHandler;
|
|
25
|
+
wordingManager;
|
|
26
|
+
constructor(logger, productManifest, serverRequestHandler, wordingManager) {
|
|
27
|
+
this.logger = logger;
|
|
28
|
+
this.productManifest = productManifest;
|
|
29
|
+
this.serverRequestHandler = serverRequestHandler;
|
|
30
|
+
this.wordingManager = wordingManager;
|
|
31
|
+
}
|
|
32
|
+
exec({ ucs, ucManager, }) {
|
|
33
|
+
return async (c) => {
|
|
34
|
+
const server = init(this.productManifest);
|
|
35
|
+
const transport = new WebStandardStreamableHTTPServerTransport();
|
|
36
|
+
// In Streamable HTTP, there is usually one request => one transport => one server.
|
|
37
|
+
// So there shouldn't be multiple 'stream' use cases invoked at the same time.
|
|
38
|
+
// But maintaining a Map allows us to handle this case if it occurs.
|
|
39
|
+
// This way, we have all the streams available to close them when the transport is closed.
|
|
40
|
+
const execOptss = new Map();
|
|
41
|
+
for (const uc of ucs) {
|
|
42
|
+
const { def: { ext }, } = uc;
|
|
43
|
+
const mountingPoint = ext?.cmd?.mountAt ?? ucMountingPoint(uc);
|
|
44
|
+
const wording = this.wordingManager.uc(uc.def);
|
|
45
|
+
const config = toolConfig(uc, 'server', wording);
|
|
46
|
+
const transportType = ext?.http?.transportType ?? 'standard';
|
|
47
|
+
server.registerTool(mountingPoint, config, (input, extra) => {
|
|
48
|
+
const execOpts = ucStreamExecOpts(this.logger, transportType, extra);
|
|
49
|
+
if (execOpts) {
|
|
50
|
+
execOptss.set(mountingPoint, execOpts);
|
|
51
|
+
}
|
|
52
|
+
return this.serverRequestHandler.exec({
|
|
53
|
+
appManifest: uc.appManifest,
|
|
54
|
+
envelope: 'json',
|
|
55
|
+
execOpts,
|
|
56
|
+
req: {
|
|
57
|
+
...toReq(c),
|
|
58
|
+
bodyFromJSON: async () => input,
|
|
59
|
+
},
|
|
60
|
+
res: toRes(c),
|
|
61
|
+
ucd: uc.def,
|
|
62
|
+
ucManager,
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
transport.onclose = async () => {
|
|
67
|
+
this.logger.trace('Transport closed => closing streams');
|
|
68
|
+
await Promise.all(execOptss.values().map((eo) => eo.stream?.onClose()));
|
|
69
|
+
};
|
|
70
|
+
c.req.raw.signal.addEventListener('abort', async () => {
|
|
71
|
+
this.logger.trace('Connection closed => closing transport');
|
|
72
|
+
await transport.close();
|
|
73
|
+
});
|
|
74
|
+
await server.connect(transport);
|
|
75
|
+
return transport.handleRequest(c.req.raw);
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
MCPHTTPHonoProtocolRequestHandlerBuilder = __decorate([
|
|
80
|
+
injectable(),
|
|
81
|
+
__param(0, inject('Logger')),
|
|
82
|
+
__param(1, inject('ProductManifest')),
|
|
83
|
+
__param(2, inject(MCPServerRequestHandler)),
|
|
84
|
+
__param(3, inject(WordingManager)),
|
|
85
|
+
__metadata("design:paramtypes", [Object, Object, MCPServerRequestHandler,
|
|
86
|
+
WordingManager])
|
|
87
|
+
], MCPHTTPHonoProtocolRequestHandlerBuilder);
|
|
88
|
+
export { MCPHTTPHonoProtocolRequestHandlerBuilder };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { AppManifest } from '../../../../app/index.js';
|
|
3
|
+
import type { JWTManager, Worker } from '../../../../std/index.js';
|
|
4
|
+
import { UCBuilder, type UCDef, type UCInput, type UCManager, type UCOPIBase } from '../../../../uc/index.js';
|
|
5
|
+
import type { AuthDataStore } from '../../client/AuthDataStore.js';
|
|
6
|
+
import type { StdioToolInput } from './input.js';
|
|
7
|
+
interface Input<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined> {
|
|
8
|
+
appManifest: AppManifest;
|
|
9
|
+
toolInput: StdioToolInput<I>;
|
|
10
|
+
ucd: UCDef<I, OPI0, OPI1>;
|
|
11
|
+
/**
|
|
12
|
+
* It is not injected in the handler constructor because it must be the same as the one used in ServerManager.
|
|
13
|
+
*
|
|
14
|
+
* And in some cases, this latter is specific to a context : for instance in automated tests.
|
|
15
|
+
*/
|
|
16
|
+
ucManager: UCManager;
|
|
17
|
+
}
|
|
18
|
+
type Output = CallToolResult;
|
|
19
|
+
export declare class MCPStdioRequestHandler implements Worker<Input, Promise<Output>> {
|
|
20
|
+
private authDataStore;
|
|
21
|
+
private jwtManager;
|
|
22
|
+
private ucBuilder;
|
|
23
|
+
constructor(authDataStore: AuthDataStore, jwtManager: JWTManager, ucBuilder: UCBuilder);
|
|
24
|
+
exec<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>({ appManifest, toolInput, ucd, ucManager, }: Input<I, OPI0, OPI1>): Promise<Output>;
|
|
25
|
+
private auth;
|
|
26
|
+
private applySideEffects;
|
|
27
|
+
private applyClearAuthSideEffect;
|
|
28
|
+
private applyRedirectSideEffect;
|
|
29
|
+
private applySetAuthSideEffect;
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable } from 'inversify';
|
|
14
|
+
import { UCBuilder, UCOutputSideEffectType, } from '../../../../uc/index.js';
|
|
15
|
+
import { resAborted, resError, resObj } from '../funcs.js';
|
|
16
|
+
let MCPStdioRequestHandler = class MCPStdioRequestHandler {
|
|
17
|
+
authDataStore;
|
|
18
|
+
jwtManager;
|
|
19
|
+
ucBuilder;
|
|
20
|
+
constructor(authDataStore, jwtManager, ucBuilder) {
|
|
21
|
+
this.authDataStore = authDataStore;
|
|
22
|
+
this.jwtManager = jwtManager;
|
|
23
|
+
this.ucBuilder = ucBuilder;
|
|
24
|
+
}
|
|
25
|
+
async exec({ appManifest, toolInput, ucd, ucManager, }) {
|
|
26
|
+
try {
|
|
27
|
+
const auth = await this.auth();
|
|
28
|
+
const uc = this.ucBuilder.exec({
|
|
29
|
+
appManifest,
|
|
30
|
+
auth,
|
|
31
|
+
def: ucd,
|
|
32
|
+
});
|
|
33
|
+
if (toolInput) {
|
|
34
|
+
const { _reserved, ...rest } = toolInput;
|
|
35
|
+
uc.fill(rest);
|
|
36
|
+
if (_reserved?.confirmed === undefined) {
|
|
37
|
+
await ucManager.confirmClient(uc);
|
|
38
|
+
// ... throws an error
|
|
39
|
+
}
|
|
40
|
+
else if (_reserved.confirmed === false) {
|
|
41
|
+
return resAborted();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const ucor = await ucManager.execClient(uc);
|
|
45
|
+
await this.applySideEffects(ucor);
|
|
46
|
+
return resObj(ucor.output());
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
return resError(err);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async auth() {
|
|
53
|
+
// TODO : Memoize the auth instead of decoding each time
|
|
54
|
+
const jwt = await this.authDataStore.get();
|
|
55
|
+
if (!jwt) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return this.jwtManager.decodeUnsafe(jwt);
|
|
59
|
+
}
|
|
60
|
+
async applySideEffects(ucor) {
|
|
61
|
+
const { io } = ucor.ucd();
|
|
62
|
+
const sideEffects = io.o?.sideEffects;
|
|
63
|
+
if (!sideEffects) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
let item;
|
|
67
|
+
if (ucor.canItem00()) {
|
|
68
|
+
item = ucor.item00().item;
|
|
69
|
+
}
|
|
70
|
+
for (const se of sideEffects) {
|
|
71
|
+
const { type } = se;
|
|
72
|
+
switch (type) {
|
|
73
|
+
case UCOutputSideEffectType.CLEAR_AUTH:
|
|
74
|
+
await this.applyClearAuthSideEffect();
|
|
75
|
+
return;
|
|
76
|
+
case UCOutputSideEffectType.REDIRECT:
|
|
77
|
+
await this.applyRedirectSideEffect(item);
|
|
78
|
+
return;
|
|
79
|
+
case UCOutputSideEffectType.SET_AUTH:
|
|
80
|
+
await this.applySetAuthSideEffect(item);
|
|
81
|
+
return;
|
|
82
|
+
default:
|
|
83
|
+
(type);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async applyClearAuthSideEffect() {
|
|
88
|
+
await this.authDataStore.set(null);
|
|
89
|
+
}
|
|
90
|
+
async applyRedirectSideEffect(_item) {
|
|
91
|
+
// Nothing to do
|
|
92
|
+
}
|
|
93
|
+
async applySetAuthSideEffect(item) {
|
|
94
|
+
if (!item || !('jwt' in item) || typeof item.jwt !== 'string') {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const { jwt } = item;
|
|
98
|
+
await this.authDataStore.set(jwt);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
MCPStdioRequestHandler = __decorate([
|
|
102
|
+
injectable(),
|
|
103
|
+
__param(0, inject('AuthDataStore')),
|
|
104
|
+
__param(1, inject('JWTManager')),
|
|
105
|
+
__param(2, inject(UCBuilder)),
|
|
106
|
+
__metadata("design:paramtypes", [Object, Object, UCBuilder])
|
|
107
|
+
], MCPStdioRequestHandler);
|
|
108
|
+
export { MCPStdioRequestHandler };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { WordingManager } from '../../../../i18n/index.js';
|
|
2
|
+
import type { UCClientConfirmManager, UCDef, UCInput, UCOPIBase } from '../../../../uc/index.js';
|
|
3
|
+
export declare class MCPStdioUCClientConfirmManager implements UCClientConfirmManager {
|
|
4
|
+
private wordingManager;
|
|
5
|
+
constructor(wordingManager: WordingManager);
|
|
6
|
+
exec<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(ucd: UCDef<I, OPI0, OPI1>): Promise<boolean>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable } from 'inversify';
|
|
14
|
+
import { WordingManager } from '../../../../i18n/index.js';
|
|
15
|
+
import { UC_CONFIRM_HINT } from './consts.js';
|
|
16
|
+
let MCPStdioUCClientConfirmManager = class MCPStdioUCClientConfirmManager {
|
|
17
|
+
wordingManager;
|
|
18
|
+
constructor(wordingManager) {
|
|
19
|
+
this.wordingManager = wordingManager;
|
|
20
|
+
}
|
|
21
|
+
async exec(ucd) {
|
|
22
|
+
const { message, title } = this.wordingManager.ucClientConfirm(ucd);
|
|
23
|
+
let m = title;
|
|
24
|
+
if (message) {
|
|
25
|
+
m = `\n${message}`;
|
|
26
|
+
}
|
|
27
|
+
m = `\n${UC_CONFIRM_HINT}`;
|
|
28
|
+
throw new Error(m);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
MCPStdioUCClientConfirmManager = __decorate([
|
|
32
|
+
injectable(),
|
|
33
|
+
__param(0, inject(WordingManager)),
|
|
34
|
+
__metadata("design:paramtypes", [WordingManager])
|
|
35
|
+
], MCPStdioUCClientConfirmManager);
|
|
36
|
+
export { MCPStdioUCClientConfirmManager };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { RESERVED_CONFIRMED_KEY, RESERVED_KEY } from './input.js';
|
|
2
|
+
export const ERR_LOGGER_LEVEL = 'Set the logging_level to "error" as MCP does not want the server to log to stdout (see https://modelcontextprotocol.io/docs/tools/debugging#implementing-logging)';
|
|
3
|
+
export const UC_CONFIRM_HINT = `(Hint: ask the user to confirm. If they do, set the property "${RESERVED_CONFIRMED_KEY}" in "${RESERVED_KEY}" to true in the input. Otherwise, set it to false)`;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ERR_LOGGER_LEVEL } from './consts.js';
|
|
2
|
+
export function assertLoggerLevel(loggerLevel) {
|
|
3
|
+
if (loggerLevel === 'error') {
|
|
4
|
+
return;
|
|
5
|
+
}
|
|
6
|
+
// Depending on the `Logger` implementation, this.logger.error() might not write to stderr (e.g. can write to a file).
|
|
7
|
+
// That's why we explicitly write to stdout by calling console.error().
|
|
8
|
+
// biome-ignore lint/suspicious/noConsole: we want it
|
|
9
|
+
console.error(new Error(ERR_LOGGER_LEVEL));
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { JSONSchemaObject } from '../../../../dt/index.js';
|
|
2
|
+
import type { UCInput } from '../../../../uc/index.js';
|
|
3
|
+
export type StdioToolInput<I extends UCInput | undefined = undefined> = I & {
|
|
4
|
+
_reserved?: {
|
|
5
|
+
confirmed?: boolean;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
export declare const RESERVED_KEY: "_reserved";
|
|
9
|
+
export declare const RESERVED_CONFIRMED_KEY: "confirmed";
|
|
10
|
+
export declare function stdioToolInputSchema(): JSONSchemaObject<StdioToolInput>['properties'];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const RESERVED_KEY = '_reserved';
|
|
2
|
+
export const RESERVED_CONFIRMED_KEY = 'confirmed';
|
|
3
|
+
export function stdioToolInputSchema() {
|
|
4
|
+
return {
|
|
5
|
+
[RESERVED_KEY]: {
|
|
6
|
+
additionalProperties: false,
|
|
7
|
+
properties: {
|
|
8
|
+
[RESERVED_CONFIRMED_KEY]: {
|
|
9
|
+
type: 'boolean',
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
type: 'object',
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { WordingManager } from '../../../i18n/index.js';
|
|
2
|
+
import type { ProductManifest, ProductUCsLoaderOutput } from '../../../product/index.js';
|
|
3
|
+
import type { Configurable, I18nManager, SettingsManager, Worker } from '../../../std/index.js';
|
|
4
|
+
import type { ServerManagerSettings } from '../server/ServerManager.js';
|
|
5
|
+
import type { OpenAPISpec } from './types.js';
|
|
6
|
+
type Input = {
|
|
7
|
+
ucs: ProductUCsLoaderOutput;
|
|
8
|
+
};
|
|
9
|
+
interface Output {
|
|
10
|
+
spec: OpenAPISpec;
|
|
11
|
+
}
|
|
12
|
+
type S = Pick<ServerManagerSettings, 'server_cookies_name_auth' | 'server_public_api_key_header_name' | 'server_public_url'>;
|
|
13
|
+
export declare class OpenAPISpecBuilder implements Configurable<S>, Worker<Input, Promise<Output>> {
|
|
14
|
+
private i18nManager;
|
|
15
|
+
private productManifest;
|
|
16
|
+
private settingsManager;
|
|
17
|
+
private wordingManager;
|
|
18
|
+
constructor(i18nManager: I18nManager, productManifest: ProductManifest, settingsManager: SettingsManager<S>, wordingManager: WordingManager);
|
|
19
|
+
s(): S;
|
|
20
|
+
exec({ ucs }: Input): Promise<Output>;
|
|
21
|
+
private initErrors;
|
|
22
|
+
private initOutput;
|
|
23
|
+
private initPath;
|
|
24
|
+
}
|
|
25
|
+
export {};
|