Skip to content

feat(shell): root two-panel layout — unified sidebar + chat-as-home#3751

Merged
senamakel merged 60 commits into
tinyhumansai:mainfrom
senamakel:feat/root-two-panel-shell
Jun 17, 2026
Merged

feat(shell): root two-panel layout — unified sidebar + chat-as-home#3751
senamakel merged 60 commits into
tinyhumansai:mainfrom
senamakel:feat/root-two-panel-shell

Conversation

@senamakel

@senamakel senamakel commented Jun 17, 2026

Copy link
Copy Markdown
Member

Summary

  • Make a two-panel layout the app root: a sidebar (static nav + per-route dynamic slot + utility header + connectivity/version footer) beside a dynamic main content pane; the floating bottom tab bar is retired.
  • Merge Home into Chat — chat is the default landing; its empty "new window" state shows the former Home greeting + banners, and sending the first message clears it into the conversation.
  • Relocate chat chrome into the sidebar (thread list, app rail, New Conversation) and below a floating, gradient-backed composer (model/token stats + quick/reasoning toggle on one line); messages scroll full-width with width-capped content.
  • Collapsible root sidebar (Home / language / Settings / collapse header, reshow rail), card backgrounds for Settings + Connections API-keys + Brain Knowledge panels, full-bleed webviews that hide on route change.
  • Tighter Brain memory-graph forces; friendlier one-line Home banners; plain assistant responses as the default.

Problem

  • Navigation was split across a floating bottom bar and per-page two-panel layouts, with Home and Chat as separate destinations and visually inconsistent surfaces (orphaned panels with no background, inset/clipped webviews, distracting controls).

Solution

  • Introduce RootShellLayout + AppSidebar with a portal-based SidebarContent slot so each route projects its own sidebar UI; migrate Settings / Brain / Connections / Chat / Human onto it.
  • Fold Home into the chat new-window state (ChatNewWindowHero) and default the landing to a fresh blank thread; route /home/chat.
  • Restyle the composer (floating, full-width fade, centered width-capped content) and relocate the model stats, mode toggle, and new-conversation affordance.

Submission Checklist

  • N/A: Presentational/layout redesign — verified manually in the running desktop app; behavior changes (default view mode, route redirects, webview hide-on-route-change) are wiring rather than new domain logic.
  • N/A: Diff coverage — no Rust/core logic changed; changes are React layout/CSS and i18n copy. Flagging that the changed-lines coverage gate may need follow-up test coverage for the new shell components.
  • N/A: Coverage matrix — behaviour-only/UI change, no feature rows added/removed.
  • N/A: No matrix feature IDs affected.
  • No new external network dependencies introduced.
  • N/A: No release-cut smoke surfaces changed.
  • N/A: No linked issue.

Impact

  • Desktop UI only (React + Tauri). No Rust/core, CLI, persistence, or RPC changes. Default agentMessageViewMode now text (plain) for fresh state; /home redirects to /chat.

Related

  • Closes:
  • Follow-up PR(s)/TODOs: native webview lifecycle (unhide-resize, reload cleanup) tracked separately; test coverage for new shell components.

AI Authored PR Metadata (required for Codex/Linear PRs)

Linear Issue

  • Key: N/A
  • URL: N/A

Commit & Branch

  • Branch: feat/root-two-panel-shell
  • Commit SHA: f440114

Validation Run

  • pnpm --filter openhuman-app format:check
  • pnpm typecheck
  • Focused tests: N/A (UI/layout; tests not added per scope)
  • Rust fmt/check (if changed): N/A — no Rust changed
  • Tauri fmt/check (if changed): N/A — no Tauri Rust changed

Validation Blocked

  • command: N/A
  • error: N/A
  • impact: N/A

Behavior Changes

  • Intended behavior change: unify Home+Chat, root two-panel shell, default plain assistant responses.
  • User-visible effect: new sidebar-centric navigation and chat-as-home landing.

Parity Contract

  • Legacy behavior preserved: all prior routes still reachable; /home redirects to /chat.
  • Guard/fallback/dispatch parity checks: onboarding gate + DefaultRedirect updated to /chat.

Duplicate / Superseded PR Handling

  • Duplicate PR(s): N/A
  • Canonical PR: this
  • Resolution: N/A

Summary by CodeRabbit

Release Notes

  • New Features

    • Collapsible, resizable left sidebar replaces the bottom tab bar, with tab navigation badges/indicators.
    • Chat is now the primary landing surface (completion redirects to /chat), with updated onboarding/home routing.
  • Improvements

    • Added “new chat window” hero (animated greeting, usage-limit flow, promo credits/recovery states).
    • Settings, Skills, Brain, and Connections render within the sidebar’s dynamic region; thread list projection updated.
  • Bug Fixes

    • Prevents stale connected-app webviews from lingering after leaving the chat area.
  • Tests

    • Updated boot and router expectations; removed bottom tab bar test coverage.

