Repository navigation
feat(app-shell,plugin-chatbot,i18n): one collapsed line per phase, a result card with its two doors, no navigation after a build (objectui#12724) - #12841
Conversation
… no navigation after a build Part of objectui#12724, the halves that need no new payload. - AiChatPage: a finished build no longer navigates to Studio (the objectui#5799 transition and its objectui#11658 run landing retire); the A1.b binding stays, so the Studio dock resumes the thread. The build agent's placeholder outside an app describes the task, and the composer footer adds the newline hint. - ChatbotEnhanced: a turn's tool activity collapses to one line per phase with folded repeats, the step count and the measured elapsed time; the chevron expands the rows. The finished build card says built-and-live only on a publish signal, puts Open app first and View in Studio second, and closes with the next-steps line and the draft posture sentence. The plan card names the app, draws one chip per declared field and one row per declared view, and degrades to the object chips without field rows. - mapMessages: ProposedPlan lifts the spec-declared field and view names and labels and the app label. - i18n: the new keys in every pack; console.ai.designBuiltApp retires. Claude-Session: https://claude.ai/code/session_01XfuGMLXaKo5XaZhNvUTbDL Co-authored-by: Claude <noreply@anthropic.com>
…not hold it open The line now sits above the design / build panel it summarizes, and its state is the summary strip's: a plan awaiting confirmation already says so on its own card, so the line stays collapsed with a tick. Claude-Session: https://claude.ai/code/session_01XfuGMLXaKo5XaZhNvUTbDL Co-authored-by: Claude <noreply@anthropic.com>
…opy still keeps the count Claude-Session: https://claude.ai/code/session_01XfuGMLXaKo5XaZhNvUTbDL Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
席位核对 — ACCEPT · objectui#12724 (partial) · head
|
Contract reviewServed-tier: Face: the ① Derived judgments
② Semver levelThe changeset bumps ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Landing · head
|
Part of #12724 — the plan-card and result-card rows that need the cloud builder-plan-result-payloads-v2 payload stay open (listed below).
Clause-②: yes
What changed
Target 2: progress. A turn's tool activity is one collapsed line per phase:
设计方案 · 4 步 · 0:48 · 读取编写规范 · 列出对象 ×3 · 记录待办 ×2 · 设计应用方案. Repeated calls of a tool fold into one step with a count. The phase is named for the build tool the turn called (propose_blueprint → 设计方案, apply_blueprint → 搭建). The time is measured while the turn streams; no producer persists a duration, so a reopened conversation shows none. The chevron expands the per-tool rows. They also open on their own while a step runs. A plan waiting on the user does not hold them open, because the plan card says 等待确认 itself. The line now leads its turn, above the design or build panel.Target 3, without the verified checklist. The finished build card reads 「已搭建并上线 · APP」 when the build is live: the envelope says
published, or this chat's publish signal says so. Without either it still reads 「已构建APP」 ("Built APP"), never claiming it is live. 打开应用 is the primary button: an SPA navigation to/apps/APP, the app's first navigation item. 在 Studio 中查看 is secondary:/studio/PKG/interfaceswith no landing state. In the published posture, the Studio door now gets the build's own package from its envelope. Below the buttons, 「接下来可以说:…」 quotes the envelope'snextSteps, followed by 「之后的修改先存草稿,由你在 Studio 发布。」. The progress bar is gone once the build is done. A whole-app build no longer repeats its next steps as a list on the draft card.No automatic navigation after a build. The ChatPane effect that called
paneNavigate('/studio/PKG/interfaces', { state: STUDIO_RUN_LANDING })when a build landed now only binds the conversation to the built package (A1.b, idempotent), so the Studio dock still resumes the thread. Pins changed:AiChatPage.builtTransition.test.tsx(objectui#5799 transition, its full-page opt-out and the objectui#10109 no-transition cases) andAiChatPage.builtLandsRunning-11658.test.tsx(objectui#11658 run landing) are retired. Both pinned the navigation this ruling removes. They are replaced byAiChatPage.noNavigationAfterBuild-12724.test.tsx. In that file, a reopened build (drafted or published) and a live completion make no router call except the binding's same-conversation?package=replace, and never calllocation.assign. The two doors are pinned as SPA navigations with their targets.Target 1 (plan card), from what the envelope declares.
detectProposedPlanliftsblueprint.app.label, plus each field's and each view'snameandlabel. These are the spec'sSolutionBlueprintSchemakeys (BlueprintAppSchema,BlueprintFieldSchema,BlueprintViewSchema). The card shows 「方案预览 · APP」 with 等待确认, the count line under it, one row per object with a chip per field, one row per view, the assumptions, 开始搭建 / 调整方案 and the reply hint. If no object carries field rows (for example the cache-fallback copy, which keeps only the count), it draws today's object chips.Target 4. Outside an app, the build agent's placeholder is 「描述你想搭建的应用,或要改的地方…」 / "Describe the app you want to build, or what to change…", with no agent name. Inside an app it is still
askOrChangeApp(objectui#11658). Other agents keep theirs. The footer reads 「↵ 发送 · Shift+↵ 换行」 through a new optionalnewlineHintlabel.i18n. New keys in every pack:
console.ai.describeAppToBuild,console.ai.newlineHint,console.ai.viewBuiltAppInStudio,chatbot.phase.build|design|stepCount (plural family)|expand|collapse,chatbot.plan.awaitingConfirm|objectsAndFields|viewsandchatbot.build.builtAndLive|nextStepsLead|nextStepQuote|draftPosture.console.ai.designBuiltAppretires; 在 Studio 中查看 replaces its label.Payload rows left open (cloud builder-plan-result-payloads-v2)
Not drawn, because no current reader or recorded envelope produces them:
Deviations
ProposedPlan(exported from @object-ui/plugin-chatbot) gains three optional members:appLabel,viewsandobjects[].fields. The ruling's field chips need them, but this goes beyond label props and i18n keys.ChatbotEnhancedToolInvocation.proposedPlannow referencesProposedPlaninstead of an inline copy.de-quote-pairing-3876(one more „…“ pair),untranslated-identity-4376(the ko quote format string) andperm-home-namespace-3546(the retired key), plus the live-baseline expectation inuseChatConversation.test.tsx.Screenshots (1280 px, light; evidence branch, never merged)
Rendered by the real ChatbotEnhanced under the real I18nProvider, from spec-shaped fixture envelopes lifted by the real mapMessages readers. A temporary dev-server page was used and not committed. No live build agent was reachable. Faked inputs: the envelopes, a publish-count probe answering 0, the live build-progress app label, and the clock (+48 s / +64 s while streaming).
Test evidence (head 38ceb1e)
pnpm --filter @object-ui/plugin-chatbot test: 62 files, 638 tests passed (run at 781fc10; 38ceb1e touches only an app-shell test).pnpm exec vitest run packages/app-shell/ --shard=K/8, K=1..8: 1509 files (1508 passed, 1 skipped), 14110 tests passed, 9 skipped.pnpm exec vitest run packages/i18n/: 1321 passed, 13 skipped.type-check(i18n, plugin-chatbot, app-shell),build(the same three), eslint on changed files,check:i18n-keys,check:i18n-drift,check:i18n-designer-parity,check:i18n-dead-keys,check:new-line-citationsandcheck-changeset-presence: all exit 0.git diff HEADempty (11 legs). The first attempt at one leg was a no-op that the ablation tool refused, and it was re-run.The drafting session's link is in prose here:
https://claude.ai/code/session_01XfuGMLXaKo5XaZhNvUTbDL.🤖 Generated with Claude Code
https://claude.ai/code/session_01XfuGMLXaKo5XaZhNvUTbDL