@intlayer/backend 5.7.8 → 5.8.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 (73) hide show
  1. package/dist/cjs/schemas/dictionary.schema.cjs.map +1 -1
  2. package/dist/cjs/schemas/discussion.schema.cjs.map +1 -1
  3. package/dist/cjs/schemas/oAuth2.schema.cjs.map +1 -1
  4. package/dist/cjs/schemas/organization.schema.cjs.map +1 -1
  5. package/dist/cjs/schemas/plans.schema.cjs.map +1 -1
  6. package/dist/cjs/schemas/project.schema.cjs.map +1 -1
  7. package/dist/cjs/schemas/session.schema.cjs.map +1 -1
  8. package/dist/cjs/schemas/tag.schema.cjs.map +1 -1
  9. package/dist/cjs/schemas/user.schema.cjs.map +1 -1
  10. package/dist/cjs/services/organization.service.cjs +1 -2
  11. package/dist/cjs/services/organization.service.cjs.map +1 -1
  12. package/dist/cjs/services/tag.service.cjs.map +1 -1
  13. package/dist/cjs/utils/AI/aiSdk.cjs +2 -3
  14. package/dist/cjs/utils/AI/aiSdk.cjs.map +1 -1
  15. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs +1 -1
  16. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs.map +1 -1
  17. package/dist/cjs/utils/AI/askDocQuestion/embeddings.json +44076 -21504
  18. package/dist/cjs/utils/AI/autocomplete/index.cjs +2 -5
  19. package/dist/cjs/utils/AI/autocomplete/index.cjs.map +1 -1
  20. package/dist/cjs/utils/errors/ErrorHandler.cjs +3 -3
  21. package/dist/cjs/utils/errors/ErrorHandler.cjs.map +1 -1
  22. package/dist/cjs/utils/permissions.cjs +1 -1
  23. package/dist/cjs/utils/permissions.cjs.map +1 -1
  24. package/dist/cjs/utils/rateLimiter.cjs.map +1 -1
  25. package/dist/esm/schemas/dictionary.schema.mjs.map +1 -1
  26. package/dist/esm/schemas/discussion.schema.mjs.map +1 -1
  27. package/dist/esm/schemas/oAuth2.schema.mjs.map +1 -1
  28. package/dist/esm/schemas/organization.schema.mjs.map +1 -1
  29. package/dist/esm/schemas/plans.schema.mjs.map +1 -1
  30. package/dist/esm/schemas/project.schema.mjs.map +1 -1
  31. package/dist/esm/schemas/session.schema.mjs.map +1 -1
  32. package/dist/esm/schemas/tag.schema.mjs.map +1 -1
  33. package/dist/esm/schemas/user.schema.mjs.map +1 -1
  34. package/dist/esm/services/organization.service.mjs +1 -2
  35. package/dist/esm/services/organization.service.mjs.map +1 -1
  36. package/dist/esm/services/tag.service.mjs.map +1 -1
  37. package/dist/esm/utils/AI/aiSdk.mjs +2 -3
  38. package/dist/esm/utils/AI/aiSdk.mjs.map +1 -1
  39. package/dist/esm/utils/AI/askDocQuestion/askDocQuestion.mjs +1 -1
  40. package/dist/esm/utils/AI/askDocQuestion/askDocQuestion.mjs.map +1 -1
  41. package/dist/esm/utils/AI/askDocQuestion/embeddings.json +44076 -21504
  42. package/dist/esm/utils/AI/autocomplete/index.mjs +2 -5
  43. package/dist/esm/utils/AI/autocomplete/index.mjs.map +1 -1
  44. package/dist/esm/utils/errors/ErrorHandler.mjs +1 -1
  45. package/dist/esm/utils/errors/ErrorHandler.mjs.map +1 -1
  46. package/dist/esm/utils/permissions.mjs +1 -1
  47. package/dist/esm/utils/permissions.mjs.map +1 -1
  48. package/dist/esm/utils/rateLimiter.mjs.map +1 -1
  49. package/dist/types/models/dictionary.model.d.ts +1 -1
  50. package/dist/types/models/discussion.model.d.ts +1 -1
  51. package/dist/types/models/oAuth2.model.d.ts +1 -1
  52. package/dist/types/schemas/dictionary.schema.d.ts +2 -2
  53. package/dist/types/schemas/discussion.schema.d.ts +2 -2
  54. package/dist/types/schemas/oAuth2.schema.d.ts +2 -2
  55. package/dist/types/schemas/organization.schema.d.ts +3 -3
  56. package/dist/types/schemas/organization.schema.d.ts.map +1 -1
  57. package/dist/types/schemas/plans.schema.d.ts +2 -2
  58. package/dist/types/schemas/project.schema.d.ts +2 -2
  59. package/dist/types/schemas/session.schema.d.ts +3 -3
  60. package/dist/types/schemas/session.schema.d.ts.map +1 -1
  61. package/dist/types/schemas/tag.schema.d.ts +2 -2
  62. package/dist/types/schemas/user.schema.d.ts +2 -2
  63. package/dist/types/services/organization.service.d.ts.map +1 -1
  64. package/dist/types/services/tag.service.d.ts +1 -1
  65. package/dist/types/services/tag.service.d.ts.map +1 -1
  66. package/dist/types/utils/AI/aiSdk.d.ts +2 -3
  67. package/dist/types/utils/AI/aiSdk.d.ts.map +1 -1
  68. package/dist/types/utils/AI/autocomplete/index.d.ts.map +1 -1
  69. package/dist/types/utils/errors/ErrorHandler.d.ts +1 -1
  70. package/dist/types/utils/errors/ErrorHandler.d.ts.map +1 -1
  71. package/dist/types/utils/rateLimiter.d.ts +1 -1
  72. package/dist/types/utils/rateLimiter.d.ts.map +1 -1
  73. package/package.json +21 -21
@@ -10,8 +10,7 @@ const CHAT_GPT_PROMPT = getFileContent("./PROMPT.md");
10
10
  const aiDefaultOptions = {
11
11
  provider: AIProvider.OPENAI,
12
12
  model: "gpt-4o-mini",
13
- temperature: 0.7,
14
- maxTokens: 128
13
+ temperature: 0.7
15
14
  };
16
15
  const autocomplete = async ({
17
16
  text,
@@ -30,9 +29,7 @@ const autocomplete = async ({
30
29
  messages: [
31
30
  { role: "system", content: prompt },
32
31
  { role: "assistant", content: text }
33
- ],
34
- maxTokens: aiConfig.maxTokens ?? 128
35
- // Generate next tokens
32
+ ]
36
33
  });
37
34
  logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);
