fa-mcp-sdk 0.2.3

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +283 -0
  3. package/dist/core/_types_/types.d.ts +67 -0
  4. package/dist/core/_types_/types.d.ts.map +1 -0
  5. package/dist/core/_types_/types.js +2 -0
  6. package/dist/core/_types_/types.js.map +1 -0
  7. package/dist/core/bootstrap/dotenv.d.ts +3 -0
  8. package/dist/core/bootstrap/dotenv.d.ts.map +1 -0
  9. package/dist/core/bootstrap/dotenv.js +3 -0
  10. package/dist/core/bootstrap/dotenv.js.map +1 -0
  11. package/dist/core/bootstrap/init-config.d.ts +11 -0
  12. package/dist/core/bootstrap/init-config.d.ts.map +1 -0
  13. package/dist/core/bootstrap/init-config.js +52 -0
  14. package/dist/core/bootstrap/init-config.js.map +1 -0
  15. package/dist/core/bootstrap/startup-info.d.ts +6 -0
  16. package/dist/core/bootstrap/startup-info.d.ts.map +1 -0
  17. package/dist/core/bootstrap/startup-info.js +43 -0
  18. package/dist/core/bootstrap/startup-info.js.map +1 -0
  19. package/dist/core/constants.d.ts +2 -0
  20. package/dist/core/constants.d.ts.map +1 -0
  21. package/dist/core/constants.js +2 -0
  22. package/dist/core/constants.js.map +1 -0
  23. package/dist/core/consul/access-points-updater.d.ts +5 -0
  24. package/dist/core/consul/access-points-updater.d.ts.map +1 -0
  25. package/dist/core/consul/access-points-updater.js +11 -0
  26. package/dist/core/consul/access-points-updater.js.map +1 -0
  27. package/dist/core/consul/deregister.d.ts +2 -0
  28. package/dist/core/consul/deregister.d.ts.map +1 -0
  29. package/dist/core/consul/deregister.js +21 -0
  30. package/dist/core/consul/deregister.js.map +1 -0
  31. package/dist/core/consul/get-consul-api.d.ts +2 -0
  32. package/dist/core/consul/get-consul-api.d.ts.map +1 -0
  33. package/dist/core/consul/get-consul-api.js +18 -0
  34. package/dist/core/consul/get-consul-api.js.map +1 -0
  35. package/dist/core/consul/register.d.ts +2 -0
  36. package/dist/core/consul/register.d.ts.map +1 -0
  37. package/dist/core/consul/register.js +6 -0
  38. package/dist/core/consul/register.js.map +1 -0
  39. package/dist/core/db/pg-db.d.ts +50 -0
  40. package/dist/core/db/pg-db.d.ts.map +1 -0
  41. package/dist/core/db/pg-db.js +89 -0
  42. package/dist/core/db/pg-db.js.map +1 -0
  43. package/dist/core/debug.d.ts +5 -0
  44. package/dist/core/debug.d.ts.map +1 -0
  45. package/dist/core/debug.js +32 -0
  46. package/dist/core/debug.js.map +1 -0
  47. package/dist/core/ee.d.ts +3 -0
  48. package/dist/core/ee.d.ts.map +1 -0
  49. package/dist/core/ee.js +4 -0
  50. package/dist/core/ee.js.map +1 -0
  51. package/dist/core/errors/BaseMcpError.d.ts +19 -0
  52. package/dist/core/errors/BaseMcpError.d.ts.map +1 -0
  53. package/dist/core/errors/BaseMcpError.js +47 -0
  54. package/dist/core/errors/BaseMcpError.js.map +1 -0
  55. package/dist/core/errors/ValidationError.d.ts +5 -0
  56. package/dist/core/errors/ValidationError.d.ts.map +1 -0
  57. package/dist/core/errors/ValidationError.js +7 -0
  58. package/dist/core/errors/ValidationError.js.map +1 -0
  59. package/dist/core/errors/errors.d.ts +24 -0
  60. package/dist/core/errors/errors.d.ts.map +1 -0
  61. package/dist/core/errors/errors.js +49 -0
  62. package/dist/core/errors/errors.js.map +1 -0
  63. package/dist/core/index.d.ts +19 -0
  64. package/dist/core/index.d.ts.map +1 -0
  65. package/dist/core/index.js +16 -0
  66. package/dist/core/index.js.map +1 -0
  67. package/dist/core/init-mcp-server.d.ts +8 -0
  68. package/dist/core/init-mcp-server.d.ts.map +1 -0
  69. package/dist/core/init-mcp-server.js +101 -0
  70. package/dist/core/init-mcp-server.js.map +1 -0
  71. package/dist/core/logger.d.ts +6 -0
  72. package/dist/core/logger.d.ts.map +1 -0
  73. package/dist/core/logger.js +53 -0
  74. package/dist/core/logger.js.map +1 -0
  75. package/dist/core/mcp/create-mcp-server.d.ts +6 -0
  76. package/dist/core/mcp/create-mcp-server.d.ts.map +1 -0
  77. package/dist/core/mcp/create-mcp-server.js +44 -0
  78. package/dist/core/mcp/create-mcp-server.js.map +1 -0
  79. package/dist/core/mcp/prompts.d.ts +10 -0
  80. package/dist/core/mcp/prompts.d.ts.map +1 -0
  81. package/dist/core/mcp/prompts.js +56 -0
  82. package/dist/core/mcp/prompts.js.map +1 -0
  83. package/dist/core/mcp/resources.d.ts +14 -0
  84. package/dist/core/mcp/resources.d.ts.map +1 -0
  85. package/dist/core/mcp/resources.js +72 -0
  86. package/dist/core/mcp/resources.js.map +1 -0
  87. package/dist/core/mcp/server-stdio.d.ts +5 -0
  88. package/dist/core/mcp/server-stdio.d.ts.map +1 -0
  89. package/dist/core/mcp/server-stdio.js +13 -0
  90. package/dist/core/mcp/server-stdio.js.map +1 -0
  91. package/dist/core/token/gen-token-app/gen-token-server.d.ts +2 -0
  92. package/dist/core/token/gen-token-app/gen-token-server.d.ts.map +1 -0
  93. package/dist/core/token/gen-token-app/gen-token-server.js +115 -0
  94. package/dist/core/token/gen-token-app/gen-token-server.js.map +1 -0
  95. package/dist/core/token/gen-token-app/html.d.ts +2 -0
  96. package/dist/core/token/gen-token-app/html.d.ts.map +1 -0
  97. package/dist/core/token/gen-token-app/html.js +500 -0
  98. package/dist/core/token/gen-token-app/html.js.map +1 -0
  99. package/dist/core/token/i-token.d.ts +13 -0
  100. package/dist/core/token/i-token.d.ts.map +1 -0
  101. package/dist/core/token/i-token.js +2 -0
  102. package/dist/core/token/i-token.js.map +1 -0
  103. package/dist/core/token/token-core.d.ts +24 -0
  104. package/dist/core/token/token-core.d.ts.map +1 -0
  105. package/dist/core/token/token-core.js +130 -0
  106. package/dist/core/token/token-core.js.map +1 -0
  107. package/dist/core/token/token.d.ts +17 -0
  108. package/dist/core/token/token.d.ts.map +1 -0
  109. package/dist/core/token/token.js +62 -0
  110. package/dist/core/token/token.js.map +1 -0
  111. package/dist/core/utils/formatToolResult.d.ts +7 -0
  112. package/dist/core/utils/formatToolResult.d.ts.map +1 -0
  113. package/dist/core/utils/formatToolResult.js +68 -0
  114. package/dist/core/utils/formatToolResult.js.map +1 -0
  115. package/dist/core/utils/rate-limit.d.ts +17 -0
  116. package/dist/core/utils/rate-limit.d.ts.map +1 -0
  117. package/dist/core/utils/rate-limit.js +56 -0
  118. package/dist/core/utils/rate-limit.js.map +1 -0
  119. package/dist/core/utils/utils.d.ts +6 -0
  120. package/dist/core/utils/utils.d.ts.map +1 -0
  121. package/dist/core/utils/utils.js +12 -0
  122. package/dist/core/utils/utils.js.map +1 -0
  123. package/dist/core/web/about-page/css.d.ts +2 -0
  124. package/dist/core/web/about-page/css.d.ts.map +1 -0
  125. package/dist/core/web/about-page/css.js +534 -0
  126. package/dist/core/web/about-page/css.js.map +1 -0
  127. package/dist/core/web/about-page/render.d.ts +2 -0
  128. package/dist/core/web/about-page/render.d.ts.map +1 -0
  129. package/dist/core/web/about-page/render.js +679 -0
  130. package/dist/core/web/about-page/render.js.map +1 -0
  131. package/dist/core/web/cors.d.ts +5 -0
  132. package/dist/core/web/cors.d.ts.map +1 -0
  133. package/dist/core/web/cors.js +22 -0
  134. package/dist/core/web/cors.js.map +1 -0
  135. package/dist/core/web/favicon-svg.d.ts +7 -0
  136. package/dist/core/web/favicon-svg.d.ts.map +1 -0
  137. package/dist/core/web/favicon-svg.js +44 -0
  138. package/dist/core/web/favicon-svg.js.map +1 -0
  139. package/dist/core/web/server-http.d.ts +5 -0
  140. package/dist/core/web/server-http.d.ts.map +1 -0
  141. package/dist/core/web/server-http.js +275 -0
  142. package/dist/core/web/server-http.js.map +1 -0
  143. package/package.json +88 -0
