@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.
- package/ALL-test-results.json +1 -0
- package/CHANGELOG.md +8 -0
- package/LICENSE +21 -0
- package/ROADMAP.md +175 -0
- package/dist/AgentManifest-CB4xM-Ma.d.cts +704 -0
- package/dist/AgentManifest-CB4xM-Ma.d.ts +704 -0
- package/dist/BehaviorTree-BrBFECv5.d.cts +103 -0
- package/dist/BehaviorTree-BrBFECv5.d.ts +103 -0
- package/dist/InvisibleWallet-BB6tFvRA.d.cts +1732 -0
- package/dist/InvisibleWallet-rtRrBOA8.d.ts +1732 -0
- package/dist/OrchestratorAgent-BvWgf9uw.d.cts +798 -0
- package/dist/OrchestratorAgent-Q_CbVTmO.d.ts +798 -0
- package/dist/agents/index.cjs +4790 -0
- package/dist/agents/index.d.cts +1788 -0
- package/dist/agents/index.d.ts +1788 -0
- package/dist/agents/index.js +4695 -0
- package/dist/ai/index.cjs +5347 -0
- package/dist/ai/index.d.cts +1753 -0
- package/dist/ai/index.d.ts +1753 -0
- package/dist/ai/index.js +5244 -0
- package/dist/behavior.cjs +449 -0
- package/dist/behavior.d.cts +130 -0
- package/dist/behavior.d.ts +130 -0
- package/dist/behavior.js +407 -0
- package/dist/economy/index.cjs +3659 -0
- package/dist/economy/index.d.cts +747 -0
- package/dist/economy/index.d.ts +747 -0
- package/dist/economy/index.js +3617 -0
- package/dist/implementations-D9T3un9D.d.cts +236 -0
- package/dist/implementations-D9T3un9D.d.ts +236 -0
- package/dist/index.cjs +24550 -0
- package/dist/index.d.cts +1729 -0
- package/dist/index.d.ts +1729 -0
- package/dist/index.js +24277 -0
- package/dist/learning/index.cjs +219 -0
- package/dist/learning/index.d.cts +104 -0
- package/dist/learning/index.d.ts +104 -0
- package/dist/learning/index.js +189 -0
- package/dist/negotiation/index.cjs +970 -0
- package/dist/negotiation/index.d.cts +610 -0
- package/dist/negotiation/index.d.ts +610 -0
- package/dist/negotiation/index.js +931 -0
- package/dist/skills/index.cjs +1118 -0
- package/dist/skills/index.d.cts +289 -0
- package/dist/skills/index.d.ts +289 -0
- package/dist/skills/index.js +1079 -0
- package/dist/swarm/index.cjs +5268 -0
- package/dist/swarm/index.d.cts +2433 -0
- package/dist/swarm/index.d.ts +2433 -0
- package/dist/swarm/index.js +5221 -0
- package/dist/training/index.cjs +2745 -0
- package/dist/training/index.d.cts +1734 -0
- package/dist/training/index.d.ts +1734 -0
- package/dist/training/index.js +2687 -0
- package/extract-failures.js +10 -0
- package/package.json +82 -0
- package/src/__tests__/bounty-marketplace.test.ts +374 -0
- package/src/__tests__/delegation.test.ts +144 -0
- package/src/__tests__/distributed-claimer.test.ts +147 -0
- package/src/__tests__/done-log-audit.test.ts +342 -0
- package/src/__tests__/framework.test.ts +865 -0
- package/src/__tests__/goal-synthesizer.test.ts +236 -0
- package/src/__tests__/presence.test.ts +223 -0
- package/src/__tests__/protocol-agent.test.ts +254 -0
- package/src/__tests__/revenue-splitter.test.ts +114 -0
- package/src/__tests__/scenario-driven-todo.test.ts +197 -0
- package/src/__tests__/self-improve.test.ts +349 -0
- package/src/__tests__/service-lifecycle.test.ts +237 -0
- package/src/__tests__/skill-router.test.ts +121 -0
- package/src/agents/AgentManifest.ts +493 -0
- package/src/agents/AgentRegistry.ts +475 -0
- package/src/agents/AgentTypes.ts +585 -0
- package/src/agents/AgentWalletRegistry.ts +83 -0
- package/src/agents/AuthenticatedCRDT.ts +388 -0
- package/src/agents/CapabilityMatcher.ts +453 -0
- package/src/agents/CrossRealityHandoff.ts +305 -0
- package/src/agents/CulturalMemory.ts +454 -0
- package/src/agents/FederatedRegistryAdapter.ts +429 -0
- package/src/agents/NormEngine.ts +450 -0
- package/src/agents/OrchestratorAgent.ts +414 -0
- package/src/agents/SkillWorkflowEngine.ts +472 -0
- package/src/agents/TaskDelegationService.ts +551 -0
- package/src/agents/__tests__/AgentManifest.prod.test.ts +134 -0
- package/src/agents/__tests__/AgentManifest.test.ts +182 -0
- package/src/agents/__tests__/AgentModule.test.ts +864 -0
- package/src/agents/__tests__/AgentRegistry.prod.test.ts +125 -0
- package/src/agents/__tests__/AgentRegistry.test.ts +148 -0
- package/src/agents/__tests__/AgentTypes.test.ts +534 -0
- package/src/agents/__tests__/AgentWalletRegistry.test.ts +152 -0
- package/src/agents/__tests__/AuthenticatedCRDT.test.ts +558 -0
- package/src/agents/__tests__/CapabilityMatcher.prod.test.ts +117 -0
- package/src/agents/__tests__/CapabilityMatcher.test.ts +178 -0
- package/src/agents/__tests__/CrossRealityHandoff.test.ts +402 -0
- package/src/agents/__tests__/CulturalMemory.test.ts +200 -0
- package/src/agents/__tests__/FederatedRegistryAdapter.test.ts +409 -0
- package/src/agents/__tests__/NormEngine.test.ts +276 -0
- package/src/agents/__tests__/OrchestratorAgent.test.ts +182 -0
- package/src/agents/__tests__/SkillWorkflowEngine.test.ts +357 -0
- package/src/agents/__tests__/TaskDelegationService.test.ts +446 -0
- package/src/agents/index.ts +107 -0
- package/src/agents/spatial-comms/Layer1RealTime.ts +621 -0
- package/src/agents/spatial-comms/Layer2A2A.ts +661 -0
- package/src/agents/spatial-comms/Layer3MCP.ts +651 -0
- package/src/agents/spatial-comms/ProtocolTypes.ts +543 -0
- package/src/agents/spatial-comms/SpatialCommClient.ts +483 -0
- package/src/agents/spatial-comms/__tests__/performance-benchmark.test.ts +465 -0
- package/src/agents/spatial-comms/examples/multi-agent-world-creation.ts +409 -0
- package/src/agents/spatial-comms/index.ts +66 -0
- package/src/ai/AIAdapter.ts +313 -0
- package/src/ai/AICopilot.ts +331 -0
- package/src/ai/AIOutputValidator.ts +203 -0
- package/src/ai/BTNodes.ts +239 -0
- package/src/ai/BehaviorSelector.ts +135 -0
- package/src/ai/BehaviorTree.ts +153 -0
- package/src/ai/Blackboard.ts +165 -0
- package/src/ai/GenerationAnalytics.ts +461 -0
- package/src/ai/GenerationCache.ts +265 -0
- package/src/ai/GoalPlanner.ts +165 -0
- package/src/ai/HoloScriptGenerator.ts +580 -0
- package/src/ai/InfluenceMap.ts +180 -0
- package/src/ai/NavMesh.ts +168 -0
- package/src/ai/PerceptionSystem.ts +178 -0
- package/src/ai/PromptTemplates.ts +453 -0
- package/src/ai/SemanticSearchService.ts +80 -0
- package/src/ai/StateMachine.ts +196 -0
- package/src/ai/SteeringBehavior.ts +150 -0
- package/src/ai/SteeringBehaviors.ts +244 -0
- package/src/ai/TrainingDataGenerator.ts +1082 -0
- package/src/ai/UtilityAI.ts +145 -0
- package/src/ai/__tests__/AIAdapter.prod.test.ts +259 -0
- package/src/ai/__tests__/AIAdapter.test.ts +109 -0
- package/src/ai/__tests__/AICopilot.prod.test.ts +341 -0
- package/src/ai/__tests__/AICopilot.test.ts +178 -0
- package/src/ai/__tests__/AIOutputValidator.prod.test.ts +226 -0
- package/src/ai/__tests__/AIOutputValidator.test.ts +138 -0
- package/src/ai/__tests__/BTNodes.prod.test.ts +391 -0
- package/src/ai/__tests__/BTNodes.test.ts +263 -0
- package/src/ai/__tests__/BehaviorSelector.prod.test.ts +129 -0
- package/src/ai/__tests__/BehaviorSelector.test.ts +132 -0
- package/src/ai/__tests__/BehaviorTree.prod.test.ts +266 -0
- package/src/ai/__tests__/BehaviorTree.test.ts +216 -0
- package/src/ai/__tests__/Blackboard.prod.test.ts +339 -0
- package/src/ai/__tests__/Blackboard.test.ts +183 -0
- package/src/ai/__tests__/GenerationAnalytics.prod.test.ts +141 -0
- package/src/ai/__tests__/GenerationAnalytics.test.ts +165 -0
- package/src/ai/__tests__/GenerationCache.prod.test.ts +144 -0
- package/src/ai/__tests__/GenerationCache.test.ts +171 -0
- package/src/ai/__tests__/GoalPlanner.prod.test.ts +189 -0
- package/src/ai/__tests__/GoalPlanner.test.ts +137 -0
- package/src/ai/__tests__/GoalPlannerDepth.prod.test.ts +217 -0
- package/src/ai/__tests__/HoloScriptGenerator.test.ts +125 -0
- package/src/ai/__tests__/InfluenceMap.prod.test.ts +146 -0
- package/src/ai/__tests__/InfluenceMap.test.ts +149 -0
- package/src/ai/__tests__/NavMesh.prod.test.ts +141 -0
- package/src/ai/__tests__/NavMesh.test.ts +159 -0
- package/src/ai/__tests__/PerceptionSystem.prod.test.ts +135 -0
- package/src/ai/__tests__/PerceptionSystem.test.ts +250 -0
- package/src/ai/__tests__/PromptTemplates.prod.test.ts +313 -0
- package/src/ai/__tests__/PromptTemplates.test.ts +146 -0
- package/src/ai/__tests__/SemanticSearch.test.ts +37 -0
- package/src/ai/__tests__/StateMachine.prod.test.ts +162 -0
- package/src/ai/__tests__/StateMachine.test.ts +163 -0
- package/src/ai/__tests__/SteeringBehavior.prod.test.ts +251 -0
- package/src/ai/__tests__/SteeringBehavior.test.ts +135 -0
- package/src/ai/__tests__/SteeringBehaviors.prod.test.ts +133 -0
- package/src/ai/__tests__/SteeringBehaviors.test.ts +151 -0
- package/src/ai/__tests__/TrainingDataGenerator.prod.test.ts +286 -0
- package/src/ai/__tests__/TrainingDataGenerator.test.ts +286 -0
- package/src/ai/__tests__/UtilityAI.prod.test.ts +207 -0
- package/src/ai/__tests__/UtilityAI.test.ts +155 -0
- package/src/ai/__tests__/adapters.prod.test.ts +263 -0
- package/src/ai/__tests__/adapters.test.ts +320 -0
- package/src/ai/adapters.ts +1585 -0
- package/src/ai/index.ts +130 -0
- package/src/behavior/BehaviorPresets.ts +140 -0
- package/src/behavior/BehaviorTree.ts +236 -0
- package/src/behavior/StateMachine.ts +176 -0
- package/src/behavior/StateTrait.ts +67 -0
- package/src/behavior/index.ts +8 -0
- package/src/behavior.ts +8 -0
- package/src/board/audit.ts +284 -0
- package/src/board/board-ops.ts +336 -0
- package/src/board/board-types.ts +302 -0
- package/src/board/index.ts +69 -0
- package/src/define-agent.ts +46 -0
- package/src/define-team.ts +33 -0
- package/src/delegation.ts +265 -0
- package/src/distributed-claimer.ts +228 -0
- package/src/economy/AgentBudgetEnforcer.ts +464 -0
- package/src/economy/BountyManager.ts +185 -0
- package/src/economy/CreatorRevenueAggregator.ts +460 -0
- package/src/economy/InvisibleWallet.ts +82 -0
- package/src/economy/KnowledgeMarketplace.ts +193 -0
- package/src/economy/PaymentWebhookService.ts +512 -0
- package/src/economy/RevenueSplitter.ts +156 -0
- package/src/economy/SubscriptionManager.ts +546 -0
- package/src/economy/UnifiedBudgetOptimizer.ts +635 -0
- package/src/economy/UsageMeter.ts +440 -0
- package/src/economy/_core-stubs.ts +219 -0
- package/src/economy/index.ts +100 -0
- package/src/economy/x402-facilitator.ts +1978 -0
- package/src/index.ts +348 -0
- package/src/knowledge/__tests__/knowledge-consolidator.test.ts +444 -0
- package/src/knowledge/__tests__/knowledge-store-vector.test.ts +291 -0
- package/src/knowledge/brain.ts +167 -0
- package/src/knowledge/consolidation.ts +581 -0
- package/src/knowledge/knowledge-consolidator.ts +510 -0
- package/src/knowledge/knowledge-store.ts +616 -0
- package/src/learning/MemoryConsolidator.ts +102 -0
- package/src/learning/MemoryScorer.ts +69 -0
- package/src/learning/ProceduralCompiler.ts +45 -0
- package/src/learning/SemanticClusterer.ts +66 -0
- package/src/learning/index.ts +8 -0
- package/src/llm/llm-adapter.ts +159 -0
- package/src/mesh/index.ts +309 -0
- package/src/negotiation/NegotiationProtocol.ts +694 -0
- package/src/negotiation/NegotiationTypes.ts +473 -0
- package/src/negotiation/VotingMechanisms.ts +691 -0
- package/src/negotiation/index.ts +49 -0
- package/src/protocol/goal-synthesizer.ts +317 -0
- package/src/protocol/implementations.ts +474 -0
- package/src/protocol/micro-phase-decomposer.ts +299 -0
- package/src/protocol/micro-step-decomposer.test.ts +306 -0
- package/src/protocol-agent.test.ts +353 -0
- package/src/protocol-agent.ts +670 -0
- package/src/self-improve/absorb-scanner.ts +252 -0
- package/src/self-improve/evolution-engine.ts +149 -0
- package/src/self-improve/framework-absorber.ts +214 -0
- package/src/self-improve/index.ts +50 -0
- package/src/self-improve/prompt-optimizer.ts +212 -0
- package/src/self-improve/test-generator.ts +175 -0
- package/src/skill-router.ts +186 -0
- package/src/skills/index.ts +5 -0
- package/src/skills/skill-md-bridge.ts +1699 -0
- package/src/swarm/ACOEngine.ts +261 -0
- package/src/swarm/CollectiveIntelligence.ts +383 -0
- package/src/swarm/ContributionSynthesizer.ts +481 -0
- package/src/swarm/LeaderElection.ts +393 -0
- package/src/swarm/PSOEngine.ts +206 -0
- package/src/swarm/QuorumPolicy.ts +173 -0
- package/src/swarm/SwarmCoordinator.ts +335 -0
- package/src/swarm/SwarmManager.ts +442 -0
- package/src/swarm/SwarmMembership.ts +456 -0
- package/src/swarm/VotingRound.ts +255 -0
- package/src/swarm/__tests__/ACOEngine.prod.test.ts +164 -0
- package/src/swarm/__tests__/ACOEngine.test.ts +117 -0
- package/src/swarm/__tests__/CollectiveIntelligence.prod.test.ts +296 -0
- package/src/swarm/__tests__/CollectiveIntelligence.test.ts +457 -0
- package/src/swarm/__tests__/ContributionSynthesizer.prod.test.ts +269 -0
- package/src/swarm/__tests__/ContributionSynthesizer.test.ts +254 -0
- package/src/swarm/__tests__/LeaderElection.prod.test.ts +196 -0
- package/src/swarm/__tests__/LeaderElection.test.ts +151 -0
- package/src/swarm/__tests__/PSOEngine.prod.test.ts +162 -0
- package/src/swarm/__tests__/PSOEngine.test.ts +106 -0
- package/src/swarm/__tests__/QuorumPolicy.prod.test.ts +216 -0
- package/src/swarm/__tests__/QuorumPolicy.test.ts +177 -0
- package/src/swarm/__tests__/SwarmCoordinator.prod.test.ts +186 -0
- package/src/swarm/__tests__/SwarmCoordinator.test.ts +167 -0
- package/src/swarm/__tests__/SwarmManager.prod.test.ts +308 -0
- package/src/swarm/__tests__/SwarmManager.test.ts +373 -0
- package/src/swarm/__tests__/SwarmMembership.prod.test.ts +273 -0
- package/src/swarm/__tests__/SwarmMembership.test.ts +264 -0
- package/src/swarm/__tests__/VotingRound.prod.test.ts +233 -0
- package/src/swarm/__tests__/VotingRound.test.ts +174 -0
- package/src/swarm/analytics/SwarmInspector.ts +476 -0
- package/src/swarm/analytics/SwarmMetrics.ts +449 -0
- package/src/swarm/analytics/__tests__/SwarmInspector.prod.test.ts +366 -0
- package/src/swarm/analytics/__tests__/SwarmInspector.test.ts +454 -0
- package/src/swarm/analytics/__tests__/SwarmMetrics.prod.test.ts +254 -0
- package/src/swarm/analytics/__tests__/SwarmMetrics.test.ts +370 -0
- package/src/swarm/analytics/index.ts +7 -0
- package/src/swarm/index.ts +69 -0
- package/src/swarm/messaging/BroadcastChannel.ts +509 -0
- package/src/swarm/messaging/GossipProtocol.ts +565 -0
- package/src/swarm/messaging/SwarmEventBus.ts +443 -0
- package/src/swarm/messaging/__tests__/BroadcastChannel.prod.test.ts +331 -0
- package/src/swarm/messaging/__tests__/BroadcastChannel.test.ts +333 -0
- package/src/swarm/messaging/__tests__/GossipProtocol.prod.test.ts +356 -0
- package/src/swarm/messaging/__tests__/GossipProtocol.test.ts +437 -0
- package/src/swarm/messaging/__tests__/SwarmEventBus.prod.test.ts +191 -0
- package/src/swarm/messaging/__tests__/SwarmEventBus.test.ts +247 -0
- package/src/swarm/messaging/index.ts +8 -0
- package/src/swarm/spatial/FlockingBehavior.ts +462 -0
- package/src/swarm/spatial/FormationController.ts +500 -0
- package/src/swarm/spatial/Vector3.ts +170 -0
- package/src/swarm/spatial/ZoneClaiming.ts +509 -0
- package/src/swarm/spatial/__tests__/FlockingBehavior.prod.test.ts +239 -0
- package/src/swarm/spatial/__tests__/FlockingBehavior.test.ts +298 -0
- package/src/swarm/spatial/__tests__/FormationController.prod.test.ts +240 -0
- package/src/swarm/spatial/__tests__/FormationController.test.ts +297 -0
- package/src/swarm/spatial/__tests__/Vector3.prod.test.ts +283 -0
- package/src/swarm/spatial/__tests__/Vector3.test.ts +224 -0
- package/src/swarm/spatial/__tests__/ZoneClaiming.prod.test.ts +246 -0
- package/src/swarm/spatial/__tests__/ZoneClaiming.test.ts +374 -0
- package/src/swarm/spatial/index.ts +28 -0
- package/src/team.ts +1245 -0
- package/src/training/LRScheduler.ts +377 -0
- package/src/training/QualityScoringPipeline.ts +139 -0
- package/src/training/SoftDedup.ts +461 -0
- package/src/training/SparsityMonitor.ts +685 -0
- package/src/training/SparsityMonitorTypes.ts +209 -0
- package/src/training/SpatialTrainingDataGenerator.ts +1526 -0
- package/src/training/SpatialTrainingDataTypes.ts +216 -0
- package/src/training/TrainingPipelineConfig.ts +215 -0
- package/src/training/constants.ts +94 -0
- package/src/training/index.ts +138 -0
- package/src/training/schema.ts +147 -0
- package/src/training/scripts/generate-novel-use-cases-dataset.ts +272 -0
- package/src/training/scripts/generate-spatial-dataset.ts +521 -0
- package/src/training/training/data/novel-use-cases.jsonl +153 -0
- package/src/training/training/data/spatial-reasoning-10k.jsonl +9354 -0
- package/src/training/trainingmonkey/TrainingMonkeyIntegration.ts +477 -0
- package/src/training/trainingmonkey/TrainingMonkeyTypes.ts +230 -0
- package/src/training/trainingmonkey/index.ts +26 -0
- package/src/training/trait-mappings.ts +157 -0
- package/src/types/core-stubs.d.ts +113 -0
- package/src/types.ts +304 -0
- package/test-output.txt +0 -0
- package/test-result.json +1 -0
- package/tsc-errors.txt +4 -0
- package/tsc_output.txt +0 -0
- package/tsconfig.json +14 -0
- package/tsup-learning-esm.config.ts +12 -0
- package/tsup.config.ts +21 -0
- package/typescript-errors-2.txt +0 -0
- package/typescript-errors.txt +22 -0
- package/vitest-log-utf8.txt +268 -0
- package/vitest-log.txt +0 -0
- 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
|
+
}
|