W20: Tool Calling 闭环 + Stream+Tools + 回归测试 + session auto-save + ASan CI (W20.1-W20.6)
Some checks failed
CI / Determine matrix (push) Has been cancelled
CI / ${{ matrix.os }} / ${{ matrix.build_type }} (push) Has been cancelled
CI / Sanitizer (ASan+UBSan) / ubuntu-24.04 (push) Has been cancelled

- 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:
2026-05-27 20:15:00 +08:00
parent 3250b5a8bf
commit 20ead86e88
14 changed files with 730 additions and 21 deletions

View File

@@ -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: []
---

View File

@@ -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: []
---

View File

@@ -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 warning5/5 基线测试 100% pass"
rating: A

View File

@@ -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.jsonLinux ~/.dstalk/session.json。
使用 _dupenv_s/getenv 获取平台标准目录。
编译 0 error 0 warningctest 5/5 pass。
无新增依赖,不涉及多会话管理。
rating: completed
current_groups: []
---

View File

@@ -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

View File

@@ -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