ee-mcp-service
Version:
Model Context Protocol Service for Evolution Engineering
1 lines • 35.5 kB
Source Map (JSON)
{"version":3,"sources":["../node_modules/.pnpm/tsup@8.4.0_typescript@5.8.3/node_modules/tsup/assets/esm_shims.js","../src/config/index.ts","../src/services/falkordb.service.ts","../src/tools/mcp-tool-helpers.ts","../src/tools/mcp-tools.ts","../src/index.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import dotenv from 'dotenv';\r\n\r\n// Load environment variables from .env file\r\ndotenv.config();\r\n\r\nexport const config = {\r\n falkorDB: {\r\n host: 'localhost',\r\n port: 6379,\r\n username: '',\r\n password: '',\r\n },\r\n mcp: {\r\n apiKey: process.env.EE_API_KEY || '*',\r\n version: process.env.EE_MCP_VERSION_RESPONSE || '1.0.0 alpha',\r\n },\r\n};","import { FalkorDB } from 'falkordb';\r\nimport { config } from '../config';\r\n\r\ninterface ApiKeyVerificationResult {\r\n valid: boolean;\r\n data: any; // Or a more specific type if known\r\n message: string;\r\n}\r\n\r\nclass FalkorDBService {\r\n private client: FalkorDB | null = null;\r\n private apiKey: string | null = null;\r\n private apiKeyVerificationResult: ApiKeyVerificationResult | null = null;\r\n\r\n constructor() {\r\n // this.init();\r\n }\r\n\r\n /**\r\n * Returns the API key for MCP\r\n * @returns API key as string\r\n */\r\n public async verifyApiKey(apiKey: string): Promise<ApiKeyVerificationResult> {\r\n // if the API key is the same as the one we already verified, return the result\r\n if (this.apiKey === apiKey) {\r\n return {\r\n valid: true,\r\n data: this.apiKeyVerificationResult,\r\n message: \"API KEY verification successful\"\r\n };\r\n }\r\n\r\n const myHeaders = new Headers();\r\n myHeaders.append(\"User-Agent\", \"Apidog/1.0.0 (https://apidog.com)\");\r\n myHeaders.append(\"Content-Type\", \"application/json\");\r\n myHeaders.append(\"Authorization\", \"Bearer eyJhbGciOiJIUzI1NiJ9.e30.Ivww_qG4htViuqxXGRVbHVZbMQETOYnfbYf06HsS_B4\");\r\n myHeaders.append(\"Accept\", \"*/*\");\r\n myHeaders.append(\"Host\", \"lihiuvyxjttzpdhzafcb.supabase.co\");\r\n myHeaders.append(\"Connection\", \"keep-alive\");\r\n\r\n const raw = JSON.stringify({\r\n \"apiKey\": apiKey\r\n });\r\n\r\n const requestOptions = {\r\n method: 'POST',\r\n headers: myHeaders,\r\n body: raw,\r\n redirect: 'follow' as RequestRedirect,\r\n };\r\n\r\n try {\r\n const response = await fetch(\"https://lihiuvyxjttzpdhzafcb.supabase.co/functions/v1/check-api-key\", requestOptions)\r\n const result = await response.json();\r\n // console.log('API Key Verification Result:', result);\r\n \r\n if (!response.ok) {\r\n throw new Error(\"Error Status \" + response.status.toString());\r\n }\r\n\r\n this.apiKeyVerificationResult = result;\r\n this.apiKey = apiKey;\r\n \r\n // initialize the client with valid credentials\r\n // console.error('APi RESULT',JSON.stringify(this.apiKeyVerificationResult));\r\n const serverConnectionStatus = await this.init();\r\n if (!serverConnectionStatus) {\r\n this.apiKeyVerificationResult = null;\r\n this.apiKey = null;\r\n return {\r\n valid: false,\r\n data: {},\r\n message: \"API KEY verification successful, EE MCP Server Connection Failed\"\r\n };\r\n }\r\n\r\n return {\r\n valid: true,\r\n data: result,\r\n message: \"API KEY verification successful, EE MCP Server Connected\"\r\n };\r\n\r\n } catch (error) {\r\n let errorMessage = \"Unknown error occurred during API key verification\";\r\n if (error instanceof Error) {\r\n errorMessage = error.message;\r\n }\r\n this.apiKeyVerificationResult = null;\r\n this.apiKey = null;\r\n return {\r\n valid: false,\r\n data: {},\r\n message: \"API KEY verification failed: \" + errorMessage\r\n };\r\n }\r\n }\r\n\r\n private async init(): Promise<boolean> {\r\n try {\r\n // if the API key is the same as the one we already verified, return the result\r\n if (this.apiKey) {\r\n config.falkorDB.password = this.apiKeyVerificationResult?.data?.['FALKORDB_PASSWORD'];\r\n config.falkorDB.username = this.apiKeyVerificationResult?.data?.['FALKORDB_USERNAME'];\r\n config.falkorDB.host = this.apiKeyVerificationResult?.data?.['FALKORDB_HOST'];\r\n config.falkorDB.port = this.apiKeyVerificationResult?.data?.['FALKORDB_PORT'];\r\n \r\n } else {\r\n this.apiKeyVerificationResult = null;\r\n this.apiKey = null;\r\n throw new Error('Missing API key');\r\n }\r\n if (this.client) {\r\n await this.client.close();\r\n this.client = null;\r\n }\r\n \r\n this.client = await FalkorDB.connect({\r\n socket: {\r\n host: config.falkorDB.host,\r\n port: config.falkorDB.port,\r\n },\r\n password: config.falkorDB.password,\r\n username: config.falkorDB.username,\r\n });\r\n\r\n // Test connection\r\n const connection = await this.client.connection;\r\n await connection.ping();\r\n // return {\r\n // content: [{\r\n // type: \"text\",\r\n // text: JSON.stringify({\r\n // status: \"success\",\r\n // message: \"Successfully connected to EE MCP Server\"\r\n // })\r\n // }]\r\n // };\r\n return true;\r\n } catch (error) {\r\n return false;\r\n // console.error('Failed to connect to EE MCP Server', error);\r\n // console.error(config.falkorDB);\r\n // Retry connection after a delay\r\n // setTimeout(() => this.init(), 5000);\r\n }\r\n }\r\n\r\n async executeGraphQuery(graphName: string, query: string, apiKey: string = config.mcp.apiKey, params?: Record<string, any>): Promise<any> {\r\n if (!query || query.trim() === '') {\r\n return {error:true, result:`Error executing EE MCP Server Graph DB query: No Query Provided`};\r\n }\r\n const connectionParameters = await falkorDBService.verifyApiKey(apiKey);\r\n if (connectionParameters.valid && this.client !== null) {\r\n const customerGraphName = apiKey + '-' + graphName;\r\n try {\r\n const graph = this.client.selectGraph(customerGraphName);\r\n const result = await graph.query(query, params);\r\n return {error:false, result:result};\r\n } catch (error) {\r\n throw new Error(`Error executing EE MCP Server Graph DB query: ${error}`);\r\n }\r\n } else {\r\n throw new Error(`Failed to get Ontology from EE MCP Server: ${connectionParameters.message}`);\r\n } // Ensure API key is valid before proceeding\r\n }\r\n\r\n async executeOntologyGraphQuery(graphName: string, query: string, apiKey: string = config.mcp.apiKey, params?: Record<string, any>): Promise<any> {\r\n if (!query || query.trim() === '') {\r\n return {error:true, result:`Error executing EE MCP Server Ontology Graph DB query: No Query Provided`};\r\n }\r\n const connectionParameters = await falkorDBService.verifyApiKey(apiKey);\r\n if (connectionParameters.valid && this.client !== null) {\r\n // const graphName = this.apiKeyVerificationResult?.data?.['FALKORDB_GRAPH_SEMANTIC'];\r\n try {\r\n const graph = this.client.selectGraph(graphName);\r\n const result = await graph.query(query, params);\r\n return {error:false, result:result};\r\n } catch (error) {\r\n throw new Error(`Error executing EE MCP Server Ontology Graph DB query: ${error}`);\r\n }\r\n } else {\r\n throw new Error(`Failed to get Ontology Data from EE MCP Server: ${connectionParameters.message}`);\r\n } // Ensure API key is valid before proceeding\r\n }\r\n\r\n async getOntology(apiKey: string = config.mcp.apiKey, params?: Record<string, any>): Promise<any> {\r\n const connectionParameters = await falkorDBService.verifyApiKey(apiKey);\r\n if (connectionParameters.valid && this.client !== null) {\r\n // get the schema name from the api key verification result\r\n const schemaName = this.apiKeyVerificationResult?.data?.['FALKORDB_GRAPH_SEMANTIC'];\r\n const graphName = schemaName.endsWith('_schema') ? schemaName : schemaName + '_schema';\r\n try {\r\n const graph = this.client.selectGraph(graphName);\r\n const result = await graph.query('MATCH (sourceNode)-[relation]->(targetNode) RETURN sourceNode, relation, targetNode', params);\r\n if (!result.data || result.data.length === 0) {\r\n throw new Error('No Ontology found in EE MCP Server');\r\n }\r\n return result;\r\n } catch (error) {\r\n throw new Error(`Error getting Ontology from EE MCP Server: ${error}`);\r\n }\r\n } else {\r\n throw new Error(`Failed to get Ontology from EE MCP Server: ${connectionParameters.message}`);\r\n }\r\n } \r\n\r\n // async getSchema(apiKey: string = config.mcp.apiKey, params?: Record<string, any>): Promise<any> {\r\n // const connectionParameters = await falkorDBService.verifyApiKey(apiKey);\r\n // if (connectionParameters.valid && this.client !== null) {\r\n // get the schema name from the api key verification result\r\n\r\n\r\n// I have to update KG to set correct KG name {SUBSCRIPTION-ID}-KG-{KG-NAME}\r\n// I have to update KG to set correct KG name {SUBSCRIPTION-ID}-KG-{KG-NAME}\r\n// I have to update KG to set correct KG name {SUBSCRIPTION-ID}-KG-{KG-NAME}\r\n\r\n\r\n\r\n // const schemaName = this.apiKeyVerificationResult?.data?.['FALKORDB_GRAPH_DEFAULT'];\r\n\r\n // const graphName = schemaName.endsWith('_schema') ? schemaName : schemaName + '_schema';\r\n // try {\r\n // const graph = this.client.selectGraph(graphName);\r\n // const result = await graph.query('MATCH (sourceNode)-[relation]->(targetNode) RETURN sourceNode, relation, targetNode', params);\r\n // if (!result.data || result.data.length === 0) {\r\n // throw new Error('No Ontology found in EE MCP Server');\r\n // }\r\n // return result;\r\n // } catch (error) {\r\n // throw new Error(`Error getting KnowledgeGraph Schema from EE MCP Server: ${error}`);\r\n // }\r\n // } else {\r\n // throw new Error(`Failed to get KnowledgeGraph Schema from EE MCP Server: ${connectionParameters.message}`);\r\n // }\r\n // } \r\n\r\n async getOntologyMetadata(apiKey: string = config.mcp.apiKey, params?: Record<string, any>): Promise<any> {\r\n const connectionParameters = await falkorDBService.verifyApiKey(apiKey);\r\n if (connectionParameters.valid && this.client !== null) {\r\n // get the schema name from the api key verification result\r\n const schemaName = this.apiKeyVerificationResult?.data?.['FALKORDB_GRAPH_SEMANTIC'];\r\n const graphName = schemaName\r\n try {\r\n const graph = this.client.selectGraph(graphName);\r\n const result = await graph.query(\"MATCH (metadata:MetaInfo) RETURN metadata.Name,metadata.Prompt\", params);\r\n if (!result.data || result.data.length === 0) {\r\n throw new Error('No Ontology Metadata found in EE MCP Server');\r\n }\r\n const instructions = result.data.map((item: any) => `${item['metadata.Name']}: ${item['metadata.Prompt']}`).join('\\n');\r\n return instructions;\r\n } catch (error) {\r\n throw new Error(`Error getting Ontology Metadata from EE MCP Server: ${error}`);\r\n }\r\n } else {\r\n throw new Error(`Failed to get Ontology Metadata from EE MCP Server: ${connectionParameters.message}`);\r\n }\r\n } \r\n\r\n /**\r\n * Lists all available graphs in FalkorDB\r\n * @returns Array of graph names\r\n */\r\n async listGraphs(apiKey: string = config.mcp.apiKey): Promise<string[]> {\r\n const connectionParameters = await falkorDBService.verifyApiKey(apiKey);\r\n if (connectionParameters.valid && this.client !== null) {\r\n try {\r\n return await this.client.list();\r\n } catch (error) {\r\n console.error('Error listing EE Graphs:', error);\r\n throw error;\r\n }\r\n } else {\r\n // Throw an error if the API key is invalid\r\n throw new Error(`Failed to list graphs: ${connectionParameters.message}`);\r\n }\r\n }\r\n\r\n async close() {\r\n if (this.client) {\r\n await this.client.close();\r\n this.client = null;\r\n }\r\n }\r\n}\r\n\r\n// Export a singleton instance\r\nexport const falkorDBService = new FalkorDBService();","import { MCPResponse, MCPProviderMetadata } from '../models/mcp.types';\r\n\r\nconst tools = {\r\n 'read-me': 'Call \"read-me\" first to understand how to navigate and use MeTaX MCP functionality',\r\n 'is-api-key-valid': 'Validates EE API key and tests connection to EE MeTaX Service',\r\n 'get-instructions-and-tool-description': 'Get instructions about the EE MeTaX Service, description of metadata objects and available tools to call',\r\n 'query-metadata-ontology': 'Query Semantic Ontology of metadata objects',\r\n 'query-business': 'Query Business Data',\r\n 'query-business-ontology': 'Query Semantic Ontology of Business Data',\r\n 'query-technology': 'Query Technology Data',\r\n 'query-technology-ontology': 'Query Semantic Ontology of Technology Data',\r\n 'query-environment': 'Query Environment Data',\r\n 'query-environment-ontology': 'Query Semantic Ontology of Environment Data',\r\n 'query-organization': 'Query Organization Data',\r\n 'query-organization-ontology': 'Query Semantic Ontology of Organization Data',\r\n 'query-strategy-scenario': 'Query Strategy Scenario Data',\r\n 'query-strategy-scenario-ontology': 'Query Semantic Ontology of Strategy Scenario Data',\r\n}\r\n\r\n// Check if the API key is valid\r\nfunction apiExist(apiKey: string) {\r\n if (apiKey === null || apiKey === undefined || apiKey === \"*\") {\r\n return {\r\n 'exist': {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify({ error: \"API key is required\" }),\r\n },\r\n ],\r\n isError: true\r\n }\r\n }\r\n }\r\n return { 'exist': true };\r\n}\r\n\r\n// Format the result\r\nfunction formatResult(result: any, queryTime: number, source: string, isError: boolean = false, ...otherParam: any) {\r\n let metadataOtherParam = {};\r\n if (otherParam) {\r\n metadataOtherParam = otherParam[0];\r\n }\r\n const formattedResult: MCPResponse = {\r\n data: result,\r\n metadata: {\r\n timestamp: new Date().toISOString(),\r\n queryTime,\r\n provider: 'Evolution Engineering',\r\n source: source,\r\n version: '1.0.0',\r\n ...metadataOtherParam\r\n }\r\n };\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: JSON.stringify(formattedResult),\r\n },\r\n ],\r\n _meta: {\r\n timestamp: new Date().toISOString(),\r\n queryTime\r\n },\r\n isError: isError\r\n }\r\n}\r\n\r\nexport { apiExist, formatResult, tools };\r\n","import { z } from \"zod\";\r\nimport { falkorDBService } from '../services/falkordb.service';\r\nimport { apiExist, formatResult, tools } from './mcp-tool-helpers';\r\n\r\nasync function queryGraph(toolName: string, graphName: string, query: string, apiKey: string, params?: Record<string, any>) {\r\n const apiKeyResult = apiExist(apiKey);\r\n if (!apiKeyResult.exist) {\r\n return apiKeyResult;\r\n }\r\n try {\r\n const startTime = Date.now();\r\n // Execute the query using FalkorDB service\r\n const response = await falkorDBService.executeGraphQuery(\r\n graphName,\r\n query,\r\n apiKey\r\n );\r\n const queryTime = Date.now() - startTime;\r\n return formatResult(response.result, queryTime, 'EE MCP Service #' + toolName, false);\r\n } catch (error: any) {\r\n return formatResult(error.message, 0, 'EE MCP Service #' + toolName, true);\r\n }\r\n}\r\n\r\nexport function registerMcpTools(server: any, config: any) {\r\n // Read Me for AI Agent\r\n server.tool(\"read-me\", {}, async (args: { [key: string]: any }, extra: any) => {\r\n return formatResult(\r\n \"First, test if your API key is valid. If the API key is valid, then get the ontology metadata and instructions.\"\r\n + \"If the API key is not valid, then return an error message.\"\r\n + \"The 'get-instructions-and-tool-description' tool will guide you where to find releavant information, how they are connected and how to construct your query to get the information you need.\"\r\n + \"You can get upper ontology model called 'MeTaX' by providing query 'query-metadata-ontology' tool.\"\r\n + \"All Knowledge graphs are divided into domains: Business, Technology, Environment, Organization.\"\r\n + \"You can get ontology model for a specific domain by providing query to 'query-business-ontology', 'query-technology-ontology', 'query-environment-ontology' and 'query-organization-ontology' tools respectively.\"\r\n + \"You can get knowledge graph for a specific domain by providing query to 'query-business', 'query-technology', 'query-environment' and 'query-organization' tools respectively.\"\r\n + \"Additionally, there are tools to get strategy scenario data by providing query to 'query-strategy-scenario' tool.\"\r\n + \"You can get ontology model for strategy scenario by providing query to 'query-strategy-scenario-ontology' tool.\"\r\n ,0, 'EE MCP Service #read-me', false);\r\n });\r\n\r\n // Check if the API key is valid\r\n server.tool(\"is-api-key-valid\", { apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n const apiKeyResult = apiExist(args.apiKey);\r\n if (!apiKeyResult.exist) {\r\n return apiKeyResult;\r\n }\r\n const startTime = Date.now();\r\n const result = await falkorDBService.verifyApiKey(args.apiKey);\r\n if (!result.valid) {\r\n return formatResult(result.message, 0, 'EE MCP Service #is-api-key-valid', true);\r\n }\r\n const queryTime = Date.now() - startTime;\r\n return formatResult(`API key ${args.apiKey} is valid`, queryTime, 'EE MCP Service #is-api-key-valid', false);\r\n\r\n });\r\n\r\n // Get the Ontology Metadata and Instructions\r\n server.tool(\"get-instructions-and-tool-description\", {apiKey: z.string().default(config.mcp.apiKey).optional()}, async (args: { [key: string]: any }, extra: any) => {\r\n const apiKeyResult = apiExist(args.apiKey);\r\n if (!apiKeyResult.exist) {\r\n return apiKeyResult;\r\n }\r\n const startTime = Date.now();\r\n const response = await falkorDBService.getOntologyMetadata(args.apiKey);\r\n const queryTime = Date.now() - startTime;\r\n return formatResult(response, queryTime, 'EE MCP Service #get-instructions-and-tool-description', false, {'instructions': response.instructions, tools, 'graphTypes': ['property', 'directed'], 'queryLanguages': ['cypher']});\r\n });\r\n\r\n // Query the Model Graph\r\n server.tool(\"query-metadata-ontology\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n return queryGraph('query-metadata-ontology', 'MeTaX_schema', args.query, args.apiKey);\r\n });\r\n\r\n // Query the Business Data\r\n server.tool(\"query-business\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n return queryGraph('query-business', 'KG-BUSINESS', args.query, args.apiKey);\r\n });\r\n\r\n // Query the Business Ontology\r\n server.tool(\"query-business-ontology\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n return queryGraph('query-business-ontology', 'KG-BUSINESS_schema', args.query, args.apiKey);\r\n });\r\n\r\n // Query the Technology Data\r\n server.tool(\"query-technology\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n return queryGraph('query-technology', 'KG-TECHNOLOGY', args.query, args.apiKey);\r\n });\r\n\r\n // Query the Technology Ontology\r\n server.tool(\"query-technology-ontology\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n return queryGraph('query-technology-ontology', 'KG-TECHNOLOGY_schema', args.query, args.apiKey);\r\n });\r\n\r\n // Query the Environment Data\r\n server.tool(\"query-environment\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n return queryGraph('query-environment', 'KG-ENVIRONMENT', args.query, args.apiKey);\r\n });\r\n\r\n // Query the Environment Ontology\r\n server.tool(\"query-environment-ontology\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n return queryGraph('query-environment-ontology', 'KG-ENVIRONMENT_schema', args.query, args.apiKey);\r\n });\r\n\r\n // Query the Organization Data\r\n server.tool(\"query-organization\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n return queryGraph('query-organization', 'KG-ORGANIZATION', args.query, args.apiKey);\r\n });\r\n\r\n // Query the Organization Ontology\r\n server.tool(\"query-organization-ontology\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n return queryGraph('query-organization-ontology', 'KG-ORGANIZATION_schema', args.query, args.apiKey);\r\n });\r\n\r\n // Query the Strategy Scenario Data\r\n server.tool(\"query-strategy-scenario\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n return queryGraph('query-strategy-scenario', 'KG-STRATEGY-SCENARIO', args.query, args.apiKey);\r\n });\r\n\r\n // Query the Strategy Scenario Ontology\r\n server.tool(\"query-strategy-scenario-ontology\", { query: z.string(), apiKey: z.string().default(config.mcp.apiKey).optional() }, async (args: { [key: string]: any }, extra: any) => {\r\n return queryGraph('query-strategy-scenario-ontology', 'KG-STRATEGY-SCENARIO_schema', args.query, args.apiKey);\r\n });\r\n \r\n} ","import { falkorDBService } from './services/falkordb.service';\r\nimport {\r\n McpServer\r\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\r\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\r\nimport { config } from './config';\r\nimport { registerMcpTools } from './tools/mcp-tools';\r\n\r\n// Create an MCP server\r\nconst server = new McpServer({\r\n name: \"EE-MCP-SERVICE\",\r\n version: \"1.0.0\",\r\n description: \"Evolution Engineering MCP Service\",\r\n});\r\n\r\n// Register all tools\r\nregisterMcpTools(server, config);\r\n\r\n// Start receiving messages on stdin and sending messages on stdout\r\nasync function main() {\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n console.error(\"EE MCP Server running on stdio\");\r\n}\r\n\r\nprocess.on('SIGTERM', async () => {\r\n console.log('SIGTERM received. Shutting down gracefully...');\r\n // Close database connections\r\n await falkorDBService.close();\r\n process.exit(0);\r\n});\r\n\r\nprocess.on('SIGINT', async () => {\r\n console.log('SIGINT received. Shutting down gracefully...');\r\n // Close database connections\r\n await falkorDBService.close();\r\n process.exit(0);\r\n});\r\n\r\nmain().catch((error) => {\r\n console.error(\"Fatal error in main():\", error);\r\n process.exit(1);\r\n});\r\n\r\n"],"mappings":"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","names":["config"]}