@iflow-mcp/promptx
Version:
AI角色创建平台和智能工具开发平台,基于MCP协议提供专业AI能力注入
1 lines • 12.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/serverConfigManager/index.ts"],"sourcesContent":["\n// 服务器配置管理器\nexport * from './serverConfigManager';","/**\n * @fileoverview \n * 此文件提供了 ServerConfigManager 类,用于管理 PromptX 应用程序的服务器配置。\n * 包括端口、主机地址、传输类型等配置的读取、设置和持久化。\n * \n * @author PromptX Team\n * @version 1.0.0\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { homedir } from 'os';\n\n/**\n * 服务器配置接口\n * \n * @interface ServerConfig\n * @property {number} port - 服务器端口号,默认 5203\n * @property {string} host - 主机地址,默认 'localhost'\n * @property {'stdio' | 'http'} transport - 传输类型,默认 'stdio'\n * @property {boolean} corsEnabled - 是否启用 CORS,默认 false\n * @property {boolean} debug - 是否启用调试模式,默认 false\n */\nexport interface ServerConfig {\n /** 服务器端口号 */\n port: number;\n /** 主机地址 */\n host: string;\n /** 传输类型 */\n transport: 'stdio' | 'http';\n /** 是否启用 CORS */\n corsEnabled: boolean;\n /** 是否启用调试模式 */\n debug: boolean;\n}\n\n/**\n * 默认服务器配置\n */\nconst DEFAULT_CONFIG: ServerConfig = {\n port: 5203,\n host: 'localhost',\n transport: 'stdio',\n corsEnabled: false,\n debug: false\n};\n\n/**\n * ServerConfigManager 类 - 管理服务器配置\n * \n * 此类提供了服务器配置的读取、设置和持久化功能,\n * 配置文件存储在用户主目录的 .promptx 文件夹中。\n * \n * @class ServerConfigManager\n */\nexport class ServerConfigManager {\n /**\n * 配置文件路径\n * @private\n */\n private configPath: string;\n\n /**\n * 当前配置缓存\n * @private\n */\n private config: ServerConfig;\n\n /**\n * 构造函数\n * \n * @param {string} [configDir] - 可选的配置目录路径,默认为用户主目录下的 .promptx\n */\n constructor(configDir?: string) {\n const defaultConfigDir = join(homedir(), '.promptx');\n const actualConfigDir = configDir || defaultConfigDir;\n this.configPath = join(actualConfigDir, 'server-config.json');\n \n // 确保配置目录存在\n if (!existsSync(actualConfigDir)) {\n mkdirSync(actualConfigDir, { recursive: true });\n }\n\n // 加载配置\n this.config = this.loadConfig();\n }\n\n /**\n * 从文件加载配置\n * \n * @private\n * @returns {ServerConfig} 加载的配置对象\n */\n private loadConfig(): ServerConfig {\n try {\n if (existsSync(this.configPath)) {\n const configData = readFileSync(this.configPath, 'utf-8');\n const parsedConfig = JSON.parse(configData);\n \n // 合并默认配置和加载的配置,确保所有字段都存在\n return {\n ...DEFAULT_CONFIG,\n ...parsedConfig\n };\n }\n } catch (error) {\n console.warn(`Failed to load server config from ${this.configPath}:`, error);\n }\n \n // 如果加载失败或文件不存在,返回默认配置\n return { ...DEFAULT_CONFIG };\n }\n\n /**\n * 保存配置到文件\n * \n * @private\n * @throws {Error} 当保存失败时抛出错误\n */\n private saveConfig(): void {\n try {\n // 确保配置目录存在\n const configDir = dirname(this.configPath);\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n writeFileSync(this.configPath, JSON.stringify(this.config, null, 2), 'utf-8');\n } catch (error) {\n throw new Error(`Failed to save server config to ${this.configPath}: ${error}`);\n }\n }\n\n /**\n * 获取当前完整配置\n * \n * @returns {ServerConfig} 当前配置对象的副本\n */\n getConfig(): ServerConfig {\n return { ...this.config };\n }\n\n /**\n * 获取端口号\n * \n * @returns {number} 当前配置的端口号\n */\n getPort(): number {\n return this.config.port;\n }\n\n /**\n * 设置端口号\n * \n * @param {number} port - 要设置的端口号\n * @throws {Error} 当端口号无效时抛出错误\n */\n setPort(port: number): void {\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(`Invalid port number: ${port}. Port must be an integer between 1 and 65535.`);\n }\n \n this.config.port = port;\n this.saveConfig();\n }\n\n /**\n * 获取主机地址\n * \n * @returns {string} 当前配置的主机地址\n */\n getHost(): string {\n return this.config.host;\n }\n\n /**\n * 设置主机地址\n * \n * @param {string} host - 要设置的主机地址\n * @throws {Error} 当主机地址无效时抛出错误\n */\n setHost(host: string): void {\n if (!host || typeof host !== 'string' || host.trim().length === 0) {\n throw new Error(`Invalid host address: ${host}. Host must be a non-empty string.`);\n }\n \n this.config.host = host.trim();\n this.saveConfig();\n }\n\n /**\n * 获取传输类型\n * \n * @returns {'stdio' | 'http'} 当前配置的传输类型\n */\n getTransport(): 'stdio' | 'http' {\n return this.config.transport;\n }\n\n /**\n * 设置传输类型\n * \n * @param {'stdio' | 'http'} transport - 要设置的传输类型\n * @throws {Error} 当传输类型无效时抛出错误\n */\n setTransport(transport: 'stdio' | 'http'): void {\n if (transport !== 'stdio' && transport !== 'http') {\n throw new Error(`Invalid transport type: ${transport}. Transport must be 'stdio' or 'http'.`);\n }\n \n this.config.transport = transport;\n this.saveConfig();\n }\n\n /**\n * 获取 CORS 启用状态\n * \n * @returns {boolean} 当前 CORS 启用状态\n */\n getCorsEnabled(): boolean {\n return this.config.corsEnabled;\n }\n\n /**\n * 设置 CORS 启用状态\n * \n * @param {boolean} enabled - 是否启用 CORS\n */\n setCorsEnabled(enabled: boolean): void {\n this.config.corsEnabled = Boolean(enabled);\n this.saveConfig();\n }\n\n /**\n * 获取调试模式状态\n * \n * @returns {boolean} 当前调试模式状态\n */\n getDebug(): boolean {\n return this.config.debug;\n }\n\n /**\n * 设置调试模式状态\n * \n * @param {boolean} enabled - 是否启用调试模式\n */\n setDebug(enabled: boolean): void {\n this.config.debug = Boolean(enabled);\n this.saveConfig();\n }\n\n /**\n * 批量更新配置\n * \n * @param {Partial<ServerConfig>} updates - 要更新的配置项\n * @throws {Error} 当配置项无效时抛出错误\n */\n updateConfig(updates: Partial<ServerConfig>): void {\n // 验证更新的配置项\n if (updates.port !== undefined) {\n if (!Number.isInteger(updates.port) || updates.port < 1 || updates.port > 65535) {\n throw new Error(`Invalid port number: ${updates.port}. Port must be an integer between 1 and 65535.`);\n }\n }\n\n if (updates.host !== undefined) {\n if (!updates.host || typeof updates.host !== 'string' || updates.host.trim().length === 0) {\n throw new Error(`Invalid host address: ${updates.host}. Host must be a non-empty string.`);\n }\n }\n\n if (updates.transport !== undefined) {\n if (updates.transport !== 'stdio' && updates.transport !== 'http') {\n throw new Error(`Invalid transport type: ${updates.transport}. Transport must be 'stdio' or 'http'.`);\n }\n }\n\n // 应用更新\n this.config = {\n ...this.config,\n ...updates,\n host: updates.host ? updates.host.trim() : this.config.host,\n corsEnabled: updates.corsEnabled !== undefined ? Boolean(updates.corsEnabled) : this.config.corsEnabled,\n debug: updates.debug !== undefined ? Boolean(updates.debug) : this.config.debug\n };\n\n this.saveConfig();\n }\n\n /**\n * 重置配置为默认值\n */\n resetToDefaults(): void {\n this.config = { ...DEFAULT_CONFIG };\n this.saveConfig();\n }\n\n /**\n * 获取服务器 URL(仅在 HTTP 传输模式下有效)\n * \n * @returns {string} 服务器 URL\n */\n getServerUrl(): string {\n if (this.config.transport !== 'http') {\n throw new Error('Server URL is only available in HTTP transport mode');\n }\n \n return `http://${this.config.host}:${this.config.port}`;\n }\n\n /**\n * 检查端口是否可用(简单检查,不进行实际绑定测试)\n * \n * @param {number} port - 要检查的端口号\n * @returns {boolean} 端口号是否在有效范围内\n */\n static isValidPort(port: number): boolean {\n return Number.isInteger(port) && port >= 1 && port <= 65535;\n }\n\n /**\n * 检查主机地址格式是否有效(简单检查)\n * \n * @param {string} host - 要检查的主机地址\n * @returns {boolean} 主机地址格式是否有效\n */\n static isValidHost(host: string): boolean {\n return typeof host === 'string' && host.trim().length > 0;\n }\n}"],"mappings":"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","names":[]}