import React from 'react' import { Text } from '@anthropic/ink' import type { CollapsedReadSearchGroup } from '../../types/message.js' /** * Plain function (not a React component) so the React Compiler won't * hoist the teamMemory* property accesses for memoization. This module * is only loaded when feature('TEAMMEM') is true. */ export function checkHasTeamMemOps(message: CollapsedReadSearchGroup): boolean { return ( (message.teamMemorySearchCount ?? 0) > 0 || (message.teamMemoryReadCount ?? 0) > 0 || (message.teamMemoryWriteCount ?? 0) > 0 ) } /** * Renders team memory count parts for the collapsed read/search UI. * This module is only loaded when feature('TEAMMEM') is true, * so DCE removes it entirely from external builds. */ export function TeamMemCountParts({ message, isActiveGroup, hasPrecedingParts, }: { message: CollapsedReadSearchGroup isActiveGroup: boolean | undefined hasPrecedingParts: boolean }): React.ReactNode { const tmReadCount = message.teamMemoryReadCount ?? 0 const tmSearchCount = message.teamMemorySearchCount ?? 0 const tmWriteCount = message.teamMemoryWriteCount ?? 0 if (tmReadCount === 0 && tmSearchCount === 0 && tmWriteCount === 0) { return null } const nodes: React.ReactNode[] = [] let count = hasPrecedingParts ? 1 : 0 if (tmReadCount > 0) { const verb = isActiveGroup ? count === 0 ? 'Recalling' : 'recalling' : count === 0 ? 'Recalled' : 'recalled' if (count > 0) { nodes.push(, ) } nodes.push( {verb} {tmReadCount} team{' '} {tmReadCount === 1 ? 'memory' : 'memories'} , ) count++ } if (tmSearchCount > 0) { const verb = isActiveGroup ? count === 0 ? 'Searching' : 'searching' : count === 0 ? 'Searched' : 'searched' if (count > 0) { nodes.push(, ) } nodes.push({`${verb} team memories`}) count++ } if (tmWriteCount > 0) { const verb = isActiveGroup ? count === 0 ? 'Writing' : 'writing' : count === 0 ? 'Wrote' : 'wrote' if (count > 0) { nodes.push(, ) } nodes.push( {verb} {tmWriteCount} team{' '} {tmWriteCount === 1 ? 'memory' : 'memories'} , ) } return <>{nodes} }