add extensions settings page and context panel widget#8540
Conversation
Replace the placeholder MCP Servers widget with a fully functional Extensions system. Users can view, search, add, edit, enable/disable, and delete extensions directly from Settings. The context panel shows active extensions. Backend uses config_key from YAML for reliable operations instead of re-deriving keys from display names. Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Add inline search filtering, max-height with overflow scroll, and increased row spacing to the context panel extensions widget. Remove focus ring from the search input. Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Address 11 edge cases from QA review: - Toast notifications on toggle/save/delete failures - Use config_key as React key to prevent wrong-item bugs - Disable Save button when required fields are empty - Prevent double-click duplicate submissions - Guard against missing description in search filters - Detect name collisions when adding extensions - Show "no results" message for empty search - Refresh widget on window focus after settings changes - Stable IDs for env var rows to prevent value scrambling - Handle SSE extensions gracefully in edit modal - Backend remove_extension returns error if key not found Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Align nameToKey JS/Rust logic, extract shared getDisplayName helper, replace raw HTML elements with design system components, add ghost variant to Input, fix untranslated aria-label, and remove dead i18n key. Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d0089d592b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Always remove old entry by config_key on edit (not just rename) to prevent duplicates when config_key diverges from nameToKey(name). Make modal submit/delete async with try/finally to reset isSaving. Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 543d0d91bb
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ries Spread original extension fields when saving edits to preserve headers, env_keys, and other fields not exposed in the modal. Reverse save order to add-then-remove so a failed write never deletes the original config. Skip non-object YAML entries in list_extensions to prevent frontend crashes. Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 10331f1a5b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Restrict the edit button to stdio and streamable_http extensions to prevent corrupting unsupported types like frontend or inline_python. Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 139dc016c5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Filter out malformed extension entries that lack a type field to prevent frontend crashes, and default enabled to false if absent. Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 08a599cc5f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Category: new-feature
User Impact: Users can now view, search, add, edit, enable/disable, and delete MCP extensions directly from the Goose desktop app settings and see active extensions in the chat side panel.
Problem: The Tauri app had no way to manage extensions. Users had to manually edit
config.yamlto add, remove, or configure MCP extensions — a workflow that's error-prone and invisible to non-technical users.Solution: Built an end-to-end extensions management feature with a settings page for full CRUD operations and a lightweight chat widget showing active extensions. The backend reads/writes raw YAML mappings to preserve existing config structure, and the frontend uses
config_key(the actual YAML key) for all operations to avoid lossy name-to-key conversions.Note: Initial UI interface. May need logic redesign.
File changes
ui/goose2/src-tauri/src/commands/extensions.rs
New Tauri commands for listing, adding, removing, and toggling extensions. Includes YAML-to-JSON conversion utilities and a
name_to_keyfunction for generating config keys from display names.ui/goose2/src-tauri/src/commands/mod.rs
Registers the new extensions command module.
ui/goose2/src-tauri/src/lib.rs
Wires up the four extension commands in the Tauri handler macro.
ui/goose2/src-tauri/src/services/goose_config.rs
Adds
get_extensions_raw()andset_extensions_raw()methods to read/write the extensions section ofconfig.yamlas raw YAML mappings.ui/goose2/src/features/extensions/types.ts
Defines TypeScript types for all extension config variants (stdio, builtin, streamable_http, sse) and the shared
getDisplayNamehelper.ui/goose2/src/features/extensions/api/extensions.ts
Frontend API layer wrapping Tauri
invoke()calls, plus anameToKeyutility aligned with the Rust backend.ui/goose2/src/features/extensions/ui/ExtensionsSettings.tsx
Main settings page component with search, sorted extension lists (enabled/available), and handlers for toggle, add, edit, rename, and delete with toast error feedback and name collision detection.
ui/goose2/src/features/extensions/ui/ExtensionItem.tsx
Individual extension row component with toggle switch, type badge, and configure button for non-bundled extensions.
ui/goose2/src/features/extensions/ui/ExtensionModal.tsx
Add/edit modal for extensions supporting stdio and HTTP types, environment variables, timeout, and delete. Includes save-in-progress state to prevent double submissions.
ui/goose2/src/features/chat/ui/widgets/ExtensionsWidget.tsx
Chat context panel widget showing enabled extensions with inline search, auto-refresh on window focus, and scrollable list.
ui/goose2/src/features/chat/ui/ContextPanel.tsx
Swaps the placeholder
McpServersWidgetfor the newExtensionsWidget.ui/goose2/src/features/chat/ui/widgets/McpServersWidget.tsx
Removed — replaced by ExtensionsWidget.
ui/goose2/src/features/settings/ui/SettingsModal.tsx
Adds "Extensions" to the settings navigation sidebar.
ui/goose2/src/shared/ui/input.tsx
Adds a
ghostvariant to the Input component for borderless, ring-free inline inputs.ui/goose2/src/shared/i18n/locales/en/chat.json
New translation keys for the extensions widget (title, search, empty states).
ui/goose2/src/shared/i18n/locales/en/settings.json
New translation keys for the extensions settings page (fields, types, errors, nav).
ui/goose2/src/shared/i18n/locales/es/chat.json
Spanish translations for the extensions widget.
ui/goose2/src/shared/i18n/locales/es/settings.json
Spanish translations for the extensions settings page.
Reproduction Steps
pnpm tauri devfromui/goose2)