libmodulor 0.29.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.
Files changed (137) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +2 -2
  3. package/dist/esm/apps/Helper/src/lib/layers/product.js +1 -1
  4. package/dist/esm/apps/Helper/src/lib/layers/project.js +6 -6
  5. package/dist/esm/apps/Helper/src/lib/layers/target.js +27 -11
  6. package/dist/esm/convention.d.ts +2 -0
  7. package/dist/esm/convention.js +1 -0
  8. package/dist/esm/dt/base/TObject.js +13 -5
  9. package/dist/esm/dt/index.d.ts +1 -1
  10. package/dist/esm/dt/targets/json-schema.d.ts +23 -11
  11. package/dist/esm/error/funcs.d.ts +1 -0
  12. package/dist/esm/error/funcs.js +4 -0
  13. package/dist/esm/error/index.d.ts +1 -1
  14. package/dist/esm/error/index.js +1 -1
  15. package/dist/esm/i18n/locales/de.js +2 -0
  16. package/dist/esm/i18n/locales/en.js +2 -0
  17. package/dist/esm/i18n/locales/es.js +2 -0
  18. package/dist/esm/i18n/locales/fr.js +2 -0
  19. package/dist/esm/i18n/types.d.ts +1 -1
  20. package/dist/esm/index.d.ts +3 -0
  21. package/dist/esm/index.js +3 -0
  22. package/dist/esm/index.node-express.d.ts +2 -0
  23. package/dist/esm/index.node-express.js +1 -0
  24. package/dist/esm/index.node-hono.d.ts +2 -0
  25. package/dist/esm/index.node-hono.js +1 -0
  26. package/dist/esm/index.node-mcp-express.d.ts +3 -0
  27. package/dist/esm/index.node-mcp-express.js +2 -0
  28. package/dist/esm/index.node-mcp-hono.d.ts +3 -0
  29. package/dist/esm/index.node-mcp-hono.js +2 -0
  30. package/dist/esm/index.node-mcp.d.ts +3 -1
  31. package/dist/esm/index.node-mcp.js +3 -1
  32. package/dist/esm/products/Helper/i18n.d.ts +2 -0
  33. package/dist/esm/std/lib/settings.js +4 -5
  34. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.d.ts +2 -0
  35. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.js +3 -0
  36. package/dist/esm/target/index.d.ts +1 -1
  37. package/dist/esm/target/index.js +1 -1
  38. package/dist/esm/target/lib/client/AuthDataStore.d.ts +5 -0
  39. package/dist/esm/target/lib/client/impl/InMemoryAuthDataStore.d.ts +7 -0
  40. package/dist/esm/target/lib/client/impl/InMemoryAuthDataStore.js +20 -0
  41. package/dist/esm/target/lib/client/impl/MixedServerClientManager.d.ts +15 -0
  42. package/dist/esm/target/lib/client/impl/MixedServerClientManager.js +44 -0
  43. package/dist/esm/target/lib/json-schema/error.d.ts +3 -0
  44. package/dist/esm/target/lib/json-schema/error.js +14 -0
  45. package/dist/esm/target/lib/json-schema/input.d.ts +16 -0
  46. package/dist/esm/target/lib/json-schema/input.js +67 -0
  47. package/dist/esm/target/lib/json-schema/output.d.ts +19 -0
  48. package/dist/esm/target/lib/json-schema/output.js +128 -0
  49. package/dist/esm/target/lib/manifest.d.ts +32 -1
  50. package/dist/esm/target/lib/manifest.js +22 -1
  51. package/dist/esm/target/lib/mcp-server/MCPServerRequestHandler.d.ts +16 -0
  52. package/dist/esm/target/lib/mcp-server/MCPServerRequestHandler.js +54 -0
  53. package/dist/esm/target/lib/mcp-server/consts.d.ts +1 -0
  54. package/dist/esm/target/lib/mcp-server/consts.js +1 -0
  55. package/dist/esm/target/lib/mcp-server/funcs.d.ts +13 -0
  56. package/dist/esm/target/lib/mcp-server/funcs.js +84 -0
  57. package/dist/esm/target/lib/mcp-server/http/MCPHTTPRequestHandlerBuilder.d.ts +14 -0
  58. package/dist/esm/target/lib/mcp-server/http/MCPHTTPRequestHandlerBuilder.js +1 -0
  59. package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressFakeRequestHandlerBuilder.d.ts +5 -0
  60. package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressFakeRequestHandlerBuilder.js +18 -0
  61. package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.d.ts +15 -0
  62. package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.js +88 -0
  63. package/dist/esm/target/lib/mcp-server/http/express/types.d.ts +3 -0
  64. package/dist/esm/target/lib/mcp-server/http/express/types.js +1 -0
  65. package/dist/esm/target/lib/mcp-server/http/funcs.d.ts +6 -0
  66. package/dist/esm/target/lib/mcp-server/http/funcs.js +50 -0
  67. package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoFakeRequestHandlerBuilder.d.ts +5 -0
  68. package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoFakeRequestHandlerBuilder.js +18 -0
  69. package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.d.ts +15 -0
  70. package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.js +88 -0
  71. package/dist/esm/target/lib/mcp-server/http/hono/types.d.ts +3 -0
  72. package/dist/esm/target/lib/mcp-server/http/hono/types.js +1 -0
  73. package/dist/esm/target/lib/mcp-server/stdio/MCPStdioRequestHandler.d.ts +31 -0
  74. package/dist/esm/target/lib/mcp-server/stdio/MCPStdioRequestHandler.js +108 -0
  75. package/dist/esm/target/lib/mcp-server/stdio/MCPStdioUCClientConfirmManager.d.ts +7 -0
  76. package/dist/esm/target/lib/mcp-server/stdio/MCPStdioUCClientConfirmManager.js +36 -0
  77. package/dist/esm/target/lib/mcp-server/stdio/consts.d.ts +2 -0
  78. package/dist/esm/target/lib/mcp-server/stdio/consts.js +3 -0
  79. package/dist/esm/target/lib/mcp-server/stdio/funcs.d.ts +2 -0
  80. package/dist/esm/target/lib/mcp-server/stdio/funcs.js +10 -0
  81. package/dist/esm/target/lib/mcp-server/stdio/input.d.ts +10 -0
  82. package/dist/esm/target/lib/mcp-server/stdio/input.js +15 -0
  83. package/dist/esm/target/lib/mcp-server/types.d.ts +2 -0
  84. package/dist/esm/target/lib/mcp-server/types.js +1 -0
  85. package/dist/esm/target/lib/openapi/OpenAPISpecBuilder.js +8 -4
  86. package/dist/esm/target/lib/openapi/funcs.d.ts +4 -9
  87. package/dist/esm/target/lib/openapi/funcs.js +18 -119
  88. package/dist/esm/target/lib/openapi/types.d.ts +5 -16
  89. package/dist/esm/target/lib/server/ServerBooter.d.ts +1 -1
  90. package/dist/esm/target/lib/server/ServerBooter.js +10 -0
  91. package/dist/esm/target/lib/server/ServerManager.d.ts +10 -0
  92. package/dist/esm/target/lib/server/ServerRequestHandler.d.ts +10 -5
  93. package/dist/esm/target/lib/server/ServerRequestHandler.js +35 -25
  94. package/dist/esm/target/lib/server/consts.js +4 -0
  95. package/dist/esm/target/lib/server-express/funcs.js +2 -6
  96. package/dist/esm/target/lib/server-hono/funcs.js +4 -2
  97. package/dist/esm/target/lib/shared.d.ts +1 -0
  98. package/dist/esm/target/lib/shared.js +1 -0
  99. package/dist/esm/target/nextjs-server/NextJSServerManager.d.ts +2 -0
  100. package/dist/esm/target/nextjs-server/NextJSServerManager.js +3 -0
  101. package/dist/esm/target/node-express-server/NodeExpressServerManager.d.ts +6 -2
  102. package/dist/esm/target/node-express-server/NodeExpressServerManager.js +15 -6
  103. package/dist/esm/target/node-hono-server/NodeHonoServerManager.d.ts +6 -2
  104. package/dist/esm/target/node-hono-server/NodeHonoServerManager.js +15 -6
  105. package/dist/esm/target/{node-mcp-server/NodeLocalStdioMCPServerManager.d.ts → node-mcp-server-stdio/NodeMCPStdioServerManager.d.ts} +9 -20
  106. package/dist/esm/target/node-mcp-server-stdio/NodeMCPStdioServerManager.js +108 -0
  107. package/dist/esm/testing/impl/newNodeAppTester.js +5 -0
  108. package/dist/esm/uc/cardinality.d.ts +7 -0
  109. package/dist/esm/uc/cardinality.js +14 -0
  110. package/dist/esm/uc/examples.d.ts +2 -0
  111. package/dist/esm/uc/examples.js +12 -0
  112. package/dist/esm/uc/helpers/UCOutputReader.d.ts +2 -2
  113. package/dist/esm/uc/helpers/UCOutputReader.js +2 -2
  114. package/dist/esm/uc/index.d.ts +2 -0
  115. package/dist/esm/uc/index.js +2 -0
  116. package/dist/esm/uc/input-field.d.ts +3 -6
  117. package/dist/esm/uc/input-field.js +5 -21
  118. package/dist/esm/uc/opi.d.ts +3 -1
  119. package/dist/esm/uc/opi.js +4 -1
  120. package/dist/esm/uc/output-field.d.ts +13 -1
  121. package/dist/esm/uc/output-field.js +9 -11
  122. package/dist/esm/utils/bundling/funcs.js +1 -1
  123. package/dist/esm/utils/bundling/vite/plugin.d.ts +1 -1
  124. package/dist/esm/utils/index.d.ts +1 -0
  125. package/dist/esm/utils/index.js +1 -0
  126. package/dist/esm/utils/streams/funcs.d.ts +2 -0
  127. package/dist/esm/utils/streams/funcs.js +10 -0
  128. package/package.json +20 -9
  129. package/dist/esm/target/lib/openapi/consts.d.ts +0 -2
  130. package/dist/esm/target/lib/openapi/consts.js +0 -1
  131. package/dist/esm/target/lib/openapi/input.d.ts +0 -16
  132. package/dist/esm/target/lib/openapi/input.js +0 -33
  133. package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.js +0 -188
  134. package/dist/esm/target/node-mcp-server/funcs.d.ts +0 -7
  135. package/dist/esm/target/node-mcp-server/funcs.js +0 -45
  136. package/dist/esm/target/node-mcp-server/types.d.ts +0 -15
  137. /package/dist/esm/target/{node-mcp-server/types.js → lib/client/AuthDataStore.js} +0 -0
