Skip to content

feat: 新增用户补充指引功能,含队列管理与 UI 交互#117

Open
xinggitxing wants to merge 1 commit into
lessweb:mainfrom
xinggitxing:feat/supplementary-guidance
Open

feat: 新增用户补充指引功能,含队列管理与 UI 交互#117
xinggitxing wants to merge 1 commit into
lessweb:mainfrom
xinggitxing:feat/supplementary-guidance

Conversation

@xinggitxing
Copy link
Copy Markdown

概述

新增"补充指引"机制,允许用户在 LLM 正在处理提示词时(不中断当前轮次)发送额外指令。这实现了"边执行边引导"的交互模式,用户可输入指引文本进入队列,在下次 LLM API 调用前自动注入。

动机

此前当 LLM 忙碌时(例如在多步骤任务中执行工具调用),用户只能等待完成或直接中断智能体来发送新指令。本功能引入了一个非侵入式的补充消息队列:用户可以在智能体工作时输入并提交指引内容,系统会
将这些消息作为 system 消息在下次 LLM API 调用前注入(跳过总结阶段)。

核心变更

会话层(src/session.ts

  • 新增 PendingSupplementary 类型和 MAX_SUPPLEMENTARY_QUEUE(每会话上限 10 条)
  • MessageMeta.isSupplementary 标记用于消息渲染
  • 新增方法:addSupplementaryMessagecancelSupplementaryMessagecountPendingSupplementarylistPendingSupplementaryisInSummaryPhase
  • 私有方法 flushSupplementaryMessages():将队列条目转换为 system 角色的 SessionMessage[],内容前缀为 [User Supplementary Guidance]\n
  • 补充消息在 activateSession() 中每次 LLM 调用前注入,但仅在 非总结阶段(上次 LLM 响应包含 tool_calls 时)
  • isSummarizing 标记跟踪 LLM 返回是否包含 tool_calls

UI — App(src/ui/App.tsx

  • 新增状态:supplementaryCountsupplementaryListisSummarizing
  • onSupplementaryStatusChanged 回调将队列同步到 React 状态
  • 忙碌结束逻辑自动将未刷新的补充文本回填到 PromptInput
  • PromptInput 始终保持挂载(通过 height: 0 隐藏),防止视图切换时缓冲区丢失

UI — PromptInput(src/ui/PromptInput.tsx

  • 补充消息列表 UI,支持上下导航、退格取消、回车提交
  • isSummarizing 时阻止输入,显示"等待总结完成..."
  • 忙碌但 总结时,回车提交内容作为补充指引
  • Prompt 草稿合并逻辑:将现有缓冲区文本与补充草稿合并

UI — MessageView(src/ui/components/MessageView/index.tsx

  • message.meta?.isSupplementary 新增渲染分支:黄色边框的 [Supplementary Guidance] 信息块

测试(src/tests/session.test.ts

新增 10 个测试用例:

  • addSupplementaryMessage 队列添加并返回 ID
  • addSupplementaryMessage 队列满时返回 null
  • cancelSupplementaryMessage 移除特定消息
  • cancelSupplementaryMessage 空会话返回 false
  • flushSupplementaryMessages 返回正确角色和前缀的 system 消息
  • 补充队列按会话隔离
  • isInSummaryPhase 初始返回 false
  • 补充列表返回副本(不可变)
  • onSupplementaryStatusChanged 在添加和取消时被调用

文件变更

文件 变更量
src/session.ts +100 行
src/tests/session.test.ts +166 行(10 个测试)
src/ui/App.tsx +121 / -33 行
src/ui/PromptInput.tsx +112 / -33 行
src/ui/components/MessageView/index.tsx +15 行

测试结果

  • npm run check — 类型检查、代码规范、格式检查全部通过
  • ✅ 10 个新增测试用例全部通过

…nd UI

- Add PendingSupplementary queue (max 10 per session) with add/cancel/flush lifecycle
- Inject supplementary messages as system messages before LLM calls (non-summarizing only)
- Track isSummarizing phase: LLM responses without tool_calls mark summary phase
- UI: Supplementary message list with up/down navigation, backspace cancel, enter submit
- UI: Auto-refill unflushed supplementary text to PromptInput when agent becomes idle
- UI: Keep PromptInput mounted (hidden via zero-height) to prevent buffer loss
- UI: Render supplementary guidance messages in MessageView with distinct styling
- Tests: 10 new test cases covering queue management, isolation, immutability, callbacks
@xinggitxing
Copy link
Copy Markdown
Author

xinggitxing commented May 23, 2026

Issues #113 【TUI】不打断任务的情况下,补充发送引导信息。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant