@stackmemoryai/stackmemory
Version:
Lossless, project-scoped memory for AI coding tools. Durable context across sessions with 56 MCP tools, FTS5 search, conductor orchestrator, loop/watch monitoring, snapshot capture, pre-flight overlap checks, Claude/Codex/OpenCode wrappers, Linear sync, a
108 lines (107 loc) • 2.87 kB
JavaScript
import { fileURLToPath as __fileURLToPath } from 'url';
import { dirname as __pathDirname } from 'path';
const __filename = __fileURLToPath(import.meta.url);
const __dirname = __pathDirname(__filename);
import { EventEmitter } from "events";
import { logger } from "../../../core/monitoring/logger.js";
class SwarmRegistry extends EventEmitter {
static instance = null;
swarms = /* @__PURE__ */ new Map();
constructor() {
super();
logger.info("SwarmRegistry initialized");
}
static getInstance() {
if (!SwarmRegistry.instance) {
SwarmRegistry.instance = new SwarmRegistry();
}
return SwarmRegistry.instance;
}
/**
* Register a swarm coordinator
*/
registerSwarm(coordinator, description) {
const swarmId = this.generateSwarmId();
const registration = {
id: swarmId,
coordinator,
startTime: Date.now(),
status: "active",
description
};
this.swarms.set(swarmId, registration);
this.emit("swarmRegistered", registration);
logger.info(`Swarm registered: ${swarmId} - ${description}`);
return swarmId;
}
/**
* Unregister a swarm
*/
unregisterSwarm(swarmId) {
const swarm = this.swarms.get(swarmId);
if (swarm) {
this.swarms.delete(swarmId);
this.emit("swarmUnregistered", { id: swarmId });
logger.info(`Swarm unregistered: ${swarmId}`);
}
}
/**
* Get a specific swarm by ID
*/
getSwarm(swarmId) {
return this.swarms.get(swarmId) || null;
}
/**
* List all active swarms
*/
listActiveSwarms() {
return Array.from(this.swarms.values()).filter(
(swarm) => swarm.status === "active"
);
}
/**
* Update swarm status
*/
updateSwarmStatus(swarmId, status) {
const swarm = this.swarms.get(swarmId);
if (swarm) {
swarm.status = status;
this.emit("swarmStatusChanged", { id: swarmId, status });
logger.debug(`Swarm ${swarmId} status updated: ${status}`);
}
}
/**
* Get swarm statistics
*/
getStatistics() {
const active = this.listActiveSwarms();
const completed = Array.from(this.swarms.values()).filter(
(s) => s.status === "completed"
);
const totalUptime = active.reduce(
(sum, swarm) => sum + (Date.now() - swarm.startTime),
0
);
return {
totalSwarms: this.swarms.size,
activeSwarms: active.length,
completedSwarms: completed.length,
averageUptime: active.length > 0 ? totalUptime / active.length : 0
};
}
/**
* Cleanup all swarms and reset registry
*/
cleanup() {
this.swarms.clear();
logger.info("SwarmRegistry cleaned up");
}
generateSwarmId() {
return `swarm_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
}
}
var swarm_registry_default = SwarmRegistry;
export {
SwarmRegistry,
swarm_registry_default as default
};