curaflow/backend/agents/AgentManager.js

64 lines
2.2 KiB
JavaScript

const { query } = require('../db');
const BillingAgent = require('./BillingAgent');
const TriageAgent = require('./TriageAgent');
const FollowUpAgent = require('./FollowUpAgent');
const InventoryAgent = require('./InventoryAgent');
const CDSSAgent = require('./CDSSAgent');
class AgentManager {
constructor() {
this.agents = {};
this.registerAgent('BILLING', BillingAgent);
this.registerAgent('TRIAGE', TriageAgent);
this.registerAgent('FOLLOWUP', FollowUpAgent);
this.registerAgent('INVENTORY', InventoryAgent);
this.registerAgent('CDSS', CDSSAgent);
}
/**
* Register an agent instance mapped to its type enum.
*/
registerAgent(agentType, agentInstance) {
this.agents[agentType] = agentInstance;
console.log(`[AgentManager] Registered: ${agentType}`);
}
/**
* The core event dispatcher.
* E.g. dispatch('sharma-clinic', 'BILLING', { clinicalNotes: '...' })
*/
async dispatch(tenantId, agentType, payload) {
if (!this.agents[agentType]) {
console.error(`[AgentManager] Agent type ${agentType} is not registered in the system.`);
return null;
}
try {
// Check if clinic has this agent enabled
const dbCheck = await query(
'SELECT is_active, config FROM agent_configs WHERE tenant_id = $1 AND agent_type = $2',
[tenantId, agentType]
);
if (dbCheck.rows.length === 0 || !dbCheck.rows[0].is_active) {
console.log(`[AgentManager] Skipped ${agentType} for tenant ${tenantId} (Not enabled)`);
return null;
}
const config = dbCheck.rows[0].config;
console.log(`[AgentManager] Dispatched ${agentType} for tenant ${tenantId}`);
// Execute the agent asynchronously so it doesn't block the main thread
return this.agents[agentType].execute(config, payload).catch(err => {
console.error(`[AgentManager] ${agentType} execution error:`, err);
});
} catch (err) {
console.error(`[AgentManager] Dispatch error for ${agentType}:`, err);
}
}
}
// Singleton instance
module.exports = new AgentManager();