Repository navigation
fix(chatbot): 方案确认后卡片立即翻转「正在搭建…」徽标 (#2627) - #2632
Merged
Merged
Conversation
…iately Staging E2E (2026-07-17): clicking 开始搭建 (plan approve) showed no change at the card for ~10s — the approval sends a chat message whose visible effects (user bubble + streaming turn) land at the BOTTOM of the thread, outside the viewport when the card is in view — so users assumed the click was lost and clicked again (#2627). - Track approved plan ids locally; the clicked card's buttons flip to a spinning "Building…" badge on click (both the structured plan card and the unstructured fallback gate). Built state still derives from the message stream (#432 semantics unchanged). - An approval that never left the client (unsent error) rolls the badge back so the button returns; a newer typed/suggestion send supersedes the approve as "last send" so ITS failure can't roll back a delivered approval. - New planBuildingLabel prop; AiChatPage passes 正在搭建… for zh conversations. Partially addresses #2627 — the conversation-history-clears-after-build race needs a live repro and stays open. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
akarma-synetal
pushed a commit
to akarma-synetal/objectui
that referenced
this pull request
Aug 10, 2026
…3837) (objectstack-ai#3897) * fix(app-shell): 方案卡的 Building… 徽标随 UI 语言取值,不再被会话语言门控 (objectstack-ai#3837) `AiChatPage` 用 `convZh`(会话语言)门控四个字符串,因为 cloud 确认门 (`service-ai-studio` `confirm-gate.ts` `APPROVAL_RE`)只认中英,发进线程的 文本必须与线程本身同语言(objectstack-ai#772/objectstack-ai#2884)。该门上方注释的后半句写明了另一半规 则:button LABELS stay on the UI locale。 `planBuildingLabel`(objectstack-ai#2632 引入)落在了这句的错误一侧,中文会话恒取硬编码的 `正在搭建…`,两个后果都已实测: - **混合语言的卡片**:英文控制台里,中文会话的方案卡 `Proposed plan` / `Build it` / `Built` / `Not yet built` 全英文,中间夹一个中文徽标。objectstack-ai#2458 第 4 条记录的是同一个病的反方向。 - **翻译永远读不到**:中文会话恒走字面量,`console.ai.planBuilding` 的 zh 值对中文读者无效。objectstack-ai#3546 切片四(PR objectstack-ai#3839)刚把该 key 补进十包,只能做围 堵 —— 把 zh 值写成与字面量逐字节相同并把两者钉在一起。 徽标现在与相邻十二个标签一样读 `t('console.ai.planBuilding', …)`:十个包全 部可达(德文控制台 + 中文会话渲染 `Wird erstellt…`),zh 包成为该中文措辞的 唯一来源(值不变,中文读者看到的字符串与改动前完全一致)。 三条出站文本(`planApproveMessage` / `planApproveDefaultsMessage` / `changesConfirmMessage`)一行未动,仍随会话语言 —— 复核确认三者都交给 `onSendMessage`(`ChatbotEnhanced.tsx:1598`、`:2395`)、由门读取,正是 `convZh` 分支存在的那一类;全文件再无其它 `*Label`/`*Title` 被该门控住 (`convZh` 全部读点:定义 1 处 + 这三条)。 钉子: - `packages/app-shell/.../AiChatPage.planCardLocale.test.tsx`(新增)真渲染 `ChatPane` + 真 `I18nProvider` + 真 `isConversationZh`,把 `ChatbotEnhanced` 换成 props 记录器:en 控制台 + 中文会话 → `Building…` 且卡上 `*Label` 无一含中日韩字符;de 控制台 + 中文会话 → `Wird erstellt…` (三方语言证明是包在应答,而非两路三元);zh 控制台 → `正在搭建…`;三条 出站文本仍随会话。 - `packages/i18n/.../console-namespace-3546.test.tsx`:切片四埋的围堵钉按其 自述翻转 —— 从「字面量与 zh 包逐字节相同」改为钉住门已移除,并把不变量放 宽一步:`convZh` 只许门控出站 `*Message`,任何新读点都会红。 反向验证(方向先判后跑,与预判一致):还原三元 → 3 红 —— i18n 钉子按自定义 消息点名、en 控制台用例、de 控制台用例;zh 控制台用例与三条出站文本保持绿 (前者按设计逐字节相同,不具区分力,已在测试头注明)。 顺带:`conversationLanguage.ts` 模块头把 progress labels 也列进「随会话」, 该句在本改动后不再为真,收窄为「只治离开控制台发给 agent 的文本」。 写钉子时量到发送半边另有一个缺陷(zh 控制台 + 英文会话会把中文确认句发进英 文线程;`planAnswerMessage` 完全没有门控),不在本单范围,已立 objectstack-ai#3896。 测试:`packages/app-shell/src/console/ai` + `packages/i18n` 47 文件 654 通过; 两包 type-check 通过,全仓 `turbo run type-check` 78/78 通过;改动文件 eslint 零告警;`check-control-bytes` / `check-i18n-call-site-keys` / `check-i18n-en-drift` 均通过(零 en 值变更)。 Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt Co-authored-by: Claude <noreply@anthropic.com> * test(app-shell): 钉子里的 agent 桩改用具名类型断言,不用 as never 评审可读性,零行为改动:`ChatPane` 的 agents 桩从 `as never` 改成 `as unknown as AgentDescriptor`(类型导入,运行期擦除;该模块在本文件里被 vi.mock,类型不受影响)。 Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt Co-authored-by: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Aug 10, 2026
Merged
akarma-synetal
pushed a commit
to akarma-synetal/objectui
that referenced
this pull request
Aug 17, 2026
…t is re-reading (objectstack-ai#2627) (objectstack-ai#4183) * fix(console-ai): a failed re-resolve must not drop the conversation it is re-reading (objectstack-ai#2627) The AI build flow re-resolves the conversation it already holds at the worst possible moment: ADR-0057 A1.b bind-on-create waits for the build turn to end, then re-keys to `app:<pkg>:build` and navigates to `?package=`, and that scope flip fires one GET at the instant the server is still finishing the heaviest turn of the session. `useChatConversation` ended in a blanket `catch { setConversationId(undefined); setInitialMessages([]) }`. For a FIRST resolve that is right — nothing is held. For a re-resolve it is destructive: `AiChatPage` keys its chat pane on `${chatApi}:${conversationId ?? 'pending'}` and the thread lives inside the chat hook's instance, so `undefined` REPLACES the pane and the blueprint card, build summary and Publish button leave with the discarded instance — the reported blank conversation that only came back after switching threads and back. A failed resolve now keeps what it was re-reading when that is the conversation already held. This is the other half of the guard that already refused an EMPTY re-read the right to wipe hydrated messages; only the failing case was open. A resolve aimed at a DIFFERENT conversation, and a first resolve with nothing held, still clear — both pinned negatively. Also pins the rollback half of objectstack-ai#2632's optimistic plan-card approve, which the fix promised but never covered: a `notSent` approval rolls the "Building…" badge back so the card is actionable again, while a streamed-response error and a superseding later send both leave it alone. Fixes the second half of objectstack-ai#2627; the first half (the ~10s dead window) was already fixed by objectstack-ai#2632 and is reported, not re-fixed. * fix(console-ai): the keep-on-failure guard drops its claim after a definitive 404 (objectstack-ai#2627) The guard's subject is a conversation the hook is still holding and re-reading. Once the server answers 404/403 the id is dead — the code has already cleared both its caches and is falling through to create a replacement — so a failure of THAT create must not preserve the dead id on screen. Narrows the guard to what it was argued for and pins the boundary. --------- Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Addresses #2627(staging E2E 2026-07-17 P1)的确认无反馈半边。
问题
点「开始搭建」后卡片 ~10 秒毫无变化:approve 走普通消息通道,可见效果(用户气泡+流式轮次)落在线程底部、视口之外——卡片本身看起来没反应,用户会重复点击。
修复
planBuildingLabelprop,AiChatPage 中文会话传「正在搭建…」。遗留(#2627 保持 open)
对话历史在构建完成/布局切换后短暂清空的 race 需要活体复现(计划在本地 rig 复测时抓),本 PR 不含。
测试
plugin-chatbot 14 files / 218 tests 全过(新增 building 徽标用例);
turbo buildchatbot+app-shell 通过。🤖 Generated with Claude Code