diff --git a/site/src/pages/AgentsPage/components/ChatConversation/chatStore.ts b/site/src/pages/AgentsPage/components/ChatConversation/chatStore.ts index 1191b3d6ca..0562e4a5c4 100644 --- a/site/src/pages/AgentsPage/components/ChatConversation/chatStore.ts +++ b/site/src/pages/AgentsPage/components/ChatConversation/chatStore.ts @@ -32,13 +32,13 @@ const buildOrderedMessageIDs = ( // still exists in a later page). The Map-based messagesByID // already deduplicates, but orderedMessageIDs must match. const seen = new Set(); - return sorted - .map((message) => message.id) - .filter((id) => { - if (seen.has(id)) return false; - seen.add(id); - return true; - }); + const orderedMessageIDs: number[] = []; + for (const message of sorted) { + if (seen.has(message.id)) continue; + seen.add(message.id); + orderedMessageIDs.push(message.id); + } + return orderedMessageIDs; }; const mapsEqualByRef = (left: Map, right: Map): boolean => { diff --git a/site/src/pages/AgentsPage/components/MCPServerPicker.tsx b/site/src/pages/AgentsPage/components/MCPServerPicker.tsx index 37fd7486ae..7f46013114 100644 --- a/site/src/pages/AgentsPage/components/MCPServerPicker.tsx +++ b/site/src/pages/AgentsPage/components/MCPServerPicker.tsx @@ -78,13 +78,17 @@ const MCPIcon: FC<{ iconUrl: string; name: string; className?: string }> = ({ export const getDefaultMCPSelection = ( servers: readonly TypesGen.MCPServerConfig[], ): string[] => { - return servers - .filter( - (s) => - s.enabled && - (s.availability === "force_on" || s.availability === "default_on"), - ) - .map((s) => s.id); + const ids: string[] = []; + for (const server of servers) { + if ( + server.enabled && + (server.availability === "force_on" || + server.availability === "default_on") + ) { + ids.push(server.id); + } + } + return ids; }; /** localStorage key for persisting the user's MCP server selection. */ @@ -113,13 +117,15 @@ export const mcpSelectionStorageKey = "agents.selected-mcp-server-ids"; if (!Array.isArray(parsed)) { return null; } - const enabledIds = new Set( - servers.filter((s) => s.enabled).map((s) => s.id), - ); - // Always include force_on servers even if the user didn't save them. - const forceOnIds = servers - .filter((s) => s.enabled && s.availability === "force_on") - .map((s) => s.id); + const enabledIds = new Set(); + const forceOnIds: string[] = []; + for (const server of servers) { + if (!server.enabled) continue; + enabledIds.add(server.id); + if (server.availability === "force_on") { + forceOnIds.push(server.id); + } + } const restored = parsed.filter( (id): id is string => typeof id === "string" && enabledIds.has(id), ); diff --git a/site/src/pages/AgentsPage/components/QueuedMessagesList.tsx b/site/src/pages/AgentsPage/components/QueuedMessagesList.tsx index 74786bc253..81d6b394b0 100644 --- a/site/src/pages/AgentsPage/components/QueuedMessagesList.tsx +++ b/site/src/pages/AgentsPage/components/QueuedMessagesList.tsx @@ -41,12 +41,13 @@ export const getQueuedMessageInfo = ( ): QueuedMessageInfo => { const { content } = message; const fileBlocks = content.filter((p) => p.type === "file"); - const rawText = content - .filter((p) => p.type === "text") - .map((p) => p.text) - .filter((t): t is string => Boolean(t?.trim())) - .join(" ") - .trim(); + const textParts: string[] = []; + for (const part of content) { + if (part.type === "text" && part.text?.trim()) { + textParts.push(part.text); + } + } + const rawText = textParts.join(" ").trim(); if (rawText) { return { diff --git a/site/src/pages/AgentsPage/utils/personalSkills.ts b/site/src/pages/AgentsPage/utils/personalSkills.ts index c7f38b97bb..905fa4efe9 100644 --- a/site/src/pages/AgentsPage/utils/personalSkills.ts +++ b/site/src/pages/AgentsPage/utils/personalSkills.ts @@ -60,22 +60,24 @@ export const filterPersonalSkills = ( return skills.toSorted((a, b) => a.name.localeCompare(b.name, "en-US")); } - return skills - .map((skill, index): RankedPersonalSkill => { - const name = skill.name.toLocaleLowerCase("en-US"); - const description = skill.description.toLocaleLowerCase("en-US"); - let rank = Number.POSITIVE_INFINITY; - if (name.startsWith(normalizedQuery)) { - rank = 0; - } else if (name.includes(normalizedQuery)) { - rank = 1; - } else if (description.includes(normalizedQuery)) { - rank = 2; - } + const rankedSkills: RankedPersonalSkill[] = []; + for (const [index, skill] of skills.entries()) { + const name = skill.name.toLocaleLowerCase("en-US"); + const description = skill.description.toLocaleLowerCase("en-US"); + let rank: number | undefined; + if (name.startsWith(normalizedQuery)) { + rank = 0; + } else if (name.includes(normalizedQuery)) { + rank = 1; + } else if (description.includes(normalizedQuery)) { + rank = 2; + } + if (rank !== undefined) { + rankedSkills.push({ skill, rank, index }); + } + } - return { skill, rank, index }; - }) - .filter(({ rank }) => Number.isFinite(rank)) + return rankedSkills .toSorted((a, b) => { if (a.rank !== b.rank) { return a.rank - b.rank;