Ctrl K
ComunidadGuías…

test-process-simulation.js

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/usr/bin/env node

/**
 * Test Process Simulation - Lead-to-Customer via MCP Skills
 *
 * Simulates a complete business process using Supabase edge functions
 * and tests all key steps: lead creation → enrichment → qualification → deal
 */

const SUPABASE_URL = process.env.VITE_SUPABASE_URL || 'http://localhost:54321';
// No default: a key in the tree is a key in every fork (CLAUDE.md, "never add an instance default").
const SUPABASE_KEY = process.env.VITE_SUPABASE_ANON_KEY;
if (!SUPABASE_KEY) {
  console.error('VITE_SUPABASE_ANON_KEY is not set — point this script at a stack with VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY.');
  process.exit(1);
}

// Simulated lead data
const testLead = {
  name: 'Sofia Bergström',
  email: 'sofia.bergstrom@techstartup.se',
  phone: '+46 70 123 4567',
  company_name: 'TechStartup AB',
  company_domain: 'techstartup.se',
  source: 'booking-form'
};

// Helper to make skill calls via Supabase edge function
async function callSkill(skillName, params) {
  const endpoint = `${SUPABASE_URL}/functions/v1/agent-execute`;

  const payload = {
    skill_name: skillName,
    arguments: params,
    agent_type: 'admin-tester',
  };

  console.log(`\n📡 Calling skill: ${skillName}`);
  console.log(`   Parameters: ${JSON.stringify(params, null, 2)}`);

  try {
    const response = await fetch(endpoint, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'apikey': SUPABASE_KEY,
        'Authorization': `Bearer ${SUPABASE_KEY}`,
      },
      body: JSON.stringify(payload),
    });

    const data = await response.json();

    if (!response.ok) {
      console.error(`❌ Error: ${response.status}`);
      console.error(`   Response: ${JSON.stringify(data)}`);
      return null;
    }

    console.log(`✅ Success: ${JSON.stringify(data, null, 2)}`);
    return data;
  } catch (error) {
    console.error(`❌ Network error: ${error.message}`);
    console.error(`   Endpoint: ${endpoint}`);
    return null;
  }
}

async function testLeadToCustomerProcess() {
  console.log('🚀 Starting Lead-to-Customer Process Simulation\n');
  console.log('='.repeat(60));

  // Step 1: Add Lead
  console.log('\n📝 STEP 1: Add Lead');
  console.log('-'.repeat(60));
  const addLeadResult = await callSkill('add_lead', {
    name: testLead.name,
    email: testLead.email,
    phone: testLead.phone,
    source: testLead.source,
  });

  if (!addLeadResult?.lead_id) {
    console.error('❌ Failed to create lead. Stopping process.');
    return;
  }

  const leadId = addLeadResult.lead_id;
  console.log(`\n✅ Lead created with ID: ${leadId}`);

  // Step 2: Create Company (if not exists)
  console.log('\n\n🏢 STEP 2: Manage Company');
  console.log('-'.repeat(60));
  const companyResult = await callSkill('manage_company', {
    action: 'create',
    name: testLead.company_name,
    domain: testLead.company_domain,
  });

  const companyId = companyResult?.company_id;
  console.log(`\n✅ Company processed: ${companyId || 'linked to existing'}`);

  // Step 3: Enrich Company (if ID available)
  if (companyId) {
    console.log('\n\n💎 STEP 3: Enrich Company');
    console.log('-'.repeat(60));
    const enrichResult = await callSkill('enrich_company', {
      companyId: companyId,
      domain: testLead.company_domain,
    });
    console.log(`\n✅ Company enriched with industry/size data`);
  }

  // Step 4: Qualify Lead
  console.log('\n\n🎯 STEP 4: Qualify Lead');
  console.log('-'.repeat(60));
  const qualifyResult = await callSkill('qualify_lead', {
    leadId: leadId,
  });

  if (qualifyResult) {
    console.log(`\n✅ Lead Scoring Results:`);
    console.log(`   Score: ${qualifyResult.score || 'N/A'}`);
    console.log(`   Engagement: ${qualifyResult.engagement_level || 'N/A'}`);
    console.log(`   Activity Count: ${qualifyResult.activity_count || 0}`);
  }

  // Step 5: Create Deal
  console.log('\n\n🤝 STEP 5: Create Deal from Lead');
  console.log('-'.repeat(60));
  const dealResult = await callSkill('manage_deal', {
    action: 'create',
    lead_id: leadId,
    title: `Opportunity: ${testLead.company_name} - Private AI Consultation`,
    value: 50000,
    currency: 'SEK',
    stage: 'qualified',
  });

  const dealId = dealResult?.deal_id;
  if (dealId) {
    console.log(`\n✅ Deal created with ID: ${dealId}`);
  } else {
    console.log(`\n⚠️ Deal creation status: ${JSON.stringify(dealResult)}`);
  }

  // Step 6: Create Follow-up Task
  console.log('\n\n✓ STEP 6: Create Follow-up Task');
  console.log('-'.repeat(60));
  const dueDate = new Date();
  dueDate.setDate(dueDate.getDate() + 3);

  const taskResult = await callSkill('crm_task_create', {
    title: `Follow up: ${testLead.name} - Send Proposal`,
    description: `Send consulting proposal for Private AI implementation. Key contact: ${testLead.name} (${testLead.email})`,
    due_date: dueDate.toISOString(),
    priority: 'high',
    lead_id: leadId,
    deal_id: dealId,
  });

  const taskId = taskResult?.id;
  console.log(`\n✅ Task created: ${taskId || taskResult}`);

  // Step 7: List Leads (verify creation)
  console.log('\n\n📋 STEP 7: Verify - List All Leads');
  console.log('-'.repeat(60));
  const leadsList = await callSkill('manage_leads', {
    action: 'list',
    limit: 5,
  });

  if (leadsList?.leads && Array.isArray(leadsList.leads)) {
    console.log(`\n✅ Total leads in system: ${leadsList.total || leadsList.leads.length}`);
    console.log(`   Recent leads:`);
    leadsList.leads.slice(0, 3).forEach(lead => {
      console.log(`   - ${lead.name || 'N/A'} (${lead.email}) [Score: ${lead.score || 0}]`);
    });
  }

  // Summary
  console.log('\n\n' + '='.repeat(60));
  console.log('📊 PROCESS SUMMARY');
  console.log('='.repeat(60));
  console.log(`
✅ Lead-to-Customer Process Test Completed

Process Steps Tested:
  1. ✅ Lead Capture (add_lead)
  2. ✅ Company Management (manage_company)
  3. ✅ Company Enrichment (enrich_company)
  4. ✅ Lead Qualification (qualify_lead)
  5. ✅ Deal Creation (manage_deal)
  6. ✅ Task Assignment (crm_task_create)
  7. ✅ Data Verification (manage_leads)

Results:
  - Lead ID: ${leadId}
  - Company ID: ${companyId || 'N/A'}
  - Deal ID: ${dealId || 'N/A'}
  - Task ID: ${taskId || 'N/A'}

Next Steps in Quote-to-Cash:
  When deal is won, project setup would follow with:
  - manage_project (create project from deal)
  - manage_project_task (create project tasks)
  - log_time (team logs hours)
  - invoice_from_timesheets (auto-generate invoice)
  `);
}

// Run the test
testLeadToCustomerProcess().catch(console.error);