export const controllerMcpMinimumNodeMajor = 24; export const controllerMcpMinimumNodeMinor = 12; export const controllerMcpMaximumNodeMajorExclusive = 27; export interface IControllerMcpRuntimeIdentity { platform: NodeJS.Platform; architecture: string; nodeVersion: string; } const parseNodeVersion = (versionArg: string): { major: number; minor: number } | undefined => { const match = /^([0-9]+)\.([0-9]+)\.[0-9]+(?:[-+].*)?$/.exec(versionArg); if (!match) return undefined; return { major: Number(match[1]), minor: Number(match[2]) }; }; export const currentControllerMcpRuntimeIdentity = (): IControllerMcpRuntimeIdentity => ({ platform: process.platform, architecture: process.arch, nodeVersion: process.versions.node, }); export const controllerMcpRuntimeIsSupported = ( identityArg: IControllerMcpRuntimeIdentity = currentControllerMcpRuntimeIdentity(), ): boolean => { const version = parseNodeVersion(identityArg.nodeVersion); return identityArg.platform === 'linux' && identityArg.architecture === 'x64' && version !== undefined && version.major >= controllerMcpMinimumNodeMajor && version.major < controllerMcpMaximumNodeMajorExclusive && (version.major > controllerMcpMinimumNodeMajor || version.minor >= controllerMcpMinimumNodeMinor); }; export const assertControllerMcpRuntimeSupported = ( identityArg: IControllerMcpRuntimeIdentity = currentControllerMcpRuntimeIdentity(), ): void => { if (controllerMcpRuntimeIsSupported(identityArg)) return; throw new Error( 'agl mcp requires Linux x64 and Node.js >=24.12.0 <27 ' + `(current: ${identityArg.platform} ${identityArg.architecture}, Node.js ${identityArg.nodeVersion}).`, ); };