@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,534 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import AgentTypesDefault, {
3
+ PHASE_ORDER,
4
+ DEFAULT_PHASE_TIMINGS,
5
+ type AgentPhase,
6
+ type PhaseResult,
7
+ type IntakeResult,
8
+ type ReflectResult,
9
+ type ExecuteResult,
10
+ type CompressResult,
11
+ type ReintakeResult,
12
+ type GrowResult,
13
+ type EvolveResult,
14
+ type CycleResult,
15
+ type AgentCategory,
16
+ type AgentPosition,
17
+ type AgentSection,
18
+ type AgentConfig,
19
+ type AgentState,
20
+ type AgentMessage,
21
+ type MessagePriority,
22
+ type PatternEntry,
23
+ type WisdomEntry,
24
+ type GotchaEntry,
25
+ type AgentTraitContext,
26
+ type BudgetConfig,
27
+ type CuriosityConfig,
28
+ type PhaseConfig,
29
+ type ArchitectureAwareness,
30
+ type AgentLifespanContext,
31
+ type CycleMetric,
32
+ } from '../AgentTypes';
33
+
34
+ // =============================================================================
35
+ // PHASE DEFINITIONS
36
+ // =============================================================================
37
+
38
+ describe('AgentTypes — Phase Definitions', () => {
39
+ it('PHASE_ORDER has exactly 7 phases', () => {
40
+ expect(PHASE_ORDER).toHaveLength(7);
41
+ });
42
+
43
+ it('PHASE_ORDER follows correct protocol sequence', () => {
44
+ expect(PHASE_ORDER).toEqual([
45
+ 'INTAKE',
46
+ 'REFLECT',
47
+ 'EXECUTE',
48
+ 'COMPRESS',
49
+ 'REINTAKE',
50
+ 'GROW',
51
+ 'EVOLVE',
52
+ ]);
53
+ });
54
+
55
+ it('PHASE_ORDER is readonly', () => {
56
+ // TypeScript enforces this at compile time; runtime check that it's a frozen-like array
57
+ expect(Array.isArray(PHASE_ORDER)).toBe(true);
58
+ });
59
+
60
+ it('DEFAULT_PHASE_TIMINGS covers all phases', () => {
61
+ for (const phase of PHASE_ORDER) {
62
+ expect(DEFAULT_PHASE_TIMINGS[phase]).toBeDefined();
63
+ expect(typeof DEFAULT_PHASE_TIMINGS[phase]).toBe('number');
64
+ expect(DEFAULT_PHASE_TIMINGS[phase]).toBeGreaterThan(0);
65
+ }
66
+ });
67
+
68
+ it('DEFAULT_PHASE_TIMINGS has expected values', () => {
69
+ expect(DEFAULT_PHASE_TIMINGS.INTAKE).toBe(1000);
70
+ expect(DEFAULT_PHASE_TIMINGS.REFLECT).toBe(2000);
71
+ expect(DEFAULT_PHASE_TIMINGS.EXECUTE).toBe(5000);
72
+ expect(DEFAULT_PHASE_TIMINGS.COMPRESS).toBe(1000);
73
+ expect(DEFAULT_PHASE_TIMINGS.REINTAKE).toBe(1000);
74
+ expect(DEFAULT_PHASE_TIMINGS.GROW).toBe(2000);
75
+ expect(DEFAULT_PHASE_TIMINGS.EVOLVE).toBe(1000);
76
+ });
77
+
78
+ it('EXECUTE has the longest default timing', () => {
79
+ const maxPhase = PHASE_ORDER.reduce((a, b) =>
80
+ DEFAULT_PHASE_TIMINGS[a] > DEFAULT_PHASE_TIMINGS[b] ? a : b
81
+ );
82
+ expect(maxPhase).toBe('EXECUTE');
83
+ });
84
+ });
85
+
86
+ // =============================================================================
87
+ // DEFAULT EXPORT
88
+ // =============================================================================
89
+
90
+ describe('AgentTypes — Default Export', () => {
91
+ it('exports PHASE_ORDER and DEFAULT_PHASE_TIMINGS', () => {
92
+ expect(AgentTypesDefault.PHASE_ORDER).toBe(PHASE_ORDER);
93
+ expect(AgentTypesDefault.DEFAULT_PHASE_TIMINGS).toBe(DEFAULT_PHASE_TIMINGS);
94
+ });
95
+ });
96
+
97
+ // =============================================================================
98
+ // TYPE SHAPE VALIDATION (runtime assignability)
99
+ // =============================================================================
100
+
101
+ describe('AgentTypes — PhaseResult shapes', () => {
102
+ it('IntakeResult conforms to expected shape', () => {
103
+ const result: IntakeResult = {
104
+ success: true,
105
+ phase: 'INTAKE',
106
+ duration_ms: 500,
107
+ sources: ['knowledge-store', 'codebase'],
108
+ items_loaded: 42,
109
+ };
110
+ expect(result.phase).toBe('INTAKE');
111
+ expect(result.sources).toHaveLength(2);
112
+ expect(result.items_loaded).toBe(42);
113
+ });
114
+
115
+ it('ReflectResult conforms to expected shape', () => {
116
+ const result: ReflectResult = {
117
+ success: true,
118
+ phase: 'REFLECT',
119
+ duration_ms: 1500,
120
+ analysis_depth: 'deep',
121
+ insights_generated: 5,
122
+ data: {
123
+ priorities: ['fix tests', 'add coverage'],
124
+ risks: ['breaking change'],
125
+ },
126
+ };
127
+ expect(result.analysis_depth).toBe('deep');
128
+ expect(result.insights_generated).toBe(5);
129
+ });
130
+
131
+ it('ExecuteResult conforms to expected shape', () => {
132
+ const result: ExecuteResult = {
133
+ success: true,
134
+ phase: 'EXECUTE',
135
+ duration_ms: 3000,
136
+ actions_taken: 3,
137
+ deliverables: ['file.ts', 'test.ts'],
138
+ };
139
+ expect(result.actions_taken).toBe(3);
140
+ expect(result.deliverables).toHaveLength(2);
141
+ });
142
+
143
+ it('CompressResult conforms to expected shape', () => {
144
+ const result: CompressResult = {
145
+ success: true,
146
+ phase: 'COMPRESS',
147
+ duration_ms: 800,
148
+ compression_ratio: 0.6,
149
+ tokens_saved: 1200,
150
+ data: {
151
+ patterns_extracted: ['singleton', 'factory'],
152
+ wisdom_extracted: ['cache invalidation is hard'],
153
+ gotchas_captured: ['vi.mock needs vi.hoisted'],
154
+ },
155
+ };
156
+ expect(result.compression_ratio).toBe(0.6);
157
+ expect(result.tokens_saved).toBe(1200);
158
+ });
159
+
160
+ it('ReintakeResult conforms to expected shape', () => {
161
+ const result: ReintakeResult = {
162
+ success: true,
163
+ phase: 'REINTAKE',
164
+ duration_ms: 700,
165
+ items_refreshed: 10,
166
+ effectiveness: 0.85,
167
+ };
168
+ expect(result.effectiveness).toBeGreaterThanOrEqual(0);
169
+ expect(result.effectiveness).toBeLessThanOrEqual(1);
170
+ });
171
+
172
+ it('GrowResult conforms to expected shape', () => {
173
+ const result: GrowResult = {
174
+ success: true,
175
+ phase: 'GROW',
176
+ duration_ms: 1800,
177
+ patterns_learned: 2,
178
+ wisdom_gained: 1,
179
+ gotchas_captured: 3,
180
+ data: {
181
+ new_patterns: [{ id: 'P.001', name: 'retry-pattern', confidence: 0.9 }],
182
+ capability_score_delta: 0.05,
183
+ },
184
+ };
185
+ expect(result.patterns_learned).toBe(2);
186
+ expect(result.data?.new_patterns).toHaveLength(1);
187
+ });
188
+
189
+ it('EvolveResult conforms to expected shape', () => {
190
+ const result: EvolveResult = {
191
+ success: true,
192
+ phase: 'EVOLVE',
193
+ duration_ms: 900,
194
+ evolution_level: 3,
195
+ traits_activated: ['spatial-awareness', 'cost-optimization'],
196
+ traits_deactivated: ['verbose-logging'],
197
+ data: {
198
+ efficiency_improvement: 0.12,
199
+ next_evolution_threshold: 100,
200
+ },
201
+ };
202
+ expect(result.evolution_level).toBe(3);
203
+ expect(result.traits_activated).toContain('spatial-awareness');
204
+ });
205
+ });
206
+
207
+ // =============================================================================
208
+ // CYCLE RESULT
209
+ // =============================================================================
210
+
211
+ describe('AgentTypes — CycleResult', () => {
212
+ it('can represent a complete cycle', () => {
213
+ const cycle: CycleResult = {
214
+ cycle_number: 1,
215
+ success: true,
216
+ total_duration_ms: 12000,
217
+ phases: {
218
+ intake: {
219
+ success: true,
220
+ phase: 'INTAKE',
221
+ duration_ms: 1000,
222
+ sources: ['ws'],
223
+ items_loaded: 5,
224
+ },
225
+ execute: {
226
+ success: true,
227
+ phase: 'EXECUTE',
228
+ duration_ms: 5000,
229
+ actions_taken: 2,
230
+ deliverables: ['output.ts'],
231
+ },
232
+ },
233
+ learnings: { patterns: 1, wisdom: 2, gotchas: 0 },
234
+ evolution_delta: 0.1,
235
+ timestamp: new Date().toISOString(),
236
+ };
237
+ expect(cycle.cycle_number).toBe(1);
238
+ expect(cycle.phases.intake?.sources).toContain('ws');
239
+ expect(cycle.phases.reflect).toBeUndefined(); // optional phases
240
+ });
241
+ });
242
+
243
+ // =============================================================================
244
+ // AGENT CONFIGURATION
245
+ // =============================================================================
246
+
247
+ describe('AgentTypes — AgentConfig', () => {
248
+ it('can build a minimal agent config', () => {
249
+ const config: AgentConfig = {
250
+ agent_id: 'agent-001',
251
+ agent_name: 'TestAgent',
252
+ agent_type: 'builder',
253
+ categories: ['analysis'],
254
+ };
255
+ expect(config.agent_id).toBe('agent-001');
256
+ expect(config.categories).toContain('analysis');
257
+ });
258
+
259
+ it('supports all 13 agent categories', () => {
260
+ const categories: AgentCategory[] = [
261
+ 'trading',
262
+ 'analysis',
263
+ 'optimization',
264
+ 'monitoring',
265
+ 'creative',
266
+ 'management',
267
+ 'strategic',
268
+ 'assistant',
269
+ 'orchestrator',
270
+ 'quest_creator',
271
+ 'librarian',
272
+ 'twin_manager',
273
+ 'payment_handler',
274
+ ];
275
+ const config: AgentConfig = {
276
+ agent_id: 'all-cats',
277
+ agent_name: 'OmniAgent',
278
+ agent_type: 'universal',
279
+ categories,
280
+ };
281
+ expect(config.categories).toHaveLength(13);
282
+ });
283
+
284
+ it('supports architecture awareness with music patterns', () => {
285
+ const arch: ArchitectureAwareness = {
286
+ position: 'center',
287
+ section: 'strings',
288
+ role: 'coordinator',
289
+ musicPatterns: {
290
+ interval: 'I',
291
+ formRole: 'exposition',
292
+ pulse: 'strong',
293
+ },
294
+ };
295
+ expect(arch.position).toBe('center');
296
+ expect(arch.musicPatterns?.interval).toBe('I');
297
+ });
298
+
299
+ it('can configure phases individually', () => {
300
+ const phaseConfig: PhaseConfig = {
301
+ enabled: true,
302
+ timeout_ms: 10000,
303
+ retries: 3,
304
+ parallel: false,
305
+ dependencies: ['INTAKE'],
306
+ };
307
+ expect(phaseConfig.retries).toBe(3);
308
+ expect(phaseConfig.dependencies).toContain('INTAKE');
309
+ });
310
+
311
+ it('supports budget configuration', () => {
312
+ const budget: BudgetConfig = {
313
+ max_tokens_per_cycle: 50000,
314
+ max_duration_ms: 60000,
315
+ max_actions_per_minute: 10,
316
+ max_consecutive_failures: 3,
317
+ };
318
+ expect(budget.max_tokens_per_cycle).toBe(50000);
319
+ });
320
+
321
+ it('supports curiosity configuration', () => {
322
+ const curiosity: CuriosityConfig = {
323
+ enabled: true,
324
+ depth: 'deep',
325
+ sources: ['todo', 'codebase', 'pattern'],
326
+ auto_continue: false,
327
+ max_results: 5,
328
+ };
329
+ expect(curiosity.sources).toContain('pattern');
330
+ });
331
+ });
332
+
333
+ // =============================================================================
334
+ // AGENT STATE
335
+ // =============================================================================
336
+
337
+ describe('AgentTypes — AgentState', () => {
338
+ it('can construct a valid agent state', () => {
339
+ const state: AgentState = {
340
+ agent_id: 'test-agent',
341
+ current_phase: 'INTAKE',
342
+ phase_start_time: Date.now(),
343
+ cycle_number: 0,
344
+ knowledge: new Map(),
345
+ patterns: [],
346
+ wisdom: [],
347
+ gotchas: [],
348
+ reflection_context: {},
349
+ execution_result: null,
350
+ compressed_knowledge: '',
351
+ metrics: {
352
+ phases_completed: 0,
353
+ total_cycles: 0,
354
+ efficiency_score: 1.0,
355
+ token_usage: 0,
356
+ },
357
+ is_training_mode: false,
358
+ is_shutting_down: false,
359
+ };
360
+ expect(state.current_phase).toBe('INTAKE');
361
+ expect(state.knowledge).toBeInstanceOf(Map);
362
+ expect(state.is_training_mode).toBe(false);
363
+ });
364
+
365
+ it('supports lifespan context', () => {
366
+ const lifespan: AgentLifespanContext = {
367
+ total_cycles_completed: 42,
368
+ evolution_level: 3,
369
+ performance_trend: 'improving',
370
+ average_cycle_duration: 8500,
371
+ recent_metrics: [
372
+ { cycle_number: 41, duration_ms: 8000, success: true, score: 0.9, timestamp: Date.now() },
373
+ { cycle_number: 42, duration_ms: 7500, success: true, score: 0.95, timestamp: Date.now() },
374
+ ],
375
+ knowledge_growth_trajectory: 1.2,
376
+ adaptation_score: 0.85,
377
+ related_tasks: ['test-coverage', 'trait-expansion'],
378
+ };
379
+ expect(lifespan.performance_trend).toBe('improving');
380
+ expect(lifespan.recent_metrics).toHaveLength(2);
381
+ });
382
+
383
+ it('supports cycle metrics', () => {
384
+ const metric: CycleMetric = {
385
+ cycle_number: 1,
386
+ duration_ms: 5000,
387
+ success: true,
388
+ score: 0.88,
389
+ timestamp: Date.now(),
390
+ };
391
+ expect(metric.score).toBeGreaterThan(0);
392
+ expect(metric.score).toBeLessThanOrEqual(1);
393
+ });
394
+ });
395
+
396
+ // =============================================================================
397
+ // INTER-AGENT COMMUNICATION
398
+ // =============================================================================
399
+
400
+ describe('AgentTypes — Inter-Agent Communication', () => {
401
+ it('AgentMessage supports all priority levels', () => {
402
+ const priorities: MessagePriority[] = ['low', 'medium', 'high', 'critical', 'sovereign'];
403
+ priorities.forEach((priority) => {
404
+ const msg: AgentMessage = {
405
+ id: `msg-${priority}`,
406
+ from: 'agent-a',
407
+ to: 'agent-b',
408
+ type: 'request',
409
+ action: 'analyze',
410
+ payload: { data: true },
411
+ priority,
412
+ timestamp: Date.now(),
413
+ };
414
+ expect(msg.priority).toBe(priority);
415
+ });
416
+ });
417
+
418
+ it('AgentMessage supports broadcast targeting', () => {
419
+ const msg: AgentMessage = {
420
+ id: 'broadcast-1',
421
+ from: 'coordinator',
422
+ to: 'broadcast',
423
+ type: 'notification',
424
+ action: 'shutdown',
425
+ payload: { reason: 'maintenance' },
426
+ priority: 'critical',
427
+ timestamp: Date.now(),
428
+ };
429
+ expect(msg.to).toBe('broadcast');
430
+ });
431
+
432
+ it('AgentMessage supports correlation and TTL', () => {
433
+ const msg: AgentMessage = {
434
+ id: 'req-1',
435
+ from: 'a',
436
+ to: 'b',
437
+ type: 'request',
438
+ action: 'ping',
439
+ payload: {},
440
+ priority: 'low',
441
+ timestamp: Date.now(),
442
+ correlation_id: 'session-xyz',
443
+ ttl_ms: 5000,
444
+ };
445
+ expect(msg.correlation_id).toBe('session-xyz');
446
+ expect(msg.ttl_ms).toBe(5000);
447
+ });
448
+ });
449
+
450
+ // =============================================================================
451
+ // KNOWLEDGE TYPES
452
+ // =============================================================================
453
+
454
+ describe('AgentTypes — Knowledge Types', () => {
455
+ it('PatternEntry has all required fields', () => {
456
+ const pattern: PatternEntry = {
457
+ pattern_id: 'P.001',
458
+ name: 'singleton',
459
+ domain: 'architecture',
460
+ description: 'Ensure single instance',
461
+ template: 'class X { static instance; static get() { ... } }',
462
+ confidence: 0.95,
463
+ usage_count: 42,
464
+ created_at: '2026-01-01',
465
+ updated_at: '2026-03-30',
466
+ tags: ['design-pattern', 'creational'],
467
+ };
468
+ expect(pattern.confidence).toBeGreaterThan(0);
469
+ expect(pattern.tags).toContain('design-pattern');
470
+ });
471
+
472
+ it('WisdomEntry has all required fields', () => {
473
+ const wisdom: WisdomEntry = {
474
+ wisdom_id: 'W.001',
475
+ content: 'Cache invalidation is one of two hard problems in CS',
476
+ domain: 'engineering',
477
+ source: 'Phil Karlton',
478
+ confidence: 1.0,
479
+ citations: ['https://example.com'],
480
+ created_at: '2026-01-01',
481
+ tags: ['caching'],
482
+ };
483
+ expect(wisdom.confidence).toBe(1.0);
484
+ });
485
+
486
+ it('GotchaEntry has all required fields and severity levels', () => {
487
+ const severities = ['low', 'medium', 'high', 'critical'] as const;
488
+ severities.forEach((severity) => {
489
+ const gotcha: GotchaEntry = {
490
+ gotcha_id: `G.${severity}`,
491
+ trigger: 'using vi.mock without vi.hoisted',
492
+ consequence: 'variables are undefined at mock time',
493
+ avoidance: 'wrap mock vars in vi.hoisted()',
494
+ domain: 'testing',
495
+ severity,
496
+ occurrence_count: 5,
497
+ created_at: '2026-01-01',
498
+ tags: ['vitest'],
499
+ };
500
+ expect(gotcha.severity).toBe(severity);
501
+ });
502
+ });
503
+ });
504
+
505
+ // =============================================================================
506
+ // AGENT TRAIT CONTEXT
507
+ // =============================================================================
508
+
509
+ describe('AgentTypes — AgentTraitContext', () => {
510
+ it('supports wallet extension', () => {
511
+ const ctx: Partial<AgentTraitContext> = {
512
+ agent_id: 'wallet-agent',
513
+ wallet: {
514
+ getBalance: async () => 1.5,
515
+ pay: async () => ({ success: true, txHash: '0xabc' }),
516
+ trade: async () => ({ success: true, txHash: '0xdef' }),
517
+ mintNFT: async () => ({ success: true, tokenId: '42' }),
518
+ },
519
+ };
520
+ expect(ctx.wallet).toBeDefined();
521
+ });
522
+
523
+ it('supports story_weaver extension', () => {
524
+ const ctx: Partial<AgentTraitContext> = {
525
+ agent_id: 'story-agent',
526
+ story_weaver: {
527
+ generateNarrative: async () => 'Once upon a time...',
528
+ createWorld: async () => 'world-001',
529
+ deployContracts: async () => true,
530
+ },
531
+ };
532
+ expect(ctx.story_weaver).toBeDefined();
533
+ });
534
+ });
@@ -0,0 +1,152 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { AgentWalletRegistry, getAgentWalletRegistry } from '../AgentWalletRegistry';
3
+
4
+ describe('AgentWalletRegistry', () => {
5
+ // Reset singleton between tests by accessing the private instance
6
+ let registry: AgentWalletRegistry;
7
+
8
+ beforeEach(() => {
9
+ // Get a fresh-ish registry and clean up any leftover wallets
10
+ registry = getAgentWalletRegistry();
11
+ // Unregister known test agents to avoid cross-test pollution
12
+ registry.unregisterWallet('agent-1');
13
+ registry.unregisterWallet('agent-2');
14
+ registry.unregisterWallet('agent-3');
15
+ });
16
+
17
+ // ===========================================================================
18
+ // Singleton
19
+ // ===========================================================================
20
+
21
+ describe('singleton pattern', () => {
22
+ it('getInstance returns the same instance', () => {
23
+ const a = AgentWalletRegistry.getInstance();
24
+ const b = AgentWalletRegistry.getInstance();
25
+ expect(a).toBe(b);
26
+ });
27
+
28
+ it('getAgentWalletRegistry returns the singleton', () => {
29
+ expect(getAgentWalletRegistry()).toBe(AgentWalletRegistry.getInstance());
30
+ });
31
+ });
32
+
33
+ // ===========================================================================
34
+ // registerWallet
35
+ // ===========================================================================
36
+
37
+ describe('registerWallet', () => {
38
+ it('registers a wallet with default networkId (Base L2 = 8453)', () => {
39
+ const wallet = registry.registerWallet('agent-1', '0xABCD');
40
+ expect(wallet.agentId).toBe('agent-1');
41
+ expect(wallet.walletAddress).toBe('0xABCD');
42
+ expect(wallet.networkId).toBe(8453);
43
+ expect(wallet.balanceThreshold).toBe(0.001);
44
+ });
45
+
46
+ it('registers a wallet with custom networkId', () => {
47
+ const wallet = registry.registerWallet('agent-2', '0x1234', 1); // Ethereum mainnet
48
+ expect(wallet.networkId).toBe(1);
49
+ });
50
+
51
+ it('overwrites an existing wallet for the same agent', () => {
52
+ registry.registerWallet('agent-1', '0xOLD');
53
+ registry.registerWallet('agent-1', '0xNEW');
54
+ const wallet = registry.getWallet('agent-1');
55
+ expect(wallet?.walletAddress).toBe('0xNEW');
56
+ });
57
+ });
58
+
59
+ // ===========================================================================
60
+ // getWallet
61
+ // ===========================================================================
62
+
63
+ describe('getWallet', () => {
64
+ it('returns the registered wallet', () => {
65
+ registry.registerWallet('agent-1', '0xABC');
66
+ const wallet = registry.getWallet('agent-1');
67
+ expect(wallet).toBeDefined();
68
+ expect(wallet!.agentId).toBe('agent-1');
69
+ });
70
+
71
+ it('returns undefined for unknown agents', () => {
72
+ expect(registry.getWallet('nonexistent')).toBeUndefined();
73
+ });
74
+ });
75
+
76
+ // ===========================================================================
77
+ // unregisterWallet
78
+ // ===========================================================================
79
+
80
+ describe('unregisterWallet', () => {
81
+ it('removes a registered wallet and returns true', () => {
82
+ registry.registerWallet('agent-1', '0xABC');
83
+ expect(registry.unregisterWallet('agent-1')).toBe(true);
84
+ expect(registry.getWallet('agent-1')).toBeUndefined();
85
+ });
86
+
87
+ it('returns false when unregistering a non-existent wallet', () => {
88
+ expect(registry.unregisterWallet('ghost-agent')).toBe(false);
89
+ });
90
+ });
91
+
92
+ // ===========================================================================
93
+ // authorizeTransaction
94
+ // ===========================================================================
95
+
96
+ describe('authorizeTransaction', () => {
97
+ it('returns a hex signature for a registered agent', async () => {
98
+ registry.registerWallet('agent-1', '0xABC');
99
+ const sig = await registry.authorizeTransaction('agent-1', { action: 'buy', traitId: 'T.001' });
100
+ expect(sig).toMatch(/^0x[0-9a-f]+$/);
101
+ });
102
+
103
+ it('throws for an unregistered agent', async () => {
104
+ await expect(
105
+ registry.authorizeTransaction('unknown-agent', { action: 'buy' })
106
+ ).rejects.toThrow('[AgentWalletRegistry] No wallet registered for agent unknown-agent');
107
+ });
108
+
109
+ it('produces different signatures for different payloads', async () => {
110
+ registry.registerWallet('agent-1', '0xABC');
111
+ const sig1 = await registry.authorizeTransaction('agent-1', { action: 'buy', id: 1 });
112
+ const sig2 = await registry.authorizeTransaction('agent-1', { action: 'sell', id: 2 });
113
+ expect(sig1).not.toBe(sig2);
114
+ });
115
+
116
+ it('signature is deterministic for the same payload', async () => {
117
+ registry.registerWallet('agent-1', '0xABC');
118
+ const payload = { action: 'buy', traitId: 'T.001' };
119
+ const sig1 = await registry.authorizeTransaction('agent-1', payload);
120
+ const sig2 = await registry.authorizeTransaction('agent-1', payload);
121
+ expect(sig1).toBe(sig2);
122
+ });
123
+
124
+ it('signature length is capped at 64 hex chars after 0x prefix', async () => {
125
+ registry.registerWallet('agent-1', '0xABC');
126
+ const sig = await registry.authorizeTransaction('agent-1', { data: 'x'.repeat(1000) });
127
+ // Implementation: '0x' + hex.slice(0, 64)
128
+ const hexPart = sig.slice(2);
129
+ expect(hexPart.length).toBeLessThanOrEqual(64);
130
+ });
131
+ });
132
+
133
+ // ===========================================================================
134
+ // Integration: register → authorize → unregister
135
+ // ===========================================================================
136
+
137
+ describe('lifecycle', () => {
138
+ it('register → authorize → unregister → authorize fails', async () => {
139
+ registry.registerWallet('agent-3', '0xDEF');
140
+ // Should work
141
+ await expect(
142
+ registry.authorizeTransaction('agent-3', { action: 'test' })
143
+ ).resolves.toBeDefined();
144
+ // Unregister
145
+ registry.unregisterWallet('agent-3');
146
+ // Should fail
147
+ await expect(
148
+ registry.authorizeTransaction('agent-3', { action: 'test' })
149
+ ).rejects.toThrow();
150
+ });
151
+ });
152
+ });