@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,483 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @holoscript/core - Unified Spatial Communication Client
|
|
3
|
+
*
|
|
4
|
+
* Unified client that orchestrates all three communication layers:
|
|
5
|
+
* - Layer 1: Real-Time (UDP/WebRTC) for 90fps coordination
|
|
6
|
+
* - Layer 2: A2A (HTTP/2) for task coordination
|
|
7
|
+
* - Layer 3: MCP for high-level commands
|
|
8
|
+
*
|
|
9
|
+
* Integrates with Phase 1 agent identity and Phase 2 graceful degradation.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { EventEmitter } from 'events';
|
|
13
|
+
import { Layer1RealTimeClient } from './Layer1RealTime';
|
|
14
|
+
import { Layer2A2AClient } from './Layer2A2A';
|
|
15
|
+
import { Layer3MCPClient } from './Layer3MCP';
|
|
16
|
+
import { DEFAULT_SPATIAL_COMM_CONFIG } from './ProtocolTypes';
|
|
17
|
+
import type {
|
|
18
|
+
SpatialCommProtocolConfig,
|
|
19
|
+
WorldSpec,
|
|
20
|
+
WorldStatus,
|
|
21
|
+
TaskSpec,
|
|
22
|
+
PerformanceMetrics,
|
|
23
|
+
ExportFormat,
|
|
24
|
+
} from './ProtocolTypes';
|
|
25
|
+
import type { SpatialClaim } from './Layer2A2A';
|
|
26
|
+
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// FRAME BUDGET TRACKER
|
|
29
|
+
// ============================================================================
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Frame budget tracker for graceful degradation
|
|
33
|
+
*/
|
|
34
|
+
export class FrameBudgetTracker {
|
|
35
|
+
private targetFps: number;
|
|
36
|
+
private targetFrameTimeMs: number;
|
|
37
|
+
private frameTimeSamples: number[] = [];
|
|
38
|
+
private maxSamples = 60; // Track last 60 frames
|
|
39
|
+
private qualityLevel: 'high' | 'medium' | 'low' | 'minimal' = 'high';
|
|
40
|
+
|
|
41
|
+
constructor(targetFps = 90) {
|
|
42
|
+
this.targetFps = targetFps;
|
|
43
|
+
this.targetFrameTimeMs = 1000 / targetFps; // 11.1ms for 90fps
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Record frame time
|
|
48
|
+
*/
|
|
49
|
+
recordFrameTime(frameTimeMs: number): void {
|
|
50
|
+
this.frameTimeSamples.push(frameTimeMs);
|
|
51
|
+
|
|
52
|
+
// Keep only recent samples
|
|
53
|
+
if (this.frameTimeSamples.length > this.maxSamples) {
|
|
54
|
+
this.frameTimeSamples.shift();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Auto-adjust quality based on performance
|
|
58
|
+
this.autoAdjustQuality();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get average frame time
|
|
63
|
+
*/
|
|
64
|
+
getAverageFrameTime(): number {
|
|
65
|
+
if (this.frameTimeSamples.length === 0) return this.targetFrameTimeMs;
|
|
66
|
+
|
|
67
|
+
const sum = this.frameTimeSamples.reduce((a, b) => a + b, 0);
|
|
68
|
+
return sum / this.frameTimeSamples.length;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Get maximum frame time
|
|
73
|
+
*/
|
|
74
|
+
getMaxFrameTime(): number {
|
|
75
|
+
if (this.frameTimeSamples.length === 0) return this.targetFrameTimeMs;
|
|
76
|
+
return Math.max(...this.frameTimeSamples);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Get current FPS
|
|
81
|
+
*/
|
|
82
|
+
getCurrentFps(): number {
|
|
83
|
+
const avgFrameTime = this.getAverageFrameTime();
|
|
84
|
+
return 1000 / avgFrameTime;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get budget remaining for current frame
|
|
89
|
+
*/
|
|
90
|
+
getBudgetRemaining(): number {
|
|
91
|
+
const avgFrameTime = this.getAverageFrameTime();
|
|
92
|
+
return Math.max(0, this.targetFrameTimeMs - avgFrameTime);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Check if within budget
|
|
97
|
+
*/
|
|
98
|
+
isWithinBudget(): boolean {
|
|
99
|
+
return this.getAverageFrameTime() <= this.targetFrameTimeMs * 1.1; // 10% tolerance
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Get current quality level
|
|
104
|
+
*/
|
|
105
|
+
getQualityLevel(): 'high' | 'medium' | 'low' | 'minimal' {
|
|
106
|
+
return this.qualityLevel;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Set quality level
|
|
111
|
+
*/
|
|
112
|
+
setQualityLevel(level: 'high' | 'medium' | 'low' | 'minimal'): void {
|
|
113
|
+
this.qualityLevel = level;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Auto-adjust quality based on performance
|
|
118
|
+
*/
|
|
119
|
+
private autoAdjustQuality(): void {
|
|
120
|
+
const avgFrameTime = this.getAverageFrameTime();
|
|
121
|
+
const targetFrameTime = this.targetFrameTimeMs;
|
|
122
|
+
|
|
123
|
+
// Gradual quality reduction if over budget
|
|
124
|
+
if (avgFrameTime > targetFrameTime * 1.3) {
|
|
125
|
+
// >30% over budget
|
|
126
|
+
this.qualityLevel = 'minimal';
|
|
127
|
+
} else if (avgFrameTime > targetFrameTime * 1.2) {
|
|
128
|
+
// >20% over budget
|
|
129
|
+
this.qualityLevel = 'low';
|
|
130
|
+
} else if (avgFrameTime > targetFrameTime * 1.1) {
|
|
131
|
+
// >10% over budget
|
|
132
|
+
this.qualityLevel = 'medium';
|
|
133
|
+
} else {
|
|
134
|
+
// Within budget - can increase quality
|
|
135
|
+
this.qualityLevel = 'high';
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Get frame budget stats
|
|
141
|
+
*/
|
|
142
|
+
getStats(): {
|
|
143
|
+
targetFps: number;
|
|
144
|
+
currentFps: number;
|
|
145
|
+
avgFrameTimeMs: number;
|
|
146
|
+
maxFrameTimeMs: number;
|
|
147
|
+
budgetRemainingMs: number;
|
|
148
|
+
qualityLevel: 'high' | 'medium' | 'low' | 'minimal';
|
|
149
|
+
withinBudget: boolean;
|
|
150
|
+
} {
|
|
151
|
+
return {
|
|
152
|
+
targetFps: this.targetFps,
|
|
153
|
+
currentFps: this.getCurrentFps(),
|
|
154
|
+
avgFrameTimeMs: this.getAverageFrameTime(),
|
|
155
|
+
maxFrameTimeMs: this.getMaxFrameTime(),
|
|
156
|
+
budgetRemainingMs: this.getBudgetRemaining(),
|
|
157
|
+
qualityLevel: this.qualityLevel,
|
|
158
|
+
withinBudget: this.isWithinBudget(),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Reset tracker
|
|
164
|
+
*/
|
|
165
|
+
reset(): void {
|
|
166
|
+
this.frameTimeSamples = [];
|
|
167
|
+
this.qualityLevel = 'high';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// ============================================================================
|
|
172
|
+
// UNIFIED SPATIAL COMM CLIENT
|
|
173
|
+
// ============================================================================
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Unified spatial communication client
|
|
177
|
+
*/
|
|
178
|
+
export class SpatialCommClient extends EventEmitter {
|
|
179
|
+
private agentId: string;
|
|
180
|
+
private config: SpatialCommProtocolConfig;
|
|
181
|
+
|
|
182
|
+
// Layer clients
|
|
183
|
+
private layer1?: Layer1RealTimeClient;
|
|
184
|
+
private layer2?: Layer2A2AClient;
|
|
185
|
+
private layer3?: Layer3MCPClient;
|
|
186
|
+
|
|
187
|
+
// Frame budget tracker
|
|
188
|
+
private frameBudget: FrameBudgetTracker;
|
|
189
|
+
|
|
190
|
+
// State
|
|
191
|
+
private initialized = false;
|
|
192
|
+
private currentWorldId?: string;
|
|
193
|
+
|
|
194
|
+
constructor(agentId: string, config?: Partial<SpatialCommProtocolConfig>) {
|
|
195
|
+
super();
|
|
196
|
+
this.agentId = agentId;
|
|
197
|
+
this.config = {
|
|
198
|
+
layer1: { ...DEFAULT_SPATIAL_COMM_CONFIG.layer1, ...(config?.layer1 || {}) },
|
|
199
|
+
layer2: { ...DEFAULT_SPATIAL_COMM_CONFIG.layer2, ...(config?.layer2 || {}) },
|
|
200
|
+
layer3: { ...DEFAULT_SPATIAL_COMM_CONFIG.layer3, ...(config?.layer3 || {}) },
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
this.frameBudget = new FrameBudgetTracker(this.config.layer1.targetLatency);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Initialize all layers
|
|
208
|
+
*/
|
|
209
|
+
async init(options?: { useWebRTC?: boolean }): Promise<void> {
|
|
210
|
+
if (this.initialized) {
|
|
211
|
+
throw new Error('Client already initialized');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Initialize Layer 1 (Real-Time)
|
|
215
|
+
this.layer1 = new Layer1RealTimeClient(this.agentId, this.config.layer1);
|
|
216
|
+
await this.layer1.init(options?.useWebRTC);
|
|
217
|
+
|
|
218
|
+
// Forward Layer 1 events
|
|
219
|
+
this.layer1.on('message', (msg) => this.emit('layer1:message', msg));
|
|
220
|
+
this.layer1.on('latency_warning', (data) => this.emit('layer1:latency_warning', data));
|
|
221
|
+
|
|
222
|
+
// Initialize Layer 2 (A2A Coordination)
|
|
223
|
+
this.layer2 = new Layer2A2AClient(this.agentId, this.config.layer2);
|
|
224
|
+
|
|
225
|
+
// Forward Layer 2 events
|
|
226
|
+
this.layer2.on('message', (msg) => this.emit('layer2:message', msg));
|
|
227
|
+
this.layer2.on('spatial_conflict', (data) => this.emit('layer2:spatial_conflict', data));
|
|
228
|
+
this.layer2.on('retry', (data) => this.emit('layer2:retry', data));
|
|
229
|
+
|
|
230
|
+
// Initialize Layer 3 (MCP Metadata)
|
|
231
|
+
this.layer3 = new Layer3MCPClient(this.agentId, this.config.layer3);
|
|
232
|
+
|
|
233
|
+
// Forward Layer 3 events
|
|
234
|
+
this.layer3.on('command_success', (data) => this.emit('layer3:command_success', data));
|
|
235
|
+
this.layer3.on('command_error', (data) => this.emit('layer3:command_error', data));
|
|
236
|
+
|
|
237
|
+
this.initialized = true;
|
|
238
|
+
this.emit('initialized', { agentId: this.agentId });
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// ==========================================================================
|
|
242
|
+
// LAYER 1: REAL-TIME OPERATIONS
|
|
243
|
+
// ==========================================================================
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Send position sync (Layer 1)
|
|
247
|
+
*/
|
|
248
|
+
async syncPosition(
|
|
249
|
+
position: [number, number, number],
|
|
250
|
+
rotation: [number, number, number, number],
|
|
251
|
+
scale: [number, number, number],
|
|
252
|
+
velocity?: [number, number, number]
|
|
253
|
+
): Promise<void> {
|
|
254
|
+
if (!this.layer1) throw new Error('Layer 1 not initialized');
|
|
255
|
+
await this.layer1.sendPositionSync(position, rotation, scale, velocity);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Send frame budget update (Layer 1)
|
|
260
|
+
*/
|
|
261
|
+
async sendFrameBudget(): Promise<void> {
|
|
262
|
+
if (!this.layer1) throw new Error('Layer 1 not initialized');
|
|
263
|
+
|
|
264
|
+
const stats = this.frameBudget.getStats();
|
|
265
|
+
|
|
266
|
+
await this.layer1.sendFrameBudget(
|
|
267
|
+
stats.avgFrameTimeMs,
|
|
268
|
+
stats.budgetRemainingMs,
|
|
269
|
+
stats.targetFps,
|
|
270
|
+
stats.currentFps,
|
|
271
|
+
stats.qualityLevel
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Record frame time (updates budget tracker)
|
|
277
|
+
*/
|
|
278
|
+
recordFrameTime(frameTimeMs: number): void {
|
|
279
|
+
this.frameBudget.recordFrameTime(frameTimeMs);
|
|
280
|
+
|
|
281
|
+
// Emit budget warning if over budget
|
|
282
|
+
if (!this.frameBudget.isWithinBudget()) {
|
|
283
|
+
this.emit('budget_warning', this.frameBudget.getStats());
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Get frame budget stats
|
|
289
|
+
*/
|
|
290
|
+
getFrameBudgetStats() {
|
|
291
|
+
return this.frameBudget.getStats();
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// ==========================================================================
|
|
295
|
+
// LAYER 2: COORDINATION OPERATIONS
|
|
296
|
+
// ==========================================================================
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Assign task to agent (Layer 2)
|
|
300
|
+
*/
|
|
301
|
+
async assignTask(toAgent: string, task: TaskSpec) {
|
|
302
|
+
if (!this.layer2) throw new Error('Layer 2 not initialized');
|
|
303
|
+
return this.layer2.assignTask(toAgent, task);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Complete task (Layer 2)
|
|
308
|
+
*/
|
|
309
|
+
async completeTask(taskId: string, success: boolean, result?: unknown, error?: string) {
|
|
310
|
+
if (!this.layer2) throw new Error('Layer 2 not initialized');
|
|
311
|
+
|
|
312
|
+
// Include frame budget metrics
|
|
313
|
+
const stats = this.frameBudget.getStats();
|
|
314
|
+
|
|
315
|
+
return this.layer2.completeTask(taskId, success, result, error, {
|
|
316
|
+
duration_ms: 0, // Would be tracked separately
|
|
317
|
+
frame_time_avg_ms: stats.avgFrameTimeMs,
|
|
318
|
+
frame_time_max_ms: stats.maxFrameTimeMs,
|
|
319
|
+
quality_level: stats.qualityLevel,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Claim spatial region (Layer 2)
|
|
325
|
+
*/
|
|
326
|
+
async claimSpatialRegion(
|
|
327
|
+
claimId: string,
|
|
328
|
+
boundingBox: {
|
|
329
|
+
min: [number, number, number];
|
|
330
|
+
max: [number, number, number];
|
|
331
|
+
},
|
|
332
|
+
priority: 'low' | 'medium' | 'high' | 'critical',
|
|
333
|
+
durationMs?: number,
|
|
334
|
+
exclusive = true
|
|
335
|
+
) {
|
|
336
|
+
if (!this.layer2) throw new Error('Layer 2 not initialized');
|
|
337
|
+
return this.layer2.claimSpatialRegion(claimId, boundingBox, priority, durationMs, exclusive);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Request resource (Layer 2)
|
|
342
|
+
*/
|
|
343
|
+
async requestResource(
|
|
344
|
+
resourceId: string,
|
|
345
|
+
resourceType: 'mesh' | 'texture' | 'material' | 'audio' | 'compute' | 'memory',
|
|
346
|
+
amount?: number,
|
|
347
|
+
priority: 'low' | 'medium' | 'high' | 'critical' = 'medium'
|
|
348
|
+
) {
|
|
349
|
+
if (!this.layer2) throw new Error('Layer 2 not initialized');
|
|
350
|
+
return this.layer2.requestResource(resourceId, resourceType, amount, priority);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Release resource (Layer 2)
|
|
355
|
+
*/
|
|
356
|
+
async releaseResource(resourceId: string) {
|
|
357
|
+
if (!this.layer2) throw new Error('Layer 2 not initialized');
|
|
358
|
+
return this.layer2.releaseResource(resourceId);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Get spatial claims (Layer 2)
|
|
363
|
+
*/
|
|
364
|
+
getMyClaims() {
|
|
365
|
+
if (!this.layer2) throw new Error('Layer 2 not initialized');
|
|
366
|
+
return this.layer2.getMyClaims();
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// ==========================================================================
|
|
370
|
+
// LAYER 3: METADATA OPERATIONS
|
|
371
|
+
// ==========================================================================
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Create world (Layer 3)
|
|
375
|
+
*/
|
|
376
|
+
async createWorld(worldSpec: WorldSpec): Promise<{ world_id: string; status: WorldStatus }> {
|
|
377
|
+
if (!this.layer3) throw new Error('Layer 3 not initialized');
|
|
378
|
+
const result = await this.layer3.createWorld(worldSpec);
|
|
379
|
+
this.currentWorldId = result.world_id;
|
|
380
|
+
return result;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Get world status (Layer 3)
|
|
385
|
+
*/
|
|
386
|
+
async getWorldStatus(worldId?: string): Promise<WorldStatus> {
|
|
387
|
+
if (!this.layer3) throw new Error('Layer 3 not initialized');
|
|
388
|
+
const id = worldId || this.currentWorldId;
|
|
389
|
+
if (!id) throw new Error('No world ID specified');
|
|
390
|
+
return this.layer3.getWorldStatus(id);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Export world (Layer 3)
|
|
395
|
+
*/
|
|
396
|
+
async exportWorld(format: ExportFormat, worldId?: string) {
|
|
397
|
+
if (!this.layer3) throw new Error('Layer 3 not initialized');
|
|
398
|
+
const id = worldId || this.currentWorldId;
|
|
399
|
+
if (!id) throw new Error('No world ID specified');
|
|
400
|
+
return this.layer3.exportWorld(id, format);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Get agent registry (Layer 3)
|
|
405
|
+
*/
|
|
406
|
+
async getAgentRegistry(filter?: {
|
|
407
|
+
status?: 'online' | 'offline' | 'degraded';
|
|
408
|
+
role?: string;
|
|
409
|
+
world_id?: string;
|
|
410
|
+
}) {
|
|
411
|
+
if (!this.layer3) throw new Error('Layer 3 not initialized');
|
|
412
|
+
return this.layer3.getAgentRegistry(filter);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Get performance metrics (Layer 3)
|
|
417
|
+
*/
|
|
418
|
+
async getPerformanceMetrics(options?: {
|
|
419
|
+
world_id?: string;
|
|
420
|
+
agent_id?: string;
|
|
421
|
+
}): Promise<PerformanceMetrics> {
|
|
422
|
+
if (!this.layer3) throw new Error('Layer 3 not initialized');
|
|
423
|
+
return this.layer3.getPerformanceMetrics(options);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Set global configuration (Layer 3)
|
|
428
|
+
*/
|
|
429
|
+
async setGlobalConfig(config: {
|
|
430
|
+
target_fps?: number;
|
|
431
|
+
max_agents?: number;
|
|
432
|
+
quality_level?: 'high' | 'medium' | 'low' | 'minimal';
|
|
433
|
+
}) {
|
|
434
|
+
if (!this.layer3) throw new Error('Layer 3 not initialized');
|
|
435
|
+
return this.layer3.setGlobalConfig(config);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// ==========================================================================
|
|
439
|
+
// LIFECYCLE
|
|
440
|
+
// ==========================================================================
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Shutdown client
|
|
444
|
+
*/
|
|
445
|
+
async shutdown(): Promise<void> {
|
|
446
|
+
if (!this.initialized) return;
|
|
447
|
+
|
|
448
|
+
// Shutdown layers in reverse order
|
|
449
|
+
if (this.layer3) {
|
|
450
|
+
// Layer 3 has no explicit shutdown
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
if (this.layer2) {
|
|
454
|
+
await this.layer2.shutdown();
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
if (this.layer1) {
|
|
458
|
+
await this.layer1.close();
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
this.initialized = false;
|
|
462
|
+
this.emit('shutdown');
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Get client status
|
|
467
|
+
*/
|
|
468
|
+
getStatus(): {
|
|
469
|
+
agentId: string;
|
|
470
|
+
initialized: boolean;
|
|
471
|
+
currentWorldId?: string;
|
|
472
|
+
frameBudget: ReturnType<FrameBudgetTracker['getStats']>;
|
|
473
|
+
queueStats: ReturnType<Layer2A2AClient['getQueueStats']>;
|
|
474
|
+
} {
|
|
475
|
+
return {
|
|
476
|
+
agentId: this.agentId,
|
|
477
|
+
initialized: this.initialized,
|
|
478
|
+
currentWorldId: this.currentWorldId,
|
|
479
|
+
frameBudget: this.frameBudget.getStats(),
|
|
480
|
+
queueStats: this.layer2?.getQueueStats() || { queueSize: 0, claimCount: 0 },
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
}
|