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}; }