class AgentMeshClient {
constructor(url, token) {
this.ws = new WebSocket(`${url}?token=${token}`);
this.requestId = 0;
this.pendingRequests = new Map();
this.ws.onmessage = (event) => {
const message = JSON.parse(event.data);
this.handleMessage(message);
};
}
// Send request and wait for response
async request(type, payload) {
return new Promise((resolve, reject) => {
const id = `req_${++this.requestId}`;
this.pendingRequests.set(id, { resolve, reject });
this.ws.send(JSON.stringify({
type,
id,
payload,
timestamp: new Date().toISOString(),
}));
// Timeout after 30 seconds
setTimeout(() => {
if (this.pendingRequests.has(id)) {
this.pendingRequests.delete(id);
reject(new Error('Request timeout'));
}
}, 30000);
});
}
// Handle incoming messages
handleMessage(message) {
// Handle responses to requests
if (message.id && this.pendingRequests.has(message.id)) {
const { resolve, reject } = this.pendingRequests.get(message.id);
this.pendingRequests.delete(message.id);
if (message.type === 'error') {
reject(new Error(message.payload.message));
} else {
resolve(message.payload);
}
return;
}
// Handle push notifications
switch (message.type) {
case 'task.message':
this.onTaskMessage(message.payload);
break;
case 'task.status':
this.onTaskStatus(message.payload);
break;
case 'artifact.created':
this.onArtifactCreated(message.payload);
break;
case 'task.completed':
this.onTaskCompleted(message.payload);
break;
}
}
// Execute task
async executeTask(agentName, sessionId, message) {
return await this.request('task.execute', {
agentName,
sessionId,
message,
});
}
// Cancel task
async cancelTask(taskId) {
return await this.request('task.cancel', { taskId });
}
// Subscribe to task updates
async subscribeToTask(taskId) {
return await this.request('task.subscribe', { taskId });
}
// Event handlers (override these)
onTaskMessage(payload) {
console.log('Task message:', payload);
}
onTaskStatus(payload) {
console.log('Task status:', payload.status);
}
onArtifactCreated(payload) {
console.log('Artifact created:', payload.artifact.filename);
}
onTaskCompleted(payload) {
console.log('Task completed:', payload.taskId);
}
}
// Usage
const client = new AgentMeshClient(
'ws://localhost:8080/ws',
'YOUR_TOKEN'
);
// Override event handlers
client.onTaskMessage = (payload) => {
console.log('Agent:', payload.message.text);
};
client.onArtifactCreated = (payload) => {
console.log('Download:', payload.artifact.downloadUrl);
};
// Execute task
try {
const result = await client.executeTask(
'FileSystemAgent',
'user123_session',
{ text: 'List all files' }
);
console.log('Task created:', result.taskId);
// Subscribe to updates
await client.subscribeToTask(result.taskId);
} catch (error) {
console.error('Error:', error);
}