多 Agent 并行执行指令(主控 AI)

你是主控 AI。你必须将以下所有子任务分解,并同时启动多个子代理(使用 task 工具)并行执行。每个子代理只负责一个明确、独立的任务。你负责收集所有子代理的输出,合并代码修改,运行编译验证,最后输出总结报告。

绝对禁止你自己直接修改代码。你只负责调度和汇总。如果子任务之间修改同一文件导致冲突,优先保留删除类操作(子任务 B),然后通知其他子代理调整。

项目上下文与编译验证(必须执行)

  • 根目录:当前工作目录(OpenCode 已注入)
  • Windows 编译:执行 build_windows.bat
  • Linux 编译:使用 wsl -d Ubuntu1804 进入,然后:
    cd /mnt/d/dd/openppp2
    mkdir build && cd build && cmake .. && make -j32
    
  • 你拥有真实的编译执行能力。所有子代理完成后,你必须运行 Windows 和 Linux 编译验证。若编译失败,读取错误输出,判断是哪个子任务导致,然后单独启动一个修复代理,只修复该问题,重新编译,直到成功。

子任务列表(每个子任务启动一个独立 Agent)

子任务 A:错误代码框架(≥300 个错误码)

目标:创建 ppp/diagnostics/Error.hppp/diagnostics/Error.cpp,实现完整的错误码体系。

具体要求

  1. 定义 enum class ErrorCode : uint32_t,包含 至少 300 个具体错误码。必须覆盖以下类别(每类至少 10-20 个):
    • 参数与配置错误
    • 文件系统错误
    • 内存错误
    • 网络接口错误(TUN/TAP 等)
    • IPv4/IPv6 协议栈错误(地址配置、路由、NDP、邻居代理、网关不可达等)
    • Linux 特有错误(sysctl、netlink、iptables、WSL 等)
    • Windows 特有错误(Winsock、注册表、防火墙等)
    • 线程与同步错误
    • 加密与证书错误
    • 认证与授权错误
    • 协议解析错误(PPP、LCP、IPCP、IPv6CP 等)
    • 定时器与超时错误
    • 资源耗尽错误
    • 内部逻辑错误
  2. 使用 thread_local ErrorCode tls_last_error,初始为 ErrorCode::Success
  3. 提供函数:
    ErrorCode GetLastErrorCode();
    ErrorCode SetLastErrorCode(ErrorCode code);   // 必须返回 code
    const char* FormatErrorString(ErrorCode code); // 静态映射,返回静态字符串
    
  4. 提供回调注册(支持多个回调,框架扩展用,你自己代码中不主动调用):
    void RegisterErrorHandler(ppp::function<void(int err)> handler);
    // 内部使用 std::vector<ppp::function<void(int)>> 存储
    
  5. 输出 Error.hError.cpp 的完整代码。

子任务 B:删除所有 DebugLog 和 (void) 语句

目标:彻底删除所有调试日志和无用强制转换,不破坏业务逻辑。

具体要求

  1. 遍历 ppp/ 目录下所有 .cpp.h 文件(排除 common/ 下的第三方库:lwip、json、base、dnslib 等)。
  2. 删除所有单独一行的 DebugLog(...); 调用。
  3. 删除所有 static void DebugLog(...) 函数定义(包括多行)。
  4. 删除所有单独一行的 (void)变量名; 语句(仅限用于消除未使用变量警告的强制转换)。
  5. 将所有 (void)函数调用(); 改为 函数调用();(保留调用,只去掉 (void))。
  6. 删除所有空函数(如 void foo() {}void foo() { })。
  7. 绝对禁止删除任何有业务逻辑的代码(条件分支、循环、赋值、网络操作等)。
  8. 输出所有修改过的文件列表及每个文件的 diff(或完整内容,仅限修改的文件)。

子任务 C:拆分 PppApplication 类实现

目标:将现有的 PppApplication 类实现从单一巨大文件拆分为多个模块,保持 main.cpp 为唯一入口。

