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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AppName } from '../app/index.js';
|
|
2
|
+
import { UC_INPUT_SUFFIX, UC_OPI0_SUFFIX, UC_OPI1_SUFFIX } from '../convention.js';
|
|
2
3
|
import type { IconCode } from '../icon/index.js';
|
|
3
4
|
/**
|
|
4
5
|
* The type of action the use case performs
|
|
@@ -14,6 +15,9 @@ export type FQUCNameSeparator = '_';
|
|
|
14
15
|
* It's made with the {@link AppName} and the {@link UCName} linked by {@link FQUCNameSeparator}.
|
|
15
16
|
*/
|
|
16
17
|
export type FQUCName = `${AppName}${FQUCNameSeparator}${UCName}`;
|
|
18
|
+
export type FQUCInputName = `${FQUCName}${typeof UC_INPUT_SUFFIX}`;
|
|
19
|
+
export type FQUCOPI0Name = `${FQUCName}${typeof UC_OPI0_SUFFIX}`;
|
|
20
|
+
export type FQUCOPI1Name = `${FQUCName}${typeof UC_OPI1_SUFFIX}`;
|
|
17
21
|
export interface UCMetadata {
|
|
18
22
|
action: UCAction;
|
|
19
23
|
beta?: boolean;
|
|
@@ -24,4 +28,7 @@ export interface UCMetadata {
|
|
|
24
28
|
}
|
|
25
29
|
export declare const FQ_UC_NAME_SEPARATOR: FQUCNameSeparator;
|
|
26
30
|
export declare function formatFQUCName(appName: AppName, ucName: UCName): FQUCName;
|
|
31
|
+
export declare function formatFQUCInputName(fqUCName: FQUCName): FQUCInputName;
|
|
32
|
+
export declare function formatFQUCOPI0Name(fqUCName: FQUCName): FQUCOPI0Name;
|
|
33
|
+
export declare function formatFQUCOPI1Name(fqUCName: FQUCName): FQUCOPI1Name;
|
|
27
34
|
export declare function parseFQUCName(value: string): [AppName, UCName];
|
package/dist/esm/uc/metadata.js
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
|
+
import { UC_INPUT_SUFFIX, UC_OPI0_SUFFIX, UC_OPI1_SUFFIX, } from '../convention.js';
|
|
1
2
|
import { isCapitalized } from '../utils/index.js';
|
|
2
3
|
const ERR_INVALID_FQ_UC_NAME = (value) => `Invalid fully qualified use case name : ${value}`;
|
|
3
4
|
export const FQ_UC_NAME_SEPARATOR = '_';
|
|
4
5
|
export function formatFQUCName(appName, ucName) {
|
|
5
6
|
return [appName, ucName].join(FQ_UC_NAME_SEPARATOR);
|
|
6
7
|
}
|
|
8
|
+
export function formatFQUCInputName(fqUCName) {
|
|
9
|
+
return `${fqUCName}${UC_INPUT_SUFFIX}`;
|
|
10
|
+
}
|
|
11
|
+
export function formatFQUCOPI0Name(fqUCName) {
|
|
12
|
+
return `${fqUCName}${UC_OPI0_SUFFIX}`;
|
|
13
|
+
}
|
|
14
|
+
export function formatFQUCOPI1Name(fqUCName) {
|
|
15
|
+
return `${fqUCName}${UC_OPI1_SUFFIX}`;
|
|
16
|
+
}
|
|
7
17
|
export function parseFQUCName(value) {
|
|
8
18
|
const elements = value.split(FQ_UC_NAME_SEPARATOR);
|
|
9
19
|
if (elements.length !== 2) {
|
package/dist/esm/uc/opi.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type
|
|
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
|
*
|
package/dist/esm/uc/opi.js
CHANGED
|
@@ -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
|
*/
|
|
@@ -15,3 +25,6 @@ export interface UCOutputFieldDef<OPI extends UCOPIBase, T extends DataType> {
|
|
|
15
25
|
totalType?: 'sum';
|
|
16
26
|
type: TBase<T>;
|
|
17
27
|
}
|
|
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 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { ucfIsMandatory, ucfRepeatability, } from './cardinality.js';
|
|
2
|
+
import { ucfExamples } from './examples.js';
|
|
3
|
+
export function ucofExamples(def) {
|
|
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);
|
|
11
|
+
}
|
|
@@ -7,7 +7,7 @@ const ACTION_HTTP_METHOD_MAPPING = {
|
|
|
7
7
|
Update: 'PUT',
|
|
8
8
|
View: 'GET',
|
|
9
9
|
};
|
|
10
|
-
const METHODS_WITH_NO_BODY = ['GET', 'HEAD'];
|
|
10
|
+
const METHODS_WITH_NO_BODY = ['DELETE', 'GET', 'HEAD'];
|
|
11
11
|
export function ucHTTPContract(uc, pathPrefix = '/api/v1') {
|
|
12
12
|
const { ext, metadata } = uc.def;
|
|
13
13
|
const { action } = metadata;
|
|
@@ -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(`
|
|
18
|
+
throw new Error(`The following file might not have been transformed correctly : ${fileName} (see transformed above)`);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
+
import type { URL } from '../../dt/index.js';
|
|
2
|
+
export type HTTPCSPType = 'defaultSrc' | 'imgSrc' | 'scriptSrc';
|
|
3
|
+
export type HTTPCSPValue = URL[];
|
|
4
|
+
export type HTTPCookieSameSite = 'lax' | 'none' | 'strict';
|
|
1
5
|
export type HTTPDataEnvelope = 'form-data' | 'json' | 'query-params';
|
|
2
6
|
export type HTTPReqData = Record<string, unknown>;
|
|
7
|
+
export type HTTPHeaderName = 'Accept' | 'Authorization' | 'Content-Type' | 'Cookie' | 'Origin' | 'X-Requested-With' | (string & {});
|
|
@@ -11,12 +11,13 @@ export { fromQueryParams, toQueryParams } from './http/query-params.js';
|
|
|
11
11
|
export { SSEStreamManager } from './http/SSEStreamManager.js';
|
|
12
12
|
export { fmtSingleDataMsg, fmtSSEError, isSSEError, parseDataLine, SSE_HEADERS, } from './http/sse.js';
|
|
13
13
|
export { isClientError, isError, isServerError } from './http/status.js';
|
|
14
|
-
export type { HTTPDataEnvelope, HTTPReqData } from './http/types.js';
|
|
14
|
+
export type { HTTPCookieSameSite, HTTPCSPType, HTTPCSPValue, HTTPDataEnvelope, HTTPHeaderName, HTTPReqData, } from './http/types.js';
|
|
15
15
|
export { bindFactory } from './ioc/bindFactory.js';
|
|
16
16
|
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';
|
package/dist/esm/utils/index.js
CHANGED
|
@@ -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,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
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "libmodulor",
|
|
3
3
|
"description": "A TypeScript library to create platform-agnostic applications",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.30.0",
|
|
5
5
|
"license": "LGPL-3.0",
|
|
6
6
|
"author": "Chafik H'nini <chafik.hnini@gmail.com>",
|
|
7
7
|
"homepage": "https://libmodulor.c100k.eu",
|
|
@@ -53,6 +53,12 @@
|
|
|
53
53
|
"./node-mcp": {
|
|
54
54
|
"import": "./dist/esm/index.node-mcp.js"
|
|
55
55
|
},
|
|
56
|
+
"./node-mcp-express": {
|
|
57
|
+
"import": "./dist/esm/index.node-mcp-express.js"
|
|
58
|
+
},
|
|
59
|
+
"./node-mcp-hono": {
|
|
60
|
+
"import": "./dist/esm/index.node-mcp-hono.js"
|
|
61
|
+
},
|
|
56
62
|
"./node-stricli-cli": {
|
|
57
63
|
"import": "./dist/esm/index.node-stricli-cli.js"
|
|
58
64
|
},
|
|
@@ -97,33 +103,34 @@
|
|
|
97
103
|
"test": "tsc && vitest run"
|
|
98
104
|
},
|
|
99
105
|
"devDependencies": {
|
|
100
|
-
"@biomejs/biome": "^2.4.
|
|
106
|
+
"@biomejs/biome": "^2.4.15",
|
|
101
107
|
"@react-native-community/slider": "^4.5.7",
|
|
102
108
|
"@types/react": "^19.2.14",
|
|
103
109
|
"@types/react-dom": "^19.2.3",
|
|
104
110
|
"babel-plugin-parameter-decorator": "^1.0.16",
|
|
105
111
|
"babel-plugin-transform-typescript-metadata": "^0.3.2",
|
|
106
|
-
"expo": "55.0.
|
|
107
|
-
"expo-document-picker": "
|
|
108
|
-
"expo-image-picker": "^17.0.
|
|
112
|
+
"expo": "^55.0.24",
|
|
113
|
+
"expo-document-picker": "^14.0.8",
|
|
114
|
+
"expo-image-picker": "^17.0.11",
|
|
109
115
|
"react-native-safe-area-context": "^5.7.0",
|
|
110
|
-
"wrangler": "^4.
|
|
116
|
+
"wrangler": "^4.91.0",
|
|
117
|
+
"zod": "^4.4.3"
|
|
111
118
|
},
|
|
112
119
|
"peerDependencies": {
|
|
113
120
|
"@hono/node-server": "^1.19.14",
|
|
114
121
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
115
|
-
"@stricli/core": "^1.2.
|
|
122
|
+
"@stricli/core": "^1.2.7",
|
|
116
123
|
"buffer": "^6.0.3",
|
|
117
124
|
"cookie-parser": "^1.4.7",
|
|
118
125
|
"express": "^5.2.1",
|
|
119
126
|
"express-fileupload": "^1.5.2",
|
|
120
|
-
"fast-check": "^4.
|
|
127
|
+
"fast-check": "^4.8.0",
|
|
121
128
|
"helmet": "^8.1.0",
|
|
122
|
-
"hono": "^4.12.
|
|
129
|
+
"hono": "^4.12.18",
|
|
123
130
|
"inversify": "^7.11.0",
|
|
124
|
-
"jose": "^6.2.
|
|
125
|
-
"knex": "^3.2.
|
|
126
|
-
"next": "^15.5.
|
|
131
|
+
"jose": "^6.2.3",
|
|
132
|
+
"knex": "^3.2.10",
|
|
133
|
+
"next": "^15.5.18",
|
|
127
134
|
"pg": "^8.20.0",
|
|
128
135
|
"react": "19.2.3",
|
|
129
136
|
"react-dom": "19.2.3",
|
|
@@ -131,8 +138,9 @@
|
|
|
131
138
|
"reflect-metadata": "^0.2.2",
|
|
132
139
|
"sqlite3": "^5.1.7",
|
|
133
140
|
"typescript": "^6.0.3",
|
|
134
|
-
"vite": "^
|
|
135
|
-
"vitest": "^
|
|
141
|
+
"vite": "^8.0.13",
|
|
142
|
+
"vitest": "^4.1.6",
|
|
143
|
+
"zod": "^4.4.3"
|
|
136
144
|
},
|
|
137
145
|
"peerDependenciesMeta": {
|
|
138
146
|
"@hono/node-server": {
|
|
@@ -194,6 +202,9 @@
|
|
|
194
202
|
},
|
|
195
203
|
"vitest": {
|
|
196
204
|
"optional": true
|
|
205
|
+
},
|
|
206
|
+
"zod": {
|
|
207
|
+
"optional": true
|
|
197
208
|
}
|
|
198
209
|
},
|
|
199
210
|
"sideEffects": false
|
|
@@ -1,183 +0,0 @@
|
|
|
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 { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
14
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
15
|
-
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
16
|
-
import { inject, injectable } from 'inversify';
|
|
17
|
-
import { NotAvailableError } from '../../error/index.js';
|
|
18
|
-
import { WordingManager } from '../../i18n/index.js';
|
|
19
|
-
import { UCBuilder, ucifIsMandatory, ucMountingPoint, } from '../../uc/index.js';
|
|
20
|
-
import { propertyType, resError, resObj } from './funcs.js';
|
|
21
|
-
/**
|
|
22
|
-
* A simple MCP Server implementation
|
|
23
|
-
*
|
|
24
|
-
* Although it implements {@link ServerManager}, this implementation is not necessarily a "server".
|
|
25
|
-
* Indeed, it uses a local `Transport` so it must be considered the same as a {@link NodeCoreCLIManager}.
|
|
26
|
-
* Therefore, it calls `execClient` and not `execServer`.
|
|
27
|
-
* This way, Claude AI, or any other client is just a wrapper on top of it.
|
|
28
|
-
*
|
|
29
|
-
* @alpha This implementation still has lots of TODOs and has not been tested in real conditions. It needs to be stabilized before usage.
|
|
30
|
-
*/
|
|
31
|
-
let NodeLocalStdioMCPServerManager = class NodeLocalStdioMCPServerManager {
|
|
32
|
-
productManifest;
|
|
33
|
-
settingsManager;
|
|
34
|
-
ucBuilder;
|
|
35
|
-
ucManager;
|
|
36
|
-
wordingManager;
|
|
37
|
-
runtime;
|
|
38
|
-
transport;
|
|
39
|
-
appManifests;
|
|
40
|
-
tools;
|
|
41
|
-
constructor(productManifest, settingsManager, ucBuilder, ucManager, wordingManager) {
|
|
42
|
-
this.productManifest = productManifest;
|
|
43
|
-
this.settingsManager = settingsManager;
|
|
44
|
-
this.ucBuilder = ucBuilder;
|
|
45
|
-
this.ucManager = ucManager;
|
|
46
|
-
this.wordingManager = wordingManager;
|
|
47
|
-
this.appManifests = new Map();
|
|
48
|
-
this.tools = new Map();
|
|
49
|
-
}
|
|
50
|
-
s() {
|
|
51
|
-
return {
|
|
52
|
-
logger_level: this.settingsManager.get()('logger_level'),
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
overrideUCManager(ucManager) {
|
|
56
|
-
this.ucManager = ucManager;
|
|
57
|
-
}
|
|
58
|
-
async init() {
|
|
59
|
-
this.initCommon();
|
|
60
|
-
}
|
|
61
|
-
initSync() {
|
|
62
|
-
this.initCommon();
|
|
63
|
-
}
|
|
64
|
-
async mount(appManifest, ucd, contract) {
|
|
65
|
-
this.mountCommon(appManifest, ucd, contract);
|
|
66
|
-
}
|
|
67
|
-
mountSync(appManifest, ucd, contract) {
|
|
68
|
-
this.mountCommon(appManifest, ucd, contract);
|
|
69
|
-
}
|
|
70
|
-
async mountStaticDir(_dirPath) {
|
|
71
|
-
throw new NotAvailableError('mountStaticDir');
|
|
72
|
-
}
|
|
73
|
-
async start() {
|
|
74
|
-
this.transport = new StdioServerTransport();
|
|
75
|
-
await this.runtime.connect(this.transport);
|
|
76
|
-
}
|
|
77
|
-
async stop() {
|
|
78
|
-
await this.runtime.close();
|
|
79
|
-
await this.transport.close();
|
|
80
|
-
}
|
|
81
|
-
async warmUp() {
|
|
82
|
-
this.runtime.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
83
|
-
return {
|
|
84
|
-
tools: [...this.tools.values().map((v) => v.tool)],
|
|
85
|
-
};
|
|
86
|
-
});
|
|
87
|
-
this.runtime.setRequestHandler(CallToolRequestSchema, async (request) => this.execRequest(request));
|
|
88
|
-
}
|
|
89
|
-
buildInputSchema(uc) {
|
|
90
|
-
const res = {
|
|
91
|
-
type: 'object',
|
|
92
|
-
};
|
|
93
|
-
if (uc.inputFields.length > 0) {
|
|
94
|
-
const properties = {};
|
|
95
|
-
for (const f of uc.inputFields) {
|
|
96
|
-
const { def, key } = f;
|
|
97
|
-
const { desc } = this.wordingManager.ucif(f);
|
|
98
|
-
properties[key] = {
|
|
99
|
-
...propertyType(def),
|
|
100
|
-
description: desc,
|
|
101
|
-
required: ucifIsMandatory(def),
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
res.properties = properties;
|
|
105
|
-
}
|
|
106
|
-
return res;
|
|
107
|
-
}
|
|
108
|
-
async execRequest(request) {
|
|
109
|
-
const { name, arguments: args } = request.params;
|
|
110
|
-
// TODO : Check authentication in some way (see if MCP handles it)
|
|
111
|
-
const auth = null;
|
|
112
|
-
try {
|
|
113
|
-
const route = this.tools.get(name);
|
|
114
|
-
if (!route) {
|
|
115
|
-
throw new Error(`Unrecognized use case : ${name}`);
|
|
116
|
-
}
|
|
117
|
-
const { appName, ucd } = route;
|
|
118
|
-
const appManifest = this.appManifests.get(appName);
|
|
119
|
-
if (!appManifest) {
|
|
120
|
-
throw new Error(`Unrecognized app : ${appName}`);
|
|
121
|
-
}
|
|
122
|
-
const uc = this.ucBuilder.exec({
|
|
123
|
-
appManifest,
|
|
124
|
-
auth,
|
|
125
|
-
def: ucd,
|
|
126
|
-
});
|
|
127
|
-
if (args) {
|
|
128
|
-
// biome-ignore lint/suspicious/noExplicitAny: can be anything
|
|
129
|
-
uc.fill(args);
|
|
130
|
-
}
|
|
131
|
-
const confirmed = await this.ucManager.confirmClient(uc);
|
|
132
|
-
if (!confirmed) {
|
|
133
|
-
throw new Error('Ask for the user to confirm');
|
|
134
|
-
}
|
|
135
|
-
const ucor = await this.ucManager.execClient(uc);
|
|
136
|
-
return resObj(ucor);
|
|
137
|
-
}
|
|
138
|
-
catch (err) {
|
|
139
|
-
return resError(err);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
initCommon() {
|
|
143
|
-
this.runtime = new Server({
|
|
144
|
-
name: this.productManifest.name,
|
|
145
|
-
version: '0.1.0',
|
|
146
|
-
}, {
|
|
147
|
-
capabilities: {
|
|
148
|
-
tools: {},
|
|
149
|
-
},
|
|
150
|
-
});
|
|
151
|
-
if (this.s().logger_level !== 'error') {
|
|
152
|
-
const message = '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)';
|
|
153
|
-
// Depending on the `Logger` implementation, this.logger.error() might not write to stderr (e.g. can write to a file).
|
|
154
|
-
// That's why we explicitly write to stdout by calling console.error().
|
|
155
|
-
// biome-ignore lint/suspicious/noConsole: we want it
|
|
156
|
-
console.error(new Error(message));
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
mountCommon(appManifest, ucd, _contract) {
|
|
160
|
-
const uc = this.ucBuilder.exec({
|
|
161
|
-
appManifest,
|
|
162
|
-
auth: null,
|
|
163
|
-
def: ucd,
|
|
164
|
-
});
|
|
165
|
-
if (!this.appManifests.has(appManifest.name)) {
|
|
166
|
-
this.appManifests.set(appManifest.name, appManifest);
|
|
167
|
-
}
|
|
168
|
-
const inputSchema = this.buildInputSchema(uc);
|
|
169
|
-
const mountingPoint = uc.def.ext?.cmd?.mountAt ?? ucMountingPoint(uc);
|
|
170
|
-
const tool = { inputSchema, name: mountingPoint };
|
|
171
|
-
this.tools.set(mountingPoint, { appName: appManifest.name, tool, ucd });
|
|
172
|
-
}
|
|
173
|
-
};
|
|
174
|
-
NodeLocalStdioMCPServerManager = __decorate([
|
|
175
|
-
injectable(),
|
|
176
|
-
__param(0, inject('ProductManifest')),
|
|
177
|
-
__param(1, inject('SettingsManager')),
|
|
178
|
-
__param(2, inject(UCBuilder)),
|
|
179
|
-
__param(3, inject('UCManager')),
|
|
180
|
-
__param(4, inject(WordingManager)),
|
|
181
|
-
__metadata("design:paramtypes", [Object, Object, UCBuilder, Object, WordingManager])
|
|
182
|
-
], NodeLocalStdioMCPServerManager);
|
|
183
|
-
export { NodeLocalStdioMCPServerManager };
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import { type DataType } from '../../dt/index.js';
|
|
3
|
-
import { type UCInputFieldDef } from '../../uc/index.js';
|
|
4
|
-
import type { PropertyType } from './types.js';
|
|
5
|
-
export declare function propertyType<T extends DataType>(def: UCInputFieldDef<T>): PropertyType;
|
|
6
|
-
export declare function resError(err: Error): CallToolResult;
|
|
7
|
-
export declare function resObj<T>(obj: T): CallToolResult;
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { TBoolean, TEmbeddedObject, TInt, TNumber, } from '../../dt/index.js';
|
|
2
|
-
import { ucifRepeatability } from '../../uc/index.js';
|
|
3
|
-
export function propertyType(def) {
|
|
4
|
-
const { cardinality, type } = def;
|
|
5
|
-
let primitive = 'string';
|
|
6
|
-
if (type instanceof TBoolean) {
|
|
7
|
-
primitive = 'boolean';
|
|
8
|
-
}
|
|
9
|
-
else if (type instanceof TInt) {
|
|
10
|
-
primitive = 'integer';
|
|
11
|
-
}
|
|
12
|
-
else if (type instanceof TNumber) {
|
|
13
|
-
primitive = 'number';
|
|
14
|
-
}
|
|
15
|
-
else if (type instanceof TEmbeddedObject) {
|
|
16
|
-
primitive = 'object';
|
|
17
|
-
}
|
|
18
|
-
const [isRepeatable] = ucifRepeatability(def);
|
|
19
|
-
const maxItems = cardinality?.max;
|
|
20
|
-
const minItems = cardinality?.min;
|
|
21
|
-
return isRepeatable
|
|
22
|
-
? { items: { type: primitive }, maxItems, minItems, type: 'array' }
|
|
23
|
-
: { type: primitive };
|
|
24
|
-
}
|
|
25
|
-
export function resError(err) {
|
|
26
|
-
return {
|
|
27
|
-
content: [
|
|
28
|
-
{
|
|
29
|
-
text: err.message,
|
|
30
|
-
type: 'text',
|
|
31
|
-
},
|
|
32
|
-
],
|
|
33
|
-
isError: true,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
export function resObj(obj) {
|
|
37
|
-
return {
|
|
38
|
-
content: [
|
|
39
|
-
{
|
|
40
|
-
text: JSON.stringify(obj),
|
|
41
|
-
type: 'text',
|
|
42
|
-
},
|
|
43
|
-
],
|
|
44
|
-
};
|
|
45
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { ListToolsResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import type { UIntQuantity } from '../../dt/index.js';
|
|
3
|
-
export type PropertyPrimitiveType = 'boolean' | 'integer' | 'number' | 'object' | 'string';
|
|
4
|
-
export type PropertyArrayType<T extends PropertyPrimitiveType> = {
|
|
5
|
-
items: {
|
|
6
|
-
type: T;
|
|
7
|
-
};
|
|
8
|
-
maxItems?: UIntQuantity | undefined;
|
|
9
|
-
minItems?: UIntQuantity | undefined;
|
|
10
|
-
type: 'array';
|
|
11
|
-
};
|
|
12
|
-
export type PropertyType<T extends PropertyPrimitiveType = PropertyPrimitiveType> = {
|
|
13
|
-
type: T;
|
|
14
|
-
} | PropertyArrayType<T>;
|
|
15
|
-
export type Property<T extends PropertyPrimitiveType = PropertyPrimitiveType> = PropertyType<T> & {
|
|
16
|
-
description: string | null;
|
|
17
|
-
required: boolean;
|
|
18
|
-
};
|
|
19
|
-
export type Tool = ListToolsResult['tools'][0];
|
|
File without changes
|