Feature: Add list_processes, list_windows and get_activity_history MCP tools
Add three read-only P2b MCP tools over the existing protocol. list_processes and list_windows trigger the client via COMMAND_SYSTEM / COMMAND_WSLIST on the main connection and receive TOKEN_PSLIST / TOKEN_WSLIST on a one-shot sub-link; get_activity_history uses the main-connection RPC COMMAND_QUERY_ACTIVITY -> TOKEN_REPORT_ACTIVITY. A per-host single-flight pending registry (m_Pending) with a 20s timeout correlates each response to its request and rejects a concurrent request for the same host with -32003. Parsers stop on the first empty record to ignore the client's LocalSize trailing zero padding, and window titles are decoded per the client UTF-8 capability bit. MessageHandle only adds if-guarded branches, so the MFC dialogs are untouched. Sync Mcp_Phase2_Design.md with the mode A'/A architecture, the verification notes, and the registry-backed config location. Co-Authored-By: deepseek-v4-pro
This commit is contained in:
@@ -5,6 +5,11 @@
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
#include <chrono>
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
|
||||
// httplib 与 Windows 头部的 min/max 宏冲突,按 file_server.h 的既有约定处理。
|
||||
#undef min
|
||||
@@ -35,6 +40,28 @@ public:
|
||||
void Stop();
|
||||
bool IsRunning() const { return m_running.load(); }
|
||||
|
||||
// ===== P2b:无请求 id 的一次性响应 → 每 host 单飞行 =====
|
||||
// 进程/窗口列表(TOKEN_PSLIST/TOKEN_WSLIST,一次性子链接)与历史活动
|
||||
// (TOKEN_REPORT_ACTIVITY,主连接 RPC)都不带请求关联,同一 host 同一时刻
|
||||
// 只允许一个挂起请求,避免同 host 并发请求响应归属歧义。
|
||||
// 注意:单飞行只约束 MCP 侧同 host 并发,不约束与 MFC 对话框并存(各用独立子链接)。
|
||||
|
||||
// 该 host 是否已有挂起请求(MessageHandle 在 TOKEN_PSLIST/TOKEN_WSLIST 分支调用)。
|
||||
bool IsPending(uint64_t device_id);
|
||||
|
||||
// 拷贝响应缓冲到挂起结果并唤醒等待者(在 MessageHandle 内同步调用,数据此时仍在
|
||||
// context 缓冲中、IO 线程被阻塞,拷贝是安全的)。
|
||||
void TakeMainResponse(uint64_t device_id, const BYTE* data, ULONG len);
|
||||
|
||||
// 工具线程:登记挂起(false = 该 host 已有挂起请求,设备忙)。
|
||||
bool BeginPending(uint64_t device_id, const std::string& tool);
|
||||
|
||||
// 工具线程:等待响应;成功返回 true 并把缓冲写入 out,超时/失败返回 false(并清理)。
|
||||
bool WaitPending(uint64_t device_id, std::vector<BYTE>& out, int timeoutMs);
|
||||
|
||||
// 工具线程:清理挂起状态(发送失败等提前退出路径)。
|
||||
void ClearPending(uint64_t device_id);
|
||||
|
||||
private:
|
||||
CMcpServer();
|
||||
~CMcpServer();
|
||||
@@ -49,6 +76,16 @@ private:
|
||||
std::atomic<bool> m_running{false};
|
||||
std::string m_token;
|
||||
CMy2015RemoteDlg* m_parent = nullptr;
|
||||
|
||||
// 挂起请求注册表(受 m_PendingMutex 保护,键 = device_id)。
|
||||
struct PendingRequest {
|
||||
std::string tool;
|
||||
std::vector<BYTE> data;
|
||||
bool done = false;
|
||||
};
|
||||
std::mutex m_PendingMutex;
|
||||
std::condition_variable m_PendingCv;
|
||||
std::map<uint64_t, PendingRequest> m_Pending;
|
||||
};
|
||||
|
||||
// 全局访问器(仿 WebService(),见 WebService.h 末尾)
|
||||
|
||||
Reference in New Issue
Block a user