@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,509 @@
1
+ /**
2
+ * BroadcastChannel - Named messaging channels for swarm groups
3
+ * HoloScript v3.2 - Autonomous Agent Swarms
4
+ *
5
+ * Provides named channels for targeted group communication
6
+ */
7
+
8
+ /**
9
+ * Channel message
10
+ */
11
+ export interface IChannelMessage {
12
+ id: string;
13
+ channelId: string;
14
+ senderId: string;
15
+ content: unknown;
16
+ timestamp: number;
17
+ replyTo?: string;
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+
21
+ /**
22
+ * Channel subscriber info
23
+ */
24
+ export interface IChannelSubscriber {
25
+ id: string;
26
+ agentId: string;
27
+ joinedAt: number;
28
+ role: 'publisher' | 'subscriber' | 'both';
29
+ lastActivity: number;
30
+ }
31
+
32
+ /**
33
+ * Channel configuration
34
+ */
35
+ export interface IChannelConfig {
36
+ /** Maximum subscribers per channel */
37
+ maxSubscribers: number;
38
+ /** Message history size */
39
+ historySize: number;
40
+ /** Allow replays */
41
+ allowReplay: boolean;
42
+ /** Require acknowledgment */
43
+ requireAck: boolean;
44
+ /** Message TTL in milliseconds */
45
+ messageTTL: number;
46
+ }
47
+
48
+ /**
49
+ * Message handler type
50
+ */
51
+ export type MessageHandler = (message: IChannelMessage) => void | Promise<void>;
52
+
53
+ /**
54
+ * BroadcastChannel - Named channel for group messaging
55
+ */
56
+ export class BroadcastChannel {
57
+ readonly id: string;
58
+ readonly name: string;
59
+ readonly createdAt: number;
60
+
61
+ private subscribers: Map<string, IChannelSubscriber> = new Map();
62
+ private handlers: Map<string, MessageHandler> = new Map();
63
+ private history: IChannelMessage[] = [];
64
+ private config: IChannelConfig;
65
+ private nextMsgId = 1;
66
+ private pendingAcks: Map<string, Set<string>> = new Map();
67
+
68
+ constructor(id: string, name: string, config?: Partial<IChannelConfig>) {
69
+ this.id = id;
70
+ this.name = name;
71
+ this.createdAt = Date.now();
72
+ this.config = {
73
+ maxSubscribers: 1000,
74
+ historySize: 100,
75
+ allowReplay: true,
76
+ requireAck: false,
77
+ messageTTL: 60000,
78
+ ...config,
79
+ };
80
+ }
81
+
82
+ /**
83
+ * Subscribe an agent to the channel
84
+ */
85
+ subscribe(
86
+ agentId: string,
87
+ handler: MessageHandler,
88
+ options: { role?: 'publisher' | 'subscriber' | 'both' } = {}
89
+ ): string {
90
+ if (this.subscribers.size >= this.config.maxSubscribers) {
91
+ throw new Error(`Channel ${this.name} has reached maximum subscribers`);
92
+ }
93
+
94
+ const subscriberId = `sub-${agentId}-${Date.now()}`;
95
+
96
+ const subscriber: IChannelSubscriber = {
97
+ id: subscriberId,
98
+ agentId,
99
+ joinedAt: Date.now(),
100
+ role: options.role ?? 'both',
101
+ lastActivity: Date.now(),
102
+ };
103
+
104
+ this.subscribers.set(subscriberId, subscriber);
105
+ this.handlers.set(subscriberId, handler);
106
+
107
+ return subscriberId;
108
+ }
109
+
110
+ /**
111
+ * Unsubscribe from the channel
112
+ */
113
+ unsubscribe(subscriberId: string): boolean {
114
+ const removed = this.subscribers.delete(subscriberId);
115
+ this.handlers.delete(subscriberId);
116
+ return removed;
117
+ }
118
+
119
+ /**
120
+ * Broadcast a message to all subscribers
121
+ */
122
+ async broadcast(
123
+ senderId: string,
124
+ content: unknown,
125
+ options: {
126
+ replyTo?: string;
127
+ metadata?: Record<string, unknown>;
128
+ } = {}
129
+ ): Promise<string> {
130
+ const messageId = `msg-${this.nextMsgId++}-${Date.now()}`;
131
+
132
+ const message: IChannelMessage = {
133
+ id: messageId,
134
+ channelId: this.id,
135
+ senderId,
136
+ content,
137
+ timestamp: Date.now(),
138
+ replyTo: options.replyTo,
139
+ metadata: options.metadata,
140
+ };
141
+
142
+ // Add to history
143
+ this.addToHistory(message);
144
+
145
+ // Track pending acks if required
146
+ if (this.config.requireAck) {
147
+ const pendingAgents = new Set<string>();
148
+ for (const sub of this.subscribers.values()) {
149
+ if (sub.agentId !== senderId) {
150
+ pendingAgents.add(sub.agentId);
151
+ }
152
+ }
153
+ this.pendingAcks.set(messageId, pendingAgents);
154
+ }
155
+
156
+ // Deliver to all subscribers
157
+ const deliveryPromises: Promise<void>[] = [];
158
+
159
+ for (const [subId, sub] of this.subscribers) {
160
+ if (sub.role === 'publisher') continue; // Publishers don't receive
161
+
162
+ const handler = this.handlers.get(subId);
163
+ if (handler) {
164
+ sub.lastActivity = Date.now();
165
+ deliveryPromises.push(
166
+ Promise.resolve(handler(message)).catch(() => {
167
+ // Handler error - log and continue
168
+ })
169
+ );
170
+ }
171
+ }
172
+
173
+ await Promise.all(deliveryPromises);
174
+
175
+ return messageId;
176
+ }
177
+
178
+ /**
179
+ * Send a direct message to specific subscriber
180
+ */
181
+ async sendDirect(
182
+ senderId: string,
183
+ targetAgentId: string,
184
+ content: unknown,
185
+ options: {
186
+ replyTo?: string;
187
+ metadata?: Record<string, unknown>;
188
+ } = {}
189
+ ): Promise<string | null> {
190
+ const messageId = `msg-${this.nextMsgId++}-${Date.now()}`;
191
+
192
+ const message: IChannelMessage = {
193
+ id: messageId,
194
+ channelId: this.id,
195
+ senderId,
196
+ content,
197
+ timestamp: Date.now(),
198
+ replyTo: options.replyTo,
199
+ metadata: { ...options.metadata, directTo: targetAgentId },
200
+ };
201
+
202
+ // Find target subscriber
203
+ let delivered = false;
204
+ for (const [subId, sub] of this.subscribers) {
205
+ if (sub.agentId === targetAgentId && sub.role !== 'publisher') {
206
+ const handler = this.handlers.get(subId);
207
+ if (handler) {
208
+ sub.lastActivity = Date.now();
209
+ await handler(message);
210
+ delivered = true;
211
+ }
212
+ }
213
+ }
214
+
215
+ return delivered ? messageId : null;
216
+ }
217
+
218
+ /**
219
+ * Acknowledge a message
220
+ */
221
+ acknowledge(messageId: string, agentId: string): boolean {
222
+ const pending = this.pendingAcks.get(messageId);
223
+ if (!pending) return false;
224
+
225
+ pending.delete(agentId);
226
+
227
+ if (pending.size === 0) {
228
+ this.pendingAcks.delete(messageId);
229
+ }
230
+
231
+ return true;
232
+ }
233
+
234
+ /**
235
+ * Check if message is fully acknowledged
236
+ */
237
+ isFullyAcknowledged(messageId: string): boolean {
238
+ return !this.pendingAcks.has(messageId);
239
+ }
240
+
241
+ /**
242
+ * Get pending acknowledgments for a message
243
+ */
244
+ getPendingAcks(messageId: string): string[] {
245
+ const pending = this.pendingAcks.get(messageId);
246
+ return pending ? [...pending] : [];
247
+ }
248
+
249
+ /**
250
+ * Add message to history
251
+ */
252
+ private addToHistory(message: IChannelMessage): void {
253
+ this.history.push(message);
254
+
255
+ // Trim to size
256
+ while (this.history.length > this.config.historySize) {
257
+ this.history.shift();
258
+ }
259
+
260
+ // Remove expired messages
261
+ const now = Date.now();
262
+ this.history = this.history.filter((msg) => now - msg.timestamp < this.config.messageTTL);
263
+ }
264
+
265
+ /**
266
+ * Get message history
267
+ */
268
+ getHistory(
269
+ options: {
270
+ limit?: number;
271
+ since?: number;
272
+ senderId?: string;
273
+ } = {}
274
+ ): IChannelMessage[] {
275
+ if (!this.config.allowReplay) {
276
+ return [];
277
+ }
278
+
279
+ let result = [...this.history];
280
+
281
+ if (options.since) {
282
+ result = result.filter((m) => m.timestamp > options.since!);
283
+ }
284
+
285
+ if (options.senderId) {
286
+ result = result.filter((m) => m.senderId === options.senderId);
287
+ }
288
+
289
+ if (options.limit) {
290
+ result = result.slice(-options.limit);
291
+ }
292
+
293
+ return result;
294
+ }
295
+
296
+ /**
297
+ * Replay history to a subscriber
298
+ */
299
+ async replayHistory(
300
+ subscriberId: string,
301
+ options: { since?: number; limit?: number } = {}
302
+ ): Promise<number> {
303
+ if (!this.config.allowReplay) {
304
+ return 0;
305
+ }
306
+
307
+ const handler = this.handlers.get(subscriberId);
308
+ if (!handler) return 0;
309
+
310
+ const messages = this.getHistory(options);
311
+ let replayed = 0;
312
+
313
+ for (const message of messages) {
314
+ try {
315
+ await handler(message);
316
+ replayed++;
317
+ } catch {
318
+ // Continue on error
319
+ }
320
+ }
321
+
322
+ return replayed;
323
+ }
324
+
325
+ /**
326
+ * Get all subscribers
327
+ */
328
+ getSubscribers(): IChannelSubscriber[] {
329
+ return [...this.subscribers.values()];
330
+ }
331
+
332
+ /**
333
+ * Get subscriber count
334
+ */
335
+ getSubscriberCount(): number {
336
+ return this.subscribers.size;
337
+ }
338
+
339
+ /**
340
+ * Check if agent is subscribed
341
+ */
342
+ isSubscribed(agentId: string): boolean {
343
+ for (const sub of this.subscribers.values()) {
344
+ if (sub.agentId === agentId) return true;
345
+ }
346
+ return false;
347
+ }
348
+
349
+ /**
350
+ * Get channel statistics
351
+ */
352
+ getStats(): {
353
+ subscriberCount: number;
354
+ historySize: number;
355
+ pendingAckCount: number;
356
+ oldestMessage: number | null;
357
+ newestMessage: number | null;
358
+ } {
359
+ return {
360
+ subscriberCount: this.subscribers.size,
361
+ historySize: this.history.length,
362
+ pendingAckCount: this.pendingAcks.size,
363
+ oldestMessage: this.history.length > 0 ? this.history[0].timestamp : null,
364
+ newestMessage:
365
+ this.history.length > 0 ? this.history[this.history.length - 1].timestamp : null,
366
+ };
367
+ }
368
+
369
+ /**
370
+ * Get configuration
371
+ */
372
+ getConfig(): IChannelConfig {
373
+ return { ...this.config };
374
+ }
375
+
376
+ /**
377
+ * Clear history
378
+ */
379
+ clearHistory(): void {
380
+ this.history = [];
381
+ }
382
+ }
383
+
384
+ /**
385
+ * ChannelManager - Manages multiple broadcast channels
386
+ */
387
+ export class ChannelManager {
388
+ private channels: Map<string, BroadcastChannel> = new Map();
389
+ private agentChannels: Map<string, Set<string>> = new Map();
390
+ private nextId = 1;
391
+
392
+ /**
393
+ * Create a new channel
394
+ */
395
+ createChannel(name: string, config?: Partial<IChannelConfig>): BroadcastChannel {
396
+ const id = `ch-${this.nextId++}-${Date.now()}`;
397
+ const channel = new BroadcastChannel(id, name, config);
398
+ this.channels.set(id, channel);
399
+ return channel;
400
+ }
401
+
402
+ /**
403
+ * Get a channel by ID
404
+ */
405
+ getChannel(channelId: string): BroadcastChannel | undefined {
406
+ return this.channels.get(channelId);
407
+ }
408
+
409
+ /**
410
+ * Get channel by name
411
+ */
412
+ getChannelByName(name: string): BroadcastChannel | undefined {
413
+ for (const channel of this.channels.values()) {
414
+ if (channel.name === name) return channel;
415
+ }
416
+ return undefined;
417
+ }
418
+
419
+ /**
420
+ * Delete a channel
421
+ */
422
+ deleteChannel(channelId: string): boolean {
423
+ const channel = this.channels.get(channelId);
424
+ if (!channel) return false;
425
+
426
+ // Untrack agents
427
+ for (const sub of channel.getSubscribers()) {
428
+ const agentChannelSet = this.agentChannels.get(sub.agentId);
429
+ if (agentChannelSet) {
430
+ agentChannelSet.delete(channelId);
431
+ }
432
+ }
433
+
434
+ return this.channels.delete(channelId);
435
+ }
436
+
437
+ /**
438
+ * Get all channels
439
+ */
440
+ getAllChannels(): BroadcastChannel[] {
441
+ return [...this.channels.values()];
442
+ }
443
+
444
+ /**
445
+ * Subscribe agent to channel
446
+ */
447
+ subscribeAgent(
448
+ agentId: string,
449
+ channelId: string,
450
+ handler: MessageHandler,
451
+ options?: { role?: 'publisher' | 'subscriber' | 'both' }
452
+ ): string {
453
+ const channel = this.channels.get(channelId);
454
+ if (!channel) {
455
+ throw new Error(`Channel ${channelId} not found`);
456
+ }
457
+
458
+ const subscriberId = channel.subscribe(agentId, handler, options);
459
+
460
+ // Track agent channels
461
+ if (!this.agentChannels.has(agentId)) {
462
+ this.agentChannels.set(agentId, new Set());
463
+ }
464
+ this.agentChannels.get(agentId)!.add(channelId);
465
+
466
+ return subscriberId;
467
+ }
468
+
469
+ /**
470
+ * Get channels an agent is subscribed to
471
+ */
472
+ getAgentChannels(agentId: string): BroadcastChannel[] {
473
+ const channelIds = this.agentChannels.get(agentId);
474
+ if (!channelIds) return [];
475
+
476
+ return [...channelIds]
477
+ .map((id) => this.channels.get(id))
478
+ .filter((c): c is BroadcastChannel => c !== undefined);
479
+ }
480
+
481
+ /**
482
+ * Broadcast to multiple channels
483
+ */
484
+ async multicast(
485
+ channelIds: string[],
486
+ senderId: string,
487
+ content: unknown,
488
+ options?: { metadata?: Record<string, unknown> }
489
+ ): Promise<Map<string, string>> {
490
+ const results = new Map<string, string>();
491
+
492
+ for (const channelId of channelIds) {
493
+ const channel = this.channels.get(channelId);
494
+ if (channel) {
495
+ const msgId = await channel.broadcast(senderId, content, options);
496
+ results.set(channelId, msgId);
497
+ }
498
+ }
499
+
500
+ return results;
501
+ }
502
+
503
+ /**
504
+ * Get channel count
505
+ */
506
+ getChannelCount(): number {
507
+ return this.channels.size;
508
+ }
509
+ }