diff --git a/frontend/src/app/pages/AgentChat/tool-ui/AskUiBubble.tsx b/frontend/src/app/pages/AgentChat/tool-ui/AskUiBubble.tsx index 300a3655..1c51f56a 100644 --- a/frontend/src/app/pages/AgentChat/tool-ui/AskUiBubble.tsx +++ b/frontend/src/app/pages/AgentChat/tool-ui/AskUiBubble.tsx @@ -1,5 +1,6 @@ import React, { useCallback, useMemo, useState } from 'react'; import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; import InputBase from '@mui/material/InputBase'; import IconButton from '@mui/material/IconButton'; import ArrowUpwardRoundedIcon from '@mui/icons-material/ArrowUpwardRounded'; @@ -116,8 +117,28 @@ function AskUiBubble({ pair, sessionId, isPending, suppressReveal }: AskUiBubble ); } + // The vendored choice contracts carry no question field, so agents' title/description props silently vanish and the user sees options with no question; render them as a host header instead (ENG-227). + const rawProps = (payload.props ?? {}) as Record; + const questionTitle: string = [rawProps.title, rawProps.question, rawProps.prompt, rawProps.heading] + .find((v): v is string => typeof v === 'string' && v.trim().length > 0) ?? ''; + const questionDesc: string = typeof rawProps.description === 'string' && rawProps.description !== questionTitle + ? rawProps.description : ''; return ( + {(questionTitle || questionDesc) && ( + + {questionTitle && ( + + {questionTitle} + + )} + {questionDesc && ( + + {questionDesc} + + )} + + )} {waiting && FREE_TEXT_COMPONENTS.has(payload.name) && ( ; if (payload.component === 'stats') return ; if (payload.component === 'links') return ; - if (payload.component === 'vendored') return ; + if (payload.component === 'vendored') { + // The vendored contracts carry no question/title field, so agent-supplied ones silently vanish and a choice widget renders with no visible question; surface them as a host header (ENG-227). + const raw = (payload.props ?? {}) as Record; + const title = [raw.title, raw.question, raw.prompt, raw.heading] + .find((v): v is string => typeof v === 'string' && v.trim().length > 0) ?? ''; + const desc = typeof raw.description === 'string' && raw.description !== title ? raw.description : ''; + const widget = ; + if (!title && !desc) return widget; + return ( +
+
+ {title &&
{title}
} + {desc &&
{desc}
} +
+ {widget} +
+ ); + } return null; } diff --git a/frontend/src/app/pages/Dashboard/cards/BrowserCard.tsx b/frontend/src/app/pages/Dashboard/cards/BrowserCard.tsx index 259cf411..1810ac86 100644 --- a/frontend/src/app/pages/Dashboard/cards/BrowserCard.tsx +++ b/frontend/src/app/pages/Dashboard/cards/BrowserCard.tsx @@ -1466,42 +1466,6 @@ const BrowserCard: React.FC = ({ {/* Right side controls */} - {/* Agent activity badge */} - {agentActive && ( - - - - AI - - - )} diff --git a/frontend/src/app/pages/Tools/Tools.tsx b/frontend/src/app/pages/Tools/Tools.tsx index c173a800..3e584288 100644 --- a/frontend/src/app/pages/Tools/Tools.tsx +++ b/frontend/src/app/pages/Tools/Tools.tsx @@ -137,7 +137,6 @@ const Tools: React.FC = ({ onBrowseConnectors, expandToolId }) => { a.setSnackbar({ open: true, message, severity: severity === 'error' ? 'error' : undefined })} /> diff --git a/frontend/src/app/pages/Tools/dialogs/ToolsAddMenu.tsx b/frontend/src/app/pages/Tools/dialogs/ToolsAddMenu.tsx index 7a491073..63e91a66 100644 --- a/frontend/src/app/pages/Tools/dialogs/ToolsAddMenu.tsx +++ b/frontend/src/app/pages/Tools/dialogs/ToolsAddMenu.tsx @@ -3,7 +3,6 @@ import Button from '@mui/material/Button'; import Menu from '@mui/material/Menu'; import MenuItem from '@mui/material/MenuItem'; import AddIcon from '@mui/icons-material/Add'; -import BuildIcon from '@mui/icons-material/Build'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import StorefrontIcon from '@mui/icons-material/Storefront'; import AddLinkIcon from '@mui/icons-material/AddLink'; @@ -13,13 +12,12 @@ import AddCustomConnectorDialog from '../../Directory/dialogs/AddCustomConnector interface Props { devMode: boolean; onBrowseConnectors?: () => void; - onOpenCreate: () => void; onOpenRegistry: () => void; onSnackbar: (message: string, severity: 'success' | 'error') => void; } // The Tools page's Add button (claude.ai's Connectors-page grammar) plus the custom-connector dialog it opens. -const ToolsAddMenu: React.FC = ({ devMode, onBrowseConnectors, onOpenCreate, onOpenRegistry, onSnackbar }) => { +const ToolsAddMenu: React.FC = ({ devMode, onBrowseConnectors, onOpenRegistry, onSnackbar }) => { const c = useClaudeTokens(); const [menuAnchor, setMenuAnchor] = useState(null); const [customConnectorOpen, setCustomConnectorOpen] = useState(false); @@ -51,10 +49,6 @@ const ToolsAddMenu: React.FC = ({ devMode, onBrowseConnectors, onOpenCrea Add custom connector - { closeMenu(); onOpenCreate(); }} sx={{ color: c.text.primary, fontSize: '0.875rem', gap: 1.5, '&:hover': { bgcolor: c.bg.secondary } }}> - - Create Custom - {devMode && ( { closeMenu(); onOpenRegistry(); }} sx={{ color: c.text.primary, fontSize: '0.875rem', gap: 1.5, '&:hover': { bgcolor: c.bg.secondary } }}>