#!/usr/bin/env node
const { spawn } = require('child_process');
class AccountComparison {
constructor() {
this.server = null;
this.requestId = 1;
}
async start() {
console.log('π COMPARING MSP vs DIRECT ACCOUNTS');
console.log('===================================');
this.server = spawn('node', ['dist/index.js'], {
stdio: ['pipe', 'pipe', 'pipe']
});
await new Promise(resolve => setTimeout(resolve, 3000));
console.log('β
Server ready\n');
}
async sendRequest(method, params = {}) {
return new Promise((resolve, reject) => {
const request = {
jsonrpc: '2.0',
id: this.requestId++,
method,
params
};
this.server.stdin.write(JSON.stringify(request) + '\n');
const timeout = setTimeout(() => {
reject(new Error(`Timeout: ${method}`));
}, 25000);
const handleData = (data) => {
clearTimeout(timeout);
this.server.stdout.removeListener('data', handleData);
try {
const lines = data.toString().split('\n').filter(line => line.trim());
const lastLine = lines[lines.length - 1];
if (lastLine) {
const response = JSON.parse(lastLine);
resolve(response);
}
} catch (error) {
reject(error);
}
};
this.server.stdout.on('data', handleData);
});
}
async testAccount(username, password, accountType) {
console.log(`\nπ Testing ${accountType} Account: ${username}`);
console.log(''.padEnd(50, '-'));
try {
// Logout previous session
await this.sendRequest('tools/call', {
name: 'logout',
arguments: {}
});
// Authenticate new account
const authResp = await this.sendRequest('tools/call', {
name: 'authenticate_user',
arguments: { username, password }
});
if (authResp.error) {
console.log(`β Authentication failed: ${authResp.error.message}`);
return;
}
console.log('β
Authentication successful');
// Test recommendations
const recsResp = await this.sendRequest('tools/call', {
name: 'api___recommendations_report',
arguments: {}
});
const recsContent = recsResp.result?.content?.[0]?.text;
// Extract savings data
const savingsMatch = recsContent?.match(/Total.*?\$([0-9,]+)/i) || recsContent?.match(/\$([0-9,]+)/);
const countMatch = recsContent?.match(/(\d+) recommendations/);
const totalSavings = savingsMatch ? parseInt(savingsMatch[1].replace(/,/g, '')) : 0;
const recCount = countMatch ? parseInt(countMatch[1]) : 0;
console.log(`π° Recommendations Data:`);
console.log(` Total Savings: $${totalSavings.toLocaleString()}`);
console.log(` Recommendation Count: ${recCount}`);
console.log(` Has Data: ${totalSavings > 0 || recCount > 0 ? 'β
Yes' : 'β No'}`);
// Test customer management for MSP accounts
if (accountType === 'MSP') {
const custResp = await this.sendRequest('tools/call', {
name: 'api___user_management_accounts',
arguments: {}
});
const custContent = custResp.result?.content?.[0]?.text;
const customerCount = custContent?.match(/(\d+) customers/) || custContent?.match(/Found (\d+)/);
console.log(`π₯ MSP Customers: ${customerCount?.[1] || '0'}`);
// Check if Bank Hapoalim is visible
const hasBankHapoalim = custContent?.includes('Bank') || custContent?.includes('Hapoalim') || custContent?.includes('16185');
console.log(`π¦ Bank Hapoalim Visible: ${hasBankHapoalim ? 'β
Yes' : 'β No'}`);
}
return {
accountType,
username,
totalSavings,
recCount,
hasData: totalSavings > 0 || recCount > 0
};
} catch (error) {
console.log(`β Error testing ${accountType} account: ${error.message}`);
return null;
}
}
async compare() {
const accounts = [
{
username: 'david+allcloud@umbrellacost.com',
password: 'B4*zcI7#F7poEC',
type: 'MSP'
},
{
username: 'david+saola@umbrellacost.com',
password: 'Dsamsung1!',
type: 'Direct Customer'
}
];
const results = [];
for (const account of accounts) {
const result = await this.testAccount(account.username, account.password, account.type);
if (result) {
results.push(result);
}
await new Promise(resolve => setTimeout(resolve, 2000)); // Brief pause between tests
}
console.log('\nπ COMPARISON SUMMARY');
console.log('====================');
results.forEach(result => {
console.log(`\n${result.accountType} (${result.username}):`);
console.log(` Total Savings: $${result.totalSavings.toLocaleString()}`);
console.log(` Recommendations: ${result.recCount}`);
console.log(` Data Available: ${result.hasData ? 'β
Yes' : 'β No'}`);
});
const mspResult = results.find(r => r.accountType === 'MSP');
const directResult = results.find(r => r.accountType === 'Direct Customer');
console.log('\nπ ANALYSIS:');
if (directResult?.hasData && !mspResult?.hasData) {
console.log('β
DIRECT CUSTOMER account has recommendations data');
console.log('β MSP account shows no recommendations data');
console.log('\nThis indicates:');
console.log(' 1. Recommendations service is working (Direct Customer proves this)');
console.log(' 2. MSP account configuration issue OR');
console.log(' 3. MSP accounts don\'t have recommendations enabled OR');
console.log(' 4. MSP recommendations require specific customer context');
} else if (!directResult?.hasData && !mspResult?.hasData) {
console.log('β BOTH accounts show no recommendations data');
console.log('\nThis indicates:');
console.log(' 1. Recommendations service not configured for these accounts');
console.log(' 2. Environment issue (sandbox/test data)');
console.log(' 3. Recommendations service may be disabled globally');
} else if (mspResult?.hasData) {
console.log('β
MSP account has recommendations data');
console.log('\nThe $5000 savings expectation may be:');
console.log(' 1. Outdated/stale data expectations');
console.log(' 2. Environment-specific (prod vs dev data)');
}
}
async cleanup() {
if (this.server) {
this.server.kill();
}
}
async run() {
try {
await this.start();
await this.compare();
} finally {
await this.cleanup();
console.log('\nπ Account Comparison Complete');
}
}
}
const comparator = new AccountComparison();
comparator.run();