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"