@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,970 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/negotiation/index.ts
21
+ var negotiation_exports = {};
22
+ __export(negotiation_exports, {
23
+ NegotiationProtocol: () => NegotiationProtocol,
24
+ approvalHandler: () => approvalHandler,
25
+ bordaHandler: () => bordaHandler,
26
+ checkQuorum: () => checkQuorum,
27
+ consensusHandler: () => consensusHandler,
28
+ getNegotiationProtocol: () => getNegotiationProtocol,
29
+ getTrustWeight: () => getTrustWeight,
30
+ getVotingHandler: () => getVotingHandler,
31
+ majorityHandler: () => majorityHandler,
32
+ rankedHandler: () => rankedHandler,
33
+ resetNegotiationProtocol: () => resetNegotiationProtocol,
34
+ supermajorityHandler: () => supermajorityHandler,
35
+ weightedHandler: () => weightedHandler
36
+ });
37
+ module.exports = __toCommonJS(negotiation_exports);
38
+
39
+ // src/negotiation/VotingMechanisms.ts
40
+ function getTotalWeight(votes) {
41
+ return votes.reduce((sum, v) => sum + v.weight, 0);
42
+ }
43
+ function initializeTallies(proposals) {
44
+ const tallies = /* @__PURE__ */ new Map();
45
+ for (const p of proposals) {
46
+ tallies.set(p.id, {
47
+ proposalId: p.id,
48
+ voteCount: 0,
49
+ weightedScore: 0,
50
+ approvalCount: 0,
51
+ bordaPoints: 0,
52
+ percentage: 0
53
+ });
54
+ }
55
+ return tallies;
56
+ }
57
+ function talliesToArray(tallies, totalWeight) {
58
+ const arr = Array.from(tallies.values());
59
+ for (const t of arr) {
60
+ t.percentage = totalWeight > 0 ? t.weightedScore / totalWeight * 100 : 0;
61
+ }
62
+ return arr.sort((a, b) => b.weightedScore - a.weightedScore);
63
+ }
64
+ function findTies(tallies) {
65
+ if (tallies.length < 2) return [];
66
+ const topScore = tallies[0].weightedScore;
67
+ return tallies.filter((t) => t.weightedScore === topScore);
68
+ }
69
+ function breakTie(tied, proposals, config) {
70
+ if (tied.length === 0) return void 0;
71
+ if (tied.length === 1) return tied[0].proposalId;
72
+ switch (config.tieBreaker) {
73
+ case "random":
74
+ return tied[Math.floor(Math.random() * tied.length)].proposalId;
75
+ case "seniority": {
76
+ const proposalMap = new Map(proposals.map((p) => [p.id, p]));
77
+ const sorted = [...tied].sort((a, b) => {
78
+ const pa = proposalMap.get(a.proposalId);
79
+ const pb = proposalMap.get(b.proposalId);
80
+ return (pa?.submittedAt || 0) - (pb?.submittedAt || 0);
81
+ });
82
+ return sorted[0].proposalId;
83
+ }
84
+ case "priority": {
85
+ const proposalMap = new Map(proposals.map((p) => [p.id, p]));
86
+ const sorted = [...tied].sort((a, b) => {
87
+ const pa = proposalMap.get(a.proposalId);
88
+ const pb = proposalMap.get(b.proposalId);
89
+ return (pb?.priority || 0) - (pa?.priority || 0);
90
+ });
91
+ return sorted[0].proposalId;
92
+ }
93
+ case "proposer":
94
+ return tied[0].proposalId;
95
+ case "escalate":
96
+ default:
97
+ return void 0;
98
+ }
99
+ }
100
+ var majorityHandler = {
101
+ count(votes, proposals, config, _round) {
102
+ const tallies = initializeTallies(proposals);
103
+ const totalWeight = getTotalWeight(votes);
104
+ for (const vote of votes) {
105
+ if (vote.ranking.length > 0) {
106
+ const firstChoice = vote.ranking[0];
107
+ const tally = tallies.get(firstChoice);
108
+ if (tally) {
109
+ tally.voteCount++;
110
+ tally.weightedScore += vote.weight;
111
+ }
112
+ }
113
+ }
114
+ const sorted = talliesToArray(tallies, totalWeight);
115
+ const ties = findTies(sorted);
116
+ if (sorted.length > 0 && sorted[0].percentage > 50) {
117
+ return {
118
+ tallies: sorted,
119
+ winnerId: sorted[0].proposalId,
120
+ resolved: true,
121
+ outcome: "winner_declared",
122
+ consensusLevel: sorted[0].percentage / 100
123
+ };
124
+ }
125
+ if (ties.length > 1) {
126
+ const tieBreakWinner = breakTie(ties, proposals, config);
127
+ if (tieBreakWinner) {
128
+ return {
129
+ tallies: sorted,
130
+ winnerId: tieBreakWinner,
131
+ resolved: true,
132
+ outcome: "tie_broken",
133
+ tie: true
134
+ };
135
+ }
136
+ return {
137
+ tallies: sorted,
138
+ resolved: false,
139
+ outcome: "deadlock",
140
+ tie: true
141
+ };
142
+ }
143
+ if (sorted.length > 0) {
144
+ return {
145
+ tallies: sorted,
146
+ winnerId: sorted[0].proposalId,
147
+ resolved: true,
148
+ outcome: "winner_declared",
149
+ consensusLevel: sorted[0].percentage / 100
150
+ };
151
+ }
152
+ return {
153
+ tallies: sorted,
154
+ resolved: false,
155
+ outcome: "deadlock"
156
+ };
157
+ },
158
+ validateVote(vote, proposals) {
159
+ if (vote.ranking.length === 0) return false;
160
+ const proposalIds = new Set(proposals.map((p) => p.id));
161
+ return proposalIds.has(vote.ranking[0]);
162
+ },
163
+ getRequiredQuorum(config) {
164
+ return config.quorum || 0.5;
165
+ }
166
+ };
167
+ var supermajorityHandler = {
168
+ count(votes, proposals, _config, _round) {
169
+ const tallies = initializeTallies(proposals);
170
+ const totalWeight = getTotalWeight(votes);
171
+ for (const vote of votes) {
172
+ if (vote.ranking.length > 0) {
173
+ const firstChoice = vote.ranking[0];
174
+ const tally = tallies.get(firstChoice);
175
+ if (tally) {
176
+ tally.voteCount++;
177
+ tally.weightedScore += vote.weight;
178
+ }
179
+ }
180
+ }
181
+ const sorted = talliesToArray(tallies, totalWeight);
182
+ const threshold = 66.67;
183
+ if (sorted.length > 0 && sorted[0].percentage >= threshold) {
184
+ return {
185
+ tallies: sorted,
186
+ winnerId: sorted[0].proposalId,
187
+ resolved: true,
188
+ outcome: "winner_declared",
189
+ consensusLevel: sorted[0].percentage / 100
190
+ };
191
+ }
192
+ return {
193
+ tallies: sorted,
194
+ resolved: false,
195
+ outcome: "deadlock"
196
+ };
197
+ },
198
+ validateVote(vote, proposals) {
199
+ return majorityHandler.validateVote(vote, proposals);
200
+ },
201
+ getRequiredQuorum(config) {
202
+ return config.quorum || 0.67;
203
+ }
204
+ };
205
+ var weightedHandler = {
206
+ count(votes, proposals, config, round) {
207
+ return majorityHandler.count(votes, proposals, config, round);
208
+ },
209
+ validateVote(vote, proposals) {
210
+ return majorityHandler.validateVote(vote, proposals);
211
+ },
212
+ getRequiredQuorum(config) {
213
+ return config.quorum || 0.5;
214
+ }
215
+ };
216
+ var consensusHandler = {
217
+ count(votes, proposals, _config, _round) {
218
+ if (votes.length === 0) {
219
+ return {
220
+ tallies: [],
221
+ resolved: false,
222
+ outcome: "deadlock"
223
+ };
224
+ }
225
+ const tallies = initializeTallies(proposals);
226
+ const totalWeight = getTotalWeight(votes);
227
+ const firstChoices = /* @__PURE__ */ new Map();
228
+ for (const vote of votes) {
229
+ if (vote.ranking.length > 0) {
230
+ const choice = vote.ranking[0];
231
+ const tally = tallies.get(choice);
232
+ if (tally) {
233
+ tally.voteCount++;
234
+ tally.weightedScore += vote.weight;
235
+ }
236
+ if (!firstChoices.has(choice)) {
237
+ firstChoices.set(choice, []);
238
+ }
239
+ firstChoices.get(choice).push(vote.agentId);
240
+ }
241
+ }
242
+ const sorted = talliesToArray(tallies, totalWeight);
243
+ if (firstChoices.size === 1) {
244
+ const winnerId = Array.from(firstChoices.keys())[0];
245
+ return {
246
+ tallies: sorted,
247
+ winnerId,
248
+ resolved: true,
249
+ outcome: "consensus_reached",
250
+ consensusLevel: 1
251
+ };
252
+ }
253
+ const leader = sorted[0];
254
+ const leaderVoters = new Set(firstChoices.get(leader.proposalId) || []);
255
+ const dissenters = votes.filter((v) => !leaderVoters.has(v.agentId)).map((v) => v.agentId);
256
+ return {
257
+ tallies: sorted,
258
+ resolved: false,
259
+ outcome: "deadlock",
260
+ consensusLevel: leader.percentage / 100,
261
+ dissenters
262
+ };
263
+ },
264
+ validateVote(vote, proposals) {
265
+ return majorityHandler.validateVote(vote, proposals);
266
+ },
267
+ getRequiredQuorum() {
268
+ return 1;
269
+ }
270
+ };
271
+ var rankedHandler = {
272
+ count(votes, proposals, _config, _round) {
273
+ const eliminated = /* @__PURE__ */ new Set();
274
+ const runoffVotes = votes.map((v) => ({
275
+ ...v,
276
+ currentRanking: [...v.ranking]
277
+ }));
278
+ const totalWeight = getTotalWeight(votes);
279
+ let rounds = 0;
280
+ const maxRounds = proposals.length;
281
+ while (rounds < maxRounds) {
282
+ rounds++;
283
+ const tallies = initializeTallies(proposals.filter((p) => !eliminated.has(p.id)));
284
+ for (const vote of runoffVotes) {
285
+ const validChoice = vote.currentRanking.find((id) => !eliminated.has(id));
286
+ if (validChoice) {
287
+ const tally = tallies.get(validChoice);
288
+ if (tally) {
289
+ tally.voteCount++;
290
+ tally.weightedScore += vote.weight;
291
+ }
292
+ }
293
+ }
294
+ const sorted = talliesToArray(tallies, totalWeight);
295
+ if (sorted.length > 0 && sorted[0].percentage > 50) {
296
+ return {
297
+ tallies: sorted,
298
+ winnerId: sorted[0].proposalId,
299
+ resolved: true,
300
+ outcome: "winner_declared",
301
+ eliminated: Array.from(eliminated),
302
+ consensusLevel: sorted[0].percentage / 100
303
+ };
304
+ }
305
+ if (sorted.length > 1) {
306
+ const loser = sorted[sorted.length - 1];
307
+ eliminated.add(loser.proposalId);
308
+ } else if (sorted.length === 1) {
309
+ return {
310
+ tallies: sorted,
311
+ winnerId: sorted[0].proposalId,
312
+ resolved: true,
313
+ outcome: "winner_declared",
314
+ eliminated: Array.from(eliminated)
315
+ };
316
+ } else {
317
+ break;
318
+ }
319
+ }
320
+ return {
321
+ tallies: [],
322
+ resolved: false,
323
+ outcome: "deadlock",
324
+ eliminated: Array.from(eliminated)
325
+ };
326
+ },
327
+ validateVote(vote, proposals) {
328
+ if (vote.ranking.length === 0) return false;
329
+ const proposalIds = new Set(proposals.map((p) => p.id));
330
+ return vote.ranking.every((id) => proposalIds.has(id));
331
+ },
332
+ getRequiredQuorum(config) {
333
+ return config.quorum || 0.5;
334
+ }
335
+ };
336
+ var approvalHandler = {
337
+ count(votes, proposals, config, _round) {
338
+ const tallies = initializeTallies(proposals);
339
+ const totalVotes = votes.length;
340
+ for (const vote of votes) {
341
+ const approvals = vote.approvals || vote.ranking;
342
+ for (const proposalId of approvals) {
343
+ const tally = tallies.get(proposalId);
344
+ if (tally) {
345
+ tally.voteCount++;
346
+ tally.weightedScore += vote.weight;
347
+ tally.approvalCount = (tally.approvalCount || 0) + 1;
348
+ }
349
+ }
350
+ }
351
+ const sorted = talliesToArray(
352
+ tallies,
353
+ votes.reduce((s, v) => s + v.weight, 0)
354
+ );
355
+ const ties = findTies(sorted);
356
+ if (ties.length > 1) {
357
+ const tieBreakWinner = breakTie(ties, proposals, config);
358
+ if (tieBreakWinner) {
359
+ return {
360
+ tallies: sorted,
361
+ winnerId: tieBreakWinner,
362
+ resolved: true,
363
+ outcome: "tie_broken",
364
+ tie: true
365
+ };
366
+ }
367
+ }
368
+ if (sorted.length > 0) {
369
+ return {
370
+ tallies: sorted,
371
+ winnerId: sorted[0].proposalId,
372
+ resolved: true,
373
+ outcome: "winner_declared",
374
+ consensusLevel: totalVotes > 0 ? (sorted[0].approvalCount || 0) / totalVotes : 0
375
+ };
376
+ }
377
+ return {
378
+ tallies: sorted,
379
+ resolved: false,
380
+ outcome: "deadlock"
381
+ };
382
+ },
383
+ validateVote(vote, proposals) {
384
+ const approvals = vote.approvals || vote.ranking;
385
+ if (approvals.length === 0) return false;
386
+ const proposalIds = new Set(proposals.map((p) => p.id));
387
+ return approvals.every((id) => proposalIds.has(id));
388
+ },
389
+ getRequiredQuorum(config) {
390
+ return config.quorum || 0.5;
391
+ }
392
+ };
393
+ var bordaHandler = {
394
+ count(votes, proposals, config, _round) {
395
+ const tallies = initializeTallies(proposals);
396
+ const n = proposals.length;
397
+ for (const vote of votes) {
398
+ for (let i = 0; i < vote.ranking.length; i++) {
399
+ const proposalId = vote.ranking[i];
400
+ const tally = tallies.get(proposalId);
401
+ if (tally) {
402
+ const points = (n - 1 - i) * vote.weight;
403
+ tally.bordaPoints = (tally.bordaPoints || 0) + points;
404
+ tally.weightedScore += points;
405
+ tally.voteCount++;
406
+ }
407
+ }
408
+ }
409
+ const sorted = talliesToArray(tallies, n * votes.reduce((s, v) => s + v.weight, 0));
410
+ const ties = findTies(sorted);
411
+ if (ties.length > 1) {
412
+ const tieBreakWinner = breakTie(ties, proposals, config);
413
+ if (tieBreakWinner) {
414
+ return {
415
+ tallies: sorted,
416
+ winnerId: tieBreakWinner,
417
+ resolved: true,
418
+ outcome: "tie_broken",
419
+ tie: true
420
+ };
421
+ }
422
+ }
423
+ if (sorted.length > 0) {
424
+ return {
425
+ tallies: sorted,
426
+ winnerId: sorted[0].proposalId,
427
+ resolved: true,
428
+ outcome: "winner_declared"
429
+ };
430
+ }
431
+ return {
432
+ tallies: sorted,
433
+ resolved: false,
434
+ outcome: "deadlock"
435
+ };
436
+ },
437
+ validateVote(vote, proposals) {
438
+ return rankedHandler.validateVote(vote, proposals);
439
+ },
440
+ getRequiredQuorum(config) {
441
+ return config.quorum || 0.5;
442
+ }
443
+ };
444
+ function getVotingHandler(mechanism) {
445
+ switch (mechanism) {
446
+ case "majority":
447
+ return majorityHandler;
448
+ case "supermajority":
449
+ return supermajorityHandler;
450
+ case "weighted":
451
+ return weightedHandler;
452
+ case "consensus":
453
+ return consensusHandler;
454
+ case "ranked":
455
+ return rankedHandler;
456
+ case "approval":
457
+ return approvalHandler;
458
+ case "borda":
459
+ return bordaHandler;
460
+ case "custom":
461
+ default:
462
+ return majorityHandler;
463
+ }
464
+ }
465
+ function checkQuorum(votes, participants, config, mechanism) {
466
+ const handler = getVotingHandler(mechanism);
467
+ const requiredQuorum = handler.getRequiredQuorum(config);
468
+ const participation = participants > 0 ? votes.length / participants : 0;
469
+ return participation >= requiredQuorum;
470
+ }
471
+ function getTrustWeight(trustLevel) {
472
+ switch (trustLevel) {
473
+ case "local":
474
+ return 1;
475
+ case "verified":
476
+ return 0.8;
477
+ case "external":
478
+ return 0.5;
479
+ default:
480
+ return 0.5;
481
+ }
482
+ }
483
+
484
+ // src/negotiation/NegotiationProtocol.ts
485
+ var NegotiationProtocol = class {
486
+ sessions = /* @__PURE__ */ new Map();
487
+ auditLog = [];
488
+ deadlines = /* @__PURE__ */ new Map();
489
+ eventHandlers = /* @__PURE__ */ new Map();
490
+ sessionCounter = 0;
491
+ proposalCounter = 0;
492
+ voteCounter = 0;
493
+ // ===========================================================================
494
+ // PUBLIC API
495
+ // ===========================================================================
496
+ /**
497
+ * Initiate a new negotiation session
498
+ */
499
+ async initiate(options) {
500
+ const sessionId = this.generateSessionId();
501
+ const timeout = options.timeout ?? 6e4;
502
+ const config = {
503
+ mechanism: options.votingMechanism || "majority",
504
+ votingMechanism: options.votingMechanism || "majority",
505
+ quorum: options.quorum ?? 0.5,
506
+ timeout,
507
+ votingDeadline: timeout,
508
+ proposalDeadline: timeout,
509
+ maxRounds: options.maxRounds ?? 3,
510
+ allowAbstain: options.allowAbstain ?? true,
511
+ requireJustification: options.requireJustification ?? false,
512
+ tieBreaker: options.tieBreaker ?? "random",
513
+ escalationPath: options.escalationPath
514
+ };
515
+ const now = Date.now();
516
+ const session = {
517
+ id: sessionId,
518
+ topic: options.topic,
519
+ description: options.description,
520
+ participants: [...options.participants],
521
+ status: "open",
522
+ proposals: [],
523
+ votes: [],
524
+ config,
525
+ round: 1,
526
+ currentRound: 1,
527
+ createdAt: now,
528
+ startedAt: now,
529
+ lastActivityAt: now,
530
+ deadline: now + timeout,
531
+ history: [],
532
+ metadata: options.metadata || {}
533
+ };
534
+ this.sessions.set(sessionId, session);
535
+ this.startDeadlineTimer(session);
536
+ this.audit("initiated", sessionId, void 0, {
537
+ topic: options.topic,
538
+ participants: options.participants,
539
+ config
540
+ });
541
+ await this.emit("sessionStarted", { session });
542
+ return session;
543
+ }
544
+ /**
545
+ * Submit a proposal to a session
546
+ */
547
+ async propose(sessionId, input) {
548
+ const session = this.getSession(sessionId);
549
+ this.validateSessionOpen(session);
550
+ this.validateParticipant(session, input.proposerId);
551
+ const proposalId = this.generateProposalId();
552
+ const proposal = {
553
+ id: proposalId,
554
+ sessionId,
555
+ proposerId: input.proposerId,
556
+ agentId: input.proposerId,
557
+ title: input.title,
558
+ description: input.description,
559
+ content: input.content,
560
+ priority: input.priority ?? 0,
561
+ status: "submitted",
562
+ submittedAt: Date.now(),
563
+ metadata: input.metadata || {}
564
+ };
565
+ session.proposals.push(proposal);
566
+ session.lastActivityAt = Date.now();
567
+ this.audit("proposal_submitted", sessionId, input.proposerId, {
568
+ proposalId,
569
+ title: input.title
570
+ });
571
+ await this.emit("proposalSubmitted", { session, proposal });
572
+ return proposal;
573
+ }
574
+ /**
575
+ * Cast a vote in a session
576
+ */
577
+ async vote(sessionId, input) {
578
+ const session = this.getSession(sessionId);
579
+ this.validateSessionOpen(session);
580
+ this.validateParticipant(session, input.agentId);
581
+ this.validateNotDuplicate(session, input.agentId);
582
+ const mechanism = session.config.mechanism || session.config.votingMechanism || "majority";
583
+ const handler = getVotingHandler(mechanism);
584
+ const vote = {
585
+ id: this.generateVoteId(),
586
+ sessionId,
587
+ agentId: input.agentId,
588
+ ranking: input.ranking || [],
589
+ approvals: input.approvals,
590
+ weight: input.weight ?? getTrustWeight("local"),
591
+ justification: input.justification,
592
+ abstain: input.abstain ?? false,
593
+ timestamp: Date.now()
594
+ };
595
+ if (!vote.abstain && !handler.validateVote(vote, session.proposals)) {
596
+ throw new Error(
597
+ `Invalid vote: ranking must reference valid proposal IDs for mechanism '${mechanism}'`
598
+ );
599
+ }
600
+ session.votes.push(vote);
601
+ this.audit("vote_cast", sessionId, input.agentId, {
602
+ voteId: vote.id,
603
+ abstain: vote.abstain
604
+ });
605
+ await this.emit("voteReceived", { session, vote });
606
+ if (this.allVotesCast(session)) {
607
+ await this.tryAutoResolve(session);
608
+ }
609
+ return vote;
610
+ }
611
+ /**
612
+ * Resolve a negotiation session
613
+ */
614
+ async resolve(sessionId, force = false) {
615
+ const session = this.getSession(sessionId);
616
+ if (session.status !== "open" && session.status !== "voting") {
617
+ if (session.resolution) {
618
+ return session.resolution;
619
+ }
620
+ throw new Error(`Session ${sessionId} is ${session.status}, cannot resolve`);
621
+ }
622
+ const mechanism = session.config.mechanism || session.config.votingMechanism || "majority";
623
+ if (!force) {
624
+ const quorumMet = checkQuorum(
625
+ session.votes,
626
+ session.participants.length,
627
+ session.config,
628
+ mechanism
629
+ );
630
+ if (!quorumMet) {
631
+ return this.createFailedResolution(session, "quorum_not_met");
632
+ }
633
+ }
634
+ const handler = getVotingHandler(mechanism);
635
+ const result = handler.count(
636
+ session.votes.filter((v) => !v.abstain),
637
+ session.proposals,
638
+ session.config,
639
+ session.round || session.currentRound || 1
640
+ );
641
+ const resolution = this.buildResolution(session, result);
642
+ session.status = resolution.outcome === "deadlock" ? "deadlock" : "resolved";
643
+ session.resolution = resolution;
644
+ session.resolvedAt = Date.now();
645
+ this.clearDeadline(sessionId);
646
+ this.audit("resolved", sessionId, void 0, {
647
+ outcome: resolution.outcome,
648
+ winnerId: resolution.winnerId
649
+ });
650
+ await this.emit("sessionResolved", { session, resolution });
651
+ return resolution;
652
+ }
653
+ /**
654
+ * Get session by ID
655
+ */
656
+ getSession(sessionId) {
657
+ const session = this.sessions.get(sessionId);
658
+ if (!session) {
659
+ throw new Error(`Negotiation session not found: ${sessionId}`);
660
+ }
661
+ return session;
662
+ }
663
+ /**
664
+ * Get all active sessions
665
+ */
666
+ getActiveSessions() {
667
+ return Array.from(this.sessions.values()).filter(
668
+ (s) => s.status === "open" || s.status === "voting"
669
+ );
670
+ }
671
+ /**
672
+ * Get sessions for a specific agent
673
+ */
674
+ getAgentSessions(agentId) {
675
+ return Array.from(this.sessions.values()).filter((s) => s.participants.includes(agentId));
676
+ }
677
+ /**
678
+ * Cancel a session
679
+ */
680
+ async cancel(sessionId, _reason) {
681
+ const session = this.getSession(sessionId);
682
+ if (session.status === "resolved" || session.status === "cancelled") {
683
+ return;
684
+ }
685
+ session.status = "cancelled";
686
+ const mechanism = session.config.mechanism || session.config.votingMechanism || "majority";
687
+ session.resolution = {
688
+ sessionId,
689
+ outcome: "cancelled",
690
+ tallies: [],
691
+ finalTallies: [],
692
+ mechanism,
693
+ rounds: session.round || 1,
694
+ resolvedAt: Date.now(),
695
+ participationRate: session.votes.length / session.participants.length,
696
+ timestamp: Date.now()
697
+ };
698
+ this.clearDeadline(sessionId);
699
+ await this.emit("sessionResolved", {
700
+ session,
701
+ resolution: session.resolution
702
+ });
703
+ }
704
+ /**
705
+ * Escalate a deadlocked session
706
+ */
707
+ async escalate(sessionId) {
708
+ const session = this.getSession(sessionId);
709
+ if (!session.config.escalationPath) {
710
+ throw new Error(`No escalation path configured for session ${sessionId}`);
711
+ }
712
+ session.status = "escalated";
713
+ this.audit("escalated", sessionId, void 0, {
714
+ escalationPath: session.config.escalationPath
715
+ });
716
+ const mechanism = session.config.mechanism || session.config.votingMechanism || "majority";
717
+ const resolution = {
718
+ sessionId,
719
+ outcome: "escalated",
720
+ tallies: session.resolution?.tallies || [],
721
+ finalTallies: session.resolution?.finalTallies || [],
722
+ mechanism,
723
+ rounds: session.round || 1,
724
+ resolvedAt: Date.now(),
725
+ participationRate: session.votes.length / session.participants.length,
726
+ timestamp: Date.now(),
727
+ escalatedTo: session.config.escalationPath
728
+ };
729
+ session.resolution = resolution;
730
+ await this.emit("sessionResolved", { session, resolution });
731
+ return resolution;
732
+ }
733
+ /**
734
+ * Add a participant to an open session
735
+ */
736
+ addParticipant(sessionId, agentId) {
737
+ const session = this.getSession(sessionId);
738
+ if (session.status !== "open") {
739
+ throw new Error("Cannot add participant to non-open session");
740
+ }
741
+ if (!session.participants.includes(agentId)) {
742
+ session.participants.push(agentId);
743
+ }
744
+ }
745
+ /**
746
+ * Remove a participant from a session
747
+ */
748
+ removeParticipant(sessionId, agentId) {
749
+ const session = this.getSession(sessionId);
750
+ if (session.status !== "open") {
751
+ throw new Error("Cannot remove participant from non-open session");
752
+ }
753
+ session.participants = session.participants.filter((p) => p !== agentId);
754
+ }
755
+ /**
756
+ * Subscribe to negotiation events
757
+ */
758
+ on(event, handler) {
759
+ if (!this.eventHandlers.has(event)) {
760
+ this.eventHandlers.set(event, /* @__PURE__ */ new Set());
761
+ }
762
+ this.eventHandlers.get(event).add(handler);
763
+ return () => {
764
+ this.eventHandlers.get(event)?.delete(handler);
765
+ };
766
+ }
767
+ /**
768
+ * Get audit log
769
+ */
770
+ getAuditLog(sessionId) {
771
+ if (sessionId) {
772
+ return this.auditLog.filter((e) => e.sessionId === sessionId);
773
+ }
774
+ return [...this.auditLog];
775
+ }
776
+ /**
777
+ * Clear completed sessions older than maxAge
778
+ */
779
+ pruneOldSessions(maxAgeMs) {
780
+ const cutoff = Date.now() - maxAgeMs;
781
+ let pruned = 0;
782
+ for (const [id, session] of this.sessions) {
783
+ const sessionTime = session.resolvedAt || session.createdAt || session.startedAt || 0;
784
+ if ((session.status === "resolved" || session.status === "cancelled") && sessionTime < cutoff) {
785
+ this.sessions.delete(id);
786
+ pruned++;
787
+ }
788
+ }
789
+ return pruned;
790
+ }
791
+ /**
792
+ * Reset protocol state (for testing)
793
+ */
794
+ reset() {
795
+ for (const deadline of this.deadlines.values()) {
796
+ clearTimeout(deadline.timer);
797
+ }
798
+ this.sessions.clear();
799
+ this.auditLog = [];
800
+ this.deadlines.clear();
801
+ this.eventHandlers.clear();
802
+ this.sessionCounter = 0;
803
+ this.proposalCounter = 0;
804
+ this.voteCounter = 0;
805
+ }
806
+ // ===========================================================================
807
+ // PRIVATE METHODS
808
+ // ===========================================================================
809
+ generateSessionId() {
810
+ return `neg-${Date.now()}-${++this.sessionCounter}`;
811
+ }
812
+ generateProposalId() {
813
+ return `prop-${Date.now()}-${++this.proposalCounter}`;
814
+ }
815
+ generateVoteId() {
816
+ return `vote-${Date.now()}-${++this.voteCounter}`;
817
+ }
818
+ validateSessionOpen(session) {
819
+ if (session.status !== "open" && session.status !== "voting") {
820
+ throw new Error(`Session ${session.id} is ${session.status}, not accepting input`);
821
+ }
822
+ }
823
+ validateParticipant(session, agentId) {
824
+ if (!session.participants.includes(agentId)) {
825
+ throw new Error(`Agent ${agentId} is not a participant in session ${session.id}`);
826
+ }
827
+ }
828
+ validateNotDuplicate(session, agentId) {
829
+ const roundVotes = session.votes.filter((v) => v.agentId === agentId && !v.supersededBy);
830
+ if (roundVotes.length > 0) {
831
+ throw new Error(`Agent ${agentId} has already voted in this round of session ${session.id}`);
832
+ }
833
+ }
834
+ allVotesCast(session) {
835
+ const voted = new Set(session.votes.map((v) => v.agentId));
836
+ return session.participants.every((p) => {
837
+ const participantId = typeof p === "string" ? p : p.id;
838
+ return voted.has(participantId);
839
+ });
840
+ }
841
+ async tryAutoResolve(session) {
842
+ if (session.status === "open" && session.proposals.length > 0) {
843
+ session.status = "voting";
844
+ }
845
+ if (this.allVotesCast(session)) {
846
+ await this.resolve(session.id);
847
+ }
848
+ }
849
+ buildResolution(session, result) {
850
+ const winningProposal = result.winnerId ? session.proposals.find((p) => p.id === result.winnerId) : void 0;
851
+ const mechanism = session.config.mechanism || session.config.votingMechanism || "majority";
852
+ const resolvedAt = Date.now();
853
+ return {
854
+ sessionId: session.id,
855
+ outcome: result.outcome,
856
+ winnerId: result.winnerId,
857
+ winner: winningProposal,
858
+ winningProposal,
859
+ tallies: result.tallies,
860
+ finalTallies: result.tallies,
861
+ mechanism,
862
+ rounds: session.round || 1,
863
+ round: session.round || session.currentRound,
864
+ resolvedAt,
865
+ consensusLevel: result.consensusLevel,
866
+ dissenters: result.dissenters,
867
+ participationRate: session.votes.length / session.participants.length,
868
+ timestamp: resolvedAt
869
+ };
870
+ }
871
+ createFailedResolution(session, outcome) {
872
+ session.status = outcome === "timeout" ? "timeout" : "deadlock";
873
+ const mechanism = session.config.mechanism || session.config.votingMechanism || "majority";
874
+ const resolvedAt = Date.now();
875
+ const resolution = {
876
+ sessionId: session.id,
877
+ outcome,
878
+ tallies: [],
879
+ finalTallies: [],
880
+ mechanism,
881
+ rounds: session.round || 1,
882
+ resolvedAt,
883
+ participationRate: session.votes.length / session.participants.length,
884
+ timestamp: resolvedAt
885
+ };
886
+ session.resolution = resolution;
887
+ this.clearDeadline(session.id);
888
+ return resolution;
889
+ }
890
+ startDeadlineTimer(session) {
891
+ const timeout = session.config.timeout || session.config.votingDeadline || 6e4;
892
+ const timer = setTimeout(async () => {
893
+ if (session.status === "open" || session.status === "voting") {
894
+ this.audit("timeout", session.id, void 0, {
895
+ deadline: session.deadline
896
+ });
897
+ await this.handleTimeout(session);
898
+ }
899
+ }, timeout);
900
+ this.deadlines.set(session.id, { sessionId: session.id, timer });
901
+ }
902
+ async handleTimeout(session) {
903
+ if (session.votes.length > 0) {
904
+ try {
905
+ await this.resolve(session.id, true);
906
+ return;
907
+ } catch {
908
+ }
909
+ }
910
+ const resolution = this.createFailedResolution(session, "timeout");
911
+ await this.emit("sessionResolved", { session, resolution });
912
+ }
913
+ clearDeadline(sessionId) {
914
+ const deadline = this.deadlines.get(sessionId);
915
+ if (deadline) {
916
+ clearTimeout(deadline.timer);
917
+ this.deadlines.delete(sessionId);
918
+ }
919
+ }
920
+ audit(action, sessionId, agentId, details) {
921
+ this.auditLog.push({
922
+ timestamp: Date.now(),
923
+ sessionId,
924
+ action,
925
+ agentId,
926
+ details
927
+ });
928
+ }
929
+ async emit(event, data) {
930
+ const handlers = this.eventHandlers.get(event);
931
+ if (handlers) {
932
+ for (const handler of handlers) {
933
+ try {
934
+ await handler(data);
935
+ } catch (err) {
936
+ console.error(`Error in negotiation event handler for ${event}:`, err);
937
+ }
938
+ }
939
+ }
940
+ }
941
+ };
942
+ var defaultProtocol = null;
943
+ function getNegotiationProtocol() {
944
+ if (!defaultProtocol) {
945
+ defaultProtocol = new NegotiationProtocol();
946
+ }
947
+ return defaultProtocol;
948
+ }
949
+ function resetNegotiationProtocol() {
950
+ if (defaultProtocol) {
951
+ defaultProtocol.reset();
952
+ defaultProtocol = null;
953
+ }
954
+ }
955
+ // Annotate the CommonJS export names for ESM import in node:
956
+ 0 && (module.exports = {
957
+ NegotiationProtocol,
958
+ approvalHandler,
959
+ bordaHandler,
960
+ checkQuorum,
961
+ consensusHandler,
962
+ getNegotiationProtocol,
963
+ getTrustWeight,
964
+ getVotingHandler,
965
+ majorityHandler,
966
+ rankedHandler,
967
+ resetNegotiationProtocol,
968
+ supermajorityHandler,
969
+ weightedHandler
970
+ });