senamakel added 30 commits June 17, 2026 07:15
…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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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 win

Avoid 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 namespaced debug for 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

📥 Commits

Reviewing files that changed from the base of the PR and between f440114 and 8aa9ba2.

📒 Files selected for processing (16)
  • app/src/components/chat/ChatNewWindowHero.tsx
  • app/src/lib/i18n/ar.ts
  • app/src/lib/i18n/bn.ts
  • app/src/lib/i18n/de.ts
  • app/src/lib/i18n/en.ts
  • app/src/lib/i18n/es.ts
  • app/src/lib/i18n/fr.ts
  • app/src/lib/i18n/hi.ts
  • app/src/lib/i18n/id.ts
  • app/src/lib/i18n/it.ts
  • app/src/lib/i18n/ko.ts
  • app/src/lib/i18n/pl.ts
  • app/src/lib/i18n/pt.ts
  • app/src/lib/i18n/ru.ts
  • app/src/lib/i18n/zh-CN.ts
  • app/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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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".

Comment thread app/src/components/layout/shell/SidebarHeader.tsx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

📥 Commits

Reviewing files that changed from the base of the PR and between 8aa9ba2 and 65969a5.

📒 Files selected for processing (21)
  • app/src/components/LanguageSelect.tsx
  • app/src/components/chat/ChatNewWindowHero.tsx
  • app/src/components/layout/shell/RootShellLayout.tsx
  • app/src/components/layout/shell/SidebarHeader.tsx
  • app/src/components/layout/shell/SidebarSlot.tsx
  • app/src/components/layout/shell/navIcons.tsx
  • app/src/lib/i18n/ar.ts
  • app/src/lib/i18n/bn.ts
  • app/src/lib/i18n/de.ts
  • app/src/lib/i18n/en.ts
  • app/src/lib/i18n/es.ts
  • app/src/lib/i18n/fr.ts
  • app/src/lib/i18n/hi.ts
  • app/src/lib/i18n/id.ts
  • app/src/lib/i18n/it.ts
  • app/src/lib/i18n/ko.ts
  • app/src/lib/i18n/pl.ts
  • app/src/lib/i18n/pt.ts
  • app/src/lib/i18n/ru.ts
  • app/src/lib/i18n/zh-CN.ts
  • app/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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

📥 Commits

Reviewing files that changed from the base of the PR and between 8aa9ba2 and 65969a5.

📒 Files selected for processing (21)
  • app/src/components/LanguageSelect.tsx
  • app/src/components/chat/ChatNewWindowHero.tsx
  • app/src/components/layout/shell/RootShellLayout.tsx
  • app/src/components/layout/shell/SidebarHeader.tsx
  • app/src/components/layout/shell/SidebarSlot.tsx
  • app/src/components/layout/shell/navIcons.tsx
  • app/src/lib/i18n/ar.ts
  • app/src/lib/i18n/bn.ts
  • app/src/lib/i18n/de.ts
  • app/src/lib/i18n/en.ts
  • app/src/lib/i18n/es.ts
  • app/src/lib/i18n/fr.ts
  • app/src/lib/i18n/hi.ts
  • app/src/lib/i18n/id.ts
  • app/src/lib/i18n/it.ts
  • app/src/lib/i18n/ko.ts
  • app/src/lib/i18n/pl.ts
  • app/src/lib/i18n/pt.ts
  • app/src/lib/i18n/ru.ts
  • app/src/lib/i18n/zh-CN.ts
  • app/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 win

Localize 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 win

Fix 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 win

Localize (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.ts stays 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 win

Localize 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.

coderabbitai[bot]
coderabbitai Bot previously approved these changes Jun 17, 2026
Going Home now switches activeAccountId back to the agent so a selected
connected-app webview doesn't keep rendering instead of the blank chat.
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jun 17, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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".

Comment thread app/src/config/navConfig.ts
Comment thread app/src/components/DefaultRedirect.tsx
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jun 17, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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".

Comment thread app/src/components/ConnectionIndicator.tsx
Comment thread app/src/pages/Conversations.tsx
- 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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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".

Comment on lines +414 to +417
<div
className={`min-h-0 flex-1 overflow-hidden ${isAgentSelected ? '' : 'invisible'}`}
aria-hidden={!isAgentSelected}>
<AgentChatPanel />

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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 👍 / 👎.

@senamakel senamakel merged commit 730a865 into tinyhumansai:main Jun 17, 2026
13 of 17 checks passed
senamakel added a commit to senamakel/openhuman that referenced this pull request Jun 18, 2026
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.
YellowSnnowmann added a commit to YellowSnnowmann/openhuman that referenced this pull request Jun 18, 2026
…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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature Net-new user-facing capability or product behavior. working A PR that is being worked on by the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant