@holoscript/framework 6.0.3

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 (329) hide show
  1. package/ALL-test-results.json +1 -0
  2. package/CHANGELOG.md +8 -0
  3. package/LICENSE +21 -0
  4. package/ROADMAP.md +175 -0
  5. package/dist/AgentManifest-CB4xM-Ma.d.cts +704 -0
  6. package/dist/AgentManifest-CB4xM-Ma.d.ts +704 -0
  7. package/dist/BehaviorTree-BrBFECv5.d.cts +103 -0
  8. package/dist/BehaviorTree-BrBFECv5.d.ts +103 -0
  9. package/dist/InvisibleWallet-BB6tFvRA.d.cts +1732 -0
  10. package/dist/InvisibleWallet-rtRrBOA8.d.ts +1732 -0
  11. package/dist/OrchestratorAgent-BvWgf9uw.d.cts +798 -0
  12. package/dist/OrchestratorAgent-Q_CbVTmO.d.ts +798 -0
  13. package/dist/agents/index.cjs +4790 -0
  14. package/dist/agents/index.d.cts +1788 -0
  15. package/dist/agents/index.d.ts +1788 -0
  16. package/dist/agents/index.js +4695 -0
  17. package/dist/ai/index.cjs +5347 -0
  18. package/dist/ai/index.d.cts +1753 -0
  19. package/dist/ai/index.d.ts +1753 -0
  20. package/dist/ai/index.js +5244 -0
  21. package/dist/behavior.cjs +449 -0
  22. package/dist/behavior.d.cts +130 -0
  23. package/dist/behavior.d.ts +130 -0
  24. package/dist/behavior.js +407 -0
  25. package/dist/economy/index.cjs +3659 -0
  26. package/dist/economy/index.d.cts +747 -0
  27. package/dist/economy/index.d.ts +747 -0
  28. package/dist/economy/index.js +3617 -0
  29. package/dist/implementations-D9T3un9D.d.cts +236 -0
  30. package/dist/implementations-D9T3un9D.d.ts +236 -0
  31. package/dist/index.cjs +24550 -0
  32. package/dist/index.d.cts +1729 -0
  33. package/dist/index.d.ts +1729 -0
  34. package/dist/index.js +24277 -0
  35. package/dist/learning/index.cjs +219 -0
  36. package/dist/learning/index.d.cts +104 -0
  37. package/dist/learning/index.d.ts +104 -0
  38. package/dist/learning/index.js +189 -0
  39. package/dist/negotiation/index.cjs +970 -0
  40. package/dist/negotiation/index.d.cts +610 -0
  41. package/dist/negotiation/index.d.ts +610 -0
  42. package/dist/negotiation/index.js +931 -0
  43. package/dist/skills/index.cjs +1118 -0
  44. package/dist/skills/index.d.cts +289 -0
  45. package/dist/skills/index.d.ts +289 -0
  46. package/dist/skills/index.js +1079 -0
  47. package/dist/swarm/index.cjs +5268 -0
  48. package/dist/swarm/index.d.cts +2433 -0
  49. package/dist/swarm/index.d.ts +2433 -0
  50. package/dist/swarm/index.js +5221 -0
  51. package/dist/training/index.cjs +2745 -0
  52. package/dist/training/index.d.cts +1734 -0
  53. package/dist/training/index.d.ts +1734 -0
  54. package/dist/training/index.js +2687 -0
  55. package/extract-failures.js +10 -0
  56. package/package.json +82 -0
  57. package/src/__tests__/bounty-marketplace.test.ts +374 -0
  58. package/src/__tests__/delegation.test.ts +144 -0
  59. package/src/__tests__/distributed-claimer.test.ts +147 -0
  60. package/src/__tests__/done-log-audit.test.ts +342 -0
  61. package/src/__tests__/framework.test.ts +865 -0
  62. package/src/__tests__/goal-synthesizer.test.ts +236 -0
  63. package/src/__tests__/presence.test.ts +223 -0
  64. package/src/__tests__/protocol-agent.test.ts +254 -0
  65. package/src/__tests__/revenue-splitter.test.ts +114 -0
  66. package/src/__tests__/scenario-driven-todo.test.ts +197 -0
  67. package/src/__tests__/self-improve.test.ts +349 -0
  68. package/src/__tests__/service-lifecycle.test.ts +237 -0
  69. package/src/__tests__/skill-router.test.ts +121 -0
  70. package/src/agents/AgentManifest.ts +493 -0
  71. package/src/agents/AgentRegistry.ts +475 -0
  72. package/src/agents/AgentTypes.ts +585 -0
  73. package/src/agents/AgentWalletRegistry.ts +83 -0
  74. package/src/agents/AuthenticatedCRDT.ts +388 -0
  75. package/src/agents/CapabilityMatcher.ts +453 -0
  76. package/src/agents/CrossRealityHandoff.ts +305 -0
  77. package/src/agents/CulturalMemory.ts +454 -0
  78. package/src/agents/FederatedRegistryAdapter.ts +429 -0
  79. package/src/agents/NormEngine.ts +450 -0
  80. package/src/agents/OrchestratorAgent.ts +414 -0
  81. package/src/agents/SkillWorkflowEngine.ts +472 -0
  82. package/src/agents/TaskDelegationService.ts +551 -0
  83. package/src/agents/__tests__/AgentManifest.prod.test.ts +134 -0
  84. package/src/agents/__tests__/AgentManifest.test.ts +182 -0
  85. package/src/agents/__tests__/AgentModule.test.ts +864 -0
  86. package/src/agents/__tests__/AgentRegistry.prod.test.ts +125 -0
  87. package/src/agents/__tests__/AgentRegistry.test.ts +148 -0
  88. package/src/agents/__tests__/AgentTypes.test.ts +534 -0
  89. package/src/agents/__tests__/AgentWalletRegistry.test.ts +152 -0
  90. package/src/agents/__tests__/AuthenticatedCRDT.test.ts +558 -0
  91. package/src/agents/__tests__/CapabilityMatcher.prod.test.ts +117 -0
  92. package/src/agents/__tests__/CapabilityMatcher.test.ts +178 -0
  93. package/src/agents/__tests__/CrossRealityHandoff.test.ts +402 -0
  94. package/src/agents/__tests__/CulturalMemory.test.ts +200 -0
  95. package/src/agents/__tests__/FederatedRegistryAdapter.test.ts +409 -0
  96. package/src/agents/__tests__/NormEngine.test.ts +276 -0
  97. package/src/agents/__tests__/OrchestratorAgent.test.ts +182 -0
  98. package/src/agents/__tests__/SkillWorkflowEngine.test.ts +357 -0
  99. package/src/agents/__tests__/TaskDelegationService.test.ts +446 -0
  100. package/src/agents/index.ts +107 -0
  101. package/src/agents/spatial-comms/Layer1RealTime.ts +621 -0
  102. package/src/agents/spatial-comms/Layer2A2A.ts +661 -0
  103. package/src/agents/spatial-comms/Layer3MCP.ts +651 -0
  104. package/src/agents/spatial-comms/ProtocolTypes.ts +543 -0
  105. package/src/agents/spatial-comms/SpatialCommClient.ts +483 -0
  106. package/src/agents/spatial-comms/__tests__/performance-benchmark.test.ts +465 -0
  107. package/src/agents/spatial-comms/examples/multi-agent-world-creation.ts +409 -0
  108. package/src/agents/spatial-comms/index.ts +66 -0
  109. package/src/ai/AIAdapter.ts +313 -0
  110. package/src/ai/AICopilot.ts +331 -0
  111. package/src/ai/AIOutputValidator.ts +203 -0
  112. package/src/ai/BTNodes.ts +239 -0
  113. package/src/ai/BehaviorSelector.ts +135 -0
  114. package/src/ai/BehaviorTree.ts +153 -0
  115. package/src/ai/Blackboard.ts +165 -0
  116. package/src/ai/GenerationAnalytics.ts +461 -0
  117. package/src/ai/GenerationCache.ts +265 -0
  118. package/src/ai/GoalPlanner.ts +165 -0
  119. package/src/ai/HoloScriptGenerator.ts +580 -0
  120. package/src/ai/InfluenceMap.ts +180 -0
  121. package/src/ai/NavMesh.ts +168 -0
  122. package/src/ai/PerceptionSystem.ts +178 -0
  123. package/src/ai/PromptTemplates.ts +453 -0
  124. package/src/ai/SemanticSearchService.ts +80 -0
  125. package/src/ai/StateMachine.ts +196 -0
  126. package/src/ai/SteeringBehavior.ts +150 -0
  127. package/src/ai/SteeringBehaviors.ts +244 -0
  128. package/src/ai/TrainingDataGenerator.ts +1082 -0
  129. package/src/ai/UtilityAI.ts +145 -0
  130. package/src/ai/__tests__/AIAdapter.prod.test.ts +259 -0
  131. package/src/ai/__tests__/AIAdapter.test.ts +109 -0
  132. package/src/ai/__tests__/AICopilot.prod.test.ts +341 -0
  133. package/src/ai/__tests__/AICopilot.test.ts +178 -0
  134. package/src/ai/__tests__/AIOutputValidator.prod.test.ts +226 -0
  135. package/src/ai/__tests__/AIOutputValidator.test.ts +138 -0
  136. package/src/ai/__tests__/BTNodes.prod.test.ts +391 -0
  137. package/src/ai/__tests__/BTNodes.test.ts +263 -0
  138. package/src/ai/__tests__/BehaviorSelector.prod.test.ts +129 -0
  139. package/src/ai/__tests__/BehaviorSelector.test.ts +132 -0
  140. package/src/ai/__tests__/BehaviorTree.prod.test.ts +266 -0
  141. package/src/ai/__tests__/BehaviorTree.test.ts +216 -0
  142. package/src/ai/__tests__/Blackboard.prod.test.ts +339 -0
  143. package/src/ai/__tests__/Blackboard.test.ts +183 -0
  144. package/src/ai/__tests__/GenerationAnalytics.prod.test.ts +141 -0
  145. package/src/ai/__tests__/GenerationAnalytics.test.ts +165 -0
  146. package/src/ai/__tests__/GenerationCache.prod.test.ts +144 -0
  147. package/src/ai/__tests__/GenerationCache.test.ts +171 -0
  148. package/src/ai/__tests__/GoalPlanner.prod.test.ts +189 -0
  149. package/src/ai/__tests__/GoalPlanner.test.ts +137 -0
  150. package/src/ai/__tests__/GoalPlannerDepth.prod.test.ts +217 -0
  151. package/src/ai/__tests__/HoloScriptGenerator.test.ts +125 -0
  152. package/src/ai/__tests__/InfluenceMap.prod.test.ts +146 -0
  153. package/src/ai/__tests__/InfluenceMap.test.ts +149 -0
  154. package/src/ai/__tests__/NavMesh.prod.test.ts +141 -0
  155. package/src/ai/__tests__/NavMesh.test.ts +159 -0
  156. package/src/ai/__tests__/PerceptionSystem.prod.test.ts +135 -0
  157. package/src/ai/__tests__/PerceptionSystem.test.ts +250 -0
  158. package/src/ai/__tests__/PromptTemplates.prod.test.ts +313 -0
  159. package/src/ai/__tests__/PromptTemplates.test.ts +146 -0
  160. package/src/ai/__tests__/SemanticSearch.test.ts +37 -0
  161. package/src/ai/__tests__/StateMachine.prod.test.ts +162 -0
  162. package/src/ai/__tests__/StateMachine.test.ts +163 -0
  163. package/src/ai/__tests__/SteeringBehavior.prod.test.ts +251 -0
  164. package/src/ai/__tests__/SteeringBehavior.test.ts +135 -0
  165. package/src/ai/__tests__/SteeringBehaviors.prod.test.ts +133 -0
  166. package/src/ai/__tests__/SteeringBehaviors.test.ts +151 -0
  167. package/src/ai/__tests__/TrainingDataGenerator.prod.test.ts +286 -0
  168. package/src/ai/__tests__/TrainingDataGenerator.test.ts +286 -0
  169. package/src/ai/__tests__/UtilityAI.prod.test.ts +207 -0
  170. package/src/ai/__tests__/UtilityAI.test.ts +155 -0
  171. package/src/ai/__tests__/adapters.prod.test.ts +263 -0
  172. package/src/ai/__tests__/adapters.test.ts +320 -0
  173. package/src/ai/adapters.ts +1585 -0
  174. package/src/ai/index.ts +130 -0
  175. package/src/behavior/BehaviorPresets.ts +140 -0
  176. package/src/behavior/BehaviorTree.ts +236 -0
  177. package/src/behavior/StateMachine.ts +176 -0
  178. package/src/behavior/StateTrait.ts +67 -0
  179. package/src/behavior/index.ts +8 -0
  180. package/src/behavior.ts +8 -0
  181. package/src/board/audit.ts +284 -0
  182. package/src/board/board-ops.ts +336 -0
  183. package/src/board/board-types.ts +302 -0
  184. package/src/board/index.ts +69 -0
  185. package/src/define-agent.ts +46 -0
  186. package/src/define-team.ts +33 -0
  187. package/src/delegation.ts +265 -0
  188. package/src/distributed-claimer.ts +228 -0
  189. package/src/economy/AgentBudgetEnforcer.ts +464 -0
  190. package/src/economy/BountyManager.ts +185 -0
  191. package/src/economy/CreatorRevenueAggregator.ts +460 -0
  192. package/src/economy/InvisibleWallet.ts +82 -0
  193. package/src/economy/KnowledgeMarketplace.ts +193 -0
  194. package/src/economy/PaymentWebhookService.ts +512 -0
  195. package/src/economy/RevenueSplitter.ts +156 -0
  196. package/src/economy/SubscriptionManager.ts +546 -0
  197. package/src/economy/UnifiedBudgetOptimizer.ts +635 -0
  198. package/src/economy/UsageMeter.ts +440 -0
  199. package/src/economy/_core-stubs.ts +219 -0
  200. package/src/economy/index.ts +100 -0
  201. package/src/economy/x402-facilitator.ts +1978 -0
  202. package/src/index.ts +348 -0
  203. package/src/knowledge/__tests__/knowledge-consolidator.test.ts +444 -0
  204. package/src/knowledge/__tests__/knowledge-store-vector.test.ts +291 -0
  205. package/src/knowledge/brain.ts +167 -0
  206. package/src/knowledge/consolidation.ts +581 -0
  207. package/src/knowledge/knowledge-consolidator.ts +510 -0
  208. package/src/knowledge/knowledge-store.ts +616 -0
  209. package/src/learning/MemoryConsolidator.ts +102 -0
  210. package/src/learning/MemoryScorer.ts +69 -0
  211. package/src/learning/ProceduralCompiler.ts +45 -0
  212. package/src/learning/SemanticClusterer.ts +66 -0
  213. package/src/learning/index.ts +8 -0
  214. package/src/llm/llm-adapter.ts +159 -0
  215. package/src/mesh/index.ts +309 -0
  216. package/src/negotiation/NegotiationProtocol.ts +694 -0
  217. package/src/negotiation/NegotiationTypes.ts +473 -0
  218. package/src/negotiation/VotingMechanisms.ts +691 -0
  219. package/src/negotiation/index.ts +49 -0
  220. package/src/protocol/goal-synthesizer.ts +317 -0
  221. package/src/protocol/implementations.ts +474 -0
  222. package/src/protocol/micro-phase-decomposer.ts +299 -0
  223. package/src/protocol/micro-step-decomposer.test.ts +306 -0
  224. package/src/protocol-agent.test.ts +353 -0
  225. package/src/protocol-agent.ts +670 -0
  226. package/src/self-improve/absorb-scanner.ts +252 -0
  227. package/src/self-improve/evolution-engine.ts +149 -0
  228. package/src/self-improve/framework-absorber.ts +214 -0
  229. package/src/self-improve/index.ts +50 -0
  230. package/src/self-improve/prompt-optimizer.ts +212 -0
  231. package/src/self-improve/test-generator.ts +175 -0
  232. package/src/skill-router.ts +186 -0
  233. package/src/skills/index.ts +5 -0
  234. package/src/skills/skill-md-bridge.ts +1699 -0
  235. package/src/swarm/ACOEngine.ts +261 -0
  236. package/src/swarm/CollectiveIntelligence.ts +383 -0
  237. package/src/swarm/ContributionSynthesizer.ts +481 -0
  238. package/src/swarm/LeaderElection.ts +393 -0
  239. package/src/swarm/PSOEngine.ts +206 -0
  240. package/src/swarm/QuorumPolicy.ts +173 -0
  241. package/src/swarm/SwarmCoordinator.ts +335 -0
  242. package/src/swarm/SwarmManager.ts +442 -0
  243. package/src/swarm/SwarmMembership.ts +456 -0
  244. package/src/swarm/VotingRound.ts +255 -0
  245. package/src/swarm/__tests__/ACOEngine.prod.test.ts +164 -0
  246. package/src/swarm/__tests__/ACOEngine.test.ts +117 -0
  247. package/src/swarm/__tests__/CollectiveIntelligence.prod.test.ts +296 -0
  248. package/src/swarm/__tests__/CollectiveIntelligence.test.ts +457 -0
  249. package/src/swarm/__tests__/ContributionSynthesizer.prod.test.ts +269 -0
  250. package/src/swarm/__tests__/ContributionSynthesizer.test.ts +254 -0
  251. package/src/swarm/__tests__/LeaderElection.prod.test.ts +196 -0
  252. package/src/swarm/__tests__/LeaderElection.test.ts +151 -0
  253. package/src/swarm/__tests__/PSOEngine.prod.test.ts +162 -0
  254. package/src/swarm/__tests__/PSOEngine.test.ts +106 -0
  255. package/src/swarm/__tests__/QuorumPolicy.prod.test.ts +216 -0
  256. package/src/swarm/__tests__/QuorumPolicy.test.ts +177 -0
  257. package/src/swarm/__tests__/SwarmCoordinator.prod.test.ts +186 -0
  258. package/src/swarm/__tests__/SwarmCoordinator.test.ts +167 -0
  259. package/src/swarm/__tests__/SwarmManager.prod.test.ts +308 -0
  260. package/src/swarm/__tests__/SwarmManager.test.ts +373 -0
  261. package/src/swarm/__tests__/SwarmMembership.prod.test.ts +273 -0
  262. package/src/swarm/__tests__/SwarmMembership.test.ts +264 -0
  263. package/src/swarm/__tests__/VotingRound.prod.test.ts +233 -0
  264. package/src/swarm/__tests__/VotingRound.test.ts +174 -0
  265. package/src/swarm/analytics/SwarmInspector.ts +476 -0
  266. package/src/swarm/analytics/SwarmMetrics.ts +449 -0
  267. package/src/swarm/analytics/__tests__/SwarmInspector.prod.test.ts +366 -0
  268. package/src/swarm/analytics/__tests__/SwarmInspector.test.ts +454 -0
  269. package/src/swarm/analytics/__tests__/SwarmMetrics.prod.test.ts +254 -0
  270. package/src/swarm/analytics/__tests__/SwarmMetrics.test.ts +370 -0
  271. package/src/swarm/analytics/index.ts +7 -0
  272. package/src/swarm/index.ts +69 -0
  273. package/src/swarm/messaging/BroadcastChannel.ts +509 -0
  274. package/src/swarm/messaging/GossipProtocol.ts +565 -0
  275. package/src/swarm/messaging/SwarmEventBus.ts +443 -0
  276. package/src/swarm/messaging/__tests__/BroadcastChannel.prod.test.ts +331 -0
  277. package/src/swarm/messaging/__tests__/BroadcastChannel.test.ts +333 -0
  278. package/src/swarm/messaging/__tests__/GossipProtocol.prod.test.ts +356 -0
  279. package/src/swarm/messaging/__tests__/GossipProtocol.test.ts +437 -0
  280. package/src/swarm/messaging/__tests__/SwarmEventBus.prod.test.ts +191 -0
  281. package/src/swarm/messaging/__tests__/SwarmEventBus.test.ts +247 -0
  282. package/src/swarm/messaging/index.ts +8 -0
  283. package/src/swarm/spatial/FlockingBehavior.ts +462 -0
  284. package/src/swarm/spatial/FormationController.ts +500 -0
  285. package/src/swarm/spatial/Vector3.ts +170 -0
  286. package/src/swarm/spatial/ZoneClaiming.ts +509 -0
  287. package/src/swarm/spatial/__tests__/FlockingBehavior.prod.test.ts +239 -0
  288. package/src/swarm/spatial/__tests__/FlockingBehavior.test.ts +298 -0
  289. package/src/swarm/spatial/__tests__/FormationController.prod.test.ts +240 -0
  290. package/src/swarm/spatial/__tests__/FormationController.test.ts +297 -0
  291. package/src/swarm/spatial/__tests__/Vector3.prod.test.ts +283 -0
  292. package/src/swarm/spatial/__tests__/Vector3.test.ts +224 -0
  293. package/src/swarm/spatial/__tests__/ZoneClaiming.prod.test.ts +246 -0
  294. package/src/swarm/spatial/__tests__/ZoneClaiming.test.ts +374 -0
  295. package/src/swarm/spatial/index.ts +28 -0
  296. package/src/team.ts +1245 -0
  297. package/src/training/LRScheduler.ts +377 -0
  298. package/src/training/QualityScoringPipeline.ts +139 -0
  299. package/src/training/SoftDedup.ts +461 -0
  300. package/src/training/SparsityMonitor.ts +685 -0
  301. package/src/training/SparsityMonitorTypes.ts +209 -0
  302. package/src/training/SpatialTrainingDataGenerator.ts +1526 -0
  303. package/src/training/SpatialTrainingDataTypes.ts +216 -0
  304. package/src/training/TrainingPipelineConfig.ts +215 -0
  305. package/src/training/constants.ts +94 -0
  306. package/src/training/index.ts +138 -0
  307. package/src/training/schema.ts +147 -0
  308. package/src/training/scripts/generate-novel-use-cases-dataset.ts +272 -0
  309. package/src/training/scripts/generate-spatial-dataset.ts +521 -0
  310. package/src/training/training/data/novel-use-cases.jsonl +153 -0
  311. package/src/training/training/data/spatial-reasoning-10k.jsonl +9354 -0
  312. package/src/training/trainingmonkey/TrainingMonkeyIntegration.ts +477 -0
  313. package/src/training/trainingmonkey/TrainingMonkeyTypes.ts +230 -0
  314. package/src/training/trainingmonkey/index.ts +26 -0
  315. package/src/training/trait-mappings.ts +157 -0
  316. package/src/types/core-stubs.d.ts +113 -0
  317. package/src/types.ts +304 -0
  318. package/test-output.txt +0 -0
  319. package/test-result.json +1 -0
  320. package/tsc-errors.txt +4 -0
  321. package/tsc_output.txt +0 -0
  322. package/tsconfig.json +14 -0
  323. package/tsup-learning-esm.config.ts +12 -0
  324. package/tsup.config.ts +21 -0
  325. package/typescript-errors-2.txt +0 -0
  326. package/typescript-errors.txt +22 -0
  327. package/vitest-log-utf8.txt +268 -0
  328. package/vitest-log.txt +0 -0
  329. package/vitest.config.ts +8 -0