38
35
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/utils/AI/autocomplete/index.ts"],"sourcesContent":["import { logger } from '@logger';\nimport { generateText } from 'ai';\nimport { readFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { AIConfig, AIOptions, AIProvider } from '../aiSdk';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n// Get the content of a file at the specified path\nconst getFileContent = (filePath: string) =>\n readFileSync(join(__dirname, filePath), { encoding: 'utf-8' });\n\nexport type AutocompleteOptions = {\n text: string;\n aiConfig: AIConfig;\n applicationContext?: string;\n contextBefore?: string;\n currentLine?: string;\n contextAfter?: string;\n};\n\nexport type AutocompleteFileResultData = {\n autocompletion: string;\n tokenUsed: number;\n};\n\n// The prompt template to send to the AI model\nconst CHAT_GPT_PROMPT = getFileContent('./PROMPT.md');\n\nexport const aiDefaultOptions: AIOptions = {\n provider: AIProvider.OPENAI,\n model: 'gpt-4o-mini',\n temperature: 0.7,\n maxTokens: 128,\n};\n\n/**\n * Autocompletes a content declaration file by constructing a prompt for AI models.\n * The prompt includes details about the project's locales, file paths of content declarations,\n * and requests for identifying issues or inconsistencies.\n */\nexport const autocomplete = async ({\n text,\n aiConfig,\n applicationContext,\n contextBefore,\n currentLine,\n contextAfter,\n}: AutocompleteOptions): Promise<AutocompleteFileResultData | undefined> => {\n // Prepare the prompt for AI by replacing placeholders with actual values.\n const prompt = CHAT_GPT_PROMPT.replace(\n '{{applicationContext}}',\n applicationContext ?? ''\n )\n .replace('{{contextBefore}}', contextBefore ?? '')\n .replace('{{currentLine}}', currentLine ?? '')\n .replace('{{contextAfter}}', contextAfter ?? '');\n\n // Use the AI SDK to generate the completion\n const { text: newContent, usage } = await generateText({\n ...aiConfig,\n messages: [\n { role: 'system', content: prompt },\n { role: 'assistant', content: text },\n ],\n maxTokens: aiConfig.maxTokens ?? 128, // Generate next tokens\n });\n\n logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);\n\n return {\n autocompletion: newContent,\n tokenUsed: usage?.totalTokens ?? 0,\n };\n};\n"],"mappings":"AAAA,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAC9B,SAA8B,kBAAkB;AAEhD,MAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AAGxD,MAAM,iBAAiB,CAAC,aACtB,aAAa,KAAK,WAAW,QAAQ,GAAG,EAAE,UAAU,QAAQ,CAAC;AAiB/D,MAAM,kBAAkB,eAAe,aAAa;AAE7C,MAAM,mBAA8B;AAAA,EACzC,UAAU,WAAW;AAAA,EACrB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,WAAW;AACb;AAOO,MAAM,eAAe,OAAO;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4E;AAE1E,QAAM,SAAS,gBAAgB;AAAA,IAC7B;AAAA,IACA,sBAAsB;AAAA,EACxB,EACG,QAAQ,qBAAqB,iBAAiB,EAAE,EAChD,QAAQ,mBAAmB,eAAe,EAAE,EAC5C,QAAQ,oBAAoB,gBAAgB,EAAE;AAGjD,QAAM,EAAE,MAAM,YAAY,MAAM,IAAI,MAAM,aAAa;AAAA,IACrD,GAAG;AAAA,IACH,UAAU;AAAA,MACR,EAAE,MAAM,UAAU,SAAS,OAAO;AAAA,MAClC,EAAE,MAAM,aAAa,SAAS,KAAK;AAAA,IACrC;AAAA,IACA,WAAW,SAAS,aAAa;AAAA;AAAA,EACnC,CAAC;AAED,SAAO,KAAK,GAAG,OAAO,eAAe,CAAC,6BAA6B;AAEnE,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,WAAW,OAAO,eAAe;AAAA,EACnC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/utils/AI/autocomplete/index.ts"],"sourcesContent":["import { logger } from '@logger';\nimport { generateText } from 'ai';\nimport { readFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { AIConfig, AIOptions, AIProvider } from '../aiSdk';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n// Get the content of a file at the specified path\nconst getFileContent = (filePath: string) =>\n readFileSync(join(__dirname, filePath), { encoding: 'utf-8' });\n\nexport type AutocompleteOptions = {\n text: string;\n aiConfig: AIConfig;\n applicationContext?: string;\n contextBefore?: string;\n currentLine?: string;\n contextAfter?: string;\n};\n\nexport type AutocompleteFileResultData = {\n autocompletion: string;\n tokenUsed: number;\n};\n\n// The prompt template to send to the AI model\nconst CHAT_GPT_PROMPT = getFileContent('./PROMPT.md');\n\nexport const aiDefaultOptions: AIOptions = {\n provider: AIProvider.OPENAI,\n model: 'gpt-4o-mini',\n temperature: 0.7,\n};\n\n/**\n * Autocompletes a content declaration file by constructing a prompt for AI models.\n * The prompt includes details about the project's locales, file paths of content declarations,\n * and requests for identifying issues or inconsistencies.\n */\nexport const autocomplete = async ({\n text,\n aiConfig,\n applicationContext,\n contextBefore,\n currentLine,\n contextAfter,\n}: AutocompleteOptions): Promise<AutocompleteFileResultData | undefined> => {\n // Prepare the prompt for AI by replacing placeholders with actual values.\n const prompt = CHAT_GPT_PROMPT.replace(\n '{{applicationContext}}',\n applicationContext ?? ''\n )\n .replace('{{contextBefore}}', contextBefore ?? '')\n .replace('{{currentLine}}', currentLine ?? '')\n .replace('{{contextAfter}}', contextAfter ?? '');\n\n // Use the AI SDK to generate the completion\n const { text: newContent, usage } = await generateText({\n ...aiConfig,\n messages: [\n { role: 'system', content: prompt },\n { role: 'assistant', content: text },\n ],\n });\n\n logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);\n\n return {\n autocompletion: newContent,\n tokenUsed: usage?.totalTokens ?? 0,\n };\n};\n"],"mappings":"AAAA,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAC9B,SAA8B,kBAAkB;AAEhD,MAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AAGxD,MAAM,iBAAiB,CAAC,aACtB,aAAa,KAAK,WAAW,QAAQ,GAAG,EAAE,UAAU,QAAQ,CAAC;AAiB/D,MAAM,kBAAkB,eAAe,aAAa;AAE7C,MAAM,mBAA8B;AAAA,EACzC,UAAU,WAAW;AAAA,EACrB,OAAO;AAAA,EACP,aAAa;AACf;AAOO,MAAM,eAAe,OAAO;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4E;AAE1E,QAAM,SAAS,gBAAgB;AAAA,IAC7B;AAAA,IACA,sBAAsB;AAAA,EACxB,EACG,QAAQ,qBAAqB,iBAAiB,EAAE,EAChD,QAAQ,mBAAmB,eAAe,EAAE,EAC5C,QAAQ,oBAAoB,gBAAgB,EAAE;AAGjD,QAAM,EAAE,MAAM,YAAY,MAAM,IAAI,MAAM,aAAa;AAAA,IACrD,GAAG;AAAA,IACH,UAAU;AAAA,MACR,EAAE,MAAM,UAAU,SAAS,OAAO;AAAA,MAClC,EAAE,MAAM,aAAa,SAAS,KAAK;AAAA,IACrC;AAAA,EACF,CAAC;AAED,SAAO,KAAK,GAAG,OAAO,eAAe,CAAC,6BAA6B;AAEnE,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,WAAW,OAAO,eAAe;AAAA,EACnC;AACF;","names":[]}
@@ -1,7 +1,7 @@
1
+ import { HttpStatusCodes } from "./../../utils/httpStatusCodes.mjs";
1
2
  import { Locales } from "@intlayer/config";
2
3
  import { logger } from "./../../logger/index.mjs";
3
4
  import { formatPaginatedResponse, formatResponse } from "./../../utils/responseData.mjs";
4
- import { HttpStatusCodes } from "./../../export.mjs";
5
5
  import { t } from "express-intlayer";
6
6
  import { errorData } from "./errorCodes.mjs";
7
7
  class ErrorHandler {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/errors/ErrorHandler.ts"],"sourcesContent":["// Import required modules and types from their respective locations.\nimport { Locales } from '@intlayer/config';\nimport { logger } from '@logger';\nimport { formatPaginatedResponse, formatResponse } from '@utils/responseData';\nimport type { Response } from 'express';\n// @ts-ignore express-intlayer not build yet\nimport { type UserAPI, HttpStatusCodes } from '@/export';\nimport type { LanguageContent } from 'express-intlayer';\nimport { t } from 'express-intlayer';\nimport { type ErrorCodes, errorData } from './errorCodes';\nimport type { AppError } from './ErrorsClass';\n\n// Define a class named 'ErrorHandler' to encapsulate error handling logic.\nexport class ErrorHandler {\n /**\n * Handles generic error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param errorKey - A key representing the specific error.\n * @param statusCode - (Optional) A specific HTTP status code to use for the response.\n * @param isPaginatedResponse - Flag to determine if the response should be paginated.\n */\n static handleGenericErrorResponse(\n res: Response,\n errorKey: ErrorCodes,\n errorDetails?: object,\n statusCode?: HttpStatusCodes,\n isPaginatedResponse: boolean = false\n ) {\n const error = errorData[errorKey];\n const status = statusCode ?? error.statusCode; // Use the provided status code or default to the one in errorData.\n\n // Delegate to a more customizable error response handler.\n this.handleCustomErrorResponse(\n res,\n errorKey,\n error.title,\n error.message,\n errorDetails,\n status,\n isPaginatedResponse\n );\n }\n\n /**\n * Handles application-specific error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param error - The error object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param isPaginatedResponse - (Optional) Flag to determine if the response should be paginated.\n */\n static handleAppErrorResponse(\n res: Response,\n error: AppError,\n messageDetails?: object,\n isPaginatedResponse: boolean = false\n ) {\n if (!error.isAppError) {\n this.handleCustomErrorResponse(\n res,\n error.errorKey ?? 'UNKNOWN_ERROR',\n 'Error',\n error.message ?? JSON.stringify(error),\n undefined,\n error.httpStatusCode ?? HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n isPaginatedResponse\n );\n }\n\n const isMultilingual = error.isMultilingual ?? false;\n // Delegate to a more customizable error response handler.\n this.handleCustomErrorResponse(\n res,\n error.errorKey,\n isMultilingual ? error.multilingualTitle : error.title,\n isMultilingual ? error.multilingualMessage : error.message,\n error.messageDetails ?? messageDetails,\n error.httpStatusCode,\n isPaginatedResponse\n );\n }\n\n /**\n * Handles more customizable error responses with detailed error messages and codes.\n * @param res - The response object.\n * @param errorKey - Error code key used to fetch the corresponding message and default status.\n * @param message - The localized error message object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param statusCode - (Optional) HTTP status code, defaults to 500 if not specified.\n * @param isPaginatedResponse - Determines if the error should be part of a paginated response.\n */\n static handleCustomErrorResponse<T>(\n res: Response,\n errorKey: ErrorCodes | string,\n title: LanguageContent<string> | string,\n message: LanguageContent<string> | string,\n messageDetails?: object,\n statusCode?: HttpStatusCodes,\n isPaginatedResponse: boolean = false\n ) {\n const errorTitle = t(title as LanguageContent<string>, Locales.ENGLISH);\n const errorMessage = t(message as LanguageContent<string>, Locales.ENGLISH);\n logger.error(errorMessage, messageDetails); // Log the English version of the error message.\n const status = statusCode ?? HttpStatusCodes.INTERNAL_SERVER_ERROR_500; // Default to 500 if no status code is provided.\n\n if (isPaginatedResponse) {\n // Format the response as a paginated error response if requested.\n const responseData = formatPaginatedResponse<T>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n },\n status,\n });\n res.status(status).json(responseData);\n return;\n }\n\n // Format the response as a standard non-paginated error response.\n const responseData = formatResponse<UserAPI>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n ...messageDetails,\n },\n status,\n });\n\n res.status(status).json(responseData);\n }\n}\n"],"mappings":"AACA,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,yBAAyB,sBAAsB;AAGxD,SAAuB,uBAAuB;AAE9C,SAAS,SAAS;AAClB,SAA0B,iBAAiB;AAIpC,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQxB,OAAO,2BACL,KACA,UACA,cACA,YACA,sBAA+B,OAC/B;AACA,UAAM,QAAQ,UAAU,QAAQ;AAChC,UAAM,SAAS,cAAc,MAAM;AAGnC,SAAK;AAAA,MACH;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,uBACL,KACA,OACA,gBACA,sBAA+B,OAC/B;AACA,QAAI,CAAC,MAAM,YAAY;AACrB,WAAK;AAAA,QACH;AAAA,QACA,MAAM,YAAY;AAAA,QAClB;AAAA,QACA,MAAM,WAAW,KAAK,UAAU,KAAK;AAAA,QACrC;AAAA,QACA,MAAM,kBAAkB,gBAAgB;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,kBAAkB;AAE/C,SAAK;AAAA,MACH;AAAA,MACA,MAAM;AAAA,MACN,iBAAiB,MAAM,oBAAoB,MAAM;AAAA,MACjD,iBAAiB,MAAM,sBAAsB,MAAM;AAAA,MACnD,MAAM,kBAAkB;AAAA,MACxB,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,0BACL,KACA,UACA,OACA,SACA,gBACA,YACA,sBAA+B,OAC/B;AACA,UAAM,aAAa,EAAE,OAAkC,QAAQ,OAAO;AACtE,UAAM,eAAe,EAAE,SAAoC,QAAQ,OAAO;AAC1E,WAAO,MAAM,cAAc,cAAc;AACzC,UAAM,SAAS,cAAc,gBAAgB;AAE7C,QAAI,qBAAqB;AAEvB,YAAMA,gBAAe,wBAA2B;AAAA,QAC9C,OAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,OAAO,MAAM,EAAE,KAAKA,aAAY;AACpC;AAAA,IACF;AAGA,UAAM,eAAe,eAAwB;AAAA,MAC3C,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,SAAS;AAAA,QACT,GAAG;AAAA,MACL;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,OAAO,MAAM,EAAE,KAAK,YAAY;AAAA,EACtC;AACF;","names":["responseData"]}
1
+ {"version":3,"sources":["../../../../src/utils/errors/ErrorHandler.ts"],"sourcesContent":["// Import required modules and types from their respective locations.\nimport type { UserAPI } from '@/types/user.types';\nimport { HttpStatusCodes } from '@/utils/httpStatusCodes';\nimport { Locales } from '@intlayer/config';\nimport { logger } from '@logger';\nimport { formatPaginatedResponse, formatResponse } from '@utils/responseData';\nimport type { Response } from 'express';\n// @ts-ignore express-intlayer not build yet\nimport type { LanguageContent } from 'express-intlayer';\nimport { t } from 'express-intlayer';\nimport { type ErrorCodes, errorData } from './errorCodes';\nimport type { AppError } from './ErrorsClass';\n\n// Define a class named 'ErrorHandler' to encapsulate error handling logic.\nexport class ErrorHandler {\n /**\n * Handles generic error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param errorKey - A key representing the specific error.\n * @param statusCode - (Optional) A specific HTTP status code to use for the response.\n * @param isPaginatedResponse - Flag to determine if the response should be paginated.\n */\n static handleGenericErrorResponse(\n res: Response,\n errorKey: ErrorCodes,\n errorDetails?: object,\n statusCode?: HttpStatusCodes,\n isPaginatedResponse: boolean = false\n ) {\n const error = errorData[errorKey];\n const status = statusCode ?? error.statusCode; // Use the provided status code or default to the one in errorData.\n\n // Delegate to a more customizable error response handler.\n this.handleCustomErrorResponse(\n res,\n errorKey,\n error.title,\n error.message,\n errorDetails,\n status,\n isPaginatedResponse\n );\n }\n\n /**\n * Handles application-specific error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param error - The error object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param isPaginatedResponse - (Optional) Flag to determine if the response should be paginated.\n */\n static handleAppErrorResponse(\n res: Response,\n error: AppError,\n messageDetails?: object,\n isPaginatedResponse: boolean = false\n ) {\n if (!error.isAppError) {\n this.handleCustomErrorResponse(\n res,\n error.errorKey ?? 'UNKNOWN_ERROR',\n 'Error',\n error.message ?? JSON.stringify(error),\n undefined,\n error.httpStatusCode ?? HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n isPaginatedResponse\n );\n }\n\n const isMultilingual = error.isMultilingual ?? false;\n // Delegate to a more customizable error response handler.\n this.handleCustomErrorResponse(\n res,\n error.errorKey,\n isMultilingual ? error.multilingualTitle : error.title,\n isMultilingual ? error.multilingualMessage : error.message,\n error.messageDetails ?? messageDetails,\n error.httpStatusCode,\n isPaginatedResponse\n );\n }\n\n /**\n * Handles more customizable error responses with detailed error messages and codes.\n * @param res - The response object.\n * @param errorKey - Error code key used to fetch the corresponding message and default status.\n * @param message - The localized error message object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param statusCode - (Optional) HTTP status code, defaults to 500 if not specified.\n * @param isPaginatedResponse - Determines if the error should be part of a paginated response.\n */\n static handleCustomErrorResponse<T>(\n res: Response,\n errorKey: ErrorCodes | string,\n title: LanguageContent<string> | string,\n message: LanguageContent<string> | string,\n messageDetails?: object,\n statusCode?: HttpStatusCodes,\n isPaginatedResponse: boolean = false\n ) {\n const errorTitle = t(title as LanguageContent<string>, Locales.ENGLISH);\n const errorMessage = t(message as LanguageContent<string>, Locales.ENGLISH);\n logger.error(errorMessage, messageDetails); // Log the English version of the error message.\n const status = statusCode ?? HttpStatusCodes.INTERNAL_SERVER_ERROR_500; // Default to 500 if no status code is provided.\n\n if (isPaginatedResponse) {\n // Format the response as a paginated error response if requested.\n const responseData = formatPaginatedResponse<T>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n },\n status,\n });\n res.status(status).json(responseData);\n return;\n }\n\n // Format the response as a standard non-paginated error response.\n const responseData = formatResponse<UserAPI>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n ...messageDetails,\n },\n status,\n });\n\n res.status(status).json(responseData);\n }\n}\n"],"mappings":"AAEA,SAAS,uBAAuB;AAChC,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,yBAAyB,sBAAsB;AAIxD,SAAS,SAAS;AAClB,SAA0B,iBAAiB;AAIpC,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQxB,OAAO,2BACL,KACA,UACA,cACA,YACA,sBAA+B,OAC/B;AACA,UAAM,QAAQ,UAAU,QAAQ;AAChC,UAAM,SAAS,cAAc,MAAM;AAGnC,SAAK;AAAA,MACH;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,uBACL,KACA,OACA,gBACA,sBAA+B,OAC/B;AACA,QAAI,CAAC,MAAM,YAAY;AACrB,WAAK;AAAA,QACH;AAAA,QACA,MAAM,YAAY;AAAA,QAClB;AAAA,QACA,MAAM,WAAW,KAAK,UAAU,KAAK;AAAA,QACrC;AAAA,QACA,MAAM,kBAAkB,gBAAgB;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,kBAAkB;AAE/C,SAAK;AAAA,MACH;AAAA,MACA,MAAM;AAAA,MACN,iBAAiB,MAAM,oBAAoB,MAAM;AAAA,MACjD,iBAAiB,MAAM,sBAAsB,MAAM;AAAA,MACnD,MAAM,kBAAkB;AAAA,MACxB,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,0BACL,KACA,UACA,OACA,SACA,gBACA,YACA,sBAA+B,OAC/B;AACA,UAAM,aAAa,EAAE,OAAkC,QAAQ,OAAO;AACtE,UAAM,eAAe,EAAE,SAAoC,QAAQ,OAAO;AAC1E,WAAO,MAAM,cAAc,cAAc;AACzC,UAAM,SAAS,cAAc,gBAAgB;AAE7C,QAAI,qBAAqB;AAEvB,YAAMA,gBAAe,wBAA2B;AAAA,QAC9C,OAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,OAAO,MAAM,EAAE,KAAKA,aAAY;AACpC;AAAA,IACF;AAGA,UAAM,eAAe,eAAwB;AAAA,MAC3C,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,SAAS;AAAA,QACT,GAAG;AAAA,MACL;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,OAAO,MAAM,EAAE,KAAK,YAAY;AAAA,EACtC;AACF;","names":["responseData"]}
@@ -221,7 +221,7 @@ const hasPermission = (roles, permission) => {
221
221
  const rolesCheck = roles.map(
222
222
  (role) => ROLE_POLICY[role]?.[permission] ?? (() => false)
223
223
  );
224
- return (args) => rolesCheck.some((check) => check(args));
224
+ return ((args) => rolesCheck.some((check) => check(args)));
225
225
  };
226
226
  export {
227
227
  ROLE_POLICY,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/permissions.ts"],"sourcesContent":["import { Dictionary, DictionaryAPI } from '@/types/dictionary.types';\nimport { Organization, OrganizationAPI } from '@/types/organization.types';\nimport { Project, ProjectAPI } from '@/types/project.types';\nimport { SessionContext } from '@/types/session.types';\nimport { Tag, TagAPI } from '@/types/tag.types';\nimport { User, UserAPI } from '@/types/user.types';\n\n/**\n * A named grouping of privileges (e.g. `\"org_admin\"`).\n * Users are *granted* one or more Roles.\n */\nexport type Roles =\n | 'user'\n | 'admin'\n | 'org_admin'\n | 'org_user'\n | 'project_admin'\n | 'project_user'\n | 'project_reviewer';\n\n/**\n * An atomic operation that can be performed on a resource.\n * - **read**: view or list\n * - **write**: create or update\n * - **admin**: delete or change permissions\n */\nexport type Action = 'read' | 'write' | 'admin';\n\n/**\n * A first‑class entity in your domain model that you want to protect.\n */\nexport type Resource = {\n organization: Organization;\n project: Project;\n dictionary: Dictionary;\n tag: Tag;\n user: User;\n};\n\n/**\n * A literal string combining a Resource and an Action, e.g. `\"project:write\"`.\n * This is the *unit* checked at runtime in your middleware.\n */\nexport type Permission = `${keyof Resource}:${Action}`;\n\ntype CheckPrivilege = (\n args: any\n) => boolean | undefined | Promise<boolean> | Promise<undefined>;\n\ntype RolePolicy = Record<Roles, Partial<Record<Permission, CheckPrivilege>>>;\n\nexport const ROLE_POLICY = {\n admin: {\n 'organization:read': () => true,\n 'organization:write': () => true,\n 'organization:admin': () => true,\n 'project:read': () => true,\n 'project:write': () => true,\n 'project:admin': () => true,\n 'dictionary:read': () => true,\n 'dictionary:write': () => true,\n 'dictionary:admin': () => true,\n 'tag:read': () => true,\n 'tag:write': () => true,\n 'tag:admin': () => true,\n 'user:read': () => true,\n 'user:write': () => true,\n 'user:admin': () => true,\n },\n user: {\n 'user:read': ({\n user,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every(\n (targetUser) =>\n String(targetUser.id) === String(user?.id) &&\n targetUser.email === user?.email\n ),\n 'user:write': ({\n user,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every(\n (targetUser) =>\n String(targetUser.id) === String(user?.id) &&\n targetUser.email === user?.email\n ),\n 'user:admin': ({\n user,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every(\n (targetUser) =>\n String(targetUser.id) === String(user?.id) &&\n targetUser.email === user?.email\n ),\n 'organization:read': ({\n user,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every((organization) =>\n organization?.membersIds?.map(String).includes(String(user?.id))\n ),\n },\n org_admin: {\n 'organization:read': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n 'organization:write': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n 'organization:admin': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n\n 'project:read': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'project:write': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'project:admin': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n\n 'tag:read': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'tag:write': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'tag:admin': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n\n 'user:write': ({\n organization,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n organization?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n },\n org_user: {\n 'organization:read': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n\n 'project:read': ({\n user,\n targetProjects,\n }: SessionContext & {\n targetProjects: (Project | ProjectAPI)[];\n }) =>\n targetProjects?.every((project) =>\n project?.membersIds?.map(String).includes(String(user?.id))\n ),\n\n 'user:read': ({\n organization,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n organization?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n },\n project_admin: {\n 'project:read': ({\n project,\n targetProjectIds,\n }: SessionContext & {\n targetProjectIds?: (Project | ProjectAPI)['id'][];\n }) =>\n targetProjectIds?.every(\n (projectId) => String(project?.id) === String(projectId)\n ),\n 'project:write': ({\n project,\n targetProjectIds,\n }: SessionContext & {\n targetProjectIds?: (Project | ProjectAPI)['id'][];\n }) =>\n targetProjectIds?.every(\n (projectId) => String(project?.id) === String(projectId)\n ),\n 'project:admin': ({\n project,\n targetProjectIds,\n }: SessionContext & {\n targetProjectIds?: (Project | ProjectAPI)['id'][];\n }) =>\n targetProjectIds?.every(\n (projectId) => String(project?.id) === String(projectId)\n ),\n\n 'tag:read': ({\n project,\n targetTags,\n }: SessionContext & { targetTags: (Tag | TagAPI)[] }) =>\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:write': ({\n project,\n targetTags,\n }: SessionContext & { targetTags: (Tag | TagAPI)[] }) =>\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:admin': ({\n project,\n targetTags,\n }: SessionContext & { targetTags: (Tag | TagAPI)[] }) =>\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n\n 'user:write': ({\n project,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n project?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n\n 'dictionary:read': ({ project, user }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n 'dictionary:write': ({ project, user }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n 'dictionary:admin': ({ project, user }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n },\n project_user: {\n 'project:read': ({ user, organization, project }: SessionContext) =>\n String(organization?.id) === String(project?.organizationId) &&\n organization?.membersIds?.map(String).includes(String(user?.id)) &&\n project?.membersIds?.map(String).includes(String(user?.id)),\n\n 'dictionary:read': ({\n user,\n project,\n targetDictionaries,\n }: SessionContext & {\n targetDictionaries: (Dictionary | DictionaryAPI)[];\n }) =>\n project?.membersIds?.map(String).includes(String(user?.id)) &&\n targetDictionaries.every((dictionary) =>\n dictionary?.projectIds?.map(String).includes(String(project?.id))\n ),\n 'dictionary:write': ({ user, project }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n\n 'tag:read': ({\n project,\n targetTags,\n user,\n }: SessionContext & {\n targetTags: (Tag | TagAPI)[];\n }) =>\n project?.membersIds?.map(String).includes(String(user?.id)) &&\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:write': ({\n project,\n targetTags,\n user,\n }: SessionContext & {\n targetTags: (Tag | TagAPI)[];\n }) =>\n project?.membersIds?.map(String).includes(String(user?.id)) &&\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:admin': ({\n user,\n project,\n targetTags,\n }: SessionContext & {\n targetTags: (Tag | TagAPI)[];\n }) =>\n project?.adminsIds?.map(String).includes(String(user?.id)) &&\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n\n 'user:read': ({\n project,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n project?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n },\n project_reviewer: {\n 'dictionary:read': ({ user, project }: SessionContext) =>\n project?.membersIds?.map(String).includes(String(user?.id)),\n 'dictionary:write': ({ user, project }: SessionContext) =>\n project?.membersIds?.map(String).includes(String(user?.id)),\n\n 'tag:read': () => true,\n },\n} as const satisfies RolePolicy;\n\nexport const getSessionRoles = ({\n user,\n organization,\n project,\n}: SessionContext): Roles[] => {\n const roles: Roles[] = [];\n\n if (!user) {\n return roles;\n }\n\n roles.push('user');\n\n const isUserAdmin = user.role === 'admin';\n\n if (isUserAdmin) {\n roles.push('admin');\n }\n\n if (!organization) {\n return roles;\n }\n\n const isOrganizationAdmin = organization.adminsIds\n ?.map(String)\n .includes(String(user!.id));\n\n if (isOrganizationAdmin) {\n roles.push('org_admin');\n }\n\n const isOrganizationMember = organization.membersIds\n ?.map(String)\n .includes(String(user!.id));\n\n if (isOrganizationMember) {\n roles.push('org_user');\n }\n\n if (!project) {\n return roles;\n }\n\n const isProjectAdmin = project.adminsIds\n ?.map(String)\n .includes(String(user!.id));\n\n if (isProjectAdmin) {\n roles.push('project_admin');\n }\n\n const isProjectMember = project?.membersIds\n ?.map(String)\n .includes(String(user!.id));\n\n if (isProjectMember) {\n roles.push('project_user');\n }\n\n // const isProjectReviewer =\n // session.project?.reviewersIds?.includes(session.user!.id);\n\n // if (isProjectReviewer) {\n // roles.push('project_reviewer');\n // }\n\n return roles;\n};\n\nexport const computeEffectivePermission = (roles: Roles[]): Permission[] =>\n Array.from(\n new Set(\n roles.flatMap((role) => Object.keys(ROLE_POLICY[role]) as Permission[])\n )\n );\n\n/**\n * Intersect two permission lists\n * @param permissionList1 - The first permission list\n * @param permissionList2 - The second permission list\n * @returns The intersection of the two permission lists (only permissions present in both)\n */\nexport const intersectPermissions = (\n permissions1: Permission[],\n permissions2: Permission[]\n): Permission[] =>\n permissions1.filter((permission) => permissions2.includes(permission));\n\ntype PermissionResult<\n R extends Roles,\n P extends Permission,\n> = (typeof ROLE_POLICY)[R] extends infer RolePerms\n ? RolePerms extends Record<string, (args: any) => any>\n ? P extends keyof RolePerms\n ? RolePerms[P] extends undefined\n ? never\n : RolePerms[P]\n : never\n : never\n : never;\n\nexport const hasPermission = <P extends Permission>(\n roles: Roles[],\n permission: P\n): PermissionResult<Roles, P> => {\n const rolesCheck: any = roles.map(\n (role) =>\n ROLE_POLICY[role]?.[\n permission as keyof (typeof ROLE_POLICY)[typeof role]\n ] ?? (() => false)\n ) as unknown as PermissionResult<Roles, P>[];\n\n return ((args: any) => rolesCheck.some((check: any) => check(args))) as any;\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/permissions.ts"],"sourcesContent":["import { Dictionary, DictionaryAPI } from '@/types/dictionary.types';\nimport { Organization, OrganizationAPI } from '@/types/organization.types';\nimport { Project, ProjectAPI } from '@/types/project.types';\nimport { SessionContext } from '@/types/session.types';\nimport { Tag, TagAPI } from '@/types/tag.types';\nimport { User, UserAPI } from '@/types/user.types';\n\n/**\n * A named grouping of privileges (e.g. `\"org_admin\"`).\n * Users are *granted* one or more Roles.\n */\nexport type Roles =\n | 'user'\n | 'admin'\n | 'org_admin'\n | 'org_user'\n | 'project_admin'\n | 'project_user'\n | 'project_reviewer';\n\n/**\n * An atomic operation that can be performed on a resource.\n * - **read**: view or list\n * - **write**: create or update\n * - **admin**: delete or change permissions\n */\nexport type Action = 'read' | 'write' | 'admin';\n\n/**\n * A first‑class entity in your domain model that you want to protect.\n */\nexport type Resource = {\n organization: Organization;\n project: Project;\n dictionary: Dictionary;\n tag: Tag;\n user: User;\n};\n\n/**\n * A literal string combining a Resource and an Action, e.g. `\"project:write\"`.\n * This is the *unit* checked at runtime in your middleware.\n */\nexport type Permission = `${keyof Resource}:${Action}`;\n\ntype CheckPrivilege = (\n args: any\n) => boolean | undefined | Promise<boolean> | Promise<undefined>;\n\ntype RolePolicy = Record<Roles, Partial<Record<Permission, CheckPrivilege>>>;\n\nexport const ROLE_POLICY = {\n admin: {\n 'organization:read': () => true,\n 'organization:write': () => true,\n 'organization:admin': () => true,\n 'project:read': () => true,\n 'project:write': () => true,\n 'project:admin': () => true,\n 'dictionary:read': () => true,\n 'dictionary:write': () => true,\n 'dictionary:admin': () => true,\n 'tag:read': () => true,\n 'tag:write': () => true,\n 'tag:admin': () => true,\n 'user:read': () => true,\n 'user:write': () => true,\n 'user:admin': () => true,\n },\n user: {\n 'user:read': ({\n user,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every(\n (targetUser) =>\n String(targetUser.id) === String(user?.id) &&\n targetUser.email === user?.email\n ),\n 'user:write': ({\n user,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every(\n (targetUser) =>\n String(targetUser.id) === String(user?.id) &&\n targetUser.email === user?.email\n ),\n 'user:admin': ({\n user,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every(\n (targetUser) =>\n String(targetUser.id) === String(user?.id) &&\n targetUser.email === user?.email\n ),\n 'organization:read': ({\n user,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every((organization) =>\n organization?.membersIds?.map(String).includes(String(user?.id))\n ),\n },\n org_admin: {\n 'organization:read': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n 'organization:write': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n 'organization:admin': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n\n 'project:read': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'project:write': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'project:admin': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n\n 'tag:read': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'tag:write': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'tag:admin': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n\n 'user:write': ({\n organization,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n organization?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n },\n org_user: {\n 'organization:read': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n\n 'project:read': ({\n user,\n targetProjects,\n }: SessionContext & {\n targetProjects: (Project | ProjectAPI)[];\n }) =>\n targetProjects?.every((project) =>\n project?.membersIds?.map(String).includes(String(user?.id))\n ),\n\n 'user:read': ({\n organization,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n organization?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n },\n project_admin: {\n 'project:read': ({\n project,\n targetProjectIds,\n }: SessionContext & {\n targetProjectIds?: (Project | ProjectAPI)['id'][];\n }) =>\n targetProjectIds?.every(\n (projectId) => String(project?.id) === String(projectId)\n ),\n 'project:write': ({\n project,\n targetProjectIds,\n }: SessionContext & {\n targetProjectIds?: (Project | ProjectAPI)['id'][];\n }) =>\n targetProjectIds?.every(\n (projectId) => String(project?.id) === String(projectId)\n ),\n 'project:admin': ({\n project,\n targetProjectIds,\n }: SessionContext & {\n targetProjectIds?: (Project | ProjectAPI)['id'][];\n }) =>\n targetProjectIds?.every(\n (projectId) => String(project?.id) === String(projectId)\n ),\n\n 'tag:read': ({\n project,\n targetTags,\n }: SessionContext & { targetTags: (Tag | TagAPI)[] }) =>\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:write': ({\n project,\n targetTags,\n }: SessionContext & { targetTags: (Tag | TagAPI)[] }) =>\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:admin': ({\n project,\n targetTags,\n }: SessionContext & { targetTags: (Tag | TagAPI)[] }) =>\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n\n 'user:write': ({\n project,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n project?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n\n 'dictionary:read': ({ project, user }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n 'dictionary:write': ({ project, user }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n 'dictionary:admin': ({ project, user }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n },\n project_user: {\n 'project:read': ({ user, organization, project }: SessionContext) =>\n String(organization?.id) === String(project?.organizationId) &&\n organization?.membersIds?.map(String).includes(String(user?.id)) &&\n project?.membersIds?.map(String).includes(String(user?.id)),\n\n 'dictionary:read': ({\n user,\n project,\n targetDictionaries,\n }: SessionContext & {\n targetDictionaries: (Dictionary | DictionaryAPI)[];\n }) =>\n project?.membersIds?.map(String).includes(String(user?.id)) &&\n targetDictionaries.every((dictionary) =>\n dictionary?.projectIds?.map(String).includes(String(project?.id))\n ),\n 'dictionary:write': ({ user, project }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n\n 'tag:read': ({\n project,\n targetTags,\n user,\n }: SessionContext & {\n targetTags: (Tag | TagAPI)[];\n }) =>\n project?.membersIds?.map(String).includes(String(user?.id)) &&\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:write': ({\n project,\n targetTags,\n user,\n }: SessionContext & {\n targetTags: (Tag | TagAPI)[];\n }) =>\n project?.membersIds?.map(String).includes(String(user?.id)) &&\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:admin': ({\n user,\n project,\n targetTags,\n }: SessionContext & {\n targetTags: (Tag | TagAPI)[];\n }) =>\n project?.adminsIds?.map(String).includes(String(user?.id)) &&\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n\n 'user:read': ({\n project,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n project?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n },\n project_reviewer: {\n 'dictionary:read': ({ user, project }: SessionContext) =>\n project?.membersIds?.map(String).includes(String(user?.id)),\n 'dictionary:write': ({ user, project }: SessionContext) =>\n project?.membersIds?.map(String).includes(String(user?.id)),\n\n 'tag:read': () => true,\n },\n} as const satisfies RolePolicy;\n\nexport const getSessionRoles = ({\n user,\n organization,\n project,\n}: SessionContext): Roles[] => {\n const roles: Roles[] = [];\n\n if (!user) {\n return roles;\n }\n\n roles.push('user');\n\n const isUserAdmin = user.role === 'admin';\n\n if (isUserAdmin) {\n roles.push('admin');\n }\n\n if (!organization) {\n return roles;\n }\n\n const isOrganizationAdmin = organization.adminsIds\n ?.map(String)\n .includes(String(user!.id));\n\n if (isOrganizationAdmin) {\n roles.push('org_admin');\n }\n\n const isOrganizationMember = organization.membersIds\n ?.map(String)\n .includes(String(user!.id));\n\n if (isOrganizationMember) {\n roles.push('org_user');\n }\n\n if (!project) {\n return roles;\n }\n\n const isProjectAdmin = project.adminsIds\n ?.map(String)\n .includes(String(user!.id));\n\n if (isProjectAdmin) {\n roles.push('project_admin');\n }\n\n const isProjectMember = project?.membersIds\n ?.map(String)\n .includes(String(user!.id));\n\n if (isProjectMember) {\n roles.push('project_user');\n }\n\n // const isProjectReviewer =\n // session.project?.reviewersIds?.includes(session.user!.id);\n\n // if (isProjectReviewer) {\n // roles.push('project_reviewer');\n // }\n\n return roles;\n};\n\nexport const computeEffectivePermission = (roles: Roles[]): Permission[] =>\n Array.from(\n new Set(\n roles.flatMap((role) => Object.keys(ROLE_POLICY[role]) as Permission[])\n )\n );\n\n/**\n * Intersect two permission lists\n * @param permissionList1 - The first permission list\n * @param permissionList2 - The second permission list\n * @returns The intersection of the two permission lists (only permissions present in both)\n */\nexport const intersectPermissions = (\n permissions1: Permission[],\n permissions2: Permission[]\n): Permission[] =>\n permissions1.filter((permission) => permissions2.includes(permission));\n\ntype PermissionResult<\n R extends Roles,\n P extends Permission,\n> = (typeof ROLE_POLICY)[R] extends infer RolePerms\n ? RolePerms extends Record<string, (args: any) => any>\n ? P extends keyof RolePerms\n ? RolePerms[P] extends undefined\n ? never\n : RolePerms[P]\n : never\n : never\n : never;\n\nexport const hasPermission = <P extends Permission>(\n roles: Roles[],\n permission: P\n): PermissionResult<Roles, P> => {\n const rolesCheck: any = roles.map(\n (role) =>\n ROLE_POLICY[role]?.[\n permission as keyof (typeof ROLE_POLICY)[typeof role]\n ] ?? (() => false)\n ) as unknown as PermissionResult<Roles, P>[];\n\n return ((args: any) => rolesCheck.some((check: any) => check(args))) as any;\n};\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/rateLimiter.ts"],"sourcesContent":["import type { NextFunction, Request, Response } from 'express';\nimport rateLimit from 'express-rate-limit';\nimport { ErrorHandler } from './errors';\n\n// -------------------------------------------------------------\n// Create the rate-limiter instances once at module load-time so\n// that the hit counters are shared across every incoming request.\n// -------------------------------------------------------------\n\nexport const ipLimiter: (\n req: Request,\n res: Response,\n next: NextFunction\n) => void | Promise<void> = rateLimit({\n windowMs: 60 * 1000, // 1-minute window\n limit: 500, // 500 requests / IP / window\n standardHeaders: 'draft-8',\n legacyHeaders: false,\n // Use a custom key generator that handles proxy headers securely\n keyGenerator: (req) => {\n // Use the real IP address, falling back to socket remote address\n return req.ip ?? req.socket?.remoteAddress ?? 'unknown';\n },\n handler: (req, res, _next) => {\n const { limit, remaining, resetTime } = (req as any).rateLimit;\n\n ErrorHandler.handleGenericErrorResponse(res, 'RATE_LIMIT_EXCEEDED', {\n limit: `${limit} per minute`,\n retryAfter: Math.ceil((resetTime!.getTime() - Date.now()) / 1000),\n remaining,\n });\n },\n});\n\nexport const unauthenticatedChatBotLimiter: (\n req: Request,\n res: Response,\n next: NextFunction\n) => any = rateLimit({\n windowMs: 60 * 60 * 1000, // 1-hour window\n limit: 3, // 3 requests / IP / window\n standardHeaders: 'draft-8',\n skip: (_req, res) => Boolean(res.locals.user), // authenticated? then skip\n legacyHeaders: false,\n // Use a custom key generator that handles proxy headers securely\n keyGenerator: (req) => {\n // Use the real IP address, falling back to socket remote address\n return req.ip ?? req.socket?.remoteAddress ?? 'unknown';\n },\n handler: (req, res) => {\n const { limit, remaining, resetTime } = (req as any).rateLimit;\n\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'RATE_LIMIT_EXCEEDED_UNAUTHENTICATED',\n {\n limit: `${limit} per hour`,\n retryAfter: Math.ceil((resetTime!.getTime() - Date.now()) / 1000),\n remaining,\n }\n );\n },\n});\n"],"mappings":"AACA,OAAO,eAAe;AACtB,SAAS,oBAAoB;AAOtB,MAAM,YAIe,UAAU;AAAA,EACpC,UAAU,KAAK;AAAA;AAAA,EACf,OAAO;AAAA;AAAA,EACP,iBAAiB;AAAA,EACjB,eAAe;AAAA;AAAA,EAEf,cAAc,CAAC,QAAQ;AAErB,WAAO,IAAI,MAAM,IAAI,QAAQ,iBAAiB;AAAA,EAChD;AAAA,EACA,SAAS,CAAC,KAAK,KAAK,UAAU;AAC5B,UAAM,EAAE,OAAO,WAAW,UAAU,IAAK,IAAY;AAErD,iBAAa,2BAA2B,KAAK,uBAAuB;AAAA,MAClE,OAAO,GAAG,KAAK;AAAA,MACf,YAAY,KAAK,MAAM,UAAW,QAAQ,IAAI,KAAK,IAAI,KAAK,GAAI;AAAA,MAChE;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;AAEM,MAAM,gCAIF,UAAU;AAAA,EACnB,UAAU,KAAK,KAAK;AAAA;AAAA,EACpB,OAAO;AAAA;AAAA,EACP,iBAAiB;AAAA,EACjB,MAAM,CAAC,MAAM,QAAQ,QAAQ,IAAI,OAAO,IAAI;AAAA;AAAA,EAC5C,eAAe;AAAA;AAAA,EAEf,cAAc,CAAC,QAAQ;AAErB,WAAO,IAAI,MAAM,IAAI,QAAQ,iBAAiB;AAAA,EAChD;AAAA,EACA,SAAS,CAAC,KAAK,QAAQ;AACrB,UAAM,EAAE,OAAO,WAAW,UAAU,IAAK,IAAY;AAErD,iBAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO,GAAG,KAAK;AAAA,QACf,YAAY,KAAK,MAAM,UAAW,QAAQ,IAAI,KAAK,IAAI,KAAK,GAAI;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/rateLimiter.ts"],"sourcesContent":["import type { NextFunction, Request, Response } from 'express';\nimport rateLimit from 'express-rate-limit';\nimport { ErrorHandler } from './errors';\n\n// -------------------------------------------------------------\n// Create the rate-limiter instances once at module load-time so\n// that the hit counters are shared across every incoming request.\n// -------------------------------------------------------------\n\nexport const ipLimiter: (\n req: Request,\n res: Response,\n next: NextFunction\n) => unknown = rateLimit({\n windowMs: 60 * 1000, // 1-minute window\n limit: 500, // 500 requests / IP / window\n standardHeaders: 'draft-8',\n legacyHeaders: false,\n // Use a custom key generator that handles proxy headers securely\n keyGenerator: (req) => {\n // Use the real IP address, falling back to socket remote address\n return req.ip ?? req.socket?.remoteAddress ?? 'unknown';\n },\n handler: (req, res, _next) => {\n const { limit, remaining, resetTime } = (req as any).rateLimit;\n\n ErrorHandler.handleGenericErrorResponse(res, 'RATE_LIMIT_EXCEEDED', {\n limit: `${limit} per minute`,\n retryAfter: Math.ceil((resetTime!.getTime() - Date.now()) / 1000),\n remaining,\n });\n },\n});\n\nexport const unauthenticatedChatBotLimiter: (\n req: Request,\n res: Response,\n next: NextFunction\n) => any = rateLimit({\n windowMs: 60 * 60 * 1000, // 1-hour window\n limit: 3, // 3 requests / IP / window\n standardHeaders: 'draft-8',\n skip: (_req, res) => Boolean(res.locals.user), // authenticated? then skip\n legacyHeaders: false,\n // Use a custom key generator that handles proxy headers securely\n keyGenerator: (req) => {\n // Use the real IP address, falling back to socket remote address\n return req.ip ?? req.socket?.remoteAddress ?? 'unknown';\n },\n handler: (req, res) => {\n const { limit, remaining, resetTime } = (req as any).rateLimit;\n\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'RATE_LIMIT_EXCEEDED_UNAUTHENTICATED',\n {\n limit: `${limit} per hour`,\n retryAfter: Math.ceil((resetTime!.getTime() - Date.now()) / 1000),\n remaining,\n }\n );\n },\n});\n"],"mappings":"AACA,OAAO,eAAe;AACtB,SAAS,oBAAoB;AAOtB,MAAM,YAIE,UAAU;AAAA,EACvB,UAAU,KAAK;AAAA;AAAA,EACf,OAAO;AAAA;AAAA,EACP,iBAAiB;AAAA,EACjB,eAAe;AAAA;AAAA,EAEf,cAAc,CAAC,QAAQ;AAErB,WAAO,IAAI,MAAM,IAAI,QAAQ,iBAAiB;AAAA,EAChD;AAAA,EACA,SAAS,CAAC,KAAK,KAAK,UAAU;AAC5B,UAAM,EAAE,OAAO,WAAW,UAAU,IAAK,IAAY;AAErD,iBAAa,2BAA2B,KAAK,uBAAuB;AAAA,MAClE,OAAO,GAAG,KAAK;AAAA,MACf,YAAY,KAAK,MAAM,UAAW,QAAQ,IAAI,KAAK,IAAI,KAAK,GAAI;AAAA,MAChE;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;AAEM,MAAM,gCAIF,UAAU;AAAA,EACnB,UAAU,KAAK,KAAK;AAAA;AAAA,EACpB,OAAO;AAAA;AAAA,EACP,iBAAiB;AAAA,EACjB,MAAM,CAAC,MAAM,QAAQ,QAAQ,IAAI,OAAO,IAAI;AAAA;AAAA,EAC5C,eAAe;AAAA;AAAA,EAEf,cAAc,CAAC,QAAQ;AAErB,WAAO,IAAI,MAAM,IAAI,QAAQ,iBAAiB;AAAA,EAChD;AAAA,EACA,SAAS,CAAC,KAAK,QAAQ;AACrB,UAAM,EAAE,OAAO,WAAW,UAAU,IAAK,IAAY;AAErD,iBAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO,GAAG,KAAK;AAAA,QACf,YAAY,KAAK,MAAM,UAAW,QAAQ,IAAI,KAAK,IAAI,KAAK,GAAI;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import type { Dictionary } from '../types/dictionary.types';
2
2
  import { Model } from 'mongoose';
3
- export declare const DictionaryModel: Model<Dictionary, {}, {}, {}, import("mongoose").Document<unknown, {}, Dictionary, {}> & import("../types/dictionary.types").DictionaryData & {
3
+ export declare const DictionaryModel: Model<Dictionary, {}, {}, {}, import("mongoose").Document<unknown, {}, Dictionary, {}, {}> & import("../types/dictionary.types").DictionaryData & {
4
4
  id: import("mongoose").Types.ObjectId;
5
5
  createdAt: number;
6
6
  updatedAt: number;
@@ -1,6 +1,6 @@
1
1
  import type { Discussion } from '../types/discussion.types';
2
2
  import { Model } from 'mongoose';
3
- export declare const DiscussionModel: Model<Discussion, {}, {}, {}, import("mongoose").Document<unknown, {}, Discussion, {}> & Discussion & Required<{
3
+ export declare const DiscussionModel: Model<Discussion, {}, {}, {}, import("mongoose").Document<unknown, {}, Discussion, {}, {}> & Discussion & Required<{
4
4
  _id: unknown;
5
5
  }> & {
6
6
  __v: number;
@@ -1,6 +1,6 @@
1
1
  import { Model } from 'mongoose';
2
2
  import { type Token } from '../schemas/oAuth2.schema';
3
- export declare const OAuth2AccessTokenModel: Model<Token, {}, {}, {}, import("mongoose").Document<unknown, {}, Token, {}> & Omit<import("oauth2-server").Token, "user" | "client"> & {
3
+ export declare const OAuth2AccessTokenModel: Model<Token, {}, {}, {}, import("mongoose").Document<unknown, {}, Token, {}, {}> & Omit<import("oauth2-server").Token, "user" | "client"> & {
4
4
  clientId: import("oauth2-server").Client["id"];
5
5
  userId: import("../export").User["id"];
6
6
  } & {
@@ -1,12 +1,12 @@
1
1
  import type { DictionarySchema } from '../types/dictionary.types';
2
2
  import { Schema } from 'mongoose';
3
- export declare const dictionarySchema: Schema<DictionarySchema, import("mongoose").Model<DictionarySchema, any, any, any, import("mongoose").Document<unknown, any, DictionarySchema, any> & Omit<import("../types/dictionary.types").Dictionary, "id"> & {
3
+ export declare const dictionarySchema: Schema<DictionarySchema, import("mongoose").Model<DictionarySchema, any, any, any, import("mongoose").Document<unknown, any, DictionarySchema, any, {}> & Omit<import("../types/dictionary.types").Dictionary, "id"> & {
4
4
  _id: import("mongoose").Types.ObjectId;
5
5
  } & Required<{
6
6
  _id: import("mongoose").Types.ObjectId;
7
7
  }> & {
8
8
  __v: number;
9
- }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, DictionarySchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<DictionarySchema>, {}> & import("mongoose").FlatRecord<DictionarySchema> & Required<{
9
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, DictionarySchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<DictionarySchema>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<DictionarySchema> & Required<{
10
10
  _id: import("mongoose").Types.ObjectId;
11
11
  }> & {
12
12
  __v: number;
@@ -1,12 +1,12 @@
1
1
  import type { DiscussionSchema } from '../types/discussion.types';
2
2
  import { Schema } from 'mongoose';
3
- export declare const discussionSchema: Schema<DiscussionSchema, import("mongoose").Model<DiscussionSchema, any, any, any, import("mongoose").Document<unknown, any, DiscussionSchema, any> & Omit<import("../types/discussion.types").Discussion, "id"> & {
3
+ export declare const discussionSchema: Schema<DiscussionSchema, import("mongoose").Model<DiscussionSchema, any, any, any, import("mongoose").Document<unknown, any, DiscussionSchema, any, {}> & Omit<import("../types/discussion.types").Discussion, "id"> & {
4
4
  _id: import("mongoose").Types.ObjectId;
5
5
  } & Required<{
6
6
  _id: import("mongoose").Types.ObjectId;
7
7
  }> & {
8
8
  __v: number;
9
- }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, DiscussionSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<DiscussionSchema>, {}> & import("mongoose").FlatRecord<DiscussionSchema> & Required<{
9
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, DiscussionSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<DiscussionSchema>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<DiscussionSchema> & Required<{
10
10
  _id: import("mongoose").Types.ObjectId;
11
11
  }> & {
12
12
  __v: number;
@@ -5,14 +5,14 @@ export type Token = Omit<TokenType, 'client' | 'user'> & {
5
5
  clientId: Client['id'];
6
6
  userId: User['id'];
7
7
  };
8
- export declare const accessTokenSchema: Schema<Token, import("mongoose").Model<Token, any, any, any, import("mongoose").Document<unknown, any, Token, any> & Omit<TokenType, "user" | "client"> & {
8
+ export declare const accessTokenSchema: Schema<Token, import("mongoose").Model<Token, any, any, any, import("mongoose").Document<unknown, any, Token, any, {}> & Omit<TokenType, "user" | "client"> & {
9
9
  clientId: Client["id"];
10
10
  userId: User["id"];
11
11
  } & {
12
12
  _id: import("mongoose").Types.ObjectId;
13
13
  } & {
14
14
  __v: number;
15
- }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, Token, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<Token>, {}> & import("mongoose").FlatRecord<Token> & {
15
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, Token, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<Token>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<Token> & {
16
16
  _id: import("mongoose").Types.ObjectId;
17
17
  } & {
18
18
  __v: number;
@@ -1,12 +1,12 @@
1
- import { OrganizationSchema } from '../export';
1
+ import { OrganizationSchema } from '../types/organization.types';
2
2
  import { Schema } from 'mongoose';
3
- export declare const organizationSchema: Schema<OrganizationSchema, import("mongoose").Model<OrganizationSchema, any, any, any, import("mongoose").Document<unknown, any, OrganizationSchema, any> & Omit<import("../export").Organization, "id"> & {
3
+ export declare const organizationSchema: Schema<OrganizationSchema, import("mongoose").Model<OrganizationSchema, any, any, any, import("mongoose").Document<unknown, any, OrganizationSchema, any, {}> & Omit<import("../types/organization.types").Organization, "id"> & {
4
4
  _id: import("mongoose").Types.ObjectId;
5
5
  } & Required<{
6
6
  _id: import("mongoose").Types.ObjectId;
7
7
  }> & {
8
8
  __v: number;
9
- }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, OrganizationSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<OrganizationSchema>, {}> & import("mongoose").FlatRecord<OrganizationSchema> & Required<{
9
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, OrganizationSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<OrganizationSchema>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<OrganizationSchema> & Required<{
10
10
  _id: import("mongoose").Types.ObjectId;
11
11
  }> & {
12
12
  __v: number;
@@ -1 +1 @@
1
- {"version":3,"file":"organization.schema.d.ts","sourceRoot":"","sources":["../../../src/schemas/organization.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAM9C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,eAAO,MAAM,kBAAkB;;;;;;;;;;EAgD9B,CAAC"}
1
+ {"version":3,"file":"organization.schema.d.ts","sourceRoot":"","sources":["../../../src/schemas/organization.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAMhE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,eAAO,MAAM,kBAAkB;;;;;;;;;;EAgD9B,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import type { PlanSchema } from '../types/plan.types';
2
2
  import { Schema } from 'mongoose';
3
- export declare const planSchema: Schema<PlanSchema, import("mongoose").Model<PlanSchema, any, any, any, import("mongoose").Document<unknown, any, PlanSchema, any> & Omit<import("../types/plan.types").Plan, "id"> & {
3
+ export declare const planSchema: Schema<PlanSchema, import("mongoose").Model<PlanSchema, any, any, any, import("mongoose").Document<unknown, any, PlanSchema, any, {}> & Omit<import("../types/plan.types").Plan, "id"> & {
4
4
  _id: import("mongoose").Types.ObjectId;
5
5
  } & Required<{
6
6
  _id: import("mongoose").Types.ObjectId;
7
7
  }> & {
8
8
  __v: number;
9
- }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, PlanSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<PlanSchema>, {}> & import("mongoose").FlatRecord<PlanSchema> & Required<{
9
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, PlanSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<PlanSchema>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<PlanSchema> & Required<{
10
10
  _id: import("mongoose").Types.ObjectId;
11
11
  }> & {
12
12
  __v: number;
@@ -1,12 +1,12 @@
1
1
  import type { Project, ProjectSchema } from '../types/project.types';
2
2
  import { Schema } from 'mongoose';
3
- export declare const projectSchema: Schema<ProjectSchema, import("mongoose").Model<ProjectSchema, any, any, any, import("mongoose").Document<unknown, any, ProjectSchema, any> & Omit<Project, "id"> & {
3
+ export declare const projectSchema: Schema<ProjectSchema, import("mongoose").Model<ProjectSchema, any, any, any, import("mongoose").Document<unknown, any, ProjectSchema, any, {}> & Omit<Project, "id"> & {
4
4
  _id: import("mongoose").Types.ObjectId;
5
5
  } & Required<{
6
6
  _id: import("mongoose").Types.ObjectId;
7
7
  }> & {
8
8
  __v: number;
9
- }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, ProjectSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<ProjectSchema>, {}> & import("mongoose").FlatRecord<ProjectSchema> & Required<{
9
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, ProjectSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<ProjectSchema>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<ProjectSchema> & Required<{
10
10
  _id: import("mongoose").Types.ObjectId;
11
11
  }> & {
12
12
  __v: number;
@@ -1,12 +1,12 @@
1
- import { SessionSchema } from '../export';
1
+ import { SessionSchema } from '../types/session.types';
2
2
  import { Schema } from 'mongoose';
3
- export declare const sessionSchema: Schema<SessionSchema, import("mongoose").Model<SessionSchema, any, any, any, import("mongoose").Document<unknown, any, SessionSchema, any> & Omit<import("../export").SessionData, "id"> & {
3
+ export declare const sessionSchema: Schema<SessionSchema, import("mongoose").Model<SessionSchema, any, any, any, import("mongoose").Document<unknown, any, SessionSchema, any, {}> & Omit<import("../types/session.types").SessionData, "id"> & {
4
4
  _id: import("mongoose").Types.ObjectId;
5
5
  } & Required<{
6
6
  _id: import("mongoose").Types.ObjectId;
7
7
  }> & {
8
8
  __v: number;
9
- }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, SessionSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<SessionSchema>, {}> & import("mongoose").FlatRecord<SessionSchema> & Required<{
9
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, SessionSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<SessionSchema>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<SessionSchema> & Required<{
10
10
  _id: import("mongoose").Types.ObjectId;
11
11
  }> & {
12
12
  __v: number;
@@ -1 +1 @@
1
- {"version":3,"file":"session.schema.d.ts","sourceRoot":"","sources":["../../../src/schemas/session.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,eAAO,MAAM,aAAa;;;;;;;;;;EAgCzB,CAAC"}
1
+ {"version":3,"file":"session.schema.d.ts","sourceRoot":"","sources":["../../../src/schemas/session.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,eAAO,MAAM,aAAa;;;;;;;;;;EAgCzB,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import type { TagSchema } from '../types/tag.types';
2
2
  import { Schema } from 'mongoose';
3
- export declare const tagSchema: Schema<TagSchema, import("mongoose").Model<TagSchema, any, any, any, import("mongoose").Document<unknown, any, TagSchema, any> & Omit<import("../types/tag.types").Tag, "id"> & {
3
+ export declare const tagSchema: Schema<TagSchema, import("mongoose").Model<TagSchema, any, any, any, import("mongoose").Document<unknown, any, TagSchema, any, {}> & Omit<import("../types/tag.types").Tag, "id"> & {
4
4
  _id: import("mongoose").Types.ObjectId;
5
5
  } & Required<{
6
6
  _id: import("mongoose").Types.ObjectId;
7
7
  }> & {
8
8
  __v: number;
9
- }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, TagSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<TagSchema>, {}> & import("mongoose").FlatRecord<TagSchema> & Required<{
9
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, TagSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<TagSchema>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<TagSchema> & Required<{
10
10
  _id: import("mongoose").Types.ObjectId;
11
11
  }> & {
12
12
  __v: number;
@@ -1,12 +1,12 @@
1
1
  import type { UserSchema } from '../types/user.types';
2
2
  import { Schema } from 'mongoose';
3
- export declare const userSchema: Schema<UserSchema, import("mongoose").Model<UserSchema, any, any, any, import("mongoose").Document<unknown, any, UserSchema, any> & Omit<import("../types/user.types").User, "id"> & {
3
+ export declare const userSchema: Schema<UserSchema, import("mongoose").Model<UserSchema, any, any, any, import("mongoose").Document<unknown, any, UserSchema, any, {}> & Omit<import("../types/user.types").User, "id"> & {
4
4
  _id: import("mongoose").Types.ObjectId;
5
5
  } & Required<{
6
6
  _id: import("mongoose").Types.ObjectId;
7
7
  }> & {
8
8
  __v: number;
9
- }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, UserSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<UserSchema>, {}> & import("mongoose").FlatRecord<UserSchema> & Required<{
9
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, UserSchema, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<UserSchema>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<UserSchema> & Required<{
10
10
  _id: import("mongoose").Types.ObjectId;
11
11
  }> & {
12
12
  __v: number;
@@ -1 +1 @@
1
- {"version":3,"file":"organization.service.d.ts","sourceRoot":"","sources":["../../../src/services/organization.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,oBAAoB,CAAC;AAG7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAK3G,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,SAAS,mBAAmB,EAC5B,MAAM,MAAM,EACZ,OAAO,MAAM,KACZ,OAAO,CAAC,oBAAoB,EAAE,CAC8B,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,gBAAgB,MAAM,GAAG,KAAK,CAAC,QAAQ,KACtC,OAAO,CAAC,oBAAoB,CAQ9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,SAAS,mBAAmB,KAC3B,OAAO,CAAC,MAAM,CAQhB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,cAAc,wBAAwB,EACtC,QAAQ,MAAM,GAAG,KAAK,CAAC,QAAQ,KAC9B,OAAO,CAAC,oBAAoB,CAqB9B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,gBAAgB,MAAM,GAAG,KAAK,CAAC,QAAQ,EACvC,cAAc,OAAO,CAAC,YAAY,CAAC,KAClC,OAAO,CAAC,oBAAoB,CAqB9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GACjC,gBAAgB,MAAM,GAAG,KAAK,CAAC,QAAQ,KACtC,OAAO,CAAC,oBAAoB,CAS9B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GACrB,cAAc,YAAY,GAAG,oBAAoB,EACjD,MAAM,OAAO,CAAC,IAAI,CAAC,KAClB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAsBrC,CAAC"}
1
+ {"version":3,"file":"organization.service.d.ts","sourceRoot":"","sources":["../../../src/services/organization.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,oBAAoB,CAAC;AAG7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAK3G,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,SAAS,mBAAmB,EAC5B,MAAM,MAAM,EACZ,OAAO,MAAM,KACZ,OAAO,CAAC,oBAAoB,EAAE,CAC8B,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,gBAAgB,MAAM,GAAG,KAAK,CAAC,QAAQ,KACtC,OAAO,CAAC,oBAAoB,CAQ9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,SAAS,mBAAmB,KAC3B,OAAO,CAAC,MAAM,CAQhB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,cAAc,wBAAwB,EACtC,QAAQ,MAAM,GAAG,KAAK,CAAC,QAAQ,KAC9B,OAAO,CAAC,oBAAoB,CAqB9B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,gBAAgB,MAAM,GAAG,KAAK,CAAC,QAAQ,EACvC,cAAc,OAAO,CAAC,YAAY,CAAC,KAClC,OAAO,CAAC,oBAAoB,CAqB9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GACjC,gBAAgB,MAAM,GAAG,KAAK,CAAC,QAAQ,KACtC,OAAO,CAAC,oBAAoB,CAS9B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GACrB,cAAc,YAAY,GAAG,oBAAoB,EACjD,MAAM,OAAO,CAAC,IAAI,CAAC,KAClB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAqBrC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { Organization } from '../export';
1
+ import type { Organization } from '../types/organization.types';
2
2
  import type { Tag, TagData, TagDocument } from '../types/tag.types';
3
3
  import type { TagFilters } from '../utils/filtersAndPagination/getTagFiltersAndPagination';
4
4
  import type { Types } from 'mongoose';
@@ -1 +1 @@
1
- {"version":3,"file":"tag.service.d.ts","sourceRoot":"","sources":["../../../src/services/tag.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wDAAwD,CAAC;AAEzF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GACnB,SAAS,UAAU,EACnB,aAAQ,EACR,cAAW,KACV,OAAO,CAAC,WAAW,EAAE,CAC8B,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,OAAO,MAAM,GAAG,KAAK,CAAC,QAAQ,KAC7B,OAAO,CAAC,WAAW,CAQrB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,MAAM,MAAM,EAAE,EACd,gBAAgB,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,KAC1C,OAAO,CAAC,WAAW,EAAE,CAIvB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAU,SAAS,UAAU,KAAG,OAAO,CAAC,MAAM,CAQnE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAU,KAAK,OAAO,KAAG,OAAO,CAAC,WAAW,CAQjE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,GAAG,KAAK,CAAC,QAAQ,EAC9B,KAAK,OAAO,CAAC,GAAG,CAAC,KAChB,OAAO,CAAC,WAAW,CAmBrB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,GAAG,KAAK,CAAC,QAAQ,KAC7B,OAAO,CAAC,WAAW,CAQrB,CAAC"}
1
+ {"version":3,"file":"tag.service.d.ts","sourceRoot":"","sources":["../../../src/services/tag.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wDAAwD,CAAC;AAEzF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GACnB,SAAS,UAAU,EACnB,aAAQ,EACR,cAAW,KACV,OAAO,CAAC,WAAW,EAAE,CAC8B,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,OAAO,MAAM,GAAG,KAAK,CAAC,QAAQ,KAC7B,OAAO,CAAC,WAAW,CAQrB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,MAAM,MAAM,EAAE,EACd,gBAAgB,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,KAC1C,OAAO,CAAC,WAAW,EAAE,CAIvB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAU,SAAS,UAAU,KAAG,OAAO,CAAC,MAAM,CAQnE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAU,KAAK,OAAO,KAAG,OAAO,CAAC,WAAW,CAQjE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,GAAG,KAAK,CAAC,QAAQ,EAC9B,KAAK,OAAO,CAAC,GAAG,CAAC,KAChB,OAAO,CAAC,WAAW,CAmBrB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,GAAG,KAAK,CAAC,QAAQ,KAC7B,OAAO,CAAC,WAAW,CAQrB,CAAC"}
@@ -3,14 +3,14 @@ import { deepseek } from '@ai-sdk/deepseek';
3
3
  import { google } from '@ai-sdk/google';
4
4
  import { mistral } from '@ai-sdk/mistral';
5
5
  import { openai } from '@ai-sdk/openai';
6
- import { CoreMessage, generateText } from 'ai';
6
+ import { AssistantModelMessage, generateText, SystemModelMessage, ToolModelMessage, UserModelMessage } from 'ai';
7
7
  import { Response } from 'express';
8
8
  type AnthropicModel = Parameters<typeof anthropic>[0];
9
9
  type DeepSeekModel = Parameters<typeof deepseek>[0];
10
10
  type MistralModel = Parameters<typeof mistral>[0];
11
11
  type OpenAIModel = Parameters<typeof openai>[0];
12
12
  type GoogleModel = Parameters<typeof google>[0];
13
- export type Messages = CoreMessage[];
13
+ export type Messages = (SystemModelMessage | UserModelMessage | AssistantModelMessage | ToolModelMessage)[];
14
14
  /**
15
15
  * Supported AI models
16
16
  */
@@ -34,7 +34,6 @@ export type AIOptions = {
34
34
  temperature?: number;
35
35
  apiKey?: string;
36
36
  applicationContext?: string;
37
- maxTokens?: number;
38
37
  };
39
38
  export type ChatCompletionRequestMessage = {
40
39
  role: 'system' | 'user' | 'assistant';
@@ -1 +1 @@
1
- {"version":3,"file":"aiSdk.d.ts","sourceRoot":"","sources":["../../../../src/utils/AI/aiSdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAkB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAA4B,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAiB,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAgB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;AAErC;;GAEG;AACH,MAAM,MAAM,KAAK,GACb,cAAc,GACd,aAAa,GACb,YAAY,GACZ,WAAW,GACX,WAAW,GACX,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB;;GAEG;AACH,oBAAY,UAAU;IACpB,MAAM,WAAW;IACjB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAGF,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAEF,KAAK,UAAU,GAAG,QAAQ,GAAG,iBAAiB,GAAG,cAAc,GAAG,QAAQ,CAAC;AAsE3E,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAK1D,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;CAC3B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,KAAK,QAAQ,EACb,SAAS,eAAe,KACvB,OAAO,CAAC,QAAQ,CAkFlB,CAAC"}
1
+ {"version":3,"file":"aiSdk.d.ts","sourceRoot":"","sources":["../../../../src/utils/AI/aiSdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAkB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAA4B,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAiB,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAgB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG,CACnB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,gBAAgB,CACnB,EAAE,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,KAAK,GACb,cAAc,GACd,aAAa,GACb,YAAY,GACZ,WAAW,GACX,WAAW,GACX,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB;;GAEG;AACH,oBAAY,UAAU;IACpB,MAAM,WAAW;IACjB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAGF,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAEF,KAAK,UAAU,GAAG,QAAQ,GAAG,iBAAiB,GAAG,cAAc,GAAG,QAAQ,CAAC;AAsE3E,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAK1D,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;CAC3B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,KAAK,QAAQ,EACb,SAAS,eAAe,KACvB,OAAO,CAAC,QAAQ,CAiFlB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/utils/AI/autocomplete/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAc,MAAM,UAAU,CAAC;AAQ3D,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAKF,eAAO,MAAM,gBAAgB,EAAE,SAK9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,mFAOhC,mBAAmB,KAAG,OAAO,CAAC,0BAA0B,GAAG,SAAS,CA0BtE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/utils/AI/autocomplete/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAc,MAAM,UAAU,CAAC;AAQ3D,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAKF,eAAO,MAAM,gBAAgB,EAAE,SAI9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,mFAOhC,mBAAmB,KAAG,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAyBtE,CAAC"}
@@ -1,5 +1,5 @@
1
+ import { HttpStatusCodes } from '../../utils/httpStatusCodes';
1
2
  import type { Response } from 'express';
2
- import { HttpStatusCodes } from '../../export';
3
3
  import type { LanguageContent } from 'express-intlayer';
4
4
  import { type ErrorCodes } from './errorCodes';
5
5
  import type { AppError } from './ErrorsClass';
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorHandler.d.ts","sourceRoot":"","sources":["../../../../src/utils/errors/ErrorHandler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAgB,eAAe,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,KAAK,UAAU,EAAa,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C,qBAAa,YAAY;IACvB;;;;;;OAMG;IACH,MAAM,CAAC,0BAA0B,CAC/B,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,UAAU,EACpB,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,eAAe,EAC5B,mBAAmB,GAAE,OAAe;IAiBtC;;;;;;OAMG;IACH,MAAM,CAAC,sBAAsB,CAC3B,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,QAAQ,EACf,cAAc,CAAC,EAAE,MAAM,EACvB,mBAAmB,GAAE,OAAe;IA2BtC;;;;;;;;OAQG;IACH,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAChC,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,UAAU,GAAG,MAAM,EAC7B,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,MAAM,EACvC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,MAAM,EACzC,cAAc,CAAC,EAAE,MAAM,EACvB,UAAU,CAAC,EAAE,eAAe,EAC5B,mBAAmB,GAAE,OAAe;CAkCvC"}
1
+ {"version":3,"file":"ErrorHandler.d.ts","sourceRoot":"","sources":["../../../../src/utils/errors/ErrorHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,KAAK,UAAU,EAAa,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C,qBAAa,YAAY;IACvB;;;;;;OAMG;IACH,MAAM,CAAC,0BAA0B,CAC/B,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,UAAU,EACpB,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,eAAe,EAC5B,mBAAmB,GAAE,OAAe;IAiBtC;;;;;;OAMG;IACH,MAAM,CAAC,sBAAsB,CAC3B,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,QAAQ,EACf,cAAc,CAAC,EAAE,MAAM,EACvB,mBAAmB,GAAE,OAAe;IA2BtC;;;;;;;;OAQG;IACH,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAChC,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,UAAU,GAAG,MAAM,EAC7B,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,MAAM,EACvC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,MAAM,EACzC,cAAc,CAAC,EAAE,MAAM,EACvB,UAAU,CAAC,EAAE,eAAe,EAC5B,mBAAmB,GAAE,OAAe;CAkCvC"}
@@ -1,4 +1,4 @@
1
1
  import type { NextFunction, Request, Response } from 'express';
2
- export declare const ipLimiter: (req: Request, res: Response, next: NextFunction) => void | Promise<void>;
2
+ export declare const ipLimiter: (req: Request, res: Response, next: NextFunction) => unknown;
3
3
  export declare const unauthenticatedChatBotLimiter: (req: Request, res: Response, next: NextFunction) => any;
4
4
  //# sourceMappingURL=rateLimiter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rateLimiter.d.ts","sourceRoot":"","sources":["../../../src/utils/rateLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAS/D,eAAO,MAAM,SAAS,EAAE,CACtB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,KACf,IAAI,GAAG,OAAO,CAAC,IAAI,CAmBtB,CAAC;AAEH,eAAO,MAAM,6BAA6B,EAAE,CAC1C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,KACf,GAwBH,CAAC"}
1
+ {"version":3,"file":"rateLimiter.d.ts","sourceRoot":"","sources":["../../../src/utils/rateLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAS/D,eAAO,MAAM,SAAS,EAAE,CACtB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,KACf,OAmBH,CAAC;AAEH,eAAO,MAAM,6BAA6B,EAAE,CAC1C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,KACf,GAwBH,CAAC"}