@holoscript/framework 6.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ALL-test-results.json +1 -0
- package/CHANGELOG.md +8 -0
- package/LICENSE +21 -0
- package/ROADMAP.md +175 -0
- package/dist/AgentManifest-CB4xM-Ma.d.cts +704 -0
- package/dist/AgentManifest-CB4xM-Ma.d.ts +704 -0
- package/dist/BehaviorTree-BrBFECv5.d.cts +103 -0
- package/dist/BehaviorTree-BrBFECv5.d.ts +103 -0
- package/dist/InvisibleWallet-BB6tFvRA.d.cts +1732 -0
- package/dist/InvisibleWallet-rtRrBOA8.d.ts +1732 -0
- package/dist/OrchestratorAgent-BvWgf9uw.d.cts +798 -0
- package/dist/OrchestratorAgent-Q_CbVTmO.d.ts +798 -0
- package/dist/agents/index.cjs +4790 -0
- package/dist/agents/index.d.cts +1788 -0
- package/dist/agents/index.d.ts +1788 -0
- package/dist/agents/index.js +4695 -0
- package/dist/ai/index.cjs +5347 -0
- package/dist/ai/index.d.cts +1753 -0
- package/dist/ai/index.d.ts +1753 -0
- package/dist/ai/index.js +5244 -0
- package/dist/behavior.cjs +449 -0
- package/dist/behavior.d.cts +130 -0
- package/dist/behavior.d.ts +130 -0
- package/dist/behavior.js +407 -0
- package/dist/economy/index.cjs +3659 -0
- package/dist/economy/index.d.cts +747 -0
- package/dist/economy/index.d.ts +747 -0
- package/dist/economy/index.js +3617 -0
- package/dist/implementations-D9T3un9D.d.cts +236 -0
- package/dist/implementations-D9T3un9D.d.ts +236 -0
- package/dist/index.cjs +24550 -0
- package/dist/index.d.cts +1729 -0
- package/dist/index.d.ts +1729 -0
- package/dist/index.js +24277 -0
- package/dist/learning/index.cjs +219 -0
- package/dist/learning/index.d.cts +104 -0
- package/dist/learning/index.d.ts +104 -0
- package/dist/learning/index.js +189 -0
- package/dist/negotiation/index.cjs +970 -0
- package/dist/negotiation/index.d.cts +610 -0
- package/dist/negotiation/index.d.ts +610 -0
- package/dist/negotiation/index.js +931 -0
- package/dist/skills/index.cjs +1118 -0
- package/dist/skills/index.d.cts +289 -0
- package/dist/skills/index.d.ts +289 -0
- package/dist/skills/index.js +1079 -0
- package/dist/swarm/index.cjs +5268 -0
- package/dist/swarm/index.d.cts +2433 -0
- package/dist/swarm/index.d.ts +2433 -0
- package/dist/swarm/index.js +5221 -0
- package/dist/training/index.cjs +2745 -0
- package/dist/training/index.d.cts +1734 -0
- package/dist/training/index.d.ts +1734 -0
- package/dist/training/index.js +2687 -0
- package/extract-failures.js +10 -0
- package/package.json +82 -0
- package/src/__tests__/bounty-marketplace.test.ts +374 -0
- package/src/__tests__/delegation.test.ts +144 -0
- package/src/__tests__/distributed-claimer.test.ts +147 -0
- package/src/__tests__/done-log-audit.test.ts +342 -0
- package/src/__tests__/framework.test.ts +865 -0
- package/src/__tests__/goal-synthesizer.test.ts +236 -0
- package/src/__tests__/presence.test.ts +223 -0
- package/src/__tests__/protocol-agent.test.ts +254 -0
- package/src/__tests__/revenue-splitter.test.ts +114 -0
- package/src/__tests__/scenario-driven-todo.test.ts +197 -0
- package/src/__tests__/self-improve.test.ts +349 -0
- package/src/__tests__/service-lifecycle.test.ts +237 -0
- package/src/__tests__/skill-router.test.ts +121 -0
- package/src/agents/AgentManifest.ts +493 -0
- package/src/agents/AgentRegistry.ts +475 -0
- package/src/agents/AgentTypes.ts +585 -0
- package/src/agents/AgentWalletRegistry.ts +83 -0
- package/src/agents/AuthenticatedCRDT.ts +388 -0
- package/src/agents/CapabilityMatcher.ts +453 -0
- package/src/agents/CrossRealityHandoff.ts +305 -0
- package/src/agents/CulturalMemory.ts +454 -0
- package/src/agents/FederatedRegistryAdapter.ts +429 -0
- package/src/agents/NormEngine.ts +450 -0
- package/src/agents/OrchestratorAgent.ts +414 -0
- package/src/agents/SkillWorkflowEngine.ts +472 -0
- package/src/agents/TaskDelegationService.ts +551 -0
- package/src/agents/__tests__/AgentManifest.prod.test.ts +134 -0
- package/src/agents/__tests__/AgentManifest.test.ts +182 -0
- package/src/agents/__tests__/AgentModule.test.ts +864 -0
- package/src/agents/__tests__/AgentRegistry.prod.test.ts +125 -0
- package/src/agents/__tests__/AgentRegistry.test.ts +148 -0
- package/src/agents/__tests__/AgentTypes.test.ts +534 -0
- package/src/agents/__tests__/AgentWalletRegistry.test.ts +152 -0
- package/src/agents/__tests__/AuthenticatedCRDT.test.ts +558 -0
- package/src/agents/__tests__/CapabilityMatcher.prod.test.ts +117 -0
- package/src/agents/__tests__/CapabilityMatcher.test.ts +178 -0
- package/src/agents/__tests__/CrossRealityHandoff.test.ts +402 -0
- package/src/agents/__tests__/CulturalMemory.test.ts +200 -0
- package/src/agents/__tests__/FederatedRegistryAdapter.test.ts +409 -0
- package/src/agents/__tests__/NormEngine.test.ts +276 -0
- package/src/agents/__tests__/OrchestratorAgent.test.ts +182 -0
- package/src/agents/__tests__/SkillWorkflowEngine.test.ts +357 -0
- package/src/agents/__tests__/TaskDelegationService.test.ts +446 -0
- package/src/agents/index.ts +107 -0
- package/src/agents/spatial-comms/Layer1RealTime.ts +621 -0
- package/src/agents/spatial-comms/Layer2A2A.ts +661 -0
- package/src/agents/spatial-comms/Layer3MCP.ts +651 -0
- package/src/agents/spatial-comms/ProtocolTypes.ts +543 -0
- package/src/agents/spatial-comms/SpatialCommClient.ts +483 -0
- package/src/agents/spatial-comms/__tests__/performance-benchmark.test.ts +465 -0
- package/src/agents/spatial-comms/examples/multi-agent-world-creation.ts +409 -0
- package/src/agents/spatial-comms/index.ts +66 -0
- package/src/ai/AIAdapter.ts +313 -0
- package/src/ai/AICopilot.ts +331 -0
- package/src/ai/AIOutputValidator.ts +203 -0
- package/src/ai/BTNodes.ts +239 -0
- package/src/ai/BehaviorSelector.ts +135 -0
- package/src/ai/BehaviorTree.ts +153 -0
- package/src/ai/Blackboard.ts +165 -0
- package/src/ai/GenerationAnalytics.ts +461 -0
- package/src/ai/GenerationCache.ts +265 -0
- package/src/ai/GoalPlanner.ts +165 -0
- package/src/ai/HoloScriptGenerator.ts +580 -0
- package/src/ai/InfluenceMap.ts +180 -0
- package/src/ai/NavMesh.ts +168 -0
- package/src/ai/PerceptionSystem.ts +178 -0
- package/src/ai/PromptTemplates.ts +453 -0
- package/src/ai/SemanticSearchService.ts +80 -0
- package/src/ai/StateMachine.ts +196 -0
- package/src/ai/SteeringBehavior.ts +150 -0
- package/src/ai/SteeringBehaviors.ts +244 -0
- package/src/ai/TrainingDataGenerator.ts +1082 -0
- package/src/ai/UtilityAI.ts +145 -0
- package/src/ai/__tests__/AIAdapter.prod.test.ts +259 -0
- package/src/ai/__tests__/AIAdapter.test.ts +109 -0
- package/src/ai/__tests__/AICopilot.prod.test.ts +341 -0
- package/src/ai/__tests__/AICopilot.test.ts +178 -0
- package/src/ai/__tests__/AIOutputValidator.prod.test.ts +226 -0
- package/src/ai/__tests__/AIOutputValidator.test.ts +138 -0
- package/src/ai/__tests__/BTNodes.prod.test.ts +391 -0
- package/src/ai/__tests__/BTNodes.test.ts +263 -0
- package/src/ai/__tests__/BehaviorSelector.prod.test.ts +129 -0
- package/src/ai/__tests__/BehaviorSelector.test.ts +132 -0
- package/src/ai/__tests__/BehaviorTree.prod.test.ts +266 -0
- package/src/ai/__tests__/BehaviorTree.test.ts +216 -0
- package/src/ai/__tests__/Blackboard.prod.test.ts +339 -0
- package/src/ai/__tests__/Blackboard.test.ts +183 -0
- package/src/ai/__tests__/GenerationAnalytics.prod.test.ts +141 -0
- package/src/ai/__tests__/GenerationAnalytics.test.ts +165 -0
- package/src/ai/__tests__/GenerationCache.prod.test.ts +144 -0
- package/src/ai/__tests__/GenerationCache.test.ts +171 -0
- package/src/ai/__tests__/GoalPlanner.prod.test.ts +189 -0
- package/src/ai/__tests__/GoalPlanner.test.ts +137 -0
- package/src/ai/__tests__/GoalPlannerDepth.prod.test.ts +217 -0
- package/src/ai/__tests__/HoloScriptGenerator.test.ts +125 -0
- package/src/ai/__tests__/InfluenceMap.prod.test.ts +146 -0
- package/src/ai/__tests__/InfluenceMap.test.ts +149 -0
- package/src/ai/__tests__/NavMesh.prod.test.ts +141 -0
- package/src/ai/__tests__/NavMesh.test.ts +159 -0
- package/src/ai/__tests__/PerceptionSystem.prod.test.ts +135 -0
- package/src/ai/__tests__/PerceptionSystem.test.ts +250 -0
- package/src/ai/__tests__/PromptTemplates.prod.test.ts +313 -0
- package/src/ai/__tests__/PromptTemplates.test.ts +146 -0
- package/src/ai/__tests__/SemanticSearch.test.ts +37 -0
- package/src/ai/__tests__/StateMachine.prod.test.ts +162 -0
- package/src/ai/__tests__/StateMachine.test.ts +163 -0
- package/src/ai/__tests__/SteeringBehavior.prod.test.ts +251 -0
- package/src/ai/__tests__/SteeringBehavior.test.ts +135 -0
- package/src/ai/__tests__/SteeringBehaviors.prod.test.ts +133 -0
- package/src/ai/__tests__/SteeringBehaviors.test.ts +151 -0
- package/src/ai/__tests__/TrainingDataGenerator.prod.test.ts +286 -0
- package/src/ai/__tests__/TrainingDataGenerator.test.ts +286 -0
- package/src/ai/__tests__/UtilityAI.prod.test.ts +207 -0
- package/src/ai/__tests__/UtilityAI.test.ts +155 -0
- package/src/ai/__tests__/adapters.prod.test.ts +263 -0
- package/src/ai/__tests__/adapters.test.ts +320 -0
- package/src/ai/adapters.ts +1585 -0
- package/src/ai/index.ts +130 -0
- package/src/behavior/BehaviorPresets.ts +140 -0
- package/src/behavior/BehaviorTree.ts +236 -0
- package/src/behavior/StateMachine.ts +176 -0
- package/src/behavior/StateTrait.ts +67 -0
- package/src/behavior/index.ts +8 -0
- package/src/behavior.ts +8 -0
- package/src/board/audit.ts +284 -0
- package/src/board/board-ops.ts +336 -0
- package/src/board/board-types.ts +302 -0
- package/src/board/index.ts +69 -0
- package/src/define-agent.ts +46 -0
- package/src/define-team.ts +33 -0
- package/src/delegation.ts +265 -0
- package/src/distributed-claimer.ts +228 -0
- package/src/economy/AgentBudgetEnforcer.ts +464 -0
- package/src/economy/BountyManager.ts +185 -0
- package/src/economy/CreatorRevenueAggregator.ts +460 -0
- package/src/economy/InvisibleWallet.ts +82 -0
- package/src/economy/KnowledgeMarketplace.ts +193 -0
- package/src/economy/PaymentWebhookService.ts +512 -0
- package/src/economy/RevenueSplitter.ts +156 -0
- package/src/economy/SubscriptionManager.ts +546 -0
- package/src/economy/UnifiedBudgetOptimizer.ts +635 -0
- package/src/economy/UsageMeter.ts +440 -0
- package/src/economy/_core-stubs.ts +219 -0
- package/src/economy/index.ts +100 -0
- package/src/economy/x402-facilitator.ts +1978 -0
- package/src/index.ts +348 -0
- package/src/knowledge/__tests__/knowledge-consolidator.test.ts +444 -0
- package/src/knowledge/__tests__/knowledge-store-vector.test.ts +291 -0
- package/src/knowledge/brain.ts +167 -0
- package/src/knowledge/consolidation.ts +581 -0
- package/src/knowledge/knowledge-consolidator.ts +510 -0
- package/src/knowledge/knowledge-store.ts +616 -0
- package/src/learning/MemoryConsolidator.ts +102 -0
- package/src/learning/MemoryScorer.ts +69 -0
- package/src/learning/ProceduralCompiler.ts +45 -0
- package/src/learning/SemanticClusterer.ts +66 -0
- package/src/learning/index.ts +8 -0
- package/src/llm/llm-adapter.ts +159 -0
- package/src/mesh/index.ts +309 -0
- package/src/negotiation/NegotiationProtocol.ts +694 -0
- package/src/negotiation/NegotiationTypes.ts +473 -0
- package/src/negotiation/VotingMechanisms.ts +691 -0
- package/src/negotiation/index.ts +49 -0
- package/src/protocol/goal-synthesizer.ts +317 -0
- package/src/protocol/implementations.ts +474 -0
- package/src/protocol/micro-phase-decomposer.ts +299 -0
- package/src/protocol/micro-step-decomposer.test.ts +306 -0
- package/src/protocol-agent.test.ts +353 -0
- package/src/protocol-agent.ts +670 -0
- package/src/self-improve/absorb-scanner.ts +252 -0
- package/src/self-improve/evolution-engine.ts +149 -0
- package/src/self-improve/framework-absorber.ts +214 -0
- package/src/self-improve/index.ts +50 -0
- package/src/self-improve/prompt-optimizer.ts +212 -0
- package/src/self-improve/test-generator.ts +175 -0
- package/src/skill-router.ts +186 -0
- package/src/skills/index.ts +5 -0
- package/src/skills/skill-md-bridge.ts +1699 -0
- package/src/swarm/ACOEngine.ts +261 -0
- package/src/swarm/CollectiveIntelligence.ts +383 -0
- package/src/swarm/ContributionSynthesizer.ts +481 -0
- package/src/swarm/LeaderElection.ts +393 -0
- package/src/swarm/PSOEngine.ts +206 -0
- package/src/swarm/QuorumPolicy.ts +173 -0
- package/src/swarm/SwarmCoordinator.ts +335 -0
- package/src/swarm/SwarmManager.ts +442 -0
- package/src/swarm/SwarmMembership.ts +456 -0
- package/src/swarm/VotingRound.ts +255 -0
- package/src/swarm/__tests__/ACOEngine.prod.test.ts +164 -0
- package/src/swarm/__tests__/ACOEngine.test.ts +117 -0
- package/src/swarm/__tests__/CollectiveIntelligence.prod.test.ts +296 -0
- package/src/swarm/__tests__/CollectiveIntelligence.test.ts +457 -0
- package/src/swarm/__tests__/ContributionSynthesizer.prod.test.ts +269 -0
- package/src/swarm/__tests__/ContributionSynthesizer.test.ts +254 -0
- package/src/swarm/__tests__/LeaderElection.prod.test.ts +196 -0
- package/src/swarm/__tests__/LeaderElection.test.ts +151 -0
- package/src/swarm/__tests__/PSOEngine.prod.test.ts +162 -0
- package/src/swarm/__tests__/PSOEngine.test.ts +106 -0
- package/src/swarm/__tests__/QuorumPolicy.prod.test.ts +216 -0
- package/src/swarm/__tests__/QuorumPolicy.test.ts +177 -0
- package/src/swarm/__tests__/SwarmCoordinator.prod.test.ts +186 -0
- package/src/swarm/__tests__/SwarmCoordinator.test.ts +167 -0
- package/src/swarm/__tests__/SwarmManager.prod.test.ts +308 -0
- package/src/swarm/__tests__/SwarmManager.test.ts +373 -0
- package/src/swarm/__tests__/SwarmMembership.prod.test.ts +273 -0
- package/src/swarm/__tests__/SwarmMembership.test.ts +264 -0
- package/src/swarm/__tests__/VotingRound.prod.test.ts +233 -0
- package/src/swarm/__tests__/VotingRound.test.ts +174 -0
- package/src/swarm/analytics/SwarmInspector.ts +476 -0
- package/src/swarm/analytics/SwarmMetrics.ts +449 -0
- package/src/swarm/analytics/__tests__/SwarmInspector.prod.test.ts +366 -0
- package/src/swarm/analytics/__tests__/SwarmInspector.test.ts +454 -0
- package/src/swarm/analytics/__tests__/SwarmMetrics.prod.test.ts +254 -0
- package/src/swarm/analytics/__tests__/SwarmMetrics.test.ts +370 -0
- package/src/swarm/analytics/index.ts +7 -0
- package/src/swarm/index.ts +69 -0
- package/src/swarm/messaging/BroadcastChannel.ts +509 -0
- package/src/swarm/messaging/GossipProtocol.ts +565 -0
- package/src/swarm/messaging/SwarmEventBus.ts +443 -0
- package/src/swarm/messaging/__tests__/BroadcastChannel.prod.test.ts +331 -0
- package/src/swarm/messaging/__tests__/BroadcastChannel.test.ts +333 -0
- package/src/swarm/messaging/__tests__/GossipProtocol.prod.test.ts +356 -0
- package/src/swarm/messaging/__tests__/GossipProtocol.test.ts +437 -0
- package/src/swarm/messaging/__tests__/SwarmEventBus.prod.test.ts +191 -0
- package/src/swarm/messaging/__tests__/SwarmEventBus.test.ts +247 -0
- package/src/swarm/messaging/index.ts +8 -0
- package/src/swarm/spatial/FlockingBehavior.ts +462 -0
- package/src/swarm/spatial/FormationController.ts +500 -0
- package/src/swarm/spatial/Vector3.ts +170 -0
- package/src/swarm/spatial/ZoneClaiming.ts +509 -0
- package/src/swarm/spatial/__tests__/FlockingBehavior.prod.test.ts +239 -0
- package/src/swarm/spatial/__tests__/FlockingBehavior.test.ts +298 -0
- package/src/swarm/spatial/__tests__/FormationController.prod.test.ts +240 -0
- package/src/swarm/spatial/__tests__/FormationController.test.ts +297 -0
- package/src/swarm/spatial/__tests__/Vector3.prod.test.ts +283 -0
- package/src/swarm/spatial/__tests__/Vector3.test.ts +224 -0
- package/src/swarm/spatial/__tests__/ZoneClaiming.prod.test.ts +246 -0
- package/src/swarm/spatial/__tests__/ZoneClaiming.test.ts +374 -0
- package/src/swarm/spatial/index.ts +28 -0
- package/src/team.ts +1245 -0
- package/src/training/LRScheduler.ts +377 -0
- package/src/training/QualityScoringPipeline.ts +139 -0
- package/src/training/SoftDedup.ts +461 -0
- package/src/training/SparsityMonitor.ts +685 -0
- package/src/training/SparsityMonitorTypes.ts +209 -0
- package/src/training/SpatialTrainingDataGenerator.ts +1526 -0
- package/src/training/SpatialTrainingDataTypes.ts +216 -0
- package/src/training/TrainingPipelineConfig.ts +215 -0
- package/src/training/constants.ts +94 -0
- package/src/training/index.ts +138 -0
- package/src/training/schema.ts +147 -0
- package/src/training/scripts/generate-novel-use-cases-dataset.ts +272 -0
- package/src/training/scripts/generate-spatial-dataset.ts +521 -0
- package/src/training/training/data/novel-use-cases.jsonl +153 -0
- package/src/training/training/data/spatial-reasoning-10k.jsonl +9354 -0
- package/src/training/trainingmonkey/TrainingMonkeyIntegration.ts +477 -0
- package/src/training/trainingmonkey/TrainingMonkeyTypes.ts +230 -0
- package/src/training/trainingmonkey/index.ts +26 -0
- package/src/training/trait-mappings.ts +157 -0
- package/src/types/core-stubs.d.ts +113 -0
- package/src/types.ts +304 -0
- package/test-output.txt +0 -0
- package/test-result.json +1 -0
- package/tsc-errors.txt +4 -0
- package/tsc_output.txt +0 -0
- package/tsconfig.json +14 -0
- package/tsup-learning-esm.config.ts +12 -0
- package/tsup.config.ts +21 -0
- package/typescript-errors-2.txt +0 -0
- package/typescript-errors.txt +22 -0
- package/vitest-log-utf8.txt +268 -0
- package/vitest-log.txt +0 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1,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
|
+
}
|