← back to Dw Boardroom V2
src/agents/registry.ts
149 lines
// ═══════════════════════════════════════════════
// DW Boardroom V2 — Agent Registry
// All 47 agents + 5 executives ported from config.js
// ═══════════════════════════════════════════════
import type { Agent, Executive, DeptGroup } from '../types';
// President Lincoln — the owner's podium persona
// Sir Steven stands at the podium as Abraham Lincoln, the 16th President
export const BOSS_PERSONA = {
name: 'President Lincoln',
title: 'Mr. President',
fullName: 'Abraham Lincoln',
shortRef: 'the President',
podiumNote: 'Sir Steven stands at the podium as Abraham Lincoln, the 16th President. Address him formally as "Mr. President" or "President Lincoln".',
};
export const TEAM_AGENTS: Agent[] = [
// Operations
{ id: 'max', name: 'Ford', pm2: 'dw-master-hub', port: 9893, color: '#B91C1C', role: 'Fleet Commander', dept: 'Operations', hasApi: true },
{ id: 'hawk', name: 'Sven', pm2: 'dw-dashboard-monitor', port: 9990, color: '#39FF14', role: 'System Monitor', dept: 'Operations', hasApi: true },
{ id: 'clay', name: 'Seth', pm2: 'agent-cronjob', color: '#64748B', role: 'Scheduler', dept: 'Operations', hasApi: false },
{ id: 'rex', name: 'Pierce', pm2: 'timeout-agent', color: '#2C3539', role: 'Process Guardian', dept: 'Operations', hasApi: false },
{ id: 'steve', name: 'Inessa', pm2: 'server-agent', port: 9814, color: '#565672', role: 'Infrastructure', dept: 'Operations', hasApi: true },
{ id: 'vince', name: 'Vince', pm2: 'web-uptime', port: 9813, color: '#008B8B', role: 'Site Monitor', dept: 'Operations', hasApi: true },
{ id: 'link', name: 'Cora', pm2: 'dw-central', color: '#0077BE', role: 'Central Coordination', dept: 'Operations', hasApi: false },
{ id: 'abby', name: 'Abby', pm2: 'abby-agenda', port: 9826, color: '#EC4899', role: 'Agenda Manager', dept: 'Operations', hasApi: false },
// Commerce
{ id: 'shane', name: 'Shane', pm2: 'shopify-expert-agent', port: 9887, color: '#14B8A6', role: 'Shopify Expert', dept: 'Commerce', hasApi: true },
// Pipeline (Otto's team)
{ id: 'clyde', name: 'Silas', pm2: 'sku-check-skill', color: '#84CC16', role: 'SKU Auditor', dept: 'Pipeline', hasApi: false, subMgr: 'otto' },
{ id: 'dean', name: 'Cole', pm2: 'collections-agent', color: '#00A86B', role: 'Collections', dept: 'Pipeline', hasApi: false, subMgr: 'otto' },
{ id: 'blake', name: 'Piper', pm2: 'product-scheduler', port: 9600, color: '#6366F1', role: 'Product Scheduler', dept: 'Pipeline', hasApi: true, subMgr: 'otto' },
{ id: 'clark', name: 'Perry', pm2: 'update-agent', color: '#EA580C', role: 'Product Updates', dept: 'Pipeline', hasApi: false, subMgr: 'otto' },
// Finance
{ id: 'grant', name: 'Finn', pm2: 'dw-accounting', port: 9882, color: '#004225', role: 'Finance', dept: 'Finance', hasApi: true },
{ id: 'nash', name: 'Eli', pm2: 'dw-expenses-tracker', color: '#047857', role: 'Expenses', dept: 'Finance', hasApi: false },
{ id: 'hugh', name: 'Phil', pm2: 'dw-purchasing-office', port: 9880, color: '#7C3AED', role: 'Procurement', dept: 'Finance', hasApi: true },
{ id: 'annie', name: 'Penny', pm2: 'annie-arbitrage', port: 7202, color: '#E879F9', role: 'Pricing Arbitrage', dept: 'Finance', hasApi: true },
// Legal
{ id: 'frank', name: 'Lance', pm2: 'dw-legal-compliance', port: 9878, color: '#374151', role: 'Legal Compliance', dept: 'Legal', hasApi: true },
// Content & Marketing
{ id: 'bob', name: 'Craig', pm2: 'bob-the-blogger', color: '#0EA5E9', role: 'Content Creator', dept: 'Marketing', hasApi: false },
{ id: 'connie', name: 'Connie', pm2: 'connie-competitive', color: '#EF4444', role: 'Competitive Intel', dept: 'Marketing', hasApi: false },
{ id: 'sage', name: 'Tara', pm2: 'dw-trend-research', port: 9883, color: '#F59E0B', role: 'Trend Forecaster', dept: 'Marketing', hasApi: true },
{ id: 'faye', name: 'Rita', pm2: 'furniture-scene-agent', color: '#EC4899', role: 'Room Staging', dept: 'Marketing', hasApi: false },
// Catalogs — Heritage (Hugo's team)
{ id: 'ralph', name: 'Ralph', pm2: 'rl-catalog-9608', port: 9608, color: '#1E40AF', role: 'Ralph Lauren', dept: 'Catalogs-Heritage', hasApi: true, subMgr: 'hugo' },
{ id: 'sasha', name: 'Sasha', pm2: 'schu-crawler', port: 9965, color: '#8B4513', role: 'Schumacher', dept: 'Catalogs-Heritage', hasApi: true, subMgr: 'hugo' },
{ id: 'knox', name: 'Knox', pm2: 'krav-crawler', port: 9973, color: '#4B0082', role: 'Kravet', dept: 'Catalogs-Heritage', hasApi: true, subMgr: 'hugo' },
{ id: 'cleo', name: 'Cleo', pm2: 'cole-crawler', port: 9974, color: '#2F4F4F', role: 'Cole & Son', dept: 'Catalogs-Heritage', hasApi: true, subMgr: 'hugo' },
{ id: 'elise', name: 'Elise', pm2: 'elit-crawler', port: 9975, color: '#C71585', role: 'Elitis', dept: 'Catalogs-Heritage', hasApi: true, subMgr: 'hugo' },
{ id: 'artie', name: 'Artie', pm2: 'arte-crawler', port: 9961, color: '#FF4500', role: 'Arte International', dept: 'Catalogs-Heritage', hasApi: true, subMgr: 'hugo' },
// Catalogs — Modern (Mack's team)
{ id: 'kira', name: 'Kira', pm2: 'koro-crawler', port: 9962, color: '#20B2AA', role: 'Koroseal', dept: 'Catalogs-Modern', hasApi: true, subMgr: 'mack' },
{ id: 'maya', name: 'Maya', pm2: 'maya-crawler', port: 9963, color: '#DA70D6', role: 'Maya Romanoff', dept: 'Catalogs-Modern', hasApi: true, subMgr: 'mack' },
{ id: 'pj', name: 'PJ', pm2: 'pj-crawler', port: 9968, color: '#DAA520', role: 'Phillip Jeffries', dept: 'Catalogs-Modern', hasApi: true, subMgr: 'mack' },
{ id: 'ines', name: 'Ines', pm2: 'inno-crawler', port: 9970, color: '#3CB371', role: 'Innovations', dept: 'Catalogs-Modern', hasApi: true, subMgr: 'mack' },
{ id: 'beau', name: 'Beau', pm2: 'bspk-crawler', port: 9969, color: '#FF8C00', role: 'DW Bespoke', dept: 'Catalogs-Modern', hasApi: true, subMgr: 'mack' },
{ id: 'tate', name: 'Tate', pm2: 'thibaut-agent', color: '#8FBC8F', role: 'Thibaut Catalog', dept: 'Catalogs-Modern', hasApi: false, subMgr: 'mack' },
// Catalogs — National (Ned's team)
{ id: 'brock', name: 'Brock', pm2: 'brewster-york-catalog', color: '#1E3A5F', role: 'Brewster/York', dept: 'Catalogs-National', hasApi: false, subMgr: 'ned' },
{ id: 'york', name: 'York', pm2: 'york-contract-catalog', color: '#4682B4', role: 'York Contract', dept: 'Catalogs-National', hasApi: false, subMgr: 'ned' },
{ id: 'graham', name: 'Graham', pm2: 'graham-brown-catalog', color: '#DC2626', role: 'Graham & Brown', dept: 'Catalogs-National', hasApi: false, subMgr: 'ned' },
{ id: 'jade', name: 'Grace', pm2: 'gb-agent', color: '#C9A96E', role: 'Glass Bead WP', dept: 'Catalogs-National', hasApi: false, subMgr: 'ned' },
{ id: 'will', name: 'Will', pm2: 'william-watch-agent', color: '#7B2D8E', role: 'Watch Catalog', dept: 'Catalogs-National', hasApi: false, subMgr: 'ned' },
{ id: 'scout', name: 'Cyrus', pm2: 'vendor-catalog-scraper', port: 9611, color: '#FF6B35', role: 'Catalog Scraper Engine', dept: 'Catalogs-National', hasApi: true, subMgr: 'ned' },
// Catalog Leadership
{ id: 'atlas', name: 'Porter', pm2: 'product-agent', port: 9604, color: '#7B68EE', role: 'Product Master Viewer', dept: 'Catalogs', hasApi: true },
// Data & Communication
{ id: 'chet', name: 'Chet', pm2: 'slack-dm-viewer', port: 7204, color: '#4A154B', role: 'Communications', dept: 'Data', hasApi: true },
{ id: 'george', name: 'George', pm2: 'george-gmail', port: 9850, color: '#EA4335', role: 'Gmail Agent', dept: 'Data', hasApi: true },
{ id: 'ken', name: 'Trent', pm2: 'ken', color: '#FF69B4', role: 'Trading Intelligence', dept: 'Data', hasApi: false },
{ id: 'nate', name: 'Nate', pm2: 'commit-agent', color: '#059669', role: 'Note Taker & Records', dept: 'Data', hasApi: false, isNoteTaker: true },
{ id: 'ross', name: 'Arlo', pm2: 'dw-agent-directory', port: 9891, color: '#8F8F8F', role: 'Agent Directory', dept: 'Data', hasApi: true },
// Imagery
{ id: 'drew', name: 'Drew', pm2: 'dw-digital-samples', port: 9879, color: '#06B6D4', role: 'Digital Samples', dept: 'Imagery', hasApi: true },
{ id: 'chase', name: 'Miles', pm2: 'no-image-agent', color: '#F87171', role: 'Missing Images', dept: 'Imagery', hasApi: false },
// Social Media
{ id: 'iris', name: 'Iris', pm2: 'instagram-agent', port: 9870, color: '#E1306C', role: 'Instagram Agent', dept: 'Marketing', hasApi: true },
];
export const EXECUTIVES: Executive[] = [
{ id: 'ceo', name: 'Curtis', port: 7120, color: '#5B21B6', role: 'Chief Executive', avatar: 'curtis' },
{ id: 'cfo', name: 'Cliff', port: 7121, color: '#065F46', role: 'Chief Financial Officer', avatar: 'cliff' },
{ id: 'coo', name: 'Conrad', port: 7122, color: '#CD7F32', role: 'Chief Operations Officer', avatar: 'conrad' },
{ id: 'cto', name: 'Troy', port: 7124, color: '#9B111E', role: 'Chief Technology Officer', avatar: 'troy' },
{ id: 'vp-ops', name: 'Vaughn', port: 7125, color: '#6D28D9', role: 'VP of Operations', avatar: 'vaughn' },
];
export const DEPARTMENT_GROUPS: Record<string, DeptGroup> = {
'Operations': { emoji: '\u2699\uFE0F', color: '#B91C1C', leader: 'max', exec: 'coo', label: 'Ops Command' },
'Commerce': { emoji: '\uD83D\uDED2', color: '#14B8A6', leader: 'shane', exec: 'cfo', label: 'Commerce' },
'Finance': { emoji: '\uD83D\uDCB0', color: '#004225', leader: 'grant', exec: 'cfo', label: 'Finance' },
'Legal': { emoji: '\u2696\uFE0F', color: '#374151', leader: 'frank', exec: 'ceo', label: 'Legal' },
'Marketing': { emoji: '\uD83D\uDCE3', color: '#F59E0B', leader: 'sage', exec: 'vpops', label: 'Content & Staging' },
'Catalogs': { emoji: '\uD83D\uDCE6', color: '#1E3A5F', leader: 'atlas', exec: 'vpops', label: 'Catalog Leadership' },
'Catalogs-Heritage': { emoji: '\uD83C\uDFDB\uFE0F', color: '#8B4513', leader: 'ralph', exec: 'vpops', label: 'Heritage Vendors' },
'Catalogs-Modern': { emoji: '\uD83D\uDE80', color: '#20B2AA', leader: 'kira', exec: 'vpops', label: 'Modern Vendors' },
'Catalogs-National': { emoji: '\uD83C\uDDFA\uD83C\uDDF8', color: '#4682B4', leader: 'brock', exec: 'vpops', label: 'National Vendors' },
'Pipeline': { emoji: '\u26A1', color: '#6366F1', leader: 'blake', exec: 'vpops', label: 'Ops Pipeline' },
'Data': { emoji: '\uD83D\uDCCA', color: '#059669', leader: 'nate', exec: 'cto', label: 'Data & Intel' },
'Imagery': { emoji: '\uD83D\uDDBC\uFE0F', color: '#06B6D4', leader: 'drew', exec: 'vpops', label: 'Imagery' },
};
// Cross-department questioners — agents who ask questions about other dept reports
export const CROSS_DEPT_QUESTIONERS: Record<string, string[]> = {
'Operations': ['shane', 'grant', 'frank'],
'Commerce': ['hawk', 'grant', 'drew', 'frank'],
'Finance': ['shane', 'hugh', 'max'],
'Legal': ['shane', 'bob', 'max'],
'Marketing': ['shane', 'dean', 'sage'],
'Catalogs': ['shane', 'drew', 'dean', 'clark'],
'Data': ['max', 'hawk', 'shane'],
'Imagery': ['shane', 'dean', 'faye'],
};
// Helper functions
export function getAgent(id: string): Agent | undefined {
return TEAM_AGENTS.find(a => a.id === id);
}
export function getExec(id: string): Executive | undefined {
return EXECUTIVES.find(e => e.id === id);
}
export function getAgentsByDept(dept: string): Agent[] {
return TEAM_AGENTS.filter(a => a.dept === dept);
}
export function getAgentsByExec(execId: string): Agent[] {
const depts = Object.entries(DEPARTMENT_GROUPS)
.filter(([, g]) => g.exec === execId)
.map(([name]) => name);
return TEAM_AGENTS.filter(a => depts.includes(a.dept));
}
export function getTeamsByExec(): Record<string, { exec: Executive; agents: Agent[] }> {
const result: Record<string, { exec: Executive; agents: Agent[] }> = {};
for (const exec of EXECUTIVES) {
result[exec.id] = { exec, agents: getAgentsByExec(exec.id) };
}
return result;
}
export function getNoteTaker(): Agent | undefined {
return TEAM_AGENTS.find(a => a.isNoteTaker);
}