@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,475 @@
1
+ /**
2
+ * @holoscript/core - Agent Registry
3
+ *
4
+ * Central registry for agent registration, discovery, and health tracking.
5
+ * Part of HoloScript v3.1 Agentic Choreography.
6
+ */
7
+
8
+ import { EventEmitter } from 'events';
9
+ import type { AgentManifest, TrustLevel } from './AgentManifest';
10
+ import { validateManifest } from './AgentManifest';
11
+ import { CapabilityMatcher, type CapabilityQuery, type AgentMatch } from './CapabilityMatcher';
12
+
13
+ // ============================================================================
14
+ // REGISTRY CONFIGURATION
15
+ // ============================================================================
16
+
17
+ /**
18
+ * Discovery mode for the registry
19
+ */
20
+ export type DiscoveryMode = 'central' | 'broadcast' | 'hybrid';
21
+
22
+ /**
23
+ * Registry configuration
24
+ */
25
+ export interface RegistryConfig {
26
+ /** Discovery mode */
27
+ mode: DiscoveryMode;
28
+ /** Default TTL for agent registrations (ms) */
29
+ defaultTTL: number;
30
+ /** Health check interval (ms) */
31
+ healthCheckInterval: number;
32
+ /** Max time before agent is marked offline (ms) */
33
+ offlineThreshold: number;
34
+ /** Whether to auto-cleanup offline agents */
35
+ autoCleanup: boolean;
36
+ /** Cleanup interval (ms) */
37
+ cleanupInterval: number;
38
+ /** Maximum number of agents */
39
+ maxAgents: number;
40
+ /** Minimum trust level for registration */
41
+ minTrustForRegistration: TrustLevel;
42
+ }
43
+
44
+ /**
45
+ * Default configuration
46
+ */
47
+ export const DEFAULT_REGISTRY_CONFIG: RegistryConfig = {
48
+ mode: 'central',
49
+ defaultTTL: 300000, // 5 minutes
50
+ healthCheckInterval: 10000, // 10 seconds
51
+ offlineThreshold: 30000, // 30 seconds
52
+ autoCleanup: true,
53
+ cleanupInterval: 60000, // 1 minute
54
+ maxAgents: 1000,
55
+ minTrustForRegistration: 'external',
56
+ };
57
+
58
+ // ============================================================================
59
+ // REGISTRY EVENTS
60
+ // ============================================================================
61
+
62
+ /**
63
+ * Registry event types
64
+ */
65
+ export interface RegistryEvents {
66
+ 'agent:registered': (manifest: AgentManifest) => void;
67
+ 'agent:deregistered': (agentId: string, reason: string) => void;
68
+ 'agent:online': (agentId: string) => void;
69
+ 'agent:offline': (agentId: string) => void;
70
+ 'agent:degraded': (agentId: string) => void;
71
+ 'agent:updated': (manifest: AgentManifest) => void;
72
+ 'registry:cleanup': (removedCount: number) => void;
73
+ 'registry:error': (error: Error) => void;
74
+ }
75
+
76
+ // ============================================================================
77
+ // AGENT ENTRY
78
+ // ============================================================================
79
+
80
+ /**
81
+ * Internal agent entry with metadata
82
+ */
83
+ interface AgentEntry {
84
+ manifest: AgentManifest;
85
+ registeredAt: number;
86
+ lastHeartbeat: number;
87
+ heartbeatCount: number;
88
+ missedHeartbeats: number;
89
+ ttl: number;
90
+ }
91
+
92
+ // ============================================================================
93
+ // AGENT REGISTRY
94
+ // ============================================================================
95
+
96
+ /**
97
+ * Central registry for agent registration and discovery
98
+ */
99
+ export class AgentRegistry extends EventEmitter {
100
+ private agents: Map<string, AgentEntry> = new Map();
101
+ private matcher: CapabilityMatcher = new CapabilityMatcher();
102
+ private config: RegistryConfig;
103
+ private healthCheckTimer?: ReturnType<typeof setInterval>;
104
+ private cleanupTimer?: ReturnType<typeof setInterval>;
105
+ private isShuttingDown = false;
106
+
107
+ constructor(config: Partial<RegistryConfig> = {}) {
108
+ super();
109
+ this.config = { ...DEFAULT_REGISTRY_CONFIG, ...config };
110
+ }
111
+
112
+ // ==========================================================================
113
+ // LIFECYCLE
114
+ // ==========================================================================
115
+
116
+ /**
117
+ * Start the registry (begins health checks and cleanup)
118
+ */
119
+ start(): void {
120
+ if (this.isShuttingDown) {
121
+ throw new Error('Registry is shutting down');
122
+ }
123
+
124
+ // Start health check timer
125
+ this.healthCheckTimer = setInterval(() => {
126
+ this.performHealthCheck();
127
+ }, this.config.healthCheckInterval);
128
+
129
+ // Start cleanup timer if enabled
130
+ if (this.config.autoCleanup) {
131
+ this.cleanupTimer = setInterval(() => {
132
+ this.cleanup();
133
+ }, this.config.cleanupInterval);
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Stop the registry
139
+ */
140
+ stop(): void {
141
+ this.isShuttingDown = true;
142
+
143
+ if (this.healthCheckTimer) {
144
+ clearInterval(this.healthCheckTimer);
145
+ this.healthCheckTimer = undefined;
146
+ }
147
+
148
+ if (this.cleanupTimer) {
149
+ clearInterval(this.cleanupTimer);
150
+ this.cleanupTimer = undefined;
151
+ }
152
+ }
153
+
154
+ /**
155
+ * Clear all agents and reset
156
+ */
157
+ clear(): void {
158
+ this.agents.clear();
159
+ }
160
+
161
+ // ==========================================================================
162
+ // REGISTRATION
163
+ // ==========================================================================
164
+
165
+ /**
166
+ * Register an agent
167
+ */
168
+ async register(manifest: AgentManifest): Promise<void> {
169
+ if (this.isShuttingDown) {
170
+ throw new Error('Registry is shutting down');
171
+ }
172
+
173
+ // Validate manifest
174
+ const validation = validateManifest(manifest);
175
+ if (!validation.valid) {
176
+ throw new Error(`Invalid manifest: ${validation.errors.join(', ')}`);
177
+ }
178
+
179
+ // Check trust level
180
+ const trustLevels: TrustLevel[] = ['local', 'verified', 'known', 'external', 'untrusted'];
181
+ const minTrustIndex = trustLevels.indexOf(this.config.minTrustForRegistration);
182
+ const agentTrustIndex = trustLevels.indexOf(manifest.trustLevel);
183
+ if (agentTrustIndex > minTrustIndex) {
184
+ throw new Error(
185
+ `Trust level ${manifest.trustLevel} does not meet minimum ${this.config.minTrustForRegistration}`
186
+ );
187
+ }
188
+
189
+ // Check max agents
190
+ if (this.agents.size >= this.config.maxAgents && !this.agents.has(manifest.id)) {
191
+ throw new Error(`Registry full: maximum ${this.config.maxAgents} agents`);
192
+ }
193
+
194
+ const now = Date.now();
195
+ const entry: AgentEntry = {
196
+ manifest: {
197
+ ...manifest,
198
+ registeredAt: now,
199
+ updatedAt: now,
200
+ lastHeartbeat: now,
201
+ status: 'online',
202
+ },
203
+ registeredAt: now,
204
+ lastHeartbeat: now,
205
+ heartbeatCount: 0,
206
+ missedHeartbeats: 0,
207
+ ttl: manifest.healthCheckInterval || this.config.defaultTTL,
208
+ };
209
+
210
+ const isUpdate = this.agents.has(manifest.id);
211
+ this.agents.set(manifest.id, entry);
212
+
213
+ if (isUpdate) {
214
+ this.emit('agent:updated', entry.manifest);
215
+ } else {
216
+ this.emit('agent:registered', entry.manifest);
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Deregister an agent
222
+ */
223
+ async deregister(agentId: string): Promise<void> {
224
+ const entry = this.agents.get(agentId);
225
+ if (entry) {
226
+ this.agents.delete(agentId);
227
+ this.emit('agent:deregistered', agentId, 'explicit');
228
+ }
229
+ }
230
+
231
+ /**
232
+ * Update an agent's heartbeat
233
+ */
234
+ async heartbeat(agentId: string): Promise<void> {
235
+ const entry = this.agents.get(agentId);
236
+ if (!entry) {
237
+ throw new Error(`Agent not found: ${agentId}`);
238
+ }
239
+
240
+ const now = Date.now();
241
+ const wasOffline = entry.manifest.status === 'offline';
242
+
243
+ entry.lastHeartbeat = now;
244
+ entry.heartbeatCount++;
245
+ entry.missedHeartbeats = 0;
246
+ entry.manifest.lastHeartbeat = now;
247
+ entry.manifest.status = 'online';
248
+
249
+ if (wasOffline) {
250
+ this.emit('agent:online', agentId);
251
+ }
252
+ }
253
+
254
+ // ==========================================================================
255
+ // DISCOVERY
256
+ // ==========================================================================
257
+
258
+ /**
259
+ * Discover agents matching a capability query
260
+ */
261
+ async discover(query: CapabilityQuery): Promise<AgentManifest[]> {
262
+ const manifests = this.getAllManifests();
263
+ const matches = this.matcher.findMatches(manifests, query);
264
+ return matches.map((m) => m.manifest);
265
+ }
266
+
267
+ /**
268
+ * Discover agents with full match details
269
+ */
270
+ async discoverWithScores(query: CapabilityQuery): Promise<AgentMatch[]> {
271
+ const manifests = this.getAllManifests();
272
+ return this.matcher.findMatches(manifests, query);
273
+ }
274
+
275
+ /**
276
+ * Find the best agent for a query
277
+ */
278
+ async findBest(query: CapabilityQuery): Promise<AgentManifest | null> {
279
+ const manifests = this.getAllManifests();
280
+ const match = this.matcher.findBest(manifests, query);
281
+ return match?.manifest || null;
282
+ }
283
+
284
+ /**
285
+ * Get a specific agent by ID
286
+ */
287
+ get(agentId: string): AgentManifest | undefined {
288
+ return this.agents.get(agentId)?.manifest;
289
+ }
290
+
291
+ /**
292
+ * Check if an agent is registered
293
+ */
294
+ has(agentId: string): boolean {
295
+ return this.agents.has(agentId);
296
+ }
297
+
298
+ /**
299
+ * Get all registered manifests
300
+ */
301
+ getAllManifests(): AgentManifest[] {
302
+ return Array.from(this.agents.values()).map((e) => e.manifest);
303
+ }
304
+
305
+ /**
306
+ * Get count of registered agents
307
+ */
308
+ get size(): number {
309
+ return this.agents.size;
310
+ }
311
+
312
+ /**
313
+ * Get count by status
314
+ */
315
+ getStatusCounts(): Record<string, number> {
316
+ const counts: Record<string, number> = {
317
+ online: 0,
318
+ offline: 0,
319
+ degraded: 0,
320
+ unknown: 0,
321
+ };
322
+
323
+ for (const entry of this.agents.values()) {
324
+ const status = entry.manifest.status || 'unknown';
325
+ counts[status] = (counts[status] || 0) + 1;
326
+ }
327
+
328
+ return counts;
329
+ }
330
+
331
+ // ==========================================================================
332
+ // HEALTH CHECKS
333
+ // ==========================================================================
334
+
335
+ /**
336
+ * Perform health check on all agents
337
+ */
338
+ private performHealthCheck(): void {
339
+ const now = Date.now();
340
+
341
+ for (const [agentId, entry] of this.agents) {
342
+ const timeSinceHeartbeat = now - entry.lastHeartbeat;
343
+
344
+ if (timeSinceHeartbeat > this.config.offlineThreshold) {
345
+ const wasOnline = entry.manifest.status === 'online';
346
+ entry.manifest.status = 'offline';
347
+ entry.missedHeartbeats++;
348
+
349
+ if (wasOnline) {
350
+ this.emit('agent:offline', agentId);
351
+ }
352
+ } else if (timeSinceHeartbeat > this.config.healthCheckInterval * 2) {
353
+ const wasOnline = entry.manifest.status === 'online';
354
+ entry.manifest.status = 'degraded';
355
+
356
+ if (wasOnline) {
357
+ this.emit('agent:degraded', agentId);
358
+ }
359
+ }
360
+ }
361
+ }
362
+
363
+ /**
364
+ * Cleanup expired/offline agents
365
+ */
366
+ private cleanup(): void {
367
+ const now = Date.now();
368
+ let removedCount = 0;
369
+
370
+ for (const [agentId, entry] of this.agents) {
371
+ const _age = now - entry.registeredAt;
372
+ const timeSinceHeartbeat = now - entry.lastHeartbeat;
373
+
374
+ // Remove if TTL exceeded and offline
375
+ if (entry.manifest.status === 'offline' && timeSinceHeartbeat > entry.ttl) {
376
+ this.agents.delete(agentId);
377
+ this.emit('agent:deregistered', agentId, 'ttl-expired');
378
+ removedCount++;
379
+ }
380
+ }
381
+
382
+ if (removedCount > 0) {
383
+ this.emit('registry:cleanup', removedCount);
384
+ }
385
+ }
386
+
387
+ // ==========================================================================
388
+ // QUERIES
389
+ // ==========================================================================
390
+
391
+ /**
392
+ * Find agents by trust level
393
+ */
394
+ findByTrust(trustLevel: TrustLevel): AgentManifest[] {
395
+ return this.getAllManifests().filter((m) => m.trustLevel === trustLevel);
396
+ }
397
+
398
+ /**
399
+ * Find agents by tag
400
+ */
401
+ findByTag(tag: string): AgentManifest[] {
402
+ return this.getAllManifests().filter((m) => m.tags?.includes(tag));
403
+ }
404
+
405
+ /**
406
+ * Find online agents
407
+ */
408
+ findOnline(): AgentManifest[] {
409
+ return this.getAllManifests().filter((m) => m.status === 'online');
410
+ }
411
+
412
+ /**
413
+ * Find agents in a scene
414
+ */
415
+ findInScene(scene: string): AgentManifest[] {
416
+ return this.getAllManifests().filter(
417
+ (m) => m.spatialScope?.scene === scene || m.spatialScope?.global
418
+ );
419
+ }
420
+
421
+ // ==========================================================================
422
+ // SERIALIZATION
423
+ // ==========================================================================
424
+
425
+ /**
426
+ * Export registry state
427
+ */
428
+ export(): {
429
+ agents: AgentManifest[];
430
+ config: RegistryConfig;
431
+ timestamp: number;
432
+ } {
433
+ return {
434
+ agents: this.getAllManifests(),
435
+ config: this.config,
436
+ timestamp: Date.now(),
437
+ };
438
+ }
439
+
440
+ /**
441
+ * Import registry state
442
+ */
443
+ async import(data: { agents: AgentManifest[] }): Promise<void> {
444
+ for (const manifest of data.agents) {
445
+ await this.register(manifest);
446
+ }
447
+ }
448
+ }
449
+
450
+ // ============================================================================
451
+ // SINGLETON INSTANCE
452
+ // ============================================================================
453
+
454
+ let defaultRegistry: AgentRegistry | null = null;
455
+
456
+ /**
457
+ * Get or create the default registry instance
458
+ */
459
+ export function getDefaultRegistry(config?: Partial<RegistryConfig>): AgentRegistry {
460
+ if (!defaultRegistry) {
461
+ defaultRegistry = new AgentRegistry(config);
462
+ }
463
+ return defaultRegistry;
464
+ }
465
+
466
+ /**
467
+ * Reset the default registry
468
+ */
469
+ export function resetDefaultRegistry(): void {
470
+ if (defaultRegistry) {
471
+ defaultRegistry.stop();
472
+ defaultRegistry.clear();
473
+ defaultRegistry = null;
474
+ }
475
+ }