Skip to content

fix(frontend): AutoPilot notification follow-ups — branding, UX, persistence, and cross-tab sync - #12428

Merged
kcze merged 17 commits into
devfrom
kpczerwinski/secrt-2124-autopilot-notifications-follow-up
Apr 3, 2026
Merged

fix(frontend): AutoPilot notification follow-ups — branding, UX, persistence, and cross-tab sync#12428
kcze merged 17 commits into
devfrom
kpczerwinski/secrt-2124-autopilot-notifications-follow-up

Conversation

@kcze

@kcze kcze commented Mar 16, 2026

Copy link
Copy Markdown
Contributor

AutoPilot (copilot) notifications had several follow-up issues after initial implementation: old "Otto" branding, UX quirks, a service-worker crash, notification state that didn't persist or sync across tabs, a broken notification sound, and noisy Sentry alerts from SSR.

Changes 🏗️

  • Rename "Otto" → "AutoPilot" in all notification surfaces: browser notifications, document title badge, permission dialog copy, and notification banner copy
  • Agent Activity icon: changed from Bell to Pulse (Phosphor) in the navbar dropdown
  • Centered dialog buttons: the "Stay in the loop" permission dialog buttons are now centered instead of right-aligned
  • Service worker notification fix: wrapped new Notification() in try-catch so it degrades gracefully in service worker / PWA contexts instead of throwing TypeError: Illegal constructor
  • Persist notification state: completedSessionIDs is now stored in localStorage (copilot-completed-sessions) so it survives page refreshes and new tabs
  • Cross-tab sync: a storage event listener keeps completedSessionIDs and document.title in sync across all open tabs — clearing a notification in one tab clears it everywhere
  • Fix notification sound: corrected the sound file path from /sounds/notification.mp3 to /notification.mp3 and added a .gitignore exception (root .gitignore has a blanket *.mp3 ignore rule from legacy AutoGPT agent days)
  • Fix SSR Sentry noise: guarded the Copilot Zustand store initialization with a client-side check so storage.get() is never called during SSR, eliminating spurious Sentry alerts (BUILDER-7CB, 7CC, 7C7) while keeping the Sentry reporting in local-storage.ts intact for genuinely unexpected SSR access

Checklist 📋

For code changes:

  • I have clearly listed my changes in the PR description
  • I have made a test plan
  • I have tested my changes according to the test plan:
    • Verify "AutoPilot" appears (not "Otto") in browser notification, document title, permission dialog, and banner
    • Verify Pulse icon in navbar Agent Activity dropdown
    • Verify "Stay in the loop" dialog buttons are centered
    • Open two tabs on copilot → trigger completion → both tabs show badge/checkmark
    • Click completed session in tab 1 → badge clears in both tabs
    • Refresh a tab → completed session state is preserved
    • Verify notification sound plays on completion
    • Verify no Sentry alerts from SSR localStorage access

…istence, and cross-tab sync

- Rename "Otto" to "AutoPilot" in all notification surfaces (browser notifications, document title, dialog, banner)
- Change Agent Activity icon from Bell to Pulse (Phosphor)
- Center buttons in the "Stay in the loop" notification permission dialog
- Fix browser notification constructor for service worker / PWA contexts by using ServiceWorkerRegistration.showNotification() with fallback
- Persist completedSessionIDs to localStorage so notification state survives page refresh
- Sync completedSessionIDs across tabs via storage events so clearing in one tab updates all others

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@kcze
kcze requested a review from a team as a code owner March 16, 2026 02:24
@kcze
kcze requested review from Bentlybro and Swiftyos and removed request for a team March 16, 2026 02:24
@github-project-automation github-project-automation Bot moved this to 🆕 Needs initial review in AutoGPT development kanban Mar 16, 2026
@github-actions github-actions Bot added the platform/frontend AutoGPT Platform - Front end label Mar 16, 2026
@github-actions

github-actions Bot commented Mar 16, 2026

Copy link
Copy Markdown
Contributor

🔍 PR Overlap Detection

This check compares your PR against all other open PRs targeting the same branch to detect potential merge conflicts early.

🟢 Low Risk — File Overlap Only

These PRs touch the same files but different sections (click to expand)

Summary: 0 conflict(s), 0 medium risk, 5 low risk (out of 5 PRs with file overlap)


Auto-generated on push. Ignores: openapi.json, lock files.

@coderabbitai

coderabbitai Bot commented Mar 16, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Renames UI text from "Otto" to "AutoPilot", persists completed Copilot session IDs to localStorage with cross-tab synchronization, centralizes browser notification handling (including audio preloading), updates document.title to include completed-session counts, and swaps an icon and minor dialog footer styling.

Changes

Cohort / File(s) Summary
UI Text & Dialog
autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx, autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx, autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
Replaced "Otto" with "AutoPilot" in titles/messages; NotificationDialog.Footer now uses a className for centered footer alignment.
Copilot Store & Persistence
autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
Added loadCompletedSessions() and persistCompletedSessions() helpers; initialize completedSessionIDs from storage; persist on add/clear operations; clear storage on full reset; guard storage access with isClient.
Notifications & Sync
autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
Introduced showBrowserNotification wrapper, changed notification sound path, preloaded audio, centralized Notification handling, updated document.title formatting to show completed-session counts with "AutoPilot", and added localStorage-based cross-tab sync for completed-session IDs (storage event listener).
Storage Key
autogpt_platform/frontend/src/services/storage/local-storage.ts
Added enum member COPILOT_COMPLETED_SESSIONS = "copilot-completed-sessions".
Icon
autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
Replaced Bell icon with Pulse icon in imports and JSX.
Public Asset & Gitignore
.gitignore, autogpt_platform/frontend/public/notification.mp3
Allowed tracking of notification.mp3 by negating the global *.mp3 ignore; sound file path updated accordingly.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant UI as "UI Components"
    participant Store as "Copilot Store"
    participant Storage as "localStorage"
    participant Notif as "Browser Notification"

    User->>UI: completes session
    UI->>Store: addCompletedSession(sessionId)
    Store->>Storage: persist COPILOT_COMPLETED_SESSIONS
    Storage-->>Store: persist ack
    Store-->>UI: state updated
    UI->>Notif: showBrowserNotification("AutoPilot is ready", ...)
    Notif->>User: notification shown
    User->>Notif: click notification
    Notif->>UI: navigate / focus session

    rect rgba(100,150,200,0.5)
    Storage->>Other: 'storage' event (COPILOT_COMPLETED_SESSIONS)
    Other->>Store: loadCompletedSessions()
    Store->>UI: update completedSessionIDs
    UI->>UI: update document.title with count
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • 0ubbe
  • Bentlybro
  • Abhi1992002

Poem

🐰 I hopped from Otto to AutoPilot with cheer,
Saved sessions that scurry from tab to tab near,
Chimes and titles now count every feat,
Icons and dialogs look spry and neat,
Hooray — synced carrots for every engineer!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 18.18% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title directly relates to the main changes: renaming Otto to AutoPilot, fixing notifications, persistence, and cross-tab synchronization in the frontend.
Description check ✅ Passed The PR description is well-detailed and directly related to the changeset, covering branding updates, UX improvements, persistence, cross-tab sync, and SSR fixes.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch kpczerwinski/secrt-2124-autopilot-notifications-follow-up

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@kcze
kcze requested review from 0ubbe and Abhi1992002 and removed request for Swiftyos March 16, 2026 02:26

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
autogpt_platform/frontend/src/app/(platform)/copilot/store.ts (1)

9-17: Consider validating parsed data is an array.

If localStorage data is corrupted or tampered with, JSON.parse(raw) might return a non-array value. Passing a non-iterable (like a number) to new Set() would throw.