具体要求

  1. 不得创建 PppMain.cppmain.cpp 是唯一的程序入口,内容简化为:
    #include "ppp/app/PppApplication.h"
    int main(int argc, char** argv) {
        auto& app = ppp::app::PppApplication::GetInstance();
        int result = app.Run(argc, argv);
        if (result != 0) {
            fprintf(stderr, "%s\n", ppp::diagnostics::FormatErrorString(ppp::diagnostics::GetLastErrorCode()));
        }
        return result;
    }
    
  2. PppApplication 类的声明移到 ppp/app/PppApplication.h
  3. 将现有的实现拆分为多个模块文件,例如:
    • ppp/app/PppApplication.cpp(只包含 Run 主流程和单例)
    • ppp/app/ApplicationInitialize.cpp(初始化系统、网络、配置)
    • ppp/app/ApplicationConfig.cpp(配置加载/保存)
    • ppp/app/ApplicationNetwork.cpp(网络接口、路由、IPv6 操作)
    • ppp/app/ApplicationMainLoop.cpp(主循环、事件处理)
    • 你可以根据现有代码功能自行决定更合理的拆分,但每个模块职责必须单一。
  4. 更新 CMakeLists.txt 和 VS 项目文件(ppp.vcxprojppp.vcxproj.filters),添加新源文件,移除旧的 PppApplication.cpp(如果原来是一个大文件)。
  5. 保持原有功能完全不变,只改变文件结构。
  6. 输出所有新文件和修改过的文件的完整代码。

子任务 D:补全流量日志(增加详细字段,不改变现有日志格式)

目标:在不改变现有日志系统格式和输出方式的前提下,为每个数据包增加更详细的流量跟踪日志(源/目的 IP、协议、端口、长度、方向等)。不要创建新的日志文件,不要硬编码 CSV 或 JSON,不要改变现有日志的调用方式

具体要求

  1. 分析现有流量日志机制
    • 找到当前记录数据包日志的代码位置(例如 VirtualEthernetLogger::LogPacketVirtualEthernetExchangerVirtualEthernetSwitcher 中的日志调用)。
    • 确定现有的日志输出函数/宏(例如 LOG_INFOppp::log::WriteTrafficLog 等)。阅读其实现,理解参数格式和输出方式(纯文本、带时间戳、是否支持额外字段)。
  2. 扩展日志内容
    • 在现有日志调用点,增加缺失的字段。必须包含:
      • 源 IP 地址(IPv4/IPv6)
      • 目的 IP 地址
      • 传输层协议(TCP/UDP/ICMP/其他)
      • 源端口(如适用,否则 0)
      • 目的端口(如适用,否则 0)
      • 数据包长度(字节)
      • 方向(上行/下行,或 client->server / server->client)
    • 保持与现有日志相同的分隔符和风格(例如若原有日志为 [时间] 事件 详情,则新增字段以 key=value 或空格分隔追加)。
    • 绝对不要改变已有日志行的格式,只在新产生的流量记录中增加字段。
  3. 性能要求
    • 日志写入必须非阻塞(如果现有日志已是异步则复用;否则确保不在数据包路径中执行同步 I/O)。
    • 不需要额外实现日志轮转(除非现有系统没有轮转且必须添加,但优先复用现有机制)。
  4. 输出内容
    • 分析结果:现有日志系统如何工作(函数名、宏、输出格式)。
    • 修改的代码:哪些文件、哪些函数被修改,展示修改后的完整函数或 diff。
    • 如何保证不改变原有日志格式的说明。
    • 如何保证性能的说明(复用异步队列等)。

子任务 E:IPv6 深层修复

目标:修复 IPv6 相关的问题:网关存在性检查、Linux GUA 模式下 sysctl 修改恢复、错误码设置。

