@stackmemoryai/stackmemory 1.12.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/LICENSE +131 -64
  2. package/README.md +3 -1
  3. package/bin/claude-sm +16 -1
  4. package/bin/claude-smd +16 -1
  5. package/bin/codex-smd +16 -1
  6. package/bin/gemini-sm +16 -1
  7. package/bin/hermes-sm +21 -0
  8. package/bin/hermes-smd +21 -0
  9. package/bin/opencode-sm +16 -1
  10. package/dist/src/cli/codex-sm.js +51 -11
  11. package/dist/src/cli/commands/brain.js +206 -0
  12. package/dist/src/cli/commands/company-os.js +184 -0
  13. package/dist/src/cli/commands/context.js +5 -0
  14. package/dist/src/cli/commands/operator.js +127 -0
  15. package/dist/src/cli/commands/orchestrate.js +2 -0
  16. package/dist/src/cli/commands/orchestrator.js +3 -2
  17. package/dist/src/cli/commands/patterns.js +254 -0
  18. package/dist/src/cli/commands/portal.js +161 -0
  19. package/dist/src/cli/commands/scaffold.js +92 -0
  20. package/dist/src/cli/commands/setup.js +1 -4
  21. package/dist/src/cli/commands/sync.js +253 -0
  22. package/dist/src/cli/commands/tasks.js +130 -1
  23. package/dist/src/cli/commands/vision.js +221 -0
  24. package/dist/src/cli/hermes-sm.js +224 -0
  25. package/dist/src/cli/index.js +15 -10
  26. package/dist/src/cli/utils/real-cli-bin.js +72 -0
  27. package/dist/src/core/brain/brain-store.js +187 -0
  28. package/dist/src/core/brain/brain-sync.js +193 -0
  29. package/dist/src/core/brain/index.js +78 -0
  30. package/dist/src/core/brain/types.js +10 -0
  31. package/dist/src/core/cache/token-estimator.js +24 -1
  32. package/dist/src/core/config/feature-flags.js +2 -6
  33. package/dist/src/core/context/frame-database.js +44 -0
  34. package/dist/src/core/context/recursive-context-manager.js +1 -1
  35. package/dist/src/core/context/rehydration.js +2 -1
  36. package/dist/src/core/database/sqlite-adapter.js +14 -1
  37. package/dist/src/core/models/model-router.js +33 -1
  38. package/dist/src/core/models/provider-pricing.js +58 -4
  39. package/dist/src/core/patterns/index.js +22 -0
  40. package/dist/src/core/patterns/pattern-applier.js +39 -0
  41. package/dist/src/core/patterns/pattern-observer.js +157 -0
  42. package/dist/src/core/patterns/pattern-store.js +259 -0
  43. package/dist/src/core/patterns/types.js +19 -0
  44. package/dist/src/core/retrieval/llm-context-retrieval.js +5 -4
  45. package/dist/src/core/retrieval/unified-context-assembler.js +11 -66
  46. package/dist/src/core/skill-packs/types.js +14 -1
  47. package/dist/src/core/storage/cloud-sync-manager.js +116 -0
  48. package/dist/src/core/storage/cloud-sync.js +574 -0
  49. package/dist/src/core/storage/two-tier-storage.js +5 -1
  50. package/dist/src/core/tasks/master-tasks-template.js +43 -0
  51. package/dist/src/core/tasks/md-task-parser.js +138 -0
  52. package/dist/src/core/vision/index.js +27 -0
  53. package/dist/src/core/vision/signals.js +79 -0
  54. package/dist/src/core/vision/types.js +22 -0
  55. package/dist/src/core/vision/vision-file.js +146 -0
  56. package/dist/src/core/vision/vision-loop.js +220 -0
  57. package/dist/src/core/wiki/wiki-compiler.js +103 -1
  58. package/dist/src/daemon/daemon-config.js +45 -0
  59. package/dist/src/daemon/services/desire-path-service.js +566 -0
  60. package/dist/src/daemon/services/research-stream-service.js +320 -0
  61. package/dist/src/daemon/services/telemetry-service.js +192 -0
  62. package/dist/src/daemon/unified-daemon.js +28 -1
  63. package/dist/src/features/browser/cli-browser-agent.js +417 -0
  64. package/dist/src/features/browser/stagehand-workflows.js +578 -0
  65. package/dist/src/features/operator/adapter-factory.js +62 -0
  66. package/dist/src/features/operator/browser-adapter.js +109 -0
  67. package/dist/src/features/operator/desktop-adapter.js +125 -0
  68. package/dist/src/features/operator/index.js +39 -0
  69. package/dist/src/features/operator/llm-decision.js +137 -0
  70. package/dist/src/features/operator/operator-logger.js +92 -0
  71. package/dist/src/features/operator/overnight-runner.js +327 -0
  72. package/dist/src/features/operator/screen-adapter.js +91 -0
  73. package/dist/src/features/operator/session-manager.js +127 -0
  74. package/dist/src/features/operator/state-machine.js +227 -0
  75. package/dist/src/features/operator/task-queue.js +81 -0
  76. package/dist/src/features/portal/index.js +26 -0
  77. package/dist/src/features/portal/server.js +240 -0
  78. package/dist/src/features/portal/types.js +14 -0
  79. package/dist/src/features/portal/ui.js +195 -0
  80. package/dist/src/features/tasks/task-aware-context.js +2 -1
  81. package/dist/src/features/tui/simple-monitor.js +0 -23
  82. package/dist/src/features/tui/swarm-monitor.js +8 -66
  83. package/dist/src/{integrations/diffmem/index.js → features/web/client/hooks/use-socket.js} +6 -5
  84. package/dist/src/features/web/client/lib/utils.js +12 -0
  85. package/dist/src/features/web/client/stores/session-store.js +12 -0
  86. package/dist/src/features/web/server/gcp-billing.js +76 -0
  87. package/dist/src/features/web/server/index.js +10 -0
  88. package/dist/src/features/web/server/spend-calculator.js +228 -0
  89. package/dist/src/hooks/schemas.js +4 -1
  90. package/dist/src/integrations/anthropic/client.js +3 -2
  91. package/dist/src/integrations/claude-code/agent-bridge.js +0 -3
  92. package/dist/src/integrations/claude-code/subagent-client.js +218 -11
  93. package/dist/src/integrations/claude-code/task-coordinator.js +2 -1
  94. package/dist/src/integrations/linear/webhook-retry.js +196 -0
  95. package/dist/src/integrations/linear/webhook-server.js +18 -22
  96. package/dist/src/integrations/mcp/handlers/cloud-sync-handlers.js +101 -0
  97. package/dist/src/integrations/mcp/handlers/index.js +27 -52
  98. package/dist/src/integrations/mcp/server.js +122 -335
  99. package/dist/src/integrations/mcp/tool-alias-registry.js +0 -73
  100. package/dist/src/integrations/mcp/tool-definitions.js +111 -510
  101. package/dist/src/mcp/stackmemory-mcp-server.js +404 -379
  102. package/dist/src/orchestrators/multimodal/determinism.js +2 -1
  103. package/dist/src/orchestrators/multimodal/harness.js +2 -1
  104. package/dist/src/skills/recursive-agent-orchestrator.js +2 -4
  105. package/dist/src/utils/process-cleanup.js +1 -7
  106. package/docs/README.md +42 -0
  107. package/docs/guides/README_INSTALL.md +208 -0
  108. package/package.json +18 -9
  109. package/scripts/claude-code-wrapper.sh +11 -0
  110. package/scripts/claude-sm-setup.sh +12 -1
  111. package/scripts/codex-wrapper.sh +11 -0
  112. package/scripts/git-hooks/branch-context-manager.sh +11 -0
  113. package/scripts/git-hooks/post-checkout-stackmemory.sh +11 -0
  114. package/scripts/git-hooks/post-commit-stackmemory.sh +11 -0
  115. package/scripts/git-hooks/pre-commit-stackmemory.sh +11 -0
  116. package/scripts/hooks/cleanup-shell.sh +12 -1
  117. package/scripts/hooks/task-complete.sh +12 -1
  118. package/scripts/install-code-execution-hooks.sh +12 -1
  119. package/scripts/install-sweep-hook.sh +12 -0
  120. package/scripts/install.sh +11 -0
  121. package/scripts/opencode-wrapper.sh +11 -0
  122. package/scripts/portal/cloud-init.yaml +69 -0
  123. package/scripts/portal/setup.sh +69 -0
  124. package/scripts/portal/stackmemory-portal.service +34 -0
  125. package/scripts/setup-claude-integration.sh +12 -1
  126. package/scripts/smoke-init-db.sh +23 -0
  127. package/scripts/stackmemory-daemon.sh +11 -0
  128. package/scripts/verify-dist.cjs +11 -4
  129. package/dist/src/cli/commands/ralph.js +0 -1053
  130. package/dist/src/hooks/diffmem-hooks.js +0 -376
  131. package/dist/src/integrations/diffmem/client.js +0 -208
  132. package/dist/src/integrations/diffmem/config.js +0 -14
  133. package/dist/src/integrations/greptile/client.js +0 -101
  134. package/dist/src/integrations/greptile/config.js +0 -14
  135. package/dist/src/integrations/greptile/index.js +0 -11
  136. package/dist/src/integrations/mcp/handlers/cross-search-handlers.js +0 -188
  137. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +0 -455
  138. package/dist/src/integrations/mcp/handlers/greptile-handlers.js +0 -456
  139. package/dist/src/integrations/mcp/handlers/provider-handlers.js +0 -227
  140. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -863
  141. package/dist/src/integrations/ralph/context/context-budget-manager.js +0 -308
  142. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +0 -354
  143. package/dist/src/integrations/ralph/index.js +0 -17
  144. package/dist/src/integrations/ralph/learning/pattern-learner.js +0 -416
  145. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +0 -448
  146. package/dist/src/integrations/ralph/loopmax.js +0 -488
  147. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +0 -293
  148. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +0 -107
  149. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -508
  150. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -407
  151. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +0 -495
  152. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +0 -387
  153. package/dist/src/integrations/ralph/performance/performance-optimizer.js +0 -357
  154. package/dist/src/integrations/ralph/recovery/crash-recovery.js +0 -461
  155. package/dist/src/integrations/ralph/state/state-reconciler.js +0 -420
  156. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +0 -444
  157. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +0 -1005
  158. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +0 -635
  159. package/scripts/ralph-loop-implementation.js +0 -404
  160. /package/dist/src/{integrations/diffmem/types.js → core/storage/cloud-sync-types.js} +0 -0
  161. /package/dist/src/{integrations/greptile → features/operator}/types.js +0 -0
  162. /package/dist/src/{integrations/ralph/types.js → features/web/client/next-env.d.js} +0 -0
