← back to Dw Boardroom V2

src/api/routes/agents.ts

68 lines

// ═══════════════════════════════════════════════
// DW Boardroom V2 — Agent Routes
// ═══════════════════════════════════════════════

import { Router } from 'express';
import { TEAM_AGENTS, EXECUTIVES, getAgent, getExec, getAgentsByDept, getTeamsByExec, DEPARTMENT_GROUPS } from '../../agents/registry';
import { generateDialogue } from '../../engine/agentDialogue';

const router = Router();

// GET /api/agents — full roster
router.get('/', (req, res) => {
  const dept = req.query.dept as string | undefined;
  let agents = dept ? getAgentsByDept(dept) : TEAM_AGENTS;
  res.json({
    agents,
    executives: EXECUTIVES,
    total: agents.length,
    departments: Object.keys(DEPARTMENT_GROUPS),
  });
});

// GET /api/agents/teams — grouped by exec
router.get('/teams', (req, res) => {
  const teams = getTeamsByExec();
  res.json(teams);
});

// GET /api/agents/:name — agent detail
router.get('/:name', (req, res) => {
  const agent = getAgent(req.params.name) || getExec(req.params.name);
  if (!agent) {
    res.status(404).json({ error: 'Agent not found' });
    return;
  }
  res.json(agent);
});

// POST /api/agents/:name/speak — generate dialogue
router.post('/:name/speak', async (req, res) => {
  try {
    const agent = getAgent(req.params.name);
    const exec = getExec(req.params.name);
    const entity = agent || exec;

    if (!entity) {
      res.status(404).json({ error: 'Agent not found' });
      return;
    }

    const { topic, phase, meetingType } = req.body;
    const dialogue = await generateDialogue(
      entity.id || req.params.name,
      entity.name,
      entity.role,
      phase || 'current_business',
      topic || 'General discussion',
      meetingType || 'strategic'
    );

    res.json({ agent: entity.name, dialogue });
  } catch (err: any) {
    res.status(500).json({ error: err.message });
  }
});

export default router;