diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index 042f475595..a280e5e7c4 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -19630,13 +19630,11 @@ const docTemplate = `{ "nats_pubsub", "minimum-implicit-member", "ai-gateway-cost-control", - "agent-app-tabs", "chat-advisor", "chat-virtual-desktop" ], "x-enum-comments": { "ExperimentAIGatewayCostControl": "Enables AI Gateway cost control functionality.", - "ExperimentAgentAppTabs": "Enables workspace-app and port preview tabs in the Coder Agents right panel.", "ExperimentAutoFillParameters": "This should not be taken out of experiments until we have redesigned the feature.", "ExperimentChatAdvisor": "Enables the advisor tool for root agent chats.", "ExperimentChatVirtualDesktop": "Enables virtual desktop and computer use provider for agents.", @@ -19660,7 +19658,6 @@ const docTemplate = `{ "Enables embedded NATS pubsub.", "Allows organizations to deviate from the default organization-member roles, in support of Gateway Accounts.", "Enables AI Gateway cost control functionality.", - "Enables workspace-app and port preview tabs in the Coder Agents right panel.", "Enables the advisor tool for root agent chats.", "Enables virtual desktop and computer use provider for agents." ], @@ -19675,7 +19672,6 @@ const docTemplate = `{ "ExperimentNATSPubsub", "ExperimentMinimumImplicitMember", "ExperimentAIGatewayCostControl", - "ExperimentAgentAppTabs", "ExperimentChatAdvisor", "ExperimentChatVirtualDesktop" ] diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index 381d744ab3..5eaa93a980 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -17823,13 +17823,11 @@ "nats_pubsub", "minimum-implicit-member", "ai-gateway-cost-control", - "agent-app-tabs", "chat-advisor", "chat-virtual-desktop" ], "x-enum-comments": { "ExperimentAIGatewayCostControl": "Enables AI Gateway cost control functionality.", - "ExperimentAgentAppTabs": "Enables workspace-app and port preview tabs in the Coder Agents right panel.", "ExperimentAutoFillParameters": "This should not be taken out of experiments until we have redesigned the feature.", "ExperimentChatAdvisor": "Enables the advisor tool for root agent chats.", "ExperimentChatVirtualDesktop": "Enables virtual desktop and computer use provider for agents.", @@ -17853,7 +17851,6 @@ "Enables embedded NATS pubsub.", "Allows organizations to deviate from the default organization-member roles, in support of Gateway Accounts.", "Enables AI Gateway cost control functionality.", - "Enables workspace-app and port preview tabs in the Coder Agents right panel.", "Enables the advisor tool for root agent chats.", "Enables virtual desktop and computer use provider for agents." ], @@ -17868,7 +17865,6 @@ "ExperimentNATSPubsub", "ExperimentMinimumImplicitMember", "ExperimentAIGatewayCostControl", - "ExperimentAgentAppTabs", "ExperimentChatAdvisor", "ExperimentChatVirtualDesktop" ] diff --git a/codersdk/deployment.go b/codersdk/deployment.go index c651f57293..9373855be7 100644 --- a/codersdk/deployment.go +++ b/codersdk/deployment.go @@ -5197,7 +5197,6 @@ const ( ExperimentNATSPubsub Experiment = "nats_pubsub" // Enables embedded NATS pubsub. ExperimentMinimumImplicitMember Experiment = "minimum-implicit-member" // Allows organizations to deviate from the default organization-member roles, in support of Gateway Accounts. ExperimentAIGatewayCostControl Experiment = "ai-gateway-cost-control" // Enables AI Gateway cost control functionality. - ExperimentAgentAppTabs Experiment = "agent-app-tabs" // Enables workspace-app and port preview tabs in the Coder Agents right panel. ExperimentChatAdvisor Experiment = "chat-advisor" // Enables the advisor tool for root agent chats. ExperimentChatVirtualDesktop Experiment = "chat-virtual-desktop" // Enables virtual desktop and computer use provider for agents. ) @@ -5224,8 +5223,6 @@ func (e Experiment) DisplayName() string { return "Gateway Accounts (minimum implicit member)" case ExperimentAIGatewayCostControl: return "AI Gateway Cost Control" - case ExperimentAgentAppTabs: - return "Coder Agents App and Port Tabs" case ExperimentChatAdvisor: return "Chat Advisor" case ExperimentChatVirtualDesktop: @@ -5250,7 +5247,6 @@ var ExperimentsKnown = Experiments{ ExperimentWorkspaceBuildUpdates, ExperimentMinimumImplicitMember, ExperimentAIGatewayCostControl, - ExperimentAgentAppTabs, ExperimentChatAdvisor, ExperimentChatVirtualDesktop, } diff --git a/docs/reference/api/schemas.md b/docs/reference/api/schemas.md index 24cca952fa..879951910b 100644 --- a/docs/reference/api/schemas.md +++ b/docs/reference/api/schemas.md @@ -7087,9 +7087,9 @@ CreateWorkspaceRequest provides options for creating a new workspace. Only one o #### Enumerated Values -| Value(s) | -|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `agent-app-tabs`, `ai-gateway-cost-control`, `auto-fill-parameters`, `chat-advisor`, `chat-virtual-desktop`, `example`, `mcp-server-http`, `minimum-implicit-member`, `nats_pubsub`, `notifications`, `oauth2`, `workspace-build-updates`, `workspace-usage` | +| Value(s) | +|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `ai-gateway-cost-control`, `auto-fill-parameters`, `chat-advisor`, `chat-virtual-desktop`, `example`, `mcp-server-http`, `minimum-implicit-member`, `nats_pubsub`, `notifications`, `oauth2`, `workspace-build-updates`, `workspace-usage` | ## codersdk.ExternalAPIKeyScopes diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index a76b66b40b..d1e9aa8f49 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -4586,7 +4586,6 @@ export const EntitlementsWarningHeader = "X-Coder-Entitlements-Warning"; // From codersdk/deployment.go export type Experiment = | "ai-gateway-cost-control" - | "agent-app-tabs" | "auto-fill-parameters" | "chat-advisor" | "chat-virtual-desktop" @@ -4601,7 +4600,6 @@ export type Experiment = export const Experiments: Experiment[] = [ "ai-gateway-cost-control", - "agent-app-tabs", "auto-fill-parameters", "chat-advisor", "chat-virtual-desktop", diff --git a/site/src/pages/AgentsPage/AgentChatPageView.tsx b/site/src/pages/AgentsPage/AgentChatPageView.tsx index d3db158ff0..48ba215e22 100644 --- a/site/src/pages/AgentsPage/AgentChatPageView.tsx +++ b/site/src/pages/AgentsPage/AgentChatPageView.tsx @@ -22,7 +22,6 @@ import { useProxy } from "#/contexts/ProxyContext"; import { isWorkspaceAppEmbeddable } from "#/modules/apps/apps"; import { WorkspaceAppFrame } from "#/modules/apps/WorkspaceAppFrame"; import { findWorkspaceAppWithAgent } from "#/modules/apps/workspaceApps"; -import { useDashboard } from "#/modules/dashboard/useDashboard"; import { cn } from "#/utils/cn"; import { pageTitle } from "#/utils/page"; import { findWorkspaceAgent } from "#/utils/workspace"; @@ -387,7 +386,6 @@ export const AgentChatPageView: FC = ({ const queryClient = useQueryClient(); const { proxy } = useProxy(); const wildcardHostname = proxy.preferredWildcardHostname; - const { experiments } = useDashboard(); const canOpenChatSharing = canShareChat && organizationId !== undefined; @@ -494,19 +492,10 @@ export const AgentChatPageView: FC = ({ const availableDesktopChatId = workspace && workspaceAgent ? desktopChatId : undefined; - // Workspace app and port preview tabs are gated behind the agent-app-tabs - // experiment. Terminal tabs are generally available. Derived after all hook - // calls so the React Compiler keeps the tab list and the tab-open handlers - // below in a single memoization scope. - const userAppTabsEnabled = experiments.includes("agent-app-tabs"); - - // When app and port tabs are gated off, persisted tabs of those kinds - // are hidden rather than deleted; the save effect persists the raw tab - // state, so they reappear if the gate lifts. const validatedUserRightPanelTabs = validateUserRightPanelTabs( userRightPanelTabs, { workspace, workspaceAgent, wildcardHostname }, - ).filter((tab) => userAppTabsEnabled || tab.kind === "terminal"); + ); const hasBuiltInTerminal = Boolean( workspace && workspaceAgent && !defaultTerminalHidden, @@ -1001,7 +990,6 @@ export const AgentChatPageView: FC = ({ tabs={sidebarTabs} addTabControl={ { - const canvas = within(canvasElement); - await expect(canvas.getByLabelText("New terminal tab")).toBeEnabled(); - await expect(canvas.queryByLabelText("Add panel")).not.toBeInTheDocument(); - }, -}; diff --git a/site/src/pages/AgentsPage/components/RightPanel/RightPanelAddTabControl.tsx b/site/src/pages/AgentsPage/components/RightPanel/RightPanelAddTabControl.tsx index cc47f2b067..837bfeec5c 100644 --- a/site/src/pages/AgentsPage/components/RightPanel/RightPanelAddTabControl.tsx +++ b/site/src/pages/AgentsPage/components/RightPanel/RightPanelAddTabControl.tsx @@ -59,7 +59,6 @@ const AgentPortsSubMenu: FC<{ }; export const RightPanelAddTabControl: FC<{ - appExperimentEnabled: boolean; workspace?: Workspace; agent?: WorkspaceAgent; host?: string; @@ -69,7 +68,6 @@ export const RightPanelAddTabControl: FC<{ onOpenCommandApp?: (app: WorkspaceApp) => void; onOpenPort?: (selection: PortSelection) => void; }> = ({ - appExperimentEnabled, workspace, agent, host = "", @@ -93,119 +91,114 @@ export const RightPanelAddTabControl: FC<{ disabled={!canCreateTerminal} aria-label="New terminal tab" title="New terminal tab" - className={cn( - "size-6 rounded-none border-0 bg-transparent p-0 text-content-secondary hover:bg-surface-secondary hover:text-content-primary", - appExperimentEnabled && "border-r border-solid border-border-default", - )} + className="size-6 rounded-none border-0 bg-transparent p-0 text-content-secondary hover:bg-surface-secondary hover:text-content-primary border-r border-solid border-border-default" > - {appExperimentEnabled && ( - - - - - + + + + + + + New Terminal + - {workspace && agent && userApps.length > 0 && ( - <> - - {userApps.map((app) => { - if (app.command && onOpenCommandApp) { - return ( - onOpenCommandApp(app)} - disabled={!isRunning} - > - {app.icon ? ( - - ) : ( - - )} - {app.display_name ?? app.slug} - - ); - } - if (isWorkspaceAppEmbeddable(app) && onOpenWorkspaceApp) { - return ( - onOpenWorkspaceApp(app)} - disabled={!isRunning} - > - {app.icon ? ( - - ) : ( - - )} - {app.display_name ?? app.slug} - - ); - } + {workspace && agent && userApps.length > 0 && ( + <> + + {userApps.map((app) => { + if (app.command && onOpenCommandApp) { return ( - + onSelect={() => onOpenCommandApp(app)} + disabled={!isRunning} + > + {app.icon ? ( + + ) : ( + + )} + {app.display_name ?? app.slug} + ); - })} - - )} - - {workspace && - agent && - onOpenPort && - canShowPortForwarding(agent, host) && ( - <> - - onOpenWorkspaceApp(app)} + disabled={!isRunning} + > + {app.icon ? ( + + ) : ( + + )} + {app.display_name ?? app.slug} + + ); + } + return ( + - - )} - - - )} + ); + })} + + )} + + {workspace && + agent && + onOpenPort && + canShowPortForwarding(agent, host) && ( + <> + + + + )} + + ); };