@holoscript/framework 6.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/ALL-test-results.json +1 -0
  2. package/CHANGELOG.md +8 -0
  3. package/LICENSE +21 -0
  4. package/ROADMAP.md +175 -0
  5. package/dist/AgentManifest-CB4xM-Ma.d.cts +704 -0
  6. package/dist/AgentManifest-CB4xM-Ma.d.ts +704 -0
  7. package/dist/BehaviorTree-BrBFECv5.d.cts +103 -0
  8. package/dist/BehaviorTree-BrBFECv5.d.ts +103 -0
  9. package/dist/InvisibleWallet-BB6tFvRA.d.cts +1732 -0
  10. package/dist/InvisibleWallet-rtRrBOA8.d.ts +1732 -0
  11. package/dist/OrchestratorAgent-BvWgf9uw.d.cts +798 -0
  12. package/dist/OrchestratorAgent-Q_CbVTmO.d.ts +798 -0
  13. package/dist/agents/index.cjs +4790 -0
  14. package/dist/agents/index.d.cts +1788 -0
  15. package/dist/agents/index.d.ts +1788 -0
  16. package/dist/agents/index.js +4695 -0
  17. package/dist/ai/index.cjs +5347 -0
  18. package/dist/ai/index.d.cts +1753 -0
  19. package/dist/ai/index.d.ts +1753 -0
  20. package/dist/ai/index.js +5244 -0
  21. package/dist/behavior.cjs +449 -0
  22. package/dist/behavior.d.cts +130 -0
  23. package/dist/behavior.d.ts +130 -0
  24. package/dist/behavior.js +407 -0
  25. package/dist/economy/index.cjs +3659 -0
  26. package/dist/economy/index.d.cts +747 -0
  27. package/dist/economy/index.d.ts +747 -0
  28. package/dist/economy/index.js +3617 -0
  29. package/dist/implementations-D9T3un9D.d.cts +236 -0
  30. package/dist/implementations-D9T3un9D.d.ts +236 -0
  31. package/dist/index.cjs +24550 -0
  32. package/dist/index.d.cts +1729 -0
  33. package/dist/index.d.ts +1729 -0
  34. package/dist/index.js +24277 -0
  35. package/dist/learning/index.cjs +219 -0
  36. package/dist/learning/index.d.cts +104 -0
  37. package/dist/learning/index.d.ts +104 -0
  38. package/dist/learning/index.js +189 -0
  39. package/dist/negotiation/index.cjs +970 -0
  40. package/dist/negotiation/index.d.cts +610 -0
  41. package/dist/negotiation/index.d.ts +610 -0
  42. package/dist/negotiation/index.js +931 -0
  43. package/dist/skills/index.cjs +1118 -0
  44. package/dist/skills/index.d.cts +289 -0
  45. package/dist/skills/index.d.ts +289 -0
  46. package/dist/skills/index.js +1079 -0
  47. package/dist/swarm/index.cjs +5268 -0
  48. package/dist/swarm/index.d.cts +2433 -0
  49. package/dist/swarm/index.d.ts +2433 -0
  50. package/dist/swarm/index.js +5221 -0
  51. package/dist/training/index.cjs +2745 -0
  52. package/dist/training/index.d.cts +1734 -0
  53. package/dist/training/index.d.ts +1734 -0
  54. package/dist/training/index.js +2687 -0
  55. package/extract-failures.js +10 -0
  56. package/package.json +82 -0
  57. package/src/__tests__/bounty-marketplace.test.ts +374 -0
  58. package/src/__tests__/delegation.test.ts +144 -0
  59. package/src/__tests__/distributed-claimer.test.ts +147 -0
  60. package/src/__tests__/done-log-audit.test.ts +342 -0
  61. package/src/__tests__/framework.test.ts +865 -0
  62. package/src/__tests__/goal-synthesizer.test.ts +236 -0
  63. package/src/__tests__/presence.test.ts +223 -0
  64. package/src/__tests__/protocol-agent.test.ts +254 -0
  65. package/src/__tests__/revenue-splitter.test.ts +114 -0
  66. package/src/__tests__/scenario-driven-todo.test.ts +197 -0
  67. package/src/__tests__/self-improve.test.ts +349 -0
  68. package/src/__tests__/service-lifecycle.test.ts +237 -0
  69. package/src/__tests__/skill-router.test.ts +121 -0
  70. package/src/agents/AgentManifest.ts +493 -0
  71. package/src/agents/AgentRegistry.ts +475 -0
  72. package/src/agents/AgentTypes.ts +585 -0
  73. package/src/agents/AgentWalletRegistry.ts +83 -0
  74. package/src/agents/AuthenticatedCRDT.ts +388 -0
  75. package/src/agents/CapabilityMatcher.ts +453 -0
  76. package/src/agents/CrossRealityHandoff.ts +305 -0
  77. package/src/agents/CulturalMemory.ts +454 -0
  78. package/src/agents/FederatedRegistryAdapter.ts +429 -0
  79. package/src/agents/NormEngine.ts +450 -0
  80. package/src/agents/OrchestratorAgent.ts +414 -0
  81. package/src/agents/SkillWorkflowEngine.ts +472 -0
  82. package/src/agents/TaskDelegationService.ts +551 -0
  83. package/src/agents/__tests__/AgentManifest.prod.test.ts +134 -0
  84. package/src/agents/__tests__/AgentManifest.test.ts +182 -0
  85. package/src/agents/__tests__/AgentModule.test.ts +864 -0
  86. package/src/agents/__tests__/AgentRegistry.prod.test.ts +125 -0
  87. package/src/agents/__tests__/AgentRegistry.test.ts +148 -0
  88. package/src/agents/__tests__/AgentTypes.test.ts +534 -0
  89. package/src/agents/__tests__/AgentWalletRegistry.test.ts +152 -0
  90. package/src/agents/__tests__/AuthenticatedCRDT.test.ts +558 -0
  91. package/src/agents/__tests__/CapabilityMatcher.prod.test.ts +117 -0
  92. package/src/agents/__tests__/CapabilityMatcher.test.ts +178 -0
  93. package/src/agents/__tests__/CrossRealityHandoff.test.ts +402 -0
  94. package/src/agents/__tests__/CulturalMemory.test.ts +200 -0
  95. package/src/agents/__tests__/FederatedRegistryAdapter.test.ts +409 -0
  96. package/src/agents/__tests__/NormEngine.test.ts +276 -0
  97. package/src/agents/__tests__/OrchestratorAgent.test.ts +182 -0
  98. package/src/agents/__tests__/SkillWorkflowEngine.test.ts +357 -0
  99. package/src/agents/__tests__/TaskDelegationService.test.ts +446 -0
  100. package/src/agents/index.ts +107 -0
  101. package/src/agents/spatial-comms/Layer1RealTime.ts +621 -0
  102. package/src/agents/spatial-comms/Layer2A2A.ts +661 -0
  103. package/src/agents/spatial-comms/Layer3MCP.ts +651 -0
  104. package/src/agents/spatial-comms/ProtocolTypes.ts +543 -0
  105. package/src/agents/spatial-comms/SpatialCommClient.ts +483 -0
  106. package/src/agents/spatial-comms/__tests__/performance-benchmark.test.ts +465 -0
  107. package/src/agents/spatial-comms/examples/multi-agent-world-creation.ts +409 -0
  108. package/src/agents/spatial-comms/index.ts +66 -0
  109. package/src/ai/AIAdapter.ts +313 -0
  110. package/src/ai/AICopilot.ts +331 -0
  111. package/src/ai/AIOutputValidator.ts +203 -0
  112. package/src/ai/BTNodes.ts +239 -0
  113. package/src/ai/BehaviorSelector.ts +135 -0
  114. package/src/ai/BehaviorTree.ts +153 -0
  115. package/src/ai/Blackboard.ts +165 -0
  116. package/src/ai/GenerationAnalytics.ts +461 -0
  117. package/src/ai/GenerationCache.ts +265 -0
  118. package/src/ai/GoalPlanner.ts +165 -0
  119. package/src/ai/HoloScriptGenerator.ts +580 -0
  120. package/src/ai/InfluenceMap.ts +180 -0
  121. package/src/ai/NavMesh.ts +168 -0
  122. package/src/ai/PerceptionSystem.ts +178 -0
  123. package/src/ai/PromptTemplates.ts +453 -0
  124. package/src/ai/SemanticSearchService.ts +80 -0
  125. package/src/ai/StateMachine.ts +196 -0
  126. package/src/ai/SteeringBehavior.ts +150 -0
  127. package/src/ai/SteeringBehaviors.ts +244 -0
  128. package/src/ai/TrainingDataGenerator.ts +1082 -0
  129. package/src/ai/UtilityAI.ts +145 -0
  130. package/src/ai/__tests__/AIAdapter.prod.test.ts +259 -0
  131. package/src/ai/__tests__/AIAdapter.test.ts +109 -0
  132. package/src/ai/__tests__/AICopilot.prod.test.ts +341 -0
  133. package/src/ai/__tests__/AICopilot.test.ts +178 -0
  134. package/src/ai/__tests__/AIOutputValidator.prod.test.ts +226 -0
  135. package/src/ai/__tests__/AIOutputValidator.test.ts +138 -0
  136. package/src/ai/__tests__/BTNodes.prod.test.ts +391 -0
  137. package/src/ai/__tests__/BTNodes.test.ts +263 -0
  138. package/src/ai/__tests__/BehaviorSelector.prod.test.ts +129 -0
  139. package/src/ai/__tests__/BehaviorSelector.test.ts +132 -0
  140. package/src/ai/__tests__/BehaviorTree.prod.test.ts +266 -0
  141. package/src/ai/__tests__/BehaviorTree.test.ts +216 -0
  142. package/src/ai/__tests__/Blackboard.prod.test.ts +339 -0
  143. package/src/ai/__tests__/Blackboard.test.ts +183 -0
  144. package/src/ai/__tests__/GenerationAnalytics.prod.test.ts +141 -0
  145. package/src/ai/__tests__/GenerationAnalytics.test.ts +165 -0
  146. package/src/ai/__tests__/GenerationCache.prod.test.ts +144 -0
  147. package/src/ai/__tests__/GenerationCache.test.ts +171 -0
  148. package/src/ai/__tests__/GoalPlanner.prod.test.ts +189 -0
  149. package/src/ai/__tests__/GoalPlanner.test.ts +137 -0
  150. package/src/ai/__tests__/GoalPlannerDepth.prod.test.ts +217 -0
  151. package/src/ai/__tests__/HoloScriptGenerator.test.ts +125 -0
  152. package/src/ai/__tests__/InfluenceMap.prod.test.ts +146 -0
  153. package/src/ai/__tests__/InfluenceMap.test.ts +149 -0
  154. package/src/ai/__tests__/NavMesh.prod.test.ts +141 -0
  155. package/src/ai/__tests__/NavMesh.test.ts +159 -0
  156. package/src/ai/__tests__/PerceptionSystem.prod.test.ts +135 -0
  157. package/src/ai/__tests__/PerceptionSystem.test.ts +250 -0
  158. package/src/ai/__tests__/PromptTemplates.prod.test.ts +313 -0
  159. package/src/ai/__tests__/PromptTemplates.test.ts +146 -0
  160. package/src/ai/__tests__/SemanticSearch.test.ts +37 -0
  161. package/src/ai/__tests__/StateMachine.prod.test.ts +162 -0
  162. package/src/ai/__tests__/StateMachine.test.ts +163 -0
  163. package/src/ai/__tests__/SteeringBehavior.prod.test.ts +251 -0
  164. package/src/ai/__tests__/SteeringBehavior.test.ts +135 -0
  165. package/src/ai/__tests__/SteeringBehaviors.prod.test.ts +133 -0
  166. package/src/ai/__tests__/SteeringBehaviors.test.ts +151 -0
  167. package/src/ai/__tests__/TrainingDataGenerator.prod.test.ts +286 -0
  168. package/src/ai/__tests__/TrainingDataGenerator.test.ts +286 -0
  169. package/src/ai/__tests__/UtilityAI.prod.test.ts +207 -0
  170. package/src/ai/__tests__/UtilityAI.test.ts +155 -0
  171. package/src/ai/__tests__/adapters.prod.test.ts +263 -0
  172. package/src/ai/__tests__/adapters.test.ts +320 -0
  173. package/src/ai/adapters.ts +1585 -0
  174. package/src/ai/index.ts +130 -0
  175. package/src/behavior/BehaviorPresets.ts +140 -0
  176. package/src/behavior/BehaviorTree.ts +236 -0
  177. package/src/behavior/StateMachine.ts +176 -0
  178. package/src/behavior/StateTrait.ts +67 -0
  179. package/src/behavior/index.ts +8 -0
  180. package/src/behavior.ts +8 -0
  181. package/src/board/audit.ts +284 -0
  182. package/src/board/board-ops.ts +336 -0
  183. package/src/board/board-types.ts +302 -0
  184. package/src/board/index.ts +69 -0
  185. package/src/define-agent.ts +46 -0
  186. package/src/define-team.ts +33 -0
  187. package/src/delegation.ts +265 -0
  188. package/src/distributed-claimer.ts +228 -0
  189. package/src/economy/AgentBudgetEnforcer.ts +464 -0
  190. package/src/economy/BountyManager.ts +185 -0
  191. package/src/economy/CreatorRevenueAggregator.ts +460 -0
  192. package/src/economy/InvisibleWallet.ts +82 -0
  193. package/src/economy/KnowledgeMarketplace.ts +193 -0
  194. package/src/economy/PaymentWebhookService.ts +512 -0
  195. package/src/economy/RevenueSplitter.ts +156 -0
  196. package/src/economy/SubscriptionManager.ts +546 -0
  197. package/src/economy/UnifiedBudgetOptimizer.ts +635 -0
  198. package/src/economy/UsageMeter.ts +440 -0
  199. package/src/economy/_core-stubs.ts +219 -0
  200. package/src/economy/index.ts +100 -0
  201. package/src/economy/x402-facilitator.ts +1978 -0
  202. package/src/index.ts +348 -0
  203. package/src/knowledge/__tests__/knowledge-consolidator.test.ts +444 -0
  204. package/src/knowledge/__tests__/knowledge-store-vector.test.ts +291 -0
  205. package/src/knowledge/brain.ts +167 -0
  206. package/src/knowledge/consolidation.ts +581 -0
  207. package/src/knowledge/knowledge-consolidator.ts +510 -0
  208. package/src/knowledge/knowledge-store.ts +616 -0
  209. package/src/learning/MemoryConsolidator.ts +102 -0
  210. package/src/learning/MemoryScorer.ts +69 -0
  211. package/src/learning/ProceduralCompiler.ts +45 -0
  212. package/src/learning/SemanticClusterer.ts +66 -0
  213. package/src/learning/index.ts +8 -0
  214. package/src/llm/llm-adapter.ts +159 -0
  215. package/src/mesh/index.ts +309 -0
  216. package/src/negotiation/NegotiationProtocol.ts +694 -0
  217. package/src/negotiation/NegotiationTypes.ts +473 -0
  218. package/src/negotiation/VotingMechanisms.ts +691 -0
  219. package/src/negotiation/index.ts +49 -0
  220. package/src/protocol/goal-synthesizer.ts +317 -0
  221. package/src/protocol/implementations.ts +474 -0
  222. package/src/protocol/micro-phase-decomposer.ts +299 -0
  223. package/src/protocol/micro-step-decomposer.test.ts +306 -0
  224. package/src/protocol-agent.test.ts +353 -0
  225. package/src/protocol-agent.ts +670 -0
  226. package/src/self-improve/absorb-scanner.ts +252 -0
  227. package/src/self-improve/evolution-engine.ts +149 -0
  228. package/src/self-improve/framework-absorber.ts +214 -0
  229. package/src/self-improve/index.ts +50 -0
  230. package/src/self-improve/prompt-optimizer.ts +212 -0
  231. package/src/self-improve/test-generator.ts +175 -0
  232. package/src/skill-router.ts +186 -0
  233. package/src/skills/index.ts +5 -0
  234. package/src/skills/skill-md-bridge.ts +1699 -0
  235. package/src/swarm/ACOEngine.ts +261 -0
  236. package/src/swarm/CollectiveIntelligence.ts +383 -0
  237. package/src/swarm/ContributionSynthesizer.ts +481 -0
  238. package/src/swarm/LeaderElection.ts +393 -0
  239. package/src/swarm/PSOEngine.ts +206 -0
  240. package/src/swarm/QuorumPolicy.ts +173 -0
  241. package/src/swarm/SwarmCoordinator.ts +335 -0
  242. package/src/swarm/SwarmManager.ts +442 -0
  243. package/src/swarm/SwarmMembership.ts +456 -0
  244. package/src/swarm/VotingRound.ts +255 -0
  245. package/src/swarm/__tests__/ACOEngine.prod.test.ts +164 -0
  246. package/src/swarm/__tests__/ACOEngine.test.ts +117 -0
  247. package/src/swarm/__tests__/CollectiveIntelligence.prod.test.ts +296 -0
  248. package/src/swarm/__tests__/CollectiveIntelligence.test.ts +457 -0
  249. package/src/swarm/__tests__/ContributionSynthesizer.prod.test.ts +269 -0
  250. package/src/swarm/__tests__/ContributionSynthesizer.test.ts +254 -0
  251. package/src/swarm/__tests__/LeaderElection.prod.test.ts +196 -0
  252. package/src/swarm/__tests__/LeaderElection.test.ts +151 -0
  253. package/src/swarm/__tests__/PSOEngine.prod.test.ts +162 -0
  254. package/src/swarm/__tests__/PSOEngine.test.ts +106 -0
  255. package/src/swarm/__tests__/QuorumPolicy.prod.test.ts +216 -0
  256. package/src/swarm/__tests__/QuorumPolicy.test.ts +177 -0
  257. package/src/swarm/__tests__/SwarmCoordinator.prod.test.ts +186 -0
  258. package/src/swarm/__tests__/SwarmCoordinator.test.ts +167 -0
  259. package/src/swarm/__tests__/SwarmManager.prod.test.ts +308 -0
  260. package/src/swarm/__tests__/SwarmManager.test.ts +373 -0
  261. package/src/swarm/__tests__/SwarmMembership.prod.test.ts +273 -0
  262. package/src/swarm/__tests__/SwarmMembership.test.ts +264 -0
  263. package/src/swarm/__tests__/VotingRound.prod.test.ts +233 -0
  264. package/src/swarm/__tests__/VotingRound.test.ts +174 -0
  265. package/src/swarm/analytics/SwarmInspector.ts +476 -0
  266. package/src/swarm/analytics/SwarmMetrics.ts +449 -0
  267. package/src/swarm/analytics/__tests__/SwarmInspector.prod.test.ts +366 -0
  268. package/src/swarm/analytics/__tests__/SwarmInspector.test.ts +454 -0
  269. package/src/swarm/analytics/__tests__/SwarmMetrics.prod.test.ts +254 -0
  270. package/src/swarm/analytics/__tests__/SwarmMetrics.test.ts +370 -0
  271. package/src/swarm/analytics/index.ts +7 -0
  272. package/src/swarm/index.ts +69 -0
  273. package/src/swarm/messaging/BroadcastChannel.ts +509 -0
  274. package/src/swarm/messaging/GossipProtocol.ts +565 -0
  275. package/src/swarm/messaging/SwarmEventBus.ts +443 -0
  276. package/src/swarm/messaging/__tests__/BroadcastChannel.prod.test.ts +331 -0
  277. package/src/swarm/messaging/__tests__/BroadcastChannel.test.ts +333 -0
  278. package/src/swarm/messaging/__tests__/GossipProtocol.prod.test.ts +356 -0
  279. package/src/swarm/messaging/__tests__/GossipProtocol.test.ts +437 -0
  280. package/src/swarm/messaging/__tests__/SwarmEventBus.prod.test.ts +191 -0
  281. package/src/swarm/messaging/__tests__/SwarmEventBus.test.ts +247 -0
  282. package/src/swarm/messaging/index.ts +8 -0
  283. package/src/swarm/spatial/FlockingBehavior.ts +462 -0
  284. package/src/swarm/spatial/FormationController.ts +500 -0
  285. package/src/swarm/spatial/Vector3.ts +170 -0
  286. package/src/swarm/spatial/ZoneClaiming.ts +509 -0
  287. package/src/swarm/spatial/__tests__/FlockingBehavior.prod.test.ts +239 -0
  288. package/src/swarm/spatial/__tests__/FlockingBehavior.test.ts +298 -0
  289. package/src/swarm/spatial/__tests__/FormationController.prod.test.ts +240 -0
  290. package/src/swarm/spatial/__tests__/FormationController.test.ts +297 -0
  291. package/src/swarm/spatial/__tests__/Vector3.prod.test.ts +283 -0
  292. package/src/swarm/spatial/__tests__/Vector3.test.ts +224 -0
  293. package/src/swarm/spatial/__tests__/ZoneClaiming.prod.test.ts +246 -0
  294. package/src/swarm/spatial/__tests__/ZoneClaiming.test.ts +374 -0
  295. package/src/swarm/spatial/index.ts +28 -0
  296. package/src/team.ts +1245 -0
  297. package/src/training/LRScheduler.ts +377 -0
  298. package/src/training/QualityScoringPipeline.ts +139 -0
  299. package/src/training/SoftDedup.ts +461 -0
  300. package/src/training/SparsityMonitor.ts +685 -0
  301. package/src/training/SparsityMonitorTypes.ts +209 -0
  302. package/src/training/SpatialTrainingDataGenerator.ts +1526 -0
  303. package/src/training/SpatialTrainingDataTypes.ts +216 -0
  304. package/src/training/TrainingPipelineConfig.ts +215 -0
  305. package/src/training/constants.ts +94 -0
  306. package/src/training/index.ts +138 -0
  307. package/src/training/schema.ts +147 -0
  308. package/src/training/scripts/generate-novel-use-cases-dataset.ts +272 -0
  309. package/src/training/scripts/generate-spatial-dataset.ts +521 -0
  310. package/src/training/training/data/novel-use-cases.jsonl +153 -0
  311. package/src/training/training/data/spatial-reasoning-10k.jsonl +9354 -0
  312. package/src/training/trainingmonkey/TrainingMonkeyIntegration.ts +477 -0
  313. package/src/training/trainingmonkey/TrainingMonkeyTypes.ts +230 -0
  314. package/src/training/trainingmonkey/index.ts +26 -0
  315. package/src/training/trait-mappings.ts +157 -0
  316. package/src/types/core-stubs.d.ts +113 -0
  317. package/src/types.ts +304 -0
  318. package/test-output.txt +0 -0
  319. package/test-result.json +1 -0
  320. package/tsc-errors.txt +4 -0
  321. package/tsc_output.txt +0 -0
  322. package/tsconfig.json +14 -0
  323. package/tsup-learning-esm.config.ts +12 -0
  324. package/tsup.config.ts +21 -0
  325. package/typescript-errors-2.txt +0 -0
  326. package/typescript-errors.txt +22 -0
  327. package/vitest-log-utf8.txt +268 -0
  328. package/vitest-log.txt +0 -0
  329. package/vitest.config.ts +8 -0
@@ -0,0 +1,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
+ }