overmind-mcp 2.4.0 → 2.4.1

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 (154) hide show
  1. package/README.md +80 -107
  2. package/assets/overmind_mcp_pro_banner_v3.png +0 -0
  3. package/dist/bin/cli.js +7 -438
  4. package/dist/bin/cli.js.map +1 -1
  5. package/dist/index.d.ts +2 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -3
  8. package/dist/index.js.map +1 -1
  9. package/dist/lib/config.d.ts +1 -31
  10. package/dist/lib/config.d.ts.map +1 -1
  11. package/dist/lib/config.js +27 -19
  12. package/dist/lib/config.js.map +1 -1
  13. package/dist/lib/sessions.d.ts +2 -3
  14. package/dist/lib/sessions.d.ts.map +1 -1
  15. package/dist/lib/sessions.js +25 -94
  16. package/dist/lib/sessions.js.map +1 -1
  17. package/dist/memory/MemoryFactory.d.ts +1 -15
  18. package/dist/memory/MemoryFactory.d.ts.map +1 -1
  19. package/dist/memory/MemoryFactory.js +3 -53
  20. package/dist/memory/MemoryFactory.js.map +1 -1
  21. package/dist/memory/PostgresMemoryProvider.d.ts +0 -7
  22. package/dist/memory/PostgresMemoryProvider.d.ts.map +1 -1
  23. package/dist/memory/PostgresMemoryProvider.js +105 -180
  24. package/dist/memory/PostgresMemoryProvider.js.map +1 -1
  25. package/dist/server.d.ts +0 -41
  26. package/dist/server.d.ts.map +1 -1
  27. package/dist/server.js +26 -152
  28. package/dist/server.js.map +1 -1
  29. package/dist/services/AgentManager.d.ts.map +1 -1
  30. package/dist/services/AgentManager.js +11 -67
  31. package/dist/services/AgentManager.js.map +1 -1
  32. package/dist/services/ClaudeRunner.d.ts +0 -8
  33. package/dist/services/ClaudeRunner.d.ts.map +1 -1
  34. package/dist/services/ClaudeRunner.js +213 -514
  35. package/dist/services/ClaudeRunner.js.map +1 -1
  36. package/dist/services/ClineRunner.d.ts +0 -7
  37. package/dist/services/ClineRunner.d.ts.map +1 -1
  38. package/dist/services/ClineRunner.js +11 -80
  39. package/dist/services/ClineRunner.js.map +1 -1
  40. package/dist/services/GeminiRunner.d.ts +0 -6
  41. package/dist/services/GeminiRunner.d.ts.map +1 -1
  42. package/dist/services/GeminiRunner.js +58 -285
  43. package/dist/services/GeminiRunner.js.map +1 -1
  44. package/dist/services/KiloRunner.d.ts +0 -12
  45. package/dist/services/KiloRunner.d.ts.map +1 -1
  46. package/dist/services/KiloRunner.js +57 -441
  47. package/dist/services/KiloRunner.js.map +1 -1
  48. package/dist/services/OpenClawRunner.d.ts +0 -7
  49. package/dist/services/OpenClawRunner.d.ts.map +1 -1
  50. package/dist/services/OpenClawRunner.js +11 -79
  51. package/dist/services/OpenClawRunner.js.map +1 -1
  52. package/dist/services/OpenCodeRunner.d.ts +0 -7
  53. package/dist/services/OpenCodeRunner.d.ts.map +1 -1
  54. package/dist/services/OpenCodeRunner.js +11 -79
  55. package/dist/services/OpenCodeRunner.js.map +1 -1
  56. package/dist/services/QwenRunner.d.ts +19 -0
  57. package/dist/services/QwenRunner.d.ts.map +1 -0
  58. package/dist/services/QwenRunner.js +87 -0
  59. package/dist/services/QwenRunner.js.map +1 -0
  60. package/dist/services/TraeRunner.d.ts +19 -0
  61. package/dist/services/TraeRunner.d.ts.map +1 -0
  62. package/dist/services/TraeRunner.js +88 -0
  63. package/dist/services/TraeRunner.js.map +1 -0
  64. package/dist/tools/config_example.d.ts +4 -7
  65. package/dist/tools/config_example.d.ts.map +1 -1
  66. package/dist/tools/config_example.js +86 -191
  67. package/dist/tools/config_example.js.map +1 -1
  68. package/dist/tools/create_agent.d.ts +9 -15
  69. package/dist/tools/create_agent.d.ts.map +1 -1
  70. package/dist/tools/create_agent.js +9 -8
  71. package/dist/tools/create_agent.js.map +1 -1
  72. package/dist/tools/get_agent_configs.d.ts +4 -10
  73. package/dist/tools/get_agent_configs.d.ts.map +1 -1
  74. package/dist/tools/get_agent_configs.js.map +1 -1
  75. package/dist/tools/manage_agents.d.ts +18 -36
  76. package/dist/tools/manage_agents.d.ts.map +1 -1
  77. package/dist/tools/manage_agents.js +2 -2
  78. package/dist/tools/manage_agents.js.map +1 -1
  79. package/dist/tools/manage_prompts.d.ts +8 -13
  80. package/dist/tools/manage_prompts.d.ts.map +1 -1
  81. package/dist/tools/manage_prompts.js.map +1 -1
  82. package/dist/tools/memory_runs.d.ts +4 -3
  83. package/dist/tools/memory_runs.d.ts.map +1 -1
  84. package/dist/tools/memory_runs.js.map +1 -1
  85. package/dist/tools/memory_search.d.ts +4 -3
  86. package/dist/tools/memory_search.d.ts.map +1 -1
  87. package/dist/tools/memory_search.js.map +1 -1
  88. package/dist/tools/memory_store.d.ts +5 -11
  89. package/dist/tools/memory_store.d.ts.map +1 -1
  90. package/dist/tools/memory_store.js.map +1 -1
  91. package/dist/tools/run_agent.d.ts +16 -15
  92. package/dist/tools/run_agent.d.ts.map +1 -1
  93. package/dist/tools/run_agent.js +160 -128
  94. package/dist/tools/run_agent.js.map +1 -1
  95. package/dist/tools/run_claude.d.ts +3 -8
  96. package/dist/tools/run_claude.d.ts.map +1 -1
  97. package/dist/tools/run_claude.js +41 -59
  98. package/dist/tools/run_claude.js.map +1 -1
  99. package/dist/tools/run_cline.d.ts +4 -13
  100. package/dist/tools/run_cline.d.ts.map +1 -1
  101. package/dist/tools/run_cline.js +43 -55
  102. package/dist/tools/run_cline.js.map +1 -1
  103. package/dist/tools/run_gemini.d.ts +4 -13
  104. package/dist/tools/run_gemini.d.ts.map +1 -1
  105. package/dist/tools/run_gemini.js +33 -53
  106. package/dist/tools/run_gemini.js.map +1 -1
  107. package/dist/tools/run_kilo.d.ts +7 -17
  108. package/dist/tools/run_kilo.d.ts.map +1 -1
  109. package/dist/tools/run_kilo.js +41 -68
  110. package/dist/tools/run_kilo.js.map +1 -1
  111. package/dist/tools/run_openclaw.d.ts +4 -13
  112. package/dist/tools/run_openclaw.d.ts.map +1 -1
  113. package/dist/tools/run_openclaw.js +44 -52
  114. package/dist/tools/run_openclaw.js.map +1 -1
  115. package/dist/tools/run_opencode.d.ts +4 -13
  116. package/dist/tools/run_opencode.d.ts.map +1 -1
  117. package/dist/tools/run_opencode.js +39 -52
  118. package/dist/tools/run_opencode.js.map +1 -1
  119. package/dist/tools/run_qwen.d.ts +15 -0
  120. package/dist/tools/run_qwen.d.ts.map +1 -0
  121. package/dist/tools/run_qwen.js +61 -0
  122. package/dist/tools/run_qwen.js.map +1 -0
  123. package/dist/tools/run_trae.d.ts +15 -0
  124. package/dist/tools/run_trae.d.ts.map +1 -0
  125. package/dist/tools/run_trae.js +66 -0
  126. package/dist/tools/run_trae.js.map +1 -0
  127. package/dist/tools/shell_execute.d.ts +10 -0
  128. package/dist/tools/shell_execute.d.ts.map +1 -0
  129. package/dist/tools/shell_execute.js +24 -0
  130. package/dist/tools/shell_execute.js.map +1 -0
  131. package/package.json +25 -55
  132. package/.mcp.json.example +0 -21
  133. package/assets/overmind.png +0 -0
  134. package/bin/.gitkeep +0 -0
  135. package/bin/README.md +0 -34
  136. package/bin/install-overmind-unix.sh +0 -412
  137. package/bin/install-overmind-windows.bat +0 -407
  138. package/docs/README.md +0 -128
  139. package/docs/agent_control.md +0 -656
  140. package/docs/index.html +0 -493
  141. package/docs/library.html +0 -239
  142. package/docs/prompt.html +0 -1212
  143. package/docs/script.js +0 -428
  144. package/docs/styles.css +0 -2816
  145. package/scripts/auto-changelog.mjs +0 -132
  146. package/scripts/auto-install.mjs +0 -322
  147. package/scripts/install-dependencies.mjs +0 -462
  148. package/scripts/postgres-manager.mjs +0 -219
  149. package/scripts/postinstall.mjs +0 -538
  150. package/scripts/setup-overmind-db.mjs +0 -199
  151. package/scripts/setup-windows.js +0 -266
  152. package/scripts/setup.mjs +0 -397
  153. package/scripts/test-installation.mjs +0 -158
  154. package/scripts/uninstall.mjs +0 -238
