import Redis from 'ioredis' const redis = new Redis({ host: 'redis', port: 6379, lazyConnect: true }) const QUEUE = 'dev-tasks' const LOG = 'dev-logs' function log(level, msg) { const line = JSON.stringify({ ts: new Date().toISOString(), level, msg }) redis.publish(LOG, line).catch(() => {}) console.log(`[${level}] ${msg}`) } async function claimTask(task) { await redis.hset(`agent:agent-frontend:task`, task.id, JSON.stringify(task)) await redis.hset(`agent:agent-frontend`, 'status', 'busy') await redis.hset(`agent:agent-frontend`, 'current_task', task.title) await redis.publish(LOG, JSON.stringify({ ts: new Date().toISOString(), level: 'AGENT', msg: `Frontend pegou: "${task.title}"` })) task.status = 'in_progress' task.assignee = 'agent-frontend' await redis.set(`task:${task.id}`, JSON.stringify(task)) log('AGENT', `▶️ Processando: ${task.title}`) await new Promise(r => setTimeout(r, Math.random() * 5000 + 2000)) task.status = 'done' task.done_at = new Date().toISOString() await redis.set(`task:${task.id}`, JSON.stringify(task)) await redis.hset(`agent:agent-frontend`, 'status', 'idle') await redis.hdel(`agent:agent-frontend:task`, task.id) awaitingTask(task) } async function awaitingTask(task) { await redis.hset(`agent:agent-frontend`, 'status', 'idle') await redis.hdel(`agent:agent-frontend:task`, task.id) log('AGENT', `✔️ Concluído: ${task.title}`) } async function run() { await redis.connect() await redis.set('agent:agent-frontend', JSON.stringify({ id: 'agent-frontend', role: 'frontend', status: 'online', started_at: new Date().toISOString(), tasks_done: 0, })) log('AGENT', 'Frontend Agent online — aguardando tarefas') while (true) { const [_, taskId] = await redis.blpop(QUEUE, 60) if (!taskId) { await new Promise(r => setTimeout(r, 1000)); continue } const raw = await redis.get(`task:${taskId}`) if (!raw) continue const task = JSON.parse(raw) if (task.domain !== 'frontend' && task.domain !== 'fullstack') { await redis.rpush(QUEUE, taskId); continue } await claimTask(task) } } run().catch(e => { console.error(e); process.exit(1) })