Skip to content

feat(web): 补齐结构化问答、计划卡片和原生命令反馈 - #595

Open
6iKUN6 wants to merge 3 commits into
openpi-dev:mainfrom
6iKUN6:codex/web-ask-user
Open

6iKUN6 wants to merge 3 commits into
openpi-dev:mainfrom
6iKUN6:codex/web-ask-user

Conversation

@6iKUN6

@6iKUN6 6iKUN6 commented Sep 19, 2026

Copy link
Copy Markdown
Contributor

Problem

Refs #562,关联 #343#348

部分 OpenPI 工具和扩展命令已经可以在 Web 中执行,但浏览器缺少对应交互:ask_user 等待答案时没有提交入口,plan_ready 的完整计划藏在工具结果里,human_handoff 没有反馈卡片,部分命令执行后也没有可见结果。命令菜单统一标为“不支持”,与手动提交后仍可能执行的行为不一致。

验收中还复现了计划生成期间消息反复消失,以及停止等待中的问答时,实际已取消却显示失败的问题。

Value

用户可以在 Web 中完成提问、复核答案、阅读计划和反馈人工操作,也能明确看到当前模式、命令结果和停止状态。继续使用 Pi 原有的工具、Session、命令分派与取消流程,不增加另一套代理或权限系统。

Approach

  • 增加紧凑的 ask_user 卡片,支持选项、自定义答案和复核提交。待回答的问题绑定到发起标签页、Session 和轮次;支持刷新恢复、过期、取消和重复提交回执。关闭卡片不提交草稿,也不扩大工具原有的 Plan/Setup 使用范围。
  • 修复审查指出的复制标签页身份问题:首次请求前通过 Web Locks 独占 controller ID,遇到复制的 sessionStorage 身份则重新生成。普通刷新可恢复原身份;不支持 Web Locks 时使用新身份,安全降级但不保证刷新恢复。此机制隔离问答控制权,不隔离同一 Session 的历史消息,也不是新的登录体系。
  • 已与 feat(web): complete session workbar and settings experience #561 做语义 rebase,保留三栏布局、工作栏、图片附件和设置页行为。设置窗口内可直接回答或停止问答,主聊天区继续遵守上游隐藏 Setup 过程的约定。
  • 展示 plan_ready 成功返回的 Markdown 计划,支持收起、复制和刷新恢复。卡片不代表批准实施;本次不实现 bug(web): Plan Ready 后实施命令被静默处理,工具门仍关闭 #470 的实施交接,也不把未完成的流式参数显示成已就绪计划。
  • 增加由现有 Plan 扩展控制的模式开关。切换不调用模型、不发送聊天气泡、不清空草稿;发送任务后才开始规划,并显示当前模式提示。写入限制仍由运行时执行。
  • human_handoff 增加操作说明和复核提交。“已完成”只是用户报告,模型仍需验证完成信号。
  • 补齐已适配命令的菜单说明,以及 Plan/Cron/Usage 的浏览器反馈。命令仍交给 Pi 分派;界面反馈不额外进入模型上下文。
  • 加强 Setup 对非法请求值的提示约束:说明合法范围,未经用户明确选择,不擅自替换为其他合法值。实际写入仍经过原有类型校验。
  • 修复正常 SSE 缓冲被误判为断线的问题,保留每个连接的缓冲上限;修复问答取消后进入下一次模型调用时被初始化流程误报为普通错误的问题。

本次不包含主题选择器、主题直接写入接口或首屏主题处理,相关改动保留在独立本地分支继续打磨。

实现与边界说明:Web structured questionsWeb interaction UI

Validation

已基于上游 main45f12a4(已合并 #561)完成冲突处理和重新验证。以下是整合后的结果,使用 Node 24.16.0:

  • bun run check:通过,包含配置/文档合同、生产构建、格式、lint 和类型检查。
  • bun run test:Node 1,712 passed / 2 failed / 1 skipped。两个失败是已有的 TUI Plan Markdown 渲染断言;用未修改的上游 45f12a4 和同一套依赖单独运行该文件,也得到 22 passed / 2 failed。不宣称全量测试通过。
  • Node 失败会阻止后续 Vitest 分区,因此另外运行全部 .spec.ts--maxWorkers=2):22 files / 318 passed。默认高并发曾导致已有设置页和侧栏测试超时,限制并发后通过,没有放宽断言或超时时间。
  • playwright test --config tests/web/playwright.config.ts:50 passed。
  • playwright test --config tests/web/playwright.provider.config.ts:12 passed。使用隔离 Pi 目录、本地合成 Provider 和真实 Host/Pi/浏览器,不读取用户凭据。
  • 复制身份回归使用真正的 window.open 继承存储,验证新标签页换身份、无法取得待答卡片、提交取消得到 403,原页刷新仍可回答。该用例在修复前已复现失败。新增设置窗口内完成问答和 Stop 取消的整合测试。
  • 浏览器回归覆盖问答复核、刷新恢复、标签页隔离、人工交接、Plan 开关与只读限制、计划卡、命令反馈和流式数据突发。取消测试同时检查 HTTP 回执、原生 Session 的 aborted 状态,以及随后能否继续对话。
  • 用户已确认闪屏消失,问题刷新恢复、生成中停止、Plan 开关和计划卡刷新恢复符合预期。最后的问答取消误报修复已有自动化覆盖,尚未声称完成真实模型复验。
  • git diff --check:通过。

未覆盖 Safari 真机、手机软键盘和长期断网恢复。真实断线后的快照恢复仍可能暂时丢失未完成消息,本次修复的是正常有界数据突发造成的主动断线。

Impact

本次仅引用 #562,不关闭其中尚未推进的提案。没有提交私人会话、录屏或现场调查草稿。

@github-actions github-actions Bot added documentation Improvements or additions to documentation area:setup OpenPI setup, configuration, or setup documentation labels Sep 19, 2026
@6iKUN6
6iKUN6 requested a review from tt-a1i September 20, 2026 05:35

@tt-a1i tt-a1i left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

先修复标签页 controller 隔离,再与已合并的 #561 做语义 rebase。当前 CI 基于旧 main,且 PR 现在是 CONFLICTING,不能证明集成结果。

Comment thread web/ui/src/protocol/client.ts Outdated

function readControllerId() {
try {
const existing = window.sessionStorage.getItem(controllerStorageKey);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] 不要用可被复制标签页继承的 sessionStorage 作为 controller 身份。浏览器复制标签页或通过带 opener 的窗口打开页面时,sessionStorage 可能从原标签页克隆,两个页面会拿到同一个 controllerId;复制页因此也能读取并回答原页等待中的 ask_user,违反“仅发起标签页可回答”的隔离合同。请增加活动标签页碰撞检测并在重复时轮换身份(例如 BroadcastChannel 协调),同时补一个由原页面打开/复制出的标签页回归测试;现有 context.newPage() 不会覆盖 storage 克隆场景。

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

Labels

area:setup OpenPI setup, configuration, or setup documentation documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants