diff --git a/.changeset/ai-plan-approve-feedback.md b/.changeset/ai-plan-approve-feedback.md new file mode 100644 index 000000000..65edf2c81 --- /dev/null +++ b/.changeset/ai-plan-approve-feedback.md @@ -0,0 +1,12 @@ +--- +'@object-ui/plugin-chatbot': patch +'@object-ui/app-shell': patch +--- + +Plan-card approval gives immediate in-card feedback (#2627): clicking +"Build it" flips the clicked card to a spinning "Building…" badge right away +(the approval's chat-level effects land at the bottom of the thread, outside +the viewport, so the card looked untouched for ~10s and users double-clicked). +The durable Built state still derives from the message stream; an approval +that never left the client (rate limit / offline) rolls the badge back so the +button returns. New `planBuildingLabel` prop (AiChatPage passes zh). diff --git a/.changeset/login-config-race-sso-timeout.md b/.changeset/login-config-race-sso-timeout.md new file mode 100644 index 000000000..038e22666 --- /dev/null +++ b/.changeset/login-config-race-sso-timeout.md @@ -0,0 +1,21 @@ +--- +'@object-ui/auth': patch +--- + +Login-page auth-config hardening (#2625, #2626): + +- `createAuthClient.getConfig` now single-flights + caches the `/auth/config` + fetch (the login page's three consumers used to fire three requests) and + retries failures with backoff (500ms/1.5s/3.5s, 8s per-attempt abort) before + rejecting. A cold-starting environment kernel no longer strands the page + without its SSO buttons; a final failure clears the cache so later callers + retry. +- `LoginForm` holds a spinner instead of painting the password-form defaults + while config resolves — an SSO-only deployment must never flash a password + wall at JIT users who have no password. A failed config still falls back to + the password form (break-glass beats lock-out). +- `signInWithProvider` gains a 20s watchdog: a sign-in request that hangs now + rejects with a clear timeout error so the provider button recovers instead + of spinning forever. +- Removed LoginForm's duplicate "or" divider — SocialSignInButtons already + renders its own, and the stacked pair read as a rendering glitch. diff --git a/.changeset/register-double-divider.md b/.changeset/register-double-divider.md new file mode 100644 index 000000000..0c8342810 --- /dev/null +++ b/.changeset/register-double-divider.md @@ -0,0 +1,8 @@ +--- +'@object-ui/auth': patch +--- + +RegisterForm: drop the duplicate "or" divider (matching the LoginForm fix in +#2629). SocialSignInButtons already renders its own "or continue with email" +divider under the provider buttons; RegisterForm stacked a second "OR" line on +top, which read as a rendering glitch on the sign-up page. diff --git a/.changeset/welcome-cta-autocreate.md b/.changeset/welcome-cta-autocreate.md new file mode 100644 index 000000000..ed4cef79e --- /dev/null +++ b/.changeset/welcome-cta-autocreate.md @@ -0,0 +1,14 @@ +--- +'@object-ui/components': patch +'@object-ui/app-shell': patch +--- + +Welcome-page "Create your environment" deep-links straight into the create +dialog (#844): `action:button` gains a client-side `autoTrigger` flag (runs +the action once on mount — same execute path as a click, so param dialogs / +confirms / entitlement gates still apply), and the environments list consumes +`?runAction=create_environment` to mark its create action once entitlements +resolve (upgrade-locked orgs get the upgrade prompt instead; the param is +stripped after consumption so refresh/back don't re-open). Also localizes the +EnvironmentListToolbar's state-aware label overrides ({en,zh}) — they were +hard-coded English inside a zh console. diff --git a/packages/app-shell/src/console/ai/AiChatPage.tsx b/packages/app-shell/src/console/ai/AiChatPage.tsx index e18d0f97f..294cd6bf6 100644 --- a/packages/app-shell/src/console/ai/AiChatPage.tsx +++ b/packages/app-shell/src/console/ai/AiChatPage.tsx @@ -2158,6 +2158,9 @@ export function ChatPane({ planApproveLabel={t('console.ai.planApprove', { defaultValue: 'Build it' })} planAdjustLabel={t('console.ai.planAdjust', { defaultValue: 'Adjust' })} planBuiltLabel={t('console.ai.planBuilt', { defaultValue: 'Built' })} + planBuildingLabel={ + convZh ? '正在搭建…' : t('console.ai.planBuilding', { defaultValue: 'Building…' }) + } planReadyLabel={t('console.ai.planReady', { defaultValue: 'The plan is ready. Build it now, or tell me what to adjust.', })} diff --git a/packages/app-shell/src/console/home/CloudOnboardingNext.tsx b/packages/app-shell/src/console/home/CloudOnboardingNext.tsx index fd685052a..02797d663 100644 --- a/packages/app-shell/src/console/home/CloudOnboardingNext.tsx +++ b/packages/app-shell/src/console/home/CloudOnboardingNext.tsx @@ -161,7 +161,12 @@ export function CloudOnboardingNext({ properties }: CloudOnboardingNextProps) {