package/docs/script.js DELETED
@@ -1,428 +0,0 @@
1
- // Matrix Rain Effect
2
- const canvas = document.getElementById('matrix');
3
- const ctx = canvas.getContext('2d');
4
-
5
- canvas.width = window.innerWidth;
6
- canvas.height = window.innerHeight;
7
-
8
- const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$%^&*()_+-=[]{}|;:,.<>?';
9
- const charArray = chars.split('');
10
-
11
- const fontSize = 14;
12
- const columns = canvas.width / fontSize;
13
-
14
- const drops = [];
15
- for (let i = 0; i < columns; i++) {
16
- drops[i] = 1;
17
- }
18
-
19
- function drawMatrix() {
20
- ctx.fillStyle = 'rgba(6, 6, 9, 0.08)'; // Matches new dark-bg
21
- ctx.fillRect(0, 0, canvas.width, canvas.height);
22
-
23
- ctx.fillStyle = '#00fff5';
24
- ctx.font = fontSize + 'px monospace';
25
-
26
- for (let i = 0; i < drops.length; i++) {
27
- const text = charArray[Math.floor(Math.random() * charArray.length)];
28
- ctx.fillText(text, i * fontSize, drops[i] * fontSize);
29
-
30
- if (drops[i] * fontSize > canvas.height && Math.random() > 0.975) {
31
- drops[i] = 0;
32
- }
33
- drops[i]++;
34
- }
35
- }
36
-
37
- setInterval(drawMatrix, 50);
38
-
39
- // Resize handler
40
- window.addEventListener('resize', () => {
41
- canvas.width = window.innerWidth;
42
- canvas.height = window.innerHeight;
43
- const newColumns = Math.floor(canvas.width / fontSize);
44
- if (newColumns > drops.length) {
45
- for (let i = drops.length; i < newColumns; i++) drops[i] = 1;
46
- }
47
- });
48
-
49
- // SVG Filter Animation Logic
50
- const glitchFilter = document.querySelector('#cyber-glitch feTurbulence');
51
- if (glitchFilter) {
52
- let glitchBaseFreq = 0.00001;
53
- setInterval(() => {
54
- // Jitter the displacement map slightly for the 'glitch' effect
55
- const noise = Math.random() * 0.05;
56
- glitchFilter.setAttribute('baseFrequency', `${glitchBaseFreq} ${noise}`);
57
- }, 100);
58
- }
59
-
60
- // Main initialization
61
- document.addEventListener('DOMContentLoaded', () => {
62
- // Tab functionality
63
- const tabBtns = document.querySelectorAll('.tab-btn');
64
- const tabContents = document.querySelectorAll('.tab-content');
65
-
66
- tabBtns.forEach((btn) => {
67
- btn.addEventListener('click', () => {
68
- const tabId = btn.getAttribute('data-tab');
69
- tabBtns.forEach((b) => b.classList.remove('active'));
70
- tabContents.forEach((c) => c.classList.remove('active'));
71
- btn.classList.add('active');
72
- const target = document.getElementById(tabId);
73
- if (target) target.classList.add('active');
74
- });
75
- });
76
-
77
- // Copy functionality
78
- const copyBtns = document.querySelectorAll('.copy-btn, .terminal-copy');
79
-
80
- window.copyToClipboard = function (text) {
81
- navigator.clipboard.writeText(text).then(() => {
82
- console.log('Copied to clipboard:', text);
83
- });
84
- };
85
-
86
- copyBtns.forEach((btn) => {
87
- btn.addEventListener('click', () => {
88
- let code;
89
- if (btn.classList.contains('terminal-copy')) {
90
- code = btn.previousElementSibling.textContent;
91
- } else {
92
- const codeContainer = btn.closest('.code-container');
93
- code = codeContainer.querySelector('code').textContent;
94
- }
95
-
96
- navigator.clipboard.writeText(code).then(() => {
97
- const originalIcon = btn.innerHTML;
98
- btn.innerHTML = '<i class="fas fa-check"></i>';
99
- btn.style.color = '#00ff00';
100
- setTimeout(() => {
101
- btn.innerHTML = originalIcon;
102
- btn.style.color = '';
103
- }, 2000);
104
- });
105
- });
106
- });
107
-
108
- // Smooth scroll
109
- document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
110
- anchor.addEventListener('click', function (e) {
111
- const href = this.getAttribute('href');
112
- if (href === '#' || !href.startsWith('#')) return;
113
- e.preventDefault();
114
- const target = document.querySelector(href);
115
- if (target) {
116
- target.scrollIntoView({ behavior: 'smooth', block: 'start' });
117
- }
118
- });
119
- });
120
-
121
- // Stats counter
122
- const stats = document.querySelectorAll('.stat-value');
123
- const animateStats = () => {
124
- stats.forEach((stat) => {
125
- const target = parseInt(stat.getAttribute('data-target'));
126
- const duration = 2000;
127
- const increment = target / (duration / 16);
128
- let current = 0;
129
- const updateStat = () => {
130
- current += increment;
131
- if (current < target) {
132
- stat.textContent = Math.floor(current);
133
- requestAnimationFrame(updateStat);
134
- } else {
135
- stat.textContent = target;
136
- }
137
- };
138
- updateStat();
139
- });
140
- };
141
-
142
- const statsObserver = new IntersectionObserver(
143
- (entries) => {
144
- entries.forEach((entry) => {
145
- if (entry.isIntersecting) {
146
- animateStats();
147
- statsObserver.unobserve(entry.target);
148
- }
149
- });
150
- },
151
- { threshold: 0.5 },
152
- );
153
-
154
- const heroStats = document.querySelector('.hero-stats');
155
- if (heroStats) statsObserver.observe(heroStats);
156
-
157
- // Feature cards 3D effect
158
- const featureCards = document.querySelectorAll('.feature-card');
159
- featureCards.forEach((card) => {
160
- card.addEventListener('mousemove', (e) => {
161
- const rect = card.getBoundingClientRect();
162
- const x = e.clientX - rect.left;
163
- const y = e.clientY - rect.top;
164
- const centerX = rect.width / 2;
165
- const centerY = rect.height / 2;
166
- const rotateX = (y - centerY) / 20;
167
- const rotateY = (centerX - x) / 20;
168
- card.style.transform = `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) translateY(-10px)`;
169
- });
170
- card.addEventListener('mouseleave', () => {
171
- card.style.transform = 'perspective(1000px) rotateX(0) rotateY(0) translateY(0)';
172
- });
173
- });
174
-
175
- // Mobile Menu
176
- const mobileToggle = document.querySelector('.mobile-toggle');
177
- const navLinks = document.querySelector('.nav-links');
178
- if (mobileToggle) {
179
- mobileToggle.addEventListener('click', () => {
180
- navLinks.classList.toggle('active');
181
- mobileToggle.classList.toggle('active');
182
- });
183
-
184
- // Close mobile menu when clicking on a link
185
- const mobileNavLinks = navLinks.querySelectorAll('.nav-link');
186
- mobileNavLinks.forEach((link) => {
187
- link.addEventListener('click', () => {
188
- navLinks.classList.remove('active');
189
- mobileToggle.classList.remove('active');
190
- });
191
- });
192
-
193
- // Close mobile menu when clicking outside
194
- document.addEventListener('click', (e) => {
195
- if (!e.target.closest('nav') && navLinks.classList.contains('active')) {
196
- navLinks.classList.remove('active');
197
- mobileToggle.classList.remove('active');
198
- }
199
- });
200
- }
201
-
202
- // Scroll to Top Button
203
- const scrollTopBtn = document.getElementById('scrollTop');
204
- if (scrollTopBtn) {
205
- window.addEventListener('scroll', () => {
206
- if (window.pageYOffset > 300) {
207
- scrollTopBtn.classList.add('visible');
208
- } else {
209
- scrollTopBtn.classList.remove('visible');
210
- }
211
- });
212
-
213
- scrollTopBtn.addEventListener('click', () => {
214
- window.scrollTo({
215
- top: 0,
216
- behavior: 'smooth',
217
- });
218
- });
219
- }
220
-
221
- // Smooth reveal animation for prompt sections
222
- const observerOptions = {
223
- threshold: 0.1,
224
- rootMargin: '0px 0px -50px 0px',
225
- };
226
-
227
- const sectionObserver = new IntersectionObserver((entries) => {
228
- entries.forEach((entry) => {
229
- if (entry.isIntersecting) {
230
- entry.target.style.opacity = '1';
231
- entry.target.style.transform = 'translateY(0)';
232
- }
233
- });
234
- }, observerOptions);
235
-
236
- document.querySelectorAll('.prompt-section').forEach((section) => {
237
- section.style.opacity = '0';
238
- section.style.transform = 'translateY(30px)';
239
- section.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
240
- sectionObserver.observe(section);
241
- });
242
-
243
- // Rule cards hover effect enhancement
244
- const ruleCards = document.querySelectorAll('.rule-card');
245
- ruleCards.forEach((card) => {
246
- card.addEventListener('mouseenter', () => {
247
- card.style.zIndex = '10';
248
- });
249
- card.addEventListener('mouseleave', () => {
250
- card.style.zIndex = '1';
251
- });
252
- });
253
-
254
- // PROFESSIONAL CORTEX ENGINE
255
- const cortex = document.querySelector('.orchestration-cortex');
256
- const fleetContainer = document.getElementById('agent-fleet');
257
- const linksContainer = document.getElementById('cortex-links');
258
- const hologramData = document.querySelector('.hologram-data');
259
-
260
- if (cortex && fleetContainer && linksContainer) {
261
- const agents = [];
262
- const numAgents = 24;
263
- const missions = [
264
- 'STATUS: OPTIMIZING_NEURAL_FLOW',
265
- 'STATUS: VECTOR_SYMMETRY_ACTIVE',
266
- 'STATUS: MCP_HANDSHAKE_VALID',
267
- 'STATUS: DISTRIBUTED_COGNITION',
268
- 'STATUS: PROTOCOL_ALIGNMENT',
269
- 'STATUS: SYSTEM_INTEGRITY_MAX',
270
- ];
271
-
272
- for (let i = 0; i < numAgents; i++) {
273
- const node = document.createElement('div');
274
- node.className = 'agent-node';
275
- fleetContainer.appendChild(node);
276
-
277
- const angle = (i / numAgents) * Math.PI * 2;
278
- const layer = i % 3; // 3 distinct orbital layers
279
- const baseRadius = 120 + layer * 50;
280
-
281
- agents.push({
282
- el: node,
283
- angle: angle,
284
- baseRadius: baseRadius,
285
- radius: 0,
286
- speed: (0.002 + Math.random() * 0.004) * (layer === 1 ? -1 : 1),
287
- active: false,
288
- lastActivation: 0,
289
- });
290
- }
291
-
292
- const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
293
- svg.style.cssText =
294
- 'position:absolute; top:0; left:0; width:100%; height:100%; pointer-events:none;';
295
- linksContainer.appendChild(svg);
296
-
297
- const lines = agents.map(() => {
298
- const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
299
- line.setAttribute('class', 'link-line');
300
- svg.appendChild(line);
301
- return line;
302
- });
303
-
304
- function sendDataBurst(startX, startY, endX, endY) {
305
- const p = document.createElement('div');
306
- p.className = 'data-particle';
307
- cortex.appendChild(p);
308
-
309
- let progress = 0;
310
- const speed = 0.015 + Math.random() * 0.02;
311
-
312
- function step() {
313
- progress += speed;
314
- p.style.left = `${startX + (endX - startX) * progress}px`;
315
- p.style.top = `${startY + (endY - startY) * progress}px`;
316
-
317
- if (progress < 1) requestAnimationFrame(step);
318
- else p.remove();
319
- }
320
- step();
321
- }
322
-
323
- function animateCortex() {
324
- const cw = cortex.offsetWidth;
325
- const ch = cortex.offsetHeight;
326
- const cx = cw / 2;
327
- const cy = ch / 2;
328
- const scale = Math.max(0.5, cw / 600);
329
-
330
- const core = document.querySelector('.cortex-core');
331
- if (core) {
332
- const pulse = 1 + Math.sin(Date.now() / 1500) * 0.03;
333
- core.style.transform = `translate(-50%, -50%) scale(${scale * pulse})`;
334
- }
335
-
336
- agents.forEach((agent, i) => {
337
- agent.angle += agent.speed;
338
- agent.radius = agent.baseRadius * scale;
339
- const ax = cx + Math.cos(agent.angle) * agent.radius;
340
- const ay = cy + Math.sin(agent.angle) * agent.radius;
341
-
342
- agent.el.style.left = `${ax}px`;
343
- agent.el.style.top = `${ay}px`;
344
-
345
- const agentScale = agent.active ? scale * 1.4 : scale;
346
- agent.el.style.transform = `translate(-50%, -50%) scale(${agentScale})`;
347
- agent.el.style.opacity = agent.active ? '1' : '0.4';
348
-
349
- const line = lines[i];
350
- line.setAttribute('x1', cx);
351
- line.setAttribute('y1', cy);
352
- line.setAttribute('x2', ax);
353
- line.setAttribute('y2', ay);
354
-
355
- if (agent.active) {
356
- line.setAttribute('class', 'link-line active');
357
- } else {
358
- line.setAttribute('class', 'link-line');
359
- }
360
- });
361
- requestAnimationFrame(animateCortex);
362
- }
363
- animateCortex();
364
-
365
- // Autonomous systemic logic
366
- setInterval(() => {
367
- const available = agents.filter((a) => !a.active);
368
- if (available.length > 0 && Math.random() > 0.4) {
369
- const a = available[Math.floor(Math.random() * available.length)];
370
- a.active = true;
371
- a.el.classList.add('active');
372
-
373
- // Logical data transmission
374
- setTimeout(
375
- () =>
376
- sendDataBurst(
377
- cw / 2,
378
- ch / 2,
379
- cw / 2 + Math.cos(a.angle) * a.radius,
380
- ch / 2 + Math.sin(a.angle) * a.radius,
381
- ),
382
- 100,
383
- );
384
-
385
- setTimeout(
386
- () => {
387
- a.active = false;
388
- a.el.classList.remove('active');
389
- },
390
- 1500 + Math.random() * 2000,
391
- );
392
- }
393
-
394
- // Update terminal status log logic
395
- if (Math.random() > 0.8 && hologramData) {
396
- const lines = hologramData.querySelectorAll('.data-line');
397
- lines[1].textContent = `ACTIVE_NODES: ${agents.filter((a) => a.active).length}/${numAgents}`;
398
- if (Math.random() > 0.5) {
399
- lines[0].textContent = missions[Math.floor(Math.random() * missions.length)];
400
- }
401
- }
402
- }, 1000);
403
-
404
- // Interactive Core (Professional Interaction)
405
- const coreTrigger = document.querySelector('.cortex-core');
406
- if (coreTrigger) {
407
- coreTrigger.addEventListener('click', () => {
408
- // High-level systemic synchronization
409
- agents.forEach((a, idx) => {
410
- setTimeout(() => {
411
- a.active = true;
412
- a.el.classList.add('active');
413
- sendDataBurst(
414
- cortex.offsetWidth / 2,
415
- cortex.offsetHeight / 2,
416
- cortex.offsetWidth / 2 + Math.cos(a.angle) * a.radius,
417
- cortex.offsetHeight / 2 + Math.sin(a.angle) * a.radius,
418
- );
419
- setTimeout(() => {
420
- a.active = false;
421
- a.el.classList.remove('active');
422
- }, 2000);
423
- }, idx * 30);
424
- });
425
- });
426
- }
427
- }
428
- });