diff --git a/src/features/agents/ui/AgentDetailPage.tsx b/src/features/agents/ui/AgentDetailPage.tsx index 034a56624..720dcf6fb 100644 --- a/src/features/agents/ui/AgentDetailPage.tsx +++ b/src/features/agents/ui/AgentDetailPage.tsx @@ -21,8 +21,6 @@ import { Badge } from "@/shared/ui/badge"; import { Button } from "@/shared/ui/button"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/shared/ui/tooltip"; import { SIDEBAR_RAISED_MENU_CONTENT_CLASS } from "@/shared/ui/sidebar-tokens"; -import { useExperiment } from "@/features/experiments/experimentPreferences"; -import { AGENT_SHARE_CARD_EXPERIMENT_ID } from "@/features/experiments/experimentDefinitions"; import { DropdownMenu, DropdownMenuContent, @@ -108,8 +106,6 @@ export function AgentDetailPage({ onAvatarUpdate, }: AgentDetailPageProps) { const { t } = useTranslation(["agents", "common"]); - const shareCardEnabled = - useExperiment(AGENT_SHARE_CARD_EXPERIMENT_ID)?.enabled === true; const acpProviders = useAgentStore((s) => s.providers); const isEditable = canEditPersona(persona); const isDeletable = canDeletePersona(persona); @@ -354,7 +350,7 @@ export function AgentDetailPage({ {t("common:actions.duplicate")} - {shareCardEnabled && onShare ? ( + {onShare ? ( onShare(persona)}> {t("share.action")} diff --git a/src/features/agents/ui/AgentsView.tsx b/src/features/agents/ui/AgentsView.tsx index 521798cb2..aa6309366 100644 --- a/src/features/agents/ui/AgentsView.tsx +++ b/src/features/agents/ui/AgentsView.tsx @@ -48,8 +48,6 @@ import { canDeletePersona } from "@/features/agents/lib/personaPresentation"; import { runAgentViewTransition } from "@/features/agents/lib/agentViewTransitions"; import { deleteDraftAgentSession } from "@/features/agents/lib/agentBuilderSession"; import type { AppNavigationUpdateOptions } from "@/app/types/appNavigation"; -import { useExperiment } from "@/features/experiments/experimentPreferences"; -import { AGENT_SHARE_CARD_EXPERIMENT_ID } from "@/features/experiments/experimentDefinitions"; function decodeImportFileBytes(fileBytes: Uint8Array): string { try { @@ -105,8 +103,6 @@ export function AgentsView({ onDeleteDraftSession, }: AgentsViewProps = {}) { const { t } = useTranslation(["agents", "common"]); - const shareCardEnabled = - useExperiment(AGENT_SHARE_CARD_EXPERIMENT_ID)?.enabled === true; const isActivePersonaControlled = activePersonaId !== undefined; const [deletingPersona, setDeletingPersona] = useState(null); const [sharingPersonaId, setSharingPersonaId] = useState(null); @@ -517,7 +513,7 @@ export function AgentsView({ - {shareCardEnabled && sharingPersona ? ( + {sharingPersona ? ( {dialogs} @@ -573,7 +569,7 @@ export function AgentsView({ onDuplicatePersona={handleDuplicatePersona} onDeletePersona={handleDeletePersona} onExportPersona={handleExportPersona} - onSharePersona={shareCardEnabled ? handleSharePersona : undefined} + onSharePersona={handleSharePersona} onCreatePersona={handleCreatePersona} onImportAgentImage={() => setImportDialogOpen(true)} onContinueDraft={handleContinueDraft} diff --git a/src/features/agents/ui/PersonaCard.tsx b/src/features/agents/ui/PersonaCard.tsx index 3763ec8cd..e63bd85d5 100644 --- a/src/features/agents/ui/PersonaCard.tsx +++ b/src/features/agents/ui/PersonaCard.tsx @@ -27,8 +27,6 @@ import { } from "@/features/agents/lib/personaPresentation"; import { resolveAgentIcon } from "@/features/agents/lib/resolveAgentIcon"; import { getAgentAvatarTransitionName } from "@/features/agents/lib/agentViewTransitions"; -import { useExperiment } from "@/features/experiments/experimentPreferences"; -import { AGENT_SHARE_CARD_EXPERIMENT_ID } from "@/features/experiments/experimentDefinitions"; interface PersonaCardProps { persona: Persona; @@ -67,8 +65,6 @@ export const PersonaCard = memo(function PersonaCard({ isActive = false, }: PersonaCardProps) { const { t } = useTranslation(["agents", "common"]); - const shareCardEnabled = - useExperiment(AGENT_SHARE_CARD_EXPERIMENT_ID)?.enabled === true; const [menuOpen, setMenuOpen] = useState(false); const [readyAnimatedAvatarSrc, setReadyAnimatedAvatarSrc] = useState< string | null @@ -146,7 +142,7 @@ export const PersonaCard = memo(function PersonaCard({ {t("common:actions.duplicate")} - {shareCardEnabled && onShare ? ( + {onShare ? ( onShare(persona)}> {t("share.action")} diff --git a/src/features/agents/ui/__tests__/AgentsView.entry.test.tsx b/src/features/agents/ui/__tests__/AgentsView.entry.test.tsx index ffe2db263..c68326e80 100644 --- a/src/features/agents/ui/__tests__/AgentsView.entry.test.tsx +++ b/src/features/agents/ui/__tests__/AgentsView.entry.test.tsx @@ -11,8 +11,6 @@ import { readFileSync } from "node:fs"; import { resolve } from "node:path"; import { useAgentStore } from "@/features/agents/stores/agentStore"; import { useChatSessionStore } from "@/features/chat/stores/chatSessionStore"; -import { setExperimentEnabled } from "@/features/experiments/experimentPreferences"; -import { AGENT_SHARE_CARD_EXPERIMENT_ID } from "@/features/experiments/experimentDefinitions"; import { toast } from "sonner"; import { AgentsView } from "../AgentsView"; @@ -160,7 +158,6 @@ describe("AgentsView entry points", () => { beforeEach(() => { vi.clearAllMocks(); - setExperimentEnabled(AGENT_SHARE_CARD_EXPERIMENT_ID, true); useAgentStore.setState({ personas: [], personasLoading: false, @@ -194,7 +191,7 @@ describe("AgentsView entry points", () => { expect(mockCreatePersona).not.toHaveBeenCalled(); }); - it("hides share-card actions when the experiment is toggled off", async () => { + it("shows share-card actions", async () => { useAgentStore.setState({ personas: [persona] }); const user = userEvent.setup(); @@ -202,24 +199,28 @@ describe("AgentsView entry points", () => { await user.click( screen.getByRole("button", { name: "detail.moreActions" }), ); + expect( screen.getByRole("menuitem", { name: "share.action" }), ).toBeInTheDocument(); - await user.keyboard("{Escape}"); + expect( + screen.queryByRole("menuitem", { name: "common:actions.export" }), + ).not.toBeInTheDocument(); + }); - act(() => { - setExperimentEnabled(AGENT_SHARE_CARD_EXPERIMENT_ID, false); - }); - await user.click( - screen.getByRole("button", { name: "detail.moreActions" }), - ); + it("opens the share dialog from a gallery card", async () => { + useAgentStore.setState({ personas: [persona] }); + const user = userEvent.setup(); + + render(); + await user.click(screen.getByRole("button", { name: "card.options" })); expect( - screen.queryByRole("menuitem", { name: "share.action" }), + screen.queryByRole("menuitem", { name: "common:actions.export" }), ).not.toBeInTheDocument(); - expect( - screen.getByRole("menuitem", { name: "common:actions.export" }), - ).toBeInTheDocument(); + await user.click(screen.getByRole("menuitem", { name: "share.action" })); + + expect(screen.getByText("share.title")).toBeInTheDocument(); }); it("opens a no-write preview when selecting a compatible PNG", async () => { diff --git a/src/features/agents/ui/__tests__/PersonaCard.test.tsx b/src/features/agents/ui/__tests__/PersonaCard.test.tsx index f568e624f..23650bcfb 100644 --- a/src/features/agents/ui/__tests__/PersonaCard.test.tsx +++ b/src/features/agents/ui/__tests__/PersonaCard.test.tsx @@ -2,8 +2,6 @@ import { beforeEach, describe, it, expect, vi } from "vitest"; import { fireEvent, render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { resetHomeWidgetStoreForTests } from "@/features/home/stores/homeWidgetStore"; -import { setExperimentEnabled } from "@/features/experiments/experimentPreferences"; -import { AGENT_SHARE_CARD_EXPERIMENT_ID } from "@/features/experiments/experimentDefinitions"; import { PersonaCard } from "../PersonaCard"; import type { Persona } from "@/shared/types/agents"; @@ -224,8 +222,7 @@ describe("PersonaCard", () => { ).toBeInTheDocument(); }); - it("calls onShare from the options menu when share cards are enabled", async () => { - setExperimentEnabled(AGENT_SHARE_CARD_EXPERIMENT_ID, true); + it("calls onShare from the options menu", async () => { const onShare = vi.fn(); const user = userEvent.setup(); const persona = makePersona(); @@ -237,19 +234,13 @@ describe("PersonaCard", () => { expect(onShare).toHaveBeenCalledWith(persona); }); - it("restores Export when share cards are disabled", async () => { - setExperimentEnabled(AGENT_SHARE_CARD_EXPERIMENT_ID, false); + it("shows Export when no share handler is provided", async () => { const onExport = vi.fn(); const user = userEvent.setup(); const persona = makePersona(); - render( - , - ); + render(); await user.click(screen.getByRole("button", { name: /agent options/i })); - expect( - screen.queryByRole("menuitem", { name: /share agent/i }), - ).not.toBeInTheDocument(); await user.click(screen.getByRole("menuitem", { name: /export/i })); expect(onExport).toHaveBeenCalledWith(persona); diff --git a/src/features/experiments/__tests__/ExperimentsSettings.test.tsx b/src/features/experiments/__tests__/ExperimentsSettings.test.tsx index e24446a8e..faa6e98c4 100644 --- a/src/features/experiments/__tests__/ExperimentsSettings.test.tsx +++ b/src/features/experiments/__tests__/ExperimentsSettings.test.tsx @@ -3,7 +3,6 @@ import userEvent from "@testing-library/user-event"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { - AGENT_SHARE_CARD_EXPERIMENT_ID, AVATAR_COLLECTION_PAGE_EXPERIMENT_ID, BERDY_ONBOARDING_EXPERIMENT_ID, BUILDERBOT_SURFACE_EXPERIMENT_ID, @@ -134,7 +133,6 @@ describe("ExperimentsSettings", () => { BUILDERBOT_SURFACE_EXPERIMENT_ID, TRANSCRIPT_VIRTUAL_RENDERER_EXPERIMENT_ID, SKILL_DISCOVERY_EXPERIMENT_ID, - AGENT_SHARE_CARD_EXPERIMENT_ID, STARTER_TASKS_EXPERIMENT_ID, VOICE_CONVERSATION_EXPERIMENT_ID, AVATAR_COLLECTION_PAGE_EXPERIMENT_ID, diff --git a/src/features/experiments/experimentDefinitions.ts b/src/features/experiments/experimentDefinitions.ts index 0a84cea5b..640eb795c 100644 --- a/src/features/experiments/experimentDefinitions.ts +++ b/src/features/experiments/experimentDefinitions.ts @@ -65,8 +65,6 @@ export const SKILL_DISCOVERY_EXPERIMENT_ID = "skill-discovery"; export const FIRST_RUN_ONBOARDING_EXPERIMENT_ID = "first-run-onboarding"; -export const AGENT_SHARE_CARD_EXPERIMENT_ID = "agent-share-card"; - export const HIDDEN_EXPERIMENT_IDS = new Set([ FIRST_RUN_ONBOARDING_EXPERIMENT_ID, ]); @@ -91,11 +89,6 @@ export const EXPERIMENT_DEFINITIONS = [ // sq-agents CLI and can make remote catalog requests. defaultEnabled: false, }, - { - id: AGENT_SHARE_CARD_EXPERIMENT_ID, - titleKey: "experiments.agentShareCard.title", - descriptionKey: "experiments.agentShareCard.description", - }, { id: STARTER_TASKS_EXPERIMENT_ID, titleKey: "experiments.starterTasks.title", diff --git a/src/shared/i18n/locales/en/settings.json b/src/shared/i18n/locales/en/settings.json index 70398b078..0b42d5422 100644 --- a/src/shared/i18n/locales/en/settings.json +++ b/src/shared/i18n/locales/en/settings.json @@ -183,10 +183,6 @@ } }, "experiments": { - "agentShareCard": { - "description": "Share agents as downloadable collectible cards from the agent gallery and detail page.", - "title": "Agent share cards" - }, "autoEnable": { "description": "Dev builds enable experiments by default. Turn off individual experiments below when you need the stable path.", "label": "Auto-enable new experiments" diff --git a/src/shared/i18n/locales/es/settings.json b/src/shared/i18n/locales/es/settings.json index 7afa23ca9..adb4f3050 100644 --- a/src/shared/i18n/locales/es/settings.json +++ b/src/shared/i18n/locales/es/settings.json @@ -183,10 +183,6 @@ } }, "experiments": { - "agentShareCard": { - "description": "Comparte agentes como tarjetas coleccionables descargables desde la galería y la página de detalles del agente.", - "title": "Tarjetas para compartir agentes" - }, "autoEnable": { "description": "Las compilaciones de desarrollo activan los experimentos de forma predeterminada. Desactiva experimentos individuales abajo cuando necesites el flujo estable.", "label": "Activar nuevos experimentos automáticamente"