@@ -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(ServerRequestHandler)),
123
- __param(7, inject(ServerSSLCertLoader)),
124
- __param(8, inject('SettingsManager')),
125
- __param(9, inject('UCManager')),
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>;
@@ -29,18 +29,20 @@ let NodeHonoServerManager = class NodeHonoServerManager {
29
29
  entrypointsBuilder;
30
30
  environmentManager;
31
31
  logger;
32
+ mcpHTTPRequestHandlerBuilder;
32
33
  serverRequestHandler;
33
34
  serverSSLCertLoader;
34
35
  settingsManager;
35
36
  ucManager;
36
37
  runtime;
37
38
  server;
38
- constructor(corsMiddlewareBuilder, customerFacingErrorBuilder, entrypointsBuilder, environmentManager, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
39
+ constructor(corsMiddlewareBuilder, customerFacingErrorBuilder, entrypointsBuilder, environmentManager, logger, mcpHTTPRequestHandlerBuilder, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
39
40
  this.corsMiddlewareBuilder = corsMiddlewareBuilder;
40
41
  this.customerFacingErrorBuilder = customerFacingErrorBuilder;
41
42
  this.entrypointsBuilder = entrypointsBuilder;
42
43
  this.environmentManager = environmentManager;
43
44
  this.logger = logger;
45
+ this.mcpHTTPRequestHandlerBuilder = mcpHTTPRequestHandlerBuilder;
44
46
  this.serverRequestHandler = serverRequestHandler;
45
47
  this.serverSSLCertLoader = serverSSLCertLoader;
46
48
  this.settingsManager = settingsManager;
@@ -75,6 +77,12 @@ let NodeHonoServerManager = class NodeHonoServerManager {
75
77
  mountSync(appManifest, ucd, contract) {
76
78
  this.mountCommon(appManifest, ucd, contract);
77
79
  }
80
+ async mountMCP(ucs, at) {
81
+ this.runtime.post(at, this.mcpHTTPRequestHandlerBuilder.exec({
82
+ ucManager: this.ucManager,
83
+ ucs,
84
+ }));
85
+ }
78
86
  async mountOpenAPISpec(spec, at) {
79
87
  this.runtime.get(at, (c) => {
80
88
  return c.json(spec);
@@ -122,13 +130,14 @@ NodeHonoServerManager = __decorate([
122
130
  __param(2, inject(EntrypointsBuilder)),
123
131
  __param(3, inject('EnvironmentManager')),
124
132
  __param(4, inject('Logger')),
125
- __param(5, inject(ServerRequestHandler)),
126
- __param(6, inject(ServerSSLCertLoader)),
127
- __param(7, inject('SettingsManager')),
128
- __param(8, inject('UCManager')),
133
+ __param(5, inject('MCPHTTPRequestHandlerBuilder')),
134
+ __param(6, inject(ServerRequestHandler)),
135
+ __param(7, inject(ServerSSLCertLoader)),
136
+ __param(8, inject('SettingsManager')),
137
+ __param(9, inject('UCManager')),
129
138
  __metadata("design:paramtypes", [CORSMiddlewareBuilder,
130
139
  CustomerFacingErrorBuilder,
131
- EntrypointsBuilder, Object, Object, ServerRequestHandler,
140
+ EntrypointsBuilder, Object, Object, Object, ServerRequestHandler,
132
141
  ServerSSLCertLoader, Object, Object])
133
142
  ], NodeHonoServerManager);
134
143
  export { NodeHonoServerManager };
@@ -1,48 +1,37 @@
1
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import type { AppManifest } from '../../app/index.js';
3
3
  import type { DirPath, URLPath } from '../../dt/index.js';
4
4
  import { WordingManager } from '../../i18n/index.js';
5
- import type { ProductManifest } from '../../product/index.js';
5
+ import type { ProductManifest, ProductUCsLoaderOutput } from '../../product/index.js';
6
6
  import type { Configurable, LoggerSettings, SettingsManager } from '../../std/index.js';
7
7
  import { UCBuilder, type UCDef, type UCHTTPContract, type UCInput, type UCManager, type UCOPIBase } from '../../uc/index.js';
8
+ import { MCPStdioRequestHandler } from '../lib/mcp-server/stdio/MCPStdioRequestHandler.js';
8
9
  import type { OpenAPISpec } from '../lib/openapi/types.js';
9
10
  import type { ServerManager } from '../lib/server/ServerManager.js';
10
11
  type S = Pick<LoggerSettings, 'logger_level'>;
11
- /**
12
- * A simple MCP Server implementation
13
- *
14
- * Although it implements {@link ServerManager}, this implementation is not necessarily a "server".
15
- * Indeed, it uses a local `Transport` so it must be considered the same as a {@link NodeCoreCLIManager}.
16
- * Therefore, it calls `execClient` and not `execServer`.
17
- * This way, Claude AI, or any other client is just a wrapper on top of it.
18
- *
19
- * @alpha This implementation still has lots of TODOs and has not been tested in real conditions. It needs to be stabilized before usage.
20
- */
21
- export declare class NodeLocalStdioMCPServerManager implements Configurable<S>, ServerManager {
12
+ export declare class NodeMCPStdioServerManager implements Configurable<S>, ServerManager {
13
+ private requestHandler;
22
14
  private productManifest;
23
15
  private settingsManager;
24
16
  private ucBuilder;
25
17
  private ucManager;
26
18
  private wordingManager;
27
- protected runtime: Server;
19
+ protected runtime: McpServer;
28
20
  private transport;
29
- private appManifests;
30
- private tools;
31
- constructor(productManifest: ProductManifest, settingsManager: SettingsManager<S>, ucBuilder: UCBuilder, ucManager: UCManager, wordingManager: WordingManager);
21
+ constructor(requestHandler: MCPStdioRequestHandler, productManifest: ProductManifest, settingsManager: SettingsManager<S>, ucBuilder: UCBuilder, ucManager: UCManager, wordingManager: WordingManager);
32
22
  s(): S;
33
23
  overrideUCManager(ucManager: UCManager): void;
34
24
  init(): Promise<void>;
35
25
  initSync(): void;
36
26
  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>;
37
27
  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;
28
+ mountMCP(_ucs: ProductUCsLoaderOutput, _at: URLPath): Promise<void>;
38
29
  mountOpenAPISpec(_spec: OpenAPISpec, _at: URLPath): Promise<void>;
39
30
  mountStaticDir(_dirPath: DirPath): Promise<void>;
40
31
  start(): Promise<void>;
41
32
  stop(): Promise<void>;
42
33
  warmUp(): Promise<void>;
43
- private buildInputSchema;
44
- private execRequest;
45
34
  private initCommon;
46
- mountCommon<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;
35
+ private mountCommon;
47
36
  }
48
37
  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 { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
14
+ import { inject, injectable } from 'inversify';
15
+ import { WordingManager } from '../../i18n/index.js';
16
+ import { UCBuilder, } from '../../uc/index.js';
17
+ import { init, toolConfig } from '../lib/mcp-server/funcs.js';
18
+ import { assertLoggerLevel } from '../lib/mcp-server/stdio/funcs.js';
19
+ import { MCPStdioRequestHandler } from '../lib/mcp-server/stdio/MCPStdioRequestHandler.js';
20
+ let NodeMCPStdioServerManager = class NodeMCPStdioServerManager {
21
+ requestHandler;
22
+ productManifest;
23
+ settingsManager;
24
+ ucBuilder;
25
+ ucManager;
26
+ wordingManager;
27
+ runtime;
28
+ transport;
29
+ constructor(requestHandler, productManifest, settingsManager, ucBuilder, ucManager, wordingManager) {
30
+ this.requestHandler = requestHandler;
31
+ this.productManifest = productManifest;
32
+ this.settingsManager = settingsManager;
33
+ this.ucBuilder = ucBuilder;
34
+ this.ucManager = ucManager;
35
+ this.wordingManager = wordingManager;
36
+ }
37
+ s() {
38
+ return {
39
+ logger_level: this.settingsManager.get()('logger_level'),
40
+ };
41
+ }
42
+ overrideUCManager(ucManager) {
43
+ this.ucManager = ucManager;
44
+ }
45
+ async init() {
46
+ this.initCommon();
47
+ }
48
+ initSync() {
49
+ this.initCommon();
50
+ }
51
+ async mount(appManifest, ucd, contract) {
52
+ this.mountCommon(appManifest, ucd, contract);
53
+ }
54
+ mountSync(appManifest, ucd, contract) {
55
+ this.mountCommon(appManifest, ucd, contract);
56
+ }
57
+ async mountMCP(_ucs, _at) {
58
+ // Nothing to do
59
+ }
60
+ async mountOpenAPISpec(_spec, _at) {
61
+ // Nothing to do
62
+ }
63
+ async mountStaticDir(_dirPath) {
64
+ // Nothing to do
65
+ }
66
+ async start() {
67
+ await this.runtime.connect(this.transport);
68
+ }
69
+ async stop() {
70
+ await this.runtime.close();
71
+ await this.transport.close();
72
+ }
73
+ async warmUp() {
74
+ // Nothing to do
75
+ }
76
+ initCommon() {
77
+ this.runtime = init(this.productManifest);
78
+ assertLoggerLevel(this.s().logger_level);
79
+ this.transport = new StdioServerTransport();
80
+ }
81
+ mountCommon(appManifest, ucd, contract) {
82
+ const uc = this.ucBuilder.exec({
83
+ appManifest,
84
+ auth: null,
85
+ def: ucd,
86
+ });
87
+ const mountingPoint = uc.def.ext?.cmd?.mountAt ?? contract.mountingPoint;
88
+ const wording = this.wordingManager.uc(uc.def);
89
+ const config = toolConfig(uc, 'client', wording);
90
+ this.runtime.registerTool(mountingPoint, config, (toolInput) => this.requestHandler.exec({
91
+ appManifest,
92
+ toolInput,
93
+ ucd,
94
+ ucManager: this.ucManager,
95
+ }));
96
+ }
97
+ };
98
+ NodeMCPStdioServerManager = __decorate([
99
+ injectable(),
100
+ __param(0, inject(MCPStdioRequestHandler)),
101
+ __param(1, inject('ProductManifest')),
102
+ __param(2, inject('SettingsManager')),
103
+ __param(3, inject(UCBuilder)),
104
+ __param(4, inject('UCManager')),
105
+ __param(5, inject(WordingManager)),
106
+ __metadata("design:paramtypes", [MCPStdioRequestHandler, Object, Object, UCBuilder, Object, WordingManager])
107
+ ], NodeMCPStdioServerManager);
108
+ export { NodeMCPStdioServerManager };
@@ -1,6 +1,7 @@
1
1
  import { Container } from 'inversify';
2
2
  import { TApiKey, TPassword, TUsername, } from '../../dt/index.js';
3
3
  import { STD_DEFAULT_JWT_MANAGER_SETTINGS, } from '../../std/index.js';
4
+ import { MCPHTTPExpressFakeRequestHandlerBuilder } from '../../target/lib/mcp-server/http/express/MCPHTTPExpressFakeRequestHandlerBuilder.js';
4
5
  import { TARGET_DEFAULT_SERVER_MANAGER_SETTINGS } from '../../target/lib/server/consts.js';
5
6
  import { NodeExpressServerManager } from '../../target/node-express-server/NodeExpressServerManager.js';
6
7
  import { FAKE_USER_ADMIN, FAKE_USER_REGULAR } from '../../uc/index.js';
@@ -38,6 +39,10 @@ export async function newNodeAppTester(serverPortRangeStart, idx, args) {
38
39
  .bind('ServerManager')
39
40
  .to(NodeExpressServerManager)
40
41
  .inSingletonScope();
42
+ container
43
+ .bind('MCPHTTPRequestHandlerBuilder')
44
+ .to(MCPHTTPExpressFakeRequestHandlerBuilder)
45
+ .inSingletonScope();
41
46
  container
42
47
  .bind('UCDefASTParser')
43
48
  .to(TypeScriptLibUCDefASTParser);
@@ -0,0 +1,7 @@
1
+ import type { UIntQuantity } from '../dt/index.js';
2
+ export interface UCFieldDefCardinality {
3
+ max?: UIntQuantity;
4
+ min?: UIntQuantity;
5
+ }
6
+ export declare function ucfIsMandatory(cardinality?: UCFieldDefCardinality): boolean;
7
+ export declare function ucfRepeatability(cardinality?: UCFieldDefCardinality): [boolean, UIntQuantity];
@@ -0,0 +1,14 @@
1
+ export function ucfIsMandatory(cardinality) {
2
+ const min = cardinality?.min;
3
+ if (min === undefined) {
4
+ return true;
5
+ }
6
+ return min > 0;
7
+ }
8
+ export function ucfRepeatability(cardinality) {
9
+ const max = cardinality?.max;
10
+ if (max === undefined) {
11
+ return [false, 0];
12
+ }
13
+ return [max > 1, max];
14
+ }
@@ -0,0 +1,2 @@
1
+ import type { DataType, TBase } from '../dt/index.js';
2
+ export declare function ucfExamples<T extends DataType>(type: TBase<T>): T[] | undefined;
@@ -0,0 +1,12 @@
1
+ export function ucfExamples(type) {
2
+ const examples = type.getExamples();
3
+ // Leaving the value `undefined` means you want the default value
4
+ if (examples === undefined) {
5
+ return [type.example()];
6
+ }
7
+ // Setting the examples to `[]` means you don't want them
8
+ if (examples.length === 0) {
9
+ return undefined;
10
+ }
11
+ return examples;
12
+ }
@@ -1,8 +1,8 @@
1
- import { type DataType } from '../../dt/index.js';
1
+ import type { DataType } from '../../dt/index.js';
2
2
  import type { StringKeys } from '../../utils/index.js';
3
3
  import type { UCDef } from '../def.js';
4
4
  import type { UCInput } from '../input.js';
5
- import type { UCOPIBase } from '../opi.js';
5
+ import { type UCOPIBase } from '../opi.js';
6
6
  import type { UCOutput, UCOutputPartIdx, UCOutputPartKey } from '../output.js';
7
7
  import type { UCOutputPart, UCOutputPartDef } from '../output-part.js';
8
8
  import type { UC } from '../UC.js';
@@ -1,4 +1,4 @@
1
- import { TUUID } from '../../dt/index.js';
1
+ import { UCOPIBaseDefFields } from '../opi.js';
2
2
  import { UCOutputField } from '../UCOutputField.js';
3
3
  const ERR_NO_FIELD = (key) => `No field ${key} is defined for this use case`;
4
4
  const ERR_NO_IO_OUTPUT = 'No output is defined for this use case';
@@ -65,7 +65,7 @@ export class UCOutputReader {
65
65
  return undefined;
66
66
  }
67
67
  const { fields, layout, order, related } = partDef;
68
- const allFields = { id: { type: new TUUID() }, ...fields };
68
+ const allFields = { ...UCOPIBaseDefFields, ...fields };
69
69
  const allFieldsKeys = order ?? Object.keys(allFields);
70
70
  let items = [];
71
71
  let total = 0;
@@ -1,9 +1,11 @@
1
1
  export * from './auth/consts.js';
2
2
  export * from './auth.js';
3
+ export * from './cardinality.js';
3
4
  export * from './client.js';
4
5
  export * from './data.js';
5
6
  export * from './data-store.js';
6
7
  export * from './def.js';
8
+ export * from './examples.js';
7
9
  export * from './exec.js';
8
10
  export * from './ext.js';
9
11
  export * from './file.js';
@@ -1,9 +1,11 @@
1
1
  export * from './auth/consts.js';
2
2
  export * from './auth.js';
3
+ export * from './cardinality.js';
3
4
  export * from './client.js';
4
5
  export * from './data.js';
5
6
  export * from './data-store.js';
6
7
  export * from './def.js';
8
+ export * from './examples.js';
7
9
  export * from './exec.js';
8
10
  export * from './ext.js';
9
11
  export * from './file.js';
@@ -1,5 +1,6 @@
1
1
  import type { DataType, TBase, UIntQuantity } from '../dt/index.js';
2
2
  import type { EnumOf } from '../utils/index.js';
3
+ import { type UCFieldDefCardinality } from './cardinality.js';
3
4
  import type { UCFieldKey } from './def.js';
4
5
  import type { Value } from './value.js';
5
6
  export declare const UCInputFieldFillingMode: {
@@ -13,23 +14,19 @@ export declare const UCInputFieldFillingMode: {
13
14
  readonly MANUAL: "MANUAL";
14
15
  };
15
16
  export type UCInputFieldFillingMode = EnumOf<typeof UCInputFieldFillingMode>;
16
- export interface UCInputFieldDefCardinality {
17
- max?: UIntQuantity;
18
- min?: UIntQuantity;
19
- }
20
17
  /**
21
18
  * Definition of a use case input field
22
19
  */
23
20
  export interface UCInputFieldDef<T extends DataType> {
24
21
  /**
25
- * A field can have 0, 1 or n values. This field defines the rules.
22
+ * A field can have 0, 1 or n values.
26
23
  *
27
24
  * @defaultValue { max: 1, min: 1 } => the user must absolutely provide one value only
28
25
  *
29
26
  * @example { max: 5, min: 0 } => the user must provide at most 5 values or none
30
27
  * @example { min: 0 } => the user must provide 0 values or none
31
28
  */
32
- cardinality?: UCInputFieldDefCardinality;
29
+ cardinality?: UCFieldDefCardinality;
33
30
  /**
34
31
  * @defaultValue {@link UCInputFieldFillingMode.MANUAL}
35
32
  */
@@ -1,3 +1,5 @@
1
+ import { ucfIsMandatory, ucfRepeatability, } from './cardinality.js';
2
+ import { ucfExamples } from './examples.js';
1
3
  export const UCInputFieldFillingMode = {
2
4
  /**
3
5
  * Set programmatically on behalf of the user (e.g. a foreign key id for a given object)
@@ -9,17 +11,7 @@ export const UCInputFieldFillingMode = {
9
11
  MANUAL: 'MANUAL',
10
12
  };
11
13
  export function ucifExamples(def) {
12
- const { type } = def;
13
- const examples = type.getExamples();
14
- // Leaving the value `undefined` means you want the default value
15
- if (examples === undefined) {
16
- return [type.example()];
17
- }
18
- // Setting the examples to `[]` means you don't want them
19
- if (examples.length === 0) {
20
- return undefined;
21
- }
22
- return examples;
14
+ return ucfExamples(def.type);
23
15
  }
24
16
  export function ucifHint(def) {
25
17
  if (ucifIsSensitive(def)) {
@@ -52,18 +44,10 @@ export function ucifId(key, prefix = 'inputfield', separator = '-') {
52
44
  return `${prefix}${separator}${key}`;
53
45
  }
54
46
  export function ucifIsMandatory(def) {
55
- const min = def.cardinality?.min;
56
- if (min === undefined) {
57
- return true;
58
- }
59
- return min > 0;
47
+ return ucfIsMandatory(def.cardinality);
60
48
  }
61
49
  export function ucifRepeatability(def) {
62
- const max = def.cardinality?.max;
63
- if (max === undefined) {
64
- return [false, 0];
65
- }
66
- return [max > 1, max];
50
+ return ucfRepeatability(def.cardinality);
67
51
  }
68
52
  export function ucifIsSensitive(def) {
69
53
  const { sensitive, type } = def;
@@ -1,4 +1,5 @@
1
- import type { DataType, UUID } from '../dt/index.js';
1
+ import { type DataType, type UUID } from '../dt/index.js';
2
+ import type { UCOutputPartDefFields } from './output-part.js';
2
3
  import type { Value } from './value.js';
3
4
  /**
4
5
  * Base interface all the use case OPI interfaces must extend
@@ -6,6 +7,7 @@ import type { Value } from './value.js';
6
7
  export interface UCOPIBase {
7
8
  id: UUID;
8
9
  }
10
+ export declare const UCOPIBaseDefFields: UCOutputPartDefFields<UCOPIBase>;
9
11
  /**
10
12
  * A value returned as part of an OPI
11
13
  *
@@ -1 +1,4 @@
1
- export {};
1
+ import { TUUID } from '../dt/index.js';
2
+ export const UCOPIBaseDefFields = {
3
+ id: { type: new TUUID() },
4
+ };
@@ -1,10 +1,20 @@
1
- import type { DataType, TBase } from '../dt/index.js';
1
+ import type { DataType, TBase, UIntQuantity } from '../dt/index.js';
2
2
  import type { StringKeys } from '../utils/index.js';
3
+ import { type UCFieldDefCardinality } from './cardinality.js';
3
4
  import type { UCOPIBase } from './opi.js';
4
5
  /**
5
6
  * Definition of a use case output field
6
7
  */
7
8
  export interface UCOutputFieldDef<OPI extends UCOPIBase, T extends DataType> {
9
+ /**
10
+ * A field can have 0, 1 or n values. This field defines the rules.
11
+ *
12
+ * @defaultValue { max: 1, min: 1 } => it has a single value
13
+ *
14
+ * @example { max: 5, min: 0 } => it has at most 5 values or none
15
+ * @example { min: 0 } => it is nullable
16
+ */
17
+ cardinality?: UCFieldDefCardinality;
8
18
  /**
9
19
  * Indicates another field of the output this field can potentially link to (in the `<a></a>` way).
10
20
  */
@@ -16,3 +26,5 @@ export interface UCOutputFieldDef<OPI extends UCOPIBase, T extends DataType> {
16
26
  type: TBase<T>;
17
27
  }
18
28
  export declare function ucofExamples<OPI extends UCOPIBase, T extends DataType>(def: UCOutputFieldDef<OPI, T>): T[] | undefined;
29
+ export declare function ucofIsMandatory<OPI extends UCOPIBase, T extends DataType>(def: UCOutputFieldDef<OPI, T>): boolean;
30
+ export declare function ucofRepeatability<OPI extends UCOPIBase, T extends DataType>(def: UCOutputFieldDef<OPI, T>): [boolean, UIntQuantity];
@@ -1,13 +1,11 @@
1
+ import { ucfIsMandatory, ucfRepeatability, } from './cardinality.js';
2
+ import { ucfExamples } from './examples.js';
1
3
  export function ucofExamples(def) {
2
- const { type } = def;
3
- const examples = type.getExamples();
4
- // Leaving the value `undefined` means you want the default value
5
- if (examples === undefined) {
6
- return [type.example()];
7
- }
8
- // Setting the examples to `[]` means you don't want them
9
- if (examples.length === 0) {
10
- return undefined;
11
- }
12
- return examples;
4
+ return ucfExamples(def.type);
5
+ }
6
+ export function ucofIsMandatory(def) {
7
+ return ucfIsMandatory(def.cardinality);
8
+ }
9
+ export function ucofRepeatability(def) {
10
+ return ucfRepeatability(def.cardinality);
13
11
  }
@@ -15,6 +15,6 @@ export function assertTransformedCorrectly(transformed, fileName) {
15
15
  if (match !== null) {
16
16
  // biome-ignore lint/suspicious/noConsole: we want it
17
17
  console.warn(transformed);
18
- throw new Error(`[WARNING] The following file might not have been transformed correctly : ${fileName} (see transformed above)`);
18
+ throw new Error(`The following file might not have been transformed correctly : ${fileName} (see transformed above)`);
19
19
  }
20
20
  }
@@ -1,6 +1,6 @@
1
1
  export declare const Plugin: {
2
2
  name: string;
3
- transform: (this: import("rollup").TransformPluginContext, code: string, id: string) => {
3
+ transform: (this: import("rolldown").TransformPluginContext, code: string, id: string) => {
4
4
  code: string;
5
5
  };
6
6
  };
@@ -17,6 +17,7 @@ export { CONTAINER_OPTS } from './ioc/container.js';
17
17
  export type { Class } from './ioc/types.js';
18
18
  export { fmt as fmtNumber } from './numbers/fmt.js';
19
19
  export { baseFromSquareUnit, type CoreUnit, isSquareUnit, type SquareableUnit, type SquareUnit, type Unit, } from './numbers/units.js';
20
+ export { defaultStreamOnClose } from './streams/funcs.js';
20
21
  export type { StreamConfig, StreamOnClose, StreamOnData, StreamOnDone, } from './streams/types.js';
21
22
  export { capitalize, isCapitalized } from './strings/capitalize.js';
22
23
  export { humanize } from './strings/humanize.js';
@@ -11,6 +11,7 @@ export { bindFactory } from './ioc/bindFactory.js';
11
11
  export { CONTAINER_OPTS } from './ioc/container.js';
12
12
  export { fmt as fmtNumber } from './numbers/fmt.js';
13
13
  export { baseFromSquareUnit, isSquareUnit, } from './numbers/units.js';
14
+ export { defaultStreamOnClose } from './streams/funcs.js';
14
15
  export { capitalize, isCapitalized } from './strings/capitalize.js';
15
16
  export { humanize } from './strings/humanize.js';
16
17
  export { truncate } from './strings/truncate.js';
@@ -0,0 +1,2 @@
1
+ import type { StreamOnClose } from './types.js';
2
+ export declare function defaultStreamOnClose(streamedOnce: boolean): StreamOnClose;
@@ -0,0 +1,10 @@
1
+ const ERR_MISSING_STREAM_ON_CLOSE = 'execOpts.stream.onClose needs to be set in the ServerMain to avoid memory leaks';
2
+ export function defaultStreamOnClose(streamedOnce) {
3
+ return async () => {
4
+ if (!streamedOnce) {
5
+ // No need to close or register anything if it hasn't streamed anything yet
6
+ return;
7
+ }
8
+ throw new Error(ERR_MISSING_STREAM_ON_CLOSE);
9
+ };
10
+ }