UNPKG

dynamic-interaction

Version:

Dynamic interaction 动态交互mcp,用于cursor、windsurf、trae 等 AI 智能编辑器 Agent 运行时交互使用

83 lines (82 loc) 3.65 kB
"use strict"; /** * MCP solicit-input 工具实现 * 此模块现在负责调用服务器来启动用户交互,并等待结果。 */ Object.defineProperty(exports, "__esModule", { value: true }); exports.solicitUserInput = solicitUserInput; exports.notifyUser = notifyUser; const connection_1 = require("../server/websocket/connection"); const processor_1 = require("../server/messaging/processor"); const queue_1 = require("../server/session/queue"); const session_1 = require("../types/session"); // 引入会话模式枚举 const config_1 = require("../config"); // 新增:导入 PORT const logger_1 = require("../logger"); /** * Agent 调用此函数来请求用户输入或发送通知。 * 它会与服务器通信,启动一个 UI 会话。 * 如果已有活动的WebSocket连接,则复用该连接;否则打开新的浏览器窗口。 * @param projectDirectory 需要用户审核的项目目录的绝对路径。 * @param summary 向用户展示的 AI 工作摘要。 * @param mode 会话模式,默认为交互模式。通知模式不等待用户响应。 * @returns 一个 Promise,解析为用户提供的反馈或通知确认。 */ async function solicitUserInput(projectDirectory, summary, mode = session_1.SessionMode.INTERACTIVE) { const url = `http://localhost:${config_1.PORT}`; // 检查是否有活动的WebSocket连接 const hasActiveConnections = connection_1.webSocketManager.getConnectionCount() > 0; if (!hasActiveConnections) { // 仅在没有活动连接时才打开新的浏览器窗口 logger_1.logger.info(`MCP: 没有活动的WebSocket连接,指导用户在浏览器中打开: ${url}`); try { const open = (await import('open')).default; await open(url); } catch (e) { logger_1.logger.warn(`MCP: 自动打开浏览器失败,请用户手动访问: ${url}`); } } else { logger_1.logger.info(`MCP: 检测到${connection_1.webSocketManager.getConnectionCount()}个活动WebSocket连接,复用现有连接`); } try { // 创建会话请求 const sessionRequest = { id: require('crypto').randomUUID(), summary, projectDirectory, createdAt: Date.now(), mode, resolve: null, reject: null, retryCount: 0 }; // 创建Promise并设置resolve/reject const feedbackPromise = new Promise((resolve, reject) => { sessionRequest.resolve = resolve; sessionRequest.reject = reject; }); // 将请求入队 queue_1.sessionQueue.enqueue(sessionRequest); logger_1.logger.info(`MCP: ${mode}模式会话已启动,ID: ${sessionRequest.id}`); // 触发队列处理 processor_1.messageProcessor.checkQueueAndProcess(); const feedback = await feedbackPromise; logger_1.logger.debug(`MCP: 从服务器收到反馈 (${mode}模式):`, feedback); return feedback; } catch (error) { logger_1.logger.error(`MCP: 获取用户反馈时出错 (${mode}模式):`, error); return { error: (error instanceof Error ? error.message : String(error)) }; } } /** * 专用的通知工具接口,立即返回成功状态 * @param projectDirectory 项目目录的绝对路径 * @param summary 通知摘要 * @returns 立即返回成功的Promise */ async function notifyUser(projectDirectory, summary) { logger_1.logger.info(`MCP: 调用通知模式`); return solicitUserInput(projectDirectory, summary, session_1.SessionMode.NOTIFICATION); }