新增: B5 续作引擎完整批: 自领+停靠恢复+监控推送+提交冻结

- B5 引擎: 看板轮询自动领单(G2 门禁 fail-closed, 领单原子写), parked 自动恢复优先, 收敛回读续作, 3 次熔断自停, KV 配置默认关
- 引擎配套: 提交冻结同步(df-commit-frozen), 工具结果外载过期清理, 工具失败快速记忆, 自监控快照飞书推送(df-monitor-chat-id)
- 领单判据收紧: 正文以 🔴 开头才判高危(正文提及字样不误判)
- 28 注入末轮竞态: 补充指令落末轮时顺延轮次预算(封顶 8)
- 停靠卡继续伪失败根修: ai_continue_loop 非 active 时分流 parked 恢复内核(recover_parked_inner 单一事实源)
- 实测: 写板 70 秒自动领单, 领单→执行→销账→回读→领下一单 全链闭环, 2050 测试过
This commit is contained in:
lxy
2026-10-07 18:32:43 +08:00
parent e36b55a2f6
commit 8c06076873
14 changed files with 1580 additions and 29 deletions
+18
View File
@@ -48,6 +48,7 @@ pub mod knowledge_inject;
pub mod lease;
// 系统通知(P1 bg 化补完):完成/失败/需介入三类事件,主窗托盘化时补位提醒(条件发送)
pub(crate) mod notify;
pub(crate) mod feishu_notify;
pub mod prompt;
pub mod provider_pool;
pub mod remote_bridge;
@@ -56,9 +57,15 @@ pub mod skills;
pub mod stream_recv;
pub mod title;
pub mod tool_registry;
// B5d 工具失败记忆:同调用连败拦截+换路引导(工具学习能力,治 404 连环死磕)
pub mod tool_failure_memory;
// D2a 工具结果外置 + D2d 90 天归档:审计大结果落盘留句柄,治 DB 膨胀
pub mod tool_result_offload;
// 声明式工具注册集合(tool_registry 拆分第一步 · 试点容器)。
// 试点:list_projects 已迁声明式 declare_tool! 宏,其余 47 工具仍在 tool_registry.rs。
pub mod tools;
// B5 无人值守续作引擎:看板轮询自动领单 + parked 自动恢复(收敛回读钩子在 agentic 出口)
pub mod unattended;
use agentic::conv_state::{ConvState, ConvStateStore};
@@ -1030,6 +1037,15 @@ pub struct PerConvState {
pub last_heartbeat: Arc<std::sync::atomic::AtomicU64>,
/// agentic loop 累计已跑 iteration 计数(语义同 AiSession.iteration_used)
pub iteration_used: usize,
/// 本 loop 的轮次预算快照(todo.md 28 末轮注入扩轮):run_agentic_loop 入口写入自身的
/// max_iterations,inject_runtime_message 读它判「注入是否落在末轮」。0=无预算概念
/// (loop 未起/子代理会话/max_iterations=0 不限轮次)→ 注入侧恒不扩轮。
/// plain usize 同锁读写(session lock 串行),无需原子;随会话销毁不落库。
pub loop_max_rounds: usize,
/// 注入侧顺延的轮次余量(todo.md 28):末轮注入时 inject_runtime_message +1,loop 跑到
/// 原轮次终点时读后清零消费、续跑一轮,让补充指令获得带工具的完整消费轮。
/// 同锁读写(session lock 串行);loop 入口清零防跨 loop 残留。
pub round_budget_extra: usize,
/// 当前 agent 循环的语言设置(用于审批后恢复循环)
pub agent_language: Option<String>,
/// 用户指定模型 override(主对话专用,语义同 AiSession.model_override)
@@ -1228,6 +1244,8 @@ impl PerConvState {
loop_epoch: Arc::new(std::sync::atomic::AtomicU64::new(0)),
last_heartbeat: Arc::new(std::sync::atomic::AtomicU64::new(0)),
iteration_used: 0,
loop_max_rounds: 0,
round_budget_extra: 0,
agent_language: None,
model_override: None,
session_trust: HashSet::new(),