具体要求

  1. 检查 ppp/app/server/VirtualEthernetSwitcher.cpp 中的 PrepareServerEnvironmentCleanupServerRules 函数。
  2. 在 GUA 模式下,记录修改了哪些 sysctl 参数(例如 net.ipv6.conf.all.forwardingnet.ipv6.conf.default.forwardingnet.ipv6.conf.eth0.proxy_ndp 等),在 CleanupServerRules 或新增的恢复函数中恢复原值。确保即使程序异常退出,下次启动时也能恢复(例如在启动时保存快照)。
  3. GetIPv6TransitGateway 或类似函数中,检查网关是否存在(例如通过 ip -6 route show defaultsysctl 查询)。如果不存在,设置 ErrorCode::IPv6GatewayNotReachable 并返回失败。
  4. 确保所有 IPv6 相关函数在失败时都调用 SetLastErrorCode,而不是直接打印错误。
  5. 输出修改过的函数的完整代码(diff 或完整函数)。

子任务 F:全工程英语注释(细粒度并行)

目标:为 ppp/ 下所有自研代码添加 Doxygen 风格英语注释。由于文件数量多,你必须将本任务拆分为多个微任务,每个微任务只处理 3-5 个文件,并行启动大量子代理。

主控执行步骤

  1. 首先,使用 findglob 获取 ppp/ 目录下所有需要注释的文件列表(排除 common/ 下的 lwip、json、base、dnslib 等第三方库)。只包括 .h.cpp 文件。
  2. 将文件列表按每 3-5 个文件一组 分组(例如 file_list_batch_1, file_list_batch_2, …)。
  3. 对每一组,启动一个独立的子代理,该子代理的任务是:只为这一组文件添加注释。子代理的提示词模板如下:
你是注释子代理。你只负责为以下文件添加 Doxygen 风格英语注释。不要修改任何代码逻辑。

文件列表:
[文件1路径]
[文件2路径]
...

要求:
1. 为每个文件添加头部注释:@file, @brief, @author(填写 "OPENPPP2 Team"), @license(填写项目许可证,如 MIT 或 GPL,根据现有文件头部推断)。
2. 为每个类、结构体、枚举添加 @brief 注释。
3. 为每个函数(包括成员函数)添加 @param, @return, @note。简单的 getter/setter 可简化。
4. 为超过 3 行的复杂逻辑块添加行内注释。
5. 只添加注释,不修改任何代码。
6. 输出每个修改后的文件的完整内容(或输出 diff,但必须清晰标示改动)。
  1. 收集所有子代理的输出,合并注释到工作区。

主控 Agent 的执行流程

  1. 并行启动子任务 A、B、C、D、E,以及子任务 F 下的所有注释微任务(同时启动数十个代理)。
  2. 等待所有子代理完成。收集每个子代理的输出。
  3. 合并修改:将所有子代理产生的文件修改应用到工作区。
  4. 运行编译验证(必须通过):
    • Windows: 执行 build_windows.bat(x86 Release 和 x64 Release 都要成功)。
    • Linux: 使用 wsl -d Ubuntu1804 进入目录,执行 mkdir -p build && cd build && cmake .. && make -j32
    • 如果编译失败,读取错误输出,判断是哪个子任务引入的问题,然后单独启动一个修复代理,只修复该问题,重新编译,直到成功。
  5. 输出最终报告
    • 所有子任务的完成状态(打勾)
    • 新增/修改的文件列表
    • 错误码数量(证明 ≥300)
    • 编译成功确认信息(Windows 和 Linux 的最后几行输出)
    • 任何遗留问题或需要手动注意的地方

强制约束(违反任何一条视为任务失败)

  • 不得创建 PppMain.cppmain.cpp 是唯一入口。
  • 错误码必须 ≥300 个,不得敷衍。
  • 流量日志不得改变现有日志格式,只增加字段。
  • 不得修改 common/ 下的第三方库(lwip、json、base、dnslib 等)。
  • 删除操作必须保留所有业务逻辑(函数调用、条件分支、循环等)。
  • 注释不得修改代码逻辑
  • 编译必须通过(Windows + Linux)。
  • 主控 AI 和所有子代理不得询问用户任何问题。你全权决定所有技术细节,自主完成全部任务后输出最终报告。

开始执行

你现在拥有所有必要信息。立即启动所有子任务(并行),等待完成后合并、编译、验证,最后输出最终报告。不得中途停止,不得向用户确认。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