@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,173 @@
1
+ /**
2
+ * Quorum Policy
3
+ *
4
+ * Enforces minimum size requirements for swarm operations.
5
+ */
6
+
7
+ export interface QuorumConfig {
8
+ minimumSize: number;
9
+ optimalSize: number;
10
+ maximumSize: number;
11
+ requireQuorumForOperations: boolean;
12
+ quorumPercentage: number; // 0-1, percentage of optimal size required
13
+ }
14
+
15
+ const DEFAULT_CONFIG: QuorumConfig = {
16
+ minimumSize: 2,
17
+ optimalSize: 5,
18
+ maximumSize: 50,
19
+ requireQuorumForOperations: true,
20
+ quorumPercentage: 0.5,
21
+ };
22
+
23
+ export type QuorumStatus = 'below-minimum' | 'quorum' | 'optimal' | 'above-maximum';
24
+
25
+ export interface QuorumState {
26
+ currentSize: number;
27
+ status: QuorumStatus;
28
+ hasQuorum: boolean;
29
+ canOperate: boolean;
30
+ requiredForQuorum: number;
31
+ spotsAvailable: number;
32
+ }
33
+
34
+ /**
35
+ * Manages quorum requirements for a swarm
36
+ */
37
+ export class QuorumPolicy {
38
+ private config: QuorumConfig;
39
+ private currentSize = 0;
40
+
41
+ constructor(config: Partial<QuorumConfig> = {}) {
42
+ this.config = { ...DEFAULT_CONFIG, ...config };
43
+ this.validateConfig();
44
+ }
45
+
46
+ private validateConfig(): void {
47
+ if (this.config.minimumSize > this.config.optimalSize) {
48
+ throw new Error('minimumSize cannot exceed optimalSize');
49
+ }
50
+ if (this.config.optimalSize > this.config.maximumSize) {
51
+ throw new Error('optimalSize cannot exceed maximumSize');
52
+ }
53
+ if (this.config.quorumPercentage < 0 || this.config.quorumPercentage > 1) {
54
+ throw new Error('quorumPercentage must be between 0 and 1');
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Update the current member count
60
+ */
61
+ setMemberCount(count: number): void {
62
+ this.currentSize = Math.max(0, count);
63
+ }
64
+
65
+ /**
66
+ * Check if a new member can join
67
+ */
68
+ canJoin(): boolean {
69
+ return this.currentSize < this.config.maximumSize;
70
+ }
71
+
72
+ /**
73
+ * Check if a member can leave without breaking quorum
74
+ */
75
+ canLeave(): boolean {
76
+ const afterLeave = this.currentSize - 1;
77
+ return afterLeave >= this.config.minimumSize;
78
+ }
79
+
80
+ /**
81
+ * Check if the swarm has achieved quorum
82
+ */
83
+ hasQuorum(): boolean {
84
+ const requiredForQuorum = Math.ceil(this.config.optimalSize * this.config.quorumPercentage);
85
+ return this.currentSize >= Math.max(this.config.minimumSize, requiredForQuorum);
86
+ }
87
+
88
+ /**
89
+ * Check if the swarm can operate
90
+ */
91
+ canOperate(): boolean {
92
+ if (!this.config.requireQuorumForOperations) {
93
+ return this.currentSize > 0;
94
+ }
95
+ return this.hasQuorum();
96
+ }
97
+
98
+ /**
99
+ * Get the current quorum status
100
+ */
101
+ getStatus(): QuorumStatus {
102
+ if (this.currentSize < this.config.minimumSize) {
103
+ return 'below-minimum';
104
+ }
105
+ if (this.currentSize > this.config.maximumSize) {
106
+ return 'above-maximum';
107
+ }
108
+ if (this.currentSize >= this.config.optimalSize) {
109
+ return 'optimal';
110
+ }
111
+ return 'quorum';
112
+ }
113
+
114
+ /**
115
+ * Get full quorum state
116
+ */
117
+ getState(): QuorumState {
118
+ const requiredForQuorum = Math.ceil(this.config.optimalSize * this.config.quorumPercentage);
119
+ const actualRequired = Math.max(this.config.minimumSize, requiredForQuorum);
120
+
121
+ return {
122
+ currentSize: this.currentSize,
123
+ status: this.getStatus(),
124
+ hasQuorum: this.hasQuorum(),
125
+ canOperate: this.canOperate(),
126
+ requiredForQuorum: Math.max(0, actualRequired - this.currentSize),
127
+ spotsAvailable: Math.max(0, this.config.maximumSize - this.currentSize),
128
+ };
129
+ }
130
+
131
+ /**
132
+ * Check if the swarm should seek more members
133
+ */
134
+ shouldRecruit(): boolean {
135
+ return this.currentSize < this.config.optimalSize;
136
+ }
137
+
138
+ /**
139
+ * Check if the swarm should consider splitting
140
+ */
141
+ shouldSplit(): boolean {
142
+ return this.currentSize > this.config.maximumSize;
143
+ }
144
+
145
+ /**
146
+ * Calculate the health score of the swarm (0-1)
147
+ */
148
+ getHealthScore(): number {
149
+ if (this.currentSize === 0) return 0;
150
+ if (this.currentSize < this.config.minimumSize) {
151
+ return (this.currentSize / this.config.minimumSize) * 0.5;
152
+ }
153
+ if (this.currentSize > this.config.maximumSize) {
154
+ const excess = this.currentSize - this.config.maximumSize;
155
+ const penalty = excess / this.config.maximumSize;
156
+ return Math.max(0.5, 1 - penalty * 0.5);
157
+ }
158
+ if (this.currentSize >= this.config.optimalSize) {
159
+ return 1;
160
+ }
161
+ // Between minimum and optimal
162
+ const range = this.config.optimalSize - this.config.minimumSize;
163
+ const position = this.currentSize - this.config.minimumSize;
164
+ return 0.5 + (position / range) * 0.5;
165
+ }
166
+
167
+ /**
168
+ * Get the config
169
+ */
170
+ getConfig(): QuorumConfig {
171
+ return { ...this.config };
172
+ }
173
+ }
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Swarm Coordinator
3
+ *
4
+ * Implements ISwarmCoordinator interface for agent-task optimization.
5
+ * Supports PSO, ACO, and hybrid algorithms.
6
+ */
7
+
8
+ import type { ISwarmConfig, ISwarmResult, ISwarmCoordinator } from '@holoscript/core';
9
+ import { PSOEngine } from './PSOEngine';
10
+ import { ACOEngine } from './ACOEngine';
11
+
12
+ export interface AgentInfo {
13
+ id: string;
14
+ capacity: number;
15
+ load: number;
16
+ }
17
+
18
+ export interface TaskInfo {
19
+ id: string;
20
+ complexity: number;
21
+ priority: number;
22
+ }
23
+
24
+ const DEFAULT_CONFIG: ISwarmConfig = {
25
+ algorithm: 'hybrid',
26
+ populationSize: 30,
27
+ maxIterations: 100,
28
+ convergenceThreshold: 0.001,
29
+ adaptiveSizing: true,
30
+ };
31
+
32
+ /**
33
+ * Main swarm coordinator for multi-agent task optimization
34
+ */
35
+ export class SwarmCoordinator implements ISwarmCoordinator {
36
+ private psoEngine: PSOEngine;
37
+ private acoEngine: ACOEngine;
38
+ private defaultConfig: ISwarmConfig;
39
+
40
+ constructor(config: Partial<ISwarmConfig> = {}) {
41
+ this.defaultConfig = { ...DEFAULT_CONFIG, ...config };
42
+ this.psoEngine = new PSOEngine({
43
+ populationSize: this.defaultConfig.populationSize,
44
+ maxIterations: this.defaultConfig.maxIterations,
45
+ convergenceThreshold: this.defaultConfig.convergenceThreshold,
46
+ });
47
+ this.acoEngine = new ACOEngine({
48
+ antCount: this.defaultConfig.populationSize,
49
+ maxIterations: this.defaultConfig.maxIterations,
50
+ convergenceThreshold: this.defaultConfig.convergenceThreshold,
51
+ });
52
+ }
53
+
54
+ /**
55
+ * Optimize agent-task assignment
56
+ *
57
+ * Uses PSO to find optimal task-to-agent mapping that:
58
+ * - Balances load across agents
59
+ * - Respects capacity constraints
60
+ * - Prioritizes high-priority tasks
61
+ * - Minimizes complexity/load mismatch
62
+ */
63
+ async optimize(
64
+ agents: AgentInfo[],
65
+ tasks: TaskInfo[],
66
+ config?: Partial<ISwarmConfig>
67
+ ): Promise<ISwarmResult> {
68
+ const mergedConfig = { ...this.defaultConfig, ...config };
69
+ const { algorithm, adaptiveSizing, populationSize } = mergedConfig;
70
+
71
+ // Adjust population if adaptive sizing enabled
72
+ const problemSize = agents.length * tasks.length;
73
+ const effectivePopulation = adaptiveSizing
74
+ ? this.getRecommendedPopulation(problemSize)
75
+ : populationSize;
76
+
77
+ // Create fitness function based on assignment quality
78
+ const fitnessFunction = this.createFitnessFunction(agents, tasks);
79
+
80
+ // Choose algorithm
81
+ if (algorithm === 'pso' || algorithm === 'hybrid') {
82
+ // Use PSO for assignment optimization
83
+ const psoEngine = new PSOEngine({
84
+ populationSize: effectivePopulation,
85
+ maxIterations: mergedConfig.maxIterations,
86
+ convergenceThreshold: mergedConfig.convergenceThreshold,
87
+ });
88
+
89
+ const psoResult = await psoEngine.optimize(agents.length, tasks.length, fitnessFunction);
90
+
91
+ // For hybrid, optionally refine with ACO if not converged
92
+ if (algorithm === 'hybrid' && !psoResult.converged) {
93
+ const acoRefinement = await this.refineWithACO(
94
+ psoResult.bestSolution,
95
+ agents,
96
+ tasks,
97
+ mergedConfig
98
+ );
99
+
100
+ if (acoRefinement.bestFitness > psoResult.bestFitness) {
101
+ return this.formatResult(acoRefinement.bestSolution, acoRefinement, agents, tasks);
102
+ }
103
+ }
104
+
105
+ return this.formatResult(psoResult.bestSolution, psoResult, agents, tasks);
106
+ }
107
+
108
+ if (algorithm === 'aco') {
109
+ // Use ACO - create distance matrix from task complexity/agent capacity
110
+ const distanceMatrix = this.createDistanceMatrix(agents, tasks);
111
+ const acoResult = await this.acoEngine.optimize(tasks.length, distanceMatrix);
112
+
113
+ // Convert path to assignment (using modular agent mapping)
114
+ const assignment = acoResult.bestPath.map((_, i) => i % agents.length);
115
+
116
+ return {
117
+ bestSolution: assignment,
118
+ bestFitness: 1 / (acoResult.bestCost + 1),
119
+ converged: acoResult.converged,
120
+ iterations: acoResult.iterations,
121
+ improvementPercent: this.calculateImprovement(assignment, fitnessFunction),
122
+ };
123
+ }
124
+
125
+ if (algorithm === 'bees') {
126
+ // Bees algorithm - simplified implementation using modified PSO
127
+ const beesEngine = new PSOEngine({
128
+ populationSize: Math.floor((effectivePopulation ?? 30) * 0.5), // Scout bees
129
+ maxIterations: mergedConfig.maxIterations,
130
+ convergenceThreshold: mergedConfig.convergenceThreshold,
131
+ inertiaWeight: 0.5, // Less inertia for local search
132
+ cognitiveWeight: 2.0, // Stronger local attraction
133
+ socialWeight: 1.0,
134
+ });
135
+
136
+ const beesResult = await beesEngine.optimize(agents.length, tasks.length, fitnessFunction);
137
+
138
+ return this.formatResult(beesResult.bestSolution, beesResult, agents, tasks);
139
+ }
140
+
141
+ // Fallback to PSO
142
+ const result = await this.psoEngine.optimize(agents.length, tasks.length, fitnessFunction);
143
+
144
+ return this.formatResult(result.bestSolution, result, agents, tasks);
145
+ }
146
+
147
+ /**
148
+ * Get recommended population size based on problem complexity
149
+ */
150
+ getRecommendedPopulation(problemSize: number): number {
151
+ // Logarithmic scaling with min/max bounds
152
+ const base = Math.ceil(10 * Math.log2(problemSize + 1));
153
+ return Math.min(100, Math.max(15, base));
154
+ }
155
+
156
+ /**
157
+ * Create fitness function for task assignment
158
+ */
159
+ private createFitnessFunction(
160
+ agents: AgentInfo[],
161
+ tasks: TaskInfo[]
162
+ ): (assignment: number[]) => number {
163
+ return (assignment: number[]): number => {
164
+ let fitness = 0;
165
+ const agentLoads = new Map<number, number>();
166
+
167
+ // Initialize agent loads
168
+ for (let i = 0; i < agents.length; i++) {
169
+ agentLoads.set(i, agents[i].load);
170
+ }
171
+
172
+ // Evaluate each task assignment
173
+ for (let taskIdx = 0; taskIdx < tasks.length; taskIdx++) {
174
+ const agentIdx = assignment[taskIdx];
175
+ if (agentIdx < 0 || agentIdx >= agents.length) {
176
+ fitness -= 100; // Penalty for invalid assignment
177
+ continue;
178
+ }
179
+
180
+ const agent = agents[agentIdx];
181
+ const task = tasks[taskIdx];
182
+ const currentLoad = agentLoads.get(agentIdx) ?? 0;
183
+ const newLoad = currentLoad + task.complexity;
184
+
185
+ // Capacity check
186
+ if (newLoad > agent.capacity) {
187
+ fitness -= 10 * (newLoad - agent.capacity); // Capacity violation penalty
188
+ } else {
189
+ // Reward for valid assignment
190
+ fitness += task.priority; // Prioritize high-priority tasks
191
+
192
+ // Reward for good capacity utilization (sweet spot at 70-90%)
193
+ const utilization = newLoad / agent.capacity;
194
+ if (utilization >= 0.7 && utilization <= 0.9) {
195
+ fitness += 2;
196
+ } else if (utilization < 0.3) {
197
+ fitness -= 1; // Slight penalty for underutilization
198
+ }
199
+ }
200
+
201
+ agentLoads.set(agentIdx, newLoad);
202
+ }
203
+
204
+ // Load balancing bonus - reward even distribution
205
+ const loads = Array.from(agentLoads.values());
206
+ const avgLoad = loads.reduce((a, b) => a + b, 0) / loads.length;
207
+ const variance =
208
+ loads.reduce((sum, load) => sum + Math.pow(load - avgLoad, 2), 0) / loads.length;
209
+ const stdDev = Math.sqrt(variance);
210
+
211
+ // Lower stdDev = better balance = higher fitness
212
+ fitness += 10 / (1 + stdDev);
213
+
214
+ return fitness;
215
+ };
216
+ }
217
+
218
+ /**
219
+ * Create distance matrix for ACO from agents/tasks
220
+ */
221
+ private createDistanceMatrix(agents: AgentInfo[], tasks: TaskInfo[]): number[][] {
222
+ const n = tasks.length;
223
+ const matrix: number[][] = [];
224
+
225
+ for (let i = 0; i < n; i++) {
226
+ matrix[i] = [];
227
+ for (let j = 0; j < n; j++) {
228
+ if (i === j) {
229
+ matrix[i][j] = 0;
230
+ } else {
231
+ // Distance based on complexity difference and priority
232
+ const complexityDiff = Math.abs(tasks[i].complexity - tasks[j].complexity);
233
+ const priorityFactor = 1 / (tasks[j].priority + 1);
234
+ matrix[i][j] = complexityDiff + priorityFactor;
235
+ }
236
+ }
237
+ }
238
+
239
+ return matrix;
240
+ }
241
+
242
+ /**
243
+ * Refine PSO solution using ACO local search
244
+ */
245
+ private async refineWithACO(
246
+ initialSolution: number[],
247
+ agents: AgentInfo[],
248
+ tasks: TaskInfo[],
249
+ _config: ISwarmConfig
250
+ ): Promise<{
251
+ bestSolution: number[];
252
+ bestFitness: number;
253
+ converged: boolean;
254
+ iterations: number;
255
+ }> {
256
+ const fitnessFunction = this.createFitnessFunction(agents, tasks);
257
+
258
+ // Create local search neighborhood
259
+ let bestSolution = [...initialSolution];
260
+ let bestFitness = fitnessFunction(bestSolution);
261
+ let iterations = 0;
262
+
263
+ // Simple local search: try swapping assignments
264
+ for (let i = 0; i < initialSolution.length; i++) {
265
+ for (let agent = 0; agent < agents.length; agent++) {
266
+ iterations++;
267
+ if (agent !== initialSolution[i]) {
268
+ const candidate = [...bestSolution];
269
+ candidate[i] = agent;
270
+ const candidateFitness = fitnessFunction(candidate);
271
+
272
+ if (candidateFitness > bestFitness) {
273
+ bestFitness = candidateFitness;
274
+ bestSolution = candidate;
275
+ }
276
+ }
277
+ }
278
+ }
279
+
280
+ return { bestSolution, bestFitness, converged: true, iterations };
281
+ }
282
+
283
+ /**
284
+ * Format result with improvement percentage
285
+ */
286
+ private formatResult(
287
+ solution: number[],
288
+ engineResult: {
289
+ bestFitness: number;
290
+ converged: boolean;
291
+ iterations: number;
292
+ fitnessHistory?: number[];
293
+ },
294
+ agents: AgentInfo[],
295
+ tasks: TaskInfo[]
296
+ ): ISwarmResult {
297
+ const fitnessFunction = this.createFitnessFunction(agents, tasks);
298
+
299
+ // Calculate improvement over random assignment
300
+ const randomAssignment = tasks.map(() => Math.floor(Math.random() * agents.length));
301
+ const randomFitness = fitnessFunction(randomAssignment);
302
+
303
+ const improvement =
304
+ randomFitness > 0
305
+ ? ((engineResult.bestFitness - randomFitness) / randomFitness) * 100
306
+ : engineResult.bestFitness > 0
307
+ ? 100
308
+ : 0;
309
+
310
+ return {
311
+ bestSolution: solution,
312
+ bestFitness: engineResult.bestFitness,
313
+ converged: engineResult.converged,
314
+ iterations: engineResult.iterations,
315
+ improvementPercent: Math.max(0, improvement),
316
+ };
317
+ }
318
+
319
+ /**
320
+ * Calculate improvement over baseline
321
+ */
322
+ private calculateImprovement(
323
+ solution: number[],
324
+ fitnessFunction: (a: number[]) => number
325
+ ): number {
326
+ const solutionFitness = fitnessFunction(solution);
327
+
328
+ // Generate random baseline
329
+ const randomSolution = solution.map(() => Math.floor(Math.random() * solution.length));
330
+ const randomFitness = fitnessFunction(randomSolution);
331
+
332
+ if (randomFitness <= 0) return solutionFitness > 0 ? 100 : 0;
333
+ return Math.max(0, ((solutionFitness - randomFitness) / randomFitness) * 100);
334
+ }
335
+ }