#!/usr/bin/env npx tsx /** * Validation script for entity resolution timing fix * Tests that parameter preprocessing correctly handles entity conversion * with tool context, replacing early resolution. */ import { ParameterService } from '../src/main/services/parameter-service'; import { FormatConverterRegistry, TopicIdToHrlConverter } from '@hashgraphonline/conversational-agent'; import { Logger } from '@hashgraphonline/standards-sdk'; async function testEntityResolutionFix(): Promise { const logger = new Logger({ module: 'EntityResolutionFixTest' }); console.log('🔧 Testing Entity Resolution Timing Fix...\n'); const formatConverterRegistry = new FormatConverterRegistry(); formatConverterRegistry.register(new TopicIdToHrlConverter()); const parameterService = new ParameterService(formatConverterRegistry); const entityData = { entityId: '0.0.6626196', entityName: 'Forever #1', entityType: 'topic' as const, sessionId: 'test-session-123' }; console.log('📋 Test Data:'); console.log(` Entity: ${entityData.entityName}`); console.log(` ID: ${entityData.entityId}`); console.log(` Type: ${entityData.entityType}\n`); console.log('❌ BEFORE FIX - No tool context available:'); const messageWithoutContext = 'mint Forever #1 onto token we created'; const resultWithoutContext = await parameterService.convertParameterEntities( messageWithoutContext, [entityData], undefined // No tool preferences - simulates early resolution ); console.log(` Input: "${messageWithoutContext}"`); console.log(` Output: "${resultWithoutContext}"`); console.log(` Result: No conversion (expected - no tool preferences)\n`); console.log('✅ AFTER FIX - Tool context drives format selection:'); const messageWithContext = 'mint Forever #1 onto token we created'; const nftToolPreferences = { inscription: 'hrl' }; const resultWithContext = await parameterService.convertParameterEntities( messageWithContext, [entityData], nftToolPreferences ); console.log(` Input: "${messageWithContext}"`); console.log(` Tool Preferences: inscription -> HRL format`); console.log(` Output: "${resultWithContext}"`); const hasHrlConversion = resultWithContext.includes('hcs://1/0.0.6626196'); const hasCdnUrl = resultWithContext.includes('kiloscribe.com'); console.log(` HRL Conversion: ${hasHrlConversion ? '✅' : '❌'}`); console.log(` CDN URL Present: ${hasCdnUrl ? '❌' : '✅'}\n`); console.log('🔄 FLOW VALIDATION:'); console.log(' OLD FLOW (Broken):'); console.log(' 1. resolveEntitiesInMessage() called WITHOUT tool context'); console.log(' 2. Entities resolved to CDN URLs by default'); console.log(' 3. Tool receives wrong format, minting fails'); console.log(''); console.log(' NEW FLOW (Fixed):'); console.log(' 1. Original message passed to agent unchanged'); console.log(' 2. Agent selects tool (e.g., hedera-hts-mint-nft)'); console.log(' 3. Parameter preprocessing called WITH tool context'); console.log(' 4. convertParameterEntities() uses tool preferences'); console.log(' 5. Entity converted to correct format (HRL)'); console.log(' 6. Tool receives correct format, minting succeeds\n'); if (hasHrlConversion && !hasCdnUrl) { console.log('🎉 SUCCESS: Entity resolution timing fix is working!'); console.log(' • Early resolution disabled in conversational-agent.ts'); console.log(' • Parameter preprocessing handles entity conversion'); console.log(' • Tool metadata drives format selection'); console.log(' • NFT minting will now receive HRL format as expected'); process.exit(0); } else { console.log('💥 FAILURE: Fix not working as expected'); console.log(` • HRL Conversion: ${hasHrlConversion}`); console.log(` • No CDN URL: ${!hasCdnUrl}`); process.exit(1); } } testEntityResolutionFix().catch(console.error);