Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions src/features/agents/ui/AgentDetailPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -354,7 +350,7 @@ export function AgentDetailPage({
<Copy className="size-3.5" />
{t("common:actions.duplicate")}
</DropdownMenuItem>
{shareCardEnabled && onShare ? (
{onShare ? (
<DropdownMenuItem onSelect={() => onShare(persona)}>
<Share2 className="size-3.5" />
{t("share.action")}
Expand Down
10 changes: 3 additions & 7 deletions src/features/agents/ui/AgentsView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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<Persona | null>(null);
const [sharingPersonaId, setSharingPersonaId] = useState<string | null>(null);
Expand Down Expand Up @@ -517,7 +513,7 @@ export function AgentsView({
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
{shareCardEnabled && sharingPersona ? (
{sharingPersona ? (
<AgentShareDialog
open
persona={sharingPersona}
Expand All @@ -539,7 +535,7 @@ export function AgentsView({
onDuplicate={handleDuplicatePersona}
onDelete={handleDeletePersona}
onExport={handleExportPersona}
onShare={shareCardEnabled ? handleSharePersona : undefined}
onShare={handleSharePersona}
onAvatarUpdate={handleUpdateAvatar}
/>
{dialogs}
Expand Down Expand Up @@ -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}
Expand Down
6 changes: 1 addition & 5 deletions src/features/agents/ui/PersonaCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -146,7 +142,7 @@ export const PersonaCard = memo(function PersonaCard({
{t("common:actions.duplicate")}
</DropdownMenuItem>

{shareCardEnabled && onShare ? (
{onShare ? (
<DropdownMenuItem onSelect={() => onShare(persona)}>
<IconShare className="size-3.5" />
{t("share.action")}
Expand Down
31 changes: 16 additions & 15 deletions src/features/agents/ui/__tests__/AgentsView.entry.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -160,7 +158,6 @@ describe("AgentsView entry points", () => {

beforeEach(() => {
vi.clearAllMocks();
setExperimentEnabled(AGENT_SHARE_CARD_EXPERIMENT_ID, true);
useAgentStore.setState({
personas: [],
personasLoading: false,
Expand Down Expand Up @@ -194,32 +191,36 @@ 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();

render(<AgentsView activePersonaId={persona.id} />);
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(<AgentsView />);
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 () => {
Expand Down
15 changes: 3 additions & 12 deletions src/features/agents/ui/__tests__/PersonaCard.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -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();
Expand All @@ -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(
<PersonaCard persona={persona} onExport={onExport} onShare={vi.fn()} />,
);
render(<PersonaCard persona={persona} onExport={onExport} />);

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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
7 changes: 0 additions & 7 deletions src/features/experiments/experimentDefinitions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string>([
FIRST_RUN_ONBOARDING_EXPERIMENT_ID,
]);
Expand All @@ -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",
Expand Down
4 changes: 0 additions & 4 deletions src/shared/i18n/locales/en/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
4 changes: 0 additions & 4 deletions src/shared/i18n/locales/es/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down