59 lines
1.5 KiB
JavaScript
59 lines
1.5 KiB
JavaScript
const AgentWorker = require('./agent-worker.js');
|
|
|
|
class AgentPool {
|
|
constructor(sessionStore, maxWorkers = 4) {
|
|
this.store = sessionStore;
|
|
this.maxWorkers = maxWorkers;
|
|
this.workers = new Map();
|
|
this.queue = [];
|
|
this.results = new Map();
|
|
}
|
|
|
|
async submitTask(task, context) {
|
|
if (this.workers.size >= this.maxWorkers) {
|
|
// Queue it
|
|
return new Promise((resolve) => {
|
|
this.queue.push({ task, context, resolve });
|
|
});
|
|
}
|
|
return this._executeTask(task, context);
|
|
}
|
|
|
|
async _executeTask(task, context) {
|
|
const id = task.id || ('task_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8));
|
|
this.store.createSession(id, task.name, JSON.stringify({ task, context }));
|
|
const worker = new AgentWorker(id, task, context, this.store);
|
|
this.workers.set(id, worker);
|
|
const result = await worker.run();
|
|
this.results.set(id, result);
|
|
this.workers.delete(id);
|
|
|
|
// Process queue
|
|
if (this.queue.length > 0) {
|
|
const next = this.queue.shift();
|
|
next.resolve(this._executeTask(next.task, next.context));
|
|
}
|
|
|
|
return { id, result, status: worker.getStatus() };
|
|
}
|
|
|
|
async submitAll(tasks, context) {
|
|
const promises = tasks.map(t => this.submitTask(t, context));
|
|
return Promise.all(promises);
|
|
}
|
|
|
|
getResults() {
|
|
return Object.fromEntries(this.results);
|
|
}
|
|
|
|
getPendingCount() {
|
|
return this.queue.length;
|
|
}
|
|
|
|
getActiveCount() {
|
|
return this.workers.size;
|
|
}
|
|
}
|
|
|
|
module.exports = AgentPool;
|