@@ -1,293 +0,0 @@
1
- import { fileURLToPath as __fileURLToPath } from 'url';
2
- import { dirname as __pathDirname } from 'path';
3
- const __filename = __fileURLToPath(import.meta.url);
4
- const __dirname = __pathDirname(__filename);
5
- import { EventEmitter } from "events";
6
- import { logger } from "../../../core/monitoring/logger.js";
7
- class SwarmDashboard extends EventEmitter {
8
- metrics = /* @__PURE__ */ new Map();
9
- alerts = [];
10
- monitoringInterval;
11
- swarmCoordinator;
12
- constructor(swarmCoordinator) {
13
- super();
14
- this.swarmCoordinator = swarmCoordinator;
15
- this.setupDefaultAlerts();
16
- }
17
- /**
18
- * Start real-time monitoring
19
- */
20
- startMonitoring(intervalMs = 5e3) {
21
- this.monitoringInterval = setInterval(() => {
22
- this.collectMetrics();
23
- this.checkAlerts();
24
- }, intervalMs);
25
- logger.info("Swarm monitoring dashboard started");
26
- }
27
- /**
28
- * Stop monitoring
29
- */
30
- stopMonitoring() {
31
- if (this.monitoringInterval) {
32
- clearInterval(this.monitoringInterval);
33
- this.monitoringInterval = void 0;
34
- }
35
- logger.info("Swarm monitoring dashboard stopped");
36
- }
37
- /**
38
- * Get current metrics for a swarm
39
- */
40
- getSwarmMetrics(swarmId) {
41
- return this.metrics.get(swarmId);
42
- }
43
- /**
44
- * Get all active swarm metrics
45
- */
46
- getAllMetrics() {
47
- return Array.from(this.metrics.values());
48
- }
49
- /**
50
- * Add custom alert rule
51
- */
52
- addAlert(rule) {
53
- this.alerts.push(rule);
54
- logger.info(`Added alert rule: ${rule.id}`);
55
- }
56
- /**
57
- * Generate real-time dashboard HTML
58
- */
59
- generateDashboardHTML() {
60
- const metrics = this.getAllMetrics();
61
- return `
62
- <!DOCTYPE html>
63
- <html>
64
- <head>
65
- <title>Ralph Swarm Dashboard</title>
66
- <style>
67
- body { font-family: Arial, sans-serif; margin: 20px; background: #f5f5f5; }
68
- .dashboard { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
69
- .card { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
70
- .metric { display: flex; justify-content: space-between; margin: 10px 0; }
71
- .status-active { color: #28a745; }
72
- .status-error { color: #dc3545; }
73
- .status-idle { color: #6c757d; }
74
- .alert-critical { color: #dc3545; font-weight: bold; }
75
- .progress { background: #e9ecef; border-radius: 4px; height: 8px; }
76
- .progress-bar { background: #007bff; height: 100%; border-radius: 4px; }
77
- </style>
78
- <script>
79
- setTimeout(() => location.reload(), 5000); // Auto-refresh
80
- </script>
81
- </head>
82
- <body>
83
- <h1>\u{1F9BE} Ralph Swarm Dashboard</h1>
84
- <div class="dashboard">
85
- ${metrics.map(
86
- (swarm) => `
87
- <div class="card">
88
- <h3>Swarm ${swarm.swarmId.substring(0, 8)}</h3>
89
- <div class="metric">
90
- <span>Status:</span>
91
- <span class="status-${swarm.status}">${swarm.status.toUpperCase()}</span>
92
- </div>
93
- <div class="metric">
94
- <span>Agents:</span>
95
- <span>${swarm.activeAgents}/${swarm.totalAgents}</span>
96
- </div>
97
- <div class="metric">
98
- <span>Tasks:</span>
99
- <span>${swarm.completedTasks}/${swarm.activeTasks + swarm.completedTasks}</span>
100
- </div>
101
- <div class="metric">
102
- <span>Throughput:</span>
103
- <span>${swarm.performance.throughput.toFixed(2)} tasks/min</span>
104
- </div>
105
- <div class="metric">
106
- <span>Memory:</span>
107
- <span>${swarm.resourceUsage.memoryMB} MB</span>
108
- </div>
109
- <div class="metric">
110
- <span>Uptime:</span>
111
- <span>${Math.round(swarm.performance.uptime / 1e3)}s</span>
112
- </div>
113
- <div style="margin-top: 15px;">
114
- <h4>Agents:</h4>
115
- ${swarm.agents.map(
116
- (agent) => `
117
- <div class="metric">
118
- <span>${agent.role}:</span>
119
- <span class="status-${agent.status}">${agent.status}</span>
120
- </div>
121
- `
122
- ).join("")}
123
- </div>
124
- </div>
125
- `
126
- ).join("")}
127
- </div>
128
-
129
- <div class="card" style="margin-top: 20px;">
130
- <h3>\u{1F6A8} Active Alerts</h3>
131
- <div id="alerts">${this.getActiveAlerts().map(
132
- (alert) => `<div class="alert-${alert.severity}">${alert.message}</div>`
133
- ).join("")}</div>
134
- </div>
135
- </body>
136
- </html>`;
137
- }
138
- /**
139
- * Export metrics to JSON
140
- */
141
- exportMetrics() {
142
- return JSON.stringify(
143
- {
144
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
145
- swarms: this.getAllMetrics(),
146
- alerts: this.getActiveAlerts()
147
- },
148
- null,
149
- 2
150
- );
151
- }
152
- collectMetrics() {
153
- const usage = this.swarmCoordinator.getResourceUsage();
154
- const swarmState = this.swarmCoordinator.swarmState;
155
- if (!swarmState || !swarmState.id) return;
156
- const metrics = {
157
- swarmId: swarmState.id,
158
- status: swarmState.status,
159
- totalAgents: usage.activeAgents,
160
- activeAgents: usage.activeAgents,
161
- completedTasks: swarmState.completedTaskCount || 0,
162
- activeTasks: swarmState.activeTaskCount || 0,
163
- averageTaskTime: 0,
164
- // Calculate from agent metrics
165
- resourceUsage: {
166
- memoryMB: usage.memoryEstimate,
167
- cpuPercent: this.estimateCpuUsage(),
168
- diskMB: this.estimateDiskUsage()
169
- },
170
- performance: {
171
- throughput: swarmState.performance?.throughput || 0,
172
- efficiency: swarmState.performance?.efficiency || 0,
173
- uptime: Date.now() - swarmState.startTime
174
- },
175
- agents: this.collectAgentMetrics()
176
- };
177
- this.metrics.set(swarmState.id, metrics);
178
- this.emit("metricsUpdated", metrics);
179
- }
180
- collectAgentMetrics() {
181
- const agents = this.swarmCoordinator.activeAgents;
182
- if (!agents) return [];
183
- return Array.from(agents.values()).map(
184
- (agent) => ({
185
- id: agent.id,
186
- role: agent.role,
187
- status: agent.status,
188
- currentTask: agent.currentTask || void 0,
189
- tasksCompleted: agent.performance?.tasksCompleted || 0,
190
- averageTaskTime: agent.performance?.averageTaskTime || 0,
191
- successRate: agent.performance?.successRate || 1,
192
- lastActivity: agent.performance?.lastFreshStart || Date.now(),
193
- resourceUsage: {
194
- memoryMB: 50,
195
- // Estimate per agent
196
- iterations: agent.performance?.tasksCompleted || 0
197
- }
198
- })
199
- );
200
- }
201
- checkAlerts() {
202
- const metrics = this.getAllMetrics();
203
- for (const swarmMetrics of metrics) {
204
- for (const alert of this.alerts) {
205
- if (this.evaluateAlertCondition(alert, swarmMetrics)) {
206
- this.emit("alert", {
207
- ...alert,
208
- swarmId: swarmMetrics.swarmId,
209
- timestamp: Date.now(),
210
- value: this.getMetricValue(alert.condition, swarmMetrics)
211
- });
212
- }
213
- }
214
- }
215
- }
216
- evaluateAlertCondition(alert, metrics) {
217
- const value = this.getMetricValue(alert.condition, metrics);
218
- switch (alert.type) {
219
- case "performance":
220
- return value < alert.threshold;
221
- case "error":
222
- return 1 - metrics.performance.efficiency > alert.threshold;
223
- case "resource":
224
- return metrics.resourceUsage.memoryMB > alert.threshold;
225
- case "completion":
226
- return metrics.performance.uptime > alert.threshold;
227
- default:
228
- return false;
229
- }
230
- }
231
- getMetricValue(condition, metrics) {
232
- if (condition.includes("throughput")) return metrics.performance.throughput;
233
- if (condition.includes("efficiency")) return metrics.performance.efficiency;
234
- if (condition.includes("memory")) return metrics.resourceUsage.memoryMB;
235
- if (condition.includes("uptime")) return metrics.performance.uptime;
236
- return 0;
237
- }
238
- getActiveAlerts() {
239
- return [];
240
- }
241
- estimateCpuUsage() {
242
- const activeAgents = this.collectAgentMetrics().filter(
243
- (a) => a.status === "active"
244
- ).length;
245
- return Math.min(activeAgents * 15, 100);
246
- }
247
- estimateDiskUsage() {
248
- const usage = this.swarmCoordinator.getResourceUsage();
249
- return usage.workingDirectories.length * 10;
250
- }
251
- setupDefaultAlerts() {
252
- this.alerts = [
253
- {
254
- id: "low-throughput",
255
- type: "performance",
256
- condition: "throughput < 0.5",
257
- threshold: 0.5,
258
- message: "Low throughput detected: Less than 0.5 tasks per minute",
259
- severity: "medium"
260
- },
261
- {
262
- id: "high-memory",
263
- type: "resource",
264
- condition: "memory > 500",
265
- threshold: 500,
266
- message: "High memory usage detected: Over 500MB",
267
- severity: "high"
268
- },
269
- {
270
- id: "long-running",
271
- type: "completion",
272
- condition: "uptime > 1800000",
273
- threshold: 18e5,
274
- // 30 minutes
275
- message: "Long running swarm detected: Over 30 minutes",
276
- severity: "low"
277
- },
278
- {
279
- id: "low-efficiency",
280
- type: "error",
281
- condition: "errorRate > 0.3",
282
- threshold: 0.3,
283
- message: "High error rate detected: Over 30% failure rate",
284
- severity: "critical"
285
- }
286
- ];
287
- }
288
- }
289
- var swarm_dashboard_default = SwarmDashboard;
290
- export {
291
- SwarmDashboard,
292
- swarm_dashboard_default as default
293
- };
@@ -1,107 +0,0 @@
1
- import { fileURLToPath as __fileURLToPath } from 'url';
2
- import { dirname as __pathDirname } from 'path';
3
- const __filename = __fileURLToPath(import.meta.url);
4
- const __dirname = __pathDirname(__filename);
5
- import { EventEmitter } from "events";
6
- import { logger } from "../../../core/monitoring/logger.js";
7
- class SwarmRegistry extends EventEmitter {
8
- static instance = null;
9
- swarms = /* @__PURE__ */ new Map();
10
- constructor() {
11
- super();
12
- logger.info("SwarmRegistry initialized");
13
- }
14
- static getInstance() {
15
- if (!SwarmRegistry.instance) {
16
- SwarmRegistry.instance = new SwarmRegistry();
17
- }
18
- return SwarmRegistry.instance;
19
- }
20
- /**
21
- * Register a swarm coordinator
22
- */
23
- registerSwarm(coordinator, description) {
24
- const swarmId = this.generateSwarmId();
25
- const registration = {
26
- id: swarmId,
27
- coordinator,
28
- startTime: Date.now(),
29
- status: "active",
30
- description
31
- };
32
- this.swarms.set(swarmId, registration);
33
- this.emit("swarmRegistered", registration);
34
- logger.info(`Swarm registered: ${swarmId} - ${description}`);
35
- return swarmId;
36
- }
37
- /**
38
- * Unregister a swarm
39
- */
40
- unregisterSwarm(swarmId) {
41
- const swarm = this.swarms.get(swarmId);
42
- if (swarm) {
43
- this.swarms.delete(swarmId);
44
- this.emit("swarmUnregistered", { id: swarmId });
45
- logger.info(`Swarm unregistered: ${swarmId}`);
46
- }
47
- }
48
- /**
49
- * Get a specific swarm by ID
50
- */
51
- getSwarm(swarmId) {
52
- return this.swarms.get(swarmId) || null;
53
- }
54
- /**
55
- * List all active swarms
56
- */
57
- listActiveSwarms() {
58
- return Array.from(this.swarms.values()).filter(
59
- (swarm) => swarm.status === "active"
60
- );
61
- }
62
- /**
63
- * Update swarm status
64
- */
65
- updateSwarmStatus(swarmId, status) {
66
- const swarm = this.swarms.get(swarmId);
67
- if (swarm) {
68
- swarm.status = status;
69
- this.emit("swarmStatusChanged", { id: swarmId, status });
70
- logger.debug(`Swarm ${swarmId} status updated: ${status}`);
71
- }
72
- }
73
- /**
74
- * Get swarm statistics
75
- */
76
- getStatistics() {
77
- const active = this.listActiveSwarms();
78
- const completed = Array.from(this.swarms.values()).filter(
79
- (s) => s.status === "completed"
80
- );
81
- const totalUptime = active.reduce(
82
- (sum, swarm) => sum + (Date.now() - swarm.startTime),
83
- 0
84
- );
85
- return {
86
- totalSwarms: this.swarms.size,
87
- activeSwarms: active.length,
88
- completedSwarms: completed.length,
89
- averageUptime: active.length > 0 ? totalUptime / active.length : 0
90
- };
91
- }
92
- /**
93
- * Cleanup all swarms and reset registry
94
- */
95
- cleanup() {
96
- this.swarms.clear();
97
- logger.info("SwarmRegistry cleaned up");
98
- }
99
- generateSwarmId() {
100
- return `swarm_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
101
- }
102
- }
103
- var swarm_registry_default = SwarmRegistry;
104
- export {
105
- SwarmRegistry,
106
- swarm_registry_default as default
107
- };