🛡️ Defensive fix
 function loadCompletedSessions(): Set<string> {
   const raw = storage.get(Key.COPILOT_COMPLETED_SESSIONS);
   if (!raw) return new Set();
   try {
-    return new Set(JSON.parse(raw));
+    const parsed = JSON.parse(raw);
+    return Array.isArray(parsed) ? new Set(parsed) : new Set();
   } catch {
     return new Set();
   }
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/frontend/src/app/`(platform)/copilot/store.ts around lines 9
- 17, The loadCompletedSessions function may pass a non-iterable result from
JSON.parse(raw) into new Set(), causing a crash if stored data is corrupted;
modify loadCompletedSessions to parse raw, verify Array.isArray(parsed) (and
optionally filter entries to strings) before constructing and returning new
Set(parsed), and fall back to new Set() if the parsed value is not an array or
parsing fails (still preserving the outer try/catch behavior); reference the
storage key Key.COPILOT_COMPLETED_SESSIONS and the function name
loadCompletedSessions when applying the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@autogpt_platform/frontend/src/app/`(platform)/copilot/useCopilotNotifications.ts:
- Around line 21-28: The SW path using
ServiceWorkerRegistration.showNotification lacks click-handling so notifications
won't navigate to sessions; update the code to always attach session info to the
notification and either (A) remove the SW-specific branch and always call
createFallbackNotification so onclick logic runs in-window, or (B) keep the SW
path but ensure any service worker includes a notificationclick listener that
reads event.notification.data.sessionID and uses
clients.matchAll/clients.openWindow to focus or open the URL for that session;
specifically add the data payload when calling showNotification in
useCopilotNotifications and implement the notificationclick handler in the
service worker to navigate to `/copilot/sessions/{sessionID}` (use
createFallbackNotification's session URL format) and call
event.notification.close(), using clients.matchAll({type:"window"}) and
client.focus() / clients.openWindow as needed.

---

Nitpick comments:
In `@autogpt_platform/frontend/src/app/`(platform)/copilot/store.ts:
- Around line 9-17: The loadCompletedSessions function may pass a non-iterable
result from JSON.parse(raw) into new Set(), causing a crash if stored data is
corrupted; modify loadCompletedSessions to parse raw, verify
Array.isArray(parsed) (and optionally filter entries to strings) before
constructing and returning new Set(parsed), and fall back to new Set() if the
parsed value is not an array or parsing fails (still preserving the outer
try/catch behavior); reference the storage key Key.COPILOT_COMPLETED_SESSIONS
and the function name loadCompletedSessions when applying the change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 46455b85-2c05-4896-b684-6d02893a68e5

📥 Commits

Reviewing files that changed from the base of the PR and between d9c16de and 883e08c.

📒 Files selected for processing (7)
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
  • autogpt_platform/frontend/src/services/storage/local-storage.ts
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: types
  • GitHub Check: Seer Code Review
  • GitHub Check: end-to-end tests
  • GitHub Check: Check PR Status
🧰 Additional context used
📓 Path-based instructions (15)
autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}: Use Node.js 21+ with pnpm package manager for frontend development
Always run 'pnpm format' for formatting and linting code in frontend development

autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}: Run pnpm format to auto-fix formatting issues before completing work
Run pnpm lint to check for lint errors and fix any that appear before completing work

