import React, { useState, useEffect } from 'react';
// Main collaboration component
const CollaborationManager = ({ collaborationManager }) => {
const [activeCollaborations, setActiveCollaborations] = useState(new Map());
useEffect(() => {
const handleCollaborationStarted = (event) => {
const { agents, id } = event.detail;
setActiveCollaborations(prev => new Map(prev.set(id, {
id,
agents,
phase: 'started',
agentStatuses: new Map(agents.map(agent => [agent.handle, 'pending']))
})));
};
const handleAgentStatusUpdated = (event) => {
const { collaborationId, agentHandle, status } = event.detail;
setActiveCollaborations(prev => {
const updated = new Map(prev);
const collaboration = updated.get(collaborationId);
if (collaboration) {
collaboration.agentStatuses.set(agentHandle, status);
updated.set(collaborationId, { ...collaboration });
}
return updated;
});
};
const handleCollaborationCompleted = (event) => {
const { id } = event.detail;
setActiveCollaborations(prev => {
const updated = new Map(prev);
updated.delete(id);
return updated;
});
};
// Add event listeners
document.addEventListener('collaboration_started', handleCollaborationStarted);
document.addEventListener('agent_status_updated', handleAgentStatusUpdated);
document.addEventListener('collaboration_completed', handleCollaborationCompleted);
return () => {
document.removeEventListener('collaboration_started', handleCollaborationStarted);
document.removeEventListener('agent_status_updated', handleAgentStatusUpdated);
document.removeEventListener('collaboration_completed', handleCollaborationCompleted);
};
}, []);
return (
<div className="collaboration-container">
{Array.from(activeCollaborations.values()).map(collaboration => (
<CollaborationStatus
key={collaboration.id}
collaboration={collaboration}
/>
))}
</div>
);
};
// Individual collaboration status component
const CollaborationStatus = ({ collaboration }) => {
const { id, agents, phase, agentStatuses } = collaboration;
return (
<div className="collaboration-status" data-collaboration={id}>
<div className="collaboration-header">
<span className="collaboration-phase">{phase}</span>
<span className="collaboration-id">ID: {id}</span>
</div>
<div className="participating-agents">
{agents.map(agent => (
<AgentStatus
key={agent.handle}
agent={agent}
status={agentStatuses.get(agent.handle) || 'pending'}
/>
))}
</div>
</div>
);
};
// Individual agent status component
const AgentStatus = ({ agent, status }) => {
const statusClass = `agent-status-indicator ${status}`;
return (
<div className="agent-status" data-agent={agent.handle}>
<span className="agent-name">@{agent.handle}</span>
<span className={statusClass}>{status}</span>
</div>
);
};