dynamic-interaction
Version:
Dynamic interaction 动态交互mcp,用于cursor、windsurf、trae 等 AI 智能编辑器 Agent 运行时交互使用
83 lines (82 loc) • 3.65 kB
JavaScript
;
/**
* 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);
}