feat(shell): root two-panel layout — unified sidebar + chat-as-home#3751
Conversation
…slot Make the two-panel layout the app root: a sidebar (static nav on top, dynamic per-route content below) plus the main content pane. The former floating BottomTabBar is retired; its primary destinations become the vertical SidebarNav and routes project their own sidebar UI into the dynamic region via a portal-based SidebarContent slot. - RootShellLayout: full-bleed resizable two-pane shell (persists width) - SidebarSlot: portal plumbing (Provider/Outlet/SidebarContent) - AppSidebar/SidebarNav/navIcons: relocated, compacted navigation - App.tsx: mount shell for authed routes, chromeless for welcome/onboarding
…ot slot Migrate the four in-page two-panel layouts off their own TwoPanelLayout and onto the root shell's dynamic sidebar slot via SidebarContent. Settings, Brain, and Connections project their always-visible nav; Chat projects its thread list only while the header toggle has it shown.
The Human mascot stage now fills the whole main pane; its chat panel moves into the root sidebar's dynamic region. Make the content scroller relative so the page's absolute mascot stage stays within the main pane, not over the sidebar.
The selected tab already surfaces the title in the main panel, so the sidebar nav headers only keep a description where one adds value (Brain subtitle); Connections' title-only header is removed.
Remove the chat header's threads hamburger and always project the thread list into the root sidebar. Replace the Accounts vertical app rail with a compact horizontal icon row projected above the thread search (order-0 over the thread list's order-1). The sidebar slot is now a flex column so these ordered regions compose cleanly.
Chat is now the default landing and absorbs Home. A page-variant chat whose selected thread has no messages renders ChatNewWindowHero (the former Home greeting + banners) above a centered composer; sending the first message flips hasVisibleMessages and collapses to the normal conversation layout. - ChatNewWindowHero: greeting + banners + core-recovery, minus the Home card chrome and 'Ask Assistant' CTA (the composer is the CTA) - Conversations: isNewWindow drives header hide, centered column, hero, and a borderless reading-width composer; landing defaults to a fresh/empty thread (reuses an existing empty thread, else creates one) instead of resuming - Routing/nav: single Chat entry (default); /home -> /chat; DefaultRedirect and onboarding-complete now target /chat
Revert the Human page's chat projection into the root sidebar. The mascot stage reserves space for the floating chat aside on the right (as before), and the left dynamic sidebar region stays empty — Human is intentionally the one surface with no inner sidebar. Bottom spacing tightened since the floating bottom bar is gone.
…w hero Wrap the greeting/connection/recovery in the original Home card (white / neutral-900, rounded, shadow, border) with the version + theme-toggle header row. Banners stay outside the card; the composer below remains the CTA.
The new-window hero card now fills the surface height (content vertically centered inside) so the composer stays pinned at the bottom like a normal chat. Card uses an ~80% white/neutral-900 tint with a subtle backdrop blur over the app background.
Shrink the rail buttons to h-9/w-9 (rounded-lg) with smaller provider icons, and mark each flex-none so the row scrolls horizontally instead of compressing when there are many connected apps.
The card now sizes to its content; the full height lives on the surrounding h-full column which centers the card. Composer stays pinned at the bottom via the messages area's flex-1.
- App rail: pin overflow-y-hidden so the row scrolls horizontally only (the overflow-x:auto was promoting overflow-y to auto, letting the below-button tooltips grow the box vertically); add native title tooltips since the custom below-button tooltip is now clipped. - Move the ~80% opaque tint from the hero card to the chat main content container; the new-window hero content sits directly on that surface.
Undo the main-content-container tint; restore the tinted card on the new-window hero. Rail horizontal-overflow fix from the prior commit stays.
…n fully Keep AgentChatPanel always mounted (in non-face mode) so the thread sidebar it projects stays present regardless of the selected app; a selected connected app's webview now fills the main pane edge-to-edge (absolute inset-0, no padding/margins/gaps) over the hidden agent chat.
Widen the chat column and the new-window composer cap from max-w-2xl to 48.75rem. (Includes an in-progress bg-white/40 container tweak made directly in the working tree.)
Drop the 8px native-webview inset and the placeholder's rounded border + shadow so the embedded app fills the main content area fully.
Add a projectThreadList prop so the embedded sidebar-variant chat can also project the thread list into the root sidebar's dynamic region. The Human page opts in: threads appear in the left sidebar while the chat stays on the right, sharing selection state so clicking a thread switches the conversation.
- SidebarHeader: thin top row with collapse, Settings (gear), and language (globe + native locale select) controls - RootShellLayout: sidebar is now collapsible (persisted under a fresh 'app-shell' layout id, default visible) with a reshow button when hidden; useRootSidebar() hook drives it - AppSidebar: mount the header on top; pin the beta/build footer at the bottom so it shows app-wide (removed from SettingsSidebar to avoid duplication) - Settings panels now render inside a card (background) via SettingsLayout - Remove the Settings primary nav tab (reached via the header gear) - Hide the app-rail horizontal scrollbar (scrollbar-hide)
The reshow button was an absolute overlay, so a native CEF webview (composited above the HTML layer, glued to the content bounds) painted over it and hid it. Render it as a thin in-flow rail instead, so the content/webview starts to its right and the reshow control stays visible.
Swap the General/Subconscious/Tasks PillTabBar from flex-wrap to a nowrap horizontal scroll row (scrollbar hidden) so it never wraps.
The overlaid native <select> won't shrink below its longest option's width, so it spilled right over the Settings/collapse buttons and captured their clicks. Clip it to the icon box with overflow-hidden.
…debar - Move resolved model into ComposerTokenStats (same row as turns, aligned) - Remove the chat page title + its edit-title machinery - Move the New-thread button into the thread sidebar below the search - Remove the entire chat header; relocate the quick/reasoning toggle (plus the worker-thread breadcrumb and files chip) into a toolbar right above the composer - App rail: drop the custom below-button tooltip (clipped by the scroll overflow); rely on the native title tooltip
…ge panels Wrap only the provider/API-keys panels (Connections: llm/voice/embeddings/ search/composio-key) and Brain's Knowledge subpages (intelligence/memory-data/ memory-debug/analysis-views) in a card surface. The integrations/skills grids and bespoke graph tabs keep their own layouts and stay flush.
- Add a left-pinned Home button to the sidebar header that opens the unified chat on a blank thread (reuses an empty one or creates it) - Remove the version number from the new-window hero card - Hide the 'device connected' status copy in the normal (ok) state
…-shell # Conflicts: # app/src/pages/Conversations.tsx
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
app/src/components/chat/ChatNewWindowHero.tsx (1)
58-60:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winAvoid rendering raw exception text directly to users.
Line 59 captures raw error text and Line 169 renders it verbatim. This can expose internal details and bypass localization. Prefer logging full error details via namespaced
debug, and show a translated generic UI message.💡 Suggested fix
+import debugFactory from 'debug'; import { useEffect, useMemo, useState } from 'react'; @@ +const debug = debugFactory('chat-new-window-hero'); + export default function ChatNewWindowHero() { @@ const handleRestartCore = async () => { @@ try { await restartCoreProcess(); } catch (err) { - setRestartError(err instanceof Error ? err.message : String(err)); + debug('restartCoreProcess failed: %o', err); + setRestartError(t('home.restartCoreError')); } finally { setIsRestartingCore(false); } };As per coding guidelines, use
useT()for all user-facing UI text and namespaceddebugfor frontend logging.Also applies to: 168-170
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/components/chat/ChatNewWindowHero.tsx` around lines 58 - 60, In the catch block where the error is handled and setRestartError is called, log the full error details using namespaced debug logging instead of storing just the error message text. Then at the rendering location where restartError is displayed to the user, render a generic translated UI message using useT() instead of displaying the raw error text directly. This ensures internal error details are available for debugging through logs while users see a localized, generic error message that doesn't expose implementation details.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@app/src/components/chat/ChatNewWindowHero.tsx`:
- Around line 58-60: In the catch block where the error is handled and
setRestartError is called, log the full error details using namespaced debug
logging instead of storing just the error message text. Then at the rendering
location where restartError is displayed to the user, render a generic
translated UI message using useT() instead of displaying the raw error text
directly. This ensures internal error details are available for debugging
through logs while users see a localized, generic error message that doesn't
expose implementation details.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: ccf68422-46ba-4241-883c-29a4f317b5d0
📒 Files selected for processing (16)
app/src/components/chat/ChatNewWindowHero.tsxapp/src/lib/i18n/ar.tsapp/src/lib/i18n/bn.tsapp/src/lib/i18n/de.tsapp/src/lib/i18n/en.tsapp/src/lib/i18n/es.tsapp/src/lib/i18n/fr.tsapp/src/lib/i18n/hi.tsapp/src/lib/i18n/id.tsapp/src/lib/i18n/it.tsapp/src/lib/i18n/ko.tsapp/src/lib/i18n/pl.tsapp/src/lib/i18n/pt.tsapp/src/lib/i18n/ru.tsapp/src/lib/i18n/zh-CN.tsapp/src/pages/Home.tsx
✅ Files skipped from review due to trivial changes (2)
- app/src/lib/i18n/hi.ts
- app/src/lib/i18n/zh-CN.ts
🚧 Files skipped from review as they are similar to previous changes (4)
- app/src/lib/i18n/ar.ts
- app/src/lib/i18n/en.ts
- app/src/lib/i18n/ko.ts
- app/src/lib/i18n/es.ts
- Localize new-window hero welcome variants (chat.newWindowWelcome1..3) across all locales; route hero logging through namespaced debug - Proper promo-credit translations per locale (replace placeholder artifacts) - navIcons/LanguageSelect: named interfaces for props/option types - RootShellLayout: handle pointercancel/blur in drag cleanup - SidebarSlot: use IS_DEV + namespaced debug (no direct import.meta.env/console) - SidebarHeader Home: let chat own blank-thread creation (no duplicate blanks) - Relocate upstream background-tasks button into the composer toolbar (merge) - Remove dead SidebarAccountMenu
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 65969a50a7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@app/src/lib/i18n/fr.ts`:
- Around line 6-21: The background-task translation strings in the French
localization file (fr.ts) are still in English and need to be translated to
French for French users. Locate all the conversation.backgroundTasks keys (from
'conversations.backgroundTasks.title' through
'conversations.backgroundTasks.close') and replace their English values with
appropriate French translations while keeping the keys unchanged. This includes
strings like 'Background tasks', 'Running', 'Done', 'Failed', 'Needs you', 'tool
call', 'steps', 'View details', and 'Close'.
- Around line 1394-1395: In the French translation string for the key
mcp.detail.authRequired in the fr.ts file, fix the pronoun agreement by changing
"se connecter" to "vous connecter" in the phrase where it appears with "avant de
pouvoir". The message currently uses the formal pronoun "vous" throughout but
incorrectly uses the reflexive "se connecter" instead of the conjugated form
"vous connecter" which agrees with the "vous" pronoun established earlier in the
sentence.
In `@app/src/lib/i18n/id.ts`:
- Around line 6-21: The background task translation keys in the Indonesian
locale file (id.ts) are currently in English, causing mixed-language UI for
Indonesian users. Either translate all the backgroundTasks keys (from
'conversations.backgroundTasks.title' through
'conversations.backgroundTasks.close') to Indonesian, or remove these keys
entirely so the fallback to the English locale file (en.ts) is used
automatically. If translations are not ready yet, removing the keys is the
preferred approach to ensure consistent language and automatic propagation of
future updates from the English source.
In `@app/src/lib/i18n/zh-CN.ts`:
- Around line 6-21: The zh-CN.ts file contains English text values for all the
conversations.backgroundTasks.* localization keys (title, titleWithCount,
running, noneRunning, total, empty, statusRunning, statusDone, statusFailed,
statusNeedsYou, toolCallOne, toolCallOther, steps, viewDetails, and close) when
they should be translated to Simplified Chinese. Replace each English string
value with its corresponding Chinese translation while keeping the English keys
unchanged, ensuring the background tasks panel displays consistently in Chinese
for zh-CN users.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 473952b5-f8cb-4dec-9d9a-376c4df02521
📒 Files selected for processing (21)
app/src/components/LanguageSelect.tsxapp/src/components/chat/ChatNewWindowHero.tsxapp/src/components/layout/shell/RootShellLayout.tsxapp/src/components/layout/shell/SidebarHeader.tsxapp/src/components/layout/shell/SidebarSlot.tsxapp/src/components/layout/shell/navIcons.tsxapp/src/lib/i18n/ar.tsapp/src/lib/i18n/bn.tsapp/src/lib/i18n/de.tsapp/src/lib/i18n/en.tsapp/src/lib/i18n/es.tsapp/src/lib/i18n/fr.tsapp/src/lib/i18n/hi.tsapp/src/lib/i18n/id.tsapp/src/lib/i18n/it.tsapp/src/lib/i18n/ko.tsapp/src/lib/i18n/pl.tsapp/src/lib/i18n/pt.tsapp/src/lib/i18n/ru.tsapp/src/lib/i18n/zh-CN.tsapp/src/pages/Conversations.tsx
✅ Files skipped from review due to trivial changes (7)
- app/src/lib/i18n/ru.ts
- app/src/lib/i18n/pl.ts
- app/src/lib/i18n/ar.ts
- app/src/lib/i18n/en.ts
- app/src/lib/i18n/ko.ts
- app/src/lib/i18n/pt.ts
- app/src/lib/i18n/de.ts
🚧 Files skipped from review as they are similar to previous changes (9)
- app/src/components/LanguageSelect.tsx
- app/src/components/layout/shell/SidebarHeader.tsx
- app/src/lib/i18n/hi.ts
- app/src/lib/i18n/bn.ts
- app/src/lib/i18n/es.ts
- app/src/components/layout/shell/navIcons.tsx
- app/src/components/layout/shell/RootShellLayout.tsx
- app/src/components/chat/ChatNewWindowHero.tsx
- app/src/lib/i18n/it.ts
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@app/src/lib/i18n/fr.ts`:
- Around line 6-21: The background-task translation strings in the French
localization file (fr.ts) are still in English and need to be translated to
French for French users. Locate all the conversation.backgroundTasks keys (from
'conversations.backgroundTasks.title' through
'conversations.backgroundTasks.close') and replace their English values with
appropriate French translations while keeping the keys unchanged. This includes
strings like 'Background tasks', 'Running', 'Done', 'Failed', 'Needs you', 'tool
call', 'steps', 'View details', and 'Close'.
- Around line 1394-1395: In the French translation string for the key
mcp.detail.authRequired in the fr.ts file, fix the pronoun agreement by changing
"se connecter" to "vous connecter" in the phrase where it appears with "avant de
pouvoir". The message currently uses the formal pronoun "vous" throughout but
incorrectly uses the reflexive "se connecter" instead of the conjugated form
"vous connecter" which agrees with the "vous" pronoun established earlier in the
sentence.
In `@app/src/lib/i18n/id.ts`:
- Around line 6-21: The background task translation keys in the Indonesian
locale file (id.ts) are currently in English, causing mixed-language UI for
Indonesian users. Either translate all the backgroundTasks keys (from
'conversations.backgroundTasks.title' through
'conversations.backgroundTasks.close') to Indonesian, or remove these keys
entirely so the fallback to the English locale file (en.ts) is used
automatically. If translations are not ready yet, removing the keys is the
preferred approach to ensure consistent language and automatic propagation of
future updates from the English source.
In `@app/src/lib/i18n/zh-CN.ts`:
- Around line 6-21: The zh-CN.ts file contains English text values for all the
conversations.backgroundTasks.* localization keys (title, titleWithCount,
running, noneRunning, total, empty, statusRunning, statusDone, statusFailed,
statusNeedsYou, toolCallOne, toolCallOther, steps, viewDetails, and close) when
they should be translated to Simplified Chinese. Replace each English string
value with its corresponding Chinese translation while keeping the English keys
unchanged, ensuring the background tasks panel displays consistently in Chinese
for zh-CN users.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 473952b5-f8cb-4dec-9d9a-376c4df02521
📒 Files selected for processing (21)
app/src/components/LanguageSelect.tsxapp/src/components/chat/ChatNewWindowHero.tsxapp/src/components/layout/shell/RootShellLayout.tsxapp/src/components/layout/shell/SidebarHeader.tsxapp/src/components/layout/shell/SidebarSlot.tsxapp/src/components/layout/shell/navIcons.tsxapp/src/lib/i18n/ar.tsapp/src/lib/i18n/bn.tsapp/src/lib/i18n/de.tsapp/src/lib/i18n/en.tsapp/src/lib/i18n/es.tsapp/src/lib/i18n/fr.tsapp/src/lib/i18n/hi.tsapp/src/lib/i18n/id.tsapp/src/lib/i18n/it.tsapp/src/lib/i18n/ko.tsapp/src/lib/i18n/pl.tsapp/src/lib/i18n/pt.tsapp/src/lib/i18n/ru.tsapp/src/lib/i18n/zh-CN.tsapp/src/pages/Conversations.tsx
✅ Files skipped from review due to trivial changes (7)
- app/src/lib/i18n/ru.ts
- app/src/lib/i18n/pl.ts
- app/src/lib/i18n/ar.ts
- app/src/lib/i18n/en.ts
- app/src/lib/i18n/ko.ts
- app/src/lib/i18n/pt.ts
- app/src/lib/i18n/de.ts
🚧 Files skipped from review as they are similar to previous changes (9)
- app/src/components/LanguageSelect.tsx
- app/src/components/layout/shell/SidebarHeader.tsx
- app/src/lib/i18n/hi.ts
- app/src/lib/i18n/bn.ts
- app/src/lib/i18n/es.ts
- app/src/components/layout/shell/navIcons.tsx
- app/src/components/layout/shell/RootShellLayout.tsx
- app/src/components/chat/ChatNewWindowHero.tsx
- app/src/lib/i18n/it.ts
🛑 Comments failed to post (4)
app/src/lib/i18n/fr.ts (2)
6-21:
⚠️ Potential issue | 🟠 Major | ⚡ Quick winLocalize the new background-task strings to French.
Lines 6-21 are still English, so the new background-task UI will render untranslated text for French users.
Suggested fix
- 'conversations.backgroundTasks.title': 'Background tasks', - 'conversations.backgroundTasks.titleWithCount': 'Background tasks ({count})', - 'conversations.backgroundTasks.running': '{count} running', - 'conversations.backgroundTasks.noneRunning': 'none running', - 'conversations.backgroundTasks.total': '{count} total', - 'conversations.backgroundTasks.empty': - 'No background tasks in this chat. Ask the assistant to do something in the background and it shows up here.', - 'conversations.backgroundTasks.statusRunning': 'Running', - 'conversations.backgroundTasks.statusDone': 'Done', - 'conversations.backgroundTasks.statusFailed': 'Failed', - 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', - 'conversations.backgroundTasks.toolCallOne': '{count} tool call', - 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', - 'conversations.backgroundTasks.steps': '{count} steps', - 'conversations.backgroundTasks.viewDetails': 'View details →', - 'conversations.backgroundTasks.close': 'Close', + 'conversations.backgroundTasks.title': 'Tâches en arrière-plan', + 'conversations.backgroundTasks.titleWithCount': 'Tâches en arrière-plan ({count})', + 'conversations.backgroundTasks.running': '{count} en cours', + 'conversations.backgroundTasks.noneRunning': 'aucune en cours', + 'conversations.backgroundTasks.total': '{count} au total', + 'conversations.backgroundTasks.empty': + "Aucune tâche en arrière-plan dans cette conversation. Demandez à l'assistant de faire quelque chose en arrière-plan et elle apparaîtra ici.", + 'conversations.backgroundTasks.statusRunning': 'En cours', + 'conversations.backgroundTasks.statusDone': 'Terminée', + 'conversations.backgroundTasks.statusFailed': 'Échouée', + 'conversations.backgroundTasks.statusNeedsYou': 'Action requise', + 'conversations.backgroundTasks.toolCallOne': "{count} appel d'outil", + 'conversations.backgroundTasks.toolCallOther': "{count} appels d'outils", + 'conversations.backgroundTasks.steps': '{count} étapes', + 'conversations.backgroundTasks.viewDetails': 'Voir les détails →', + 'conversations.backgroundTasks.close': 'Fermer',🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/lib/i18n/fr.ts` around lines 6 - 21, The background-task translation strings in the French localization file (fr.ts) are still in English and need to be translated to French for French users. Locate all the conversation.backgroundTasks keys (from 'conversations.backgroundTasks.title' through 'conversations.backgroundTasks.close') and replace their English values with appropriate French translations while keeping the keys unchanged. This includes strings like 'Background tasks', 'Running', 'Done', 'Failed', 'Needs you', 'tool call', 'steps', 'View details', and 'Close'.
1394-1395:
⚠️ Potential issue | 🟡 Minor | ⚡ Quick winFix French pronoun agreement in the auth-required message.
Line 1395 addresses the user with “vous” but ends with “se connecter”; use “vous connecter” for correct grammar.
Suggested fix
- 'mcp.detail.authRequired': - "Ce serveur nécessite que vous vous connectiez ou ajoutiez un jeton d'accès avant de pouvoir se connecter. Cliquez sur « Se connecter » pour vous authentifier.", + 'mcp.detail.authRequired': + "Ce serveur nécessite que vous vous connectiez ou ajoutiez un jeton d'accès avant de pouvoir vous connecter. Cliquez sur « Se connecter » pour vous authentifier.",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.'mcp.detail.authRequired': "Ce serveur nécessite que vous vous connectiez ou ajoutiez un jeton d'accès avant de pouvoir vous connecter. Cliquez sur « Se connecter » pour vous authentifier.",🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/lib/i18n/fr.ts` around lines 1394 - 1395, In the French translation string for the key mcp.detail.authRequired in the fr.ts file, fix the pronoun agreement by changing "se connecter" to "vous connecter" in the phrase where it appears with "avant de pouvoir". The message currently uses the formal pronoun "vous" throughout but incorrectly uses the reflexive "se connecter" instead of the conjugated form "vous connecter" which agrees with the "vous" pronoun established earlier in the sentence.app/src/lib/i18n/id.ts (1)
6-21:
⚠️ Potential issue | 🟡 Minor | ⚡ Quick winLocalize (or drop for fallback) the new background-task keys.
Line 6 through Line 21 are still in English inside the Indonesian locale file, so Indonesian users will see mixed-language UI. If translations aren’t ready yet, remove these keys so fallback to
en.tsstays centralized and future copy updates propagate automatically.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/lib/i18n/id.ts` around lines 6 - 21, The background task translation keys in the Indonesian locale file (id.ts) are currently in English, causing mixed-language UI for Indonesian users. Either translate all the backgroundTasks keys (from 'conversations.backgroundTasks.title' through 'conversations.backgroundTasks.close') to Indonesian, or remove these keys entirely so the fallback to the English locale file (en.ts) is used automatically. If translations are not ready yet, removing the keys is the preferred approach to ensure consistent language and automatic propagation of future updates from the English source.app/src/lib/i18n/zh-CN.ts (1)
6-21:
⚠️ Potential issue | 🟡 Minor | ⚡ Quick winLocalize new
conversations.backgroundTasks.*strings for zh-CN UI consistency.Lines 6-21 are still English, so zh-CN users will see mixed-language text in the new background-tasks panel.
Suggested localization patch
- 'conversations.backgroundTasks.title': 'Background tasks', - 'conversations.backgroundTasks.titleWithCount': 'Background tasks ({count})', - 'conversations.backgroundTasks.running': '{count} running', - 'conversations.backgroundTasks.noneRunning': 'none running', - 'conversations.backgroundTasks.total': '{count} total', + 'conversations.backgroundTasks.title': '后台任务', + 'conversations.backgroundTasks.titleWithCount': '后台任务({count})', + 'conversations.backgroundTasks.running': '{count} 个运行中', + 'conversations.backgroundTasks.noneRunning': '无运行中的任务', + 'conversations.backgroundTasks.total': '共 {count} 个', 'conversations.backgroundTasks.empty': - 'No background tasks in this chat. Ask the assistant to do something in the background and it shows up here.', - 'conversations.backgroundTasks.statusRunning': 'Running', - 'conversations.backgroundTasks.statusDone': 'Done', - 'conversations.backgroundTasks.statusFailed': 'Failed', - 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', - 'conversations.backgroundTasks.toolCallOne': '{count} tool call', - 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', - 'conversations.backgroundTasks.steps': '{count} steps', - 'conversations.backgroundTasks.viewDetails': 'View details →', - 'conversations.backgroundTasks.close': 'Close', + '此对话中暂无后台任务。让助手在后台执行某项操作后,任务会显示在这里。', + 'conversations.backgroundTasks.statusRunning': '运行中', + 'conversations.backgroundTasks.statusDone': '已完成', + 'conversations.backgroundTasks.statusFailed': '失败', + 'conversations.backgroundTasks.statusNeedsYou': '需要你处理', + 'conversations.backgroundTasks.toolCallOne': '{count} 次工具调用', + 'conversations.backgroundTasks.toolCallOther': '{count} 次工具调用', + 'conversations.backgroundTasks.steps': '{count} 个步骤', + 'conversations.backgroundTasks.viewDetails': '查看详情 →', + 'conversations.backgroundTasks.close': '关闭',🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/lib/i18n/zh-CN.ts` around lines 6 - 21, The zh-CN.ts file contains English text values for all the conversations.backgroundTasks.* localization keys (title, titleWithCount, running, noneRunning, total, empty, statusRunning, statusDone, statusFailed, statusNeedsYou, toolCallOne, toolCallOther, steps, viewDetails, and close) when they should be translated to Simplified Chinese. Replace each English string value with its corresponding Chinese translation while keeping the English keys unchanged, ensuring the background tasks panel displays consistently in Chinese for zh-CN users.
Going Home now switches activeAccountId back to the agent so a selected connected-app webview doesn't keep rendering instead of the blank chat.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c7b429820c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 338cd6dd0e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
- renderWithProviders: provide SidebarSlotProvider + body-portaled outlet so pages projecting their nav render it in tests (outlet off the render container to keep null-render assertions intact) - Conversations render/attachments: mock ChatNewWindowHero (CoreState) + wrap in the sidebar slot; drop obsolete sidebar-toggle + title-editing tests - ConnectionIndicator: assert two-state Connected/Disconnected - HomeBanners: case-insensitive subscription link; themeSlice: plain default
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9cf5eacb3a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| <div | ||
| className={`min-h-0 flex-1 overflow-hidden ${isAgentSelected ? '' : 'invisible'}`} | ||
| aria-hidden={!isAgentSelected}> | ||
| <AgentChatPanel /> |
There was a problem hiding this comment.
Select the agent when using the thread list
When a connected app is selected, this keeps AgentChatPanel mounted invisibly so its portaled thread list remains visible in the sidebar; however the thread rows and New Conversation button only update selectedThreadId and never dispatch setActiveAccount(AGENT_ID). In that state, clicking a chat thread appears to do nothing because isAgentSelected stays false and the WebviewHost continues to cover the main pane, leaving the selected conversation hidden until the user separately clicks the Agent rail icon. Switch back to the agent account from those sidebar chat actions, or hide/disable the thread list while a provider is active.
Useful? React with 👍 / 👎.
Two follow-ups requested on top of the chat-as-home E2E adaptation: - Restore the inline thread-rename control dropped from the conversation header by tinyhumansai#3751. Re-add the editingTitle state, handleStartEditTitle / handleCommitTitle handlers (dispatching the still-present updateThreadTitle thunk), and the header title + pencil-edit affordance in Conversations.tsx. Cover it with two deterministic Conversations unit tests (commit on Enter, cancel on Escape) and re-enable the rename assertion in the chat-management-functional E2E (asserting the unique renamed title surfaces, since chat-as-home auto-select can move the header's selected thread). - Fix the lane-2 mcp-tab-flow flake: the empty/no-results assertions used a broad `text=/no.*servers|no.*results/i` locator that, under the new root two-panel shell, also matched the wrapping shell container -> Playwright strict-mode violation. Add stable data-testids (mcp-installed-empty, mcp-catalog-empty) to the empty-state divs and target those instead. Verified locally: mcp-tab-flow + chat-management-functional E2E (18 passed), Conversations + McpServersTab unit tests green.
…g change All failures stem from AppRoutes.tsx (merged PR tinyhumansai#3751) redirecting /home → /chat. Playwright E2E (9 files): - core-rpc.ts: completeAuthCallback now accepts #/chat as well as #/home - navigation.spec.ts: /home route gets expectedHash: '/chat' - skill-execution-flow, skill-socket-reconnect, webhooks-ingress-flow, webhooks-tunnel-flow, user-journey-settings-round-trip, top-level-functional-flows: add chat-page markers (Threads, How can I help you today, No messages yet) alongside old home-page markers - user-journey-full-task: hash poll accepts /(home|chat)/ pattern Vitest (1 file): - rewardsApi.test.ts: toHaveBeenCalledWith now includes { timeout: 15000 } matching the timeout option added to disconnectDiscord() in 6000c72 Rewards UI (3 files): - RewardsCommunityTab.tsx: add role-assignment status display and claim-roles banner for linked users who have unlocked roles but not yet joined server - RewardsCommunityTab.test.tsx: add tests for the new banner and role status - i18n (14 locales + en): add 7 new rewards.community.role* keys with translations in all supported locales
Summary
Problem
Solution
RootShellLayout+AppSidebarwith a portal-basedSidebarContentslot so each route projects its own sidebar UI; migrate Settings / Brain / Connections / Chat / Human onto it.ChatNewWindowHero) and default the landing to a fresh blank thread; route/home→/chat.Submission Checklist
Impact
agentMessageViewModenowtext(plain) for fresh state;/homeredirects to/chat.Related
AI Authored PR Metadata (required for Codex/Linear PRs)
Linear Issue
Commit & Branch
Validation Run
pnpm --filter openhuman-app format:checkpnpm typecheckValidation Blocked
command:N/Aerror:N/Aimpact:N/ABehavior Changes
Parity Contract
/homeredirects to/chat./chat.Duplicate / Superseded PR Handling
Summary by CodeRabbit
Release Notes
New Features
/chat), with updated onboarding/home routing.Improvements
Bug Fixes
Tests