@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,454 @@
1
+ /**
2
+ * @fileoverview Cultural Memory — Dual Memory Architecture
3
+ * @module @holoscript/core/agents
4
+ *
5
+ * Implements the dual memory model for emergent agent culture:
6
+ * - Episodic Memory: Personal experiences with temporal decay
7
+ * - Stigmergic Memory: Environmental traces visible to all agents
8
+ *
9
+ * Memory consolidation converts repeated episodic patterns into
10
+ * Semantic SOPs (Standard Operating Procedures) — the mechanism
11
+ * by which culture persists across sessions.
12
+ *
13
+ * Based on:
14
+ * - P.025.03: Lifelong Team Memory Pattern
15
+ * - MemAgents (ICLR 2026): Memory for LLM-Based Agentic Systems
16
+ * - CRSEC Framework: Norm spreading through shared memory
17
+ *
18
+ * @version 1.0.0
19
+ */
20
+
21
+ // =============================================================================
22
+ // MEMORY TYPES
23
+ // =============================================================================
24
+
25
+ /** An episodic memory entry — a single experience */
26
+ export interface EpisodicMemory {
27
+ id: string;
28
+ agentId: string;
29
+ /** What happened */
30
+ event: string;
31
+ /** Who was involved */
32
+ participants: string[];
33
+ /** Emotional valence (-1 = negative, 0 = neutral, 1 = positive) */
34
+ valence: number;
35
+ /** Importance score (0-1) */
36
+ importance: number;
37
+ /** When it happened (tick number) */
38
+ timestamp: number;
39
+ /** Current strength (decays over time) */
40
+ strength: number;
41
+ /** Associated norm (if this experience relates to a norm) */
42
+ normId?: string;
43
+ /** Tags for retrieval */
44
+ tags: string[];
45
+ }
46
+
47
+ /** A stigmergic trace — environmental memory visible to all */
48
+ export interface StigmergicTrace {
49
+ id: string;
50
+ /** Creator */
51
+ creatorId: string;
52
+ /** Spatial position */
53
+ position: { x: number; y: number; z: number };
54
+ /** Zone the trace belongs to */
55
+ zoneId: string;
56
+ /** Type of trace */
57
+ type: 'marker' | 'path' | 'signal' | 'artifact' | 'boundary';
58
+ /** What this trace communicates */
59
+ label: string;
60
+ /** Current intensity (decays toward 0) */
61
+ intensity: number;
62
+ /** Initial intensity */
63
+ initialIntensity: number;
64
+ /** Decay rate per tick */
65
+ decayRate: number;
66
+ /** Perception radius */
67
+ radius: number;
68
+ /** When created */
69
+ timestamp: number;
70
+ /** Reinforcement count (how many agents have "validated" this trace) */
71
+ reinforcements: number;
72
+ }
73
+
74
+ /** A semantic SOP — consolidated cultural knowledge */
75
+ export interface SemanticSOP {
76
+ id: string;
77
+ /** The norm or convention this SOP encodes */
78
+ normId: string;
79
+ /** Human-readable description */
80
+ description: string;
81
+ /** Conditions under which this SOP applies */
82
+ conditions: string[];
83
+ /** Recommended actions */
84
+ actions: string[];
85
+ /** Confidence (0-1, increases with more supporting episodes) */
86
+ confidence: number;
87
+ /** Number of episodes that contributed to this SOP */
88
+ episodeCount: number;
89
+ /** When consolidated */
90
+ createdAt: number;
91
+ /** Last updated */
92
+ updatedAt: number;
93
+ }
94
+
95
+ // =============================================================================
96
+ // CULTURAL MEMORY
97
+ // =============================================================================
98
+
99
+ export interface CulturalMemoryConfig {
100
+ /** Max episodic memories per agent */
101
+ episodicCapacity: number;
102
+ /** Decay rate per tick (0-1) */
103
+ episodicDecayRate: number;
104
+ /** Max stigmergic traces per zone */
105
+ stigmergicCapacity: number;
106
+ /** Default trace decay rate */
107
+ traceDecayRate: number;
108
+ /** Min episodes before SOP consolidation */
109
+ consolidationThreshold: number;
110
+ /** Min confidence for SOP retention */
111
+ sopRetentionThreshold: number;
112
+ }
113
+
114
+ const DEFAULT_CONFIG: CulturalMemoryConfig = {
115
+ episodicCapacity: 100,
116
+ episodicDecayRate: 0.01,
117
+ stigmergicCapacity: 500,
118
+ traceDecayRate: 0.005,
119
+ consolidationThreshold: 5,
120
+ sopRetentionThreshold: 0.3,
121
+ };
122
+
123
+ /**
124
+ * CulturalMemory — dual memory system for emergent agent culture.
125
+ *
126
+ * Manages three memory tiers:
127
+ * 1. Episodic (per-agent, decaying personal experiences)
128
+ * 2. Stigmergic (spatial, shared environmental traces)
129
+ * 3. Semantic (consolidated SOPs from repeated patterns)
130
+ */
131
+ export class CulturalMemory {
132
+ private config: CulturalMemoryConfig;
133
+ private episodic: Map<string, EpisodicMemory[]> = new Map(); // agentId → memories
134
+ private stigmergic: Map<string, StigmergicTrace[]> = new Map(); // zoneId → traces
135
+ private sops: Map<string, SemanticSOP> = new Map(); // sopId → SOP
136
+ private currentTick: number = 0;
137
+
138
+ constructor(config: Partial<CulturalMemoryConfig> = {}) {
139
+ this.config = { ...DEFAULT_CONFIG, ...config };
140
+ }
141
+
142
+ // ── Episodic Memory ──────────────────────────────────────────────────────
143
+
144
+ /**
145
+ * Record an episodic memory for an agent.
146
+ */
147
+ record(
148
+ agentId: string,
149
+ event: string,
150
+ opts: Partial<Omit<EpisodicMemory, 'id' | 'agentId' | 'event' | 'strength' | 'timestamp'>> = {}
151
+ ): EpisodicMemory {
152
+ const memories = this.episodic.get(agentId) || [];
153
+ const memory: EpisodicMemory = {
154
+ id: `ep_${agentId}_${this.currentTick}_${memories.length}`,
155
+ agentId,
156
+ event,
157
+ participants: opts.participants || [],
158
+ valence: opts.valence ?? 0,
159
+ importance: opts.importance ?? 0.5,
160
+ timestamp: this.currentTick,
161
+ strength: 1.0,
162
+ normId: opts.normId,
163
+ tags: opts.tags || [],
164
+ };
165
+
166
+ memories.push(memory);
167
+
168
+ // Evict oldest if over capacity
169
+ if (memories.length > this.config.episodicCapacity) {
170
+ memories.sort((a, b) => b.strength * b.importance - a.strength * a.importance);
171
+ memories.length = this.config.episodicCapacity;
172
+ }
173
+
174
+ this.episodic.set(agentId, memories);
175
+ return memory;
176
+ }
177
+
178
+ /**
179
+ * Recall memories for an agent, optionally filtered.
180
+ */
181
+ recall(
182
+ agentId: string,
183
+ filter?: { normId?: string; tags?: string[]; minStrength?: number }
184
+ ): EpisodicMemory[] {
185
+ const memories = this.episodic.get(agentId) || [];
186
+ return memories
187
+ .filter((m) => {
188
+ if (filter?.minStrength && m.strength < filter.minStrength) return false;
189
+ if (filter?.normId && m.normId !== filter.normId) return false;
190
+ if (filter?.tags && !filter.tags.some((t) => m.tags.includes(t))) return false;
191
+ return true;
192
+ })
193
+ .sort((a, b) => b.strength * b.importance - a.strength * a.importance);
194
+ }
195
+
196
+ /**
197
+ * Get the number of memories for an agent.
198
+ */
199
+ memoryCount(agentId: string): number {
200
+ return (this.episodic.get(agentId) || []).length;
201
+ }
202
+
203
+ // ── Stigmergic Memory ────────────────────────────────────────────────────
204
+
205
+ /**
206
+ * Leave a stigmergic trace in the environment.
207
+ */
208
+ leaveTrace(
209
+ creatorId: string,
210
+ zoneId: string,
211
+ label: string,
212
+ position: { x: number; y: number; z: number },
213
+ opts: Partial<
214
+ Omit<
215
+ StigmergicTrace,
216
+ 'id' | 'creatorId' | 'zoneId' | 'label' | 'position' | 'timestamp' | 'reinforcements'
217
+ >
218
+ > = {}
219
+ ): StigmergicTrace {
220
+ const traces = this.stigmergic.get(zoneId) || [];
221
+ const intensity = opts.intensity ?? opts.initialIntensity ?? 1.0;
222
+ const trace: StigmergicTrace = {
223
+ id: `st_${zoneId}_${this.currentTick}_${traces.length}`,
224
+ creatorId,
225
+ position,
226
+ zoneId,
227
+ type: opts.type || 'marker',
228
+ label,
229
+ intensity,
230
+ initialIntensity: intensity,
231
+ decayRate: opts.decayRate ?? this.config.traceDecayRate,
232
+ radius: opts.radius ?? 10,
233
+ timestamp: this.currentTick,
234
+ reinforcements: 0,
235
+ };
236
+
237
+ traces.push(trace);
238
+
239
+ // Evict weakest if over capacity
240
+ if (traces.length > this.config.stigmergicCapacity) {
241
+ traces.sort((a, b) => b.intensity - a.intensity);
242
+ traces.length = this.config.stigmergicCapacity;
243
+ }
244
+
245
+ this.stigmergic.set(zoneId, traces);
246
+ return trace;
247
+ }
248
+
249
+ /**
250
+ * Perceive nearby traces from a position.
251
+ */
252
+ perceiveTraces(zoneId: string, position: { x: number; y: number; z: number }): StigmergicTrace[] {
253
+ const traces = this.stigmergic.get(zoneId) || [];
254
+ return traces
255
+ .filter((t) => {
256
+ const dx = t.position.x - position.x;
257
+ const dy = t.position.y - position.y;
258
+ const dz = t.position.z - position.z;
259
+ const dist = Math.sqrt(dx * dx + dy * dy + dz * dz);
260
+ return dist <= t.radius && t.intensity > 0.01;
261
+ })
262
+ .sort((a, b) => b.intensity - a.intensity);
263
+ }
264
+
265
+ /**
266
+ * Reinforce a trace (another agent validates it).
267
+ * Increases intensity and slows decay.
268
+ */
269
+ reinforceTrace(traceId: string, zoneId: string): boolean {
270
+ const traces = this.stigmergic.get(zoneId) || [];
271
+ const trace = traces.find((t) => t.id === traceId);
272
+ if (!trace) return false;
273
+ trace.reinforcements++;
274
+ trace.intensity = Math.min(trace.initialIntensity * 2, trace.intensity + 0.1);
275
+ trace.decayRate *= 0.95; // Slow decay with each reinforcement
276
+ return true;
277
+ }
278
+
279
+ /**
280
+ * Get all traces in a zone.
281
+ */
282
+ zoneTraces(zoneId: string): StigmergicTrace[] {
283
+ return (this.stigmergic.get(zoneId) || []).filter((t) => t.intensity > 0.01);
284
+ }
285
+
286
+ // ── Semantic SOPs ────────────────────────────────────────────────────────
287
+
288
+ /**
289
+ * Attempt to consolidate episodic memories into a semantic SOP.
290
+ * Finds repeated patterns (same normId, high frequency) and forms SOPs.
291
+ */
292
+ consolidate(agentId: string): SemanticSOP[] {
293
+ const memories = this.episodic.get(agentId) || [];
294
+ const newSops: SemanticSOP[] = [];
295
+
296
+ // Group by normId
297
+ const byNorm = new Map<string, EpisodicMemory[]>();
298
+ for (const m of memories) {
299
+ if (m.normId) {
300
+ const group = byNorm.get(m.normId) || [];
301
+ group.push(m);
302
+ byNorm.set(m.normId, group);
303
+ }
304
+ }
305
+
306
+ for (const [normId, episodes] of byNorm) {
307
+ if (episodes.length < this.config.consolidationThreshold) continue;
308
+
309
+ const existing = this.sops.get(`sop_${agentId}_${normId}`);
310
+ if (existing) {
311
+ // Update existing SOP
312
+ existing.episodeCount = episodes.length;
313
+ existing.confidence = Math.min(
314
+ 1,
315
+ episodes.length / (this.config.consolidationThreshold * 3)
316
+ );
317
+ existing.updatedAt = this.currentTick;
318
+ continue;
319
+ }
320
+
321
+ // Create new SOP
322
+ const avgValence = episodes.reduce((s, e) => s + e.valence, 0) / episodes.length;
323
+ const sop: SemanticSOP = {
324
+ id: `sop_${agentId}_${normId}`,
325
+ normId,
326
+ description: `Learned behavior for norm '${normId}' from ${episodes.length} experiences (avg valence: ${avgValence.toFixed(2)})`,
327
+ conditions: [...new Set(episodes.flatMap((e) => e.tags))],
328
+ actions: avgValence > 0 ? ['comply', 'reinforce'] : ['avoid', 'report'],
329
+ confidence: Math.min(1, episodes.length / (this.config.consolidationThreshold * 3)),
330
+ episodeCount: episodes.length,
331
+ createdAt: this.currentTick,
332
+ updatedAt: this.currentTick,
333
+ };
334
+
335
+ this.sops.set(sop.id, sop);
336
+ newSops.push(sop);
337
+ }
338
+
339
+ return newSops;
340
+ }
341
+
342
+ /**
343
+ * Get all SOPs for an agent.
344
+ */
345
+ getSOPs(agentId: string): SemanticSOP[] {
346
+ const prefix = `sop_${agentId}_`;
347
+ return [...this.sops.values()].filter((s) => s.id.startsWith(prefix));
348
+ }
349
+
350
+ /**
351
+ * Get a specific SOP by agent and norm.
352
+ */
353
+ getSOP(agentId: string, normId: string): SemanticSOP | undefined {
354
+ return this.sops.get(`sop_${agentId}_${normId}`);
355
+ }
356
+
357
+ // ── Tick / Lifecycle ─────────────────────────────────────────────────────
358
+
359
+ /**
360
+ * Advance one tick: decay memories and traces, prune dead entries.
361
+ */
362
+ tick(): { decayedMemories: number; evaporatedTraces: number } {
363
+ this.currentTick++;
364
+ let decayedMemories = 0;
365
+ let evaporatedTraces = 0;
366
+
367
+ // Decay episodic memories
368
+ for (const [agentId, memories] of this.episodic) {
369
+ for (const m of memories) {
370
+ m.strength *= 1 - this.config.episodicDecayRate;
371
+ }
372
+ const before = memories.length;
373
+ const alive = memories.filter((m) => m.strength > 0.01);
374
+ decayedMemories += before - alive.length;
375
+ this.episodic.set(agentId, alive);
376
+ }
377
+
378
+ // Decay stigmergic traces
379
+ for (const [zoneId, traces] of this.stigmergic) {
380
+ for (const t of traces) {
381
+ t.intensity -= t.decayRate;
382
+ }
383
+ const before = traces.length;
384
+ const alive = traces.filter((t) => t.intensity > 0.01);
385
+ evaporatedTraces += before - alive.length;
386
+ this.stigmergic.set(zoneId, alive);
387
+ }
388
+
389
+ // Prune low-confidence SOPs
390
+ for (const [id, sop] of this.sops) {
391
+ if (sop.confidence < this.config.sopRetentionThreshold) {
392
+ this.sops.delete(id);
393
+ }
394
+ }
395
+
396
+ return { decayedMemories, evaporatedTraces };
397
+ }
398
+
399
+ /**
400
+ * Get current tick.
401
+ */
402
+ getTick(): number {
403
+ return this.currentTick;
404
+ }
405
+
406
+ /**
407
+ * Get global statistics.
408
+ */
409
+ stats(): {
410
+ agents: number;
411
+ totalMemories: number;
412
+ totalTraces: number;
413
+ totalSOPs: number;
414
+ zones: number;
415
+ } {
416
+ let totalMemories = 0;
417
+ let totalTraces = 0;
418
+ for (const mems of this.episodic.values()) totalMemories += mems.length;
419
+ for (const traces of this.stigmergic.values()) totalTraces += traces.length;
420
+ return {
421
+ agents: this.episodic.size,
422
+ totalMemories,
423
+ totalTraces,
424
+ totalSOPs: this.sops.size,
425
+ zones: this.stigmergic.size,
426
+ };
427
+ }
428
+
429
+ /**
430
+ * Export full state for persistence / cross-session continuity.
431
+ */
432
+ exportState(): {
433
+ episodic: Record<string, EpisodicMemory[]>;
434
+ stigmergic: Record<string, StigmergicTrace[]>;
435
+ sops: SemanticSOP[];
436
+ tick: number;
437
+ } {
438
+ const episodic: Record<string, EpisodicMemory[]> = {};
439
+ for (const [k, v] of this.episodic) episodic[k] = v;
440
+ const stigmergic: Record<string, StigmergicTrace[]> = {};
441
+ for (const [k, v] of this.stigmergic) stigmergic[k] = v;
442
+ return { episodic, stigmergic, sops: [...this.sops.values()], tick: this.currentTick };
443
+ }
444
+
445
+ /**
446
+ * Import state from persistence.
447
+ */
448
+ importState(state: ReturnType<CulturalMemory['exportState']>): void {
449
+ for (const [k, v] of Object.entries(state.episodic)) this.episodic.set(k, v);
450
+ for (const [k, v] of Object.entries(state.stigmergic)) this.stigmergic.set(k, v);
451
+ for (const sop of state.sops) this.sops.set(sop.id, sop);
452
+ this.currentTick = state.tick;
453
+ }
454
+ }