overmind-mcp 2.5.0 → 2.5.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 (217) hide show
  1. package/.mcp.json.example +21 -0
  2. package/README.md +107 -80
  3. package/assets/overmind.png +0 -0
  4. package/bin/.gitkeep +0 -0
  5. package/bin/README.md +34 -0
  6. package/bin/install-overmind-unix.sh +412 -0
  7. package/bin/install-overmind-windows.bat +407 -0
  8. package/dist/bin/cli.js +438 -7
  9. package/dist/bin/cli.js.map +1 -1
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +3 -2
  13. package/dist/index.js.map +1 -1
  14. package/dist/lib/InstallHelper.d.ts +14 -0
  15. package/dist/lib/InstallHelper.d.ts.map +1 -0
  16. package/dist/lib/InstallHelper.js +113 -0
  17. package/dist/lib/InstallHelper.js.map +1 -0
  18. package/dist/lib/config.d.ts +31 -1
  19. package/dist/lib/config.d.ts.map +1 -1
  20. package/dist/lib/config.js +19 -27
  21. package/dist/lib/config.js.map +1 -1
  22. package/dist/lib/envUtils.d.ts +10 -0
  23. package/dist/lib/envUtils.d.ts.map +1 -0
  24. package/dist/lib/envUtils.js +24 -0
  25. package/dist/lib/envUtils.js.map +1 -0
  26. package/dist/lib/loadEnv.d.ts +2 -0
  27. package/dist/lib/loadEnv.d.ts.map +1 -0
  28. package/dist/lib/loadEnv.js +26 -0
  29. package/dist/lib/loadEnv.js.map +1 -0
  30. package/dist/lib/logger.d.ts +8 -0
  31. package/dist/lib/logger.d.ts.map +1 -0
  32. package/dist/lib/logger.js +81 -0
  33. package/dist/lib/logger.js.map +1 -0
  34. package/dist/lib/modelMapping.d.ts +18 -0
  35. package/dist/lib/modelMapping.d.ts.map +1 -0
  36. package/dist/lib/modelMapping.js +90 -0
  37. package/dist/lib/modelMapping.js.map +1 -0
  38. package/dist/lib/orchestration/dispatcher.d.ts +32 -0
  39. package/dist/lib/orchestration/dispatcher.d.ts.map +1 -0
  40. package/dist/lib/orchestration/dispatcher.js +113 -0
  41. package/dist/lib/orchestration/dispatcher.js.map +1 -0
  42. package/dist/lib/orchestration/swarm.d.ts +75 -0
  43. package/dist/lib/orchestration/swarm.d.ts.map +1 -0
  44. package/dist/lib/orchestration/swarm.js +238 -0
  45. package/dist/lib/orchestration/swarm.js.map +1 -0
  46. package/dist/lib/sessions.d.ts +3 -2
  47. package/dist/lib/sessions.d.ts.map +1 -1
  48. package/dist/lib/sessions.js +94 -25
  49. package/dist/lib/sessions.js.map +1 -1
  50. package/dist/lib/telemetry.d.ts +21 -0
  51. package/dist/lib/telemetry.d.ts.map +1 -0
  52. package/dist/lib/telemetry.js +30 -0
  53. package/dist/lib/telemetry.js.map +1 -0
  54. package/dist/memory/MemoryFactory.d.ts +15 -1
  55. package/dist/memory/MemoryFactory.d.ts.map +1 -1
  56. package/dist/memory/MemoryFactory.js +53 -3
  57. package/dist/memory/MemoryFactory.js.map +1 -1
  58. package/dist/memory/PostgresMemoryProvider.d.ts +7 -0
  59. package/dist/memory/PostgresMemoryProvider.d.ts.map +1 -1
  60. package/dist/memory/PostgresMemoryProvider.js +180 -105
  61. package/dist/memory/PostgresMemoryProvider.js.map +1 -1
  62. package/dist/server.d.ts +41 -0
  63. package/dist/server.d.ts.map +1 -1
  64. package/dist/server.js +145 -41
  65. package/dist/server.js.map +1 -1
  66. package/dist/services/AgentManager.d.ts.map +1 -1
  67. package/dist/services/AgentManager.js +67 -11
  68. package/dist/services/AgentManager.js.map +1 -1
  69. package/dist/services/ClaudeRunner.d.ts +8 -0
  70. package/dist/services/ClaudeRunner.d.ts.map +1 -1
  71. package/dist/services/ClaudeRunner.js +510 -281
  72. package/dist/services/ClaudeRunner.js.map +1 -1
  73. package/dist/services/ClineRunner.d.ts +7 -0
  74. package/dist/services/ClineRunner.d.ts.map +1 -1
  75. package/dist/services/ClineRunner.js +76 -22
  76. package/dist/services/ClineRunner.js.map +1 -1
  77. package/dist/services/GeminiRunner.d.ts +6 -0
  78. package/dist/services/GeminiRunner.d.ts.map +1 -1
  79. package/dist/services/GeminiRunner.js +283 -69
  80. package/dist/services/GeminiRunner.js.map +1 -1
  81. package/dist/services/KiloRunner.d.ts +12 -0
  82. package/dist/services/KiloRunner.d.ts.map +1 -1
  83. package/dist/services/KiloRunner.js +439 -70
  84. package/dist/services/KiloRunner.js.map +1 -1
  85. package/dist/services/{QwenRunner.d.ts → NousHermesRunner.d.ts} +12 -3
  86. package/dist/services/NousHermesRunner.d.ts.map +1 -0
  87. package/dist/services/NousHermesRunner.js +460 -0
  88. package/dist/services/NousHermesRunner.js.map +1 -0
  89. package/dist/services/OpenClawRunner.d.ts +7 -0
  90. package/dist/services/OpenClawRunner.d.ts.map +1 -1
  91. package/dist/services/OpenClawRunner.js +75 -22
  92. package/dist/services/OpenClawRunner.js.map +1 -1
  93. package/dist/services/OpenCodeRunner.d.ts +7 -0
  94. package/dist/services/OpenCodeRunner.d.ts.map +1 -1
  95. package/dist/services/OpenCodeRunner.js +75 -22
  96. package/dist/services/OpenCodeRunner.js.map +1 -1
  97. package/dist/services/{TraeRunner.d.ts → QwenCliRunner.d.ts} +9 -2
  98. package/dist/services/QwenCliRunner.d.ts.map +1 -0
  99. package/dist/services/QwenCliRunner.js +155 -0
  100. package/dist/services/QwenCliRunner.js.map +1 -0
  101. package/dist/tools/agent_control.d.ts +2 -2
  102. package/dist/tools/config_example.d.ts +7 -4
  103. package/dist/tools/config_example.d.ts.map +1 -1
  104. package/dist/tools/config_example.js +191 -86
  105. package/dist/tools/config_example.js.map +1 -1
  106. package/dist/tools/create_agent.d.ts +13 -7
  107. package/dist/tools/create_agent.d.ts.map +1 -1
  108. package/dist/tools/create_agent.js +8 -9
  109. package/dist/tools/create_agent.js.map +1 -1
  110. package/dist/tools/get_agent_configs.d.ts +10 -4
  111. package/dist/tools/get_agent_configs.d.ts.map +1 -1
  112. package/dist/tools/get_agent_configs.js.map +1 -1
  113. package/dist/tools/initialization_check.d.ts +2 -0
  114. package/dist/tools/initialization_check.d.ts.map +1 -0
  115. package/dist/tools/initialization_check.js +23 -0
  116. package/dist/tools/initialization_check.js.map +1 -0
  117. package/dist/tools/manage_agents.d.ts +34 -16
  118. package/dist/tools/manage_agents.d.ts.map +1 -1
  119. package/dist/tools/manage_agents.js +2 -2
  120. package/dist/tools/manage_agents.js.map +1 -1
  121. package/dist/tools/manage_prompts.d.ts +13 -8
  122. package/dist/tools/manage_prompts.d.ts.map +1 -1
  123. package/dist/tools/manage_prompts.js.map +1 -1
  124. package/dist/tools/memory_runs.d.ts +3 -4
  125. package/dist/tools/memory_runs.d.ts.map +1 -1
  126. package/dist/tools/memory_runs.js.map +1 -1
  127. package/dist/tools/memory_search.d.ts +3 -4
  128. package/dist/tools/memory_search.d.ts.map +1 -1
  129. package/dist/tools/memory_search.js.map +1 -1
  130. package/dist/tools/memory_store.d.ts +11 -5
  131. package/dist/tools/memory_store.d.ts.map +1 -1
  132. package/dist/tools/memory_store.js.map +1 -1
  133. package/dist/tools/run_agent.d.ts +13 -14
  134. package/dist/tools/run_agent.d.ts.map +1 -1
  135. package/dist/tools/run_agent.js +128 -160
  136. package/dist/tools/run_agent.js.map +1 -1
  137. package/dist/tools/run_agent_cli.d.ts +21 -0
  138. package/dist/tools/run_agent_cli.d.ts.map +1 -0
  139. package/dist/tools/run_agent_cli.js +129 -0
  140. package/dist/tools/run_agent_cli.js.map +1 -0
  141. package/dist/tools/run_agents_parallel.d.ts +34 -0
  142. package/dist/tools/run_agents_parallel.d.ts.map +1 -0
  143. package/dist/tools/run_agents_parallel.js +28 -0
  144. package/dist/tools/run_agents_parallel.js.map +1 -0
  145. package/dist/tools/run_claude.d.ts +8 -3
  146. package/dist/tools/run_claude.d.ts.map +1 -1
  147. package/dist/tools/run_claude.js +59 -41
  148. package/dist/tools/run_claude.js.map +1 -1
  149. package/dist/tools/run_cline.d.ts +13 -4
  150. package/dist/tools/run_cline.d.ts.map +1 -1
  151. package/dist/tools/run_cline.js +55 -43
  152. package/dist/tools/run_cline.js.map +1 -1
  153. package/dist/tools/run_gemini.d.ts +13 -4
  154. package/dist/tools/run_gemini.d.ts.map +1 -1
  155. package/dist/tools/run_gemini.js +53 -33
  156. package/dist/tools/run_gemini.js.map +1 -1
  157. package/dist/tools/run_hermes.d.ts +25 -0
  158. package/dist/tools/run_hermes.d.ts.map +1 -0
  159. package/dist/tools/run_hermes.js +93 -0
  160. package/dist/tools/run_hermes.js.map +1 -0
  161. package/dist/tools/run_kilo.d.ts +17 -7
  162. package/dist/tools/run_kilo.d.ts.map +1 -1
  163. package/dist/tools/run_kilo.js +68 -41
  164. package/dist/tools/run_kilo.js.map +1 -1
  165. package/dist/tools/run_openclaw.d.ts +13 -4
  166. package/dist/tools/run_openclaw.d.ts.map +1 -1
  167. package/dist/tools/run_openclaw.js +52 -44
  168. package/dist/tools/run_openclaw.js.map +1 -1
  169. package/dist/tools/run_opencode.d.ts +13 -4
  170. package/dist/tools/run_opencode.d.ts.map +1 -1
  171. package/dist/tools/run_opencode.js +52 -39
  172. package/dist/tools/run_opencode.js.map +1 -1
  173. package/dist/tools/run_qwencli.d.ts +24 -0
  174. package/dist/tools/run_qwencli.d.ts.map +1 -0
  175. package/dist/tools/run_qwencli.js +59 -0
  176. package/dist/tools/run_qwencli.js.map +1 -0
  177. package/docs/README.md +128 -0
  178. package/docs/agent_control.md +656 -0
  179. package/docs/index.html +493 -0
  180. package/docs/library.html +239 -0
  181. package/docs/prompt.html +1212 -0
  182. package/docs/script.js +428 -0
  183. package/docs/styles.css +2816 -0
  184. package/package.json +114 -83
  185. package/scripts/auto-changelog.mjs +132 -0
  186. package/scripts/auto-install.mjs +322 -0
  187. package/scripts/install-dependencies.mjs +462 -0
  188. package/scripts/postgres-manager.mjs +219 -0
  189. package/scripts/postinstall.mjs +538 -0
  190. package/scripts/setup-overmind-db.mjs +199 -0
  191. package/scripts/setup-windows.js +266 -0
  192. package/scripts/setup.mjs +397 -0
  193. package/scripts/test-installation.mjs +158 -0
  194. package/scripts/uninstall.mjs +238 -0
  195. package/assets/overmind_mcp_pro_banner_v3.png +0 -0
  196. package/dist/services/QwenRunner.d.ts.map +0 -1
  197. package/dist/services/QwenRunner.js +0 -102
  198. package/dist/services/QwenRunner.js.map +0 -1
  199. package/dist/services/TraeRunner.d.ts.map +0 -1
  200. package/dist/services/TraeRunner.js +0 -103
  201. package/dist/services/TraeRunner.js.map +0 -1
  202. package/dist/tools/run_qwen.d.ts +0 -15
  203. package/dist/tools/run_qwen.d.ts.map +0 -1
  204. package/dist/tools/run_qwen.js +0 -61
  205. package/dist/tools/run_qwen.js.map +0 -1
  206. package/dist/tools/run_trae.d.ts +0 -15
  207. package/dist/tools/run_trae.d.ts.map +0 -1
  208. package/dist/tools/run_trae.js +0 -66
  209. package/dist/tools/run_trae.js.map +0 -1
  210. package/dist/tools/shell_execute.d.ts +0 -10
  211. package/dist/tools/shell_execute.d.ts.map +0 -1
  212. package/dist/tools/shell_execute.js +0 -24
  213. package/dist/tools/shell_execute.js.map +0 -1
  214. package/dist/tools/test_agent_control.d.ts +0 -2
  215. package/dist/tools/test_agent_control.d.ts.map +0 -1
  216. package/dist/tools/test_agent_control.js +0 -92
  217. package/dist/tools/test_agent_control.js.map +0 -1
package/docs/script.js ADDED
@@ -0,0 +1,428 @@
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
+ });