import { test, expect } from '@playwright/test' import { API_KEY_HEADER } from './helpers' test.describe('Agent Comms Feed', () => { test('includes coordinator session traffic and tool-call events', async ({ request }) => { const stamp = Date.now() const from = `e2e-operator-${stamp}` const coordinator = 'coordinator' const conv = `coord:${from}:${coordinator}` const since = Math.floor(stamp / 1000) - 2 const first = await request.post('/api/chat/messages', { headers: API_KEY_HEADER, data: { from, to: coordinator, content: 'Kick off orchestration for this task.', message_type: 'text', conversation_id: conv, metadata: { channel: 'coordinator-inbox' }, }, }) expect(first.status()).toBe(201) const second = await request.post('/api/chat/messages', { headers: API_KEY_HEADER, data: { from: coordinator, to: from, content: 'Received. Coordinating now.', message_type: 'status', conversation_id: conv, metadata: { status: 'accepted' }, }, }) expect(second.status()).toBe(201) const third = await request.post('/api/chat/messages', { headers: API_KEY_HEADER, data: { from: coordinator, to: from, content: 'search_web', message_type: 'tool_call', conversation_id: conv, metadata: { event: 'tool_call', toolName: 'search_web', input: '{"query":"mission control agent comms"}', output: '{"results":3}', status: 'ok', }, }, }) expect(third.status()).toBe(201) const res = await request.get(`/api/agents/comms?agent=${encodeURIComponent(coordinator)}&since=${since}&limit=200`, { headers: API_KEY_HEADER, }) expect(res.status()).toBe(200) const body = await res.json() const threadRows = (body.messages || []).filter((m: any) => m.conversation_id === conv) expect(threadRows.length).toBeGreaterThanOrEqual(3) const toolEvent = threadRows.find((m: any) => m.message_type === 'tool_call') expect(toolEvent).toBeTruthy() expect(toolEvent.metadata).toBeTruthy() expect(toolEvent.metadata.toolName).toBe('search_web') expect(toolEvent.metadata.input).toContain('agent comms') }) test('includes session-thread traffic for gateway/local mode compatibility', async ({ request }) => { const stamp = Date.now() const conv = `session:gateway:e2e-${stamp}` const since = Math.floor(Date.now() / 1000) - 60 const sent = await request.post('/api/chat/messages', { headers: API_KEY_HEADER, data: { from: 'coordinator', to: 'builder', content: 'Session-scoped runtime message', message_type: 'text', conversation_id: conv, }, }) expect(sent.status()).toBe(201) const sentBody = await sent.json() expect(sentBody?.message?.conversation_id).toBe(conv) const rawRes = await request.get(`/api/chat/messages?conversation_id=${encodeURIComponent(conv)}&limit=20`, { headers: API_KEY_HEADER, }) expect(rawRes.status()).toBe(200) const rawBody = await rawRes.json() expect((rawBody.messages || []).length).toBeGreaterThanOrEqual(1) const res = await request.get(`/api/agents/comms?since=${since}&limit=200`, { headers: API_KEY_HEADER, }) expect(res.status()).toBe(200) const body = await res.json() const threadRows = (body.messages || []).filter((m: any) => m.conversation_id === conv) expect(threadRows.length).toBeGreaterThanOrEqual(1) expect(threadRows[0].content).toContain('Session-scoped') }) })