@@ -0,0 +1,17 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ export declare const debugAuth: (req: Request, code: number, message: string) => {
3
+ code: number;
4
+ message: string;
5
+ };
6
+ /**
7
+ * Checks token authorization.
8
+ * If everything is OK, it will return undefined.
9
+ * Otherwise, it will return the object with an error
10
+ */
11
+ export declare const getAuthByTokenError: (req: Request) => {
12
+ code: number;
13
+ message: string;
14
+ } | undefined;
15
+ export declare const authByToken: (req: Request, res: Response) => boolean;
16
+ export declare const authTokenMW: (req: Request, res: Response, next: NextFunction) => void;
17
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/core/token/token.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAgB1D,eAAO,MAAM,SAAS,GAAI,KAAK,OAAO,EAAE,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CActG,CAAC;AAGF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,KAAK,OAAO,KAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAatF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,YAOtD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,SAO1E,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { cyan, lBlue, magenta, red, reset } from 'af-color';
2
+ import { checkToken } from './token-core.js';
3
+ import { debugTokenAuth } from '../debug.js';
4
+ import { appConfig } from '../bootstrap/init-config.js';
5
+ const { enabled } = appConfig.webServer.auth;
6
+ const getTokenFromHttpHeader = (req) => {
7
+ const { authorization = '', user = '' } = req.headers;
8
+ const token = authorization.replace(/^Bearer */, '');
9
+ return { user: String(user).toLowerCase(), token };
10
+ };
11
+ const SHOW_HEADERS_SET = new Set(['user', 'authorization', 'x-real-ip', 'x-mode', 'host']);
12
+ export const debugAuth = (req, code, message) => {
13
+ if (debugTokenAuth.enabled) {
14
+ let headersStr = '';
15
+ if (req.headers) {
16
+ headersStr = Object.entries(req.headers).map(([k, v]) => {
17
+ if (SHOW_HEADERS_SET.has(k.toLowerCase())) {
18
+ return `${cyan}${k}${lBlue}: ${magenta}${v}${reset}`;
19
+ }
20
+ return undefined;
21
+ }).filter(Boolean).join(', ');
22
+ }
23
+ debugTokenAuth(`${red}Unauthorized ${lBlue}${code}${red} ${message}${reset} Headers: ${headersStr || '-'}`);
24
+ }
25
+ return { code, message };
26
+ };
27
+ /**
28
+ * Checks token authorization.
29
+ * If everything is OK, it will return undefined.
30
+ * Otherwise, it will return the object with an error
31
+ */
32
+ export const getAuthByTokenError = (req) => {
33
+ if (!enabled) {
34
+ return undefined;
35
+ }
36
+ const { token, user } = getTokenFromHttpHeader(req);
37
+ if (!token) {
38
+ return debugAuth(req, 400, 'Missing authorization header');
39
+ }
40
+ const checkResult = checkToken(token, user);
41
+ if (checkResult.errorReason) {
42
+ return debugAuth(req, 401, checkResult.errorReason);
43
+ }
44
+ return undefined;
45
+ };
46
+ export const authByToken = (req, res) => {
47
+ const authError = getAuthByTokenError(req);
48
+ if (authError) {
49
+ res.status(authError.code).send(authError.message);
50
+ return false;
51
+ }
52
+ return true;
53
+ };
54
+ export const authTokenMW = (req, res, next) => {
55
+ const authError = getAuthByTokenError(req);
56
+ if (authError) {
57
+ res.status(authError.code).send(authError.message);
58
+ return;
59
+ }
60
+ next();
61
+ };
62
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/core/token/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Format tool result based on configuration
3
+ * Returns either structured content (JSON) or formatted text
4
+ */
5
+ export declare function formatToolResult(json: any): any;
6
+ export declare const getJsonFromResult: <T = any>(result: any) => T;
7
+ //# sourceMappingURL=formatToolResult.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatToolResult.d.ts","sourceRoot":"","sources":["../../../src/core/utils/formatToolResult.ts"],"names":[],"mappings":"AAgCA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAE,IAAI,EAAE,GAAG,GAAG,GAAG,CAiBhD;AAED,eAAO,MAAM,iBAAiB,GAAI,CAAC,GAAG,GAAG,EAAG,QAAQ,GAAG,KAAG,CAYzD,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { appConfig } from '../bootstrap/init-config.js';
2
+ import { isObject, ppj } from './utils.js';
3
+ const cleanUndefinedDeep = (value) => {
4
+ if (!isObject(value)) {
5
+ return;
6
+ }
7
+ // Do not attempt to clean special objects like Date
8
+ if (value instanceof Date) {
9
+ return;
10
+ }
11
+ if (Array.isArray(value)) {
12
+ for (let i = 0; i < value.length; i++) {
13
+ const el = value[i];
14
+ if (isObject(el)) {
15
+ cleanUndefinedDeep(el);
16
+ }
17
+ // Note: We intentionally do not remove undefined array elements to preserve indices
18
+ }
19
+ return;
20
+ }
21
+ // Plain object case
22
+ for (const key of Object.keys(value)) {
23
+ const v = value[key];
24
+ if (v === undefined) {
25
+ delete value[key];
26
+ }
27
+ else if (isObject(v)) {
28
+ cleanUndefinedDeep(v);
29
+ }
30
+ }
31
+ };
32
+ /**
33
+ * Format tool result based on configuration
34
+ * Returns either structured content (JSON) or formatted text
35
+ */
36
+ export function formatToolResult(json) {
37
+ if (isObject(json)) {
38
+ cleanUndefinedDeep(json);
39
+ }
40
+ return appConfig.mcp.toolAnswerAs === 'structuredContent'
41
+ ? {
42
+ structuredContent: json,
43
+ }
44
+ : {
45
+ content: [
46
+ {
47
+ type: 'text',
48
+ text: ppj(json),
49
+ },
50
+ ],
51
+ };
52
+ }
53
+ export const getJsonFromResult = (result) => {
54
+ if (appConfig.mcp.toolAnswerAs === 'structuredContent') {
55
+ return result?.structuredContent;
56
+ }
57
+ else {
58
+ const text = result?.result?.content?.[0]?.text || result?.content?.[0]?.text || '';
59
+ try {
60
+ return JSON.parse(text);
61
+ }
62
+ catch {
63
+ //
64
+ }
65
+ }
66
+ return undefined;
67
+ };
68
+ //# sourceMappingURL=formatToolResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatToolResult.js","sourceRoot":"","sources":["../../../src/core/utils/formatToolResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,kBAAkB,GAAG,CAAC,KAAU,EAAQ,EAAE;IAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IACD,oDAAoD;IACpD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjB,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;YACD,oFAAoF;QACtF,CAAC;QACD,OAAO;IACT,CAAC;IACD,oBAAoB;IACpB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAE,IAAS;IACzC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,YAAY,KAAK,mBAAmB;QACvD,CAAC,CAAC;YACA,iBAAiB,EAAE,IAAI;SACxB;QACD,CAAC,CAAC;YACA,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC;iBAChB;aACF;SACF,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAW,MAAW,EAAK,EAAE;IAC5D,IAAI,SAAS,CAAC,GAAG,CAAC,YAAY,KAAK,mBAAmB,EAAE,CAAC;QACvD,OAAO,MAAM,EAAE,iBAAsB,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QACpF,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,EAAE;QACJ,CAAC;IACH,CAAC;IACD,OAAO,SAAc,CAAC;AACxB,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Rate limiting utilities
3
+ */
4
+ /**
5
+ * Format MCP server rate limit error message (from rate-limiter-flexible)
6
+ */
7
+ export declare function formatRateLimitError(errorData: {
8
+ remainingPoints: number;
9
+ msBeforeNext: number;
10
+ consumedPoints: number;
11
+ isFirstInDuration: boolean;
12
+ }, maxRequests: number): string;
13
+ /**
14
+ * Check if error is from rate-limiter-flexible
15
+ */
16
+ export declare function isRateLimitError(error: any): boolean;
17
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/core/utils/rate-limit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqCH;;GAEG;AACH,wBAAgB,oBAAoB,CAAE,SAAS,EAAE;IAC/C,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAM9B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAMrD"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Rate limiting utilities
3
+ */
4
+ /**
5
+ * Format time duration
6
+ */
7
+ function formatTimeDuration(seconds) {
8
+ const minutes = Math.floor(seconds / 60);
9
+ const remainingSeconds = seconds % 60;
10
+ if (minutes > 0) {
11
+ return remainingSeconds > 0
12
+ ? `${minutes} min ${remainingSeconds} sec`
13
+ : `${minutes} min`;
14
+ }
15
+ else {
16
+ return `${seconds} sec`;
17
+ }
18
+ }
19
+ /**
20
+ * Format next available time
21
+ */
22
+ function formatNextAvailableTime(milliseconds) {
23
+ const nextTime = new Date(Date.now() + milliseconds);
24
+ const timeString = nextTime.toLocaleTimeString('ru-RU', {
25
+ hour: '2-digit',
26
+ minute: '2-digit',
27
+ timeZone: 'Europe/Moscow'
28
+ });
29
+ const dateString = nextTime.toLocaleDateString('ru-RU', {
30
+ year: 'numeric',
31
+ month: '2-digit',
32
+ day: '2-digit',
33
+ timeZone: 'Europe/Moscow'
34
+ });
35
+ return `${timeString} ${dateString}`;
36
+ }
37
+ /**
38
+ * Format MCP server rate limit error message (from rate-limiter-flexible)
39
+ */
40
+ export function formatRateLimitError(errorData, maxRequests) {
41
+ const seconds = Math.ceil(errorData.msBeforeNext / 1000);
42
+ const timeRemaining = formatTimeDuration(seconds);
43
+ const nextAvailable = formatNextAvailableTime(errorData.msBeforeNext);
44
+ return `Rate limit exceeded ${maxRequests} requests per 1 minute. The next request will be available in ${timeRemaining} (at ${nextAvailable})`;
45
+ }
46
+ /**
47
+ * Check if error is from rate-limiter-flexible
48
+ */
49
+ export function isRateLimitError(error) {
50
+ return error &&
51
+ typeof error === 'object' &&
52
+ typeof error.remainingPoints === 'number' &&
53
+ typeof error.msBeforeNext === 'number' &&
54
+ typeof error.consumedPoints === 'number';
55
+ }
56
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/core/utils/rate-limit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,SAAS,kBAAkB,CAAE,OAAe;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;IAEtC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,gBAAgB,GAAG,CAAC;YACzB,CAAC,CAAC,GAAG,OAAO,QAAQ,gBAAgB,MAAM;YAC1C,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,OAAO,MAAM,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAE,YAAoB;IACpD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACtD,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACtD,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAC;IACH,OAAO,GAAG,UAAU,IAAI,UAAU,EAAE,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAE,SAKrC,EAAE,WAAmB;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,uBAAuB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAEtE,OAAO,uBAAuB,WAAW,iEAAiE,aAAa,QAAQ,aAAa,GAAG,CAAC;AAClJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAE,KAAU;IAC1C,OAAO,KAAK;QACV,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ;QACzC,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;QACtC,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const trim: (s: any) => string;
2
+ export declare const ppj: (v: any) => string;
3
+ export declare const isObject: (o: any) => boolean;
4
+ export declare const isNonEmptyObject: (o: any) => boolean;
5
+ export declare const isMainModule: (url: string) => boolean | "";
6
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,GAAI,GAAG,GAAG,KAAG,MAAgC,CAAC;AAE/D,eAAO,MAAM,GAAG,GAAI,GAAG,GAAG,WAEzB,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,GAAG,KAAG,OAAuC,CAAC;AAE1E,eAAO,MAAM,gBAAgB,GAAI,GAAG,GAAG,KAAG,OAA4F,CAAC;AAEvI,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,iBAIvC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export const trim = (s) => String(s || '').trim();
2
+ export const ppj = (v) => {
3
+ return JSON.stringify(v, null, 2);
4
+ };
5
+ export const isObject = (o) => (o && typeof o === 'object');
6
+ export const isNonEmptyObject = (o) => isObject(o) && !Array.isArray(o) && Object.values(o).some((v) => v !== undefined);
7
+ export const isMainModule = (url) => {
8
+ const modulePath = (process.argv[1] || '').replace(/\\/g, '/');
9
+ url = url.replace(/file:\/+/, '');
10
+ return modulePath && (url === modulePath);
11
+ };
12
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/core/utils/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAM,EAAU,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAE/D,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAM,EAAE,EAAE;IAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAM,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAM,EAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;AAEvI,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;IAC1C,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/D,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,UAAU,IAAI,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC;AAC5C,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const getCss: (primaryColor: string) => string;
2
+ //# sourceMappingURL=css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../../../src/core/web/about-page/css.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,GAAI,cAAc,MAAM,WAohB1C,CAAC"}