v0.4.0
v0.4.0 更新日志
refactor — 架构重构
Worker + Reactor 架构
- 将原来的
AgentLoop拆分为 Worker(纯状态机)与 Reactor(调度层)两部分 - 引入
WorkerCommand/WorkerEvent通道用于内部通信,解耦命令发送与状态反馈 - 新增
PromptKind(Enter / AltEnter)和PromptRequest类型,统一管理用户输入 - Reactor 负责接收 Worker 事件并按优先级调度命令,Worker 专注 LLM 调用状态流转
提示词队列系统
- 新增
PromptQueued/PromptConsumed事件,为 TUI 提供实时队列反馈 App中新增pending_prompts追踪已入列提示词的 ID- Alt+Enter 提交的提示词进入队列,等待 Worker 空闲后逐条处理
- 底层依赖:
oy-tui新增uuid依赖用于生成提示词 ID
fix — 修复
状态竞争条件 (stale-state race)
- 乐观更新策略:在发送命令给 Worker 之前,TUI 层先将
worker_state乐观更新为Thinking,防止状态传播窗口期内 TUI 请求被错误转发 notify_state从try_send改为 async send,确保状态变更不会被静默丢弃
Enter 提示词注入时序
- 在
StateChanged(ToolCall)时 flushenter_queue;Worker 在tool_call()后 draincmd_rx,将排队的提示词作为 user message 与 tool results 一起注入,在下一次 LLM 调用前发送 - Alt+Enter 提示词保持排队,直到 Worker 回到
Idle状态后才处理 FlushEnterQueue错误吞噬修复:批处理所有提示词,返回最后一个错误而非静默覆盖中间错误
队列编号动态化
- 移除
PromptQueued消息中的持久化number字段 - 移除
App中的next_prompt_number循环计数器 - 队列编号在渲染时根据位置动态计算(
index + 1) - 撤销提示词改为按队列中的第 N 个查找,而非存储的编号
- 消除旧行为的两大问题:
- 消费 [1][2][3] 后新增显示 [4] 而非 [1](编号不重置)
- 撤销中间提示词后出现 [1][3] 而非 [1][2](编号不重排)
UI 状态文本
- 更新状态栏文本,添加 Alt+Enter 快捷键提示,告知用户可将提示词发送到队列
chore — 工程维护
- 各模块版本已更新至 v0.4.0
oy-tui新增 dependency:uuid = { version = "1", features = ["v7"] }- Cargo.lock 自动更新
What's Changed
- Feat v0.4.0 by @cherish-ltt in #4
Full Changelog: v0.3.0...v0.4.0