Skip to content

feat: Extension Catalog — GUI-driven extension management for sandboxes#6

Open
mafueee wants to merge 10 commits intofeat/gui-full-controlfrom
feat/extensions-catalog
Open

feat: Extension Catalog — GUI-driven extension management for sandboxes#6
mafueee wants to merge 10 commits intofeat/gui-full-controlfrom
feat/extensions-catalog

Conversation

@mafueee
Copy link
Copy Markdown
Owner

@mafueee mafueee commented Mar 27, 2026

🧩 Extensions Catalog

This PR adds a GUI-driven extension management system for NemoClaw sandboxes, enabling users to browse, install, and uninstall integrations (Discord, Telegram, Slack, Docker Hub, Hugging Face, Jira, npm, PyPI, Outlook) directly from the dashboard.

What's New

Registry (nemoclaw-blueprint/extensions/registry.json)

  • 9 extensions covering messaging, dev tools, registries, and productivity categories
  • Each extension maps to existing policy presets and defines optional install commands

Backend API (gui/server/routes/extensions.js)

  • GET /api/extensions — List all extensions with install status per sandbox
  • GET /api/extensions/:id — Get extension detail
  • POST /api/extensions/install — Apply policy + credentials + in-sandbox packages via ExecSandbox gRPC
  • POST /api/extensions/uninstall — Remove policy and clean up

Frontend (gui/src/components/extensions/ExtensionCatalog.tsx)

  • Card-based grid layout with category filtering tabs
  • Sandbox selector dropdown (auto-selects first running sandbox)
  • Credential input modal for token-requiring extensions
  • Real-time step-by-step install/uninstall progress feedback
  • Responsive design (mobile/tablet/desktop)

Integration (gui/src/App.tsx)

  • New 🧩 Extensions entry in the Configuration section of the sidebar
  • Route at /extensions rendering ExtensionCatalog

Tests (test/extensions.test.js)

  • 9 unit tests validating registry integrity, field presence, uniqueness, preset file references, categories, and credential structure

Documentation (README.md)

  • New "Extensions" section with available extensions table, "How It Works" guide, and "Adding Custom Extensions" reference
  • Updated architecture description and features table

Remaining local-only changes

The following small changes need to be applied manually when merging:

gui/server/index.js — Add import and mount:

import extensionRoutes from './routes/extensions.js';
// ...
app.use(extensionRoutes);

gui/src/index.css — Add extension catalog CSS styles (approx. 500 lines of .ext-* classes at the bottom of the file)

Verification

  • ✅ All 9 unit tests pass (npx vitest run test/extensions.test.js)
  • GET /api/extensions returns 9 extensions with correct metadata
  • ✅ Frontend builds cleanly (npm run build)

mafueee added 10 commits March 27, 2026 11:49
…registry JSON with 9 integrations (Discord, Telegram, Slack, Docker, HuggingFace, Jira, npm, PyPI, Outlook)\n- Unit tests validating registry structure, preset references, categories, and credentials
…stry policies\n\n- Replace gRPC updateConfig with CLI openshell policy set (fixes\n 'filesystem policy cannot be removed on a live sandbox' error)\n- Auto-apply PyPI/npm registry policies before pip/npm install commands\n- Make install commands advisory (non-fatal) — extension is installed\n when policy+credential steps succeed\n- Update install commands to use python3 -m pip with pip3 fallback
Pre-install discord.py, python-telegram-bot, slack-sdk, huggingface-hub
into the sandbox Docker image so they're available immediately without
needing pip to reach PyPI through the sandbox proxy.
Discord, Telegram, and Slack extensions now include a channelName field
used by the install route to run 'openclaw channels add' inside the sandbox.
Extension install now runs 'openclaw channels add --channel <name> --token <token>'
inside the sandbox for messaging extensions (Discord, Telegram, Slack).
This registers the channel with OpenClaw's gateway for native agent messaging.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant