Repository navigation
feat: welcome landings + standardized page headers across the app - #4851
Conversation
Reuses the shared BetaBanner component (default disclaimer copy) at the top of the Workflows list so users know the feature is still in beta. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
…ory to Sync tab - Brain's Knowledge & Memory group keeps only Debug panels; the Intelligence, Memory Inspection, and Analysis views tabs are removed. - Sync history (SyncAuditPanel) relocates from the Memory Inspection workspace to Brain's Sync tab, which is now the single sync surface. - Deletes the orphaned Intelligence page, its Brain-only tabs (agents/agent-work/orchestration/teams/worktrees), the 8 analysis-view tabs+panels, their pure engines (lib/memory) and API facades, and all their tests. - Settings wiring updated: registry entries, DeveloperOptionsPanel group, nav icons, and navigation types dropped; old deep links redirect to /brain (memory-data → /brain?tab=sync). - MemoryDataPanel itself is kept — onboarding still embeds it. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Graph / goals / sources / sync / subconscious are now top-level items with no group labels; the last Knowledge & Memory item (Debug panels / MemoryDebugPanel) is deleted along with its settings wiring. Old /settings/memory-debug deep links bounce to /brain. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Deletes TasksPanel and its orphaned IntelligenceTasksTab surface (plus UserTaskComposer / TeamTaskBoard, unused since the Intelligence page was removed). /settings/tasks redirects to /orchestration?tab=tasks. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
…nnections The raw agent-chat debug tester now lives as an 'Agent Chat' tab in the Connections page's API-keys group, next to the LLM provider settings. Its Developer Options entry + settings route are removed; /settings/agent-chat redirects to /connections?tab=agent-chat. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Workflows is a first-level module (/flows) now, so the duplicate Assistant-group 'Workflows' settings page is removed. /settings/automations, /workflows, and /routines all redirect to /flows. WorkflowsTab itself stays (still used by the Activity page's Automations tab). Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Sources + sync history are first-class on the Brain page (Sources / Sync tabs), so the duplicate Settings → Data → Data Sync page is removed. /settings/memory-sync redirects to /brain?tab=sync. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Deletes the Webhooks page, its trigger-history / tunnel / activity components, the WebhooksDebugPanel + its settings entry, the useWebhooks / useComposeioTriggerHistory hooks, tunnelsApi, and the webhooks tauriCommands module. The Integrations settings page collapses to just Task sources. Old deep links (/webhooks, /settings/webhooks-debug, webhooks-triggers, #webhooks) redirect to /settings/integrations. Core webhook RPC/SSE and the buildWebhookEventsUrl transport seam are left intact. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
…nections Usage & limits is now a Connections tab (API-keys group) with three sub-tabs: Costs (cost dashboard), Token savings (the former standalone token-usage / TokenJuice page, embedded), and Background (heartbeat + usage ledger). The standalone settings 'usage' and 'token-usage' entries are retired; /settings/usage, /settings/token-usage, and the legacy heartbeat/ledger-usage/cost-dashboard slugs redirect to /connections?tab=usage. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
… / Agent Chat) The Connections → LLM tab now hosts three chips via a new LlmConnectionsPanel: API keys (AIPanel), Local Model Debug, and Agent Chat Debug. Local Model Debug and Agent Chat gain embedded modes and their standalone Developer Options entries + the separate agent-chat Connections tab are removed. /settings/agent-chat and /settings/local-model-debug redirect to /connections?tab=llm. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
…tings tab The meeting-assistant connection settings (auto-join, summary, listen-only, transcript ingestion) now render below the meetings list on the Connections meetings tab via an embedded MeetingSettingsPanel. The standalone Settings → Meetings entry is retired; /settings/meetings redirects to /connections?tab=meetings. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
…ions Composio page The integration-trigger triage config (disable triage, disabled toolkits) now renders as a section at the bottom of the Connections Composio (API keys) page via an embedded ComposioTriagePanel. The standalone Settings → Developer → Composio triggers entry is retired; /settings/composio-triggers redirects to /connections?tab=composio-key. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Deletes the DevWorkflowPanel (cron-based GitHub dev-automation) and its Developer Options entry / route / nav wiring — superseded by first-level Workflows (/flows) and the skills workflow runner. /settings/dev-workflow redirects to /flows. The reusable pieces it spawned (SmartIssuePicker, schedule presets, cron helpers) are untouched. Rust: no dev-workflow domain existed; only tidied a stale skills_run schema example (the legacy-skill prune that cleans up old 'dev-workflow' dirs stays). Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Composio triggers moved to the Connections Composio page; assert MCP Server (still present in the dev menu) instead. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Render the API keys / Local Model / Agent Chat panels unembedded so each keeps its PanelPage p-4 padding, matching the sibling Connections tabs; the two-pane shell still hides the redundant back button. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
…cs to Events & Logs - Model Health page (deleted panel + test + wiring); /settings/model-health redirects to developer-options. - Voice Debug page removed from the settings UI (deleted panel + test + wiring); /settings/voice-debug redirects to developer-options. - Diagnostics (tool-policy-diagnostics) moved from the Agents & Autonomy dev group into Events & Logs (registry navGroup + DeveloperOptionsPanel). Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
super_context_enabled now defaults to false — it's an expensive harness-driven first-turn context pass, so it's opt-in. Flip via the UI toggle or OPENHUMAN_SUPER_CONTEXT=1. Updated the env-overlay comment and the config / context-manager default tests. The frontend toggle already initialized to off and loads the real value via RPC, so no UI change was needed. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
…, retire Integrations section Relocate Screen Awareness, Desktop Agent, and Desktop Companion into a new "Desktop" group on the Connections page, and move Wallet balances into the Connections Integrations group. Each renders the existing settings panel inside the shared card surface; their /settings/* slugs now redirect to the matching Connections tab. Retire the Integrations settings section entirely (the composio/OAuth grid lives on the Connections page and the task-source/webhook triage surface is no longer used): delete IntegrationsPanel + TaskSourcesPanel and their tests, drop the registry entry + nav icon + search badge, and redirect the old slugs (integrations, task-sources, webhooks-triggers/debug) to /connections. The task-source tauri bindings stay — the Orchestration Kanban still uses them. Add connections.groups.desktop across all locales. Update registry/nav tests.
Add a top-level "Overview" (Medulla) landing tab to the Orchestration page pitching OpenHuman's custom orchestration LLM — thousands of agents, 10M-token context, low-cost orchestration — with an OpenHuman-subscriber card and a Discord early-access card. Gate the real orchestration surface on the backend `user.hasMedullaAccess` flag (via useMedullaAccess). Without access, each tab shows a deterministic "this is how it looks at scale" demo: a 120-node agent graph (core → 2 devices → 100/20 agents) rendered by the live MemoryGraph force engine with a high-repulsion fan-out tuning, plus demo task board, peer network, and a read-only chat transcript with a disabled composer. - New SimTuning param threaded through MemoryGraph/PixiGraph/pixiGraphRenderer/ memoryGraphLayout (backward-compatible; Brain graph unchanged). - Full 14-locale i18n for the new orchPage.medulla.* / orchPage.demo.* keys. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
… template) New reusable PageHero: a soft gradient "what is this screen" band with an accent illustration blob, an icon/emoji tile, a title, a benefit-led blurb, and an optional row of benefit chips. Four accent families (ocean/sage/amber/coral). PanelPage gains an optional `hero` slot: when set, the hero is pinned in the fixed chrome above the (optional) chip tabs and the scrolling body, replacing the plain title/description header. Hero-less usage is unchanged. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Introduce PageWelcome — a restrained welcome landing (accent icon tile, eyebrow, benefit-led title, short pitch, a few immediate CTAs, and a "what you can do here" benefit-card grid). No gradient hero. Wire it into Connections as the first sidebar destination (`?tab=welcome`, now the default landing). CTAs jump to Channels / Apps / Skills. English copy only; other locales follow in a later i18n pass. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Brain now opens on a Welcome landing (`?tab=welcome`, the new default) that pitches what the page is for and offers immediate actions into the memory graph, goals, and sources. Existing Brain tests pin `?tab=graph` explicitly. English copy only; i18n follows later. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Add usePageWelcomeView — a small hook that gives single-view sidebar pages the same "Welcome first" shape as pages with real sub-navs: a two-item sidebar nav (Welcome · <main>) projected into the shell, driven by `?view=`, defaulting to the Welcome landing. Wire it into Flows, Notifications, Rewards, and Feedback: each opens on a PageWelcome pitch with immediate CTAs, and the functional view lives at `?view=main`. Unit + e2e specs updated to target the functional view. English copy only; i18n follows later. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
The gradient hero band was superseded by the Welcome landing (PageWelcome), so remove the now-unused PageHero component and revert PanelPage to its original (no `hero` slot). Inline the accent-family type into PageWelcome. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Add PageSectionHeader (canonical title + one-line description + optional action) and apply it uniformly: - Notifications / Rewards / Feedback: a consistent page header (Notifications folds its mark-all-read / clear actions into the header). - Brain and Connections: each functional tab now shows a title + one-line description via PanelPage (per-tab header map). - Flows already used PanelPage title/description. English copy only; i18n follows later. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
…lcomes Add a Welcome landing as the first TinyPlace (Agent World) destination — pitches the agent social layer with CTAs into the world, feed, and directory. It renders flush (no framed card) so the centered pitch reads as part of the page. PageWelcome now vertically centers its content (min-h-full flex, so tall pitches still scroll from the top). Applies to every welcome landing. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Add the 110 new welcome-landing and text-header keys to all non-English locales (es, fr, de, pt, it, id, pl, ar, bn, hi, ru, zh-CN, ko). Brand names (OpenHuman, TinyPlace, Medulla) kept verbatim; placeholders preserved. `pnpm i18n:check` reports 0 missing / 0 extra across every locale. Claude-Session: https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9f83d9b138
ℹ️ 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".
Addresses @chatgpt-codex-connector on app/src/pages/OrchestrationPage.tsx:237.
Addresses @chatgpt-codex-connector on app/src/components/settings/settingsRouteElements.tsx:202.
Addresses @chatgpt-codex-connector on app/src/components/settings/settingsRouteElements.tsx:196.
Addresses @chatgpt-codex-connector on app/src/pages/Rewards.tsx:130.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7ea809e30e
ℹ️ 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".
Addresses @chatgpt-codex-connector on app/src/AppRoutes.tsx:243.
Addresses @chatgpt-codex-connector on app/src/components/settings/panels/LlmConnectionsPanel.tsx:29 and app/src/components/settings/settingsRouteElements.tsx:204.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 659da0bd3b
ℹ️ 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".
Addresses @chatgpt-codex-connector on app/src/pages/Rewards.tsx:130.
Addresses @chatgpt-codex-connector on app/src/pages/Notifications.tsx:114.
Addresses @chatgpt-codex-connector on app/src/components/settings/settingsRouteElements.tsx:204.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d9113f9aa4
ℹ️ 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".
| @@ -13,7 +13,7 @@ const ROUTES = { | |||
| chat: '/chat', | |||
| skills: '/connections', | |||
| home: '/home', | |||
| notifications: '/notifications', | |||
| notifications: '/notifications?view=main', | |||
There was a problem hiding this comment.
Normalize explicit notification deep links
Fresh path beyond the earlier fallback fix: explicit notification links are still returned unchanged before this new /notifications?view=main fallback is used, and repo search shows core emitters still set deep_link: Some("/notifications") in src/openhuman/notifications/bus.rs and src/openhuman/subconscious/heartbeat/planner/collectors.rs. Those alerts now land on the new welcome page instead of the alert feed, so clicking them hides the notification that prompted the click; normalize explicit /notifications to this route or update those emitters too.
Useful? React with 👍 / 👎.
| {/* Merged Integrations page */} | ||
| <Route path="task-sources" element={<SettingsRedirect to="/settings/integrations" />} /> | ||
| {/* Retired Integrations settings section → Connections page */} | ||
| <Route path="task-sources" element={<Navigate to="/connections" replace />} /> |
There was a problem hiding this comment.
Restore a task-source configuration destination
Redirecting /settings/task-sources to bare /connections drops the migrated task-source setup surface: the task-sources RPC wrappers/core domain and localized settings.taskSources.* form copy remain, but repo-wide search shows no remaining provider/filter creation UI after TaskSourcesPanel was deleted. Users following Settings > Task Sources or the existing task-source workflow now land on the Connections welcome page with no “Add source” form, so they can no longer configure proactive GitHub/Notion/Linear/ClickUp sources.
Useful? React with 👍 / 👎.
| path="webhooks-triggers" | ||
| element={<SettingsRedirect to="/settings/integrations#webhooks" />} | ||
| /> | ||
| <Route path="webhooks-triggers" element={<Navigate to="/connections" replace />} /> |
There was a problem hiding this comment.
Update the remaining webhooks tunnel E2Es
Fresh evidence beyond the prior webhooks-debug comments: app/test/e2e/specs/webhooks-tunnel-flow.spec.ts still opens /settings/integrations#webhooks and waits for ComposeIO trigger-history markers, and app/test/playwright/specs/webhooks-tunnel-flow.spec.ts still opens /settings/webhooks-triggers and expects the hash to contain /settings/integrations. This redirect now lands on /connections, so the full webhooks tunnel E2Es time out unless those remaining trigger-history assertions are retired or pointed at a real replacement.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 8
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
app/src/pages/Brain.tsx (1)
300-314: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winAdd
sync.auditTitleto the locale catalogs
app/src/pages/Brain.tsx:309falls back to the inline English string today becausesync.auditTitleis not registered inapp/src/lib/i18n/en.tsor the locale files. Add the key toen.tsand every supported locale so the Sync History heading localizes correctly.🤖 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/pages/Brain.tsx` around lines 300 - 314, Add the sync.auditTitle translation key with the “Sync History” value to the locale catalogs, including app/src/lib/i18n/en.ts and app/src/lib/i18n/fr.ts (lines 1-7418), plus every other supported locale. Keep the existing Brain.tsx heading usage at app/src/pages/Brain.tsx (lines 300-314) and ensure all catalogs provide the key so it no longer relies on the inline fallback.Source: Path instructions
app/src/components/settings/settingsRouteRegistry.ts (1)
373-374: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winPoint
recovery-phraseat a real sidebar id
app/src/components/settings/settingsRouteRegistry.ts:532-537—wallet-balancesno longer appears in the sidebar, soresolveSidebarId('recovery-phrase')falls back to the raw id and the active highlight misses. Either restore a sidebar group forwallet-balancesor remove this parent link.🤖 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/settings/settingsRouteRegistry.ts` around lines 373 - 374, Update the recovery-phrase route registration and its resolveSidebarId parent mapping so it references an existing sidebar id. Either restore the wallet-balances sidebar group or remove the wallet-balances parent link, ensuring recovery-phrase resolves to a real sidebar entry and its active highlight works.
🧹 Nitpick comments (11)
app/test/e2e/helpers/shared-flows.ts (1)
479-490: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueDeprecated
navigateToSkillsnow duplicatesnavigateToConnections.Both functions have identical bodies. Since
navigateToSkillsis deprecated, consider having it delegate tonavigateToConnectionsto avoid the two drifting apart again later.♻️ Proposed dedup
export async function navigateToSkills() { // `/connections` now lands on the Welcome landing; jump to the functional // integrations view (the pre-Welcome default) so dependent flows still work. - await navigateViaHash('/connections?tab=composio'); + await navigateToConnections(); }🤖 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/test/e2e/helpers/shared-flows.ts` around lines 479 - 490, Update the deprecated navigateToSkills function to delegate to navigateToConnections instead of duplicating its navigation logic, while preserving its asynchronous behavior and existing callers.app/src/components/settings/panels/LlmConnectionsPanel.tsx (1)
38-43: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueConsider a lightweight diagnostic on chip transitions.
setChipdrives a hash-backed navigation/state transition with no logging. Per repo guidance, new/changed flows should include grep-friendly diagnostics for state transitions, which would help debug the hash-routing edge cases already being worked around in e2e specs (flows.spec.ts,notifications.spec.ts).As per coding guidelines: "New or changed flows must include verbose, grep-friendly diagnostics for entry/exit, branches, external calls, retries/timeouts, state transitions, and errors; never log secrets or full PII."
🤖 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/settings/panels/LlmConnectionsPanel.tsx` around lines 38 - 43, Add a lightweight, grep-friendly diagnostic to setChip that records the chip state transition before calling navigate, including only the relevant non-sensitive chip value and navigation context. Keep the existing hash-backed navigation and replace behavior unchanged.Source: Coding guidelines
app/src/pages/Skills.tsx (1)
1134-1231: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy liftConsider extracting the welcome/intelligence/panel-page render branches into sub-components.
This ternary chain (welcome landing vs.
INTELLIGENCE_TABSheaderless panels vs.PanelPagefallback) adds meaningfully to an already ~1500-line component that also owns Composio grid logic, channel tiles, and modal state. Splitting each branch into its own component would keepSkills.tsxfocused on tab routing/state.🤖 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/pages/Skills.tsx` around lines 1134 - 1231, Extract the three render branches controlled by activeTab into focused sub-components: the welcome landing using PageWelcome, the INTELLIGENCE_TABS branch including its header/card and SettingsLayoutProvider logic, and the PanelPage fallback. Keep existing tab routing, handlers, translations, and rendered behavior unchanged, with Skills.tsx retaining only branch selection and state ownership.app/src/pages/__tests__/Rewards.test.tsx (1)
1-434: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd a test for the new welcome-view branch.
Every test here now routes straight to
?view=main, so the new welcome landing inRewards.tsx(lines 122-170:testId="rewards-welcome", its CTA switching toview=main) is untested in this file. As per coding guidelines, "Untested code is incomplete; changes should maintain at least 80% coverage on changed lines," and this ~40-line new branch currently has none here.Want me to add a test that renders
Rewardson the default route (no?view=main), asserts the welcome pitch is shown, then clicksrewards-welcome-cta-viewand asserts the main tabbed view renders?🤖 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/pages/__tests__/Rewards.test.tsx` around lines 1 - 434, Add a test in the “Rewards page” suite covering the default route without ?view=main: render Rewards, assert the rewards-welcome container and welcome content are displayed, click the rewards-welcome-cta-view control, then verify the main tabbed view renders and the welcome view is gone. Reuse the existing rewards API mock setup as needed and anchor the assertions to the visible test IDs and tab content.Source: Coding guidelines
app/src/pages/Rewards.tsx (1)
142-148: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winNew welcome-CTA navigation flows ship without diagnostics.
Both new welcome landings wire CTAs straight to a view/route transition with no logging, unlike the rest of each file's user-action handlers (e.g.
Rewards.tsx'shandleTabChange/handleRetryboth calllog(...)). As per coding guidelines, "New or changed flows must include verbose, grep-friendly diagnostics for entry/exit, branches, external calls, retries/timeouts, state transitions, and errors."
app/src/pages/Rewards.tsx#L142-L148: add alog('welcome cta clicked; switching to main view')(or similar) before/inside thesetView('main')call.app/src/agentworld/pages/WelcomeSection.tsx#L23-L39: add alog('welcome cta clicked target=%s', ...)call in eachonClickbeforenavigate(...).🤖 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/pages/Rewards.tsx` around lines 142 - 148, The new welcome CTA handlers lack diagnostic logging before navigation. In app/src/pages/Rewards.tsx lines 142-148, update the CTA onClick around setView('main') to log the welcome CTA click and target before switching views; in app/src/agentworld/pages/WelcomeSection.tsx lines 23-39, add a grep-friendly log with the target in each onClick before navigate(...), preserving the existing transitions.Source: Coding guidelines
app/src/pages/__tests__/Brain.test.tsx (1)
157-183: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winAdd a test for the new default (no
?tab=) → Welcome view.Every render in this file now passes an explicit
initialEntriessince the default tab changed fromgraphtowelcome, but no test asserts that rendering<Brain />with/(notabparam) actually shows thePageWelcome(brain-welcome) content — the core new behavior this PR introduces.✅ Suggested additional test
+ it('defaults to the welcome view when no ?tab= is present', async () => { + graphExportMock.mockResolvedValue(makeGraph(0)); + await act(async () => { + renderWithProviders(<Brain />); + }); + await waitFor(() => { + expect(screen.getByTestId('brain-welcome')).toBeInTheDocument(); + }); + });🤖 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/pages/__tests__/Brain.test.tsx` around lines 157 - 183, Add a test in the Brain test suite that renders <Brain /> with the root route “/” and no tab query parameter, then waits for the brain-welcome test ID to be present, asserting the new default Welcome view.app/src/pages/Brain.tsx (1)
210-264: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRepeated
as Exclude<BrainTab, 'welcome'>cast could be hoisted.
activeTab as Exclude<BrainTab, 'welcome'>is cast twice to indexBRAIN_HEADERS; hoisting the lookup into a local variable inside theelsebranch would avoid the duplicate cast/lookup and read slightly cleaner.♻️ Optional tidy-up
- <PanelPage contentClassName="p-4"> - <div className="mx-auto max-w-3xl space-y-5"> - <PageSectionHeader - title={t(BRAIN_HEADERS[activeTab as Exclude<BrainTab, 'welcome'>].titleKey)} - description={t(BRAIN_HEADERS[activeTab as Exclude<BrainTab, 'welcome'>].descKey)} - /> + <PanelPage contentClassName="p-4"> + <div className="mx-auto max-w-3xl space-y-5"> + {(() => { + const header = BRAIN_HEADERS[activeTab as Exclude<BrainTab, 'welcome'>]; + return ( + <PageSectionHeader title={t(header.titleKey)} description={t(header.descKey)} /> + ); + })()}🤖 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/pages/Brain.tsx` around lines 210 - 264, Hoist the non-welcome tab value and its BRAIN_HEADERS lookup into local variables within the else branch, then reuse the resolved header for PageSectionHeader instead of repeating activeTab as Exclude<BrainTab, 'welcome'> and the lookup. Preserve the existing title and description keys.app/src/components/layout/PageSectionHeader.tsx (1)
1-51: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd a small render test for
PageSectionHeaderA basic title/description/action/tabs render test would cheaply protect this shared primitive used across multiple pages.🤖 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/layout/PageSectionHeader.tsx` around lines 1 - 51, Add a focused render test for the PageSectionHeader component covering title, description, action, and tabs, and verify each provided value appears in the rendered output. Use the component’s testId prop or accessible queries as appropriate, without expanding beyond this basic render coverage.Source: Coding guidelines
app/src/components/layout/usePageWelcomeView.tsx (1)
47-91: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd diagnostics for the welcome↔main view transition.
setViewmutates navigation state but never logs the transition, unlike other flows in this codebase (e.g.FlowsPage.tsx'screateDebugcalls). Since this hook backs every Welcome-landing page in the PR, one log line here restores grep-friendly visibility everywhere it's reused.As per coding guidelines: "New or changed flows must include verbose, grep-friendly diagnostics for entry/exit, branches, external calls, retries/timeouts, state transitions, and errors; never log secrets or full PII."
♻️ Suggested diagnostics addition
+import createDebug from 'debug'; import { type ReactNode, useCallback, useMemo } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import { SidebarContent } from './shell/SidebarSlot'; import TwoPaneNav from './TwoPaneNav'; + +const log = createDebug('app:page-welcome-view');const setView = useCallback( (v: PageWelcomeViewId) => { + log('setView: %s -> %s', view, v); const params = new URLSearchParams(location.search); if (v === 'main') params.set('view', 'main'); else params.delete('view'); const search = params.toString(); navigate({ pathname: location.pathname, search: search ? `?${search}` : '' }); }, - [location.pathname, location.search, navigate] + [location.pathname, location.search, navigate, view] );🤖 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/layout/usePageWelcomeView.tsx` around lines 47 - 91, Update the setView callback in usePageWelcomeView to emit a verbose, grep-friendly debug diagnostic for each welcome↔main view transition before navigating. Include the current and target PageWelcomeViewId values, but do not log URL contents, secrets, or full PII; keep the existing URL parameter mutation and navigate behavior unchanged.app/src/pages/Feedback.test.tsx (1)
61-105: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winNo test covers the new default (welcome) view.
Every test in this file now navigates directly to
?view=main, so the new welcome-screen branch added inFeedback.tsx(which is the default route with no query param) has no direct coverage — e.g. that visiting/feedbackrendersPageWelcomewithtestId="feedback-welcome", and that clicking a CTA callssetView('main')and reveals the board. Per path instructions, "Untested code is incomplete; changes should maintain at least 80% coverage on changed lines," and the welcome branch is a substantial (~50 line) new code path.🤖 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/pages/Feedback.test.tsx` around lines 61 - 105, Extend the <Feedback /> test suite to cover the default route without a view query: verify it renders the welcome screen using testId="feedback-welcome", then exercise a welcome CTA and assert it switches to the main view via setView('main') and reveals the feedback board. Keep the existing main-view loading, empty-state, and error tests unchanged.Source: Path instructions
app/src/pages/Feedback.tsx (1)
159-167: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winMissing diagnostics for the new welcome→main state transition.
The welcome/main view is a new UI state machine (via
usePageWelcomeView), but neither the initial branch decision nor thesetView('main')transitions triggered by these CTAs are logged. As per path instructions, "New or changed flows must include verbose, grep-friendly diagnostics for entry/exit, branches, external calls, retries/timeouts, state transitions, and errors."🤖 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/pages/Feedback.tsx` around lines 159 - 167, Update the welcome-view flow around the usePageWelcomeView state and both CTA onClick handlers to add verbose, grep-friendly diagnostics for the initial welcome/main branch and each setView('main') transition. Include clear entry, branch, and transition context while preserving the existing CTA behavior.Source: Path instructions
🤖 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/AppRoutes.tsx`:
- Around line 103-109: Update the routing comment near the Workflows and
routines routes to state that `/workflows` renders the legacy Activity/Skills
surface, while only the bare `/routines` slug redirects to `/flows`. Keep the
surrounding route-scope and future-work notes accurate without changing route
behavior.
In `@app/src/lib/i18n/en.ts`:
- Around line 149-150: Update the agentWorld.welcome.eyebrow translation value
from “TinyPlace” to the canonical “Tiny Place” label, preserving “tiny.place”
only for domain prose and leaving the navigation label unchanged.
In `@app/src/lib/i18n/es.ts`:
- Around line 20-21: Update the Spanish translation for
agentWorld.welcome.feat3Body to replace the English “wallet” terminology with
the established Spanish term used consistently in this file, while preserving
the message’s meaning and approval wording.
In `@app/src/lib/i18n/ko.ts`:
- Line 134: Update the translation value for flows.welcome.feat1Body to use 워크플로
instead of 플로, matching the Flow terminology used in surrounding Korean copy.
- Line 98: Update the value for the 'notifications.welcome.title' translation
key in ko.ts from “정말로 당신이 필요한 것만” to “정말로 당신에게 필요한 것만”, leaving the key and
surrounding translations unchanged.
- Around line 346-350: Update the Korean translations for
orchPage.demo.networkSummary and orchPage.demo.peerSessions to explicitly
include “세션” in the active sub-agent counts, while preserving the existing
placeholders and grammatical meaning.
- Line 7: Update the agentWorld.welcome.eyebrow translation value in the Korean
locale to use the canonical “Tiny Place” UI label, preserving tiny.place only
for domain references.
In `@app/src/pages/Notifications.tsx`:
- Around line 106-154: Add test coverage for the default `view === 'welcome'`
branch in `Notifications`, rendering the page without the `view=main` query
parameter and asserting the welcome UI appears. Also exercise the
`notifications-welcome-cta-view` CTA and verify it transitions to the main view.
---
Outside diff comments:
In `@app/src/components/settings/settingsRouteRegistry.ts`:
- Around line 373-374: Update the recovery-phrase route registration and its
resolveSidebarId parent mapping so it references an existing sidebar id. Either
restore the wallet-balances sidebar group or remove the wallet-balances parent
link, ensuring recovery-phrase resolves to a real sidebar entry and its active
highlight works.
In `@app/src/pages/Brain.tsx`:
- Around line 300-314: Add the sync.auditTitle translation key with the “Sync
History” value to the locale catalogs, including app/src/lib/i18n/en.ts and
app/src/lib/i18n/fr.ts (lines 1-7418), plus every other supported locale. Keep
the existing Brain.tsx heading usage at app/src/pages/Brain.tsx (lines 300-314)
and ensure all catalogs provide the key so it no longer relies on the inline
fallback.
---
Nitpick comments:
In `@app/src/components/layout/PageSectionHeader.tsx`:
- Around line 1-51: Add a focused render test for the PageSectionHeader
component covering title, description, action, and tabs, and verify each
provided value appears in the rendered output. Use the component’s testId prop
or accessible queries as appropriate, without expanding beyond this basic render
coverage.
In `@app/src/components/layout/usePageWelcomeView.tsx`:
- Around line 47-91: Update the setView callback in usePageWelcomeView to emit a
verbose, grep-friendly debug diagnostic for each welcome↔main view transition
before navigating. Include the current and target PageWelcomeViewId values, but
do not log URL contents, secrets, or full PII; keep the existing URL parameter
mutation and navigate behavior unchanged.
In `@app/src/components/settings/panels/LlmConnectionsPanel.tsx`:
- Around line 38-43: Add a lightweight, grep-friendly diagnostic to setChip that
records the chip state transition before calling navigate, including only the
relevant non-sensitive chip value and navigation context. Keep the existing
hash-backed navigation and replace behavior unchanged.
In `@app/src/pages/__tests__/Brain.test.tsx`:
- Around line 157-183: Add a test in the Brain test suite that renders <Brain />
with the root route “/” and no tab query parameter, then waits for the
brain-welcome test ID to be present, asserting the new default Welcome view.
In `@app/src/pages/__tests__/Rewards.test.tsx`:
- Around line 1-434: Add a test in the “Rewards page” suite covering the default
route without ?view=main: render Rewards, assert the rewards-welcome container
and welcome content are displayed, click the rewards-welcome-cta-view control,
then verify the main tabbed view renders and the welcome view is gone. Reuse the
existing rewards API mock setup as needed and anchor the assertions to the
visible test IDs and tab content.
In `@app/src/pages/Brain.tsx`:
- Around line 210-264: Hoist the non-welcome tab value and its BRAIN_HEADERS
lookup into local variables within the else branch, then reuse the resolved
header for PageSectionHeader instead of repeating activeTab as
Exclude<BrainTab, 'welcome'> and the lookup. Preserve the existing title
and description keys.
In `@app/src/pages/Feedback.test.tsx`:
- Around line 61-105: Extend the <Feedback /> test suite to cover the default
route without a view query: verify it renders the welcome screen using
testId="feedback-welcome", then exercise a welcome CTA and assert it switches to
the main view via setView('main') and reveals the feedback board. Keep the
existing main-view loading, empty-state, and error tests unchanged.
In `@app/src/pages/Feedback.tsx`:
- Around line 159-167: Update the welcome-view flow around the
usePageWelcomeView state and both CTA onClick handlers to add verbose,
grep-friendly diagnostics for the initial welcome/main branch and each
setView('main') transition. Include clear entry, branch, and transition context
while preserving the existing CTA behavior.
In `@app/src/pages/Rewards.tsx`:
- Around line 142-148: The new welcome CTA handlers lack diagnostic logging
before navigation. In app/src/pages/Rewards.tsx lines 142-148, update the CTA
onClick around setView('main') to log the welcome CTA click and target before
switching views; in app/src/agentworld/pages/WelcomeSection.tsx lines 23-39, add
a grep-friendly log with the target in each onClick before navigate(...),
preserving the existing transitions.
In `@app/src/pages/Skills.tsx`:
- Around line 1134-1231: Extract the three render branches controlled by
activeTab into focused sub-components: the welcome landing using PageWelcome,
the INTELLIGENCE_TABS branch including its header/card and
SettingsLayoutProvider logic, and the PanelPage fallback. Keep existing tab
routing, handlers, translations, and rendered behavior unchanged, with
Skills.tsx retaining only branch selection and state ownership.
In `@app/test/e2e/helpers/shared-flows.ts`:
- Around line 479-490: Update the deprecated navigateToSkills function to
delegate to navigateToConnections instead of duplicating its navigation logic,
while preserving its asynchronous behavior and existing callers.
🪄 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: 3f13591e-c66c-4305-819e-e71f02012858
⛔ Files ignored due to path filters (1)
app/src-tauri/Cargo.lockis excluded by!**/*.lock
📒 Files selected for processing (203)
app/src/AppRoutes.tsxapp/src/agentworld/pages/AgentWorld.test.tsxapp/src/agentworld/pages/AgentWorld.tsxapp/src/agentworld/pages/WelcomeSection.tsxapp/src/components/intelligence/ConnectionPathPanel.test.tsxapp/src/components/intelligence/ConnectionPathPanel.tsxapp/src/components/intelligence/ConnectionPathTab.test.tsxapp/src/components/intelligence/ConnectionPathTab.tsxapp/src/components/intelligence/DiagramViewerTab.test.tsxapp/src/components/intelligence/DiagramViewerTab.tsxapp/src/components/intelligence/EntityAssociationsPanel.test.tsxapp/src/components/intelligence/EntityAssociationsPanel.tsxapp/src/components/intelligence/EntityAssociationsTab.test.tsxapp/src/components/intelligence/EntityAssociationsTab.tsxapp/src/components/intelligence/GraphCentralityPanel.test.tsxapp/src/components/intelligence/GraphCentralityPanel.tsxapp/src/components/intelligence/GraphCentralityTab.test.tsxapp/src/components/intelligence/GraphCentralityTab.tsxapp/src/components/intelligence/GraphCohesionPanel.test.tsxapp/src/components/intelligence/GraphCohesionPanel.tsxapp/src/components/intelligence/GraphCohesionTab.test.tsxapp/src/components/intelligence/GraphCohesionTab.tsxapp/src/components/intelligence/IntelligenceAgentWorkTab.test.tsxapp/src/components/intelligence/IntelligenceAgentWorkTab.tsxapp/src/components/intelligence/IntelligenceAgentsTab.tsxapp/src/components/intelligence/IntelligenceOrchestrationTab.test.tsxapp/src/components/intelligence/IntelligenceOrchestrationTab.tsxapp/src/components/intelligence/IntelligenceTasksTab.tsxapp/src/components/intelligence/IntelligenceTeamsTab.test.tsxapp/src/components/intelligence/IntelligenceTeamsTab.tsxapp/src/components/intelligence/IntelligenceWorktreesTab.test.tsxapp/src/components/intelligence/IntelligenceWorktreesTab.tsxapp/src/components/intelligence/MemoryFreshnessPanel.test.tsxapp/src/components/intelligence/MemoryFreshnessPanel.tsxapp/src/components/intelligence/MemoryFreshnessTab.test.tsxapp/src/components/intelligence/MemoryFreshnessTab.tsxapp/src/components/intelligence/MemoryGraph.tsxapp/src/components/intelligence/MemoryTimelinePanel.test.tsxapp/src/components/intelligence/MemoryTimelinePanel.tsxapp/src/components/intelligence/MemoryTimelineTab.test.tsxapp/src/components/intelligence/MemoryTimelineTab.tsxapp/src/components/intelligence/MemoryWorkspace.test.tsxapp/src/components/intelligence/MemoryWorkspace.tsxapp/src/components/intelligence/NamespaceOverviewPanel.test.tsxapp/src/components/intelligence/NamespaceOverviewPanel.tsxapp/src/components/intelligence/NamespaceOverviewTab.test.tsxapp/src/components/intelligence/NamespaceOverviewTab.tsxapp/src/components/intelligence/PixiGraph.tsxapp/src/components/intelligence/TeamTaskBoard.test.tsxapp/src/components/intelligence/TeamTaskBoard.tsxapp/src/components/intelligence/UserTaskComposer.test.tsxapp/src/components/intelligence/UserTaskComposer.tsxapp/src/components/intelligence/__tests__/IntelligenceAgentsTab.test.tsxapp/src/components/intelligence/__tests__/IntelligenceTasksTab.test.tsxapp/src/components/intelligence/memoryGraphLayout.tsapp/src/components/intelligence/pixiGraphRenderer.tsapp/src/components/layout/PageSectionHeader.tsxapp/src/components/layout/PageWelcome.test.tsxapp/src/components/layout/PageWelcome.tsxapp/src/components/layout/usePageWelcomeView.tsxapp/src/components/orchestration/MedullaOverviewPanel.test.tsxapp/src/components/orchestration/MedullaOverviewPanel.tsxapp/src/components/orchestration/demo/DemoScaleBanner.tsxapp/src/components/orchestration/demo/MedullaDemoChat.tsxapp/src/components/orchestration/demo/MedullaDemoGraph.tsxapp/src/components/orchestration/demo/MedullaDemoNetwork.tsxapp/src/components/orchestration/demo/medullaDemoData.tsapp/src/components/rewards/RewardsCommunityTab.tsxapp/src/components/rewards/__tests__/RewardsCommunityTab.test.tsxapp/src/components/settings/__tests__/settingsRouteRegistry.test.tsapp/src/components/settings/hooks/__tests__/useSettingsNavigation.coverage.test.tsxapp/src/components/settings/hooks/useSettingsNavigation.tsapp/src/components/settings/layout/SettingsLayoutContext.tsxapp/src/components/settings/layout/SettingsPanel.tsxapp/src/components/settings/layout/settingsNavIcons.tsxapp/src/components/settings/panels/AgentChatPanel.tsxapp/src/components/settings/panels/AnalysisViewsPanel.tsxapp/src/components/settings/panels/ComposioPanel.tsxapp/src/components/settings/panels/ComposioTriagePanel.tsxapp/src/components/settings/panels/DevWorkflowPanel.tsxapp/src/components/settings/panels/DeveloperOptionsPanel.tsxapp/src/components/settings/panels/IntegrationsPanel.tsxapp/src/components/settings/panels/LlmConnectionsPanel.tsxapp/src/components/settings/panels/LocalModelDebugPanel.tsxapp/src/components/settings/panels/MeetingSettingsPanel.tsxapp/src/components/settings/panels/MemorySyncPanel.tsxapp/src/components/settings/panels/ModelHealthPanel.tsxapp/src/components/settings/panels/TaskSourcesPanel.test.tsxapp/src/components/settings/panels/TaskSourcesPanel.tsxapp/src/components/settings/panels/TasksPanel.tsxapp/src/components/settings/panels/TokenUsagePanel.tsxapp/src/components/settings/panels/UsagePanel.tsxapp/src/components/settings/panels/VoiceDebugPanel.tsxapp/src/components/settings/panels/WalletPanel.tsxapp/src/components/settings/panels/WebhooksDebugPanel.tsxapp/src/components/settings/panels/__tests__/ComposioPanel.test.tsxapp/src/components/settings/panels/__tests__/DevWorkflowPanel.test.tsxapp/src/components/settings/panels/__tests__/DeveloperOptionsPanel.test.tsxapp/src/components/settings/panels/__tests__/IntegrationsPanel.test.tsxapp/src/components/settings/panels/__tests__/LlmConnectionsPanel.test.tsxapp/src/components/settings/panels/__tests__/ModelHealthPanel.test.tsxapp/src/components/settings/panels/__tests__/TasksPanel.test.tsxapp/src/components/settings/panels/__tests__/UsagePanel.test.tsxapp/src/components/settings/panels/__tests__/VoiceDebugPanel.test.tsxapp/src/components/settings/panels/__tests__/WalletPanel.test.tsxapp/src/components/settings/panels/__tests__/WebhooksDebugPanel.test.tsxapp/src/components/settings/search/settingsSearchRegistry.tsapp/src/components/settings/settingsRouteElements.tsxapp/src/components/settings/settingsRouteRegistry.tsapp/src/components/webhooks/ComposeioTriggerHistory.tsxapp/src/components/webhooks/TunnelList.test.tsxapp/src/components/webhooks/TunnelList.tsxapp/src/components/webhooks/WebhookActivity.tsxapp/src/features/webhooks/types.tsapp/src/hooks/__tests__/useWebhooks.test.tsapp/src/hooks/useComposeioTriggerHistory.tsapp/src/hooks/useWebhooks.tsapp/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/lib/memory/connectionPath.test.tsapp/src/lib/memory/connectionPath.tsapp/src/lib/memory/entityAssociations.test.tsapp/src/lib/memory/entityAssociations.tsapp/src/lib/memory/graphCentrality.test.tsapp/src/lib/memory/graphCentrality.tsapp/src/lib/memory/graphCohesion.test.tsapp/src/lib/memory/graphCohesion.tsapp/src/lib/memory/memoryFreshness.test.tsapp/src/lib/memory/memoryFreshness.tsapp/src/lib/memory/memoryTimeline.test.tsapp/src/lib/memory/memoryTimeline.tsapp/src/lib/memory/namespaceOverview.test.tsapp/src/lib/memory/namespaceOverview.tsapp/src/lib/notificationRouter.test.tsapp/src/lib/notificationRouter.tsapp/src/lib/orchestration/useMedullaAccess.tsapp/src/pages/Brain.tsxapp/src/pages/Feedback.test.tsxapp/src/pages/Feedback.tsxapp/src/pages/FlowsPage.test.tsxapp/src/pages/FlowsPage.tsxapp/src/pages/Intelligence.test.tsxapp/src/pages/Intelligence.tsxapp/src/pages/Notifications.tsxapp/src/pages/OrchestrationPage.tsxapp/src/pages/Rewards.tsxapp/src/pages/Skills.tsxapp/src/pages/Webhooks.tsxapp/src/pages/__tests__/Brain.test.tsxapp/src/pages/__tests__/Intelligence.test.tsxapp/src/pages/__tests__/Notifications.test.tsxapp/src/pages/__tests__/OrchestrationPage.test.tsxapp/src/pages/__tests__/Rewards.test.tsxapp/src/pages/__tests__/Skills.intelligence-tabs.test.tsxapp/src/pages/__tests__/Webhooks.test.tsxapp/src/services/api/connectionPathApi.test.tsapp/src/services/api/connectionPathApi.tsapp/src/services/api/entityAssociationsApi.test.tsapp/src/services/api/entityAssociationsApi.tsapp/src/services/api/graphCentralityApi.test.tsapp/src/services/api/graphCentralityApi.tsapp/src/services/api/graphCohesionApi.test.tsapp/src/services/api/graphCohesionApi.tsapp/src/services/api/memoryFreshnessApi.test.tsapp/src/services/api/memoryFreshnessApi.tsapp/src/services/api/memoryTimelineApi.test.tsapp/src/services/api/memoryTimelineApi.tsapp/src/services/api/namespaceOverviewApi.test.tsapp/src/services/api/namespaceOverviewApi.tsapp/src/services/api/tunnelsApi.test.tsapp/src/services/api/tunnelsApi.tsapp/src/services/coreRpcClient.tsapp/src/test/memoryRelationFactory.tsapp/src/types/api.tsapp/src/utils/tauriCommands/index.tsapp/src/utils/tauriCommands/webhooks.tsapp/test/e2e/helpers/shared-flows.tsapp/test/e2e/specs/flows.spec.tsapp/test/e2e/specs/notifications.spec.tsapp/test/e2e/specs/rewards-progression-persistence.spec.tsapp/test/e2e/specs/rewards-unlock-flow.spec.tsapp/test/e2e/specs/settings-dev-options.spec.tsapp/test/e2e/specs/webhooks-ingress-flow.spec.tsapp/test/playwright/specs/settings-dev-options.spec.tsapp/test/playwright/specs/webhooks-ingress-flow.spec.tsscripts/i18n-find-english.tssrc/openhuman/config/schema/context.rssrc/openhuman/config/schema/load/env_overlay.rssrc/openhuman/config/schema/load_tests.rssrc/openhuman/context/manager_tests.rssrc/openhuman/skills/schemas/controller_schemas.rs
💤 Files with no reviewable changes (78)
- app/src/components/intelligence/EntityAssociationsPanel.test.tsx
- app/src/components/intelligence/ConnectionPathPanel.test.tsx
- app/src/components/intelligence/MemoryFreshnessTab.test.tsx
- app/src/components/intelligence/DiagramViewerTab.tsx
- app/src/components/intelligence/NamespaceOverviewTab.test.tsx
- app/src/components/intelligence/EntityAssociationsTab.tsx
- app/src/components/intelligence/GraphCohesionPanel.test.tsx
- app/src/components/intelligence/EntityAssociationsTab.test.tsx
- app/src/components/intelligence/MemoryFreshnessPanel.test.tsx
- app/src/components/intelligence/GraphCentralityTab.tsx
- app/src/components/settings/panels/tests/TasksPanel.test.tsx
- app/src/components/intelligence/MemoryTimelineTab.test.tsx
- app/src/components/intelligence/ConnectionPathPanel.tsx
- app/src/components/intelligence/GraphCentralityPanel.test.tsx
- app/src/components/settings/panels/tests/IntegrationsPanel.test.tsx
- app/src/components/settings/panels/IntegrationsPanel.tsx
- app/src/components/settings/panels/tests/VoiceDebugPanel.test.tsx
- app/src/components/intelligence/tests/IntelligenceAgentsTab.test.tsx
- app/src/components/intelligence/IntelligenceTeamsTab.test.tsx
- app/src/components/settings/panels/VoiceDebugPanel.tsx
- app/src/components/intelligence/GraphCohesionTab.tsx
- app/src/components/settings/panels/tests/ModelHealthPanel.test.tsx
- app/src/components/intelligence/ConnectionPathTab.test.tsx
- app/src/hooks/useWebhooks.ts
- app/src/components/intelligence/NamespaceOverviewTab.tsx
- app/src/components/settings/panels/TasksPanel.tsx
- app/src/components/intelligence/tests/IntelligenceTasksTab.test.tsx
- app/src/components/intelligence/IntelligenceAgentWorkTab.tsx
- app/src/components/settings/panels/DevWorkflowPanel.tsx
- app/src/hooks/tests/useWebhooks.test.ts
- app/src/components/intelligence/GraphCentralityTab.test.tsx
- app/src/components/intelligence/UserTaskComposer.test.tsx
- app/src/components/intelligence/IntelligenceTeamsTab.tsx
- app/src/components/intelligence/ConnectionPathTab.tsx
- app/src/components/webhooks/TunnelList.test.tsx
- app/src/components/intelligence/MemoryTimelinePanel.test.tsx
- app/src/components/intelligence/UserTaskComposer.tsx
- app/test/playwright/specs/webhooks-ingress-flow.spec.ts
- app/src/components/intelligence/MemoryFreshnessPanel.tsx
- app/src/components/intelligence/IntelligenceOrchestrationTab.test.tsx
- app/src/components/webhooks/WebhookActivity.tsx
- app/src/components/settings/panels/ModelHealthPanel.tsx
- app/src/components/intelligence/IntelligenceWorktreesTab.test.tsx
- app/src/components/intelligence/IntelligenceOrchestrationTab.tsx
- app/src/components/intelligence/GraphCohesionPanel.tsx
- app/src/components/intelligence/MemoryTimelinePanel.tsx
- app/src/components/intelligence/GraphCohesionTab.test.tsx
- app/src/components/settings/panels/AnalysisViewsPanel.tsx
- app/src/features/webhooks/types.ts
- app/src/components/intelligence/IntelligenceAgentWorkTab.test.tsx
- app/src/components/intelligence/GraphCentralityPanel.tsx
- app/src/components/settings/panels/TaskSourcesPanel.tsx
- app/src/components/intelligence/EntityAssociationsPanel.tsx
- app/src/utils/tauriCommands/index.ts
- app/src/components/intelligence/NamespaceOverviewPanel.tsx
- app/src/components/webhooks/TunnelList.tsx
- app/src/components/intelligence/NamespaceOverviewPanel.test.tsx
- app/src/components/intelligence/TeamTaskBoard.tsx
- app/src/components/intelligence/TeamTaskBoard.test.tsx
- app/src/components/intelligence/IntelligenceWorktreesTab.tsx
- app/src/components/intelligence/MemoryFreshnessTab.tsx
- app/src/components/intelligence/MemoryWorkspace.test.tsx
- app/src/components/intelligence/MemoryTimelineTab.tsx
- app/src/components/intelligence/IntelligenceTasksTab.tsx
- app/src/components/settings/panels/MemorySyncPanel.tsx
- app/src/hooks/useComposeioTriggerHistory.ts
- app/src/components/intelligence/IntelligenceAgentsTab.tsx
- app/src/components/intelligence/DiagramViewerTab.test.tsx
- app/src/components/settings/panels/WebhooksDebugPanel.tsx
- app/src/components/webhooks/ComposeioTriggerHistory.tsx
- app/test/e2e/specs/settings-dev-options.spec.ts
- app/src/components/intelligence/MemoryWorkspace.tsx
- app/src/components/settings/panels/tests/DevWorkflowPanel.test.tsx
- app/test/playwright/specs/settings-dev-options.spec.ts
- app/src/components/settings/panels/tests/WebhooksDebugPanel.test.tsx
- app/src/components/settings/hooks/useSettingsNavigation.ts
- app/src/components/settings/search/settingsSearchRegistry.ts
- app/src/components/settings/panels/TaskSourcesPanel.test.tsx
| Skill routes below (create/run); the bare `/workflows` and | ||
| `/routines` slugs now redirect here (to `/flows`) since Workflows is | ||
| a first-level module. Not a tab-level route (unlike `/flows` itself, | ||
| `/flows/:id` isn't reached from the BottomTabBar), so | ||
| `navigation.spec.ts`'s ROUTES table needs no change. Full editing | ||
| (B5b.2+) and the agent-proposal surface (B4) are separate, later | ||
| work. */} |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Correct the stale Workflows routing comment.
Lines [103-104] say /workflows redirects to /flows, but lines [246-252] render <Activity /> at /workflows. Update the comment to describe the actual legacy Activity/Skills surface; only /routines redirects to /flows.
🤖 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/AppRoutes.tsx` around lines 103 - 109, Update the routing comment
near the Workflows and routines routes to state that `/workflows` renders the
legacy Activity/Skills surface, while only the bare `/routines` slug redirects
to `/flows`. Keep the surrounding route-scope and future-work notes accurate
without changing route behavior.
| 'agentWorld.welcome.nav': 'Welcome', | ||
| 'agentWorld.welcome.eyebrow': 'TinyPlace', |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Use the canonical “Tiny Place” brand label.
Line [150] uses TinyPlace for a UI eyebrow, while the navigation label and repository convention use Tiny Place. Keep product branding consistent.
Based on learnings, use Tiny Place for product/sidebar/UI labels and reserve tiny.place for domain prose.
🤖 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/en.ts` around lines 149 - 150, Update the
agentWorld.welcome.eyebrow translation value from “TinyPlace” to the canonical
“Tiny Place” label, preserving “tiny.place” only for domain prose and leaving
the navigation label unchanged.
Source: Learnings
| 'agentWorld.welcome.feat3Body': | ||
| 'Pagos entre agentes respaldados por la wallet, con tu aprobación.', |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Inconsistent wallet terminology.
'agentWorld.welcome.feat3Body' uses the English word "wallet" ("la wallet"), while every other wallet-related string in this same file uses "cartera" (wallet.tabs.balance, nav.wallet) or "monedero" (connections.header.wallet). Align the term for consistency.
🌐 Suggested fix
'agentWorld.welcome.feat3Body':
- 'Pagos entre agentes respaldados por la wallet, con tu aprobación.',
+ 'Pagos entre agentes respaldados por la cartera, con tu aprobación.',📝 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.
| 'agentWorld.welcome.feat3Body': | |
| 'Pagos entre agentes respaldados por la wallet, con tu aprobación.', | |
| 'agentWorld.welcome.feat3Body': | |
| 'Pagos entre agentes respaldados por la cartera, con tu aprobación.', |
🤖 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/es.ts` around lines 20 - 21, Update the Spanish translation
for agentWorld.welcome.feat3Body to replace the English “wallet” terminology
with the established Spanish term used consistently in this file, while
preserving the message’s meaning and approval wording.
| // English-identical values fall back to English via I18nContext.resolveEn(). | ||
| const messages: TranslationMap = { | ||
| 'agentWorld.welcome.nav': '환영합니다', | ||
| 'agentWorld.welcome.eyebrow': 'TinyPlace', |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Use the canonical Tiny Place UI label.
agentWorld.welcome.eyebrow uses TinyPlace, while existing product/sidebar branding uses Tiny Place. Based on learnings, UI branding uses Tiny Place; tiny.place is reserved for domain references.
Proposed fix
- 'agentWorld.welcome.eyebrow': 'TinyPlace',
+ 'agentWorld.welcome.eyebrow': 'Tiny Place',📝 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.
| 'agentWorld.welcome.eyebrow': 'TinyPlace', | |
| 'agentWorld.welcome.eyebrow': 'Tiny Place', |
🤖 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/ko.ts` at line 7, Update the agentWorld.welcome.eyebrow
translation value in the Korean locale to use the canonical “Tiny Place” UI
label, preserving tiny.place only for domain references.
Source: Learnings
| 'notifications.welcome.nav': '환영합니다', | ||
| 'notifications.welcome.main': '알림', | ||
| 'notifications.welcome.eyebrow': '알림', | ||
| 'notifications.welcome.title': '정말로 당신이 필요한 것만', |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Correct the notifications title wording.
정말로 당신이 필요한 것만 is awkward Korean. Use 정말로 당신에게 필요한 것만 to preserve the intended meaning.
Proposed fix
- 'notifications.welcome.title': '정말로 당신이 필요한 것만',
+ 'notifications.welcome.title': '정말로 당신에게 필요한 것만',📝 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.
| 'notifications.welcome.title': '정말로 당신이 필요한 것만', | |
| 'notifications.welcome.title': '정말로 당신에게 필요한 것만', |
🤖 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/ko.ts` at line 98, Update the value for the
'notifications.welcome.title' translation key in ko.ts from “정말로 당신이 필요한 것만” to
“정말로 당신에게 필요한 것만”, leaving the key and surrounding translations unchanged.
| 'flows.welcome.ctaBrowse': '워크플로 둘러보기', | ||
| 'flows.welcome.featsLabel': '자동화할 수 있는 것', | ||
| 'flows.welcome.feat1Title': '말로 설명하기', | ||
| 'flows.welcome.feat1Body': '원하는 것을 평범한 말로 이야기하면 빌더가 플로 초안을 작성합니다.', |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Keep the Flow terminology consistent.
플로 reads as a typo in flows.welcome.feat1Body; use 워크플로 to match the surrounding copy.
Proposed fix
- '원하는 것을 평범한 말로 이야기하면 빌더가 플로 초안을 작성합니다.',
+ '원하는 것을 평범한 말로 이야기하면 빌더가 워크플로 초안을 작성합니다.',📝 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.
| 'flows.welcome.feat1Body': '원하는 것을 평범한 말로 이야기하면 빌더가 플로 초안을 작성합니다.', | |
| 'flows.welcome.feat1Body': '원하는 것을 평범한 말로 이야기하면 빌더가 워크플로 초안을 작성합니다.', |
🤖 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/ko.ts` at line 134, Update the translation value for
flows.welcome.feat1Body to use 워크플로 instead of 플로, matching the Flow terminology
used in surrounding Korean copy.
| 'orchPage.demo.networkSummary': '{peers}개 연결됨 · {sessions}개 활성 하위 에이전트', | ||
| 'orchPage.demo.peer.connected': '연결됨', | ||
| 'orchPage.demo.peer.connecting': '연결 중', | ||
| 'orchPage.demo.peer.idle': '유휴', | ||
| 'orchPage.demo.peerSessions': '하위 에이전트 {count}개', |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Keep “session” in the demo counts.
These strings count active sub-agent sessions, but the Korean omits “세션,” making them read as agent counts.
Proposed fix
- 'orchPage.demo.networkSummary': '{peers}개 연결됨 · {sessions}개 활성 하위 에이전트',
+ 'orchPage.demo.networkSummary': '{peers}개 연결됨 · 활성 하위 에이전트 세션 {sessions}개',
...
- 'orchPage.demo.peerSessions': '하위 에이전트 {count}개',
+ 'orchPage.demo.peerSessions': '하위 에이전트 세션 {count}개',📝 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.
| 'orchPage.demo.networkSummary': '{peers}개 연결됨 · {sessions}개 활성 하위 에이전트', | |
| 'orchPage.demo.peer.connected': '연결됨', | |
| 'orchPage.demo.peer.connecting': '연결 중', | |
| 'orchPage.demo.peer.idle': '유휴', | |
| 'orchPage.demo.peerSessions': '하위 에이전트 {count}개', | |
| 'orchPage.demo.networkSummary': '{peers}개 연결됨 · 활성 하위 에이전트 세션 {sessions}개', | |
| 'orchPage.demo.peer.connected': '연결됨', | |
| 'orchPage.demo.peer.connecting': '연결 중', | |
| 'orchPage.demo.peer.idle': '유휴', | |
| 'orchPage.demo.peerSessions': '하위 에이전트 세션 {count}개', |
🤖 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/ko.ts` around lines 346 - 350, Update the Korean
translations for orchPage.demo.networkSummary and orchPage.demo.peerSessions to
explicitly include “세션” in the active sub-agent counts, while preserving the
existing placeholders and grammatical meaning.
| const { view, setView, nav } = usePageWelcomeView({ | ||
| ariaLabel: t('nav.alerts'), | ||
| welcomeLabel: t('notifications.welcome.nav'), | ||
| mainLabel: t('notifications.welcome.main'), | ||
| mainIconPath: | ||
| 'M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9', | ||
| }); | ||
|
|
||
| if (view === 'welcome') { | ||
| return ( | ||
| <> | ||
| {nav} | ||
| <PageWelcome | ||
| testId="notifications-welcome" | ||
| accent="amber" | ||
| icon="🔔" | ||
| eyebrow={t('notifications.welcome.eyebrow')} | ||
| title={t('notifications.welcome.title')} | ||
| description={t('notifications.welcome.body')} | ||
| ctas={[ | ||
| { | ||
| label: t('notifications.welcome.ctaView'), | ||
| icon: '🔔', | ||
| onClick: () => setView('main'), | ||
| testId: 'notifications-welcome-cta-view', | ||
| }, | ||
| ]} | ||
| featuresHeading={t('notifications.welcome.featsLabel')} | ||
| features={[ | ||
| { | ||
| icon: '🙋', | ||
| title: t('notifications.welcome.feat1Title'), | ||
| description: t('notifications.welcome.feat1Body'), | ||
| }, | ||
| { | ||
| icon: '📋', | ||
| title: t('notifications.welcome.feat2Title'), | ||
| description: t('notifications.welcome.feat2Body'), | ||
| }, | ||
| { | ||
| icon: '🗂️', | ||
| title: t('notifications.welcome.feat3Title'), | ||
| description: t('notifications.welcome.feat3Body'), | ||
| }, | ||
| ]} | ||
| /> | ||
| </> | ||
| ); | ||
| } |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
fd -i 'Notifications' -e ts -e tsx --full-path app/src/pages | xargs -I{} rg -n "welcome" {}Repository: tinyhumansai/openhuman
Length of output: 1111
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== Notifications test files ==\n'
fd -i 'Notifications' -e ts -e tsx --full-path app/src | sed -n '1,120p'
printf '\n== Welcome references in app/src/tests ==\n'
rg -n "view === 'welcome'|notifications-welcome|usePageWelcomeView|welcomeLabel: t\\('notifications\\.welcome" app/src --glob '*test.ts' --glob '*test.tsx' --glob '*spec.ts' --glob '*spec.tsx'
printf '\n== Notifications test file contents ==\n'
test_file="$(fd -i 'Notifications.test' -e ts -e tsx --full-path app/src | head -n 1 || true)"
if [ -n "${test_file}" ]; then
cat -n "$test_file"
fiRepository: tinyhumansai/openhuman
Length of output: 1908
Add coverage for the default welcome state. The page now lands on welcome, but the current page test starts at /?view=main, so this branch and its setView('main') CTA never run in test coverage.
🤖 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/pages/Notifications.tsx` around lines 106 - 154, Add test coverage
for the default `view === 'welcome'` branch in `Notifications`, rendering the
page without the `view=main` query parameter and asserting the welcome UI
appears. Also exercise the `notifications-welcome-cta-view` CTA and verify it
transitions to the main view.
Source: Coding guidelines
M3gA-Mind
left a comment
There was a problem hiding this comment.
PR #4851 — feat: welcome landings + standardized page headers across the app
Walkthrough
Large frontend-only UX pass: every sidebar page (Connections, Brain, Flows, Notifications, Rewards, Feedback, Agent World, Orchestration) now opens on a compact Welcome landing with the functional views one click / ?view=main away, and every functional view gets a standardized text-only PageSectionHeader. Three reusable primitives are introduced — PageWelcome, usePageWelcomeView, PageSectionHeader — and a large amount of relocated/retired surface is deleted (intelligence tabs, dev-workflow/model-health/webhooks/task-sources panels, ~19.8k deleted lines) with legacy slugs pointed at their new homes via redirects. Also folds in the gated Medulla orchestration overview + scale-showcase demo (user.hasMedullaAccess) and flips super_context_enabled to default-off in the Rust core.
Overall this is a clean, well-structured refactor. The risky part — the redirect/deep-link rewiring across dozens of routes — is internally consistent, and the substantive P2 findings from the Codex bot were already addressed by the author in earlier commits (verified against current HEAD). The remaining items below are minor/polish. The Rust change is small, correct, and fully test-updated. Verdict left as a comment (no blockers), per request — the human owns the merge decision.
Changes
| File | Summary |
|---|---|
src/openhuman/config/schema/context.rs + load/env_overlay.rs |
super_context_enabled now defaults false (opt-in via OPENHUMAN_SUPER_CONTEXT=1); docs/tests updated. |
app/src/components/layout/PageWelcome.tsx / PageSectionHeader.tsx / usePageWelcomeView.tsx |
New reusable welcome landing, standardized header, and ?view=-driven two-item nav. |
app/src/components/orchestration/** + lib/orchestration/useMedullaAccess.ts |
Medulla overview teaser + deterministic scale-showcase demo (graph/chat/network), gated on hasMedullaAccess. |
app/src/pages/{Skills,Brain,OrchestrationPage,Flows,Notifications,Feedback,Rewards}.tsx |
Wire welcome landing + per-tab headers; relocate settings panels onto Connections/Brain. |
app/src/AppRoutes.tsx + components/settings/settingsRouteElements.tsx + settingsRouteRegistry.ts |
Retire settings sections; redirect legacy slugs to Connections/Brain/Flows/Orchestration. |
app/src/components/intelligence/{memoryGraphLayout,MemoryGraph,PixiGraph,pixiGraphRenderer} |
Add optional, identity-default SimTuning for wide fan-out (used by the demo graph). |
app/src/lib/notificationRouter.ts |
Notifications fallback routes now target /notifications?view=main. |
app/src/lib/i18n/*.ts |
14-locale copy for all new welcome/header strings. |
| ~120 deleted files | Removed intelligence tabs, dev/diagnostics panels, webhooks/tunnels/task-sources UI + their tests. |
Actionable comments (3)
💡 Minor / suggestion
1. app/src/lib/notificationRouter.ts:66-68 (and 96-98) — explicit /notifications deep links skip the ?view=main normalization
The fallback path was updated to /notifications?view=main, but an explicit deep_link/deepLink of exactly /notifications (which the core triage pipeline can emit) is returned verbatim, landing on the new Welcome landing instead of the alerts feed. This is the same class of issue as the fallback fix, just on the explicit-link branch. Codex flagged this and it appears still open.
Suggested change:
// after isSafeInAppPath check, before returning the explicit link
const normalizeNotificationsRoot = (p: string): string =>
p === '/notifications' ? '/notifications?view=main' : p;
...
if (n.deep_link && isSafeInAppPath(n.deep_link)) {
return normalizeNotificationsRoot(n.deep_link);
}2. app/src/pages/Brain.tsx:309 — hardcoded English fallback bypasses i18n
t('sync.auditTitle', 'Sync History') uses an inline English fallback for a key that exists in no locale file (grep finds it nowhere in src/lib/i18n/). Because t returns the fallback when the key is absent, this string renders as English in all 14 locales — inconsistent with the PR's "full 14-locale i18n" goal and every other new string here. Add a real brain.header.*/sync.* key to en.ts and all locale files.
Suggested change:
// add `sync.auditTitle` (or brain.syncHistory) to en.ts + all locales, then:
{t('sync.auditTitle')}🧹 Nitpick
3. app/src/AppRoutes.tsx:103-104 — stale routing comment
The block comment says the bare /workflows slug "now redirect[s] here (to /flows)", but the route below renders <Activity /> (the installed-SKILL workflow hub) — only /routines redirects to /flows. This matches an earlier fix (0811379) that the comment wasn't updated for. Reword so /workflows = the SKILL hub, /routines = redirect to /flows.
Nitpicks (2)
app/src/lib/i18n/en.ts:150,153—agentWorld.welcome.eyebrow/body useTinyPlace, but the canonical UI brand (nav label,agentWorld.world.title) isTiny Place. Prefer the spaced form in visible copy for consistency (CodeRabbit raised the same onko.ts/es.ts).app/src/components/layout/PageWelcome.tsx:75—const tint = ACCENT_TILE[accent].split(' ')[0]re-indexes the record; reuse the localtile:const tint = tile.split(' ')[0];.
Questions for the author (1)
app/src/pages/OrchestrationPage.tsx— the default landing tab is nowmedulla(the Overview teaser), which rendersMedullaOverviewPanel— a "not shipped yet / coming soon" pitch — regardless ofhasMedullaAccess. For users who do have early access, defaulting them onto a coming-soon teaser (rather than the live agent chat) reads slightly off. Intended, or should access-holders default toagent/overview?
Verified / looks good
- Rust core:
super_context_enabledflip to default-off is correct and fully covered —load_tests.rs,context/manager_tests.rs, doc comments, and the env overlay all updated coherently. - Redirect wiring: every legacy settings slug now resolves to a live Connections/Brain/Orchestration tab that exists (
?tab=usage|wallet|screen-intelligence|desktop-agent|companion|composio-key|llm|meetings,/brain?tab=sync,/orchestration?tab=tasks) — cross-checked against the tab unions inSkills.tsx/Brain.tsx. - Deletions are clean: no dangling references to the ~120 removed modules (
DevWorkflowPanel,ModelHealthPanel,WebhooksDebugPanel,tunnelsApi,webhookstauri commands, intelligence tabs, …) remain inapp/src. SimTuningis backward-compatible — every field defaults to identity, so the Brain memory graph physics are unchanged; only the demo graph opts into wider fan-out.DEMO_TUNINGis a module-level const, so thePixiGrapheffect dep ontuningwon't thrash.UsagePanelnow preserveslocation.searchwhen switching hash tabs, so/connections?tab=usage#backgrounddeep links survive — matches the Codex fix thread.- Codex's earlier P2 findings (Flows welcome CTA chooser, Tasks-without-Medulla, memory-data/-debug reachability, LLM debug subroute hashes, rewards/notifications
?view=main) are all addressed in currentHEAD.
| @@ -13,7 +13,7 @@ const ROUTES = { | |||
| chat: '/chat', | |||
| skills: '/connections', | |||
| home: '/home', | |||
| notifications: '/notifications', | |||
| notifications: '/notifications?view=main', | |||
There was a problem hiding this comment.
Explicit /notifications deep links skip the ?view=main normalization.
This fallback route (and the resolveSystemRoute fallback) now target ?view=main, but the earlier explicit deep-link branches (return n.deep_link at ~L68, return item.deepLink at ~L98) return a bare /notifications verbatim when the core triage pipeline emits it — landing on the new Welcome landing instead of the alerts feed. Normalize the bare root in both explicit branches:
const normalizeNotificationsRoot = (p: string): string =>
p === '/notifications' ? '/notifications?view=main' : p;
// …
if (n.deep_link && isSafeInAppPath(n.deep_link)) return normalizeNotificationsRoot(n.deep_link);(Codex flagged this; appears still open.)
| the Sync tab is the single sync surface. */} | ||
| <div className={cardClass} data-testid="brain-sync-history"> | ||
| <h3 className="mb-2 text-sm font-medium text-content-secondary"> | ||
| {t('sync.auditTitle', 'Sync History')} |
There was a problem hiding this comment.
Hardcoded English fallback bypasses i18n.
t('sync.auditTitle', 'Sync History') uses an inline English fallback for a key that exists in no locale file — grep sync.auditTitle app/src/lib/i18n/* finds nothing. Since t returns the fallback when the key is missing, this renders as English in all 14 locales, inconsistent with the PR's full-i18n goal and every other new string here. Add a real key to en.ts + all locales and drop the fallback:
{t('sync.auditTitle')}| table needs no change. Full editing (B5b.2+) and the agent-proposal | ||
| surface (B4) are separate, later work. */} | ||
| Skill routes below (create/run); the bare `/workflows` and | ||
| `/routines` slugs now redirect here (to `/flows`) since Workflows is |
There was a problem hiding this comment.
Stale routing comment.
This comment says the bare /workflows slug "now redirect[s] here (to /flows)", but the route below renders <Activity /> (the installed-SKILL workflow hub) — only /routines redirects to /flows. Reword so /workflows = the SKILL hub and /routines = the /flows redirect. (CodeRabbit raised the same.)
| 'Tiny.Place is a social network for AI agents. Use OpenHuman to interact, find and post jobs, trade, and grow together.', | ||
| // Welcome landing (first destination) | ||
| 'agentWorld.welcome.nav': 'Welcome', | ||
| 'agentWorld.welcome.eyebrow': 'TinyPlace', |
There was a problem hiding this comment.
Nit: brand label inconsistency.
The eyebrow (and body copy on L153) use TinyPlace, but the canonical visible brand — the nav label (nav.agentWorld = Tiny Place) and agentWorld.world.title — is the spaced Tiny Place. Prefer the spaced form in user-facing welcome copy for consistency. (CodeRabbit raised the same on ko.ts/es.ts.)
| testId, | ||
| }: PageWelcomeProps) { | ||
| const tile = ACCENT_TILE[accent]; | ||
| const tint = ACCENT_TILE[accent].split(' ')[0]; // just the bg-*/15 tint |
There was a problem hiding this comment.
Nit: redundant record re-index.
ACCENT_TILE[accent] is already bound to tile on the line above; reuse it:
const tint = tile.split(' ')[0]; // just the bg-*/15 tint
Summary
PageWelcome(the landing) andusePageWelcomeView(aWelcome · <main>sidebar nav driven by?view=for single-view pages) — plusPageSectionHeader.user.hasMedullaAccess), included in this branch.pnpm i18n:check→ 0 missing / 0 extra).Problem
Inner pages dropped users straight into controls with no explanation of what the screen does or why it helps, and each page hand-rolled its header differently (varying title sizes, some with no header at all). The experience felt inconsistent and unwelcoming.
Solution
PageWelcomecomponent renders the friendly intro; pages render it as their default view and wire CTAs to switch into the functional views. Pages with existing sub-navs (Connections, Brain, Agent World) add aWelcomenav item; single-view pages useusePageWelcomeViewto project a two-item nav and drive?view=.PageSectionHeadergives every functional view the same title/description typography as the canonicalPanelHeader, so moving between screens feels like one app.?view=main, Agent World→welcome); unit + e2e specs were updated to target the functional views explicitly.PageHeroband +PanelPage.heroslot were removed as dead code.Submission Checklist
PageWelcome,PageSectionHeader,WelcomeSection, per-page "lands on Welcome" cases) to exercise the new branches; local unit suites green.docs/TEST-COVERAGE-MATRIX.md.Impact
Related
AI Authored PR Metadata (required for Codex/Linear PRs)
Linear Issue
Commit & Branch
Validation Run
pnpm --filter openhuman-app format:checkpnpm typecheckpnpm i18n:checkValidation Blocked
command:N/Aerror:N/Aimpact:N/ABehavior Changes
?view=main.https://claude.ai/code/session_01XfrjwurDKMbfrW6DP5YfhT
Summary by CodeRabbit
New Features
Updates