diff --git a/crates/agent-gateway/web/src/components/project-tools/RightDockLauncher.tsx b/crates/agent-gateway/web/src/components/project-tools/RightDockLauncher.tsx index b4c1d6759..b3f3ba65a 100644 --- a/crates/agent-gateway/web/src/components/project-tools/RightDockLauncher.tsx +++ b/crates/agent-gateway/web/src/components/project-tools/RightDockLauncher.tsx @@ -1,7 +1,7 @@ import { useLocale } from "../../i18n"; import { cn } from "../../lib/shared/utils"; import type { TerminalShellOption } from "../../lib/terminal/types"; -import { ChevronRight, Cpu, Plus, Terminal } from "../icons"; +import { ChevronDown, ChevronRight, Cpu, Plus, Terminal } from "../icons"; import { buttonVariants } from "../ui/button"; import { DropdownMenu, @@ -34,6 +34,7 @@ type RightDockCreateMenuProps = RightDockLauncherActions & { }; type RightDockChooserProps = RightDockLauncherActions & { + shellOptions: TerminalShellOption[]; terminalReady: boolean; terminalDisabledMessage?: string; disabledMessage?: string; @@ -105,7 +106,7 @@ export function RightDockCreateMenu(props: RightDockCreateMenuProps) { title={t("projectTools.newProjectTool")} className={cn( buttonVariants({ variant: "ghost", size: "icon" }), - "h-8 w-8 rounded-lg text-muted-foreground hover:text-foreground", + "h-7 w-7 rounded-md text-muted-foreground/80 hover:text-foreground", )} > @@ -134,6 +135,7 @@ export function RightDockCreateMenu(props: RightDockCreateMenuProps) { export function RightDockChooser(props: RightDockChooserProps) { const { + shellOptions, terminalReady, terminalDisabledMessage, disabledMessage, @@ -184,26 +186,67 @@ export function RightDockChooser(props: RightDockChooserProps) {

{t("projectTools.getStartedHint")}

- {tools.map((tool) => ( - + ); + if (!splitShellMenu) { + return
{card}
; + } + return ( +
+ {card} + + + + + + {shellOptions.map((option) => ( + onCreateTerminal(option.id)} + disabled={tool.disabled} + className="gap-2 text-xs" + title={option.command || option.label} + > + + {option.label} + + ))} + +
- - ))} + ); + })}
{loading ? (
{t("projectTools.loading")}
diff --git a/crates/agent-gateway/web/src/components/project-tools/RightDockPanel.tsx b/crates/agent-gateway/web/src/components/project-tools/RightDockPanel.tsx index f137cb3a6..17a509049 100644 --- a/crates/agent-gateway/web/src/components/project-tools/RightDockPanel.tsx +++ b/crates/agent-gateway/web/src/components/project-tools/RightDockPanel.tsx @@ -732,7 +732,7 @@ export const RightDockPanel = memo(function RightDockPanel(props: RightDockPanel className={cn( "project-tools-panel zone-font-scale fixed inset-x-0 bottom-0 z-40 flex h-[min(72vh,34rem)] min-h-0 w-full shrink-0 flex-col overflow-hidden bg-background shadow-2xl transition-[opacity,transform] duration-200 ease-out motion-reduce:transition-none md:relative md:inset-auto md:z-10 md:h-full md:overflow-visible md:shadow-none", isOpen - ? "pointer-events-auto translate-y-0 border-t border-border opacity-100 md:w-[var(--project-tools-panel-width)] md:translate-x-0 md:border-l md:border-t-0" + ? "pointer-events-auto translate-y-0 border-t border-border opacity-100 md:w-[var(--project-tools-panel-width)] md:translate-x-0 md:border-t-0" : "pointer-events-none translate-y-full border-t border-transparent opacity-0 md:translate-x-3 md:translate-y-0 md:border-l-0 md:border-t-0", effectiveWidthCollapsed ? "md:w-0" : "md:w-[var(--project-tools-panel-width)]", )} @@ -749,6 +749,15 @@ export const RightDockPanel = memo(function RightDockPanel(props: RightDockPanel {effectiveShouldRenderContent ? ( <>
- {tools.map((tool) => ( - + ); + if (!splitShellMenu) { + return
{card}
; + } + return ( +
+ {card} + + + + + + {shellOptions.map((option) => ( + onCreateTerminal(option.id)} + disabled={tool.disabled} + className="gap-2 text-xs" + title={option.command || option.label} + > + + {option.label} + + ))} + +
- - ))} + ); + })}
{loading ? (
{t("projectTools.loading")}
diff --git a/crates/agent-gui/src/components/project-tools/RightDockPanel.tsx b/crates/agent-gui/src/components/project-tools/RightDockPanel.tsx index f137cb3a6..17a509049 100644 --- a/crates/agent-gui/src/components/project-tools/RightDockPanel.tsx +++ b/crates/agent-gui/src/components/project-tools/RightDockPanel.tsx @@ -732,7 +732,7 @@ export const RightDockPanel = memo(function RightDockPanel(props: RightDockPanel className={cn( "project-tools-panel zone-font-scale fixed inset-x-0 bottom-0 z-40 flex h-[min(72vh,34rem)] min-h-0 w-full shrink-0 flex-col overflow-hidden bg-background shadow-2xl transition-[opacity,transform] duration-200 ease-out motion-reduce:transition-none md:relative md:inset-auto md:z-10 md:h-full md:overflow-visible md:shadow-none", isOpen - ? "pointer-events-auto translate-y-0 border-t border-border opacity-100 md:w-[var(--project-tools-panel-width)] md:translate-x-0 md:border-l md:border-t-0" + ? "pointer-events-auto translate-y-0 border-t border-border opacity-100 md:w-[var(--project-tools-panel-width)] md:translate-x-0 md:border-t-0" : "pointer-events-none translate-y-full border-t border-transparent opacity-0 md:translate-x-3 md:translate-y-0 md:border-l-0 md:border-t-0", effectiveWidthCollapsed ? "md:w-0" : "md:w-[var(--project-tools-panel-width)]", )} @@ -749,6 +749,15 @@ export const RightDockPanel = memo(function RightDockPanel(props: RightDockPanel {effectiveShouldRenderContent ? ( <>