diff --git a/apps/app/src/react-app/domains/session/surface/composer/composer.tsx b/apps/app/src/react-app/domains/session/surface/composer/composer.tsx index 1463b28c3..887399c0d 100644 --- a/apps/app/src/react-app/domains/session/surface/composer/composer.tsx +++ b/apps/app/src/react-app/domains/session/surface/composer/composer.tsx @@ -110,6 +110,11 @@ const IMAGE_COMPRESS_QUALITY = 0.82; const IMAGE_COMPRESS_TARGET_BYTES = 1_500_000; const FILE_URL_RE = /^file:\/\//i; const HTTP_URL_RE = /^https?:\/\//i; +const DEFAULT_AGENT_NAME = "openwork"; + +function isNonDefaultAgent(agent: Agent) { + return agent.name !== DEFAULT_AGENT_NAME; +} /** * Extract external file/URL drops from a clipboard. Only used when the user @@ -383,6 +388,8 @@ export function ReactSessionComposer(props: ComposerProps) { const mentionMatch = props.draft.match(/@([^\s@]*)$/); const mentionOpenNext = Boolean(mentionMatch); const mentionQuery = mentionMatch?.[1] ?? ""; + const nonDefaultAgents = useMemo(() => agents.filter(isNonDefaultAgent), [agents]); + const showAgentPicker = props.selectedAgent !== null || nonDefaultAgents.length > 0; useEffect(() => { setSlashOpen(slashOpenNext); @@ -399,6 +406,22 @@ export function ReactSessionComposer(props: ComposerProps) { void props.listAgents().then(setAgents).catch(() => setAgents([])); }, [agentMenuOpen, toolMenuOpen, toolMenuSection, props.listAgents]); + useEffect(() => { + if (!showAgentPicker) setAgentMenuOpen(false); + }, [showAgentPicker]); + + useEffect(() => { + let cancelled = false; + void props.listAgents().then((next) => { + if (!cancelled) setAgents(next); + }).catch(() => { + if (!cancelled) setAgents([]); + }); + return () => { + cancelled = true; + }; + }, [props.listAgents]); + useEffect(() => { setSkills(props.skills ?? []); }, [props.skills]); @@ -852,7 +875,7 @@ export function ReactSessionComposer(props: ComposerProps) { return; } if (agentMenuOpen) { - const total = agents.length + 1; + const total = nonDefaultAgents.length + 1; if (event.key === "ArrowDown") { event.preventDefault(); setAgentMenuIndex((current) => (current + 1) % total); @@ -865,7 +888,7 @@ export function ReactSessionComposer(props: ComposerProps) { } if (event.key === "Enter" || event.key === "Tab") { event.preventDefault(); - const selected = agentMenuIndex === 0 ? null : agents[agentMenuIndex - 1]?.name ?? null; + const selected = agentMenuIndex === 0 ? null : nonDefaultAgents[agentMenuIndex - 1]?.name ?? null; props.onSelectAgent(selected); setAgentMenuOpen(false); return; @@ -1358,7 +1381,7 @@ export function ReactSessionComposer(props: ComposerProps) {
{t("composer.default_agent")}
{props.selectedAgent === null ? : null} - {agents.map((agent) => { + {nonDefaultAgents.map((agent) => { const active = props.selectedAgent === agent.name; return ( - {agents.map((agent, index) => { + {nonDefaultAgents.map((agent, index) => { const active = props.selectedAgent === agent.name; return (