@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.
Files changed (233) hide show
  1. package/dist/args/coerce.d.ts +54 -0
  2. package/dist/args/coerce.d.ts.map +1 -0
  3. package/dist/args/coerce.js +236 -0
  4. package/dist/args/coerce.js.map +1 -0
  5. package/dist/args/index.d.ts +2 -0
  6. package/dist/args/index.d.ts.map +1 -0
  7. package/dist/args/index.js +2 -0
  8. package/dist/args/index.js.map +1 -0
  9. package/dist/args/scalars.d.ts +87 -0
  10. package/dist/args/scalars.d.ts.map +1 -0
  11. package/dist/args/scalars.js +22 -0
  12. package/dist/args/scalars.js.map +1 -0
  13. package/dist/args/validate.d.ts +23 -0
  14. package/dist/args/validate.d.ts.map +1 -0
  15. package/dist/args/validate.js +185 -0
  16. package/dist/args/validate.js.map +1 -0
  17. package/dist/args/z2.d.ts +27 -0
  18. package/dist/args/z2.d.ts.map +1 -0
  19. package/dist/args/z2.js +24 -0
  20. package/dist/args/z2.js.map +1 -0
  21. package/dist/client/css-transport-plugin.d.ts +19 -0
  22. package/dist/client/css-transport-plugin.d.ts.map +1 -0
  23. package/dist/client/css-transport-plugin.js +78 -0
  24. package/dist/client/css-transport-plugin.js.map +1 -0
  25. package/dist/client/file-transport-plugin.d.ts +28 -0
  26. package/dist/client/file-transport-plugin.d.ts.map +1 -0
  27. package/dist/client/file-transport-plugin.js +80 -0
  28. package/dist/client/file-transport-plugin.js.map +1 -0
  29. package/dist/client/http-transport-plugin.d.ts +27 -0
  30. package/dist/client/http-transport-plugin.d.ts.map +1 -0
  31. package/dist/client/http-transport-plugin.js +48 -0
  32. package/dist/client/http-transport-plugin.js.map +1 -0
  33. package/dist/client/index.d.ts +7 -0
  34. package/dist/client/index.d.ts.map +1 -0
  35. package/dist/client/index.js +7 -0
  36. package/dist/client/index.js.map +1 -0
  37. package/dist/client/openapi-client.d.ts +334 -0
  38. package/dist/client/openapi-client.d.ts.map +1 -0
  39. package/dist/client/openapi-client.js +910 -0
  40. package/dist/client/openapi-client.js.map +1 -0
  41. package/dist/client/proxy.d.ts +5 -0
  42. package/dist/client/proxy.d.ts.map +1 -0
  43. package/dist/client/proxy.js +353 -0
  44. package/dist/client/proxy.js.map +1 -0
  45. package/dist/client/request-builder.d.ts +5 -0
  46. package/dist/client/request-builder.d.ts.map +1 -0
  47. package/dist/client/request-builder.js +88 -0
  48. package/dist/client/request-builder.js.map +1 -0
  49. package/dist/client/rpc-transport-plugin.d.ts +17 -0
  50. package/dist/client/rpc-transport-plugin.d.ts.map +1 -0
  51. package/dist/client/rpc-transport-plugin.js +69 -0
  52. package/dist/client/rpc-transport-plugin.js.map +1 -0
  53. package/dist/client/tools.d.ts +69 -0
  54. package/dist/client/tools.d.ts.map +1 -0
  55. package/dist/client/tools.js +122 -0
  56. package/dist/client/tools.js.map +1 -0
  57. package/dist/client/transport-plugin.d.ts +62 -0
  58. package/dist/client/transport-plugin.d.ts.map +1 -0
  59. package/dist/client/transport-plugin.js +40 -0
  60. package/dist/client/transport-plugin.js.map +1 -0
  61. package/dist/client-entry.d.ts +25 -0
  62. package/dist/client-entry.d.ts.map +1 -0
  63. package/dist/client-entry.js +25 -0
  64. package/dist/client-entry.js.map +1 -0
  65. package/dist/client-server-entry.d.ts +13 -0
  66. package/dist/client-server-entry.d.ts.map +1 -0
  67. package/dist/client-server-entry.js +13 -0
  68. package/dist/client-server-entry.js.map +1 -0
  69. package/dist/client-side-python/runtime.d.ts +102 -0
  70. package/dist/client-side-python/runtime.d.ts.map +1 -0
  71. package/dist/client-side-python/runtime.js +595 -0
  72. package/dist/client-side-python/runtime.js.map +1 -0
  73. package/dist/client-side-server/bootstrap.d.ts +3 -0
  74. package/dist/client-side-server/bootstrap.d.ts.map +1 -0
  75. package/dist/client-side-server/bootstrap.js +20 -0
  76. package/dist/client-side-server/bootstrap.js.map +1 -0
  77. package/dist/client-side-server/channel.d.ts +17 -0
  78. package/dist/client-side-server/channel.d.ts.map +1 -0
  79. package/dist/client-side-server/channel.js +38 -0
  80. package/dist/client-side-server/channel.js.map +1 -0
  81. package/dist/client-side-server/identity.d.ts +116 -0
  82. package/dist/client-side-server/identity.d.ts.map +1 -0
  83. package/dist/client-side-server/identity.js +358 -0
  84. package/dist/client-side-server/identity.js.map +1 -0
  85. package/dist/client-side-server/mqtt-webrtc.d.ts +77 -0
  86. package/dist/client-side-server/mqtt-webrtc.d.ts.map +1 -0
  87. package/dist/client-side-server/mqtt-webrtc.js +575 -0
  88. package/dist/client-side-server/mqtt-webrtc.js.map +1 -0
  89. package/dist/client-side-server/protocol.d.ts +49 -0
  90. package/dist/client-side-server/protocol.d.ts.map +1 -0
  91. package/dist/client-side-server/protocol.js +13 -0
  92. package/dist/client-side-server/protocol.js.map +1 -0
  93. package/dist/client-side-server/runtime.d.ts +57 -0
  94. package/dist/client-side-server/runtime.d.ts.map +1 -0
  95. package/dist/client-side-server/runtime.js +188 -0
  96. package/dist/client-side-server/runtime.js.map +1 -0
  97. package/dist/client-side-server/server.d.ts +75 -0
  98. package/dist/client-side-server/server.d.ts.map +1 -0
  99. package/dist/client-side-server/server.js +380 -0
  100. package/dist/client-side-server/server.js.map +1 -0
  101. package/dist/client-side-server/signaling.d.ts +10 -0
  102. package/dist/client-side-server/signaling.d.ts.map +1 -0
  103. package/dist/client-side-server/signaling.js +19 -0
  104. package/dist/client-side-server/signaling.js.map +1 -0
  105. package/dist/client-side-server/source-analysis.d.ts +29 -0
  106. package/dist/client-side-server/source-analysis.d.ts.map +1 -0
  107. package/dist/client-side-server/source-analysis.js +395 -0
  108. package/dist/client-side-server/source-analysis.js.map +1 -0
  109. package/dist/generated/python-browser-sources.d.ts +2 -0
  110. package/dist/generated/python-browser-sources.d.ts.map +1 -0
  111. package/dist/generated/python-browser-sources.js +13 -0
  112. package/dist/generated/python-browser-sources.js.map +1 -0
  113. package/dist/logging.d.ts +9 -0
  114. package/dist/logging.d.ts.map +1 -0
  115. package/dist/logging.js +64 -0
  116. package/dist/logging.js.map +1 -0
  117. package/dist/python-browser-entry.d.ts +2 -0
  118. package/dist/python-browser-entry.d.ts.map +1 -0
  119. package/dist/python-browser-entry.js +2 -0
  120. package/dist/python-browser-entry.js.map +1 -0
  121. package/dist/rpc.d.ts +39 -0
  122. package/dist/rpc.d.ts.map +1 -0
  123. package/dist/rpc.js +2 -0
  124. package/dist/rpc.js.map +1 -0
  125. package/dist/server/authority-server.d.ts +27 -0
  126. package/dist/server/authority-server.d.ts.map +1 -0
  127. package/dist/server/authority-server.js +97 -0
  128. package/dist/server/authority-server.js.map +1 -0
  129. package/dist/server/cache/index.d.ts +2 -0
  130. package/dist/server/cache/index.d.ts.map +1 -0
  131. package/dist/server/cache/index.js +2 -0
  132. package/dist/server/cache/index.js.map +1 -0
  133. package/dist/server/cache/utils.d.ts +30 -0
  134. package/dist/server/cache/utils.d.ts.map +1 -0
  135. package/dist/server/cache/utils.js +116 -0
  136. package/dist/server/cache/utils.js.map +1 -0
  137. package/dist/server/core.d.ts +43 -0
  138. package/dist/server/core.d.ts.map +1 -0
  139. package/dist/server/core.js +215 -0
  140. package/dist/server/core.js.map +1 -0
  141. package/dist/server/operation-registry.d.ts +9 -0
  142. package/dist/server/operation-registry.d.ts.map +1 -0
  143. package/dist/server/operation-registry.js +16 -0
  144. package/dist/server/operation-registry.js.map +1 -0
  145. package/dist/server/param-aliases.d.ts +40 -0
  146. package/dist/server/param-aliases.d.ts.map +1 -0
  147. package/dist/server/param-aliases.js +112 -0
  148. package/dist/server/param-aliases.js.map +1 -0
  149. package/dist/server/rate-limit/index.d.ts +2 -0
  150. package/dist/server/rate-limit/index.d.ts.map +1 -0
  151. package/dist/server/rate-limit/index.js +2 -0
  152. package/dist/server/rate-limit/index.js.map +1 -0
  153. package/dist/server/rate-limit/utils.d.ts +27 -0
  154. package/dist/server/rate-limit/utils.d.ts.map +1 -0
  155. package/dist/server/rate-limit/utils.js +126 -0
  156. package/dist/server/rate-limit/utils.js.map +1 -0
  157. package/dist/server/routing.d.ts +39 -0
  158. package/dist/server/routing.d.ts.map +1 -0
  159. package/dist/server/routing.js +70 -0
  160. package/dist/server/routing.js.map +1 -0
  161. package/dist/server/token-limit/index.d.ts +2 -0
  162. package/dist/server/token-limit/index.d.ts.map +1 -0
  163. package/dist/server/token-limit/index.js +2 -0
  164. package/dist/server/token-limit/index.js.map +1 -0
  165. package/dist/server/token-limit/utils.d.ts +44 -0
  166. package/dist/server/token-limit/utils.d.ts.map +1 -0
  167. package/dist/server/token-limit/utils.js +260 -0
  168. package/dist/server/token-limit/utils.js.map +1 -0
  169. package/dist/server/tools.d.ts +33 -0
  170. package/dist/server/tools.d.ts.map +1 -0
  171. package/dist/server/tools.js +160 -0
  172. package/dist/server/tools.js.map +1 -0
  173. package/dist/server/transports.d.ts +25 -0
  174. package/dist/server/transports.d.ts.map +1 -0
  175. package/dist/server/transports.js +2 -0
  176. package/dist/server/transports.js.map +1 -0
  177. package/dist/shared/tools.d.ts +24 -0
  178. package/dist/shared/tools.d.ts.map +1 -0
  179. package/dist/shared/tools.js +86 -0
  180. package/dist/shared/tools.js.map +1 -0
  181. package/dist/spec/decorators.d.ts +41 -0
  182. package/dist/spec/decorators.d.ts.map +1 -0
  183. package/dist/spec/decorators.js +93 -0
  184. package/dist/spec/decorators.js.map +1 -0
  185. package/dist/spec/index.d.ts +3 -0
  186. package/dist/spec/index.d.ts.map +1 -0
  187. package/dist/spec/index.js +3 -0
  188. package/dist/spec/index.js.map +1 -0
  189. package/dist/spec/metadata.d.ts +5 -0
  190. package/dist/spec/metadata.d.ts.map +1 -0
  191. package/dist/spec/metadata.js +37 -0
  192. package/dist/spec/metadata.js.map +1 -0
  193. package/dist/types/client-route.d.ts +7 -0
  194. package/dist/types/client-route.d.ts.map +1 -0
  195. package/dist/types/client-route.js +2 -0
  196. package/dist/types/client-route.js.map +1 -0
  197. package/dist/types/client.d.ts +81 -0
  198. package/dist/types/client.d.ts.map +1 -0
  199. package/dist/types/client.js +14 -0
  200. package/dist/types/client.js.map +1 -0
  201. package/dist/types/endpoints.d.ts +76 -0
  202. package/dist/types/endpoints.d.ts.map +1 -0
  203. package/dist/types/endpoints.js +2 -0
  204. package/dist/types/endpoints.js.map +1 -0
  205. package/dist/types/errors.d.ts +86 -0
  206. package/dist/types/errors.d.ts.map +1 -0
  207. package/dist/types/errors.js +153 -0
  208. package/dist/types/errors.js.map +1 -0
  209. package/dist/types/http.d.ts +80 -0
  210. package/dist/types/http.d.ts.map +1 -0
  211. package/dist/types/http.js +61 -0
  212. package/dist/types/http.js.map +1 -0
  213. package/dist/types/index.d.ts +10 -0
  214. package/dist/types/index.d.ts.map +1 -0
  215. package/dist/types/index.js +10 -0
  216. package/dist/types/index.js.map +1 -0
  217. package/dist/types/openapi.d.ts +220 -0
  218. package/dist/types/openapi.d.ts.map +1 -0
  219. package/dist/types/openapi.js +11 -0
  220. package/dist/types/openapi.js.map +1 -0
  221. package/dist/types/opts.d.ts +46 -0
  222. package/dist/types/opts.d.ts.map +1 -0
  223. package/dist/types/opts.js +2 -0
  224. package/dist/types/opts.js.map +1 -0
  225. package/dist/types/plugins.d.ts +93 -0
  226. package/dist/types/plugins.d.ts.map +1 -0
  227. package/dist/types/plugins.js +5 -0
  228. package/dist/types/plugins.js.map +1 -0
  229. package/dist/types/tools.d.ts +52 -0
  230. package/dist/types/tools.d.ts.map +1 -0
  231. package/dist/types/tools.js +2 -0
  232. package/dist/types/tools.js.map +1 -0
  233. 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,2 @@
1
+ export * from './utils';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export * from './utils.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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