@modularizer/plat-client 0.4.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/dist/args/coerce.d.ts +54 -0
- package/dist/args/coerce.d.ts.map +1 -0
- package/dist/args/coerce.js +236 -0
- package/dist/args/coerce.js.map +1 -0
- package/dist/args/index.d.ts +2 -0
- package/dist/args/index.d.ts.map +1 -0
- package/dist/args/index.js +2 -0
- package/dist/args/index.js.map +1 -0
- package/dist/args/scalars.d.ts +87 -0
- package/dist/args/scalars.d.ts.map +1 -0
- package/dist/args/scalars.js +22 -0
- package/dist/args/scalars.js.map +1 -0
- package/dist/args/validate.d.ts +23 -0
- package/dist/args/validate.d.ts.map +1 -0
- package/dist/args/validate.js +185 -0
- package/dist/args/validate.js.map +1 -0
- package/dist/args/z2.d.ts +27 -0
- package/dist/args/z2.d.ts.map +1 -0
- package/dist/args/z2.js +24 -0
- package/dist/args/z2.js.map +1 -0
- package/dist/client/css-transport-plugin.d.ts +19 -0
- package/dist/client/css-transport-plugin.d.ts.map +1 -0
- package/dist/client/css-transport-plugin.js +78 -0
- package/dist/client/css-transport-plugin.js.map +1 -0
- package/dist/client/file-transport-plugin.d.ts +28 -0
- package/dist/client/file-transport-plugin.d.ts.map +1 -0
- package/dist/client/file-transport-plugin.js +80 -0
- package/dist/client/file-transport-plugin.js.map +1 -0
- package/dist/client/http-transport-plugin.d.ts +27 -0
- package/dist/client/http-transport-plugin.d.ts.map +1 -0
- package/dist/client/http-transport-plugin.js +48 -0
- package/dist/client/http-transport-plugin.js.map +1 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/openapi-client.d.ts +334 -0
- package/dist/client/openapi-client.d.ts.map +1 -0
- package/dist/client/openapi-client.js +910 -0
- package/dist/client/openapi-client.js.map +1 -0
- package/dist/client/proxy.d.ts +5 -0
- package/dist/client/proxy.d.ts.map +1 -0
- package/dist/client/proxy.js +353 -0
- package/dist/client/proxy.js.map +1 -0
- package/dist/client/request-builder.d.ts +5 -0
- package/dist/client/request-builder.d.ts.map +1 -0
- package/dist/client/request-builder.js +88 -0
- package/dist/client/request-builder.js.map +1 -0
- package/dist/client/rpc-transport-plugin.d.ts +17 -0
- package/dist/client/rpc-transport-plugin.d.ts.map +1 -0
- package/dist/client/rpc-transport-plugin.js +69 -0
- package/dist/client/rpc-transport-plugin.js.map +1 -0
- package/dist/client/tools.d.ts +69 -0
- package/dist/client/tools.d.ts.map +1 -0
- package/dist/client/tools.js +122 -0
- package/dist/client/tools.js.map +1 -0
- package/dist/client/transport-plugin.d.ts +62 -0
- package/dist/client/transport-plugin.d.ts.map +1 -0
- package/dist/client/transport-plugin.js +40 -0
- package/dist/client/transport-plugin.js.map +1 -0
- package/dist/client-entry.d.ts +25 -0
- package/dist/client-entry.d.ts.map +1 -0
- package/dist/client-entry.js +25 -0
- package/dist/client-entry.js.map +1 -0
- package/dist/client-server-entry.d.ts +13 -0
- package/dist/client-server-entry.d.ts.map +1 -0
- package/dist/client-server-entry.js +13 -0
- package/dist/client-server-entry.js.map +1 -0
- package/dist/client-side-python/runtime.d.ts +102 -0
- package/dist/client-side-python/runtime.d.ts.map +1 -0
- package/dist/client-side-python/runtime.js +595 -0
- package/dist/client-side-python/runtime.js.map +1 -0
- package/dist/client-side-server/bootstrap.d.ts +3 -0
- package/dist/client-side-server/bootstrap.d.ts.map +1 -0
- package/dist/client-side-server/bootstrap.js +20 -0
- package/dist/client-side-server/bootstrap.js.map +1 -0
- package/dist/client-side-server/channel.d.ts +17 -0
- package/dist/client-side-server/channel.d.ts.map +1 -0
- package/dist/client-side-server/channel.js +38 -0
- package/dist/client-side-server/channel.js.map +1 -0
- package/dist/client-side-server/identity.d.ts +116 -0
- package/dist/client-side-server/identity.d.ts.map +1 -0
- package/dist/client-side-server/identity.js +358 -0
- package/dist/client-side-server/identity.js.map +1 -0
- package/dist/client-side-server/mqtt-webrtc.d.ts +77 -0
- package/dist/client-side-server/mqtt-webrtc.d.ts.map +1 -0
- package/dist/client-side-server/mqtt-webrtc.js +575 -0
- package/dist/client-side-server/mqtt-webrtc.js.map +1 -0
- package/dist/client-side-server/protocol.d.ts +49 -0
- package/dist/client-side-server/protocol.d.ts.map +1 -0
- package/dist/client-side-server/protocol.js +13 -0
- package/dist/client-side-server/protocol.js.map +1 -0
- package/dist/client-side-server/runtime.d.ts +57 -0
- package/dist/client-side-server/runtime.d.ts.map +1 -0
- package/dist/client-side-server/runtime.js +188 -0
- package/dist/client-side-server/runtime.js.map +1 -0
- package/dist/client-side-server/server.d.ts +75 -0
- package/dist/client-side-server/server.d.ts.map +1 -0
- package/dist/client-side-server/server.js +380 -0
- package/dist/client-side-server/server.js.map +1 -0
- package/dist/client-side-server/signaling.d.ts +10 -0
- package/dist/client-side-server/signaling.d.ts.map +1 -0
- package/dist/client-side-server/signaling.js +19 -0
- package/dist/client-side-server/signaling.js.map +1 -0
- package/dist/client-side-server/source-analysis.d.ts +29 -0
- package/dist/client-side-server/source-analysis.d.ts.map +1 -0
- package/dist/client-side-server/source-analysis.js +395 -0
- package/dist/client-side-server/source-analysis.js.map +1 -0
- package/dist/generated/python-browser-sources.d.ts +2 -0
- package/dist/generated/python-browser-sources.d.ts.map +1 -0
- package/dist/generated/python-browser-sources.js +13 -0
- package/dist/generated/python-browser-sources.js.map +1 -0
- package/dist/logging.d.ts +9 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +64 -0
- package/dist/logging.js.map +1 -0
- package/dist/python-browser-entry.d.ts +2 -0
- package/dist/python-browser-entry.d.ts.map +1 -0
- package/dist/python-browser-entry.js +2 -0
- package/dist/python-browser-entry.js.map +1 -0
- package/dist/rpc.d.ts +39 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -0
- package/dist/server/authority-server.d.ts +27 -0
- package/dist/server/authority-server.d.ts.map +1 -0
- package/dist/server/authority-server.js +97 -0
- package/dist/server/authority-server.js.map +1 -0
- package/dist/server/cache/index.d.ts +2 -0
- package/dist/server/cache/index.d.ts.map +1 -0
- package/dist/server/cache/index.js +2 -0
- package/dist/server/cache/index.js.map +1 -0
- package/dist/server/cache/utils.d.ts +30 -0
- package/dist/server/cache/utils.d.ts.map +1 -0
- package/dist/server/cache/utils.js +116 -0
- package/dist/server/cache/utils.js.map +1 -0
- package/dist/server/core.d.ts +43 -0
- package/dist/server/core.d.ts.map +1 -0
- package/dist/server/core.js +215 -0
- package/dist/server/core.js.map +1 -0
- package/dist/server/operation-registry.d.ts +9 -0
- package/dist/server/operation-registry.d.ts.map +1 -0
- package/dist/server/operation-registry.js +16 -0
- package/dist/server/operation-registry.js.map +1 -0
- package/dist/server/param-aliases.d.ts +40 -0
- package/dist/server/param-aliases.d.ts.map +1 -0
- package/dist/server/param-aliases.js +112 -0
- package/dist/server/param-aliases.js.map +1 -0
- package/dist/server/rate-limit/index.d.ts +2 -0
- package/dist/server/rate-limit/index.d.ts.map +1 -0
- package/dist/server/rate-limit/index.js +2 -0
- package/dist/server/rate-limit/index.js.map +1 -0
- package/dist/server/rate-limit/utils.d.ts +27 -0
- package/dist/server/rate-limit/utils.d.ts.map +1 -0
- package/dist/server/rate-limit/utils.js +126 -0
- package/dist/server/rate-limit/utils.js.map +1 -0
- package/dist/server/routing.d.ts +39 -0
- package/dist/server/routing.d.ts.map +1 -0
- package/dist/server/routing.js +70 -0
- package/dist/server/routing.js.map +1 -0
- package/dist/server/token-limit/index.d.ts +2 -0
- package/dist/server/token-limit/index.d.ts.map +1 -0
- package/dist/server/token-limit/index.js +2 -0
- package/dist/server/token-limit/index.js.map +1 -0
- package/dist/server/token-limit/utils.d.ts +44 -0
- package/dist/server/token-limit/utils.d.ts.map +1 -0
- package/dist/server/token-limit/utils.js +260 -0
- package/dist/server/token-limit/utils.js.map +1 -0
- package/dist/server/tools.d.ts +33 -0
- package/dist/server/tools.d.ts.map +1 -0
- package/dist/server/tools.js +160 -0
- package/dist/server/tools.js.map +1 -0
- package/dist/server/transports.d.ts +25 -0
- package/dist/server/transports.d.ts.map +1 -0
- package/dist/server/transports.js +2 -0
- package/dist/server/transports.js.map +1 -0
- package/dist/shared/tools.d.ts +24 -0
- package/dist/shared/tools.d.ts.map +1 -0
- package/dist/shared/tools.js +86 -0
- package/dist/shared/tools.js.map +1 -0
- package/dist/spec/decorators.d.ts +41 -0
- package/dist/spec/decorators.d.ts.map +1 -0
- package/dist/spec/decorators.js +93 -0
- package/dist/spec/decorators.js.map +1 -0
- package/dist/spec/index.d.ts +3 -0
- package/dist/spec/index.d.ts.map +1 -0
- package/dist/spec/index.js +3 -0
- package/dist/spec/index.js.map +1 -0
- package/dist/spec/metadata.d.ts +5 -0
- package/dist/spec/metadata.d.ts.map +1 -0
- package/dist/spec/metadata.js +37 -0
- package/dist/spec/metadata.js.map +1 -0
- package/dist/types/client-route.d.ts +7 -0
- package/dist/types/client-route.d.ts.map +1 -0
- package/dist/types/client-route.js +2 -0
- package/dist/types/client-route.js.map +1 -0
- package/dist/types/client.d.ts +81 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/client.js +14 -0
- package/dist/types/client.js.map +1 -0
- package/dist/types/endpoints.d.ts +76 -0
- package/dist/types/endpoints.d.ts.map +1 -0
- package/dist/types/endpoints.js +2 -0
- package/dist/types/endpoints.js.map +1 -0
- package/dist/types/errors.d.ts +86 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +153 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/http.d.ts +80 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/http.js +61 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/openapi.d.ts +220 -0
- package/dist/types/openapi.d.ts.map +1 -0
- package/dist/types/openapi.js +11 -0
- package/dist/types/openapi.js.map +1 -0
- package/dist/types/opts.d.ts +46 -0
- package/dist/types/opts.d.ts.map +1 -0
- package/dist/types/opts.js +2 -0
- package/dist/types/opts.js.map +1 -0
- package/dist/types/plugins.d.ts +93 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/types/plugins.js +5 -0
- package/dist/types/plugins.js.map +1 -0
- package/dist/types/tools.d.ts +52 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +2 -0
- package/dist/types/tools.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Routing Utilities for plat
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to generate route variants:
|
|
5
|
+
* - Case variants: camelCase -> snake_case, kebab-case
|
|
6
|
+
* - HTTP method flexibility: GET ↔ POST
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Convert camelCase to snake_case
|
|
10
|
+
* e.g., getOrder -> get_order
|
|
11
|
+
*/
|
|
12
|
+
export declare function toSnakeCase(str: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Convert camelCase to kebab-case
|
|
15
|
+
* e.g., getOrder -> get-order
|
|
16
|
+
*/
|
|
17
|
+
export declare function toKebabCase(str: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Generate all case variants of a method name
|
|
20
|
+
* e.g., getOrder -> [getOrder, get_order, get-order]
|
|
21
|
+
*/
|
|
22
|
+
export declare function getCaseVariants(methodName: string): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Get the flexible HTTP methods for a route
|
|
25
|
+
* GET can also accept POST, POST can also accept GET
|
|
26
|
+
* This allows more resilient APIs
|
|
27
|
+
*/
|
|
28
|
+
export declare function getFlexibleMethods(httpMethod: string): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Create route registration entries for all variants
|
|
31
|
+
* Takes a method and generates:
|
|
32
|
+
* - All case variants (camelCase, snake_case, kebab-case)
|
|
33
|
+
* - All flexible HTTP methods
|
|
34
|
+
*/
|
|
35
|
+
export declare function generateRouteVariants(methodName: string, httpMethod: string): Array<{
|
|
36
|
+
path: string;
|
|
37
|
+
method: string;
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../../typescript/src/server/routing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAe/D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAezC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Routing Utilities for plat
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to generate route variants:
|
|
5
|
+
* - Case variants: camelCase -> snake_case, kebab-case
|
|
6
|
+
* - HTTP method flexibility: GET ↔ POST
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Convert camelCase to snake_case
|
|
10
|
+
* e.g., getOrder -> get_order
|
|
11
|
+
*/
|
|
12
|
+
export function toSnakeCase(str) {
|
|
13
|
+
return str.replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Convert camelCase to kebab-case
|
|
17
|
+
* e.g., getOrder -> get-order
|
|
18
|
+
*/
|
|
19
|
+
export function toKebabCase(str) {
|
|
20
|
+
return str.replace(/([A-Z])/g, '-$1').toLowerCase();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generate all case variants of a method name
|
|
24
|
+
* e.g., getOrder -> [getOrder, get_order, get-order]
|
|
25
|
+
*/
|
|
26
|
+
export function getCaseVariants(methodName) {
|
|
27
|
+
return [methodName, toSnakeCase(methodName), toKebabCase(methodName)];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the flexible HTTP methods for a route
|
|
31
|
+
* GET can also accept POST, POST can also accept GET
|
|
32
|
+
* This allows more resilient APIs
|
|
33
|
+
*/
|
|
34
|
+
export function getFlexibleMethods(httpMethod) {
|
|
35
|
+
const method = httpMethod.toUpperCase();
|
|
36
|
+
if (method === 'GET') {
|
|
37
|
+
return ['GET', 'POST'];
|
|
38
|
+
}
|
|
39
|
+
if (method === 'POST') {
|
|
40
|
+
return ['POST', 'GET'];
|
|
41
|
+
}
|
|
42
|
+
if (method === 'PUT') {
|
|
43
|
+
return ['PUT', 'PATCH', 'POST'];
|
|
44
|
+
}
|
|
45
|
+
if (method === 'DELETE') {
|
|
46
|
+
return ['DELETE', 'POST'];
|
|
47
|
+
}
|
|
48
|
+
return [method];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create route registration entries for all variants
|
|
52
|
+
* Takes a method and generates:
|
|
53
|
+
* - All case variants (camelCase, snake_case, kebab-case)
|
|
54
|
+
* - All flexible HTTP methods
|
|
55
|
+
*/
|
|
56
|
+
export function generateRouteVariants(methodName, httpMethod) {
|
|
57
|
+
const routes = [];
|
|
58
|
+
const caseVariants = getCaseVariants(methodName);
|
|
59
|
+
const methodVariants = getFlexibleMethods(httpMethod);
|
|
60
|
+
for (const caseVariant of caseVariants) {
|
|
61
|
+
for (const method of methodVariants) {
|
|
62
|
+
routes.push({
|
|
63
|
+
path: '/' + caseVariant,
|
|
64
|
+
method: method,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return routes;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../typescript/src/server/routing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAAA;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;IACvC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC3B,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,CAAA;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAkB,EAClB,UAAkB;IAElB,MAAM,MAAM,GAA4C,EAAE,CAAA;IAC1D,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;IAChD,MAAM,cAAc,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;IAErD,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,GAAG,GAAG,WAAW;gBACvB,MAAM,EAAE,MAAM;aACf,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../typescript/src/server/token-limit/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../typescript/src/server/token-limit/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { TokenLimitController, TokenLimitEntry, TokenLimitMeta, TokenLimitTiming, TokenLimitConfigs, ResolvedTokenLimitEntry } from '../../types/plugins';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve token limit key with substitutions:
|
|
4
|
+
* - :route → methodName
|
|
5
|
+
* - :parent → basePath
|
|
6
|
+
* - :user:{field} → user[field] from auth context (e.g., :user:plan, :user:id)
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveTokenLimitKey(raw: string, methodName: string, basePath: string, user?: any): string;
|
|
9
|
+
/**
|
|
10
|
+
* Resolve call cost to numeric value
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveCallCost(spec: TokenLimitEntry['callCost'], params: any, ctx: any): Promise<number>;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve response cost to numeric value
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveResponseCost(spec: TokenLimitEntry['responseCost'], result: any, timing: TokenLimitTiming, params: any): Promise<number>;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve failure cost to numeric value
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveFailureCost(spec: TokenLimitEntry['failureCost'], error: Error, timing: TokenLimitTiming, params: any): Promise<number>;
|
|
21
|
+
/**
|
|
22
|
+
* Create an in-memory token limit controller with token-bucket algorithm
|
|
23
|
+
* Lazy fills bucket on each access
|
|
24
|
+
*/
|
|
25
|
+
export declare function createInMemoryTokenLimit(): TokenLimitController;
|
|
26
|
+
/**
|
|
27
|
+
* Pre-handler: resolve callCost → controller.deduct() → return ResolvedTokenLimitEntry[] + remainingBalances
|
|
28
|
+
*/
|
|
29
|
+
export declare function applyTokenLimitCheck(meta: TokenLimitMeta | undefined, controller: TokenLimitController, configs: TokenLimitConfigs, methodName: string, basePath: string, params: any, ctx: any, user?: any): Promise<{
|
|
30
|
+
entries: ResolvedTokenLimitEntry[];
|
|
31
|
+
remainingBalances: number[];
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Post-handler (success): resolve responseCost → deduct;
|
|
35
|
+
* if refundedStatusCode → refund callCost instead
|
|
36
|
+
* Returns responseCosts[]
|
|
37
|
+
*/
|
|
38
|
+
export declare function applyTokenLimitResponse(entries: ResolvedTokenLimitEntry[], controller: TokenLimitController, result: any, timing: TokenLimitTiming, params: any, statusCode: number): Promise<number[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Catch block (error path): resolve failureCost → deduct (or negative → refund)
|
|
41
|
+
* If failureCost is 0 and statusCode in refundedStatusCodes → refund callCost
|
|
42
|
+
*/
|
|
43
|
+
export declare function applyTokenLimitFailure(entries: ResolvedTokenLimitEntry[], controller: TokenLimitController, error: Error, timing: TokenLimitTiming, params: any, statusCode: number): Promise<number[]>;
|
|
44
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../typescript/src/server/token-limit/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,gBAAgB,EAEhB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,qBAAqB,CAAA;AAM5B;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,GAAG,GACT,MAAM,CAoBR;AAMD;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,EACjC,MAAM,EAAE,GAAG,EACX,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,MAAM,CAAC,CAsBjB;AA4BD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,eAAe,CAAC,cAAc,CAAC,EACrC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,eAAe,CAAC,aAAa,CAAC,EACpC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,MAAM,CAAC,CAcjB;AAWD;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,oBAAoB,CAoE/D;AAMD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,cAAc,GAAG,SAAS,EAChC,UAAU,EAAE,oBAAoB,EAChC,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,GAAG,EACX,GAAG,EAAE,GAAG,EACR,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC;IAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAmC9E;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,uBAAuB,EAAE,EAClC,UAAU,EAAE,oBAAoB,EAChC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CA0BnB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,uBAAuB,EAAE,EAClC,UAAU,EAAE,oBAAoB,EAChC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAgCnB"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { HttpError } from "../../types/index.js";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// KEY SUBSTITUTION
|
|
4
|
+
// ============================================================================
|
|
5
|
+
/**
|
|
6
|
+
* Resolve token limit key with substitutions:
|
|
7
|
+
* - :route → methodName
|
|
8
|
+
* - :parent → basePath
|
|
9
|
+
* - :user:{field} → user[field] from auth context (e.g., :user:plan, :user:id)
|
|
10
|
+
*/
|
|
11
|
+
export function resolveTokenLimitKey(raw, methodName, basePath, user) {
|
|
12
|
+
let key = raw
|
|
13
|
+
.replace(':route', methodName)
|
|
14
|
+
.replace(':parent', basePath);
|
|
15
|
+
// Replace :user:{field} with user property
|
|
16
|
+
if (user) {
|
|
17
|
+
const userMatches = key.match(/:user:(\w+)/g);
|
|
18
|
+
if (userMatches) {
|
|
19
|
+
for (const match of userMatches) {
|
|
20
|
+
const field = match.slice(6); // Remove ':user:'
|
|
21
|
+
const value = user[field];
|
|
22
|
+
if (value !== undefined) {
|
|
23
|
+
key = key.replace(match, String(value));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return key;
|
|
29
|
+
}
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// COST RESOLVERS
|
|
32
|
+
// ============================================================================
|
|
33
|
+
/**
|
|
34
|
+
* Resolve call cost to numeric value
|
|
35
|
+
*/
|
|
36
|
+
export async function resolveCallCost(spec, params, ctx) {
|
|
37
|
+
if (typeof spec === 'number') {
|
|
38
|
+
return spec;
|
|
39
|
+
}
|
|
40
|
+
if (typeof spec === 'function') {
|
|
41
|
+
return await spec(params, ctx);
|
|
42
|
+
}
|
|
43
|
+
if (typeof spec === 'object') {
|
|
44
|
+
const formula = spec;
|
|
45
|
+
const initial = formula.initial ?? 0;
|
|
46
|
+
const perLimit = formula.perLimit ?? 0;
|
|
47
|
+
const perChar = formula.perChar ?? 0;
|
|
48
|
+
const limit = params.limit ?? 0;
|
|
49
|
+
const paramChars = JSON.stringify(params).length;
|
|
50
|
+
return initial + perLimit * limit + perChar * paramChars;
|
|
51
|
+
}
|
|
52
|
+
return 1; // default
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Count items in result (for response cost formula)
|
|
56
|
+
*/
|
|
57
|
+
function countItems(value) {
|
|
58
|
+
if (Array.isArray(value))
|
|
59
|
+
return value.length;
|
|
60
|
+
if (typeof value === 'object' && value !== null)
|
|
61
|
+
return 1;
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Count total characters in result (for response cost formula)
|
|
66
|
+
*/
|
|
67
|
+
function countChars(value) {
|
|
68
|
+
return JSON.stringify(value).length;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Count keys in result object (for response cost formula)
|
|
72
|
+
*/
|
|
73
|
+
function countKeys(value) {
|
|
74
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
75
|
+
return Object.keys(value).length;
|
|
76
|
+
}
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Resolve response cost to numeric value
|
|
81
|
+
*/
|
|
82
|
+
export async function resolveResponseCost(spec, result, timing, params) {
|
|
83
|
+
if (spec === undefined || spec === 0) {
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
if (typeof spec === 'number') {
|
|
87
|
+
return spec;
|
|
88
|
+
}
|
|
89
|
+
if (typeof spec === 'function') {
|
|
90
|
+
return await spec(result, timing, params);
|
|
91
|
+
}
|
|
92
|
+
if (typeof spec === 'object') {
|
|
93
|
+
const formula = spec;
|
|
94
|
+
const perMs = formula.perMs ?? 0;
|
|
95
|
+
const perItem = formula.perItem ?? 0;
|
|
96
|
+
const perChar = formula.perChar ?? 0;
|
|
97
|
+
const perKey = formula.perKey ?? 0;
|
|
98
|
+
const items = countItems(result);
|
|
99
|
+
const chars = countChars(result);
|
|
100
|
+
const keys = countKeys(result);
|
|
101
|
+
return perMs * timing.durationMs + perItem * items + perChar * chars + perKey * keys;
|
|
102
|
+
}
|
|
103
|
+
return 0;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resolve failure cost to numeric value
|
|
107
|
+
*/
|
|
108
|
+
export async function resolveFailureCost(spec, error, timing, params) {
|
|
109
|
+
if (spec === undefined || spec === 0) {
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
if (typeof spec === 'number') {
|
|
113
|
+
return spec;
|
|
114
|
+
}
|
|
115
|
+
if (typeof spec === 'function') {
|
|
116
|
+
return await spec(error, timing, params);
|
|
117
|
+
}
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create an in-memory token limit controller with token-bucket algorithm
|
|
122
|
+
* Lazy fills bucket on each access
|
|
123
|
+
*/
|
|
124
|
+
export function createInMemoryTokenLimit() {
|
|
125
|
+
const buckets = new Map();
|
|
126
|
+
function refillBucket(key, config) {
|
|
127
|
+
const now = Date.now();
|
|
128
|
+
let bucket = buckets.get(key);
|
|
129
|
+
if (!bucket) {
|
|
130
|
+
bucket = { balance: config.maxBalance, lastRefillMs: now };
|
|
131
|
+
buckets.set(key, bucket);
|
|
132
|
+
return bucket.balance;
|
|
133
|
+
}
|
|
134
|
+
const elapsedMs = now - bucket.lastRefillMs;
|
|
135
|
+
const intervalsElapsed = Math.floor(elapsedMs / config.fillInterval);
|
|
136
|
+
if (intervalsElapsed > 0) {
|
|
137
|
+
const tokensGenerated = intervalsElapsed * config.fillAmount;
|
|
138
|
+
bucket.balance = Math.min(config.maxBalance, bucket.balance + tokensGenerated);
|
|
139
|
+
bucket.lastRefillMs = now - (elapsedMs % config.fillInterval);
|
|
140
|
+
}
|
|
141
|
+
return bucket.balance;
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
check(key, config) {
|
|
145
|
+
const balance = refillBucket(key, config);
|
|
146
|
+
return balance;
|
|
147
|
+
},
|
|
148
|
+
deduct(key, cost, config) {
|
|
149
|
+
const balance = refillBucket(key, config);
|
|
150
|
+
const minBalance = config.minBalance ?? 0;
|
|
151
|
+
const newBalance = balance - cost;
|
|
152
|
+
if (newBalance < minBalance) {
|
|
153
|
+
const deficit = minBalance - newBalance;
|
|
154
|
+
const intervalsNeeded = Math.ceil(deficit / config.fillAmount);
|
|
155
|
+
const retryAfterMs = intervalsNeeded * config.fillInterval;
|
|
156
|
+
throw new HttpError(429, 'Token limit exceeded', { retryAfterMs });
|
|
157
|
+
}
|
|
158
|
+
const bucket = buckets.get(key);
|
|
159
|
+
bucket.balance = newBalance;
|
|
160
|
+
return newBalance;
|
|
161
|
+
},
|
|
162
|
+
refund(key, cost, config) {
|
|
163
|
+
let bucket = buckets.get(key);
|
|
164
|
+
if (!bucket) {
|
|
165
|
+
bucket = { balance: Math.min(config.maxBalance, cost), lastRefillMs: Date.now() };
|
|
166
|
+
buckets.set(key, bucket);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
bucket.balance = Math.min(config.maxBalance, bucket.balance + cost);
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// ============================================================================
|
|
175
|
+
// PIPELINE HELPERS
|
|
176
|
+
// ============================================================================
|
|
177
|
+
/**
|
|
178
|
+
* Pre-handler: resolve callCost → controller.deduct() → return ResolvedTokenLimitEntry[] + remainingBalances
|
|
179
|
+
*/
|
|
180
|
+
export async function applyTokenLimitCheck(meta, controller, configs, methodName, basePath, params, ctx, user) {
|
|
181
|
+
if (!meta) {
|
|
182
|
+
return { entries: [], remainingBalances: [] };
|
|
183
|
+
}
|
|
184
|
+
const entries = Array.isArray(meta) ? meta : [meta];
|
|
185
|
+
const resolved = [];
|
|
186
|
+
const remainingBalances = [];
|
|
187
|
+
for (const entry of entries) {
|
|
188
|
+
const rawKey = entry.key ?? ':route';
|
|
189
|
+
const key = resolveTokenLimitKey(rawKey, methodName, basePath, user);
|
|
190
|
+
const callCost = await resolveCallCost(entry.callCost ?? 1, params, ctx);
|
|
191
|
+
const config = entry.config ?? configs[key];
|
|
192
|
+
if (!config) {
|
|
193
|
+
throw new Error(`Token limit config not found for key "${key}". ` +
|
|
194
|
+
`Define it in server.tokenLimit.configs or inline in route metadata.`);
|
|
195
|
+
}
|
|
196
|
+
const remaining = await controller.deduct(key, callCost, config);
|
|
197
|
+
resolved.push({
|
|
198
|
+
key,
|
|
199
|
+
callCost,
|
|
200
|
+
responseCostSpec: entry.responseCost,
|
|
201
|
+
failureCostSpec: entry.failureCost,
|
|
202
|
+
config,
|
|
203
|
+
});
|
|
204
|
+
remainingBalances.push(remaining);
|
|
205
|
+
}
|
|
206
|
+
return { entries: resolved, remainingBalances };
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Post-handler (success): resolve responseCost → deduct;
|
|
210
|
+
* if refundedStatusCode → refund callCost instead
|
|
211
|
+
* Returns responseCosts[]
|
|
212
|
+
*/
|
|
213
|
+
export async function applyTokenLimitResponse(entries, controller, result, timing, params, statusCode) {
|
|
214
|
+
const responseCosts = [];
|
|
215
|
+
for (const entry of entries) {
|
|
216
|
+
const shouldRefundCall = (entry.config.refundedStatusCodes?.includes(statusCode)) ||
|
|
217
|
+
(entry.config.refundSuccessful && statusCode >= 200 && statusCode < 300);
|
|
218
|
+
if (shouldRefundCall) {
|
|
219
|
+
await controller.refund(entry.key, entry.callCost, entry.config);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
// Deduct response cost
|
|
223
|
+
const responseCost = await resolveResponseCost(entry.responseCostSpec, result, timing, params);
|
|
224
|
+
if (responseCost > 0) {
|
|
225
|
+
await controller.deduct(entry.key, responseCost, entry.config);
|
|
226
|
+
}
|
|
227
|
+
responseCosts.push(responseCost);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return responseCosts;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Catch block (error path): resolve failureCost → deduct (or negative → refund)
|
|
234
|
+
* If failureCost is 0 and statusCode in refundedStatusCodes → refund callCost
|
|
235
|
+
*/
|
|
236
|
+
export async function applyTokenLimitFailure(entries, controller, error, timing, params, statusCode) {
|
|
237
|
+
const failureCosts = [];
|
|
238
|
+
for (const entry of entries) {
|
|
239
|
+
const failureCost = await resolveFailureCost(entry.failureCostSpec, error, timing, params);
|
|
240
|
+
if (failureCost > 0) {
|
|
241
|
+
// Deduct additional failure cost
|
|
242
|
+
await controller.deduct(entry.key, failureCost, entry.config);
|
|
243
|
+
}
|
|
244
|
+
else if (failureCost < 0) {
|
|
245
|
+
// Negative failure cost = partial refund
|
|
246
|
+
await controller.refund(entry.key, -failureCost, entry.config);
|
|
247
|
+
}
|
|
248
|
+
else if (failureCost === 0) {
|
|
249
|
+
// Check for refunded status codes even on 0 failure cost
|
|
250
|
+
const shouldRefundCall = (entry.config.refundedStatusCodes?.includes(statusCode)) ||
|
|
251
|
+
(entry.config.refundSuccessful && statusCode >= 200 && statusCode < 300);
|
|
252
|
+
if (shouldRefundCall) {
|
|
253
|
+
await controller.refund(entry.key, entry.callCost, entry.config);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
failureCosts.push(failureCost);
|
|
257
|
+
}
|
|
258
|
+
return failureCosts;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../typescript/src/server/token-limit/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Definition Generation for AI Integrations (Claude, OpenAI, etc)
|
|
3
|
+
*
|
|
4
|
+
* Generates standardized tool definitions from controller metadata
|
|
5
|
+
* Supports multiple formats: Anthropic (Claude), OpenAI, generic JSON Schema
|
|
6
|
+
*/
|
|
7
|
+
import { ZodSchema } from 'zod';
|
|
8
|
+
import type { ToolDefinition, ToolFormat, AnthropicTool, OpenAITool } from '../types/tools';
|
|
9
|
+
import { buildInputSchemaFromOpenAPIOperation, buildResponseSchemaFromOpenAPIOperation, emptyInputSchema, normalizeInputSchema, toolDefinitionFromOpenAPIOperation, type ToolDefinitionInit } from '../shared/tools';
|
|
10
|
+
/**
|
|
11
|
+
* Convert a Zod schema to JSON Schema
|
|
12
|
+
*/
|
|
13
|
+
export declare function zodToJsonSchema(schema: ZodSchema): any;
|
|
14
|
+
export { buildInputSchemaFromOpenAPIOperation, buildResponseSchemaFromOpenAPIOperation, emptyInputSchema, normalizeInputSchema, toolDefinitionFromOpenAPIOperation, };
|
|
15
|
+
export declare function createToolDefinition(init: ToolDefinitionInit): ToolDefinition;
|
|
16
|
+
export declare function createToolDefinition(methodName: string, httpMethod: string, path: string, description: string, inputSchema?: ZodSchema | Record<string, any>, responseSchema?: ZodSchema | Record<string, any>, controller?: string): ToolDefinition;
|
|
17
|
+
/**
|
|
18
|
+
* Convert tool definition to Claude/Anthropic format
|
|
19
|
+
*/
|
|
20
|
+
export declare function toAnthropicFormat(tool: ToolDefinition): AnthropicTool;
|
|
21
|
+
/**
|
|
22
|
+
* Convert tool definition to OpenAI format
|
|
23
|
+
*/
|
|
24
|
+
export declare function toOpenAIFormat(tool: ToolDefinition): OpenAITool;
|
|
25
|
+
/**
|
|
26
|
+
* Convert tool definition to generic format (with metadata)
|
|
27
|
+
*/
|
|
28
|
+
export declare function toSchemaFormat(tool: ToolDefinition): ToolDefinition;
|
|
29
|
+
/**
|
|
30
|
+
* Convert tool definition to requested format
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatTool(tool: ToolDefinition, format: ToolFormat): any;
|
|
33
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../typescript/src/server/tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3F,OAAO,EACH,oCAAoC,EACpC,uCAAuC,EAEvC,gBAAgB,EAChB,oBAAoB,EACpB,kCAAkC,EAClC,KAAK,kBAAkB,EAC1B,MAAM,iBAAiB,CAAA;AAGxB;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,GAAG,CAoCtD;AAuCD,OAAO,EACH,oCAAoC,EACpC,uCAAuC,EACvC,gBAAgB,EAChB,oBAAoB,EACpB,kCAAkC,GACrC,CAAA;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CAAA;AAC9E,wBAAgB,oBAAoB,CAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7C,cAAc,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChD,UAAU,CAAC,EAAE,MAAM,GACpB,cAAc,CAAA;AAuDjB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,aAAa,CAMrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,CAa/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAEnE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,GAAG,GAAG,CAUxE"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Definition Generation for AI Integrations (Claude, OpenAI, etc)
|
|
3
|
+
*
|
|
4
|
+
* Generates standardized tool definitions from controller metadata
|
|
5
|
+
* Supports multiple formats: Anthropic (Claude), OpenAI, generic JSON Schema
|
|
6
|
+
*/
|
|
7
|
+
import { buildInputSchemaFromOpenAPIOperation, buildResponseSchemaFromOpenAPIOperation, createToolDefinition as createSharedToolDefinition, emptyInputSchema, normalizeInputSchema, toolDefinitionFromOpenAPIOperation, } from '../shared/tools.js';
|
|
8
|
+
/**
|
|
9
|
+
* Convert a Zod schema to JSON Schema
|
|
10
|
+
*/
|
|
11
|
+
export function zodToJsonSchema(schema) {
|
|
12
|
+
if (!schema) {
|
|
13
|
+
return { type: 'object', properties: {} };
|
|
14
|
+
}
|
|
15
|
+
// Handle different Zod types
|
|
16
|
+
const schemaAny = schema;
|
|
17
|
+
// For object schemas
|
|
18
|
+
if (schemaAny._def?.shape) {
|
|
19
|
+
const shape = schemaAny._def.shape;
|
|
20
|
+
const properties = {};
|
|
21
|
+
const required = [];
|
|
22
|
+
for (const [key, field] of Object.entries(shape)) {
|
|
23
|
+
const fieldSchema = field;
|
|
24
|
+
const fieldAny = fieldSchema;
|
|
25
|
+
// Check if required
|
|
26
|
+
if (fieldAny._def?.innerType === undefined && fieldAny._def?.t !== 'ZodOptional') {
|
|
27
|
+
required.push(key);
|
|
28
|
+
}
|
|
29
|
+
// Get the type
|
|
30
|
+
properties[key] = zodTypeToJsonType(fieldSchema);
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties,
|
|
35
|
+
required: required.length > 0 ? required : undefined,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Fallback
|
|
39
|
+
return { type: 'object', properties: {} };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Convert a single Zod type to JSON Schema type
|
|
43
|
+
*/
|
|
44
|
+
function zodTypeToJsonType(schema) {
|
|
45
|
+
const schemaAny = schema;
|
|
46
|
+
const typeName = schemaAny._def?.t;
|
|
47
|
+
switch (typeName) {
|
|
48
|
+
case 'ZodString':
|
|
49
|
+
return { type: 'string' };
|
|
50
|
+
case 'ZodNumber':
|
|
51
|
+
return { type: 'number' };
|
|
52
|
+
case 'ZodBoolean':
|
|
53
|
+
return { type: 'boolean' };
|
|
54
|
+
case 'ZodArray': {
|
|
55
|
+
const elementSchema = schemaAny._def?.type;
|
|
56
|
+
return {
|
|
57
|
+
type: 'array',
|
|
58
|
+
items: elementSchema ? zodTypeToJsonType(elementSchema) : { type: 'object' },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
case 'ZodObject':
|
|
62
|
+
return zodToJsonSchema(schema);
|
|
63
|
+
case 'ZodOptional':
|
|
64
|
+
return zodTypeToJsonType(schemaAny._def?.innerType);
|
|
65
|
+
case 'ZodEnum':
|
|
66
|
+
return {
|
|
67
|
+
type: 'string',
|
|
68
|
+
enum: schemaAny._def?.values || [],
|
|
69
|
+
};
|
|
70
|
+
case 'ZodUnion':
|
|
71
|
+
return { type: 'string' }; // Simplified
|
|
72
|
+
default:
|
|
73
|
+
return { type: 'string' };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export { buildInputSchemaFromOpenAPIOperation, buildResponseSchemaFromOpenAPIOperation, emptyInputSchema, normalizeInputSchema, toolDefinitionFromOpenAPIOperation, };
|
|
77
|
+
/**
|
|
78
|
+
* Create a tool definition from controller method metadata
|
|
79
|
+
*/
|
|
80
|
+
export function createToolDefinition(initOrMethodName, httpMethod, path, description, inputSchema, responseSchema, controller) {
|
|
81
|
+
if (typeof initOrMethodName === 'object') {
|
|
82
|
+
return createSharedToolDefinition(initOrMethodName);
|
|
83
|
+
}
|
|
84
|
+
const methodName = initOrMethodName;
|
|
85
|
+
const normalizedMethod = (httpMethod || 'GET').toUpperCase();
|
|
86
|
+
const normalizedPath = path || `/${methodName}`;
|
|
87
|
+
const jsonInputSchema = inputSchema ? schemaToJsonSchema(inputSchema) : emptyInputSchema();
|
|
88
|
+
return {
|
|
89
|
+
name: methodName,
|
|
90
|
+
description: description || `${normalizedMethod} ${normalizedPath}`,
|
|
91
|
+
method: normalizedMethod,
|
|
92
|
+
path: normalizedPath,
|
|
93
|
+
controller,
|
|
94
|
+
input_schema: normalizeInputSchema(jsonInputSchema),
|
|
95
|
+
response_schema: responseSchema ? schemaToJsonSchema(responseSchema) : undefined,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function schemaToJsonSchema(schema) {
|
|
99
|
+
if (isJsonSchemaObject(schema)) {
|
|
100
|
+
return schema;
|
|
101
|
+
}
|
|
102
|
+
return zodToJsonSchema(schema);
|
|
103
|
+
}
|
|
104
|
+
function isJsonSchemaObject(schema) {
|
|
105
|
+
return Boolean(schema
|
|
106
|
+
&& typeof schema === 'object'
|
|
107
|
+
&& !('_def' in schema)
|
|
108
|
+
&& ('type' in schema
|
|
109
|
+
|| 'properties' in schema
|
|
110
|
+
|| 'oneOf' in schema
|
|
111
|
+
|| 'enum' in schema));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Convert tool definition to Claude/Anthropic format
|
|
115
|
+
*/
|
|
116
|
+
export function toAnthropicFormat(tool) {
|
|
117
|
+
return {
|
|
118
|
+
name: tool.name,
|
|
119
|
+
description: tool.description,
|
|
120
|
+
input_schema: tool.input_schema,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Convert tool definition to OpenAI format
|
|
125
|
+
*/
|
|
126
|
+
export function toOpenAIFormat(tool) {
|
|
127
|
+
return {
|
|
128
|
+
type: 'function',
|
|
129
|
+
function: {
|
|
130
|
+
name: tool.name,
|
|
131
|
+
description: tool.description,
|
|
132
|
+
parameters: {
|
|
133
|
+
type: 'object',
|
|
134
|
+
properties: tool.input_schema.properties,
|
|
135
|
+
required: tool.input_schema.required,
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Convert tool definition to generic format (with metadata)
|
|
142
|
+
*/
|
|
143
|
+
export function toSchemaFormat(tool) {
|
|
144
|
+
return tool;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Convert tool definition to requested format
|
|
148
|
+
*/
|
|
149
|
+
export function formatTool(tool, format) {
|
|
150
|
+
switch (format) {
|
|
151
|
+
case 'claude':
|
|
152
|
+
return toAnthropicFormat(tool);
|
|
153
|
+
case 'openai':
|
|
154
|
+
return toOpenAIFormat(tool);
|
|
155
|
+
case 'schema':
|
|
156
|
+
default:
|
|
157
|
+
return toSchemaFormat(tool);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=tools.js.map
|