Skip to content

Conversation

@jom-sq
Copy link
Contributor

@jom-sq jom-sq commented Nov 2, 2025

Summary

Replaces multiple individual extension loading toast notifications with a single, grouped, collapsible notification. When starting Goose with 10+ extensions enabled, users previously saw 10+ stacked toast notifications. This PR consolidates them into one notification that shows real-time loading progress, displays success/error counts, and can be expanded to view individual extension statuses.

Key improvements:

  • Single grouped notification instead of 10+ individual toasts
  • Real-time progress tracking with status icons (🟢 success, 🔴 error, 🔵 loading)
  • Expandable to view individual extension details
  • Auto-dismisses after 5 seconds when complete
  • Can be dismissed during loading

Type of Change

  • Feature

Testing

Unit Tests:

  • Added tests in GroupedExtensionLoadingToast.test.tsx
  • Covers loading, success, error, partial failure, and mixed states
  • Tests singular/plural grammar handling
  • All tests passing ✅

Manual Testing:

  • Tested with 10+ extensions during startup
  • Verified real-time status updates as extensions load
  • Confirmed error handling and display
  • Tested expand/collapse interaction
  • Verified auto-dismiss after 5 seconds
  • Tested dismissal during loading

CI Checks:

  • TypeScript type checking: ✅
  • ESLint: ✅
  • All existing tests: ✅
  • Rust formatting: ✅

Related Issues

N/A

Screenshots/Demos (for UX changes)

Note that I don't know why my Square MCP server gives two failure toasts, I'll be exploring that in a later Issue where this extension is causing multiple issues 😅

Before:

before.mp4

After

My.Movie.mp4

@jom-sq jom-sq force-pushed the jom/feat/grouped-extension-loading-notification branch from e9bcd0c to 629b81a Compare November 2, 2025 16:24
@jom-sq jom-sq marked this pull request as ready for review November 2, 2025 16:34
@angiejones angiejones requested a review from Copilot November 2, 2025 17:52
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR implements grouped extension loading notifications to improve user experience during extension initialization. Instead of showing individual toasts for each extension, it consolidates them into a single collapsible toast that updates in real-time.

Key changes:

  • Introduces a new GroupedExtensionLoadingToast component with expandable/collapsible UI
  • Adds extensionLoading() method to ToastService for managing grouped toast updates
  • Updates initializeSystem() to track extension loading status and display grouped notifications

Reviewed Changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
ui/desktop/src/components/GroupedExtensionLoadingToast.tsx New React component implementing collapsible toast with extension loading status display
ui/desktop/src/components/tests/GroupedExtensionLoadingToast.test.tsx Test suite covering various loading states and scenarios
ui/desktop/src/toasts.tsx Adds extensionLoading() method and exports ExtensionLoadingStatus type
ui/desktop/src/utils/providerUtils.ts Implements status tracking and grouped notification updates during extension initialization
ui/desktop/src/components/settings/extensions/extension-manager.ts Makes individual extension toasts silent and re-throws errors for grouped notification handling

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 114 to 122
// Always show individual error toasts (they have action buttons and detailed info)
toastService.configure({ silent: false });
toastService.error({
title: extensionConfig.name,
msg: 'Extension failed to start and will retry on a new session.',
traceback: finalError instanceof Error ? finalError.message : String(finalError),
});
// Re-throw so the grouped notification can catch and display it
throw finalError;
Copy link

Copilot AI Nov 2, 2025

Choose a reason for hiding this comment

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

The comment on line 114 states 'Always show individual error toasts' but this creates duplicate error notifications - one individual error toast here and another in the grouped notification. Consider removing the individual toast and only showing the grouped notification, or add a flag to control this behavior.

Copilot uses AI. Check for mistakes.
Copy link
Collaborator

Choose a reason for hiding this comment

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

i understand that the individual toasts have more info on the error, but I did find it confusing to see the extension status in both the grouped toasts and the individual toast

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@angiejones ah yeah, was playing around with putting the info into the collapsible one but have to think about it some more 😓 I'm mostly confused why this specific extension always throws two individual ones to begin with

Copy link
Collaborator

Choose a reason for hiding this comment

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

i had a 2 for 1 for another extension too. there were two different messages on them

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@angiejones I think this looks better! Kept the same logic with either "Ask Goose" button or copy error.

image

Copy link
Collaborator

Choose a reason for hiding this comment

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

nice!

Copilot AI review requested due to automatic review settings November 2, 2025 22:32
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@jom-sq jom-sq force-pushed the jom/feat/grouped-extension-loading-notification branch from b0f2470 to 354f728 Compare November 2, 2025 23:05
@angiejones angiejones requested a review from Copilot November 2, 2025 23:15
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

