@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.
- package/ALL-test-results.json +1 -0
- package/CHANGELOG.md +8 -0
- package/LICENSE +21 -0
- package/ROADMAP.md +175 -0
- package/dist/AgentManifest-CB4xM-Ma.d.cts +704 -0
- package/dist/AgentManifest-CB4xM-Ma.d.ts +704 -0
- package/dist/BehaviorTree-BrBFECv5.d.cts +103 -0
- package/dist/BehaviorTree-BrBFECv5.d.ts +103 -0
- package/dist/InvisibleWallet-BB6tFvRA.d.cts +1732 -0
- package/dist/InvisibleWallet-rtRrBOA8.d.ts +1732 -0
- package/dist/OrchestratorAgent-BvWgf9uw.d.cts +798 -0
- package/dist/OrchestratorAgent-Q_CbVTmO.d.ts +798 -0
- package/dist/agents/index.cjs +4790 -0
- package/dist/agents/index.d.cts +1788 -0
- package/dist/agents/index.d.ts +1788 -0
- package/dist/agents/index.js +4695 -0
- package/dist/ai/index.cjs +5347 -0
- package/dist/ai/index.d.cts +1753 -0
- package/dist/ai/index.d.ts +1753 -0
- package/dist/ai/index.js +5244 -0
- package/dist/behavior.cjs +449 -0
- package/dist/behavior.d.cts +130 -0
- package/dist/behavior.d.ts +130 -0
- package/dist/behavior.js +407 -0
- package/dist/economy/index.cjs +3659 -0
- package/dist/economy/index.d.cts +747 -0
- package/dist/economy/index.d.ts +747 -0
- package/dist/economy/index.js +3617 -0
- package/dist/implementations-D9T3un9D.d.cts +236 -0
- package/dist/implementations-D9T3un9D.d.ts +236 -0
- package/dist/index.cjs +24550 -0
- package/dist/index.d.cts +1729 -0
- package/dist/index.d.ts +1729 -0
- package/dist/index.js +24277 -0
- package/dist/learning/index.cjs +219 -0
- package/dist/learning/index.d.cts +104 -0
- package/dist/learning/index.d.ts +104 -0
- package/dist/learning/index.js +189 -0
- package/dist/negotiation/index.cjs +970 -0
- package/dist/negotiation/index.d.cts +610 -0
- package/dist/negotiation/index.d.ts +610 -0
- package/dist/negotiation/index.js +931 -0
- package/dist/skills/index.cjs +1118 -0
- package/dist/skills/index.d.cts +289 -0
- package/dist/skills/index.d.ts +289 -0
- package/dist/skills/index.js +1079 -0
- package/dist/swarm/index.cjs +5268 -0
- package/dist/swarm/index.d.cts +2433 -0
- package/dist/swarm/index.d.ts +2433 -0
- package/dist/swarm/index.js +5221 -0
- package/dist/training/index.cjs +2745 -0
- package/dist/training/index.d.cts +1734 -0
- package/dist/training/index.d.ts +1734 -0
- package/dist/training/index.js +2687 -0
- package/extract-failures.js +10 -0
- package/package.json +82 -0
- package/src/__tests__/bounty-marketplace.test.ts +374 -0
- package/src/__tests__/delegation.test.ts +144 -0
- package/src/__tests__/distributed-claimer.test.ts +147 -0
- package/src/__tests__/done-log-audit.test.ts +342 -0
- package/src/__tests__/framework.test.ts +865 -0
- package/src/__tests__/goal-synthesizer.test.ts +236 -0
- package/src/__tests__/presence.test.ts +223 -0
- package/src/__tests__/protocol-agent.test.ts +254 -0
- package/src/__tests__/revenue-splitter.test.ts +114 -0
- package/src/__tests__/scenario-driven-todo.test.ts +197 -0
- package/src/__tests__/self-improve.test.ts +349 -0
- package/src/__tests__/service-lifecycle.test.ts +237 -0
- package/src/__tests__/skill-router.test.ts +121 -0
- package/src/agents/AgentManifest.ts +493 -0
- package/src/agents/AgentRegistry.ts +475 -0
- package/src/agents/AgentTypes.ts +585 -0
- package/src/agents/AgentWalletRegistry.ts +83 -0
- package/src/agents/AuthenticatedCRDT.ts +388 -0
- package/src/agents/CapabilityMatcher.ts +453 -0
- package/src/agents/CrossRealityHandoff.ts +305 -0
- package/src/agents/CulturalMemory.ts +454 -0
- package/src/agents/FederatedRegistryAdapter.ts +429 -0
- package/src/agents/NormEngine.ts +450 -0
- package/src/agents/OrchestratorAgent.ts +414 -0
- package/src/agents/SkillWorkflowEngine.ts +472 -0
- package/src/agents/TaskDelegationService.ts +551 -0
- package/src/agents/__tests__/AgentManifest.prod.test.ts +134 -0
- package/src/agents/__tests__/AgentManifest.test.ts +182 -0
- package/src/agents/__tests__/AgentModule.test.ts +864 -0
- package/src/agents/__tests__/AgentRegistry.prod.test.ts +125 -0
- package/src/agents/__tests__/AgentRegistry.test.ts +148 -0
- package/src/agents/__tests__/AgentTypes.test.ts +534 -0
- package/src/agents/__tests__/AgentWalletRegistry.test.ts +152 -0
- package/src/agents/__tests__/AuthenticatedCRDT.test.ts +558 -0
- package/src/agents/__tests__/CapabilityMatcher.prod.test.ts +117 -0
- package/src/agents/__tests__/CapabilityMatcher.test.ts +178 -0
- package/src/agents/__tests__/CrossRealityHandoff.test.ts +402 -0
- package/src/agents/__tests__/CulturalMemory.test.ts +200 -0
- package/src/agents/__tests__/FederatedRegistryAdapter.test.ts +409 -0
- package/src/agents/__tests__/NormEngine.test.ts +276 -0
- package/src/agents/__tests__/OrchestratorAgent.test.ts +182 -0
- package/src/agents/__tests__/SkillWorkflowEngine.test.ts +357 -0
- package/src/agents/__tests__/TaskDelegationService.test.ts +446 -0
- package/src/agents/index.ts +107 -0
- package/src/agents/spatial-comms/Layer1RealTime.ts +621 -0
- package/src/agents/spatial-comms/Layer2A2A.ts +661 -0
- package/src/agents/spatial-comms/Layer3MCP.ts +651 -0
- package/src/agents/spatial-comms/ProtocolTypes.ts +543 -0
- package/src/agents/spatial-comms/SpatialCommClient.ts +483 -0
- package/src/agents/spatial-comms/__tests__/performance-benchmark.test.ts +465 -0
- package/src/agents/spatial-comms/examples/multi-agent-world-creation.ts +409 -0
- package/src/agents/spatial-comms/index.ts +66 -0
- package/src/ai/AIAdapter.ts +313 -0
- package/src/ai/AICopilot.ts +331 -0
- package/src/ai/AIOutputValidator.ts +203 -0
- package/src/ai/BTNodes.ts +239 -0
- package/src/ai/BehaviorSelector.ts +135 -0
- package/src/ai/BehaviorTree.ts +153 -0
- package/src/ai/Blackboard.ts +165 -0
- package/src/ai/GenerationAnalytics.ts +461 -0
- package/src/ai/GenerationCache.ts +265 -0
- package/src/ai/GoalPlanner.ts +165 -0
- package/src/ai/HoloScriptGenerator.ts +580 -0
- package/src/ai/InfluenceMap.ts +180 -0
- package/src/ai/NavMesh.ts +168 -0
- package/src/ai/PerceptionSystem.ts +178 -0
- package/src/ai/PromptTemplates.ts +453 -0
- package/src/ai/SemanticSearchService.ts +80 -0
- package/src/ai/StateMachine.ts +196 -0
- package/src/ai/SteeringBehavior.ts +150 -0
- package/src/ai/SteeringBehaviors.ts +244 -0
- package/src/ai/TrainingDataGenerator.ts +1082 -0
- package/src/ai/UtilityAI.ts +145 -0
- package/src/ai/__tests__/AIAdapter.prod.test.ts +259 -0
- package/src/ai/__tests__/AIAdapter.test.ts +109 -0
- package/src/ai/__tests__/AICopilot.prod.test.ts +341 -0
- package/src/ai/__tests__/AICopilot.test.ts +178 -0
- package/src/ai/__tests__/AIOutputValidator.prod.test.ts +226 -0
- package/src/ai/__tests__/AIOutputValidator.test.ts +138 -0
- package/src/ai/__tests__/BTNodes.prod.test.ts +391 -0
- package/src/ai/__tests__/BTNodes.test.ts +263 -0
- package/src/ai/__tests__/BehaviorSelector.prod.test.ts +129 -0
- package/src/ai/__tests__/BehaviorSelector.test.ts +132 -0
- package/src/ai/__tests__/BehaviorTree.prod.test.ts +266 -0
- package/src/ai/__tests__/BehaviorTree.test.ts +216 -0
- package/src/ai/__tests__/Blackboard.prod.test.ts +339 -0
- package/src/ai/__tests__/Blackboard.test.ts +183 -0
- package/src/ai/__tests__/GenerationAnalytics.prod.test.ts +141 -0
- package/src/ai/__tests__/GenerationAnalytics.test.ts +165 -0
- package/src/ai/__tests__/GenerationCache.prod.test.ts +144 -0
- package/src/ai/__tests__/GenerationCache.test.ts +171 -0
- package/src/ai/__tests__/GoalPlanner.prod.test.ts +189 -0
- package/src/ai/__tests__/GoalPlanner.test.ts +137 -0
- package/src/ai/__tests__/GoalPlannerDepth.prod.test.ts +217 -0
- package/src/ai/__tests__/HoloScriptGenerator.test.ts +125 -0
- package/src/ai/__tests__/InfluenceMap.prod.test.ts +146 -0
- package/src/ai/__tests__/InfluenceMap.test.ts +149 -0
- package/src/ai/__tests__/NavMesh.prod.test.ts +141 -0
- package/src/ai/__tests__/NavMesh.test.ts +159 -0
- package/src/ai/__tests__/PerceptionSystem.prod.test.ts +135 -0
- package/src/ai/__tests__/PerceptionSystem.test.ts +250 -0
- package/src/ai/__tests__/PromptTemplates.prod.test.ts +313 -0
- package/src/ai/__tests__/PromptTemplates.test.ts +146 -0
- package/src/ai/__tests__/SemanticSearch.test.ts +37 -0
- package/src/ai/__tests__/StateMachine.prod.test.ts +162 -0
- package/src/ai/__tests__/StateMachine.test.ts +163 -0
- package/src/ai/__tests__/SteeringBehavior.prod.test.ts +251 -0
- package/src/ai/__tests__/SteeringBehavior.test.ts +135 -0
- package/src/ai/__tests__/SteeringBehaviors.prod.test.ts +133 -0
- package/src/ai/__tests__/SteeringBehaviors.test.ts +151 -0
- package/src/ai/__tests__/TrainingDataGenerator.prod.test.ts +286 -0
- package/src/ai/__tests__/TrainingDataGenerator.test.ts +286 -0
- package/src/ai/__tests__/UtilityAI.prod.test.ts +207 -0
- package/src/ai/__tests__/UtilityAI.test.ts +155 -0
- package/src/ai/__tests__/adapters.prod.test.ts +263 -0
- package/src/ai/__tests__/adapters.test.ts +320 -0
- package/src/ai/adapters.ts +1585 -0
- package/src/ai/index.ts +130 -0
- package/src/behavior/BehaviorPresets.ts +140 -0
- package/src/behavior/BehaviorTree.ts +236 -0
- package/src/behavior/StateMachine.ts +176 -0
- package/src/behavior/StateTrait.ts +67 -0
- package/src/behavior/index.ts +8 -0
- package/src/behavior.ts +8 -0
- package/src/board/audit.ts +284 -0
- package/src/board/board-ops.ts +336 -0
- package/src/board/board-types.ts +302 -0
- package/src/board/index.ts +69 -0
- package/src/define-agent.ts +46 -0
- package/src/define-team.ts +33 -0
- package/src/delegation.ts +265 -0
- package/src/distributed-claimer.ts +228 -0
- package/src/economy/AgentBudgetEnforcer.ts +464 -0
- package/src/economy/BountyManager.ts +185 -0
- package/src/economy/CreatorRevenueAggregator.ts +460 -0
- package/src/economy/InvisibleWallet.ts +82 -0
- package/src/economy/KnowledgeMarketplace.ts +193 -0
- package/src/economy/PaymentWebhookService.ts +512 -0
- package/src/economy/RevenueSplitter.ts +156 -0
- package/src/economy/SubscriptionManager.ts +546 -0
- package/src/economy/UnifiedBudgetOptimizer.ts +635 -0
- package/src/economy/UsageMeter.ts +440 -0
- package/src/economy/_core-stubs.ts +219 -0
- package/src/economy/index.ts +100 -0
- package/src/economy/x402-facilitator.ts +1978 -0
- package/src/index.ts +348 -0
- package/src/knowledge/__tests__/knowledge-consolidator.test.ts +444 -0
- package/src/knowledge/__tests__/knowledge-store-vector.test.ts +291 -0
- package/src/knowledge/brain.ts +167 -0
- package/src/knowledge/consolidation.ts +581 -0
- package/src/knowledge/knowledge-consolidator.ts +510 -0
- package/src/knowledge/knowledge-store.ts +616 -0
- package/src/learning/MemoryConsolidator.ts +102 -0
- package/src/learning/MemoryScorer.ts +69 -0
- package/src/learning/ProceduralCompiler.ts +45 -0
- package/src/learning/SemanticClusterer.ts +66 -0
- package/src/learning/index.ts +8 -0
- package/src/llm/llm-adapter.ts +159 -0
- package/src/mesh/index.ts +309 -0
- package/src/negotiation/NegotiationProtocol.ts +694 -0
- package/src/negotiation/NegotiationTypes.ts +473 -0
- package/src/negotiation/VotingMechanisms.ts +691 -0
- package/src/negotiation/index.ts +49 -0
- package/src/protocol/goal-synthesizer.ts +317 -0
- package/src/protocol/implementations.ts +474 -0
- package/src/protocol/micro-phase-decomposer.ts +299 -0
- package/src/protocol/micro-step-decomposer.test.ts +306 -0
- package/src/protocol-agent.test.ts +353 -0
- package/src/protocol-agent.ts +670 -0
- package/src/self-improve/absorb-scanner.ts +252 -0
- package/src/self-improve/evolution-engine.ts +149 -0
- package/src/self-improve/framework-absorber.ts +214 -0
- package/src/self-improve/index.ts +50 -0
- package/src/self-improve/prompt-optimizer.ts +212 -0
- package/src/self-improve/test-generator.ts +175 -0
- package/src/skill-router.ts +186 -0
- package/src/skills/index.ts +5 -0
- package/src/skills/skill-md-bridge.ts +1699 -0
- package/src/swarm/ACOEngine.ts +261 -0
- package/src/swarm/CollectiveIntelligence.ts +383 -0
- package/src/swarm/ContributionSynthesizer.ts +481 -0
- package/src/swarm/LeaderElection.ts +393 -0
- package/src/swarm/PSOEngine.ts +206 -0
- package/src/swarm/QuorumPolicy.ts +173 -0
- package/src/swarm/SwarmCoordinator.ts +335 -0
- package/src/swarm/SwarmManager.ts +442 -0
- package/src/swarm/SwarmMembership.ts +456 -0
- package/src/swarm/VotingRound.ts +255 -0
- package/src/swarm/__tests__/ACOEngine.prod.test.ts +164 -0
- package/src/swarm/__tests__/ACOEngine.test.ts +117 -0
- package/src/swarm/__tests__/CollectiveIntelligence.prod.test.ts +296 -0
- package/src/swarm/__tests__/CollectiveIntelligence.test.ts +457 -0
- package/src/swarm/__tests__/ContributionSynthesizer.prod.test.ts +269 -0
- package/src/swarm/__tests__/ContributionSynthesizer.test.ts +254 -0
- package/src/swarm/__tests__/LeaderElection.prod.test.ts +196 -0
- package/src/swarm/__tests__/LeaderElection.test.ts +151 -0
- package/src/swarm/__tests__/PSOEngine.prod.test.ts +162 -0
- package/src/swarm/__tests__/PSOEngine.test.ts +106 -0
- package/src/swarm/__tests__/QuorumPolicy.prod.test.ts +216 -0
- package/src/swarm/__tests__/QuorumPolicy.test.ts +177 -0
- package/src/swarm/__tests__/SwarmCoordinator.prod.test.ts +186 -0
- package/src/swarm/__tests__/SwarmCoordinator.test.ts +167 -0
- package/src/swarm/__tests__/SwarmManager.prod.test.ts +308 -0
- package/src/swarm/__tests__/SwarmManager.test.ts +373 -0
- package/src/swarm/__tests__/SwarmMembership.prod.test.ts +273 -0
- package/src/swarm/__tests__/SwarmMembership.test.ts +264 -0
- package/src/swarm/__tests__/VotingRound.prod.test.ts +233 -0
- package/src/swarm/__tests__/VotingRound.test.ts +174 -0
- package/src/swarm/analytics/SwarmInspector.ts +476 -0
- package/src/swarm/analytics/SwarmMetrics.ts +449 -0
- package/src/swarm/analytics/__tests__/SwarmInspector.prod.test.ts +366 -0
- package/src/swarm/analytics/__tests__/SwarmInspector.test.ts +454 -0
- package/src/swarm/analytics/__tests__/SwarmMetrics.prod.test.ts +254 -0
- package/src/swarm/analytics/__tests__/SwarmMetrics.test.ts +370 -0
- package/src/swarm/analytics/index.ts +7 -0
- package/src/swarm/index.ts +69 -0
- package/src/swarm/messaging/BroadcastChannel.ts +509 -0
- package/src/swarm/messaging/GossipProtocol.ts +565 -0
- package/src/swarm/messaging/SwarmEventBus.ts +443 -0
- package/src/swarm/messaging/__tests__/BroadcastChannel.prod.test.ts +331 -0
- package/src/swarm/messaging/__tests__/BroadcastChannel.test.ts +333 -0
- package/src/swarm/messaging/__tests__/GossipProtocol.prod.test.ts +356 -0
- package/src/swarm/messaging/__tests__/GossipProtocol.test.ts +437 -0
- package/src/swarm/messaging/__tests__/SwarmEventBus.prod.test.ts +191 -0
- package/src/swarm/messaging/__tests__/SwarmEventBus.test.ts +247 -0
- package/src/swarm/messaging/index.ts +8 -0
- package/src/swarm/spatial/FlockingBehavior.ts +462 -0
- package/src/swarm/spatial/FormationController.ts +500 -0
- package/src/swarm/spatial/Vector3.ts +170 -0
- package/src/swarm/spatial/ZoneClaiming.ts +509 -0
- package/src/swarm/spatial/__tests__/FlockingBehavior.prod.test.ts +239 -0
- package/src/swarm/spatial/__tests__/FlockingBehavior.test.ts +298 -0
- package/src/swarm/spatial/__tests__/FormationController.prod.test.ts +240 -0
- package/src/swarm/spatial/__tests__/FormationController.test.ts +297 -0
- package/src/swarm/spatial/__tests__/Vector3.prod.test.ts +283 -0
- package/src/swarm/spatial/__tests__/Vector3.test.ts +224 -0
- package/src/swarm/spatial/__tests__/ZoneClaiming.prod.test.ts +246 -0
- package/src/swarm/spatial/__tests__/ZoneClaiming.test.ts +374 -0
- package/src/swarm/spatial/index.ts +28 -0
- package/src/team.ts +1245 -0
- package/src/training/LRScheduler.ts +377 -0
- package/src/training/QualityScoringPipeline.ts +139 -0
- package/src/training/SoftDedup.ts +461 -0
- package/src/training/SparsityMonitor.ts +685 -0
- package/src/training/SparsityMonitorTypes.ts +209 -0
- package/src/training/SpatialTrainingDataGenerator.ts +1526 -0
- package/src/training/SpatialTrainingDataTypes.ts +216 -0
- package/src/training/TrainingPipelineConfig.ts +215 -0
- package/src/training/constants.ts +94 -0
- package/src/training/index.ts +138 -0
- package/src/training/schema.ts +147 -0
- package/src/training/scripts/generate-novel-use-cases-dataset.ts +272 -0
- package/src/training/scripts/generate-spatial-dataset.ts +521 -0
- package/src/training/training/data/novel-use-cases.jsonl +153 -0
- package/src/training/training/data/spatial-reasoning-10k.jsonl +9354 -0
- package/src/training/trainingmonkey/TrainingMonkeyIntegration.ts +477 -0
- package/src/training/trainingmonkey/TrainingMonkeyTypes.ts +230 -0
- package/src/training/trainingmonkey/index.ts +26 -0
- package/src/training/trait-mappings.ts +157 -0
- package/src/types/core-stubs.d.ts +113 -0
- package/src/types.ts +304 -0
- package/test-output.txt +0 -0
- package/test-result.json +1 -0
- package/tsc-errors.txt +4 -0
- package/tsc_output.txt +0 -0
- package/tsconfig.json +14 -0
- package/tsup-learning-esm.config.ts +12 -0
- package/tsup.config.ts +21 -0
- package/typescript-errors-2.txt +0 -0
- package/typescript-errors.txt +22 -0
- package/vitest-log-utf8.txt +268 -0
- package/vitest-log.txt +0 -0
- 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
|
+
}
|