@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,446 @@
1
+ /**
2
+ * TaskDelegationService Tests
3
+ *
4
+ * Tests cross-agent task forwarding (local + remote delegation).
5
+ * Part of HoloScript v5.5 "Agents as Universal Orchestrators".
6
+ */
7
+
8
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
9
+ import { TaskDelegationService, type DelegationRequest } from '../TaskDelegationService';
10
+ import { AgentRegistry, resetDefaultRegistry } from '../AgentRegistry';
11
+ import type { AgentManifest } from '../AgentManifest';
12
+
13
+ // =============================================================================
14
+ // FIXTURES
15
+ // =============================================================================
16
+
17
+ function makeLocalAgent(overrides: Partial<AgentManifest> = {}): AgentManifest {
18
+ return {
19
+ id: 'local-agent-1',
20
+ name: 'Local Agent',
21
+ version: '1.0.0',
22
+ capabilities: [{ type: 'analyze', domain: 'spatial' }],
23
+ endpoints: [{ protocol: 'local', address: 'local://agent-1', primary: true }],
24
+ trustLevel: 'local',
25
+ status: 'online',
26
+ ...overrides,
27
+ };
28
+ }
29
+
30
+ function makeRemoteAgent(overrides: Partial<AgentManifest> = {}): AgentManifest {
31
+ return {
32
+ id: 'remote-agent-1',
33
+ name: 'Remote Agent',
34
+ version: '1.0.0',
35
+ capabilities: [{ type: 'transform', domain: 'spatial' }],
36
+ endpoints: [{ protocol: 'https', address: 'https://remote.example.com/a2a', primary: true }],
37
+ trustLevel: 'external',
38
+ status: 'online',
39
+ ...overrides,
40
+ };
41
+ }
42
+
43
+ // =============================================================================
44
+ // TESTS
45
+ // =============================================================================
46
+
47
+ describe('TaskDelegationService', () => {
48
+ let registry: AgentRegistry;
49
+
50
+ beforeEach(() => {
51
+ resetDefaultRegistry();
52
+ registry = new AgentRegistry();
53
+ });
54
+
55
+ afterEach(() => {
56
+ registry.stop();
57
+ registry.clear();
58
+ });
59
+
60
+ describe('delegateTo', () => {
61
+ it('delegates to a local agent using localExecutor', async () => {
62
+ await registry.register(makeLocalAgent());
63
+
64
+ const service = new TaskDelegationService(registry, undefined, {
65
+ localExecutor: async (skillId, args) => ({
66
+ parsed: true,
67
+ skillId,
68
+ input: args.code,
69
+ }),
70
+ });
71
+
72
+ const result = await service.delegateTo({
73
+ targetAgentId: 'local-agent-1',
74
+ skillId: 'parse_hs',
75
+ arguments: { code: 'object Cube {}' },
76
+ });
77
+
78
+ expect(result.status).toBe('completed');
79
+ expect(result.delegatedTo.agentId).toBe('local-agent-1');
80
+ expect((result.result as Record<string, unknown>).parsed).toBe(true);
81
+ expect(result.durationMs).toBeGreaterThanOrEqual(0);
82
+ });
83
+
84
+ it('returns rejected for unknown agent ID', async () => {
85
+ const service = new TaskDelegationService(registry);
86
+
87
+ const result = await service.delegateTo({
88
+ targetAgentId: 'nonexistent',
89
+ skillId: 'test',
90
+ arguments: {},
91
+ });
92
+
93
+ expect(result.status).toBe('rejected');
94
+ expect(result.error).toContain('Agent not found');
95
+ });
96
+
97
+ it('delegates to a remote agent via A2A JSON-RPC', async () => {
98
+ await registry.register(makeRemoteAgent());
99
+
100
+ const service = new TaskDelegationService(registry, undefined, {
101
+ fetchFn: async () =>
102
+ ({
103
+ ok: true,
104
+ json: async () => ({
105
+ jsonrpc: '2.0',
106
+ id: 'test',
107
+ result: { status: 'completed', artifacts: [{ data: 'remote-result' }] },
108
+ }),
109
+ }) as Response,
110
+ });
111
+
112
+ const result = await service.delegateTo({
113
+ targetAgentId: 'remote-agent-1',
114
+ skillId: 'compile_hs',
115
+ arguments: { code: 'test', target: 'threejs' },
116
+ });
117
+
118
+ expect(result.status).toBe('completed');
119
+ expect(result.delegatedTo.endpoint).toBe('https://remote.example.com/a2a');
120
+ });
121
+
122
+ it('sends idempotency key header and payload for remote delegation', async () => {
123
+ await registry.register(makeRemoteAgent());
124
+
125
+ let capturedInit: RequestInit | undefined;
126
+ const service = new TaskDelegationService(registry, undefined, {
127
+ idempotencyKeyFactory: () => 'idem-fixed-key',
128
+ fetchFn: async (_url, init) => {
129
+ capturedInit = init;
130
+ return {
131
+ ok: true,
132
+ json: async () => ({ result: { status: 'completed' } }),
133
+ } as Response;
134
+ },
135
+ });
136
+
137
+ const result = await service.delegateTo({
138
+ targetAgentId: 'remote-agent-1',
139
+ skillId: 'compile_hs',
140
+ arguments: { code: 'x' },
141
+ });
142
+
143
+ expect(result.status).toBe('completed');
144
+ const headers = (capturedInit?.headers ?? {}) as Record<string, string>;
145
+ expect(headers['Idempotency-Key']).toBe('idem-fixed-key');
146
+
147
+ const body = JSON.parse(String(capturedInit?.body ?? '{}')) as {
148
+ params?: { message?: { parts?: Array<{ data?: Record<string, unknown> }> } };
149
+ };
150
+ const data = body.params?.message?.parts?.[0]?.data;
151
+ expect(data?.idempotencyKey).toBe('idem-fixed-key');
152
+ expect(data?.schema).toBe('holoscript.task-bridge.v1');
153
+ expect((data?.task as Record<string, unknown> | undefined)?.skillId).toBe('compile_hs');
154
+ expect((data?.task as Record<string, unknown> | undefined)?.idempotency_key).toBe('idem-fixed-key');
155
+ });
156
+
157
+ it('uses transport adapter when configured', async () => {
158
+ await registry.register(makeRemoteAgent());
159
+
160
+ const send = vi.fn(async () => ({ status: 'completed', via: 'adapter' }));
161
+ const service = new TaskDelegationService(registry, undefined, {
162
+ transportAdapter: { send },
163
+ idempotencyKeyFactory: () => 'adapter-idem',
164
+ });
165
+
166
+ const result = await service.delegateTo({
167
+ targetAgentId: 'remote-agent-1',
168
+ skillId: 'compile_hs',
169
+ arguments: { code: 'x' },
170
+ });
171
+
172
+ expect(result.status).toBe('completed');
173
+ expect(send).toHaveBeenCalledTimes(1);
174
+ expect(send.mock.calls[0][0].idempotencyKey).toBe('adapter-idem');
175
+ });
176
+
177
+ it('handles remote agent HTTP errors', async () => {
178
+ await registry.register(makeRemoteAgent());
179
+
180
+ const service = new TaskDelegationService(registry, undefined, {
181
+ fetchFn: async () => ({ ok: false, status: 500 }) as Response,
182
+ });
183
+
184
+ const result = await service.delegateTo({
185
+ targetAgentId: 'remote-agent-1',
186
+ skillId: 'test',
187
+ arguments: {},
188
+ });
189
+
190
+ expect(result.status).toBe('failed');
191
+ expect(result.error).toContain('500');
192
+ });
193
+
194
+ it('handles remote agent JSON-RPC errors', async () => {
195
+ await registry.register(makeRemoteAgent());
196
+
197
+ const service = new TaskDelegationService(registry, undefined, {
198
+ fetchFn: async () =>
199
+ ({
200
+ ok: true,
201
+ json: async () => ({
202
+ jsonrpc: '2.0',
203
+ error: { code: -32000, message: 'Skill not found' },
204
+ }),
205
+ }) as Response,
206
+ });
207
+
208
+ const result = await service.delegateTo({
209
+ targetAgentId: 'remote-agent-1',
210
+ skillId: 'nonexistent',
211
+ arguments: {},
212
+ });
213
+
214
+ expect(result.status).toBe('failed');
215
+ expect(result.error).toContain('Skill not found');
216
+ });
217
+
218
+ it('times out on slow execution', async () => {
219
+ await registry.register(makeLocalAgent());
220
+
221
+ const service = new TaskDelegationService(registry, undefined, {
222
+ localExecutor: async () => {
223
+ await new Promise((resolve) => setTimeout(resolve, 500));
224
+ return { result: 'too-slow' };
225
+ },
226
+ });
227
+
228
+ const result = await service.delegateTo({
229
+ targetAgentId: 'local-agent-1',
230
+ skillId: 'slow_skill',
231
+ arguments: {},
232
+ timeout: 50,
233
+ });
234
+
235
+ expect(result.status).toBe('timeout');
236
+ expect(result.error).toContain('timed out');
237
+ });
238
+
239
+ it('retries on failure with exponential backoff', async () => {
240
+ await registry.register(makeLocalAgent());
241
+
242
+ let callCount = 0;
243
+ const service = new TaskDelegationService(registry, undefined, {
244
+ localExecutor: async () => {
245
+ callCount++;
246
+ if (callCount < 3) throw new Error('Transient error');
247
+ return { success: true };
248
+ },
249
+ });
250
+
251
+ const result = await service.delegateTo({
252
+ targetAgentId: 'local-agent-1',
253
+ skillId: 'flaky_skill',
254
+ arguments: {},
255
+ retries: 2,
256
+ });
257
+
258
+ expect(result.status).toBe('completed');
259
+ expect(callCount).toBe(3);
260
+ }, 15000);
261
+
262
+ it('fails after exhausting retries', async () => {
263
+ await registry.register(makeLocalAgent());
264
+
265
+ const service = new TaskDelegationService(registry, undefined, {
266
+ localExecutor: async () => {
267
+ throw new Error('Persistent error');
268
+ },
269
+ });
270
+
271
+ const result = await service.delegateTo({
272
+ targetAgentId: 'local-agent-1',
273
+ skillId: 'broken_skill',
274
+ arguments: {},
275
+ retries: 1,
276
+ });
277
+
278
+ expect(result.status).toBe('failed');
279
+ expect(result.error).toBe('Persistent error');
280
+ });
281
+ });
282
+
283
+ describe('autoDelegate', () => {
284
+ it('auto-selects the best agent and delegates', async () => {
285
+ await registry.register(makeLocalAgent());
286
+
287
+ const service = new TaskDelegationService(registry, undefined, {
288
+ localExecutor: async (skillId) => ({ delegated: true, skillId }),
289
+ });
290
+
291
+ const result = await service.autoDelegate(
292
+ { type: 'analyze', domain: 'spatial' },
293
+ 'parse_hs',
294
+ { code: 'test' }
295
+ );
296
+
297
+ expect(result.status).toBe('completed');
298
+ expect(result.delegatedTo.agentId).toBe('local-agent-1');
299
+ });
300
+
301
+ it('returns rejected when no matching agent found', async () => {
302
+ const service = new TaskDelegationService(registry);
303
+
304
+ const result = await service.autoDelegate(
305
+ { type: 'render', domain: 'vision' },
306
+ 'test_skill',
307
+ {}
308
+ );
309
+
310
+ expect(result.status).toBe('rejected');
311
+ expect(result.error).toContain('No agent found');
312
+ });
313
+ });
314
+
315
+ describe('history tracking', () => {
316
+ it('tracks delegation results', async () => {
317
+ await registry.register(makeLocalAgent());
318
+
319
+ const service = new TaskDelegationService(registry, undefined, {
320
+ localExecutor: async () => ({ ok: true }),
321
+ });
322
+
323
+ await service.delegateTo({
324
+ targetAgentId: 'local-agent-1',
325
+ skillId: 'test',
326
+ arguments: {},
327
+ });
328
+
329
+ const history = service.getDelegationHistory();
330
+ expect(history).toHaveLength(1);
331
+ expect(history[0].status).toBe('completed');
332
+ });
333
+
334
+ it('getStatus retrieves result by taskId', async () => {
335
+ await registry.register(makeLocalAgent());
336
+
337
+ const service = new TaskDelegationService(registry, undefined, {
338
+ localExecutor: async () => ({ ok: true }),
339
+ });
340
+
341
+ const result = await service.delegateTo({
342
+ targetAgentId: 'local-agent-1',
343
+ skillId: 'test',
344
+ arguments: {},
345
+ });
346
+
347
+ const status = service.getStatus(result.taskId);
348
+ expect(status).toBeDefined();
349
+ expect(status!.taskId).toBe(result.taskId);
350
+ });
351
+
352
+ it('enforces maxHistory with LRU eviction', async () => {
353
+ await registry.register(makeLocalAgent());
354
+
355
+ const service = new TaskDelegationService(registry, undefined, {
356
+ maxHistory: 2,
357
+ localExecutor: async () => ({ ok: true }),
358
+ });
359
+
360
+ await service.delegateTo({ targetAgentId: 'local-agent-1', skillId: 'a', arguments: {} });
361
+ await service.delegateTo({ targetAgentId: 'local-agent-1', skillId: 'b', arguments: {} });
362
+ await service.delegateTo({ targetAgentId: 'local-agent-1', skillId: 'c', arguments: {} });
363
+
364
+ const history = service.getDelegationHistory();
365
+ expect(history).toHaveLength(2);
366
+ });
367
+
368
+ it('getStats returns correct counts', async () => {
369
+ await registry.register(makeLocalAgent());
370
+
371
+ let shouldFail = false;
372
+ const service = new TaskDelegationService(registry, undefined, {
373
+ localExecutor: async () => {
374
+ if (shouldFail) throw new Error('fail');
375
+ return { ok: true };
376
+ },
377
+ });
378
+
379
+ await service.delegateTo({ targetAgentId: 'local-agent-1', skillId: 'a', arguments: {} });
380
+ shouldFail = true;
381
+ await service.delegateTo({ targetAgentId: 'local-agent-1', skillId: 'b', arguments: {} });
382
+ await service.delegateTo({ targetAgentId: 'nonexistent', skillId: 'c', arguments: {} });
383
+
384
+ const stats = service.getStats();
385
+ expect(stats.total).toBe(3);
386
+ expect(stats.completed).toBe(1);
387
+ expect(stats.failed).toBe(1);
388
+ expect(stats.rejected).toBe(1);
389
+ });
390
+
391
+ it('emits trace events via traceHook and exposes trace history', async () => {
392
+ await registry.register(makeLocalAgent());
393
+
394
+ const traceEvents: string[] = [];
395
+ const service = new TaskDelegationService(registry, undefined, {
396
+ localExecutor: async () => ({ ok: true }),
397
+ traceHook: (event) => {
398
+ traceEvents.push(event.phase);
399
+ },
400
+ });
401
+
402
+ const result = await service.delegateTo({
403
+ targetAgentId: 'local-agent-1',
404
+ skillId: 'traceable_skill',
405
+ arguments: {},
406
+ });
407
+
408
+ const taskTrace = service.getTraceHistory(result.taskId);
409
+ expect(traceEvents).toContain('start');
410
+ expect(traceEvents).toContain('attempt');
411
+ expect(traceEvents).toContain('success');
412
+ expect(taskTrace.length).toBeGreaterThan(0);
413
+ expect(taskTrace[0].taskId).toBe(result.taskId);
414
+ });
415
+
416
+ it('replays a delegated task from stored request history', async () => {
417
+ await registry.register(makeLocalAgent());
418
+
419
+ const service = new TaskDelegationService(registry, undefined, {
420
+ localExecutor: async () => ({ replayable: true }),
421
+ });
422
+
423
+ const initial = await service.delegateTo({
424
+ targetAgentId: 'local-agent-1',
425
+ skillId: 'replay_skill',
426
+ arguments: { pass: 1 },
427
+ });
428
+
429
+ const replay = await service.replay(initial.taskId, {
430
+ arguments: { pass: 2 },
431
+ });
432
+
433
+ expect(replay.status).toBe('completed');
434
+ expect(replay.taskId).not.toBe(initial.taskId);
435
+
436
+ const originalTrace = service.getTraceHistory(initial.taskId).map((event) => event.phase);
437
+ expect(originalTrace).toContain('replay_requested');
438
+ expect(originalTrace).toContain('replay_completed');
439
+ });
440
+
441
+ it('throws when replaying unknown task id', async () => {
442
+ const service = new TaskDelegationService(registry);
443
+ await expect(service.replay('missing-task-id')).rejects.toThrow('Replay unavailable');
444
+ });
445
+ });
446
+ });
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @holoscript/framework - Agents Module
3
+ *
4
+ * Multi-agent orchestration and choreography system.
5
+ * Migrated from @holoscript/core as part of A.011.02a.
6
+ */
7
+
8
+ // Agent Types (uAA2++ Protocol)
9
+ export * from './AgentTypes';
10
+
11
+ // Agent Manifest (Registration declarations)
12
+ export {
13
+ type AgentManifest,
14
+ type AgentCapability,
15
+ type AgentEndpoint,
16
+ type SpatialScope,
17
+ type BoundingBox,
18
+ type Vector3,
19
+ type TrustLevel,
20
+ type VerificationStatus,
21
+ type ResourceCost,
22
+ type LatencyProfile,
23
+ type CapabilityType,
24
+ type CapabilityDomain,
25
+ type EndpointProtocol,
26
+ type ValidationResult as AgentValidationResult,
27
+ LATENCY_THRESHOLDS,
28
+ AgentManifestBuilder,
29
+ createManifest as createAgentManifest,
30
+ validateManifest,
31
+ } from './AgentManifest';
32
+
33
+ // Capability Matcher (Query & Discovery)
34
+ export {
35
+ type CapabilityQuery,
36
+ type SpatialQuery,
37
+ type CapabilityMatch,
38
+ type AgentMatch,
39
+ CapabilityMatcher,
40
+ defaultMatcher,
41
+ findAgents,
42
+ findBestAgent,
43
+ } from './CapabilityMatcher';
44
+
45
+ // Agent Registry (Central Registration)
46
+ export {
47
+ type DiscoveryMode,
48
+ type RegistryConfig as AgentRegistryConfig,
49
+ type RegistryEvents,
50
+ DEFAULT_REGISTRY_CONFIG,
51
+ AgentRegistry,
52
+ getDefaultRegistry,
53
+ resetDefaultRegistry,
54
+ } from './AgentRegistry';
55
+
56
+ // Federated Registry Adapter (v5.5 Cross-Composition Discovery)
57
+ export {
58
+ FederatedRegistryAdapter,
59
+ type FederatedRegistryConfig,
60
+ type A2AAgentCard,
61
+ type A2ASkill,
62
+ } from './FederatedRegistryAdapter';
63
+
64
+ // Task Delegation Service (v5.5 Cross-Agent Task Forwarding)
65
+ export {
66
+ TaskDelegationService,
67
+ type TaskDelegationConfig,
68
+ type A2ATransportAdapter,
69
+ type DelegationRequest,
70
+ type DelegationResult,
71
+ type DelegationTraceEvent,
72
+ type DelegationTracePhase,
73
+ } from './TaskDelegationService';
74
+
75
+ // Skill Workflow Engine (v5.5 Skill Composition/Chaining)
76
+ export {
77
+ SkillWorkflowEngine,
78
+ type WorkflowDefinition,
79
+ type WorkflowStep,
80
+ type WorkflowInput,
81
+ type WorkflowValidation,
82
+ type WorkflowResult,
83
+ type WorkflowStepResult,
84
+ type SkillExecutor,
85
+ type ProgressCallback,
86
+ } from './SkillWorkflowEngine';
87
+
88
+ // Orchestrator Agent (v5.5 First Concrete BaseAgent)
89
+ export { OrchestratorAgent, type OrchestratorConfig } from './OrchestratorAgent';
90
+
91
+ // Agent Wallet Registry (Autonomous wallet management)
92
+ export { AgentWalletRegistry, type AgentWallet } from './AgentWalletRegistry';
93
+
94
+ // Authenticated CRDT (DID-signed conflict-free state sync)
95
+ export * from './AuthenticatedCRDT';
96
+
97
+ // Cross-Reality Handoff Protocol
98
+ export * from './CrossRealityHandoff';
99
+
100
+ // Cultural Memory (Dual memory architecture)
101
+ export * from './CulturalMemory';
102
+
103
+ // Norm Engine (CRSEC norm lifecycle)
104
+ export * from './NormEngine';
105
+
106
+ // Spatial Communication Stack
107
+ export * from './spatial-comms';