Skip to content

feat(home): early-bird banner + assistant→agent terminology#1113

Merged
senamakel merged 5 commits intotinyhumansai:mainfrom
senamakel:feat/may-3
May 3, 2026
Merged

feat(home): early-bird banner + assistant→agent terminology#1113
senamakel merged 5 commits intotinyhumansai:mainfrom
senamakel:feat/may-3

Conversation

@senamakel
Copy link
Copy Markdown
Member

@senamakel senamakel commented May 3, 2026

Summary

  • Add EarlyBirdyBanner to Home promoting the subscription discount
  • Rename user-facing "assistant" → "agent" across Conversations, Skills, Home, and setup modals for consistent terminology

Test plan

  • pnpm typecheck clean
  • pnpm lint clean
  • Open Home — Early Bird banner renders and dismisses correctly
  • Conversations / Skills / setup modals show "agent" wording everywhere

Summary by CodeRabbit

  • New Features

    • EarlyBirdy promotional banner: 60% discount, CTA to billing, optional dismiss control.
  • Improvements

    • Replaced “AI assistant” wording with “agent” across UI and previews.
    • Clarified Channels/Integrations descriptions and refined setup, error, and connection copy.
  • Tests

    • Added unit and integration tests covering the Home banners and banner dismissal behavior.

@senamakel senamakel requested a review from a team May 3, 2026 04:10
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 3, 2026

📝 Walkthrough

Walkthrough

Adds a new EarlyBirdyBanner component and integrates it into the Home page; updates user-facing copy to replace “AI assistant” with “agent” across several modals, a timeout message, and a config placeholder; updates and extends unit tests for banners and Home behavior.

Changes

Early-bird Banner + Rebranding

Layer / File(s) Summary
New Component
app/src/components/home/HomeBanners.tsx
Adds exported EarlyBirdyBanner({ onDismiss? }) that renders a discount headline, EARLYBIRDY code badge, CTA opening BILLING_DASHBOARD_URL via openUrl, and an optional dismiss (✕) button calling onDismiss.
Home Page Wiring
app/src/pages/Home.tsx
Imports EarlyBirdyBanner, adds local showEarlyBirdy state from shouldShowBanner('home-earlybirdy', Number.MAX_SAFE_INTEGER), renders the banner before DiscordBanner, and calls dismissBanner('home-earlybirdy') on dismiss; also updates socket status copy to “Message your agent…”.
Copy Updates (Skills / Modals / Pages / Config)
app/src/components/skills/ScreenIntelligenceSetupModal.tsx, app/src/components/skills/VoiceSetupModal.tsx, app/src/pages/Conversations.tsx, app/src/pages/Skills.tsx, app/src/utils/tauriCommands/config.ts
Replaces occurrences of “AI assistant” with “agent” (Screen Intelligence/Voice modal messages, conversations silence-timeout error string, config AIPreview.soul.description) and updates Skills page copy in Channels/Integrations; adds text-center styling to Voice success paragraph.
Tests
app/src/components/home/__tests__/HomeBanners.test.tsx, app/src/pages/__tests__/Home.test.tsx
Expands HomeBanners tests to cover EarlyBirdyBanner rendering, CTA openUrl(BILLING_DASHBOARD_URL), and conditional dismiss behavior; updates Home tests with mocks and adds integration tests for banner visibility and dismissal.

Estimated Code Review Effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly Related PRs

Poem

