@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,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ant Colony Optimization Engine
|
|
3
|
+
*
|
|
4
|
+
* Implements ACO algorithm for path-finding and task sequencing.
|
|
5
|
+
* Uses pheromone trails to find optimal ordering of choreography steps.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface ACOConfig {
|
|
9
|
+
antCount: number;
|
|
10
|
+
maxIterations: number;
|
|
11
|
+
convergenceThreshold: number;
|
|
12
|
+
alpha: number; // Pheromone importance
|
|
13
|
+
beta: number; // Heuristic importance
|
|
14
|
+
evaporationRate: number;
|
|
15
|
+
q: number; // Pheromone deposit factor
|
|
16
|
+
elitistWeight: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ACOResult {
|
|
20
|
+
bestPath: number[];
|
|
21
|
+
bestCost: number;
|
|
22
|
+
converged: boolean;
|
|
23
|
+
iterations: number;
|
|
24
|
+
costHistory: number[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const DEFAULT_CONFIG: ACOConfig = {
|
|
28
|
+
antCount: 20,
|
|
29
|
+
maxIterations: 100,
|
|
30
|
+
convergenceThreshold: 0.001,
|
|
31
|
+
alpha: 1.0,
|
|
32
|
+
beta: 2.0,
|
|
33
|
+
evaporationRate: 0.1,
|
|
34
|
+
q: 100,
|
|
35
|
+
elitistWeight: 2.0,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Ant Colony Optimization engine for path/sequence optimization
|
|
40
|
+
*/
|
|
41
|
+
export class ACOEngine {
|
|
42
|
+
private config: ACOConfig;
|
|
43
|
+
|
|
44
|
+
constructor(config: Partial<ACOConfig> = {}) {
|
|
45
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Find optimal path through nodes (e.g., task execution order)
|
|
50
|
+
*
|
|
51
|
+
* @param nodes Number of nodes to visit
|
|
52
|
+
* @param distanceMatrix Distance/cost between nodes [i][j]
|
|
53
|
+
* @returns Optimization result with best path
|
|
54
|
+
*/
|
|
55
|
+
async optimize(nodes: number, distanceMatrix: number[][]): Promise<ACOResult> {
|
|
56
|
+
const { antCount, maxIterations, convergenceThreshold } = this.config;
|
|
57
|
+
|
|
58
|
+
// Initialize pheromone trails
|
|
59
|
+
const pheromones = this.initializePheromones(nodes);
|
|
60
|
+
const heuristics = this.computeHeuristics(distanceMatrix);
|
|
61
|
+
|
|
62
|
+
let bestPath: number[] = [];
|
|
63
|
+
let bestCost = Infinity;
|
|
64
|
+
const costHistory: number[] = [];
|
|
65
|
+
let converged = false;
|
|
66
|
+
let iteration = 0;
|
|
67
|
+
|
|
68
|
+
// Main optimization loop
|
|
69
|
+
for (iteration = 0; iteration < maxIterations; iteration++) {
|
|
70
|
+
const paths: number[][] = [];
|
|
71
|
+
const costs: number[] = [];
|
|
72
|
+
|
|
73
|
+
// Each ant constructs a solution
|
|
74
|
+
for (let ant = 0; ant < antCount; ant++) {
|
|
75
|
+
const path = this.constructSolution(nodes, pheromones, heuristics);
|
|
76
|
+
const cost = this.calculatePathCost(path, distanceMatrix);
|
|
77
|
+
|
|
78
|
+
paths.push(path);
|
|
79
|
+
costs.push(cost);
|
|
80
|
+
|
|
81
|
+
if (cost < bestCost) {
|
|
82
|
+
bestCost = cost;
|
|
83
|
+
bestPath = [...path];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
costHistory.push(bestCost);
|
|
88
|
+
|
|
89
|
+
// Evaporate pheromones
|
|
90
|
+
this.evaporatePheromones(pheromones);
|
|
91
|
+
|
|
92
|
+
// Deposit pheromones based on path quality
|
|
93
|
+
this.depositPheromones(pheromones, paths, costs);
|
|
94
|
+
|
|
95
|
+
// Elitist reinforcement: extra pheromone on best path
|
|
96
|
+
this.reinforceBestPath(pheromones, bestPath, bestCost);
|
|
97
|
+
|
|
98
|
+
// Check convergence
|
|
99
|
+
if (iteration > 10) {
|
|
100
|
+
const recentImprovement = costHistory[iteration - 10] - bestCost;
|
|
101
|
+
if (Math.abs(recentImprovement) < convergenceThreshold * bestCost) {
|
|
102
|
+
converged = true;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
bestPath,
|
|
110
|
+
bestCost,
|
|
111
|
+
converged,
|
|
112
|
+
iterations: iteration + 1,
|
|
113
|
+
costHistory,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Initialize pheromone matrix with uniform values
|
|
119
|
+
*/
|
|
120
|
+
private initializePheromones(nodes: number): number[][] {
|
|
121
|
+
const initial = 1.0 / nodes;
|
|
122
|
+
return Array.from({ length: nodes }, () => Array.from({ length: nodes }, () => initial));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Compute heuristic values (inverse distance)
|
|
127
|
+
*/
|
|
128
|
+
private computeHeuristics(distanceMatrix: number[][]): number[][] {
|
|
129
|
+
const nodes = distanceMatrix.length;
|
|
130
|
+
return Array.from({ length: nodes }, (_, i) =>
|
|
131
|
+
Array.from({ length: nodes }, (_, j) => {
|
|
132
|
+
const dist = distanceMatrix[i][j];
|
|
133
|
+
return dist > 0 ? 1.0 / dist : 0;
|
|
134
|
+
})
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Construct a solution path for one ant
|
|
140
|
+
*/
|
|
141
|
+
private constructSolution(
|
|
142
|
+
nodes: number,
|
|
143
|
+
pheromones: number[][],
|
|
144
|
+
heuristics: number[][]
|
|
145
|
+
): number[] {
|
|
146
|
+
const { alpha, beta } = this.config;
|
|
147
|
+
const path: number[] = [];
|
|
148
|
+
const visited = new Set<number>();
|
|
149
|
+
|
|
150
|
+
// Start from random node
|
|
151
|
+
let current = Math.floor(Math.random() * nodes);
|
|
152
|
+
path.push(current);
|
|
153
|
+
visited.add(current);
|
|
154
|
+
|
|
155
|
+
// Visit all remaining nodes
|
|
156
|
+
while (path.length < nodes) {
|
|
157
|
+
const probabilities: number[] = [];
|
|
158
|
+
let sum = 0;
|
|
159
|
+
|
|
160
|
+
// Calculate selection probabilities
|
|
161
|
+
for (let next = 0; next < nodes; next++) {
|
|
162
|
+
if (visited.has(next)) {
|
|
163
|
+
probabilities.push(0);
|
|
164
|
+
} else {
|
|
165
|
+
const phero = Math.pow(pheromones[current][next], alpha);
|
|
166
|
+
const heur = Math.pow(heuristics[current][next], beta);
|
|
167
|
+
const prob = phero * heur;
|
|
168
|
+
probabilities.push(prob);
|
|
169
|
+
sum += prob;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Normalize and select next node
|
|
174
|
+
if (sum === 0) {
|
|
175
|
+
// Fallback: choose random unvisited
|
|
176
|
+
const unvisited = Array.from({ length: nodes }, (_, i) => i).filter((n) => !visited.has(n));
|
|
177
|
+
current = unvisited[Math.floor(Math.random() * unvisited.length)];
|
|
178
|
+
} else {
|
|
179
|
+
// Roulette wheel selection
|
|
180
|
+
const r = Math.random() * sum;
|
|
181
|
+
let cumulative = 0;
|
|
182
|
+
for (let next = 0; next < nodes; next++) {
|
|
183
|
+
cumulative += probabilities[next];
|
|
184
|
+
if (cumulative >= r) {
|
|
185
|
+
current = next;
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
path.push(current);
|
|
192
|
+
visited.add(current);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return path;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Calculate total path cost
|
|
200
|
+
*/
|
|
201
|
+
private calculatePathCost(path: number[], distanceMatrix: number[][]): number {
|
|
202
|
+
let cost = 0;
|
|
203
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
204
|
+
cost += distanceMatrix[path[i]][path[i + 1]];
|
|
205
|
+
}
|
|
206
|
+
return cost;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Evaporate pheromones
|
|
211
|
+
*/
|
|
212
|
+
private evaporatePheromones(pheromones: number[][]): void {
|
|
213
|
+
const { evaporationRate } = this.config;
|
|
214
|
+
const minPheromone = 0.001;
|
|
215
|
+
|
|
216
|
+
for (let i = 0; i < pheromones.length; i++) {
|
|
217
|
+
for (let j = 0; j < pheromones[i].length; j++) {
|
|
218
|
+
pheromones[i][j] *= 1 - evaporationRate;
|
|
219
|
+
pheromones[i][j] = Math.max(minPheromone, pheromones[i][j]);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Deposit pheromones based on solution quality
|
|
226
|
+
*/
|
|
227
|
+
private depositPheromones(pheromones: number[][], paths: number[][], costs: number[]): void {
|
|
228
|
+
const { q } = this.config;
|
|
229
|
+
|
|
230
|
+
for (let ant = 0; ant < paths.length; ant++) {
|
|
231
|
+
const path = paths[ant];
|
|
232
|
+
const deposit = q / costs[ant];
|
|
233
|
+
|
|
234
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
235
|
+
pheromones[path[i]][path[i + 1]] += deposit;
|
|
236
|
+
pheromones[path[i + 1]][path[i]] += deposit; // Symmetric
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Elitist reinforcement of best path
|
|
243
|
+
*/
|
|
244
|
+
private reinforceBestPath(pheromones: number[][], bestPath: number[], bestCost: number): void {
|
|
245
|
+
const { q, elitistWeight } = this.config;
|
|
246
|
+
const deposit = (q / bestCost) * elitistWeight;
|
|
247
|
+
|
|
248
|
+
for (let i = 0; i < bestPath.length - 1; i++) {
|
|
249
|
+
pheromones[bestPath[i]][bestPath[i + 1]] += deposit;
|
|
250
|
+
pheromones[bestPath[i + 1]][bestPath[i]] += deposit;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Get recommended ant count for problem
|
|
256
|
+
*/
|
|
257
|
+
getRecommendedAntCount(nodes: number): number {
|
|
258
|
+
// Heuristic: roughly equal to node count, min 10, max 50
|
|
259
|
+
return Math.min(50, Math.max(10, nodes));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collective Intelligence Service
|
|
3
|
+
*
|
|
4
|
+
* Implements ICollectiveIntelligenceService for collaborative
|
|
5
|
+
* problem-solving through hive sessions.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type {
|
|
9
|
+
ICollectiveIntelligenceService,
|
|
10
|
+
IHiveContribution,
|
|
11
|
+
IHiveSession,
|
|
12
|
+
} from '@holoscript/core';
|
|
13
|
+
import { VotingRound, type VotingResult } from './VotingRound';
|
|
14
|
+
import { ContributionSynthesizer, type SynthesisResult } from './ContributionSynthesizer';
|
|
15
|
+
|
|
16
|
+
export interface CollectiveIntelligenceConfig {
|
|
17
|
+
maxParticipants: number;
|
|
18
|
+
votingThreshold: number;
|
|
19
|
+
synthesisMinContributions: number;
|
|
20
|
+
autoCloseOnResolution: boolean;
|
|
21
|
+
contributionTimeoutMs: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const DEFAULT_CONFIG: CollectiveIntelligenceConfig = {
|
|
25
|
+
maxParticipants: 100,
|
|
26
|
+
votingThreshold: 0.5,
|
|
27
|
+
synthesisMinContributions: 3,
|
|
28
|
+
autoCloseOnResolution: true,
|
|
29
|
+
contributionTimeoutMs: 300000, // 5 minutes
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Collective Intelligence Service
|
|
34
|
+
*
|
|
35
|
+
* Enables groups of agents to collaborate on complex problems through
|
|
36
|
+
* structured sessions with contributions, voting, and synthesis.
|
|
37
|
+
*/
|
|
38
|
+
export class CollectiveIntelligence implements ICollectiveIntelligenceService {
|
|
39
|
+
private config: CollectiveIntelligenceConfig;
|
|
40
|
+
private sessions: Map<string, IHiveSession> = new Map();
|
|
41
|
+
private votingRounds: Map<string, VotingRound> = new Map();
|
|
42
|
+
private synthesizer: ContributionSynthesizer;
|
|
43
|
+
private contributionIdCounter = 0;
|
|
44
|
+
|
|
45
|
+
constructor(config: Partial<CollectiveIntelligenceConfig> = {}) {
|
|
46
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
47
|
+
this.synthesizer = new ContributionSynthesizer();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Create a new hive session
|
|
52
|
+
*/
|
|
53
|
+
createSession(topic: string, goal: string, initiator: string): IHiveSession {
|
|
54
|
+
const id = this.generateSessionId();
|
|
55
|
+
|
|
56
|
+
const session: IHiveSession = {
|
|
57
|
+
id,
|
|
58
|
+
topic,
|
|
59
|
+
goal,
|
|
60
|
+
initiator,
|
|
61
|
+
status: 'active',
|
|
62
|
+
participants: [initiator],
|
|
63
|
+
contributions: [],
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
this.sessions.set(id, session);
|
|
67
|
+
this.votingRounds.set(
|
|
68
|
+
id,
|
|
69
|
+
new VotingRound({
|
|
70
|
+
superMajorityThreshold: this.config.votingThreshold,
|
|
71
|
+
})
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
return session;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Join an existing session
|
|
79
|
+
*/
|
|
80
|
+
join(sessionId: string, agentId: string): void {
|
|
81
|
+
const session = this.sessions.get(sessionId);
|
|
82
|
+
if (!session) {
|
|
83
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (session.status !== 'active') {
|
|
87
|
+
throw new Error(`Session ${sessionId} is ${session.status}`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (session.participants.length >= this.config.maxParticipants) {
|
|
91
|
+
throw new Error(`Session ${sessionId} is full`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (!session.participants.includes(agentId)) {
|
|
95
|
+
session.participants.push(agentId);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Leave a session
|
|
101
|
+
*/
|
|
102
|
+
leave(sessionId: string, agentId: string): void {
|
|
103
|
+
const session = this.sessions.get(sessionId);
|
|
104
|
+
if (!session) {
|
|
105
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const index = session.participants.indexOf(agentId);
|
|
109
|
+
if (index !== -1) {
|
|
110
|
+
session.participants.splice(index, 1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Contribute to a session
|
|
116
|
+
*/
|
|
117
|
+
contribute(
|
|
118
|
+
sessionId: string,
|
|
119
|
+
contribution: Omit<IHiveContribution, 'id' | 'timestamp'>
|
|
120
|
+
): IHiveContribution {
|
|
121
|
+
const session = this.sessions.get(sessionId);
|
|
122
|
+
if (!session) {
|
|
123
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (session.status !== 'active') {
|
|
127
|
+
throw new Error(`Session ${sessionId} is ${session.status}`);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Verify contributor is a participant
|
|
131
|
+
if (!session.participants.includes(contribution.agentId)) {
|
|
132
|
+
throw new Error(`Agent ${contribution.agentId} is not a participant`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Create full contribution
|
|
136
|
+
const fullContribution: IHiveContribution = {
|
|
137
|
+
...contribution,
|
|
138
|
+
id: this.generateContributionId(),
|
|
139
|
+
timestamp: Date.now(),
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
session.contributions.push(fullContribution);
|
|
143
|
+
|
|
144
|
+
// Register for voting
|
|
145
|
+
const votingRound = this.votingRounds.get(sessionId);
|
|
146
|
+
votingRound?.registerContribution(fullContribution);
|
|
147
|
+
|
|
148
|
+
return fullContribution;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Vote on a contribution
|
|
153
|
+
*/
|
|
154
|
+
vote(
|
|
155
|
+
sessionId: string,
|
|
156
|
+
contributionId: string,
|
|
157
|
+
voterId: string,
|
|
158
|
+
vote: 'support' | 'oppose'
|
|
159
|
+
): void {
|
|
160
|
+
const session = this.sessions.get(sessionId);
|
|
161
|
+
if (!session) {
|
|
162
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (session.status !== 'active') {
|
|
166
|
+
throw new Error(`Session ${sessionId} is ${session.status}`);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (!session.participants.includes(voterId)) {
|
|
170
|
+
throw new Error(`Agent ${voterId} is not a participant`);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const votingRound = this.votingRounds.get(sessionId);
|
|
174
|
+
if (!votingRound) {
|
|
175
|
+
throw new Error(`No voting round for session ${sessionId}`);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Get voter's contribution confidence for weighting
|
|
179
|
+
const voterContribution = session.contributions.find((c: any) => c.agentId === voterId);
|
|
180
|
+
const voterConfidence = voterContribution?.confidence ?? 0.5;
|
|
181
|
+
|
|
182
|
+
votingRound.castVote(contributionId, voterId, vote, voterConfidence);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Synthesize all contributions
|
|
187
|
+
*/
|
|
188
|
+
synthesize(sessionId: string): SynthesisResult {
|
|
189
|
+
const session = this.sessions.get(sessionId);
|
|
190
|
+
if (!session) {
|
|
191
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (session.contributions.length < this.config.synthesisMinContributions) {
|
|
195
|
+
return {
|
|
196
|
+
synthesizedContent: '',
|
|
197
|
+
sourceContributions: [],
|
|
198
|
+
synthesisMethod: 'merge',
|
|
199
|
+
confidence: 0,
|
|
200
|
+
metadata: {
|
|
201
|
+
totalContributions: session.contributions.length,
|
|
202
|
+
ideaCount: 0,
|
|
203
|
+
critiqueCount: 0,
|
|
204
|
+
consensusCount: 0,
|
|
205
|
+
solutionCount: 0,
|
|
206
|
+
averageConfidence: 0,
|
|
207
|
+
keyThemes: [],
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return this.synthesizer.synthesize(session);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Resolve a session with a final decision
|
|
217
|
+
*/
|
|
218
|
+
resolve(sessionId: string, resolution: string): void {
|
|
219
|
+
const session = this.sessions.get(sessionId);
|
|
220
|
+
if (!session) {
|
|
221
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
session.resolution = resolution;
|
|
225
|
+
session.status = 'resolved';
|
|
226
|
+
|
|
227
|
+
const votingRound = this.votingRounds.get(sessionId);
|
|
228
|
+
votingRound?.close();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Get a session by ID
|
|
233
|
+
*/
|
|
234
|
+
getSession(sessionId: string): IHiveSession | undefined {
|
|
235
|
+
return this.sessions.get(sessionId);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Get all active sessions
|
|
240
|
+
*/
|
|
241
|
+
getActiveSessions(): IHiveSession[] {
|
|
242
|
+
return [...this.sessions.values()].filter((s) => s.status === 'active');
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Close a session without resolution
|
|
247
|
+
*/
|
|
248
|
+
closeSession(sessionId: string): void {
|
|
249
|
+
const session = this.sessions.get(sessionId);
|
|
250
|
+
if (!session) {
|
|
251
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
session.status = 'closed';
|
|
255
|
+
|
|
256
|
+
const votingRound = this.votingRounds.get(sessionId);
|
|
257
|
+
votingRound?.close();
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Get voting results for a session
|
|
262
|
+
*/
|
|
263
|
+
getVotingResults(sessionId: string): VotingResult[] {
|
|
264
|
+
const votingRound = this.votingRounds.get(sessionId);
|
|
265
|
+
if (!votingRound) {
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
return votingRound.getAllResults();
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Get the top-voted contribution
|
|
273
|
+
*/
|
|
274
|
+
getTopContribution(sessionId: string): IHiveContribution | undefined {
|
|
275
|
+
const votingRound = this.votingRounds.get(sessionId);
|
|
276
|
+
return votingRound?.getWinner();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Get session statistics
|
|
281
|
+
*/
|
|
282
|
+
getSessionStats(sessionId: string):
|
|
283
|
+
| {
|
|
284
|
+
participantCount: number;
|
|
285
|
+
contributionCount: number;
|
|
286
|
+
votingStats: ReturnType<VotingRound['getStatistics']>;
|
|
287
|
+
contributionsByType: Record<IHiveContribution['type'], number>;
|
|
288
|
+
averageConfidence: number;
|
|
289
|
+
}
|
|
290
|
+
| undefined {
|
|
291
|
+
const session = this.sessions.get(sessionId);
|
|
292
|
+
if (!session) {
|
|
293
|
+
return undefined;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const votingRound = this.votingRounds.get(sessionId);
|
|
297
|
+
|
|
298
|
+
const byType: Record<IHiveContribution['type'], number> = {
|
|
299
|
+
idea: 0,
|
|
300
|
+
critique: 0,
|
|
301
|
+
consensus: 0,
|
|
302
|
+
solution: 0,
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
let totalConfidence = 0;
|
|
306
|
+
for (const c of session.contributions) {
|
|
307
|
+
byType[c.type]++;
|
|
308
|
+
totalConfidence += c.confidence;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return {
|
|
312
|
+
participantCount: session.participants.length,
|
|
313
|
+
contributionCount: session.contributions.length,
|
|
314
|
+
votingStats: votingRound?.getStatistics() ?? {
|
|
315
|
+
totalContributions: 0,
|
|
316
|
+
totalVotes: 0,
|
|
317
|
+
participationRate: 0,
|
|
318
|
+
hasConsensus: false,
|
|
319
|
+
},
|
|
320
|
+
contributionsByType: byType,
|
|
321
|
+
averageConfidence:
|
|
322
|
+
session.contributions.length > 0 ? totalConfidence / session.contributions.length : 0,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Auto-resolve if consensus reached
|
|
328
|
+
*/
|
|
329
|
+
checkForConsensus(sessionId: string): boolean {
|
|
330
|
+
const votingRound = this.votingRounds.get(sessionId);
|
|
331
|
+
if (!votingRound) {
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
const stats = votingRound.getStatistics();
|
|
336
|
+
if (stats.hasConsensus && this.config.autoCloseOnResolution) {
|
|
337
|
+
const winner = votingRound.getWinner();
|
|
338
|
+
if (winner) {
|
|
339
|
+
this.resolve(sessionId, `Consensus reached: ${winner.content}`);
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Get contributions by a specific agent
|
|
349
|
+
*/
|
|
350
|
+
getAgentContributions(sessionId: string, agentId: string): IHiveContribution[] {
|
|
351
|
+
const session = this.sessions.get(sessionId);
|
|
352
|
+
if (!session) {
|
|
353
|
+
return [];
|
|
354
|
+
}
|
|
355
|
+
return session.contributions.filter((c: any) => c.agentId === agentId);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Find similar contributions in a session
|
|
360
|
+
*/
|
|
361
|
+
findSimilarContributions(sessionId: string, contributionId: string): IHiveContribution[] {
|
|
362
|
+
const session = this.sessions.get(sessionId);
|
|
363
|
+
if (!session) {
|
|
364
|
+
return [];
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
const target = session.contributions.find((c: any) => c.id === contributionId);
|
|
368
|
+
if (!target) {
|
|
369
|
+
return [];
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return this.synthesizer.findSimilar(target, session.contributions);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
private generateSessionId(): string {
|
|
376
|
+
return `hive-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
private generateContributionId(): string {
|
|
380
|
+
this.contributionIdCounter++;
|
|
381
|
+
return `contrib-${this.contributionIdCounter}-${Date.now()}`;
|
|
382
|
+
}
|
|
383
|
+
}
|