isComplete={isComplete}
/>,
{
...commonToastOptions,
Copy link

Copilot AI Nov 2, 2025

Choose a reason for hiding this comment

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

The commonToastOptions includes closeOnClick: true (line 144), but this is explicitly overridden to false on line 112. The spread operator on line 108 applies commonToastOptions first, making the override on line 112 take precedence. However, this could be confusing. Consider creating a variant of commonToastOptions without closeOnClick, or add a comment explaining why the override is necessary for this specific toast type.

Copilot uses AI. Check for mistakes.
@jom-sq jom-sq force-pushed the jom/feat/grouped-extension-loading-notification branch from 354f728 to e616bf2 Compare November 3, 2025 14:53
Replace multiple individual toast notifications with a single collapsible
notification during extension loading at startup.

Changes:
- Created GroupedExtensionLoadingToast component with real-time status updates
- Shows summary with loading progress and error count
- Expandable to view individual extension statuses with icons
- Error details shown with 'Ask goose' or 'Copy error' buttons
- Auto-dismisses after 5 seconds when loading completes
- Dismissible during loading for better UX
- Added comprehensive unit tests covering all states
- Extracted shared error handling utilities to extensionErrorUtils.ts
- Optimized toast updates to avoid redundant array creation

Benefits:
- Reduces notification clutter (10+ toasts → 1 grouped notification)
- Provides better visibility into loading progress
- Maintains full error visibility with actionable buttons
- Improves startup experience for users with many extensions
- Better code maintainability with shared utilities

Technical details:
- Uses Radix UI Collapsible for accessible expand/collapse
- Implements toast.update() for real-time progress tracking
- Handles mixed states (loading, success, error) simultaneously
- Robust error message extraction and display
- Clickable notification for easy expand/collapse
- Shared constants (MAX_ERROR_MESSAGE_LENGTH) across components

Signed-off-by: jom-sq <[email protected]>
Copilot AI review requested due to automatic review settings November 3, 2025 14:57
@jom-sq jom-sq force-pushed the jom/feat/grouped-extension-loading-notification branch from e616bf2 to 802805d Compare November 3, 2025 14:57
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +37 to +45
const errMsg = errorMessage(error);
const recoverHints = createExtensionRecoverHints(errMsg);
const msg = formatExtensionErrorMessage(errMsg, 'Failed to add extension');
toastService.error({
title: extensionName,
msg: msg,
traceback: errMsg,
recoverHints,
});
Copy link

Copilot AI Nov 3, 2025

Choose a reason for hiding this comment

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

[nitpick] The variable msg could have a more descriptive name like formattedMsg or displayMsg to better distinguish it from the raw errMsg and improve code clarity about which message is being used where.

Copilot uses AI. Check for mistakes.
@angiejones angiejones merged commit 86c3e42 into block:main Nov 4, 2025
20 checks passed
katzdave added a commit that referenced this pull request Nov 4, 2025
* 'main' of github.com:block/goose:
  Sessions required (#5548)
  feat: add grouped extension loading notification (#5529)
  we should run this on main and also test open models at least via ope… (#5556)
  info: print location of sessions.db via goose info (#5557)
  chore: remove yarn usage from documentation (#5555)
  cli: adjust default theme to address #1905 (#5552)
wpfleger96 added a commit that referenced this pull request Nov 4, 2025
* main: (85 commits)
  improve linux tray icon support (#5425)
  feat: log rotation (#5561)
  use app.isPackaged instead of checking for node env development (#5465)
  disable RPM build-ID generation to prevent package conflicts (#5563)
  Add Diagnostics Info to Q&A and Bug Report Templates (#5565)
  fix: improve server error messages to include HTTP status code (#5532)
  improvement: add useful error message when attempting to use unauthenticated cursor-agent (#5300)
  fix: unblock acp via databricks (#5562)
  feat: add --output-format json flag to goose run command (#5525)
  Sessions required (#5548)
  feat: add grouped extension loading notification (#5529)
  we should run this on main and also test open models at least via ope… (#5556)
  info: print location of sessions.db via goose info (#5557)
  chore: remove yarn usage from documentation (#5555)
  cli: adjust default theme to address #1905 (#5552)
  Manual compaction counting fix + cli cleanup (#5480)
  chore(deps): bump prismjs and react-syntax-highlighter in /ui/desktop (#5549)
  fix: remove qwen3-coder from provider/mcp smoke tests (#5551)
  fix: do not build unsigned desktop app bundles on every PR in ci. add manual option. (#5550)
  fix: update Husky prepare script to v9 format (#5522)
  ...
wpfleger96 added a commit that referenced this pull request Nov 5, 2025
* main: (54 commits)
  add clippy warning for string_slice (#5422)
  improve linux tray icon support (#5425)
  feat: log rotation (#5561)
  use app.isPackaged instead of checking for node env development (#5465)
  disable RPM build-ID generation to prevent package conflicts (#5563)
  Add Diagnostics Info to Q&A and Bug Report Templates (#5565)
  fix: improve server error messages to include HTTP status code (#5532)
  improvement: add useful error message when attempting to use unauthenticated cursor-agent (#5300)
  fix: unblock acp via databricks (#5562)
  feat: add --output-format json flag to goose run command (#5525)
  Sessions required (#5548)
  feat: add grouped extension loading notification (#5529)
  we should run this on main and also test open models at least via ope… (#5556)
  info: print location of sessions.db via goose info (#5557)
  chore: remove yarn usage from documentation (#5555)
  cli: adjust default theme to address #1905 (#5552)
  Manual compaction counting fix + cli cleanup (#5480)
  chore(deps): bump prismjs and react-syntax-highlighter in /ui/desktop (#5549)
  fix: remove qwen3-coder from provider/mcp smoke tests (#5551)
  fix: do not build unsigned desktop app bundles on every PR in ci. add manual option. (#5550)
  ...
fbalicchia pushed a commit to fbalicchia/goose that referenced this pull request Nov 7, 2025
BlairAllan pushed a commit to BlairAllan/goose that referenced this pull request Nov 29, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants