@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,453 @@
1
+ /**
2
+ * @holoscript/core - Capability Matcher
3
+ *
4
+ * Matches capability queries against agent manifests.
5
+ * Part of HoloScript v3.1 Agentic Choreography.
6
+ */
7
+
8
+ import type {
9
+ AgentManifest,
10
+ AgentCapability,
11
+ CapabilityType,
12
+ CapabilityDomain,
13
+ LatencyProfile,
14
+ TrustLevel,
15
+ SpatialScope,
16
+ Vector3,
17
+ LATENCY_THRESHOLDS as _LATENCY_THRESHOLDS,
18
+ } from './AgentManifest';
19
+
20
+ // ============================================================================
21
+ // CAPABILITY QUERY
22
+ // ============================================================================
23
+
24
+ /**
25
+ * Query for finding agents with specific capabilities
26
+ */
27
+ export interface CapabilityQuery {
28
+ /** Required capability type(s) */
29
+ type?: CapabilityType | CapabilityType[] | string | string[];
30
+ /** Required domain(s) */
31
+ domain?: CapabilityDomain | CapabilityDomain[] | string | string[];
32
+ /** Maximum acceptable latency */
33
+ maxLatency?: LatencyProfile;
34
+ /** Minimum required trust level */
35
+ minTrust?: TrustLevel;
36
+ /** Spatial requirements */
37
+ spatial?: SpatialQuery;
38
+ /** Required tags */
39
+ tags?: string[];
40
+ /** Custom filters */
41
+ filters?: Record<string, unknown>;
42
+ /** Maximum results to return */
43
+ limit?: number;
44
+ /** Whether to include offline agents */
45
+ includeOffline?: boolean;
46
+ /** Sort order */
47
+ sortBy?: 'latency' | 'trust' | 'priority' | 'name';
48
+ /** Sort direction */
49
+ sortOrder?: 'asc' | 'desc';
50
+ }
51
+
52
+ /**
53
+ * Spatial query for location-aware discovery
54
+ */
55
+ export interface SpatialQuery {
56
+ /** Point that must be within agent's scope */
57
+ point?: Vector3;
58
+ /** Scene/world filter */
59
+ scene?: string;
60
+ /** Node IDs to check */
61
+ nodes?: string[];
62
+ /** Minimum overlap with bounding box */
63
+ overlaps?: { min: Vector3; max: Vector3 };
64
+ /** Require global scope */
65
+ requireGlobal?: boolean;
66
+ }
67
+
68
+ // ============================================================================
69
+ // MATCH RESULT
70
+ // ============================================================================
71
+
72
+ /**
73
+ * Individual capability match result
74
+ */
75
+ export interface CapabilityMatch {
76
+ /** The matched capability */
77
+ capability: AgentCapability;
78
+ /** Match score (0-1) */
79
+ score: number;
80
+ /** Which query criteria matched */
81
+ matchedCriteria: string[];
82
+ }
83
+
84
+ /**
85
+ * Agent match result with scoring
86
+ */
87
+ export interface AgentMatch {
88
+ /** The matched agent manifest */
89
+ manifest: AgentManifest;
90
+ /** Overall match score (0-1) */
91
+ score: number;
92
+ /** Individual capability matches */
93
+ capabilities: CapabilityMatch[];
94
+ /** Why this agent matched */
95
+ reasons: string[];
96
+ }
97
+
98
+ // ============================================================================
99
+ // TRUST LEVEL ORDERING
100
+ // ============================================================================
101
+
102
+ const TRUST_LEVELS: TrustLevel[] = ['local', 'verified', 'known', 'external', 'untrusted'];
103
+
104
+ function getTrustScore(level: TrustLevel): number {
105
+ const index = TRUST_LEVELS.indexOf(level);
106
+ return index >= 0 ? (TRUST_LEVELS.length - index) / TRUST_LEVELS.length : 0;
107
+ }
108
+
109
+ function meetsMinTrust(agentTrust: TrustLevel, minTrust: TrustLevel): boolean {
110
+ return TRUST_LEVELS.indexOf(agentTrust) <= TRUST_LEVELS.indexOf(minTrust);
111
+ }
112
+
113
+ // ============================================================================
114
+ // LATENCY SCORING
115
+ // ============================================================================
116
+
117
+ const LATENCY_ORDER: LatencyProfile[] = ['instant', 'fast', 'medium', 'slow', 'background'];
118
+
119
+ function getLatencyScore(profile: LatencyProfile): number {
120
+ const index = LATENCY_ORDER.indexOf(profile);
121
+ return index >= 0 ? (LATENCY_ORDER.length - index) / LATENCY_ORDER.length : 0;
122
+ }
123
+
124
+ function meetsMaxLatency(
125
+ capLatency: LatencyProfile | undefined,
126
+ maxLatency: LatencyProfile
127
+ ): boolean {
128
+ if (!capLatency) return true; // Unknown latency is allowed
129
+ return LATENCY_ORDER.indexOf(capLatency) <= LATENCY_ORDER.indexOf(maxLatency);
130
+ }
131
+
132
+ // ============================================================================
133
+ // SPATIAL MATCHING
134
+ // ============================================================================
135
+
136
+ function pointInBounds(point: Vector3, min: Vector3, max: Vector3): boolean {
137
+ return (
138
+ point.x >= min.x &&
139
+ point.x <= max.x &&
140
+ point.y >= min.y &&
141
+ point.y <= max.y &&
142
+ point.z >= min.z &&
143
+ point.z <= max.z
144
+ );
145
+ }
146
+
147
+ function boundsOverlap(
148
+ a: { min: Vector3; max: Vector3 },
149
+ b: { min: Vector3; max: Vector3 }
150
+ ): boolean {
151
+ return (
152
+ a.min.x <= b.max.x &&
153
+ a.max.x >= b.min.x &&
154
+ a.min.y <= b.max.y &&
155
+ a.max.y >= b.min.y &&
156
+ a.min.z <= b.max.z &&
157
+ a.max.z >= b.min.z
158
+ );
159
+ }
160
+
161
+ function matchesSpatialQuery(scope: SpatialScope | undefined, query: SpatialQuery): boolean {
162
+ // Global scope matches everything
163
+ if (scope?.global) return true;
164
+
165
+ // If no scope defined and query has requirements, only match if requireGlobal
166
+ if (!scope) return query.requireGlobal !== true;
167
+
168
+ // Check point containment
169
+ if (query.point && scope.bounds) {
170
+ if (!pointInBounds(query.point, scope.bounds.min, scope.bounds.max)) {
171
+ return false;
172
+ }
173
+ }
174
+
175
+ // Check radius containment
176
+ if (query.point && scope.radius) {
177
+ const dx = query.point.x - scope.radius.center.x;
178
+ const dy = query.point.y - scope.radius.center.y;
179
+ const dz = query.point.z - scope.radius.center.z;
180
+ const distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
181
+ if (distance > scope.radius.distance) return false;
182
+ }
183
+
184
+ // Check scene match
185
+ if (query.scene && scope.scene && scope.scene !== query.scene) {
186
+ return false;
187
+ }
188
+
189
+ // Check node overlap
190
+ if (query.nodes && scope.nodes) {
191
+ const hasOverlap = query.nodes.some((n) => scope.nodes!.includes(n));
192
+ if (!hasOverlap) return false;
193
+ }
194
+
195
+ // Check bounding box overlap
196
+ if (query.overlaps && scope.bounds) {
197
+ if (!boundsOverlap(scope.bounds, query.overlaps)) {
198
+ return false;
199
+ }
200
+ }
201
+
202
+ return true;
203
+ }
204
+
205
+ // ============================================================================
206
+ // CAPABILITY MATCHER
207
+ // ============================================================================
208
+
209
+ /**
210
+ * Matches capability queries against agent manifests
211
+ */
212
+ export class CapabilityMatcher {
213
+ /**
214
+ * Check if a capability matches the query
215
+ */
216
+ matchCapability(capability: AgentCapability, query: CapabilityQuery): CapabilityMatch | null {
217
+ const matchedCriteria: string[] = [];
218
+ let score = 0;
219
+ let criteriaCount = 0;
220
+
221
+ // Type matching
222
+ if (query.type) {
223
+ criteriaCount++;
224
+ const types = Array.isArray(query.type) ? query.type : [query.type];
225
+ if (types.includes(capability.type as CapabilityType)) {
226
+ matchedCriteria.push('type');
227
+ score += 1;
228
+ } else {
229
+ return null; // Type is a hard requirement
230
+ }
231
+ }
232
+
233
+ // Domain matching
234
+ if (query.domain) {
235
+ criteriaCount++;
236
+ const domains = Array.isArray(query.domain) ? query.domain : [query.domain];
237
+ if (domains.includes(capability.domain as CapabilityDomain)) {
238
+ matchedCriteria.push('domain');
239
+ score += 1;
240
+ } else {
241
+ return null; // Domain is a hard requirement
242
+ }
243
+ }
244
+
245
+ // Latency matching
246
+ if (query.maxLatency && capability.latency) {
247
+ criteriaCount++;
248
+ if (meetsMaxLatency(capability.latency, query.maxLatency)) {
249
+ matchedCriteria.push('latency');
250
+ score += getLatencyScore(capability.latency);
251
+ } else {
252
+ return null; // Latency is a hard requirement
253
+ }
254
+ }
255
+
256
+ // Availability check
257
+ if (capability.available === false) {
258
+ return null;
259
+ }
260
+
261
+ // If no criteria matched and we had criteria, this is not a match
262
+ if (criteriaCount > 0 && matchedCriteria.length === 0) {
263
+ return null;
264
+ }
265
+
266
+ // Normalize score
267
+ const normalizedScore = criteriaCount > 0 ? score / criteriaCount : 1;
268
+
269
+ // Add priority bonus
270
+ const priorityBonus = (capability.priority || 0) / 100;
271
+
272
+ return {
273
+ capability,
274
+ score: Math.min(normalizedScore + priorityBonus, 1),
275
+ matchedCriteria,
276
+ };
277
+ }
278
+
279
+ /**
280
+ * Check if an agent matches the query
281
+ */
282
+ matchAgent(manifest: AgentManifest, query: CapabilityQuery): AgentMatch | null {
283
+ const reasons: string[] = [];
284
+
285
+ // Offline check
286
+ if (!query.includeOffline && manifest.status === 'offline') {
287
+ return null;
288
+ }
289
+
290
+ // Trust level check
291
+ if (query.minTrust && !meetsMinTrust(manifest.trustLevel, query.minTrust)) {
292
+ return null;
293
+ }
294
+
295
+ // Spatial check
296
+ if (query.spatial && !matchesSpatialQuery(manifest.spatialScope, query.spatial)) {
297
+ return null;
298
+ }
299
+
300
+ // Tag check
301
+ if (query.tags && query.tags.length > 0) {
302
+ const agentTags = manifest.tags || [];
303
+ const hasAllTags = query.tags.every((t) => agentTags.includes(t));
304
+ if (!hasAllTags) {
305
+ return null;
306
+ }
307
+ reasons.push('tags matched');
308
+ }
309
+
310
+ // Match capabilities
311
+ const capabilityMatches: CapabilityMatch[] = [];
312
+ for (const capability of manifest.capabilities) {
313
+ const match = this.matchCapability(capability, query);
314
+ if (match) {
315
+ capabilityMatches.push(match);
316
+ }
317
+ }
318
+
319
+ if (capabilityMatches.length === 0) {
320
+ return null;
321
+ }
322
+
323
+ // Calculate overall score
324
+ const avgCapabilityScore =
325
+ capabilityMatches.reduce((sum, m) => sum + m.score, 0) / capabilityMatches.length;
326
+ const trustScore = getTrustScore(manifest.trustLevel);
327
+
328
+ // Weight scoring: capabilities 70%, trust 30%
329
+ const overallScore = avgCapabilityScore * 0.7 + trustScore * 0.3;
330
+
331
+ reasons.push(`${capabilityMatches.length} capability match(es)`);
332
+ reasons.push(`trust: ${manifest.trustLevel}`);
333
+ if (manifest.status === 'online') {
334
+ reasons.push('online');
335
+ }
336
+
337
+ return {
338
+ manifest,
339
+ score: overallScore,
340
+ capabilities: capabilityMatches,
341
+ reasons,
342
+ };
343
+ }
344
+
345
+ /**
346
+ * Find all matching agents from a list
347
+ */
348
+ findMatches(manifests: AgentManifest[], query: CapabilityQuery): AgentMatch[] {
349
+ const matches: AgentMatch[] = [];
350
+
351
+ for (const manifest of manifests) {
352
+ const match = this.matchAgent(manifest, query);
353
+ if (match) {
354
+ matches.push(match);
355
+ }
356
+ }
357
+
358
+ // Sort results
359
+ this.sortMatches(matches, query.sortBy || 'score', query.sortOrder || 'desc');
360
+
361
+ // Apply limit
362
+ if (query.limit && query.limit > 0) {
363
+ return matches.slice(0, query.limit);
364
+ }
365
+
366
+ return matches;
367
+ }
368
+
369
+ /**
370
+ * Find the best matching agent
371
+ */
372
+ findBest(manifests: AgentManifest[], query: CapabilityQuery): AgentMatch | null {
373
+ const matches = this.findMatches(manifests, { ...query, limit: 1 });
374
+ return matches.length > 0 ? matches[0] : null;
375
+ }
376
+
377
+ /**
378
+ * Sort matches by criteria
379
+ */
380
+ public sortMatches(
381
+ matches: AgentMatch[],
382
+ sortBy: 'latency' | 'trust' | 'priority' | 'name' | 'score',
383
+ sortOrder: 'asc' | 'desc'
384
+ ): void {
385
+ const multiplier = sortOrder === 'asc' ? 1 : -1;
386
+
387
+ matches.sort((a, b) => {
388
+ switch (sortBy) {
389
+ case 'latency': {
390
+ // Get fastest latency from capabilities
391
+ const aLatency = this.getFastestLatency(a.capabilities);
392
+ const bLatency = this.getFastestLatency(b.capabilities);
393
+ return multiplier * (LATENCY_ORDER.indexOf(aLatency) - LATENCY_ORDER.indexOf(bLatency));
394
+ }
395
+ case 'trust':
396
+ return (
397
+ multiplier *
398
+ (TRUST_LEVELS.indexOf(a.manifest.trustLevel) -
399
+ TRUST_LEVELS.indexOf(b.manifest.trustLevel))
400
+ );
401
+ case 'priority': {
402
+ const aPriority = this.getHighestPriority(a.capabilities);
403
+ const bPriority = this.getHighestPriority(b.capabilities);
404
+ return multiplier * (bPriority - aPriority);
405
+ }
406
+ case 'name':
407
+ return multiplier * a.manifest.name.localeCompare(b.manifest.name);
408
+ case 'score':
409
+ default:
410
+ return multiplier * (a.score - b.score);
411
+ }
412
+ });
413
+ }
414
+
415
+ private getFastestLatency(capabilities: CapabilityMatch[]): LatencyProfile {
416
+ let fastest: LatencyProfile = 'background';
417
+ for (const cap of capabilities) {
418
+ if (cap.capability.latency) {
419
+ const idx = LATENCY_ORDER.indexOf(cap.capability.latency);
420
+ if (idx < LATENCY_ORDER.indexOf(fastest)) {
421
+ fastest = cap.capability.latency;
422
+ }
423
+ }
424
+ }
425
+ return fastest;
426
+ }
427
+
428
+ private getHighestPriority(capabilities: CapabilityMatch[]): number {
429
+ return Math.max(...capabilities.map((c) => c.capability.priority || 0));
430
+ }
431
+ }
432
+
433
+ /**
434
+ * Default matcher instance
435
+ */
436
+ export const defaultMatcher = new CapabilityMatcher();
437
+
438
+ /**
439
+ * Convenience function to find matching agents
440
+ */
441
+ export function findAgents(manifests: AgentManifest[], query: CapabilityQuery): AgentMatch[] {
442
+ return defaultMatcher.findMatches(manifests, query);
443
+ }
444
+
445
+ /**
446
+ * Convenience function to find the best agent
447
+ */
448
+ export function findBestAgent(
449
+ manifests: AgentManifest[],
450
+ query: CapabilityQuery
451
+ ): AgentMatch | null {
452
+ return defaultMatcher.findBest(manifests, query);
453
+ }