@@ -0,0 +1,167 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { SwarmCoordinator, type AgentInfo, type TaskInfo } from '../SwarmCoordinator';
3
+ import type { ISwarmConfig } from '@holoscript/core';
4
+
5
+ describe('SwarmCoordinator', () => {
6
+ let coordinator: SwarmCoordinator;
7
+ let agents: AgentInfo[];
8
+ let tasks: TaskInfo[];
9
+
10
+ beforeEach(() => {
11
+ coordinator = new SwarmCoordinator();
12
+
13
+ agents = [
14
+ { id: 'agent-1', capacity: 100, load: 20 },
15
+ { id: 'agent-2', capacity: 100, load: 30 },
16
+ { id: 'agent-3', capacity: 100, load: 10 },
17
+ ];
18
+
19
+ tasks = [
20
+ { id: 'task-1', complexity: 20, priority: 3 },
21
+ { id: 'task-2', complexity: 30, priority: 2 },
22
+ { id: 'task-3', complexity: 15, priority: 1 },
23
+ { id: 'task-4', complexity: 25, priority: 3 },
24
+ { id: 'task-5', complexity: 10, priority: 2 },
25
+ ];
26
+ });
27
+
28
+ describe('constructor', () => {
29
+ it('should create with default config', () => {
30
+ expect(coordinator).toBeDefined();
31
+ });
32
+
33
+ it('should accept custom config', () => {
34
+ const customCoordinator = new SwarmCoordinator({
35
+ algorithm: 'pso',
36
+ populationSize: 50,
37
+ });
38
+ expect(customCoordinator).toBeDefined();
39
+ });
40
+ });
41
+
42
+ describe('optimize', () => {
43
+ it('should return valid assignment for all tasks', async () => {
44
+ const result = await coordinator.optimize(agents, tasks);
45
+
46
+ expect(result.bestSolution).toHaveLength(tasks.length);
47
+ expect(result.bestSolution.every((a: any) => a >= 0 && a < agents.length)).toBe(true);
48
+ });
49
+
50
+ it('should complete with PSO algorithm', async () => {
51
+ const config: Partial<ISwarmConfig> = { algorithm: 'pso' };
52
+ const result = await coordinator.optimize(agents, tasks, config);
53
+
54
+ expect(result.bestSolution).toHaveLength(tasks.length);
55
+ expect(result.iterations).toBeGreaterThan(0);
56
+ });
57
+
58
+ it('should complete with ACO algorithm', async () => {
59
+ const config: Partial<ISwarmConfig> = { algorithm: 'aco' };
60
+ const result = await coordinator.optimize(agents, tasks, config);
61
+
62
+ expect(result.bestSolution).toHaveLength(tasks.length);
63
+ });
64
+
65
+ it('should complete with hybrid algorithm', async () => {
66
+ const config: Partial<ISwarmConfig> = { algorithm: 'hybrid' };
67
+ const result = await coordinator.optimize(agents, tasks, config);
68
+
69
+ expect(result.bestSolution).toHaveLength(tasks.length);
70
+ });
71
+
72
+ it('should complete with bees algorithm', async () => {
73
+ const config: Partial<ISwarmConfig> = { algorithm: 'bees' };
74
+ const result = await coordinator.optimize(agents, tasks, config);
75
+
76
+ expect(result.bestSolution).toHaveLength(tasks.length);
77
+ });
78
+
79
+ it('should respect capacity constraints', async () => {
80
+ // Small capacity agents with large tasks
81
+ const limitedAgents: AgentInfo[] = [
82
+ { id: 'agent-1', capacity: 50, load: 0 },
83
+ { id: 'agent-2', capacity: 50, load: 0 },
84
+ ];
85
+ const heavyTasks: TaskInfo[] = [
86
+ { id: 'task-1', complexity: 40, priority: 1 },
87
+ { id: 'task-2', complexity: 40, priority: 1 },
88
+ ];
89
+
90
+ const result = await coordinator.optimize(limitedAgents, heavyTasks);
91
+
92
+ // Should distribute to avoid overload
93
+ expect(result.bestSolution).toHaveLength(2);
94
+ expect(result.bestFitness).toBeGreaterThan(-100); // Not heavily penalized
95
+ });
96
+
97
+ it('should prioritize high-priority tasks', async () => {
98
+ const result = await coordinator.optimize(agents, tasks);
99
+
100
+ expect(result.bestFitness).toBeGreaterThan(0);
101
+ expect(result.improvementPercent).toBeDefined();
102
+ });
103
+
104
+ it('should use adaptive sizing when enabled', async () => {
105
+ const config: Partial<ISwarmConfig> = { adaptiveSizing: true };
106
+ const result = await coordinator.optimize(agents, tasks, config);
107
+
108
+ expect(result.bestSolution).toHaveLength(tasks.length);
109
+ });
110
+
111
+ it('should handle empty tasks', async () => {
112
+ const result = await coordinator.optimize(agents, []);
113
+
114
+ expect(result.bestSolution).toHaveLength(0);
115
+ });
116
+
117
+ it('should handle single agent', async () => {
118
+ const singleAgent: AgentInfo[] = [{ id: 'solo', capacity: 1000, load: 0 }];
119
+ const result = await coordinator.optimize(singleAgent, tasks);
120
+
121
+ // All tasks should go to the only agent
122
+ expect(result.bestSolution.every((a: any) => a === 0)).toBe(true);
123
+ });
124
+ });
125
+
126
+ describe('getRecommendedPopulation', () => {
127
+ it('should return minimum 15 for small problems', () => {
128
+ expect(coordinator.getRecommendedPopulation(1)).toBeGreaterThanOrEqual(15);
129
+ });
130
+
131
+ it('should cap at 100 for large problems', () => {
132
+ expect(coordinator.getRecommendedPopulation(100000)).toBeLessThanOrEqual(100);
133
+ });
134
+
135
+ it('should increase with problem size', () => {
136
+ const small = coordinator.getRecommendedPopulation(10);
137
+ const medium = coordinator.getRecommendedPopulation(100);
138
+ const large = coordinator.getRecommendedPopulation(1000);
139
+
140
+ expect(medium).toBeGreaterThan(small);
141
+ expect(large).toBeGreaterThan(medium);
142
+ });
143
+ });
144
+
145
+ describe('result metrics', () => {
146
+ it('should report convergence status', async () => {
147
+ const result = await coordinator.optimize(agents, tasks, {
148
+ maxIterations: 5, // Low iterations may not converge
149
+ });
150
+
151
+ expect(typeof result.converged).toBe('boolean');
152
+ });
153
+
154
+ it('should report iteration count', async () => {
155
+ const result = await coordinator.optimize(agents, tasks);
156
+
157
+ expect(result.iterations).toBeGreaterThan(0);
158
+ });
159
+
160
+ it('should report improvement percentage', async () => {
161
+ const result = await coordinator.optimize(agents, tasks);
162
+
163
+ expect(typeof result.improvementPercent).toBe('number');
164
+ expect(result.improvementPercent).toBeGreaterThanOrEqual(0);
165
+ });
166
+ });
167
+ });
@@ -0,0 +1,308 @@
1
+ /**
2
+ * SwarmManager — Production Tests
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { SwarmManager } from '../SwarmManager';
6
+ import type { SwarmEvent } from '../SwarmManager';
7
+
8
+ function make(cfg = {}) {
9
+ return new SwarmManager(cfg);
10
+ }
11
+
12
+ function req(name = 'Alpha', objective = 'Do stuff', createdBy = 'a1', extra = {}) {
13
+ return { name, objective, createdBy, ...extra };
14
+ }
15
+
16
+ describe('SwarmManager — createSwarm', () => {
17
+ it('creates swarm with required fields', () => {
18
+ const sm = make();
19
+ const sw = sm.createSwarm(req());
20
+ expect(sw.id.startsWith('swarm-')).toBe(true);
21
+ expect(sw.name).toBe('Alpha');
22
+ expect(sw.objective).toBe('Do stuff');
23
+ expect(sw.createdBy).toBe('a1');
24
+ });
25
+ it('creator is tracked in membership', () => {
26
+ const sm = make();
27
+ const sw = sm.createSwarm(req());
28
+ expect(sw.membership.getMember('a1')).toBeDefined();
29
+ });
30
+ it('creator is swarm leader', () => {
31
+ const sm = make();
32
+ const sw = sm.createSwarm(req());
33
+ expect(sw.membership.getLeader()?.agentId).toBe('a1');
34
+ });
35
+ it('status=forming initially', () => {
36
+ const sm = make();
37
+ expect(sm.createSwarm(req()).status).toBe('forming');
38
+ });
39
+ it('getSwarm returns created swarm', () => {
40
+ const sm = make();
41
+ const sw = sm.createSwarm(req());
42
+ expect(sm.getSwarm(sw.id)).toBe(sw);
43
+ });
44
+ it('emits swarm-created event', () => {
45
+ const events: string[] = [];
46
+ const sm = make();
47
+ sm.onEvent((e) => events.push(e.type));
48
+ sm.createSwarm(req());
49
+ expect(events).toContain('swarm-created');
50
+ });
51
+ it('throws when agent at maxSwarmsPerAgent', () => {
52
+ const sm = make({ maxSwarmsPerAgent: 1 });
53
+ sm.createSwarm(req());
54
+ expect(() => sm.createSwarm(req('Beta', 'xyz', 'a1'))).toThrow();
55
+ });
56
+ it('metadata stored', () => {
57
+ const sm = make();
58
+ const sw = sm.createSwarm(req('A', 'b', 'a1', { metadata: { region: 'us' } }));
59
+ expect(sw.metadata?.region).toBe('us');
60
+ });
61
+ });
62
+
63
+ describe('SwarmManager — joinSwarm', () => {
64
+ it('joinSwarm adds member', () => {
65
+ const sm = make();
66
+ const sw = sm.createSwarm(req());
67
+ sm.joinSwarm(sw.id, 'a2');
68
+ expect(sw.membership.getMember('a2')).toBeDefined();
69
+ });
70
+ it('joinSwarm returns true on success', () => {
71
+ const sm = make();
72
+ const sw = sm.createSwarm(req());
73
+ expect(sm.joinSwarm(sw.id, 'a2')).toBe(true);
74
+ });
75
+ it('joinSwarm unknown swarm throws', () => {
76
+ expect(() => make().joinSwarm('ghost', 'a1')).toThrow();
77
+ });
78
+ it('joinSwarm disbanded swarm throws', () => {
79
+ const sm = make();
80
+ const sw = sm.createSwarm(req());
81
+ sm.disbandSwarm(sw.id, { reason: 'test', redistributeTasks: false, notifyMembers: false });
82
+ expect(() => sm.joinSwarm(sw.id, 'a2')).toThrow();
83
+ });
84
+ it('joinSwarm as observer does not count against member limit', () => {
85
+ const sm = make({ maxSwarmsPerAgent: 1 });
86
+ sm.createSwarm(req()); // agent a1 hits limit
87
+ const sw2 = sm.createSwarm(req('Beta', 'b', 'a2'));
88
+ expect(() => sm.joinSwarm(sw2.id, 'a1', true)).not.toThrow(); // observer is fine
89
+ });
90
+ it('getAgentSwarms returns swarms', () => {
91
+ const sm = make();
92
+ const sw = sm.createSwarm(req());
93
+ sm.joinSwarm(sw.id, 'a2');
94
+ expect(sm.getAgentSwarms('a2')).toHaveLength(1);
95
+ });
96
+ });
97
+
98
+ describe('SwarmManager — leaveSwarm', () => {
99
+ it('leaveSwarm removes member (leader leaves)', () => {
100
+ // With only 1 member (the creator/leader), graceful leave is allowed (last member case)
101
+ // But to test removal of non-leader we need extra members so quorum stays
102
+ const sm = make({ disbandEmptySwarms: false });
103
+ const sw = sm.createSwarm(
104
+ req('A', 'b', 'a1', {
105
+ membershipConfig: {
106
+ quorum: { minimumSize: 1, optimalSize: 3, maximumSize: 10, quorumPercentage: 0.3 },
107
+ },
108
+ })
109
+ );
110
+ sm.joinSwarm(sw.id, 'a2');
111
+ sm.joinSwarm(sw.id, 'a3');
112
+ sm.leaveSwarm(sw.id, 'a2');
113
+ // After leave, member either removed or in 'leaving' — definitely not active
114
+ const member = sw.membership.getMember('a2');
115
+ expect(!member || member.status === 'leaving').toBe(true);
116
+ });
117
+ it('leaveSwarm unknown swarm throws', () => {
118
+ expect(() => make().leaveSwarm('ghost', 'a1')).toThrow();
119
+ });
120
+ it('leaveSwarm untracks agent from swarm when fully removed', () => {
121
+ // graceful leave of last member removes immediately
122
+ const sm = make({ disbandEmptySwarms: false });
123
+ const sw = sm.createSwarm(req());
124
+ // a1 is the only member — graceful leave is allowed for last member
125
+ sm.leaveSwarm(sw.id, 'a1', true);
126
+ expect(sm.getAgentSwarms('a1')).toHaveLength(0);
127
+ });
128
+ });
129
+
130
+ describe('SwarmManager — disbandSwarm', () => {
131
+ it('sets status=disbanded', () => {
132
+ const sm = make();
133
+ const sw = sm.createSwarm(req());
134
+ sm.disbandSwarm(sw.id, { reason: 'done', redistributeTasks: false, notifyMembers: false });
135
+ expect(sm.getSwarm(sw.id)!.status).toBe('disbanded');
136
+ });
137
+ it('removes all members', () => {
138
+ const sm = make();
139
+ const sw = sm.createSwarm(req());
140
+ sm.joinSwarm(sw.id, 'a2');
141
+ sm.joinSwarm(sw.id, 'a3');
142
+ sm.disbandSwarm(sw.id, { reason: 'x', redistributeTasks: false, notifyMembers: false });
143
+ expect(sw.membership.getMemberCount()).toBe(0);
144
+ });
145
+ it('emits swarm-disbanded event', () => {
146
+ const events: string[] = [];
147
+ const sm = make();
148
+ sm.onEvent((e) => events.push(e.type));
149
+ const sw = sm.createSwarm(req());
150
+ sm.disbandSwarm(sw.id, { reason: 'x', redistributeTasks: false, notifyMembers: false });
151
+ expect(events).toContain('swarm-disbanded');
152
+ });
153
+ it('disbanding already disbanded swarm is idempotent', () => {
154
+ const sm = make();
155
+ const sw = sm.createSwarm(req());
156
+ sm.disbandSwarm(sw.id, { reason: 'x', redistributeTasks: false, notifyMembers: false });
157
+ expect(() =>
158
+ sm.disbandSwarm(sw.id, { reason: 'x2', redistributeTasks: false, notifyMembers: false })
159
+ ).not.toThrow();
160
+ });
161
+ it('disbandSwarm unknown throws', () => {
162
+ expect(() =>
163
+ make().disbandSwarm('ghost', { reason: 'x', redistributeTasks: false, notifyMembers: false })
164
+ ).toThrow();
165
+ });
166
+ });
167
+
168
+ describe('SwarmManager — getSwarm queries', () => {
169
+ it('getSwarm unknown=undefined', () => {
170
+ expect(make().getSwarm('ghost')).toBeUndefined();
171
+ });
172
+ it('getAllSwarms returns all', () => {
173
+ const sm = make();
174
+ sm.createSwarm(req());
175
+ sm.createSwarm(req('Beta', 'b', 'a2'));
176
+ expect(sm.getAllSwarms()).toHaveLength(2);
177
+ });
178
+ it('getActiveSwarms includes forming/active', () => {
179
+ const sm = make();
180
+ sm.createSwarm(req());
181
+ sm.createSwarm(req('Beta', 'b', 'a2'));
182
+ expect(sm.getActiveSwarms()).toHaveLength(2); // both forming
183
+ });
184
+ it('getActiveSwarms excludes disbanded', () => {
185
+ const sm = make();
186
+ const sw = sm.createSwarm(req());
187
+ sm.disbandSwarm(sw.id, { reason: 'x', redistributeTasks: false, notifyMembers: false });
188
+ expect(sm.getActiveSwarms()).toHaveLength(0);
189
+ });
190
+ });
191
+
192
+ describe('SwarmManager — findSwarmsByObjective', () => {
193
+ it('finds by objective substring', () => {
194
+ const sm = make();
195
+ sm.createSwarm(req('A', 'optimize redis cache'));
196
+ sm.createSwarm(req('B', 'upgrade database', 'a2'));
197
+ expect(sm.findSwarmsByObjective('redis')).toHaveLength(1);
198
+ });
199
+ it('finds by name substring', () => {
200
+ const sm = make();
201
+ sm.createSwarm(req('AlphaTeam', 'do things'));
202
+ expect(sm.findSwarmsByObjective('Alpha')).toHaveLength(1);
203
+ });
204
+ it('case-insensitive match', () => {
205
+ const sm = make();
206
+ sm.createSwarm(req('A', 'Implement Redis Caching'));
207
+ expect(sm.findSwarmsByObjective('redis')).toHaveLength(1);
208
+ });
209
+ it('no match returns empty', () => {
210
+ const sm = make();
211
+ sm.createSwarm(req());
212
+ expect(sm.findSwarmsByObjective('zzznomatch')).toHaveLength(0);
213
+ });
214
+ });
215
+
216
+ describe('SwarmManager — getSwarmStats', () => {
217
+ it('returns undefined for unknown', () => {
218
+ expect(make().getSwarmStats('ghost')).toBeUndefined();
219
+ });
220
+ it('returns memberCount, quorumState, ageMs, healthScore', () => {
221
+ const sm = make();
222
+ const sw = sm.createSwarm(req());
223
+ const stats = sm.getSwarmStats(sw.id)!;
224
+ expect(stats.memberCount).toBe(1);
225
+ expect(stats.quorumState).toBeDefined();
226
+ expect(stats.ageMs).toBeGreaterThanOrEqual(0);
227
+ expect(stats.healthScore).toBeGreaterThan(0);
228
+ });
229
+ it('healthScore=0 for disbanded swarm', () => {
230
+ const sm = make();
231
+ const sw = sm.createSwarm(req());
232
+ sm.disbandSwarm(sw.id, { reason: 'x', redistributeTasks: false, notifyMembers: false });
233
+ expect(sm.getSwarmStats(sw.id)!.healthScore).toBe(0);
234
+ });
235
+ it('healthScore increases with quorum', () => {
236
+ const sm = make({
237
+ defaultMembershipConfig: {
238
+ quorum: { minimumSize: 1, optimalSize: 3, maximumSize: 10, quorumPercentage: 0.5 },
239
+ },
240
+ });
241
+ const sw = sm.createSwarm(req());
242
+ sm.joinSwarm(sw.id, 'a2');
243
+ sm.joinSwarm(sw.id, 'a3');
244
+ expect(sm.getSwarmStats(sw.id)!.healthScore).toBeGreaterThan(0.5);
245
+ });
246
+ });
247
+
248
+ describe('SwarmManager — events', () => {
249
+ it('member-joined emitted on joinSwarm', () => {
250
+ const events: SwarmEvent[] = [];
251
+ const sm = make();
252
+ sm.onEvent((e) => events.push(e));
253
+ const sw = sm.createSwarm(req());
254
+ sm.joinSwarm(sw.id, 'a2');
255
+ expect(events.some((e) => e.type === 'member-joined' && e.agentId === 'a2')).toBe(true);
256
+ });
257
+ it('member-left emitted when last member leaves gracefully', () => {
258
+ const events: SwarmEvent[] = [];
259
+ const sm = make({ disbandEmptySwarms: false });
260
+ const sw = sm.createSwarm(req());
261
+ sm.onEvent((e) => events.push(e));
262
+ // a1 is last member; graceful leave of last triggers full removal
263
+ sm.leaveSwarm(sw.id, 'a1', true);
264
+ expect(events.some((e) => e.type === 'member-left')).toBe(true);
265
+ });
266
+ it('status-changed emitted when forming→active', () => {
267
+ const events: SwarmEvent[] = [];
268
+ const sm = make({
269
+ defaultMembershipConfig: {
270
+ quorum: { minimumSize: 1, optimalSize: 2, maximumSize: 10, quorumPercentage: 0.5 },
271
+ },
272
+ });
273
+ const sw = sm.createSwarm(req());
274
+ sm.onEvent((e) => events.push(e)); // subscribe after create
275
+ sm.joinSwarm(sw.id, 'a2'); // now has quorum (2+ >= 1 threshold)
276
+ // May or may not emit depending on initial quorum calculation
277
+ // just check it doesn't throw
278
+ expect(events).toBeDefined();
279
+ });
280
+ it('onEvent unsub removes handler', () => {
281
+ const events: string[] = [];
282
+ const sm = make();
283
+ const unsub = sm.onEvent((e) => events.push(e.type));
284
+ unsub();
285
+ sm.createSwarm(req());
286
+ expect(events).toHaveLength(0);
287
+ });
288
+ });
289
+
290
+ describe('SwarmManager — performMaintenance', () => {
291
+ it('returns empty array when no timeouts', () => {
292
+ const sm = make();
293
+ sm.createSwarm(req());
294
+ expect(sm.performMaintenance()).toHaveLength(0);
295
+ });
296
+ it('does not throw with multiple swarms', () => {
297
+ const sm = make();
298
+ sm.createSwarm(req());
299
+ sm.createSwarm(req('B', 'b', 'a2'));
300
+ expect(() => sm.performMaintenance()).not.toThrow();
301
+ });
302
+ it('skips disbanded swarms', () => {
303
+ const sm = make();
304
+ const sw = sm.createSwarm(req());
305
+ sm.disbandSwarm(sw.id, { reason: 'x', redistributeTasks: false, notifyMembers: false });
306
+ expect(() => sm.performMaintenance()).not.toThrow();
307
+ });
308
+ });