@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,429 @@
1
+ /**
2
+ * @holoscript/core - Federated Registry Adapter
3
+ *
4
+ * Extends the AgentRegistry with cross-composition discovery by
5
+ * fetching remote A2A Agent Cards from /.well-known/agent-card.json
6
+ * endpoints and converting them to AgentManifest entries.
7
+ *
8
+ * Part of HoloScript v5.5 "Agents as Universal Orchestrators".
9
+ */
10
+
11
+ import type { AgentManifest, TrustLevel, AgentCapability, AgentEndpoint } from './AgentManifest';
12
+ import type { AgentRegistry } from './AgentRegistry';
13
+ import type { CapabilityQuery, AgentMatch } from './CapabilityMatcher';
14
+
15
+ // =============================================================================
16
+ // A2A AGENT CARD TYPES (subset needed for conversion)
17
+ // =============================================================================
18
+
19
+ /**
20
+ * Minimal A2A AgentCard shape for federation.
21
+ * Matches the full AgentCard type in packages/mcp-server/src/a2a.ts.
22
+ */
23
+ export interface A2AAgentCard {
24
+ id: string;
25
+ name: string;
26
+ description?: string;
27
+ endpoint: string;
28
+ version: string;
29
+ provider?: { organization: string; url: string };
30
+ capabilities?: {
31
+ streaming?: boolean;
32
+ pushNotifications?: boolean;
33
+ stateTransitionHistory?: boolean;
34
+ };
35
+ skills?: A2ASkill[];
36
+ }
37
+
38
+ export interface A2ASkill {
39
+ id: string;
40
+ name: string;
41
+ description?: string;
42
+ tags?: string[];
43
+ inputModes?: string[];
44
+ outputModes?: string[];
45
+ }
46
+
47
+ // =============================================================================
48
+ // CONFIGURATION
49
+ // =============================================================================
50
+
51
+ export interface FederatedRegistryConfig {
52
+ /** Remote agent-card.json URLs to poll */
53
+ seedUrls: string[];
54
+ /** Poll interval in ms (default 60_000) */
55
+ pollIntervalMs: number;
56
+ /** Maximum remote agents to track (default 100) */
57
+ maxRemoteAgents: number;
58
+ /** Trust level assigned to remote agents (default 'external') */
59
+ trustRemoteAs: TrustLevel;
60
+ /** HTTP fetch timeout in ms (default 5_000) */
61
+ timeout: number;
62
+ /** Custom fetch function (for testing) */
63
+ fetchFn?: (url: string, init?: RequestInit) => Promise<Response>;
64
+ }
65
+
66
+ const DEFAULT_CONFIG: FederatedRegistryConfig = {
67
+ seedUrls: [],
68
+ pollIntervalMs: 60_000,
69
+ maxRemoteAgents: 100,
70
+ trustRemoteAs: 'external',
71
+ timeout: 5_000,
72
+ };
73
+
74
+ // =============================================================================
75
+ // TAG-TO-CAPABILITY MAPPING
76
+ // =============================================================================
77
+
78
+ const TAG_TO_TYPE: Record<string, string> = {
79
+ parsing: 'analyze',
80
+ validation: 'validate',
81
+ compilation: 'transform',
82
+ generation: 'generate',
83
+ rendering: 'render',
84
+ analysis: 'analyze',
85
+ optimization: 'optimize',
86
+ storage: 'store',
87
+ retrieval: 'retrieve',
88
+ orchestration: 'orchestrate',
89
+ detection: 'detect',
90
+ communication: 'communicate',
91
+ };
92
+
93
+ const TAG_TO_DOMAIN: Record<string, string> = {
94
+ spatial: 'spatial',
95
+ '3d': 'spatial',
96
+ vr: 'spatial',
97
+ ar: 'spatial',
98
+ nlp: 'nlp',
99
+ language: 'nlp',
100
+ vision: 'vision',
101
+ blockchain: 'blockchain',
102
+ web3: 'blockchain',
103
+ audio: 'audio',
104
+ video: 'video',
105
+ physics: 'physics',
106
+ network: 'networking',
107
+ security: 'security',
108
+ trading: 'trading',
109
+ social: 'social',
110
+ gaming: 'gaming',
111
+ };
112
+
113
+ // =============================================================================
114
+ // FEDERATED REGISTRY ADAPTER
115
+ // =============================================================================
116
+
117
+ export class FederatedRegistryAdapter {
118
+ private registry: AgentRegistry;
119
+ private config: FederatedRegistryConfig;
120
+ private pollTimer?: ReturnType<typeof setInterval>;
121
+ private remoteAgentIds: Set<string> = new Set();
122
+ private lastPollResults: Map<string, { timestamp: number; success: boolean }> = new Map();
123
+
124
+ constructor(registry: AgentRegistry, config: Partial<FederatedRegistryConfig> = {}) {
125
+ this.registry = registry;
126
+ this.config = { ...DEFAULT_CONFIG, ...config };
127
+ }
128
+
129
+ // ===========================================================================
130
+ // CORE: FETCH & REGISTER
131
+ // ===========================================================================
132
+
133
+ /**
134
+ * Fetch a remote agent card and register it into the local registry.
135
+ * Returns the converted manifest on success, null on failure.
136
+ */
137
+ async fetchAndRegister(url: string): Promise<AgentManifest | null> {
138
+ try {
139
+ const card = await this.fetchAgentCard(url);
140
+ if (!card || !card.id || !card.name) {
141
+ this.lastPollResults.set(url, { timestamp: Date.now(), success: false });
142
+ return null;
143
+ }
144
+
145
+ // Capacity check
146
+ if (
147
+ this.remoteAgentIds.size >= this.config.maxRemoteAgents &&
148
+ !this.remoteAgentIds.has(card.id)
149
+ ) {
150
+ this.lastPollResults.set(url, { timestamp: Date.now(), success: false });
151
+ return null;
152
+ }
153
+
154
+ const manifest = this.a2aCardToManifest(card, url);
155
+ await this.registry.register(manifest);
156
+ this.remoteAgentIds.add(card.id);
157
+ this.lastPollResults.set(url, { timestamp: Date.now(), success: true });
158
+ return manifest;
159
+ } catch {
160
+ this.lastPollResults.set(url, { timestamp: Date.now(), success: false });
161
+ return null;
162
+ }
163
+ }
164
+
165
+ /**
166
+ * Poll all seed URLs once. Returns summary of results.
167
+ */
168
+ async pollAll(): Promise<{ added: number; updated: number; failed: string[] }> {
169
+ let added = 0;
170
+ let updated = 0;
171
+ const failed: string[] = [];
172
+
173
+ const results = await Promise.allSettled(
174
+ this.config.seedUrls.map(async (url) => {
175
+ const wasKnown = this.isKnownUrl(url);
176
+ const manifest = await this.fetchAndRegister(url);
177
+ if (manifest) {
178
+ if (wasKnown) {
179
+ updated++;
180
+ } else {
181
+ added++;
182
+ }
183
+ } else {
184
+ failed.push(url);
185
+ }
186
+ })
187
+ );
188
+
189
+ return { added, updated, failed };
190
+ }
191
+
192
+ // ===========================================================================
193
+ // POLLING LIFECYCLE
194
+ // ===========================================================================
195
+
196
+ /**
197
+ * Start periodic polling of seed URLs.
198
+ */
199
+ startPolling(): void {
200
+ if (this.pollTimer) return;
201
+ this.pollTimer = setInterval(() => {
202
+ void this.pollAll();
203
+ }, this.config.pollIntervalMs);
204
+ }
205
+
206
+ /**
207
+ * Stop periodic polling.
208
+ */
209
+ stopPolling(): void {
210
+ if (this.pollTimer) {
211
+ clearInterval(this.pollTimer);
212
+ this.pollTimer = undefined;
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Whether polling is currently active.
218
+ */
219
+ get isPolling(): boolean {
220
+ return this.pollTimer !== undefined;
221
+ }
222
+
223
+ // ===========================================================================
224
+ // CONVERSION: A2A AgentCard → AgentManifest
225
+ // ===========================================================================
226
+
227
+ /**
228
+ * Convert an A2A AgentCard to an AgentManifest.
229
+ */
230
+ a2aCardToManifest(card: A2AAgentCard, sourceUrl: string): AgentManifest {
231
+ const capabilities = this.extractCapabilities(card);
232
+ const endpoint = this.extractEndpoint(card);
233
+
234
+ return {
235
+ id: card.id,
236
+ name: card.name,
237
+ version: card.version || '0.0.0',
238
+ description: card.description,
239
+ capabilities,
240
+ endpoints: [endpoint],
241
+ trustLevel: this.config.trustRemoteAs,
242
+ tags: ['remote', 'a2a', ...(card.provider?.organization ? [card.provider.organization] : [])],
243
+ status: 'online',
244
+ metadata: {
245
+ sourceUrl,
246
+ a2aEndpoint: card.endpoint,
247
+ provider: card.provider,
248
+ a2aCapabilities: card.capabilities,
249
+ skillCount: card.skills?.length ?? 0,
250
+ },
251
+ };
252
+ }
253
+
254
+ // ===========================================================================
255
+ // FEDERATED DISCOVERY
256
+ // ===========================================================================
257
+
258
+ /**
259
+ * Discover agents across local registry + remote seeds.
260
+ * Ensures all seed URLs are polled before querying.
261
+ */
262
+ async discoverFederated(query: CapabilityQuery): Promise<AgentMatch[]> {
263
+ // Ensure remote agents are loaded
264
+ if (this.remoteAgentIds.size === 0 && this.config.seedUrls.length > 0) {
265
+ await this.pollAll();
266
+ }
267
+
268
+ // The registry now contains both local and remote agents
269
+ return this.registry.discoverWithScores(query);
270
+ }
271
+
272
+ // ===========================================================================
273
+ // QUERIES
274
+ // ===========================================================================
275
+
276
+ /**
277
+ * Get all remote agent IDs tracked by this adapter.
278
+ */
279
+ getRemoteAgentIds(): string[] {
280
+ return Array.from(this.remoteAgentIds);
281
+ }
282
+
283
+ /**
284
+ * Get the number of remote agents currently tracked.
285
+ */
286
+ get remoteAgentCount(): number {
287
+ return this.remoteAgentIds.size;
288
+ }
289
+
290
+ /**
291
+ * Get poll results for a specific URL.
292
+ */
293
+ getPollResult(url: string): { timestamp: number; success: boolean } | undefined {
294
+ return this.lastPollResults.get(url);
295
+ }
296
+
297
+ /**
298
+ * Add a seed URL dynamically (does not trigger immediate poll).
299
+ */
300
+ addSeedUrl(url: string): void {
301
+ if (!this.config.seedUrls.includes(url)) {
302
+ this.config.seedUrls.push(url);
303
+ }
304
+ }
305
+
306
+ /**
307
+ * Remove a seed URL and optionally deregister its agent.
308
+ */
309
+ async removeSeedUrl(url: string, deregister = true): Promise<void> {
310
+ this.config.seedUrls = this.config.seedUrls.filter((u) => u !== url);
311
+ if (deregister) {
312
+ // Find the agent registered from this URL and remove it
313
+ for (const agentId of this.remoteAgentIds) {
314
+ const manifest = this.registry.get(agentId);
315
+ if (manifest?.metadata?.sourceUrl === url) {
316
+ await this.registry.deregister(agentId);
317
+ this.remoteAgentIds.delete(agentId);
318
+ break;
319
+ }
320
+ }
321
+ }
322
+ }
323
+
324
+ // ===========================================================================
325
+ // PRIVATE HELPERS
326
+ // ===========================================================================
327
+
328
+ /**
329
+ * Fetch an agent card from a URL.
330
+ */
331
+ private async fetchAgentCard(url: string): Promise<A2AAgentCard | null> {
332
+ const fetchFn = this.config.fetchFn || globalThis.fetch;
333
+ const controller = new AbortController();
334
+ const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
335
+
336
+ try {
337
+ const response = await fetchFn(url, {
338
+ signal: controller.signal,
339
+ headers: { Accept: 'application/json' },
340
+ });
341
+
342
+ if (!response.ok) {
343
+ return null;
344
+ }
345
+
346
+ const data = (await response.json()) as A2AAgentCard;
347
+ return data;
348
+ } catch {
349
+ return null;
350
+ } finally {
351
+ clearTimeout(timeoutId);
352
+ }
353
+ }
354
+
355
+ /**
356
+ * Extract capabilities from an A2A AgentCard's skills.
357
+ */
358
+ private extractCapabilities(card: A2AAgentCard): AgentCapability[] {
359
+ if (!card.skills || card.skills.length === 0) {
360
+ return [{ type: 'custom', domain: 'general', name: card.name }];
361
+ }
362
+
363
+ // Deduplicate by type+domain pairs derived from skill tags
364
+ const capMap = new Map<string, AgentCapability>();
365
+
366
+ for (const skill of card.skills) {
367
+ const tags = skill.tags || [];
368
+ const type = this.deriveType(tags);
369
+ const domain = this.deriveDomain(tags);
370
+ const key = `${type}:${domain}`;
371
+
372
+ if (!capMap.has(key)) {
373
+ capMap.set(key, {
374
+ type,
375
+ domain,
376
+ name: skill.name,
377
+ description: skill.description,
378
+ available: true,
379
+ });
380
+ }
381
+ }
382
+
383
+ return Array.from(capMap.values());
384
+ }
385
+
386
+ /**
387
+ * Extract endpoint from an A2A AgentCard.
388
+ */
389
+ private extractEndpoint(card: A2AAgentCard): AgentEndpoint {
390
+ const url = card.endpoint || '';
391
+ const isSecure = url.startsWith('https');
392
+ return {
393
+ protocol: isSecure ? 'https' : 'http',
394
+ address: url,
395
+ primary: true,
396
+ formats: ['json'],
397
+ };
398
+ }
399
+
400
+ /**
401
+ * Derive capability type from A2A skill tags.
402
+ */
403
+ private deriveType(tags: string[]): string {
404
+ for (const tag of tags) {
405
+ const mapped = TAG_TO_TYPE[tag.toLowerCase()];
406
+ if (mapped) return mapped;
407
+ }
408
+ return 'custom';
409
+ }
410
+
411
+ /**
412
+ * Derive capability domain from A2A skill tags.
413
+ */
414
+ private deriveDomain(tags: string[]): string {
415
+ for (const tag of tags) {
416
+ const mapped = TAG_TO_DOMAIN[tag.toLowerCase()];
417
+ if (mapped) return mapped;
418
+ }
419
+ return 'general';
420
+ }
421
+
422
+ /**
423
+ * Check if a URL has been successfully polled before.
424
+ */
425
+ private isKnownUrl(url: string): boolean {
426
+ const result = this.lastPollResults.get(url);
427
+ return !!result?.success;
428
+ }
429
+ }