🐰 I hopped in quick with a cheerful cheer,
“EARLYBIRDY” offered to those who hear.
I nudged each modal to call you an agent,
Banners and tests—my ears are adjacent.
Click the CTA, but mind the dismiss—tiny rabbit bliss!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the two main changes: adding an early-bird banner component to the home page and updating terminology from 'assistant' to 'agent' throughout the codebase.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Review rate limit: 4/5 reviews remaining, refill in 12 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/src/components/home/HomeBanners.tsx`:
- Around line 102-107: In the HomeBanners component fix the promo sentence typo
by replacing the fragment "to on your" in the JSX (the string surrounding the
discount span/button in HomeBanners.tsx) with the correct phrasing — e.g., "on
your" (or "to use on your" if you prefer) so the sentence reads properly around
the EARLYBIRDY span and the following button. Ensure only the text node is
changed and JSX spacing remains intact.
- Around line 90-120: EarlyBirdyBanner currently has no way to be dismissed; add
a dismissal prop and UI and wire it from the Home page: update EarlyBirdyBanner
to accept an optional onDismiss: () => void prop, render a small accessible
dismiss control (e.g., an X button in the banner header) that calls onDismiss()
when clicked, and export/use that prop in app/src/pages/Home.tsx by wrapping the
banner with the existing helpers: only render EarlyBirdyBanner when
shouldShowBanner('home-earlybirdy') is true and pass onDismiss={() =>
dismissBanner('home-earlybirdy')} so the banner state is cleared when the close
control is pressed.
🪄 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: 454f18d1-b2c4-4874-9276-41333171472d

📥 Commits

Reviewing files that changed from the base of the PR and between 67410d5 and 0ff46e1.

⛔ Files ignored due to path filters (1)
  • app/src-tauri/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (7)
  • app/src/components/home/HomeBanners.tsx
  • app/src/components/skills/ScreenIntelligenceSetupModal.tsx
  • app/src/components/skills/VoiceSetupModal.tsx
  • app/src/pages/Conversations.tsx
  • app/src/pages/Home.tsx
  • app/src/pages/Skills.tsx
  • app/src/utils/tauriCommands/config.ts

Comment thread app/src/components/home/HomeBanners.tsx Outdated
Comment thread app/src/components/home/HomeBanners.tsx
… tests

Addresses @coderabbitai review comments on PR tinyhumansai#1113:
- EarlyBirdyBanner now accepts optional onDismiss prop; renders an accessible
  ✕ button (aria-label="Dismiss early bird banner") when provided
- Home.tsx wires the banner with shouldShowBanner/dismissBanner from
  upsellDismissState (cooldown = Number.MAX_SAFE_INTEGER → dismissed forever)
- Typo "to on your" was already resolved in the working tree; no separate fix needed

Tests (addresses ≥80% changed-line coverage gate):
- HomeBanners.test.tsx: 6 new EarlyBirdyBanner cases (render, subscription link,
  no dismiss button without prop, dismiss button present with prop, dismiss callback,
  openUrl not called on dismiss); 2 new UsageLimitBanner/danger-tone cases
- Home.test.tsx: 5 new resolveHomeUserName edge cases + 3 EarlyBirdy integration
  tests (shouldShowBanner=true shows banner, =false hides it, dismiss button
  calls dismissBanner and hides banner)

Changed-line coverage: 90% (11 lines measured, 1 missing — VoiceSetupModal line 199
in a complex modal render path; overall gate threshold is 80%)
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
app/src/components/home/HomeBanners.tsx (1)

90-90: ⚡ Quick win

Use a props interface for EarlyBirdyBanner instead of an inline object type.

This keeps the new component aligned with the TypeScript object-shape convention and makes future prop growth cleaner.

♻️ Proposed refactor
+interface EarlyBirdyBannerProps {
+  onDismiss?: () => void;
+}
+
-export function EarlyBirdyBanner({ onDismiss }: { onDismiss?: () => void }) {
+export function EarlyBirdyBanner({ onDismiss }: EarlyBirdyBannerProps) {

As per coding guidelines, "**/*.{ts,tsx}: Prefer interface for defining object shapes in TypeScript".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/components/home/HomeBanners.tsx` at line 90, The EarlyBirdyBanner
component currently uses an inline prop type ({ onDismiss?: () => void });
change this to a named interface (e.g., EarlyBirdyBannerProps) and update the
component signature to use that interface (export function
EarlyBirdyBanner(props: EarlyBirdyBannerProps) or destructure as ({ onDismiss }:
EarlyBirdyBannerProps)); ensure the interface is exported if needed and update
any usages or tests referencing the component signature to use the new type
name.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@app/src/components/home/HomeBanners.tsx`:
- Line 90: The EarlyBirdyBanner component currently uses an inline prop type ({
onDismiss?: () => void }); change this to a named interface (e.g.,
EarlyBirdyBannerProps) and update the component signature to use that interface
(export function EarlyBirdyBanner(props: EarlyBirdyBannerProps) or destructure
as ({ onDismiss }: EarlyBirdyBannerProps)); ensure the interface is exported if
needed and update any usages or tests referencing the component signature to use
the new type name.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8f7c46c3-871d-4923-ab0f-e31d9bfbfa28

📥 Commits

Reviewing files that changed from the base of the PR and between 0ff46e1 and 477270e.

📒 Files selected for processing (4)
  • app/src/components/home/HomeBanners.tsx
  • app/src/components/home/__tests__/HomeBanners.test.tsx
  • app/src/pages/Home.tsx
  • app/src/pages/__tests__/Home.test.tsx

@senamakel senamakel merged commit df6c0a9 into tinyhumansai:main May 3, 2026
17 of 19 checks passed
jwalin-shah added a commit to jwalin-shah/openhuman that referenced this pull request May 5, 2026
* feat(remotion): Ghosty character library with transparent MOV variants (tinyhumansai#1059)

Co-authored-by: WOZCODE <contact@withwoz.com>

* feat(composio/gmail): sync into memory tree (Slack-parity) (tinyhumansai#1056)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(scheduler-gate): throttle background AI on battery / busy CPU (tinyhumansai#1062)

* fix(core,cef): run core in-process and stop orphaning CEF helpers on Cmd+Q (tinyhumansai#1061)

* ci: add dedicated staging release workflow (tinyhumansai#1066)

* fix(sentry): Rust source context + per-release deploy marker (tinyhumansai#405) (tinyhumansai#1067)

* fix(welcome): re-enable OAuth buttons with focus/timeout recovery (tinyhumansai#1049) (tinyhumansai#1069)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(dependencies): update pnpm-lock.yaml and Cargo.lock for package… (tinyhumansai#1082)

* fix(onboarding): personalize welcome agent greeting with user identity (tinyhumansai#1078)

* fix(chat): make agent message bubbles fit content width (tinyhumansai#1083)

* Feat/dmg checks (tinyhumansai#1084)

* fix(linux): Add X11 platform flags to .deb package launcher (tinyhumansai#1087)

Co-authored-by: unn-Known1 <unn-known1@users.noreply.github.com>

* fix(sentry): auto-send React events; collapse core→tauri for desktop (tinyhumansai#1086)

Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>

* fix(cef): run blank reload guard on the CEF UI thread (tinyhumansai#1092)

* fix(app): reload webview instead of restart_app in dev mode (tinyhumansai#1068) (tinyhumansai#1071)

* fix(linux): deliver X11 ozone flags via custom .desktop template (tinyhumansai#1091)

* fix(webview-accounts): retry data-dir purge so CEF handle race doesn't leak cookies (tinyhumansai#1076) (tinyhumansai#1081)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>

* fix(webview/slack): media perms + deep-link isolation (tinyhumansai#1074) (tinyhumansai#1080)

Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>

* ci(release): split staging vs production workflows; promote staging tags (tinyhumansai#1094)

* Update release-staging.yml (tinyhumansai#1097)

* chore(staging): v0.53.5

* chore(staging): v0.53.6

* ci(staging): cut staging from main; add act local-debug helper (tinyhumansai#1099)

* chore(staging): v0.53.7

* fix(ci): correct sentry-cli download URL and trap scope (tinyhumansai#1100)

* chore(staging): v0.53.8

* feat(chat): forward thread_id to backend for KV cache locality (tinyhumansai#1095)

* fix(ci): bump pinned sentry-cli to 3.4.1 (2.34.2 was never published) (tinyhumansai#1102)

* chore(staging): v0.53.9

* fix(ci): drop bash trap in upload_sentry_symbols.sh; inline cleanup (tinyhumansai#1103)

* chore(staging): v0.53.10

* refactor(session): flatten session_raw/, switch md to YYYY_MM_DD (tinyhumansai#1098)

* Add full Composio managed-auth toolkit catalog (tinyhumansai#1093)

* ci: add diff-aware 80% coverage gate (Vitest + cargo-llvm-cov) (tinyhumansai#1104)

* feat(scripts): pnpm work + pnpm debug for agent-driven workflows (tinyhumansai#1105)

* ci: pull pnpm into CI image, drop redundant setup steps (tinyhumansai#1107)

* docs: add Cursor Cloud specific instructions to AGENTS.md (tinyhumansai#1106)

Co-authored-by: Cursor Agent <cursoragent@cursor.com>

* chore(staging): v0.53.11

* docs: surface 80% coverage gate and scripts/debug runners (tinyhumansai#1108)

* feat(app): show Composio integrations as sorted icon grid on Skills (tinyhumansai#1109)

Co-authored-by: Cursor Agent <cursoragent@cursor.com>

* feat(composio): client-side trigger enable/disable toggles (tinyhumansai#1110)

* feat(skills): channels grid + integrations card polish; tolerant Composio trigger decode (tinyhumansai#1112)

* chore(staging): v0.53.12

* feat(home): early-bird banner + assistant→agent terminology (tinyhumansai#1113)

* feat(updater): in-app auto-update with auto-download + restart prompt (tinyhumansai#677) (tinyhumansai#1114)

* chore(claude): add ship-and-babysit slash command (tinyhumansai#1115)

* feat(home): EarlyBirdyBanner + agent terminology + LinkedIn enrichment model pin (tinyhumansai#1118)

* fix(chat): single onboarding thread in sidebar after wizard (tinyhumansai#1116)

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Steven Enamakel <senamakel@users.noreply.github.com>

* fix: filter out global namespace from citation chips (tinyhumansai#1124)

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: senamakel-droid <281415773+senamakel-droid@users.noreply.github.com>

* feat(nav): enable Memory tab in BottomTabBar (tinyhumansai#1125)

* feat(memory): singleton ingestion + status RPC + UI pill (tinyhumansai#1126)

* feat(human): mascot tab with viseme-driven lipsync (staging only) (tinyhumansai#1127)

* Fix CEF zombie processes on full app close and restart (tinyhumansai#1128)

Co-authored-by: senamakel-droid <281415773+senamakel-droid@users.noreply.github.com>
Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>

* Update issue templates for GitHub issue types (tinyhumansai#1146)

* feat(human): expand mascot expressions and tighten reply-speech state machine (tinyhumansai#1147)

* feat(memory): ingestion pipeline + tree-architecture docs + ops/schemas split (tinyhumansai#1142)

* feat(threads): surface live subagent work in parent thread (tinyhumansai#1122) (tinyhumansai#1159)

* fix(human): keep mascot mouth animating when TTS ships no viseme data (tinyhumansai#1160)

* feat(composio): consume backend markdownFormatted for LLM output (tinyhumansai#1165)

* fix(subagent): lazy-register toolkit actions filtered out of fuzzy top-K (tinyhumansai#1162)

* feat(memory): user-facing long-term memory window preset (tinyhumansai#1137) (tinyhumansai#1161)

* fix(tauri-shell): proactively kill stale openhuman RPC on startup (tinyhumansai#1166)

* chore(staging): v0.53.13

* fix(composio): per-action tool consumes backend markdownFormatted (tinyhumansai#1167)

* fix(threads): persist selectedThreadId across reloads (tinyhumansai#1168)

* feat(memory_tree): switch embed model to bge-m3 (1024-dim, 8K context) (tinyhumansai#1174)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(agent): drop redundant [Memory context] recall injection (tinyhumansai#1173)

* chore(memory_tree): drop body-read timeouts on Ollama HTTP calls (tinyhumansai#1171)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(transcript): emit thread_id + fix orchestrator missing cost (tinyhumansai#1169)

* fix(composio/gmail): phase out html2md, prefer text/plain MIME part (tinyhumansai#1170)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(tools): markdown output for internal tool results (tinyhumansai#1172)

* feat(security): enforce prompt-injection guard before model and tool execution (tinyhumansai#1175)

* fix(cef): popup paint dies after first frame — skip blank-page guard for popups (tinyhumansai#1079) (tinyhumansai#1182)

Co-authored-by: Steven Enamakel <31011319+senamakel@users.noreply.github.com>

* chore(sentry): rename OPENHUMAN_SENTRY_DSN → OPENHUMAN_CORE_SENTRY_DSN (tinyhumansai#1186)

* feat(remotion): add yellow mascot character with all animation variants (tinyhumansai#1193)

Co-authored-by: Neel Mistry <neelmistry@Neels-MacBook-Pro.local>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor(composio): hide raw connection ID, derive friendly label (tinyhumansai#1153) (tinyhumansai#1185)

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>

* fix(windows): align install.ps1 MSI with per-machine scope (tinyhumansai#913) (tinyhumansai#1187)

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(tauri): deterministic CEF teardown on full app close (tinyhumansai#1120) (tinyhumansai#1189)

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(composio): cap Gmail HTML body before strip (crash mitigation) (tinyhumansai#1191)

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(auth): stop stale chat threads after signup (tinyhumansai#1192)

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(sentry): staging-only "Trigger Sentry Test" button (tinyhumansai#1072) (tinyhumansai#1183)

* chore(staging): v0.53.14

* chore(staging): v0.53.15

* feat(composio): format trigger slugs into human-readable labels (tinyhumansai#1129) (tinyhumansai#1179)

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>

* fix(ui): hide unsupported permission UI on non-macOS for Screen Intelligence (tinyhumansai#1194)

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore(tauri-shell): retire embedded Gmail webview-account flow (tinyhumansai#1181)

* feat(onboarding): replace welcome-agent bot with react-joyride walkthrough (tinyhumansai#1180)

* chore(release): v0.53.16

* fix(threads): preserve selectedThreadId on cold-boot identity hydration (tinyhumansai#1196)

* feat(core): version/shutdown/update RPCs + mid-thread integration refresh (tinyhumansai#1195)

* fix(mascot): swap to yellow mascot via @remotion/player (tinyhumansai#1200)

* feat(memory_tree): cloud-default LLM, queue priority, entity filter, Memory tab UI (tinyhumansai#1198)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Persist turn state + restore conversation history on cold-boot (tinyhumansai#1202)

* feat(mascot): floating desktop mascot via native NSPanel + WKWebView (macOS) (tinyhumansai#1203)

* fix(memory/tree): emit summary children as Obsidian wikilinks (tinyhumansai#1210)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(tools): coding-harness baseline primitives (tinyhumansai#1205) (tinyhumansai#1208)

* docs: add Codex PR checklist for remote agents

---------

Co-authored-by: Steven Enamakel <31011319+senamakel@users.noreply.github.com>
Co-authored-by: WOZCODE <contact@withwoz.com>
Co-authored-by: sanil-23 <sanil@vezures.xyz>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Cyrus Gray <144336577+graycyrus@users.noreply.github.com>
Co-authored-by: CodeGhost21 <164498022+CodeGhost21@users.noreply.github.com>
Co-authored-by: oxoxDev <164490987+oxoxDev@users.noreply.github.com>
Co-authored-by: Mega Mind <146339422+M3gA-Mind@users.noreply.github.com>
Co-authored-by: Gaurang Patel <ptelgm.yt@gmail.com>
Co-authored-by: unn-Known1 <unn-known1@users.noreply.github.com>
Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Steven Enamakel <senamakel@users.noreply.github.com>
Co-authored-by: Steven Enamakel's Droid <enamakel.agent@tinyhumans.ai>
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: senamakel-droid <281415773+senamakel-droid@users.noreply.github.com>
Co-authored-by: YellowSnnowmann <167776381+YellowSnnowmann@users.noreply.github.com>
Co-authored-by: Neil <neil@maha.xyz>
Co-authored-by: Neel Mistry <neelmistry@Neels-MacBook-Pro.local>
Co-authored-by: obchain <167975049+obchain@users.noreply.github.com>
Co-authored-by: Jwalin Shah <jshah1331@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant