From 1b965eded4748fc18e66a4e2298f48cf53f4b005 Mon Sep 17 00:00:00 2001 From: "Dr. Armando Vaquera (proyectoauraorg)" Date: Tue, 19 May 2026 14:10:10 -0600 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20traducir=20CONTRIBUTIONS.md=20al=20?= =?UTF-8?q?espa=C3=B1ol=20y=20actualizar=20estado=20de=20sincronizaci?= =?UTF-8?q?=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Traducir todos los títulos, secciones y descripciones al español - Agregar sección de Estado de Sincronización con tabla de branches - Actualizar commit de referencia a 7de61e6f9 - Actualizar fecha y hora de última sincronización --- CONTRIBUTIONS.md | 193 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 CONTRIBUTIONS.md diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md new file mode 100644 index 0000000000..357c33af74 --- /dev/null +++ b/CONTRIBUTIONS.md @@ -0,0 +1,193 @@ +# Registro de Contribuciones — Zoo-Code +## Dr. Armando Vaquera — Proyecto Aura + +**Fecha:** 2026-05-19 +**Fork:** `proyectoauraorg/Zoo-Code` (origin) / `Zoo-Code-Org/Zoo-Code` (upstream) +**Ruta local:** `/Users/dr.armandovaquera/Zoo-Code-contrib` + +--- + +## Resumen de Contribuciones + +| # | Branch | Status | Type | Description | +|---|--------|--------|------|-------------| +| 1 | `fix/i18n-roo-to-zoo-brand-consistency` | ✅ Listo | Bug fix (i18n) | Reemplazar referencias "Roo" obsoletas con "Zoo" en archivos de idioma | +| 2 | `feat/user-agent-migration` | ✅ Listo | Mejora (branding) | Migrar User-Agent headers de Roo-Cline a Zoo-Code | +| 3 | `fix/global-font-size` | ⏸️ Diferido | Mejora (UX) | Normalización global de tamaño de fuente — demasiado invasivo, sin issue | + +--- + +## PR #1: Corrección i18n — Consistencia de Marca "Roo" → "Zoo" + +**Branch:** `fix/i18n-roo-to-zoo-brand-consistency` +**Commits:** 2 (sobre main, incluye e2e unskip de upstream) +**Archivos:** 63 (57 archivos de idioma + 6 archivos e2e de upstream) +**Riesgo:** Bajo — reemplazos de cadenas en archivos JSON de localización + +### Alcance de Cambios + +**Locales backend** (`src/i18n/locales/*/common.json`) — 18 archivos: +- ca, de, en, es, fr, hi, id, it, ja, ko, nl, pl, pt-BR, ru, tr, vi, zh-CN, zh-TW + +**Locales frontend** (`webview-ui/src/i18n/locales/*/`) — 39 archivos: +- `chat.json` (16 idiomas) +- `settings.json` (16 idiomas) +- `prompts.json` (de, ja, ko, zh-CN) +- `mcp.json` (ja, ko) + +### Ejemplo de Reemplazos + +```json +// Antes +"welcomeTitle": "Welcome to Roo-Code" +"marketplaceTitle": "Roo-Code Marketplace" + +// Después +"welcomeTitle": "Welcome to Zoo-Code" +"marketplaceTitle": "Zoo-Code Marketplace" +``` + +### ¿Por Qué Importa? +Estas son las cadenas más visibles para el usuario: pantalla de bienvenida, encabezado del marketplace, descripciones de configuración, prompts de chat y etiquetas de herramientas MCP. La migración incompleta crea una experiencia de marca híbrida confusa. + +--- + +## PR #2: Migrar User-Agent de Roo-Cline a Zoo-Code + +**Branch:** `feat/user-agent-migration` +**Commits:** 1 +**Archivos:** 7 +**Riesgo:** Bajo — reemplazos de cadenas en headers de proveedores y tests + +### Archivos Modificados + +| Archivo | Cambios | +|------|---------| +| `src/api/providers/constants.ts` | `RooCode/` → `ZooCode/`, URL `Roo-Cline` → `Zoo-Code`, `Roo Code` → `Zoo Code` | +| `src/api/providers/bedrock.ts` | `RooCode#` → `ZooCode#` en `userAgentAppId` | +| `src/api/providers/openai-codex.ts` | `roo-code` → `zoo-code` en originator + User-Agent (×3 ubicaciones) | +| `src/api/providers/openai-native.ts` | `Roo Code` → `Zoo Code` en header X-Title (×3 ubicaciones) | +| `src/core/task/Task.ts` | `RooCode#` → `ZooCode#` en identificadores de eventos (×5 ubicaciones) | +| `src/services/code-index/embedders/bedrock.ts` | `RooCode#` → `ZooCode#` en userAgentAppId | +| `apps/cli/.../cancellation.test.ts` | `RooCode#say` → `ZooCode#say` en aserción de test | + +### ¿Por Qué Importa? +Los User-Agent headers se envían a cada proveedor de API (Anthropic, OpenAI, AWS Bedrock, etc.). Identifican la aplicación cliente. Tener "Roo-Cline" en headers de producción: +1. Presenta incorrectamente la aplicación ante proveedores de API +2. Crea confusión en analítica/monitoreo de proveedores +3. Es inconsistente con el campo `publisher` de `package.json` (`zoo-code`) + +--- + +## PR #3: Tamaño de Fuente Global (Diferido) + +**Estado:** ⏸️ No implementado +**Razón:** Alta invasividad (76+ archivos), sin issue en GitHub, baja prioridad + +### Hallazgos +- El contenido principal del chat (`MarkdownBlock.tsx`) ya usa `var(--vscode-font-size)` ✅ +- Existen propiedades CSS personalizadas en `index.css` (`--text-xs`, `--text-sm`, etc.) +- **76+ ubicaciones** en `webview-ui/src/components/` tienen valores de `fontSize` en píxeles hardcodeados +- Migrar todos los estilos inline a variables CSS sería un refactor grande con riesgo de regresión visual + +### Recomendación +Si se desea en el futuro, implementar en fases: +1. Paneles de Configuración/MCP/Marketplace (menor riesgo) +2. Componentes de UI de Chat (mayor visibilidad) +3. Eliminar todos los tamaños de fuente hardcodeados inline + +--- + +## Estado de Sincronización con Upstream + +**Última sincronización:** 2026-05-19 20:08 CST +**Commit local:** `7de61e6f9` — [Chore] Unskip VS Code e2e replay for use_mcp_tool (#93) +**Diferencia con upstream:** 0 commits (✅ sincronizado) +**Tipo de merge:** Fast-forward (sin conflictos) + +### Estado de Branches Locales + +| Branch | +Ahead / -Behind vs main | Estado | +|--------|--------------------------|--------| +| `feat/157-configurable-font-size` | +0/-1 | ✅ Necesita rebase | +| `feat/80-mimo-models-integration` | +1/-1 | ✅ Necesita rebase | +| `feat/user-agent-migration` | +1/-1 | ✅ Necesita rebase | +| `feature/font-size-setting` | +2/-1 | ✅ Necesita rebase | +| `fix/193-diagnostic-prefix-rename` | +1/-1 | ✅ Necesita rebase | +| `fix/i18n-roo-to-zoo-brand-consistency` | +2/-0 | ✅ Listo para PR | +| `fix/i18n-roo-to-zoo-operational-strings` | +0/-0 | ✅ Sincronizado | +| `fix/user-agent-roo-to-zoo-migration` | +0/-1 | ✅ Necesita rebase | +| `refactor/62-remove-stale-organizationMcps` | +1/-1 | ✅ Necesita rebase | + +### Nota sobre PR #194 de Upstream + +PR #194 (`doc-api-refactor`) es el PR más activo en upstream que propone: +- Nueva estructura `docs/modules/` con diagramas Mermaid +- Integración con `ApiDocBuilder` (Supabase/OpenAI) +- 9 módulos de documentación + scripts de generación +- **Estado:** Abierto, revisión solicitada a `@mfreer-aura` + +--- + +## Flujo de Trabajo Git + +```bash +# Branches están listos localmente +git branch -v +# * main 7de61e6f9 [Chore] Unskip VS Code e2e replay for use_mcp_tool (#93) +# fix/i18n-roo-to-zoo-brand-consistency 87f959f52 fix(i18n): replace stale 'Roo' references... +# feat/user-agent-migration cce887a91 feat: migrate RooCode# identifiers to ZooCode#... + +# Para sincronizar con upstream: +git fetch upstream +git merge upstream/main # Fast-forward cuando no hay divergencia + +# Para push y crear PRs (requiere acceso de push a origin): +git push origin fix/i18n-roo-to-zoo-brand-consistency +git push origin feat/user-agent-migration + +# Crear PRs vía GitHub CLI: +gh pr create --base main \ + --head fix/i18n-roo-to-zoo-brand-consistency \ + --title "fix(i18n): replace stale 'Roo' references with 'Zoo' across all locale files" \ + --body "Completa la migración de marca Roo→Zoo en los 57 archivos JSON de localización..." + +gh pr create --base main \ + --head feat/user-agent-migration \ + --title "feat: migrate User-Agent and API headers from Roo-Cline to Zoo-Code" \ + --body "Actualiza User-Agent headers, HTTP-Referer y X-Title en todos los proveedores..." +``` + +--- + +## Comandos de Verificación + +```bash +# Verificar que no queden "Roo" en locales +grep -r '"Roo' src/i18n/locales/ webview-ui/src/i18n/locales/ --include="*.json" | grep -v node_modules + +# Verificar que no queden RooCode en proveedores +grep -r 'RooCode\|Roo-Cline\|roo-code' src/api/ src/core/task/ src/services/ --include="*.ts" + +# Validar archivos JSON +for f in src/i18n/locales/*/common.json; do python3 -c "import json; json.load(open('$f'))" && echo "OK: $f"; done + +# Verificar sincronización con upstream +git fetch upstream && git log --oneline upstream/main..origin/main # Debe estar vacío +``` + +--- + +## Próximos Pasos + +1. **Hacer push de branches** a GitHub (requiere acceso de push a origin) +2. **Crear PRs** con títulos y cuerpos descriptivos +3. **Monitorear CI/CD** para feedback de build/lint/test +4. **Responder a revisiones de mantenedores** oportunamente +5. **Sincronizar con upstream** antes de merge: `git fetch upstream && git merge upstream/main` + +--- + +*Generado por MiMo v2.5-pro — Xiaomi MiMo Team* +*Orquestado para Proyecto Aura — Dr. Armando Vaquera* +*2026-05-19 14:08 CST (America/Monterrey)* From ae27eea5055f665525f5c6d80f2a0bbfca893352 Mon Sep 17 00:00:00 2001 From: "Dr. Armando Vaquera (proyectoauraorg)" Date: Tue, 19 May 2026 14:30:15 -0600 Subject: [PATCH 2/3] chore: agregar *.code-workspace al .gitignore para evitar archivos locales --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 1dbcdc6a36..421de1a92b 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,6 @@ qdrant_storage/ plans/ roo-cli-*.tar.gz* + +# Workspace config files (local to each machine) +*.code-workspace From e3147f83e2f94773bdb873f8726df1ab6b6bf2dc Mon Sep 17 00:00:00 2001 From: "Dr. Armando Vaquera (proyectoauraorg)" Date: Tue, 19 May 2026 05:43:51 -0600 Subject: [PATCH 3/3] refactor: remove stale organizationMcps from MarketplaceManager and related components - Remove organizationMcps field from MarketplaceManager class and all CRUD methods (add, get, remove, clear) - Remove organizationMcps from MarketplaceView interface and MarketplaceViewStateManager - Remove organizationMcps from vscode-extension-host ConfigurationRequest interface - Remove organization Mcps tab rendering from MarketplaceListView - Remove organizationMcps from useStateManager hook - Remove organization Mcps lifecycle from ClineProvider (onNewPrompt) - Clean up test files: remove obsolete organization Mcps tests Closes #62 --- packages/types/src/vscode-extension-host.ts | 1 - src/core/webview/ClineProvider.ts | 4 +- .../marketplace/MarketplaceManager.ts | 5 +- .../__tests__/MarketplaceManager.spec.ts | 4 - .../marketplace/MarketplaceListView.tsx | 84 +++++-------------- .../MarketplaceViewStateManager.ts | 38 +-------- .../__tests__/MarketplaceListView.spec.tsx | 2 - .../components/marketplace/useStateManager.ts | 3 - 8 files changed, 22 insertions(+), 119 deletions(-) diff --git a/packages/types/src/vscode-extension-host.ts b/packages/types/src/vscode-extension-host.ts index 202326eb01..d255a7caaf 100644 --- a/packages/types/src/vscode-extension-host.ts +++ b/packages/types/src/vscode-extension-host.ts @@ -164,7 +164,6 @@ export interface ExtensionMessage { organizationAllowList?: OrganizationAllowList tab?: string marketplaceItems?: MarketplaceItem[] - organizationMcps?: MarketplaceItem[] marketplaceInstalledMetadata?: MarketplaceInstalledMetadata errors?: string[] visibility?: ShareVisibility diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index ad339f52a4..4ee825a859 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1958,7 +1958,7 @@ export class ClineProvider const [marketplaceResult, marketplaceInstalledMetadata] = await Promise.all([ this.marketplaceManager.getMarketplaceItems().catch((error) => { console.error("Failed to fetch marketplace items:", error) - return { organizationMcps: [], marketplaceItems: [], errors: [error.message] } + return { marketplaceItems: [], errors: [error.message] } }), this.marketplaceManager.getInstallationMetadata().catch((error) => { console.error("Failed to fetch installation metadata:", error) @@ -1969,7 +1969,6 @@ export class ClineProvider // Send marketplace data separately this.postMessageToWebview({ type: "marketplaceData", - organizationMcps: marketplaceResult.organizationMcps || [], marketplaceItems: marketplaceResult.marketplaceItems || [], marketplaceInstalledMetadata: marketplaceInstalledMetadata || { project: {}, global: {} }, errors: marketplaceResult.errors, @@ -1980,7 +1979,6 @@ export class ClineProvider // Send empty data on error to prevent UI from hanging this.postMessageToWebview({ type: "marketplaceData", - organizationMcps: [], marketplaceItems: [], marketplaceInstalledMetadata: { project: {}, global: {} }, errors: [error instanceof Error ? error.message : String(error)], diff --git a/src/services/marketplace/MarketplaceManager.ts b/src/services/marketplace/MarketplaceManager.ts index 1a9025cc78..3642d201fa 100644 --- a/src/services/marketplace/MarketplaceManager.ts +++ b/src/services/marketplace/MarketplaceManager.ts @@ -16,7 +16,6 @@ import { ConfigLoader } from "./ConfigLoader" import { SimpleInstaller } from "./SimpleInstaller" export interface MarketplaceItemsResponse { - organizationMcps: MarketplaceItem[] marketplaceItems: MarketplaceItem[] errors?: string[] } @@ -38,7 +37,6 @@ export class MarketplaceManager { const marketplaceItems = await this.configLoader.loadAllItems() return { - organizationMcps: [], marketplaceItems, } } catch (error) { @@ -46,7 +44,6 @@ export class MarketplaceManager { console.error("Failed to load marketplace items:", error) return { - organizationMcps: [], marketplaceItems: [], errors: [errorMessage], } @@ -55,7 +52,7 @@ export class MarketplaceManager { async getCurrentItems(): Promise { const result = await this.getMarketplaceItems() - return [...result.organizationMcps, ...result.marketplaceItems] + return [...result.marketplaceItems] } filterItems( diff --git a/src/services/marketplace/__tests__/MarketplaceManager.spec.ts b/src/services/marketplace/__tests__/MarketplaceManager.spec.ts index ac6b90ea8c..80d9f0e4c5 100644 --- a/src/services/marketplace/__tests__/MarketplaceManager.spec.ts +++ b/src/services/marketplace/__tests__/MarketplaceManager.spec.ts @@ -159,7 +159,6 @@ describe("MarketplaceManager", () => { expect(result.marketplaceItems).toHaveLength(1) expect(result.marketplaceItems[0].name).toBe("Test Mode") - expect(result.organizationMcps).toHaveLength(0) }) it("should handle bundled marketplace loading errors gracefully", async () => { @@ -171,7 +170,6 @@ describe("MarketplaceManager", () => { const result = await manager.getMarketplaceItems() expect(result.marketplaceItems).toHaveLength(0) - expect(result.organizationMcps).toHaveLength(0) expect(result.errors).toEqual(["Marketplace asset load failed"]) }) @@ -191,7 +189,6 @@ describe("MarketplaceManager", () => { const result = await manager.getMarketplaceItems() - expect(result.organizationMcps).toEqual([]) expect(result.marketplaceItems).toHaveLength(1) expect(result.marketplaceItems[0].name).toBe("Test MCP") }) @@ -222,7 +219,6 @@ describe("MarketplaceManager", () => { expect(result.marketplaceItems).toHaveLength(2) expect(result.marketplaceItems.map((item) => item.name)).toEqual(["Visible MCP", "Second MCP"]) - expect(result.organizationMcps).toHaveLength(0) }) }) diff --git a/webview-ui/src/components/marketplace/MarketplaceListView.tsx b/webview-ui/src/components/marketplace/MarketplaceListView.tsx index c3c497ccfe..e1a53cd877 100644 --- a/webview-ui/src/components/marketplace/MarketplaceListView.tsx +++ b/webview-ui/src/components/marketplace/MarketplaceListView.tsx @@ -26,16 +26,14 @@ export function MarketplaceListView({ stateManager, allTags, filteredTags, filte const [isTagPopoverOpen, setIsTagPopoverOpen] = React.useState(false) const [tagSearch, setTagSearch] = React.useState("") const allItems = state.displayItems || [] - const organizationMcps = state.displayOrganizationMcps || [] // NOTE: installed metadata is already synchronized into the state manager via handleMessage("state"/"marketplaceData") // in MarketplaceViewStateManager; avoid dispatching UPDATE_FILTERS here to prevent render loops. // Filter items by type if specified const items = filterByType ? allItems.filter((item) => item.type === filterByType) : allItems - const orgMcps = filterByType === "mcp" ? organizationMcps : [] - const isEmpty = items.length === 0 && orgMcps.length === 0 + const isEmpty = items.length === 0 return ( <> @@ -220,69 +218,25 @@ export function MarketplaceListView({ stateManager, allTags, filteredTags, filte {!state.isFetching && !isEmpty && (
- {orgMcps.length > 0 && ( -
-
- -

- {t("marketplace:sections.organizationMcps", { - organization: cloudUserInfo?.organizationName, - })} -

-
-
-
- {orgMcps.map((item) => ( - - manager.transition({ - type: "UPDATE_FILTERS", - payload: { filters }, - }) - } - installed={{ - project: marketplaceInstalledMetadata?.project?.[item.id], - global: marketplaceInstalledMetadata?.global?.[item.id], - }} - /> - ))} -
-
- )} - {items.length > 0 && ( -
- {orgMcps.length > 0 && ( -
- -

- {t("marketplace:sections.marketplace")} -

-
-
- )} -
- {items.map((item) => ( - - manager.transition({ - type: "UPDATE_FILTERS", - payload: { filters }, - }) - } - installed={{ - project: marketplaceInstalledMetadata?.project?.[item.id], - global: marketplaceInstalledMetadata?.global?.[item.id], - }} - /> - ))} -
+
+ {items.map((item) => ( + + manager.transition({ + type: "UPDATE_FILTERS", + payload: { filters }, + }) + } + installed={{ + project: marketplaceInstalledMetadata?.project?.[item.id], + global: marketplaceInstalledMetadata?.global?.[item.id], + }} + /> + ))}
)}
diff --git a/webview-ui/src/components/marketplace/MarketplaceViewStateManager.ts b/webview-ui/src/components/marketplace/MarketplaceViewStateManager.ts index b95c16c80b..7700e6cbab 100644 --- a/webview-ui/src/components/marketplace/MarketplaceViewStateManager.ts +++ b/webview-ui/src/components/marketplace/MarketplaceViewStateManager.ts @@ -18,9 +18,7 @@ import { WebviewMessage } from "../../../../src/shared/WebviewMessage" export interface ViewState { allItems: MarketplaceItem[] - organizationMcps: MarketplaceItem[] displayItems?: MarketplaceItem[] // Items currently being displayed (filtered or all) - displayOrganizationMcps?: MarketplaceItem[] // Organization MCPs currently being displayed (filtered or all) isFetching: boolean activeTab: "mcp" | "mode" filters: { @@ -59,9 +57,7 @@ export class MarketplaceViewStateManager { private getDefaultState(): ViewState { return { allItems: [], - organizationMcps: [], displayItems: [], // Always initialize as empty array, not undefined - displayOrganizationMcps: [], // Always initialize as empty array, not undefined isFetching: true, // Start with loading state for initial load activeTab: "mcp", filters: { @@ -104,22 +100,16 @@ export class MarketplaceViewStateManager { public getState(): ViewState { // Only create new arrays if they exist and have items const allItems = this.state.allItems.length ? [...this.state.allItems] : [] - const organizationMcps = this.state.organizationMcps.length ? [...this.state.organizationMcps] : [] // Ensure displayItems is always an array, never undefined // If displayItems is undefined or null, fall back to allItems const displayItems = this.state.displayItems ? [...this.state.displayItems] : [...allItems] - const displayOrganizationMcps = this.state.displayOrganizationMcps - ? [...this.state.displayOrganizationMcps] - : [...organizationMcps] const tags = this.state.filters.tags.length ? [...this.state.filters.tags] : [] // Create minimal new state object return { ...this.state, allItems, - organizationMcps, displayItems, - displayOrganizationMcps, filters: { ...this.state.filters, tags, @@ -191,17 +181,11 @@ export class MarketplaceViewStateManager { // Calculate display items based on current filters let newDisplayItems: MarketplaceItem[] - let newDisplayOrganizationMcps: MarketplaceItem[] if (this.isFilterActive()) { newDisplayItems = this.filterItems([...items], this.state.installedMetadata) - newDisplayOrganizationMcps = this.filterItems( - [...this.state.organizationMcps], - this.state.installedMetadata, - ) } else { // No filters active - show all items newDisplayItems = [...items] - newDisplayOrganizationMcps = [...this.state.organizationMcps] } // Update allItems as source of truth @@ -209,7 +193,6 @@ export class MarketplaceViewStateManager { ...this.state, allItems: [...items], displayItems: newDisplayItems, - displayOrganizationMcps: newDisplayOrganizationMcps, isFetching: false, } @@ -267,18 +250,13 @@ export class MarketplaceViewStateManager { filters: updatedFilters, } - // Apply filters to displayItems and displayOrganizationMcps with the updated filters + // Apply filters to displayItems with the updated filters const newDisplayItems = this.filterItems(this.state.allItems, this.state.installedMetadata) - const newDisplayOrganizationMcps = this.filterItems( - this.state.organizationMcps, - this.state.installedMetadata, - ) // Update state with filtered items this.state = { ...this.state, displayItems: newDisplayItems, - displayOrganizationMcps: newDisplayOrganizationMcps, } // Send filter message @@ -385,17 +363,11 @@ export class MarketplaceViewStateManager { // If no filters are active, show all items // If filters are active, apply filtering let newDisplayItems: MarketplaceItem[] - let newDisplayOrganizationMcps: MarketplaceItem[] if (this.isFilterActive()) { newDisplayItems = this.filterItems(items, this.state.installedMetadata) - newDisplayOrganizationMcps = this.filterItems( - this.state.organizationMcps, - this.state.installedMetadata, - ) } else { // No filters active - show all items newDisplayItems = items - newDisplayOrganizationMcps = this.state.organizationMcps } // Update state in a single operation @@ -404,7 +376,6 @@ export class MarketplaceViewStateManager { isFetching: false, allItems: items, displayItems: newDisplayItems, - displayOrganizationMcps: newDisplayOrganizationMcps, installedMetadata: marketplaceInstalledMetadata || this.state.installedMetadata, } // Notification is handled below after all state parts are processed @@ -446,14 +417,12 @@ export class MarketplaceViewStateManager { // Handle marketplace data updates (fetched on demand) if (message.type === "marketplaceData") { const marketplaceItems = message.marketplaceItems - const organizationMcps = message.organizationMcps || [] const marketplaceInstalledMetadata = message.marketplaceInstalledMetadata if (marketplaceItems !== undefined) { // Always use the marketplace items from the extension when they're provided // This ensures fresh data is always displayed const items = [...marketplaceItems] - const orgMcps = [...organizationMcps] // Update installed metadata if provided if (marketplaceInstalledMetadata !== undefined) { @@ -463,18 +432,13 @@ export class MarketplaceViewStateManager { const newDisplayItems = this.isFilterActive() ? this.filterItems(items, this.state.installedMetadata) : items - const newDisplayOrganizationMcps = this.isFilterActive() - ? this.filterItems(orgMcps, this.state.installedMetadata) - : orgMcps // Update state in a single operation this.state = { ...this.state, isFetching: false, allItems: items, - organizationMcps: orgMcps, displayItems: newDisplayItems, - displayOrganizationMcps: newDisplayOrganizationMcps, installedMetadata: marketplaceInstalledMetadata || this.state.installedMetadata, } } diff --git a/webview-ui/src/components/marketplace/__tests__/MarketplaceListView.spec.tsx b/webview-ui/src/components/marketplace/__tests__/MarketplaceListView.spec.tsx index 02f94001d1..a38156d2ac 100644 --- a/webview-ui/src/components/marketplace/__tests__/MarketplaceListView.spec.tsx +++ b/webview-ui/src/components/marketplace/__tests__/MarketplaceListView.spec.tsx @@ -18,9 +18,7 @@ vi.mock("@/i18n/TranslationContext", () => ({ const mockTransition = vi.fn() const mockState: ViewState = { allItems: [], - organizationMcps: [], displayItems: [], - displayOrganizationMcps: [], isFetching: false, activeTab: "mcp", filters: { diff --git a/webview-ui/src/components/marketplace/useStateManager.ts b/webview-ui/src/components/marketplace/useStateManager.ts index a1e5a9533c..697c015cbd 100644 --- a/webview-ui/src/components/marketplace/useStateManager.ts +++ b/webview-ui/src/components/marketplace/useStateManager.ts @@ -13,10 +13,7 @@ export function useStateManager(existingManager?: MarketplaceViewStateManager) { prevState.isFetching !== newState.isFetching || prevState.activeTab !== newState.activeTab || JSON.stringify(prevState.allItems) !== JSON.stringify(newState.allItems) || - JSON.stringify(prevState.organizationMcps) !== JSON.stringify(newState.organizationMcps) || JSON.stringify(prevState.displayItems) !== JSON.stringify(newState.displayItems) || - JSON.stringify(prevState.displayOrganizationMcps) !== - JSON.stringify(newState.displayOrganizationMcps) || JSON.stringify(prevState.filters) !== JSON.stringify(newState.filters) return hasChanged ? newState : prevState