Files:

  • autogpt_platform/frontend/src/services/storage/local-storage.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/**/*.{tsx,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{tsx,ts}: Use function declarations for components and handlers (not arrow functions) in React components
Only use arrow functions for small inline lambdas (map, filter, etc.) in React components
Use PascalCase for component names and camelCase with 'use' prefix for hook names in React
Use Tailwind CSS utilities only for styling in frontend components
Use design system components from 'src/components/' (atoms, molecules, organisms) in frontend development
Never use 'src/components/legacy/' in frontend code
Only use Phosphor Icons (@phosphor-icons/react) for icons in frontend components
Use generated API hooks from '@/app/api/generated/endpoints/' instead of deprecated 'BackendAPI' or 'src/lib/autogpt-server-api/
'
Use React Query for server state (via generated hooks) in frontend development
Default to client components ('use client') in Next.js; only use server components for SEO or extreme TTFB needs
Use '' component for rendering errors in frontend UI; use toast notifications for mutation errors; use 'Sentry.captureException()' for manual exceptions
Separate render logic from data/behavior in React components; keep comments minimal (code should be self-documenting)

Files:

  • autogpt_platform/frontend/src/services/storage/local-storage.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/**/*.{ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{ts,tsx}: No barrel files or 'index.ts' re-exports in frontend code
Regenerate API hooks with 'pnpm generate:api' after backend OpenAPI spec changes in frontend development

Run pnpm types to check for type errors and fix any that appear before completing work

Files:

  • autogpt_platform/frontend/src/services/storage/local-storage.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

autogpt_platform/frontend/**/*.{js,jsx,ts,tsx}: Format frontend code using pnpm format
Never use components from src/components/__legacy__/*

Files:

  • autogpt_platform/frontend/src/services/storage/local-storage.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

autogpt_platform/frontend/src/**/*.{ts,tsx}: Structure components as ComponentName/ComponentName.tsx + useComponentName.ts + helpers.ts and use design system components from src/components/ (atoms, molecules, organisms)
Use generated API hooks from @/app/api/__generated__/endpoints/ with pattern use{Method}{Version}{OperationName} and regenerate with pnpm generate:api
Use function declarations (not arrow functions) for components and handlers
Separate render logic from business logic with component.tsx + useComponent.ts + helpers.ts structure
Colocate state when possible, avoid creating large components, use sub-components in local /components folder
Avoid large hooks, abstract logic into helpers.ts files when sensible
Use arrow functions only for callbacks, not for component declarations
Avoid comments at all times unless the code is very complex
Do not use useCallback or useMemo unless asked to optimize a given function

autogpt_platform/frontend/src/**/*.{ts,tsx}: Use function declarations (not arrow functions) for components and handlers
Use type-safe generated API hooks via Orval + React Query for data fetching
Use React Query for server state management and co-locate UI state in components/hooks
Separate render logic (.tsx) from business logic (use*.ts hooks)
Use only shadcn/ui (Radix UI primitives) with Tailwind CSS for UI components
Use Phosphor Icons only for all icon implementations
Use ErrorCard component for render errors, toast for mutations, and Sentry for exceptions
Use design system components from src/components/ (atoms, molecules, organisms)
Never use src/components/__legacy__/* components
Use generated API hooks from @/app/api/__generated__/endpoints/ with pattern use{Method}{Version}{OperationName}
Use Tailwind CSS only for styling with design tokens
Do not use useCallback or useMemo unless asked to optimize a specific function
Never type with any unless a variable/attribute can actually be of any type

Files:

  • autogpt_platform/frontend/src/services/storage/local-storage.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/**/*.{js,jsx,ts,tsx,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Tailwind CSS only for styling, use design tokens, and use Phosphor Icons only

Files:

  • autogpt_platform/frontend/src/services/storage/local-storage.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/src/**/*.ts

📄 CodeRabbit inference engine (AGENTS.md)

Do not type hook returns, let Typescript infer as much as possible

Files:

  • autogpt_platform/frontend/src/services/storage/local-storage.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Never type with any, if no types available use unknown

Files:

  • autogpt_platform/frontend/src/services/storage/local-storage.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/src/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

Fully capitalize acronyms in symbols, e.g. graphID, useBackendAPI

Files:

  • autogpt_platform/frontend/src/services/storage/local-storage.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/src/**/*.tsx

📄 CodeRabbit inference engine (AGENTS.md)

Component props should be interface Props { ... } (not exported) unless the interface needs to be used outside the component

Use type Props = { ... } (not exported) for component props unless used outside the component

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
autogpt_platform/frontend/src/app/(platform)/**/*.tsx

📄 CodeRabbit inference engine (AGENTS.md)

If adding protected frontend routes, update frontend/lib/supabase/middleware.ts

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
autogpt_platform/frontend/src/**/components/**/*.{ts,tsx}

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

Put sub-components in a local components/ folder within the feature directory

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
autogpt_platform/frontend/src/**/[A-Z]*/**/*.{ts,tsx}

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

Structure components as ComponentName/ComponentName.tsx + useComponentName.ts + helpers.ts

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
autogpt_platform/frontend/src/components/**/*.{tsx,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Structure React components as: ComponentName/ComponentName.tsx + useComponentName.ts + helpers.ts (exception: small 3-4 line components can be inline; render-only components can be direct files)

Files:

  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
autogpt_platform/frontend/src/**/use*.ts

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

autogpt_platform/frontend/src/**/use*.ts: Extract component logic into custom hooks grouped by concern, with each hook in its own .ts file
Do not type hook returns; let TypeScript infer types as much as possible

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
🧠 Learnings (9)
📓 Common learnings
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12356
File: autogpt_platform/backend/backend/copilot/constants.py:9-12
Timestamp: 2026-03-10T08:39:13.707Z
Learning: In Significant-Gravitas/AutoGPT PR `#12356`, the `COPILOT_SYNTHETIC_ID_PREFIX = "copilot-"` check in `create_auto_approval_record` (human_review.py) is intentional and safe. The `graph_exec_id` passed to this function comes from server-side `PendingHumanReview` DB records (not from user input); the API only accepts `node_exec_id` from users. Synthetic `copilot-*` IDs are only ever created server-side in `run_block.py`. The prefix skip avoids a DB lookup for a `AgentGraphExecution` record that legitimately does not exist for CoPilot sessions, while `user_id` scoping is enforced at the auth layer and on the resulting auto-approval record.
📚 Learning: 2026-02-26T10:12:58.845Z
Learnt from: 0ubbe
Repo: Significant-Gravitas/AutoGPT PR: 12207
File: autogpt_platform/frontend/src/components/ai-elements/conversation.tsx:0-0
Timestamp: 2026-02-26T10:12:58.845Z
Learning: Guideline: Do not apply dark mode CSS classes (e.g., dark:text-*) to copilot UI components until dark mode support is implemented. Applies to all copilot-related components (paths containing /copilot/). When reviewing, search for dark:* class names within copilot components and refactor to use conditional class sets or feature-flag gates, ensuring no dark-mode styles are present in the code paths that render copilot UI unless dark mode support is officially enabled.

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
📚 Learning: 2026-02-27T10:45:49.499Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12213
File: autogpt_platform/frontend/src/app/(platform)/copilot/tools/RunMCPTool/helpers.tsx:23-24
Timestamp: 2026-02-27T10:45:49.499Z
Learning: Prefer using generated OpenAPI types from '@/app/api/__generated__/' for payloads defined in openapi.json (e.g., MCPToolsDiscoveredResponse, MCPToolOutputResponse). Use inline TypeScript interfaces only for payloads that are SSE-stream-only and not exposed via OpenAPI. Apply this pattern to frontend tool components (e.g., RunMCPTool) and related areas where similar SSE/openapi-discrepancies occur; avoid re-implementing types when a generated type is available.

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/frontend/**/*.{tsx,ts} : Use '<ErrorCard />' component for rendering errors in frontend UI; use toast notifications for mutation errors; use 'Sentry.captureException()' for manual exceptions

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx
📚 Learning: 2026-03-11T08:40:53.404Z
Learnt from: kcze
Repo: Significant-Gravitas/AutoGPT PR: 12328
File: autogpt_platform/frontend/src/app/(platform)/copilot/useLoadMoreMessages.ts:49-61
Timestamp: 2026-03-11T08:40:53.404Z
Learning: In `autogpt_platform/frontend/src/app/(platform)/copilot/useLoadMoreMessages.ts`, clearing `olderMessages` (and resetting `oldestSequence`/`hasMore`) when `initialOldestSequence` shifts on the same session is intentional. Pages already fetched were based on a now-stale cursor; retaining them risks sequence gaps or duplicates. `ScrollPreserver` keeps the currently visible viewport intact, so only unvisited older pages are dropped. This is a deliberate safe-refetch design tradeoff.

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/frontend/**/*.{tsx,ts} : Only use Phosphor Icons (phosphor-icons/react) for icons in frontend components

Applied to files:

  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
📚 Learning: 2026-02-26T21:29:44.105Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/frontend/CLAUDE.md:0-0
Timestamp: 2026-02-26T21:29:44.105Z
Learning: Applies to autogpt_platform/frontend/src/**/*.{ts,tsx} : Use Phosphor Icons only for all icon implementations

Applied to files:

  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
📚 Learning: 2026-02-26T21:29:44.105Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/frontend/CLAUDE.md:0-0
Timestamp: 2026-02-26T21:29:44.105Z
Learning: Applies to autogpt_platform/frontend/src/**/*.{ts,tsx,js,jsx} : Fully capitalize acronyms in symbols, e.g. `graphID`, `useBackendAPI`

Applied to files:

  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/frontend/**/*.{tsx,ts} : Use generated API hooks from '@/app/api/__generated__/endpoints/' instead of deprecated 'BackendAPI' or 'src/lib/autogpt-server-api/*'

Applied to files:

  • autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx
🔇 Additional comments (9)
autogpt_platform/frontend/src/components/layout/Navbar/components/AgentActivityDropdown/AgentActivityDropdown.tsx (1)

9-9: Pulse icon replacement looks good and consistent.

The import and JSX usage are both clean, and the change stays within the project’s Phosphor-only icon rule without affecting behavior.

Based on learnings: Applies to autogpt_platform/frontend/**/*.{tsx,ts} — “Only use Phosphor Icons (phosphor-icons/react) for icons in frontend components.”

Also applies to: 33-33

autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationDialog/NotificationDialog.tsx (1)

79-92: LGTM!

The branding update from "Otto" to "AutoPilot" and the centered footer buttons improve consistency across the notification surfaces. The implementation correctly uses Tailwind's justify-center for button alignment.

autogpt_platform/frontend/src/services/storage/local-storage.ts (1)

18-18: LGTM!

The new COPILOT_COMPLETED_SESSIONS key follows the established naming convention and integrates cleanly with the existing copilot-related storage keys.

autogpt_platform/frontend/src/app/(platform)/copilot/components/NotificationBanner/NotificationBanner.tsx (1)

58-61: LGTM!

The branding update to "AutoPilot" is consistent with the other notification surfaces in this PR.

autogpt_platform/frontend/src/app/(platform)/copilot/store.ts (1)

58-76: LGTM on persistence integration.

The initialization from localStorage and the persist calls on add/clear operations correctly maintain state across page reloads. The setState usage in the cross-tab listener (in useCopilotNotifications.ts) properly avoids re-triggering persistence, preventing infinite loops.

autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx (1)

122-128: LGTM!

The document title update to "AutoPilot is ready" maintains consistency with the title format used in useCopilotNotifications.ts. The logic correctly clears the indicator and updates the title when navigating to a completed session.

autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts (3)

40-47: Notification click navigation approach looks reasonable.

Using pushState + dispatchEvent(popstate) should trigger nuqs's query state updates without a full page reload. This is a valid approach for programmatic navigation.


158-179: LGTM on cross-tab synchronization.

The storage event handler correctly:

  • Filters for only the COPILOT_COMPLETED_SESSIONS key
  • Uses setState directly to avoid re-triggering persistence (preventing cross-tab ping-pong)
  • Updates document.title to reflect the synced state
  • Properly cleans up the event listener

67-71: LGTM on title synchronization.

The preload effect correctly syncs the document title with persisted state on mount, ensuring the badge count is visible immediately after a page refresh when there are pending sessions.

Comment thread autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts Outdated
…tification

- Add Array.isArray guard in loadCompletedSessions for corrupted localStorage
- Replace SW-specific notification path with try-catch around Notification
  constructor (no service worker exists in the codebase, and SW notifications
  lack onclick navigation support)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Comment thread autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 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
`@autogpt_platform/frontend/src/app/`(platform)/copilot/useCopilotNotifications.ts:
- Around line 155-160: The incoming storage snapshot is being treated as
authoritative in useCopilotNotifications, wiping out concurrent updates; instead
merge the incoming completedSessionIDs with the current store before writing. In
the handler that calls useCopilotUIStore.setState({ completedSessionIDs: next })
perform a union of the existing useCopilotUIStore.getState().completedSessionIDs
and the incoming next set (or otherwise reconcile by timestamp/operation), then
persist that merged set so the shared read-modify-write persistence path does
not clobber concurrent tab updates; update the storage-write codepath to always
read the latest store, merge, then write the merged set back to
localStorage/sessionStorage and only then call setState to ensure
last-write-wins across tabs is avoided.
- Around line 147-153: The storage-event handler in useCopilotNotifications.ts
currently does new Set(JSON.parse(e.newValue)) which will happily accept
non-array JSON (e.g., a string) and populate completedSessionIDs incorrectly;
change the logic in the try block to parse e.newValue into a temp value,
validate that Array.isArray(parsed) and that every element is a string, and only
then set next = new Set<string>(parsed) — otherwise set next = new Set<string>()
so cross-tab sync mirrors the array-shape validation used in the initial load
path; update references to next/completedSessionIDs accordingly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 736b9a91-414c-45e6-b429-139827be6d69

📥 Commits

Reviewing files that changed from the base of the PR and between 883e08c and d287a0e.

📒 Files selected for processing (2)
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: lint
  • GitHub Check: integration_test
  • GitHub Check: end-to-end tests
  • GitHub Check: types
  • GitHub Check: Seer Code Review
  • GitHub Check: Check PR Status
🧰 Additional context used
📓 Path-based instructions (10)
autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}: Use Node.js 21+ with pnpm package manager for frontend development
Always run 'pnpm format' for formatting and linting code in frontend development

autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}: Run pnpm format to auto-fix formatting issues before completing work
Run pnpm lint to check for lint errors and fix any that appear before completing work

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{tsx,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{tsx,ts}: Use function declarations for components and handlers (not arrow functions) in React components
Only use arrow functions for small inline lambdas (map, filter, etc.) in React components
Use PascalCase for component names and camelCase with 'use' prefix for hook names in React
Use Tailwind CSS utilities only for styling in frontend components
Use design system components from 'src/components/' (atoms, molecules, organisms) in frontend development
Never use 'src/components/legacy/' in frontend code
Only use Phosphor Icons (@phosphor-icons/react) for icons in frontend components
Use generated API hooks from '@/app/api/generated/endpoints/' instead of deprecated 'BackendAPI' or 'src/lib/autogpt-server-api/
'
Use React Query for server state (via generated hooks) in frontend development
Default to client components ('use client') in Next.js; only use server components for SEO or extreme TTFB needs
Use '' component for rendering errors in frontend UI; use toast notifications for mutation errors; use 'Sentry.captureException()' for manual exceptions
Separate render logic from data/behavior in React components; keep comments minimal (code should be self-documenting)

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{ts,tsx}: No barrel files or 'index.ts' re-exports in frontend code
Regenerate API hooks with 'pnpm generate:api' after backend OpenAPI spec changes in frontend development

Run pnpm types to check for type errors and fix any that appear before completing work

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

autogpt_platform/frontend/**/*.{js,jsx,ts,tsx}: Format frontend code using pnpm format
Never use components from src/components/__legacy__/*

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

autogpt_platform/frontend/src/**/*.{ts,tsx}: Structure components as ComponentName/ComponentName.tsx + useComponentName.ts + helpers.ts and use design system components from src/components/ (atoms, molecules, organisms)
Use generated API hooks from @/app/api/__generated__/endpoints/ with pattern use{Method}{Version}{OperationName} and regenerate with pnpm generate:api
Use function declarations (not arrow functions) for components and handlers
Separate render logic from business logic with component.tsx + useComponent.ts + helpers.ts structure
Colocate state when possible, avoid creating large components, use sub-components in local /components folder
Avoid large hooks, abstract logic into helpers.ts files when sensible
Use arrow functions only for callbacks, not for component declarations
Avoid comments at all times unless the code is very complex
Do not use useCallback or useMemo unless asked to optimize a given function

autogpt_platform/frontend/src/**/*.{ts,tsx}: Use function declarations (not arrow functions) for components and handlers
Use type-safe generated API hooks via Orval + React Query for data fetching
Use React Query for server state management and co-locate UI state in components/hooks
Separate render logic (.tsx) from business logic (use*.ts hooks)
Use only shadcn/ui (Radix UI primitives) with Tailwind CSS for UI components
Use Phosphor Icons only for all icon implementations
Use ErrorCard component for render errors, toast for mutations, and Sentry for exceptions
Use design system components from src/components/ (atoms, molecules, organisms)
Never use src/components/__legacy__/* components
Use generated API hooks from @/app/api/__generated__/endpoints/ with pattern use{Method}{Version}{OperationName}
Use Tailwind CSS only for styling with design tokens
Do not use useCallback or useMemo unless asked to optimize a specific function
Never type with any unless a variable/attribute can actually be of any type

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{js,jsx,ts,tsx,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Tailwind CSS only for styling, use design tokens, and use Phosphor Icons only

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/*.ts

📄 CodeRabbit inference engine (AGENTS.md)

Do not type hook returns, let Typescript infer as much as possible

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Never type with any, if no types available use unknown

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

Fully capitalize acronyms in symbols, e.g. graphID, useBackendAPI

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/use*.ts

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

autogpt_platform/frontend/src/**/use*.ts: Extract component logic into custom hooks grouped by concern, with each hook in its own .ts file
Do not type hook returns; let TypeScript infer types as much as possible

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
🧠 Learnings (1)
📚 Learning: 2026-02-26T21:29:44.105Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/frontend/CLAUDE.md:0-0
Timestamp: 2026-02-26T21:29:44.105Z
Learning: Applies to autogpt_platform/frontend/**/*.{ts,tsx} : Run `pnpm types` to check for type errors and fix any that appear before completing work

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
🔇 Additional comments (1)
autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts (1)

15-33: Nice consolidation of the browser-notification path.

Keeping the constructor and click-through navigation in showBrowserNotification makes this behavior much harder to regress at future call sites.

Comment thread autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts Outdated
Comment thread autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts Outdated
Mirror the array-shape validation from loadCompletedSessions() in the
storage event handler to guard against malformed localStorage payloads.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

♻️ Duplicate comments (1)
autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts (1)

160-163: ⚠️ Potential issue | 🟠 Major

Stale storage events can still overwrite newer local state.

Line 162 applies each incoming snapshot as authoritative. With near-simultaneous writes from multiple tabs, delayed events can revert a newer set. Consider versioned reconciliation (e.g., updatedAt / monotonic revision) or a merge policy in the persistence path to avoid clobbering.

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

In
`@autogpt_platform/frontend/src/app/`(platform)/copilot/useCopilotNotifications.ts
around lines 160 - 163, The current storage-event handler in
useCopilotNotifications.ts blindly applies the incoming snapshot via
useCopilotUIStore.setState({ completedSessionIDs: next }), which allows stale
storage events to overwrite newer local state; fix by adding a simple
reconciliation: persist a monotonic revision or updatedAt with the
completedSessionIDs in localStorage, and in the storage-event handler compare
the incoming revision/updatedAt against the local state's revision before
applying—if the incoming is older, merge instead of overwrite (e.g., union the
incoming next set with the current completedSessionIDs and take the newer
updatedAt/revision), and update both localStorage and useCopilotUIStore via
useCopilotUIStore.setState only with the reconciled result to avoid clobbering
newer data.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In
`@autogpt_platform/frontend/src/app/`(platform)/copilot/useCopilotNotifications.ts:
- Around line 160-163: The current storage-event handler in
useCopilotNotifications.ts blindly applies the incoming snapshot via
useCopilotUIStore.setState({ completedSessionIDs: next }), which allows stale
storage events to overwrite newer local state; fix by adding a simple
reconciliation: persist a monotonic revision or updatedAt with the
completedSessionIDs in localStorage, and in the storage-event handler compare
the incoming revision/updatedAt against the local state's revision before
applying—if the incoming is older, merge instead of overwrite (e.g., union the
incoming next set with the current completedSessionIDs and take the newer
updatedAt/revision), and update both localStorage and useCopilotUIStore via
useCopilotUIStore.setState only with the reconciled result to avoid clobbering
newer data.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 65b0dc68-24d6-4b94-a6a1-fe2d05cb3d8f

📥 Commits

Reviewing files that changed from the base of the PR and between d287a0e and f5df187.

📒 Files selected for processing (1)
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: types
  • GitHub Check: Seer Code Review
  • GitHub Check: end-to-end tests
  • GitHub Check: Check PR Status
🧰 Additional context used
📓 Path-based instructions (10)
autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}: Use Node.js 21+ with pnpm package manager for frontend development
Always run 'pnpm format' for formatting and linting code in frontend development

autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}: Run pnpm format to auto-fix formatting issues before completing work
Run pnpm lint to check for lint errors and fix any that appear before completing work

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{tsx,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{tsx,ts}: Use function declarations for components and handlers (not arrow functions) in React components
Only use arrow functions for small inline lambdas (map, filter, etc.) in React components
Use PascalCase for component names and camelCase with 'use' prefix for hook names in React
Use Tailwind CSS utilities only for styling in frontend components
Use design system components from 'src/components/' (atoms, molecules, organisms) in frontend development
Never use 'src/components/legacy/' in frontend code
Only use Phosphor Icons (@phosphor-icons/react) for icons in frontend components
Use generated API hooks from '@/app/api/generated/endpoints/' instead of deprecated 'BackendAPI' or 'src/lib/autogpt-server-api/
'
Use React Query for server state (via generated hooks) in frontend development
Default to client components ('use client') in Next.js; only use server components for SEO or extreme TTFB needs
Use '' component for rendering errors in frontend UI; use toast notifications for mutation errors; use 'Sentry.captureException()' for manual exceptions
Separate render logic from data/behavior in React components; keep comments minimal (code should be self-documenting)

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{ts,tsx}: No barrel files or 'index.ts' re-exports in frontend code
Regenerate API hooks with 'pnpm generate:api' after backend OpenAPI spec changes in frontend development

Run pnpm types to check for type errors and fix any that appear before completing work

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

autogpt_platform/frontend/**/*.{js,jsx,ts,tsx}: Format frontend code using pnpm format
Never use components from src/components/__legacy__/*

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

autogpt_platform/frontend/src/**/*.{ts,tsx}: Structure components as ComponentName/ComponentName.tsx + useComponentName.ts + helpers.ts and use design system components from src/components/ (atoms, molecules, organisms)
Use generated API hooks from @/app/api/__generated__/endpoints/ with pattern use{Method}{Version}{OperationName} and regenerate with pnpm generate:api
Use function declarations (not arrow functions) for components and handlers
Separate render logic from business logic with component.tsx + useComponent.ts + helpers.ts structure
Colocate state when possible, avoid creating large components, use sub-components in local /components folder
Avoid large hooks, abstract logic into helpers.ts files when sensible
Use arrow functions only for callbacks, not for component declarations
Avoid comments at all times unless the code is very complex
Do not use useCallback or useMemo unless asked to optimize a given function

autogpt_platform/frontend/src/**/*.{ts,tsx}: Use function declarations (not arrow functions) for components and handlers
Use type-safe generated API hooks via Orval + React Query for data fetching
Use React Query for server state management and co-locate UI state in components/hooks
Separate render logic (.tsx) from business logic (use*.ts hooks)
Use only shadcn/ui (Radix UI primitives) with Tailwind CSS for UI components
Use Phosphor Icons only for all icon implementations
Use ErrorCard component for render errors, toast for mutations, and Sentry for exceptions
Use design system components from src/components/ (atoms, molecules, organisms)
Never use src/components/__legacy__/* components
Use generated API hooks from @/app/api/__generated__/endpoints/ with pattern use{Method}{Version}{OperationName}
Use Tailwind CSS only for styling with design tokens
Do not use useCallback or useMemo unless asked to optimize a specific function
Never type with any unless a variable/attribute can actually be of any type

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{js,jsx,ts,tsx,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Tailwind CSS only for styling, use design tokens, and use Phosphor Icons only

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/*.ts

📄 CodeRabbit inference engine (AGENTS.md)

Do not type hook returns, let Typescript infer as much as possible

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Never type with any, if no types available use unknown

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

Fully capitalize acronyms in symbols, e.g. graphID, useBackendAPI

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/use*.ts

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

autogpt_platform/frontend/src/**/use*.ts: Extract component logic into custom hooks grouped by concern, with each hook in its own .ts file
Do not type hook returns; let TypeScript infer types as much as possible

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
🧠 Learnings (3)
📚 Learning: 2026-02-26T21:29:44.105Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/frontend/CLAUDE.md:0-0
Timestamp: 2026-02-26T21:29:44.105Z
Learning: Applies to autogpt_platform/frontend/**/*.{ts,tsx} : Run `pnpm types` to check for type errors and fix any that appear before completing work

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
📚 Learning: 2026-03-05T19:50:36.724Z
Learnt from: Bentlybro
Repo: Significant-Gravitas/AutoGPT PR: 0
File: :0-0
Timestamp: 2026-03-05T19:50:36.724Z
Learning: In `autogpt_platform/frontend/src/app/api/helpers.ts`, the `getPaginationNextPageNumber()` function includes an intentional defensive null check (`if (!pagination) return undefined`) after destructuring `lastPage.data.pagination`. This was proven necessary in production because React Query calls `getNextPageParam` even with error responses (e.g., 401s) that lack the expected pagination structure. Returning `undefined` signals React Query to treat it as "no next page" and stop pagination instead of throwing a TypeError. This is valid and should not be flagged in future reviews.

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
📚 Learning: 2026-03-11T08:40:53.404Z
Learnt from: kcze
Repo: Significant-Gravitas/AutoGPT PR: 12328
File: autogpt_platform/frontend/src/app/(platform)/copilot/useLoadMoreMessages.ts:49-61
Timestamp: 2026-03-11T08:40:53.404Z
Learning: In `autogpt_platform/frontend/src/app/(platform)/copilot/useLoadMoreMessages.ts`, clearing `olderMessages` (and resetting `oldestSequence`/`hasMore`) when `initialOldestSequence` shifts on the same session is intentional. Pages already fetched were based on a now-stale cursor; retaining them risks sequence gaps or duplicates. `ScrollPreserver` keeps the currently visible viewport intact, so only unvisited older pages are dropped. This is a deliberate safe-refetch design tradeoff.

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
🔇 Additional comments (3)
autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts (3)

15-33: Good extraction of browser notification behavior.

This keeps notification click-navigation logic centralized and safely degrades when notification construction fails.


53-56: Mount-time title hydration is a solid UX improvement.

Using persisted completedSessionIDs on load prevents badge/title desync after refresh.


149-156: Nice hardening for malformed storage payloads.

The array guard plus string filtering reduces corruption risk from invalid localStorage values.

kcze and others added 2 commits March 16, 2026 19:50
The code referenced /sounds/notification.mp3 but the file is
/notification.wav in the public directory.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts (1)

46-57: Consider explicit Audio cleanup on unmount.

The Audio element is stored in audioRef but not explicitly cleaned up. While it will be garbage collected, adding cleanup prevents potential edge cases where audio might continue playing during rapid mount/unmount cycles.

♻️ Optional cleanup
   useEffect(() => {
     if (typeof window === "undefined") return;
     const audio = new Audio(NOTIFICATION_SOUND_PATH);
     audio.volume = 0.5;
     audioRef.current = audio;

     const count = useCopilotUIStore.getState().completedSessionIDs.size;
     if (count > 0) {
       document.title = `(${count}) AutoPilot is ready - ${ORIGINAL_TITLE}`;
     }
+
+    return () => {
+      audio.pause();
+      audio.src = "";
+      audioRef.current = null;
+    };
   }, []);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@autogpt_platform/frontend/src/app/`(platform)/copilot/useCopilotNotifications.ts
around lines 46 - 57, The effect in useCopilotNotifications.ts creates an
Audio(NOTIFICATION_SOUND_PATH) and assigns it to audioRef.current but never
cleans it up; update the useEffect that creates the audio (the function
referencing audioRef and NOTIFICATION_SOUND_PATH) to return a cleanup function
that, if audioRef.current exists, pauses it, sets currentTime to 0, clears its
src (or sets src = ""), and sets audioRef.current = null to release references
and prevent audio continuing across unmounts. Ensure the cleanup is safe by
checking audioRef.current before operating on it.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In
`@autogpt_platform/frontend/src/app/`(platform)/copilot/useCopilotNotifications.ts:
- Around line 46-57: The effect in useCopilotNotifications.ts creates an
Audio(NOTIFICATION_SOUND_PATH) and assigns it to audioRef.current but never
cleans it up; update the useEffect that creates the audio (the function
referencing audioRef and NOTIFICATION_SOUND_PATH) to return a cleanup function
that, if audioRef.current exists, pauses it, sets currentTime to 0, clears its
src (or sets src = ""), and sets audioRef.current = null to release references
and prevent audio continuing across unmounts. Ensure the cleanup is safe by
checking audioRef.current before operating on it.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1473dbab-263d-4426-ae51-f8b7c87ef71a

📥 Commits

Reviewing files that changed from the base of the PR and between f5df187 and e3a58fd.

⛔ Files ignored due to path filters (1)
  • autogpt_platform/frontend/public/notification.wav is excluded by !**/*.wav
📒 Files selected for processing (1)
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: types
  • GitHub Check: Seer Code Review
  • GitHub Check: Check PR Status
  • GitHub Check: end-to-end tests
  • GitHub Check: Analyze (python)
🧰 Additional context used
📓 Path-based instructions (10)
autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}: Use Node.js 21+ with pnpm package manager for frontend development
Always run 'pnpm format' for formatting and linting code in frontend development

autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}: Run pnpm format to auto-fix formatting issues before completing work
Run pnpm lint to check for lint errors and fix any that appear before completing work

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{tsx,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{tsx,ts}: Use function declarations for components and handlers (not arrow functions) in React components
Only use arrow functions for small inline lambdas (map, filter, etc.) in React components
Use PascalCase for component names and camelCase with 'use' prefix for hook names in React
Use Tailwind CSS utilities only for styling in frontend components
Use design system components from 'src/components/' (atoms, molecules, organisms) in frontend development
Never use 'src/components/legacy/' in frontend code
Only use Phosphor Icons (@phosphor-icons/react) for icons in frontend components
Use generated API hooks from '@/app/api/generated/endpoints/' instead of deprecated 'BackendAPI' or 'src/lib/autogpt-server-api/
'
Use React Query for server state (via generated hooks) in frontend development
Default to client components ('use client') in Next.js; only use server components for SEO or extreme TTFB needs
Use '' component for rendering errors in frontend UI; use toast notifications for mutation errors; use 'Sentry.captureException()' for manual exceptions
Separate render logic from data/behavior in React components; keep comments minimal (code should be self-documenting)

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{ts,tsx}: No barrel files or 'index.ts' re-exports in frontend code
Regenerate API hooks with 'pnpm generate:api' after backend OpenAPI spec changes in frontend development

Run pnpm types to check for type errors and fix any that appear before completing work

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

autogpt_platform/frontend/**/*.{js,jsx,ts,tsx}: Format frontend code using pnpm format
Never use components from src/components/__legacy__/*

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

autogpt_platform/frontend/src/**/*.{ts,tsx}: Structure components as ComponentName/ComponentName.tsx + useComponentName.ts + helpers.ts and use design system components from src/components/ (atoms, molecules, organisms)
Use generated API hooks from @/app/api/__generated__/endpoints/ with pattern use{Method}{Version}{OperationName} and regenerate with pnpm generate:api
Use function declarations (not arrow functions) for components and handlers
Separate render logic from business logic with component.tsx + useComponent.ts + helpers.ts structure
Colocate state when possible, avoid creating large components, use sub-components in local /components folder
Avoid large hooks, abstract logic into helpers.ts files when sensible
Use arrow functions only for callbacks, not for component declarations
Avoid comments at all times unless the code is very complex
Do not use useCallback or useMemo unless asked to optimize a given function

autogpt_platform/frontend/src/**/*.{ts,tsx}: Use function declarations (not arrow functions) for components and handlers
Use type-safe generated API hooks via Orval + React Query for data fetching
Use React Query for server state management and co-locate UI state in components/hooks
Separate render logic (.tsx) from business logic (use*.ts hooks)
Use only shadcn/ui (Radix UI primitives) with Tailwind CSS for UI components
Use Phosphor Icons only for all icon implementations
Use ErrorCard component for render errors, toast for mutations, and Sentry for exceptions
Use design system components from src/components/ (atoms, molecules, organisms)
Never use src/components/__legacy__/* components
Use generated API hooks from @/app/api/__generated__/endpoints/ with pattern use{Method}{Version}{OperationName}
Use Tailwind CSS only for styling with design tokens
Do not use useCallback or useMemo unless asked to optimize a specific function
Never type with any unless a variable/attribute can actually be of any type

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/**/*.{js,jsx,ts,tsx,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Tailwind CSS only for styling, use design tokens, and use Phosphor Icons only

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/*.ts

📄 CodeRabbit inference engine (AGENTS.md)

Do not type hook returns, let Typescript infer as much as possible

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Never type with any, if no types available use unknown

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

Fully capitalize acronyms in symbols, e.g. graphID, useBackendAPI

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
autogpt_platform/frontend/src/**/use*.ts

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

autogpt_platform/frontend/src/**/use*.ts: Extract component logic into custom hooks grouped by concern, with each hook in its own .ts file
Do not type hook returns; let TypeScript infer types as much as possible

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
🧠 Learnings (4)
📚 Learning: 2026-02-26T21:29:44.105Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/frontend/CLAUDE.md:0-0
Timestamp: 2026-02-26T21:29:44.105Z
Learning: Applies to autogpt_platform/frontend/**/*.{ts,tsx} : Run `pnpm types` to check for type errors and fix any that appear before completing work

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
📚 Learning: 2026-03-05T19:50:36.724Z
Learnt from: Bentlybro
Repo: Significant-Gravitas/AutoGPT PR: 0
File: :0-0
Timestamp: 2026-03-05T19:50:36.724Z
Learning: In `autogpt_platform/frontend/src/app/api/helpers.ts`, the `getPaginationNextPageNumber()` function includes an intentional defensive null check (`if (!pagination) return undefined`) after destructuring `lastPage.data.pagination`. This was proven necessary in production because React Query calls `getNextPageParam` even with error responses (e.g., 401s) that lack the expected pagination structure. Returning `undefined` signals React Query to treat it as "no next page" and stop pagination instead of throwing a TypeError. This is valid and should not be flagged in future reviews.

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
📚 Learning: 2026-03-11T08:40:53.404Z
Learnt from: kcze
Repo: Significant-Gravitas/AutoGPT PR: 12328
File: autogpt_platform/frontend/src/app/(platform)/copilot/useLoadMoreMessages.ts:49-61
Timestamp: 2026-03-11T08:40:53.404Z
Learning: In `autogpt_platform/frontend/src/app/(platform)/copilot/useLoadMoreMessages.ts`, clearing `olderMessages` (and resetting `oldestSequence`/`hasMore`) when `initialOldestSequence` shifts on the same session is intentional. Pages already fetched were based on a now-stale cursor; retaining them risks sequence gaps or duplicates. `ScrollPreserver` keeps the currently visible viewport intact, so only unvisited older pages are dropped. This is a deliberate safe-refetch design tradeoff.

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
📚 Learning: 2026-03-10T08:39:13.707Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12356
File: autogpt_platform/backend/backend/copilot/constants.py:9-12
Timestamp: 2026-03-10T08:39:13.707Z
Learning: In Significant-Gravitas/AutoGPT PR `#12356`, the `COPILOT_SYNTHETIC_ID_PREFIX = "copilot-"` check in `create_auto_approval_record` (human_review.py) is intentional and safe. The `graph_exec_id` passed to this function comes from server-side `PendingHumanReview` DB records (not from user input); the API only accepts `node_exec_id` from users. Synthetic `copilot-*` IDs are only ever created server-side in `run_block.py`. The prefix skip avoids a DB lookup for a `AgentGraphExecution` record that legitimately does not exist for CoPilot sessions, while `user_id` scoping is enforced at the auth layer and on the resulting auto-approval record.

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
🔇 Additional comments (5)
autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts (5)

1-8: LGTM!

The import of Key enables the cross-tab sync feature, and the corrected notification sound path aligns with the actual public asset location per the commit message.


10-33: LGTM!

The helper cleanly encapsulates browser notification logic with graceful degradation for restricted contexts. The onclick navigation via pushState + popstate dispatch is appropriate for SPA routing.


59-111: LGTM!

The WebSocket handler correctly implements the notification flow: deduplication, UI state update, and conditional sound/browser notification based on user settings and focus state. The "AutoPilot" branding is consistently applied.


113-141: LGTM!

Focus tracking correctly resets the document title only when there are no pending completed sessions. Event listener cleanup is properly implemented.


143-171: LGTM!

Cross-tab sync correctly validates the storage payload and updates local state without re-persisting (since the storage event originates from another tab's write). The inline comment clarifies the design rationale for treating localStorage as the source of truth.

kcze and others added 2 commits March 16, 2026 21:19
The code referenced /sounds/notification.mp3 but the file is
/notification.mp3 in the public directory. Also added a .gitignore
exception for the notification sound since *.mp3 is globally ignored.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Zustand store called storage.get() during initialization which runs
on both server and client, triggering Sentry alerts (BUILDER-7CB, 7CC,
7C7) for expected SSR behavior. Guard with an isClient check so
storage.get() is only called on the client, keeping the Sentry alerts in
local-storage.ts to catch genuinely unexpected SSR access elsewhere.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 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 `@autogpt_platform/frontend/src/app/`(platform)/copilot/store.ts:
- Around line 16-18: The parsed localStorage value is converted to a Set without
validating element types, which can allow non-string entries into
completedSessionIDs; update the JSON parsing branch that creates parsed to
ensure Array.isArray(parsed) and that every element is a string (e.g., filter or
validate using typeof === "string") before constructing and returning new
Set(parsed), and otherwise return an empty Set to guarantee completedSessionIDs
is Set<string>.
- Around line 23-29: persistCompletedSessions currently writes to storage
without checking isClient or handling exceptions; update the function to first
return early if !isClient, then wrap the storage.clean/ storage.set calls for
Key.COPILOT_COMPLETED_SESSIONS in a try/catch and swallow or log errors
(matching the approach used in loadCompletedSessions) so storage failures don't
bubble up and break state mutation callbacks (calls from the store that invoke
persistCompletedSessions). Ensure you reference and use the existing storage API
and Key.COPILOT_COMPLETED_SESSIONS and keep the function signature
persistCompletedSessions(ids: Set<string>) unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1fcfd9ae-4268-4b42-be79-b3ed5aec1cdd

📥 Commits

Reviewing files that changed from the base of the PR and between e3a58fd and 4854b45.

⛔ Files ignored due to path filters (1)
  • autogpt_platform/frontend/public/notification.mp3 is excluded by !**/*.mp3
📒 Files selected for processing (3)
  • .gitignore
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
✅ Files skipped from review due to trivial changes (1)
  • .gitignore
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: check API types
  • GitHub Check: Seer Code Review
  • GitHub Check: end-to-end tests
  • GitHub Check: Check PR Status
  • GitHub Check: Analyze (python)
🧰 Additional context used
📓 Path-based instructions (10)
autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}: Use Node.js 21+ with pnpm package manager for frontend development
Always run 'pnpm format' for formatting and linting code in frontend development

autogpt_platform/frontend/**/*.{ts,tsx,js,jsx}: Run pnpm format to auto-fix formatting issues before completing work
Run pnpm lint to check for lint errors and fix any that appear before completing work

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/**/*.{tsx,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{tsx,ts}: Use function declarations for components and handlers (not arrow functions) in React components
Only use arrow functions for small inline lambdas (map, filter, etc.) in React components
Use PascalCase for component names and camelCase with 'use' prefix for hook names in React
Use Tailwind CSS utilities only for styling in frontend components
Use design system components from 'src/components/' (atoms, molecules, organisms) in frontend development
Never use 'src/components/legacy/' in frontend code
Only use Phosphor Icons (@phosphor-icons/react) for icons in frontend components
Use generated API hooks from '@/app/api/generated/endpoints/' instead of deprecated 'BackendAPI' or 'src/lib/autogpt-server-api/
'
Use React Query for server state (via generated hooks) in frontend development
Default to client components ('use client') in Next.js; only use server components for SEO or extreme TTFB needs
Use '' component for rendering errors in frontend UI; use toast notifications for mutation errors; use 'Sentry.captureException()' for manual exceptions
Separate render logic from data/behavior in React components; keep comments minimal (code should be self-documenting)

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/**/*.{ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/frontend/**/*.{ts,tsx}: No barrel files or 'index.ts' re-exports in frontend code
Regenerate API hooks with 'pnpm generate:api' after backend OpenAPI spec changes in frontend development

Run pnpm types to check for type errors and fix any that appear before completing work

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

autogpt_platform/frontend/**/*.{js,jsx,ts,tsx}: Format frontend code using pnpm format
Never use components from src/components/__legacy__/*

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

autogpt_platform/frontend/src/**/*.{ts,tsx}: Structure components as ComponentName/ComponentName.tsx + useComponentName.ts + helpers.ts and use design system components from src/components/ (atoms, molecules, organisms)
Use generated API hooks from @/app/api/__generated__/endpoints/ with pattern use{Method}{Version}{OperationName} and regenerate with pnpm generate:api
Use function declarations (not arrow functions) for components and handlers
Separate render logic from business logic with component.tsx + useComponent.ts + helpers.ts structure
Colocate state when possible, avoid creating large components, use sub-components in local /components folder
Avoid large hooks, abstract logic into helpers.ts files when sensible
Use arrow functions only for callbacks, not for component declarations
Avoid comments at all times unless the code is very complex
Do not use useCallback or useMemo unless asked to optimize a given function

autogpt_platform/frontend/src/**/*.{ts,tsx}: Use function declarations (not arrow functions) for components and handlers
Use type-safe generated API hooks via Orval + React Query for data fetching
Use React Query for server state management and co-locate UI state in components/hooks
Separate render logic (.tsx) from business logic (use*.ts hooks)
Use only shadcn/ui (Radix UI primitives) with Tailwind CSS for UI components
Use Phosphor Icons only for all icon implementations
Use ErrorCard component for render errors, toast for mutations, and Sentry for exceptions
Use design system components from src/components/ (atoms, molecules, organisms)
Never use src/components/__legacy__/* components
Use generated API hooks from @/app/api/__generated__/endpoints/ with pattern use{Method}{Version}{OperationName}
Use Tailwind CSS only for styling with design tokens
Do not use useCallback or useMemo unless asked to optimize a specific function
Never type with any unless a variable/attribute can actually be of any type

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/**/*.{js,jsx,ts,tsx,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Tailwind CSS only for styling, use design tokens, and use Phosphor Icons only

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/src/**/*.ts

📄 CodeRabbit inference engine (AGENTS.md)

Do not type hook returns, let Typescript infer as much as possible

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Never type with any, if no types available use unknown

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/src/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

Fully capitalize acronyms in symbols, e.g. graphID, useBackendAPI

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
autogpt_platform/frontend/src/**/use*.ts

📄 CodeRabbit inference engine (autogpt_platform/frontend/CLAUDE.md)

autogpt_platform/frontend/src/**/use*.ts: Extract component logic into custom hooks grouped by concern, with each hook in its own .ts file
Do not type hook returns; let TypeScript infer types as much as possible

Files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
🧠 Learnings (5)
📓 Common learnings
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12356
File: autogpt_platform/backend/backend/copilot/constants.py:9-12
Timestamp: 2026-03-10T08:39:22.025Z
Learning: In Significant-Gravitas/AutoGPT PR `#12356`, the `COPILOT_SYNTHETIC_ID_PREFIX = "copilot-"` check in `create_auto_approval_record` (human_review.py) is intentional and safe. The `graph_exec_id` passed to this function comes from server-side `PendingHumanReview` DB records (not from user input); the API only accepts `node_exec_id` from users. Synthetic `copilot-*` IDs are only ever created server-side in `run_block.py`. The prefix skip avoids a DB lookup for a `AgentGraphExecution` record that legitimately does not exist for CoPilot sessions, while `user_id` scoping is enforced at the auth layer and on the resulting auto-approval record.
📚 Learning: 2026-03-05T19:50:36.724Z
Learnt from: Bentlybro
Repo: Significant-Gravitas/AutoGPT PR: 0
File: :0-0
Timestamp: 2026-03-05T19:50:36.724Z
Learning: In `autogpt_platform/frontend/src/app/api/helpers.ts`, the `getPaginationNextPageNumber()` function includes an intentional defensive null check (`if (!pagination) return undefined`) after destructuring `lastPage.data.pagination`. This was proven necessary in production because React Query calls `getNextPageParam` even with error responses (e.g., 401s) that lack the expected pagination structure. Returning `undefined` signals React Query to treat it as "no next page" and stop pagination instead of throwing a TypeError. This is valid and should not be flagged in future reviews.

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
📚 Learning: 2026-03-16T17:28:46.349Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12440
File: autogpt_platform/frontend/src/app/(platform)/library/components/LibraryImportWorkflowDialog/useLibraryImportWorkflowDialog.ts:48-51
Timestamp: 2026-03-16T17:28:46.349Z
Learning: In Significant-Gravitas/AutoGPT, orval-generated API hooks (e.g., `usePostV2ImportAWorkflowFromAnotherToolN8nMakeComZapier` in `autogpt_platform/frontend/src/app/(platform)/library/components/LibraryImportWorkflowDialog/useLibraryImportWorkflowDialog.ts`) return `response.data` typed as a union of all possible response schemas (success + all error schemas, e.g. `HTTP401NotAuthenticatedErrorResponse | HTTPValidationError | ImportWorkflowResponse`). A manual `as SpecificType` cast is necessary to access success-only fields (e.g., `data.graph_id`). This is valid when error paths throw before the cast line. Do not flag such casts as unnecessary in future reviews. Note: the hook was previously named `usePostV2ImportACompetitorWorkflowN8nMakeComZapier` before the API path was renamed to avoid "competitor" wording (per PR `#12440` commit 4c91d39f2).

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
📚 Learning: 2026-03-11T08:40:59.673Z
Learnt from: kcze
Repo: Significant-Gravitas/AutoGPT PR: 12328
File: autogpt_platform/frontend/src/app/(platform)/copilot/useLoadMoreMessages.ts:49-61
Timestamp: 2026-03-11T08:40:59.673Z
Learning: In `autogpt_platform/frontend/src/app/(platform)/copilot/useLoadMoreMessages.ts`, clearing `olderMessages` (and resetting `oldestSequence`/`hasMore`) when `initialOldestSequence` shifts on the same session is intentional. Pages already fetched were based on a now-stale cursor; retaining them risks sequence gaps or duplicates. `ScrollPreserver` keeps the currently visible viewport intact, so only unvisited older pages are dropped. This is a deliberate safe-refetch design tradeoff.

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
  • autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
📚 Learning: 2026-03-10T08:39:22.025Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12356
File: autogpt_platform/backend/backend/copilot/constants.py:9-12
Timestamp: 2026-03-10T08:39:22.025Z
Learning: In Significant-Gravitas/AutoGPT PR `#12356`, the `COPILOT_SYNTHETIC_ID_PREFIX = "copilot-"` check in `create_auto_approval_record` (human_review.py) is intentional and safe. The `graph_exec_id` passed to this function comes from server-side `PendingHumanReview` DB records (not from user input); the API only accepts `node_exec_id` from users. Synthetic `copilot-*` IDs are only ever created server-side in `run_block.py`. The prefix skip avoids a DB lookup for a `AgentGraphExecution` record that legitimately does not exist for CoPilot sessions, while `user_id` scoping is enforced at the auth layer and on the resulting auto-approval record.

Applied to files:

  • autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts
🔇 Additional comments (1)
autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotNotifications.ts (1)

143-171: MobileDrawer clears completed sessions without syncing document.title.

The storage event handler (lines 143–171) doesn't fire in the origin tab, so clearing via MobileDrawer leaves the title stale. ChatSidebar mitigates this with manual title updates on navigation, but MobileDrawer has no such sync. The suggested fix—making title reactive to store count—is valid but would also override context-aware behaviors (e.g., focus handlers conditionally reset title). A more targeted fix is to add a title sync effect in MobileDrawer when clearing, or adopt the reactive pattern if simplicity is preferred.

Comment thread autogpt_platform/frontend/src/app/(platform)/copilot/store.ts Outdated
Comment thread autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
@majdyz

majdyz commented Mar 28, 2026

Copy link
Copy Markdown
Contributor

🤖 PR Review — #12428

AutoPilot notification follow-ups — Branding, UX, persistence, cross-tab sync improvements.

CI: 0 failures | Diff: ~364 lines

Review in progress — will post inline findings if any.

@majdyz

majdyz commented Mar 28, 2026

Copy link
Copy Markdown
Contributor

🤖 PR Review — #12428 (Notification Follow-ups)

Verdict: ✅ APPROVED

UX improvements for AutoPilot notifications. Sound notification, cross-tab sync via localStorage, branding updates. Well-scoped changes across notification components.

Findings: No blockers.

All CI checks green.

@majdyz majdyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 LGTM — reviewed code, CI green, no blockers found.

Comment thread autogpt_platform/frontend/src/app/(platform)/copilot/store.ts
Comment thread autogpt_platform/frontend/src/app/(platform)/copilot/store.ts Outdated
Comment thread autogpt_platform/frontend/src/app/(platform)/copilot/helpers.ts

@majdyz majdyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review Summary

Well-scoped set of follow-up fixes. The author has been responsive to feedback throughout -- CodeRabbit's Array.isArray guard, the typeof === "string" filter, isClient guard on persistence, and Abhi's dedup suggestions have all been addressed in subsequent commits. The refactoring into helpers.ts with formatNotificationTitle and parseSessionIDs was a good call and eliminated the duplication cleanly.

CI is fully green. No blockers.

What looks good

  • Branding rename is complete and consistent across all surfaces (browser notification, document title, dialog copy, banner copy).
  • parseSessionIDs / formatNotificationTitle extraction into helpers.ts eliminates the duplication that was flagged in review and also fixes the ChatSidebar bug where "AutoGPT" was hardcoded instead of using ORIGINAL_TITLE.
  • SSR guard via const isClient = typeof window !== "undefined" at module scope in store.ts prevents storage.get() during SSR, which should silence BUILDER-7CB/7CC/7C7 Sentry alerts without removing the Sentry reporting for genuinely unexpected SSR access in local-storage.ts.
  • Cross-tab sync design is sound: localStorage as shared source of truth with snapshot adoption (not merge/union) is the correct choice given that both additions and removals need to propagate. The author's reasoning in the thread about why union would break removal semantics is spot-on.
  • showBrowserNotification try-catch is the right simplification over the earlier SW-specific path, since there's no service worker in the codebase.

Minor observations (non-blocking)

  1. isClient at module scope is evaluated once at import time. This works correctly for Next.js (SSR runs the module in Node where window is undefined, then the client re-executes). Just noting that this relies on the standard Next.js module evaluation model -- if the codebase ever moves to a streaming SSR setup where modules are shared, this would need revisiting. Not actionable now.

  2. clearCopilotLocalData calls document.title = ORIGINAL_TITLE without an isClient guard. All the other storage.* calls in that function go through local-storage.ts which has its own SSR guard, but document.title would throw during SSR. Since this function is only ever called from user-initiated UI actions (settings reset), it's safe in practice. Just flagging for awareness.

  3. Audio cleanup on unmount. CodeRabbit suggested adding a cleanup return to the audio preload useEffect (audio.pause(); audio.src = ""; audioRef.current = null;). This is a minor robustness improvement for rapid mount/unmount cycles. Not blocking, but would be a nice-to-have.

LGTM -- no changes needed.

Comment thread autogpt_platform/frontend/src/app/(platform)/copilot/helpers.ts

@majdyz majdyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review Summary

Good PR overall — the branding rename, SSR guards, localStorage persistence, and cross-tab sync are well-structured. The extraction of formatNotificationTitle and parseSessionIDs into shared helpers is a nice DRY improvement. The try-catch on new Notification() for service worker contexts is a solid defensive fix.

Issues found

🟠 Should Fix (2):

  1. Tailwind class conflict on Dialog.Footer: Passing className="justify-center" to BaseFooter which already has a hardcoded justify-end is unreliable because BaseFooter uses raw string concatenation instead of cn() / tailwind-merge. The winning class depends on CSS cascade order, not HTML attribute order. Fix either by updating BaseFooter to use cn(), or by using style={{ justifyContent: "center" }} at the call site.

  2. No unit tests for formatNotificationTitle and parseSessionIDs: These are pure functions extracted into a shared helpers.ts file. They have clear edge cases (negative/NaN counts, malformed JSON, non-array payloads, arrays with non-string elements) and are trivial to test. A colocated helpers.test.ts would prevent future regressions.

🟡 Nice to Have (2):

  1. clearCopilotLocalData accesses document.title without isClient guard — inconsistent with the SSR hardening applied to all other initializers in the same file.

  2. remaining = completedSessionIDs.size - 1 in ChatSidebar could theoretically go negative in a cross-tab race. Wrapping in Math.max(0, remaining) would be a small safety net.

Testing request

Please share a screenshot or recording showing:

  • The dialog buttons are visually centered (proving the Tailwind class conflict doesn't cause issues on your current build)
  • Cross-tab sync: clearing a notification in one tab clears the badge in the other
  • Notification sound plays correctly from /notification.mp3

@github-project-automation github-project-automation Bot moved this from 👍🏼 Mergeable to 🚧 Needs work in AutoGPT development kanban Mar 31, 2026
@majdyz

majdyz commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

When the feedback is addressed, please re-request review so I can take another look.

kcze and others added 2 commits April 1, 2026 13:39
- Fix BaseFooter to use cn() instead of raw string concatenation so
  className overrides (like justify-center) properly merge with defaults
- Add isClient guard to clearCopilotLocalData's document.title access
- Add Math.max(0, ...) guard for remaining count in ChatSidebar
- Add unit tests for formatNotificationTitle and parseSessionIDs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@kcze
kcze requested a review from majdyz April 1, 2026 05:19
Comment thread .gitignore
@github-project-automation github-project-automation Bot moved this from 🚧 Needs work to 👍🏼 Mergeable in AutoGPT development kanban Apr 2, 2026
@kcze
kcze enabled auto-merge April 3, 2026 11:43
@kcze
kcze added this pull request to the merge queue Apr 3, 2026
Merged via the queue into dev with commit 09e4204 Apr 3, 2026
21 checks passed
@kcze
kcze deleted the kpczerwinski/secrt-2124-autopilot-notifications-follow-up branch April 3, 2026 11:57
@github-project-automation github-project-automation Bot moved this to Done in Frontend Apr 3, 2026
@github-project-automation github-project-automation Bot moved this from 👍🏼 Mergeable to ✅ Done in AutoGPT development kanban Apr 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

platform/frontend AutoGPT Platform - Front end size/l

Projects

Status: ✅ Done
Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants