diff --git a/site/src/pages/AgentsPage/components/ChatElements/tools/ExecuteTool.tsx b/site/src/pages/AgentsPage/components/ChatElements/tools/ExecuteTool.tsx index 8bc80e6e842..2e4eb130109 100644 --- a/site/src/pages/AgentsPage/components/ChatElements/tools/ExecuteTool.tsx +++ b/site/src/pages/AgentsPage/components/ChatElements/tools/ExecuteTool.tsx @@ -1,12 +1,6 @@ -import { - CircleAlertIcon, - ExternalLinkIcon, - LayersIcon, - OctagonXIcon, -} from "lucide-react"; +import { LayersIcon, OctagonXIcon } from "lucide-react"; import type React from "react"; import type * as TypesGen from "#/api/typesGenerated"; -import { Button } from "#/components/Button/Button"; import { CopyButton } from "#/components/CopyButton/CopyButton"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; import { @@ -220,64 +214,3 @@ const ShellTranscriptBody: React.FC<{ ); }; - -export const ExecuteAuthRequiredTool: React.FC<{ - command: string; - output: string; - authenticateURL: string; - providerLabel: string; -}> = ({ command, output, authenticateURL, providerLabel }) => { - const hasCommand = command.trim().length > 0; - const hasOutput = output.trim().length > 0; - - return ( -
-
- - - Authenticate with {providerLabel} to continue this command. - -
-
- - - - Open authentication link - -
- {hasCommand && ( -
- - $ {command} - -
- )} - {hasOutput && ( - -
-						{output}
-					
-
- )} -
- ); -}; diff --git a/site/src/pages/AgentsPage/components/ChatElements/tools/Tool.stories.tsx b/site/src/pages/AgentsPage/components/ChatElements/tools/Tool.stories.tsx index 712b550f527..a918bcf9fff 100644 --- a/site/src/pages/AgentsPage/components/ChatElements/tools/Tool.stories.tsx +++ b/site/src/pages/AgentsPage/components/ChatElements/tools/Tool.stories.tsx @@ -1,13 +1,5 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { - expect, - fn, - screen, - spyOn, - userEvent, - waitFor, - within, -} from "storybook/test"; +import { expect, fn, screen, userEvent, waitFor, within } from "storybook/test"; import { reactRouterParameters } from "storybook-addon-remix-react-router"; import { chatModelConfigsKey } from "#/api/queries/chats"; import { MockChatModelConfig } from "#/testHelpers/chatModels"; @@ -565,37 +557,6 @@ export const ProcessOutputStringError: Story = { }, }; -export const ExecuteAuthRequired: Story = { - args: { - result: { - auth_required: true, - provider_display_name: "GitHub", - authenticate_url: "https://coder.example.com/external-auth/github", - output: - "fatal: could not read Username for 'https://github.com': terminal prompts disabled", - }, - }, - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - const button = canvas.getByRole("button", { - name: "Authenticate with GitHub", - }); - expect(button).toBeInTheDocument(); - expect( - canvas.getByRole("link", { name: "Open authentication link" }), - ).toHaveAttribute("href", "https://coder.example.com/external-auth/github"); - - const openSpy = spyOn(window, "open").mockImplementation(() => null); - await userEvent.click(button); - expect(openSpy).toHaveBeenCalledWith( - "https://coder.example.com/external-auth/github", - "_blank", - "width=900,height=600", - ); - openSpy.mockRestore(); - }, -}; - // --------------------------------------------------------------------------- // Subagent stories // --------------------------------------------------------------------------- diff --git a/site/src/pages/AgentsPage/components/ChatElements/tools/Tool.tsx b/site/src/pages/AgentsPage/components/ChatElements/tools/Tool.tsx index 0d8bf0663a0..5934b2524f6 100644 --- a/site/src/pages/AgentsPage/components/ChatElements/tools/Tool.tsx +++ b/site/src/pages/AgentsPage/components/ChatElements/tools/Tool.tsx @@ -14,10 +14,7 @@ import { ComputerTool } from "./ComputerTool"; import { CreateWorkspaceTool } from "./CreateWorkspaceTool"; import { DiffFileHeader } from "./DiffFileHeader"; import { EditFilesTool } from "./EditFilesTool"; -import { - ExecuteAuthRequiredTool, - ExecuteTool as ExecuteToolComponent, -} from "./ExecuteTool"; +import { ExecuteTool as ExecuteToolComponent } from "./ExecuteTool"; import { ListAgentsTool } from "./ListAgentsTool"; import { ListTemplatesTool } from "./ListTemplatesTool"; import { ProcessOutputTool } from "./ProcessOutputTool"; @@ -225,20 +222,6 @@ const ExecuteRenderer: FC = ({ shellToolDisplayMode, }) => { const data = getExecuteRenderData(args, result); - const outputBlock = data.transcriptBlocks.find( - (block) => block.kind === "output", - ); - - if (data.authenticateURL) { - return ( - - ); - } return ( { describe("getExecuteRenderData", () => { - it("parses execute output and auth metadata from result payloads", () => { + it("parses execute output from result payloads", () => { expect( getExecuteRenderData( { command: "git fetch origin" }, @@ -14,9 +14,6 @@ describe("toolVisibility", () => { output: " fetched ", wall_duration_ms: "47200", background_process_id: "process-1", - auth_required: true, - authenticate_url: "https://example.com/auth", - provider_display_name: "GitHub", }, ), ).toEqual({ @@ -25,8 +22,6 @@ describe("toolVisibility", () => { errorText: "", durationMs: 47200, isBackgrounded: true, - authenticateURL: "https://example.com/auth", - providerLabel: "GitHub", }); }); @@ -68,7 +63,7 @@ describe("toolVisibility", () => { }); describe("shouldRenderTool", () => { - it("hides execute rows with neither a command nor an auth prompt", () => { + it("hides execute rows without a command", () => { expect( shouldRenderTool({ name: "execute", @@ -79,20 +74,6 @@ describe("toolVisibility", () => { ).toBe(false); }); - it("keeps execute rows when auth is required even without a command", () => { - expect( - shouldRenderTool({ - name: "execute", - status: "completed", - args: {}, - result: { - auth_required: true, - authenticate_url: "https://example.com/auth", - }, - }), - ).toBe(true); - }); - it("hides running wait_agent rows until chat_id is available", () => { expect( shouldRenderTool({ diff --git a/site/src/pages/AgentsPage/components/ChatElements/tools/toolVisibility.ts b/site/src/pages/AgentsPage/components/ChatElements/tools/toolVisibility.ts index 8010a54841c..f973b506988 100644 --- a/site/src/pages/AgentsPage/components/ChatElements/tools/toolVisibility.ts +++ b/site/src/pages/AgentsPage/components/ChatElements/tools/toolVisibility.ts @@ -5,7 +5,6 @@ import { asString, parseArgs, type ToolStatus, - toProviderLabel, } from "./utils"; export type ExecuteTranscriptBlock = { @@ -19,8 +18,6 @@ type ExecuteRenderData = { errorText: string; durationMs?: number; isBackgrounded: boolean; - authenticateURL: string; - providerLabel: string; }; /** @@ -52,14 +49,6 @@ export const getExecuteRenderData = ( const isBackgrounded = Boolean( rec && asString(rec.background_process_id).trim(), ); - const authenticateURL = rec?.auth_required - ? asString(rec.authenticate_url).trim() - : ""; - const providerLabel = toProviderLabel( - rec ? asString(rec.provider_display_name).trim() : "", - rec ? asString(rec.provider_id).trim() : "", - rec ? asString(rec.provider_type).trim() : "", - ); return { command, @@ -67,15 +56,9 @@ export const getExecuteRenderData = ( errorText, durationMs, isBackgrounded, - authenticateURL, - providerLabel, }; }; -const shouldRenderExecuteTool = (data: ExecuteRenderData): boolean => { - return data.command.trim().length > 0 || Boolean(data.authenticateURL); -}; - const shouldRenderSubagentLifecycleTool = ({ name, status, @@ -122,7 +105,7 @@ export const shouldRenderTool = ({ result?: unknown; }): boolean => { if (name === "execute") { - return shouldRenderExecuteTool(getExecuteRenderData(args, result)); + return getExecuteRenderData(args, result).command.trim().length > 0; } return shouldRenderSubagentLifecycleTool({ name, status, args, result }); diff --git a/site/src/pages/AgentsPage/components/ChatElements/tools/utils.test.ts b/site/src/pages/AgentsPage/components/ChatElements/tools/utils.test.ts index 609773d5507..441385982c0 100644 --- a/site/src/pages/AgentsPage/components/ChatElements/tools/utils.test.ts +++ b/site/src/pages/AgentsPage/components/ChatElements/tools/utils.test.ts @@ -29,7 +29,6 @@ import { sanitizeExecuteModelIntent, stripSvnIndexHeaders, summarizeParsedCommands, - toProviderLabel, } from "./utils"; describe("formatModelIntentLabel", () => { @@ -84,24 +83,6 @@ describe("sanitizeExecuteModelIntent", () => { }); }); -describe("toProviderLabel", () => { - it("returns displayName when provided", () => { - expect(toProviderLabel("GitHub", "gh-id", "oauth")).toBe("GitHub"); - }); - - it("falls back to providerID when displayName is empty", () => { - expect(toProviderLabel("", "gh-id", "oauth")).toBe("gh-id"); - }); - - it("falls back to providerType when displayName and ID are empty", () => { - expect(toProviderLabel("", "", "oauth")).toBe("oauth"); - }); - - it("returns default label when all are empty", () => { - expect(toProviderLabel("", "", "")).toBe("Git provider"); - }); -}); - describe("formatShellDurationMs", () => { it("returns empty string for invalid values", () => { expect(formatShellDurationMs(undefined)).toBe(""); diff --git a/site/src/pages/AgentsPage/components/ChatElements/tools/utils.ts b/site/src/pages/AgentsPage/components/ChatElements/tools/utils.ts index aa07edf3809..f2500c09675 100644 --- a/site/src/pages/AgentsPage/components/ChatElements/tools/utils.ts +++ b/site/src/pages/AgentsPage/components/ChatElements/tools/utils.ts @@ -101,23 +101,6 @@ const isCommandReference = (value: string, command: string): boolean => { const normalizeCommandReference = (value: string): string => value.trim().toLowerCase().replace(/\s+/g, " "); -export const toProviderLabel = ( - providerDisplayName: string, - providerID: string, - providerType: string, -): string => { - if (providerDisplayName) { - return providerDisplayName; - } - if (providerID) { - return providerID; - } - if (providerType) { - return providerType; - } - return "Git provider"; -}; - const roundToTenths = (value: number): number => Number(value.toFixed(1)); export const formatShellDurationMs = (