( toolsMap: Record<string, ToolConfig> )
| 31 | * @returns Filtered record containing only the latest version of each tool |
| 32 | */ |
| 33 | export function getLatestVersionTools( |
| 34 | toolsMap: Record<string, ToolConfig> |
| 35 | ): Record<string, ToolConfig> { |
| 36 | const latestTools: Record<string, ToolConfig> = {} |
| 37 | const baseNameToVersions: Record<string, { toolId: string; version: number }[]> = {} |
| 38 | |
| 39 | for (const toolId of Object.keys(toolsMap)) { |
| 40 | const baseName = stripVersionSuffix(toolId) |
| 41 | const versionMatch = toolId.match(/_v(\d+)$/) |
| 42 | const version = versionMatch ? Number.parseInt(versionMatch[1], 10) : 1 |
| 43 | |
| 44 | if (!baseNameToVersions[baseName]) { |
| 45 | baseNameToVersions[baseName] = [] |
| 46 | } |
| 47 | baseNameToVersions[baseName].push({ toolId, version }) |
| 48 | } |
| 49 | |
| 50 | for (const versions of Object.values(baseNameToVersions)) { |
| 51 | const latest = versions.reduce((prev, curr) => (curr.version > prev.version ? curr : prev)) |
| 52 | latestTools[latest.toolId] = toolsMap[latest.toolId] |
| 53 | } |
| 54 | |
| 55 | return latestTools |
| 56 | } |
| 57 | |
| 58 | /** |
| 59 | * Resolves a tool name to its actual tool ID in the registry. |
no test coverage detected