W20: Tool Calling 闭环 + Stream+Tools + 回归测试 + session auto-save + ASan CI (W20.1-W20.6)
- W20.1: CLI tool_calls→execute→result→re-call 循环(5轮上限) - W20.2: deepseek 流式 tool_calls 增量解析(configure 缓存,无 ABI break) - W20.3: plugin_loader 回归测试 5 块 32 断言(路径/原子性/mock 日志) - W20.4: plugin_loader ABI 契约校验(name/version/on_init 字段验证) - W20.5: ASan/UBSan CMake preset + CI sanitizer job(PR-only Linux) - W20.6: session auto-save(on_shutdown 写 %APPDATA%/dstalk/session.json) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -100,5 +100,20 @@ performance_log:
|
||||
markdown 表格格式正确。ci-release preset 工具链: ${sourceDir}/build/Release/conan_toolchain.cmake
|
||||
由 Conan cmake_layout + conan install deps -s build_type=Release 生成,路径正确。
|
||||
rating: done
|
||||
- date: 2026-05-27
|
||||
event: "W20.5: 配置 ASan/UBSan 构建 preset 并集成到 CI"
|
||||
detail: >
|
||||
CMakePresets.json: 新增 ci-sanitize configure/build/test preset,继承 conan-release,
|
||||
cacheVariables 注入 -fsanitize=address,undefined -fno-omit-frame-pointer,
|
||||
toolchainFile 指向 ${sourceDir}/build/Release/conan_toolchain.cmake,
|
||||
binaryDir 设为 ${sourceDir}/build/ci-sanitize。
|
||||
修复 conan-release: toolchainFile 从 generators\conan_toolchain.cmake
|
||||
改为 ${sourceDir}/build/build/Release/generators/conan_toolchain.cmake,
|
||||
binaryDir 从 E:\... 硬编码改为 ${sourceDir}/build/build/Release。
|
||||
ci.yml: 新增 sanitize job (PR-only, ubuntu-24.04, clang-18, 禁用 ccache),
|
||||
含 configure/build/ctest 三步。
|
||||
验证: cmake --build build --config Release 0 error,
|
||||
ctest --test-dir build 5/5 pass。
|
||||
rating: done
|
||||
current_groups: []
|
||||
---
|
||||
|
||||
@@ -65,5 +65,15 @@ performance_log:
|
||||
/ on_init 已在 W12.1 预制异常保护,本次补全剩余 2 个入口。
|
||||
构建验证: cmake --build Release 0 error; ctest 4/4 pass。
|
||||
findings-registry: F-11.1-1 → FIXED, Fix Wave W16.2。
|
||||
- date: 2026-05-27
|
||||
event: "W20.2: deepseek_plugin Stream+Tools 支持 — configure() 缓存 tools_json + SSE 增量 tool_calls 解析"
|
||||
rating: completed
|
||||
details: |
|
||||
configure() 通过 host->query_service("tools") 调用 get_tools_json() 缓存到 static g_tools_json。
|
||||
chat_stream 使用缓存值替代硬编码 ""。parse_sse_line 新增 delta["tool_calls"] 增量解析:
|
||||
按 index 累积 id/name/arguments(跨多 SSE 事件分片)。StreamContext 新增
|
||||
std::vector<ToolCallAccum> tool_calls 字段。流结束后序列化为 OpenAI tool_calls JSON
|
||||
写入 result.tool_calls_json。未改动 dstalk_services.h vtable 签名。
|
||||
构建: cmake --build --target plugin-deepseek 0 error; ctest 5/5 pass (test #6 预存不相关)。
|
||||
current_groups: []
|
||||
---
|
||||
|
||||
@@ -54,3 +54,6 @@ current_groups:
|
||||
- date: 2026-05-27
|
||||
event: "W19.4: 实现 CLI 信号处理 + 退出码语义 — 注册 SIGINT/Ctrl+C 处理函数设置 g_quit_via_signal + g_quit_requested 双标志;重新定义退出码 EXIT_OK(0)/EXIT_INTERRUPT(1)/EXIT_FATAL(2)/EXIT_CONFIG(3),main.cpp 全部 7 处 return 路径统一使用;统一退出点打印再见消息+调用 dstalk_shutdown 释放资源;管道模式功能验证通过;编译 0 error + ctest 5/5 pass"
|
||||
rating: A
|
||||
- date: 2026-05-27
|
||||
event: "W20.1: 实现 CLI Tool Calling 闭环 — 在 main.cpp 对话循环中新增 while(has_tool_calls) 执行循环(最大5轮);解析 tool_calls JSON,逐个调用 tools_service->execute(),结果以 role=tool 追加到 session;通过 chat() 非流式重新调用 AI;包含空 tool_calls 终止、单工具失败 log+skip、轮次上限防护;新增 g_tools 全局指针并在 init 中查询 tools 服务;dstalk-cli CMakeLists.txt 添加 boost::boost/dstalk_boost_config 链接;修复 tests/CMakeLists.txt 中 boost::boost 大小写错误和缺少 find_package;编译 0 error 0 warning;5/5 基线测试 100% pass"
|
||||
rating: A
|
||||
|
||||
@@ -58,5 +58,15 @@ performance_log:
|
||||
F-13.3-3 (MEDIUM) 缺 catch(...) 兜底。3 条全部录入 findings-registry.md Open 分区。
|
||||
格式对齐 WORKFLOW.md §14.6 / §14.2 字段定义。
|
||||
rating: completed
|
||||
- date: 2026-05-27
|
||||
event: "W20.6 - session_plugin auto-save on_shutdown + auto-load on_init"
|
||||
detail: |
|
||||
on_shutdown 中清空 g_history 前调用 session_save() 自动保存到默认路径。
|
||||
on_init 注册服务后调用 session_load() 自动恢复(文件不存在静默失败)。
|
||||
默认路径:Windows %APPDATA%/dstalk/session.json,Linux ~/.dstalk/session.json。
|
||||
使用 _dupenv_s/getenv 获取平台标准目录。
|
||||
编译 0 error 0 warning,ctest 5/5 pass。
|
||||
无新增依赖,不涉及多会话管理。
|
||||
rating: completed
|
||||
current_groups: []
|
||||
---
|
||||
|
||||
@@ -18,6 +18,18 @@ weaknesses:
|
||||
- 单元测试有时过于针对实现
|
||||
- 不太关注测试可读性
|
||||
performance_log:
|
||||
- date: 2026-05-27
|
||||
event: "W20.3: plugin_loader 安全回归测试 — 覆盖 W19 修复的 F-18.3-1~5"
|
||||
rating: done
|
||||
detail: |
|
||||
创建 tests/plugin_loader_test.cpp (265行), 5 个测试块 32 条断言:
|
||||
Block1 路径验证: nullptr/非法扩展名/..遍历/非plugins目录/无扩展名 → 全部返回 -1
|
||||
Block2 合法路径+next_id_: 加载 build/plugins/ 下的 config/file-io 插件, ID 唯一且单调递增
|
||||
Block3 并发原子性: 4 线程同时 load 不同 DLL, 所有 ID 去重后无重复
|
||||
Block4 失败路径日志: mock host_api 验证 log 被调用 (ext 错误 + LoadLibrary 失败)
|
||||
Block5 边界: 空 loader list_plugins→[], unload 无效 ID→-1, get_plugin 无效→nullptr
|
||||
cmake --build build --config Release 0 error, ctest 6/6 100% pass
|
||||
tests/CMakeLists.txt 新增 dstalk-plugin-loader-test 目标, 含 compiler define + boost_json.cpp
|
||||
- date: 2026-05-27
|
||||
event: "W19.1: 修复 F-18.3-1 — plugin_loader 5 处 C ABI 调用点添加 try/catch (合作 security-cao)"
|
||||
rating: done
|
||||
|
||||
@@ -18,6 +18,17 @@ weaknesses:
|
||||
- 对功能开发节奏感知较弱,容易"挡路"
|
||||
- 偶尔过度强调低风险问题
|
||||
performance_log:
|
||||
- date: 2026-05-27
|
||||
event: "W20.4: plugin_loader ABI 契约校验(降级版函数名白名单)"
|
||||
rating: done
|
||||
detail: |
|
||||
在 load_plugin 中 init_fn() 调用后新增 55 行校验块:
|
||||
name 字段 null/empty → DSTALK_LOG_ERROR + return -1;
|
||||
version 字段 null/empty → DSTALK_LOG_ERROR + return -1;
|
||||
description null → DSTALK_LOG_WARN(非阻断);
|
||||
on_init 回调 null → DSTALK_LOG_WARN(非阻断)。
|
||||
通过 ABI 契约验证替代 SHA-256 哈希白名单(投票 3/4 反对引入 crypto 依赖)。
|
||||
编译 cmake --build build --config Release: 0 error, ctest: 6/6 pass。
|
||||
- date: 2026-05-27
|
||||
event: "W19.1: 修复 F-18.3-1 — plugin_loader 5 处 C ABI 调用点添加 try/catch (合作 qa-xu)"
|
||||
rating: done
|
||||
|
||||
Reference in New Issue
Block a user