@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,450 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Norm Engine — CRSEC Norm Lifecycle Manager
|
|
3
|
+
* @module @holoscript/core/agents
|
|
4
|
+
*
|
|
5
|
+
* Implements the complete CRSEC norm lifecycle:
|
|
6
|
+
* C - Creation: Agents propose new norms
|
|
7
|
+
* R - Representation: Norms stored as structured objects
|
|
8
|
+
* S - Spreading: Norms propagate through agent populations
|
|
9
|
+
* E - Evaluation: Agents assess norm compliance
|
|
10
|
+
* C - Compliance: Enforcement and feedback loops
|
|
11
|
+
*
|
|
12
|
+
* Key research findings implemented:
|
|
13
|
+
* - Critical mass dynamics: 2% (weak) to 25-67% (strong) for norm change
|
|
14
|
+
* - Metanorms: norms about enforcing norms (cultural ratchet)
|
|
15
|
+
* - Model identity as cultural DNA (different base models → different cultures)
|
|
16
|
+
* - The Governance Goldilocks Zone: structure without content
|
|
17
|
+
*
|
|
18
|
+
* @version 1.0.0
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import type {
|
|
22
|
+
NormEnforcement,
|
|
23
|
+
NormScope,
|
|
24
|
+
NormCategory,
|
|
25
|
+
CulturalNorm,
|
|
26
|
+
} from '@holoscript/core';
|
|
27
|
+
|
|
28
|
+
export const BUILTIN_NORMS: CulturalNorm[] = [
|
|
29
|
+
{
|
|
30
|
+
id: 'no_griefing',
|
|
31
|
+
name: 'No Griefing',
|
|
32
|
+
category: 'safety',
|
|
33
|
+
description: 'Do not cause harm to others',
|
|
34
|
+
enforcement: 'hard',
|
|
35
|
+
scope: 'world',
|
|
36
|
+
activationThreshold: 0.1,
|
|
37
|
+
strength: 'strong',
|
|
38
|
+
forbiddenEffects: ['agent:kill', 'inventory:steal'],
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: 'resource_sharing',
|
|
42
|
+
name: 'Resource Sharing',
|
|
43
|
+
category: 'cooperation',
|
|
44
|
+
description: 'Share resources when abundant',
|
|
45
|
+
enforcement: 'soft',
|
|
46
|
+
scope: 'world',
|
|
47
|
+
activationThreshold: 0.5,
|
|
48
|
+
strength: 'moderate',
|
|
49
|
+
forbiddenEffects: ['inventory:hoard', 'inventory:horde'],
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: 'fair_trade',
|
|
53
|
+
name: 'Fair Trade',
|
|
54
|
+
category: 'economy',
|
|
55
|
+
description: 'Trade at mutually agreeable values',
|
|
56
|
+
enforcement: 'soft',
|
|
57
|
+
scope: 'world',
|
|
58
|
+
activationThreshold: 0.3,
|
|
59
|
+
strength: 'weak',
|
|
60
|
+
forbiddenEffects: ['trade:scam', 'trade:extort'],
|
|
61
|
+
}
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
export function criticalMassForChange(norm: CulturalNorm, populationSize: number): number {
|
|
65
|
+
if (norm.strength === 'strong') return populationSize * 0.5;
|
|
66
|
+
if (norm.strength === 'moderate') return populationSize * 0.25;
|
|
67
|
+
return populationSize * 0.02;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export type { NormEnforcement, NormScope, NormCategory, CulturalNorm };
|
|
71
|
+
export type VREffect = string;
|
|
72
|
+
|
|
73
|
+
export class EffectRow {
|
|
74
|
+
private effects: Set<string>;
|
|
75
|
+
constructor(effects: string[]) {
|
|
76
|
+
this.effects = new Set(effects);
|
|
77
|
+
}
|
|
78
|
+
has(effect: string): boolean {
|
|
79
|
+
return this.effects.has(effect);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// =============================================================================
|
|
84
|
+
// NORM STATE
|
|
85
|
+
// =============================================================================
|
|
86
|
+
|
|
87
|
+
/** Per-agent norm adoption state */
|
|
88
|
+
export interface AgentNormState {
|
|
89
|
+
agentId: string;
|
|
90
|
+
/** Norms this agent has adopted */
|
|
91
|
+
adopted: Set<string>;
|
|
92
|
+
/** Compliance score per norm (0-1) */
|
|
93
|
+
compliance: Map<string, number>;
|
|
94
|
+
/** Norms this agent is currently violating */
|
|
95
|
+
violations: Set<string>;
|
|
96
|
+
/** Norms this agent has proposed */
|
|
97
|
+
proposed: Set<string>;
|
|
98
|
+
/** Number of times this agent has enforced norms on others */
|
|
99
|
+
enforcementCount: number;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** A norm violation event */
|
|
103
|
+
export interface NormViolation {
|
|
104
|
+
normId: string;
|
|
105
|
+
agentId: string;
|
|
106
|
+
effect: VREffect;
|
|
107
|
+
timestamp: number;
|
|
108
|
+
severity: NormEnforcement;
|
|
109
|
+
witnessed: string[]; // Agent IDs who witnessed
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** A norm proposal from an agent */
|
|
113
|
+
export interface NormProposal {
|
|
114
|
+
id: string;
|
|
115
|
+
proposerId: string;
|
|
116
|
+
norm: CulturalNorm;
|
|
117
|
+
votes: Map<string, boolean>; // agentId → approve/reject
|
|
118
|
+
timestamp: number;
|
|
119
|
+
status: 'pending' | 'adopted' | 'rejected';
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// =============================================================================
|
|
123
|
+
// NORM ENGINE
|
|
124
|
+
// =============================================================================
|
|
125
|
+
|
|
126
|
+
export interface NormEngineConfig {
|
|
127
|
+
/** Minimum adoption rate for a norm to be "active" (0-1) */
|
|
128
|
+
activationThreshold: number;
|
|
129
|
+
/** Compliance score increase per compliant action */
|
|
130
|
+
complianceReward: number;
|
|
131
|
+
/** Compliance score decrease per violation */
|
|
132
|
+
violationPenalty: number;
|
|
133
|
+
/** Minimum vote ratio for a proposal to be adopted */
|
|
134
|
+
proposalThreshold: number;
|
|
135
|
+
/** Enable metanorm tracking */
|
|
136
|
+
enableMetanorms: boolean;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const DEFAULT_CONFIG: NormEngineConfig = {
|
|
140
|
+
activationThreshold: 0.3,
|
|
141
|
+
complianceReward: 0.05,
|
|
142
|
+
violationPenalty: 0.15,
|
|
143
|
+
proposalThreshold: 0.6,
|
|
144
|
+
enableMetanorms: true,
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* NormEngine — manages the full CRSEC lifecycle for cultural norms.
|
|
149
|
+
*/
|
|
150
|
+
export class NormEngine {
|
|
151
|
+
private config: NormEngineConfig;
|
|
152
|
+
private norms: Map<string, CulturalNorm> = new Map();
|
|
153
|
+
private agents: Map<string, AgentNormState> = new Map();
|
|
154
|
+
private proposals: Map<string, NormProposal> = new Map();
|
|
155
|
+
private violationLog: NormViolation[] = [];
|
|
156
|
+
private adoptionHistory: { normId: string; tick: number; rate: number }[] = [];
|
|
157
|
+
private currentTick: number = 0;
|
|
158
|
+
|
|
159
|
+
constructor(config: Partial<NormEngineConfig> = {}) {
|
|
160
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
161
|
+
// Register built-in norms
|
|
162
|
+
for (const norm of BUILTIN_NORMS) {
|
|
163
|
+
this.norms.set(norm.id, norm);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// ── C: Creation ──────────────────────────────────────────────────────────
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Register a custom norm.
|
|
171
|
+
*/
|
|
172
|
+
registerNorm(norm: CulturalNorm): void {
|
|
173
|
+
this.norms.set(norm.id, norm);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Agent proposes a new norm.
|
|
178
|
+
*/
|
|
179
|
+
proposeNorm(proposerId: string, norm: CulturalNorm): NormProposal {
|
|
180
|
+
const proposal: NormProposal = {
|
|
181
|
+
id: `prop_${this.currentTick}_${proposerId}`,
|
|
182
|
+
proposerId,
|
|
183
|
+
norm,
|
|
184
|
+
votes: new Map(),
|
|
185
|
+
timestamp: this.currentTick,
|
|
186
|
+
status: 'pending',
|
|
187
|
+
};
|
|
188
|
+
this.proposals.set(proposal.id, proposal);
|
|
189
|
+
// Track in agent state
|
|
190
|
+
const state = this.getOrCreateAgent(proposerId);
|
|
191
|
+
state.proposed.add(proposal.id);
|
|
192
|
+
return proposal;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Vote on a pending proposal.
|
|
197
|
+
*/
|
|
198
|
+
vote(proposalId: string, agentId: string, approve: boolean): boolean {
|
|
199
|
+
const proposal = this.proposals.get(proposalId);
|
|
200
|
+
if (!proposal || proposal.status !== 'pending') return false;
|
|
201
|
+
proposal.votes.set(agentId, approve);
|
|
202
|
+
|
|
203
|
+
// Check if threshold reached
|
|
204
|
+
const totalAgents = this.agents.size;
|
|
205
|
+
if (totalAgents === 0) return true;
|
|
206
|
+
const approvals = [...proposal.votes.values()].filter((v) => v).length;
|
|
207
|
+
const ratio = approvals / totalAgents;
|
|
208
|
+
|
|
209
|
+
if (ratio >= this.config.proposalThreshold) {
|
|
210
|
+
proposal.status = 'adopted';
|
|
211
|
+
this.norms.set(proposal.norm.id, proposal.norm);
|
|
212
|
+
} else if (proposal.votes.size >= totalAgents) {
|
|
213
|
+
proposal.status = 'rejected';
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// ── R: Representation ────────────────────────────────────────────────────
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Get a norm by ID.
|
|
223
|
+
*/
|
|
224
|
+
getNorm(normId: string): CulturalNorm | undefined {
|
|
225
|
+
return this.norms.get(normId);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* List all registered norms.
|
|
230
|
+
*/
|
|
231
|
+
listNorms(): CulturalNorm[] {
|
|
232
|
+
return [...this.norms.values()];
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// ── S: Spreading ─────────────────────────────────────────────────────────
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Agent adopts a norm.
|
|
239
|
+
*/
|
|
240
|
+
adopt(agentId: string, normId: string): boolean {
|
|
241
|
+
if (!this.norms.has(normId)) return false;
|
|
242
|
+
const state = this.getOrCreateAgent(agentId);
|
|
243
|
+
state.adopted.add(normId);
|
|
244
|
+
state.compliance.set(normId, 1.0);
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Agent abandons a norm.
|
|
250
|
+
*/
|
|
251
|
+
abandon(agentId: string, normId: string): boolean {
|
|
252
|
+
const state = this.agents.get(agentId);
|
|
253
|
+
if (!state) return false;
|
|
254
|
+
state.adopted.delete(normId);
|
|
255
|
+
state.compliance.delete(normId);
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Get adoption rate for a norm (0-1).
|
|
261
|
+
*/
|
|
262
|
+
adoptionRate(normId: string): number {
|
|
263
|
+
if (this.agents.size === 0) return 0;
|
|
264
|
+
let adopters = 0;
|
|
265
|
+
for (const state of this.agents.values()) {
|
|
266
|
+
if (state.adopted.has(normId)) adopters++;
|
|
267
|
+
}
|
|
268
|
+
return adopters / this.agents.size;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Check if a norm is active (adoption > threshold).
|
|
273
|
+
*/
|
|
274
|
+
isActive(normId: string): boolean {
|
|
275
|
+
const norm = this.norms.get(normId);
|
|
276
|
+
if (!norm) return false;
|
|
277
|
+
return (
|
|
278
|
+
this.adoptionRate(normId) >= (norm.activationThreshold || this.config.activationThreshold)
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// ── E: Evaluation ────────────────────────────────────────────────────────
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Check if an agent's intended effects comply with active norms.
|
|
286
|
+
* Returns violations found.
|
|
287
|
+
*/
|
|
288
|
+
evaluate(agentId: string, effects: VREffect[], zoneId?: string): NormViolation[] {
|
|
289
|
+
const violations: NormViolation[] = [];
|
|
290
|
+
const effectRow = new EffectRow(effects);
|
|
291
|
+
|
|
292
|
+
for (const norm of this.norms.values()) {
|
|
293
|
+
if (!this.isActive(norm.id)) continue;
|
|
294
|
+
// Check scope
|
|
295
|
+
if (norm.scope === 'zone' && !zoneId) continue;
|
|
296
|
+
|
|
297
|
+
// Check forbidden effects
|
|
298
|
+
if (norm.forbiddenEffects) {
|
|
299
|
+
for (const forbidden of norm.forbiddenEffects) {
|
|
300
|
+
if (effectRow.has(forbidden as VREffect)) {
|
|
301
|
+
violations.push({
|
|
302
|
+
normId: norm.id,
|
|
303
|
+
agentId,
|
|
304
|
+
effect: forbidden as VREffect,
|
|
305
|
+
timestamp: this.currentTick,
|
|
306
|
+
severity: norm.enforcement,
|
|
307
|
+
witnessed: this.witnessesIn(zoneId),
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return violations;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// ── C: Compliance ────────────────────────────────────────────────────────
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Record that an agent complied with a norm.
|
|
321
|
+
*/
|
|
322
|
+
recordCompliance(agentId: string, normId: string): void {
|
|
323
|
+
const state = this.getOrCreateAgent(agentId);
|
|
324
|
+
const current = state.compliance.get(normId) || 0.5;
|
|
325
|
+
state.compliance.set(normId, Math.min(1, current + this.config.complianceReward));
|
|
326
|
+
state.violations.delete(normId);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Record that an agent violated a norm.
|
|
331
|
+
*/
|
|
332
|
+
recordViolation(violation: NormViolation): void {
|
|
333
|
+
const state = this.getOrCreateAgent(violation.agentId);
|
|
334
|
+
const current = state.compliance.get(violation.normId) || 0.5;
|
|
335
|
+
state.compliance.set(violation.normId, Math.max(0, current - this.config.violationPenalty));
|
|
336
|
+
state.violations.add(violation.normId);
|
|
337
|
+
this.violationLog.push(violation);
|
|
338
|
+
|
|
339
|
+
// Metanorm tracking: witnesses should enforce
|
|
340
|
+
if (this.config.enableMetanorms) {
|
|
341
|
+
for (const witnessId of violation.witnessed) {
|
|
342
|
+
const witnessState = this.getOrCreateAgent(witnessId);
|
|
343
|
+
witnessState.enforcementCount++;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Get compliance score for an agent on a norm.
|
|
350
|
+
*/
|
|
351
|
+
getCompliance(agentId: string, normId: string): number {
|
|
352
|
+
return this.agents.get(agentId)?.compliance.get(normId) ?? 0.5;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// ── Lifecycle ────────────────────────────────────────────────────────────
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Register an agent in the norm engine.
|
|
359
|
+
*/
|
|
360
|
+
registerAgent(agentId: string, adoptNorms?: string[]): AgentNormState {
|
|
361
|
+
const state = this.getOrCreateAgent(agentId);
|
|
362
|
+
if (adoptNorms) {
|
|
363
|
+
for (const normId of adoptNorms) this.adopt(agentId, normId);
|
|
364
|
+
}
|
|
365
|
+
return state;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Advance one tick: record adoption history, snapshot state.
|
|
370
|
+
*/
|
|
371
|
+
tick(): void {
|
|
372
|
+
this.currentTick++;
|
|
373
|
+
for (const norm of this.norms.values()) {
|
|
374
|
+
this.adoptionHistory.push({
|
|
375
|
+
normId: norm.id,
|
|
376
|
+
tick: this.currentTick,
|
|
377
|
+
rate: this.adoptionRate(norm.id),
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Get adoption curve data for a norm.
|
|
384
|
+
*/
|
|
385
|
+
adoptionCurve(normId: string): { tick: number; rate: number }[] {
|
|
386
|
+
return this.adoptionHistory.filter((h) => h.normId === normId);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Get the cultural health score for the whole population (0-1).
|
|
391
|
+
* High = norms well-adopted, low violations. Low = cultural breakdown.
|
|
392
|
+
*/
|
|
393
|
+
culturalHealth(): number {
|
|
394
|
+
if (this.agents.size === 0) return 1;
|
|
395
|
+
let totalCompliance = 0;
|
|
396
|
+
let count = 0;
|
|
397
|
+
for (const state of this.agents.values()) {
|
|
398
|
+
for (const score of state.compliance.values()) {
|
|
399
|
+
totalCompliance += score;
|
|
400
|
+
count++;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
return count > 0 ? totalCompliance / count : 1;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Get statistics.
|
|
408
|
+
*/
|
|
409
|
+
stats(): {
|
|
410
|
+
norms: number;
|
|
411
|
+
agents: number;
|
|
412
|
+
activeNorms: number;
|
|
413
|
+
violations: number;
|
|
414
|
+
proposals: number;
|
|
415
|
+
culturalHealth: number;
|
|
416
|
+
} {
|
|
417
|
+
return {
|
|
418
|
+
norms: this.norms.size,
|
|
419
|
+
agents: this.agents.size,
|
|
420
|
+
activeNorms: [...this.norms.keys()].filter((id) => this.isActive(id)).length,
|
|
421
|
+
violations: this.violationLog.length,
|
|
422
|
+
proposals: this.proposals.size,
|
|
423
|
+
culturalHealth: this.culturalHealth(),
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// ── Internal ─────────────────────────────────────────────────────────────
|
|
428
|
+
|
|
429
|
+
private getOrCreateAgent(agentId: string): AgentNormState {
|
|
430
|
+
let state = this.agents.get(agentId);
|
|
431
|
+
if (!state) {
|
|
432
|
+
state = {
|
|
433
|
+
agentId,
|
|
434
|
+
adopted: new Set(),
|
|
435
|
+
compliance: new Map(),
|
|
436
|
+
violations: new Set(),
|
|
437
|
+
proposed: new Set(),
|
|
438
|
+
enforcementCount: 0,
|
|
439
|
+
};
|
|
440
|
+
this.agents.set(agentId, state);
|
|
441
|
+
}
|
|
442
|
+
return state;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
private witnessesIn(zoneId?: string): string[] {
|
|
446
|
+
// In a full implementation, this would check spatial proximity.
|
|
447
|
+
// For now, return all agents as potential witnesses.
|
|
448
|
+
return [...this.agents.keys()].slice(0, 5);
|
|
449
|
+
}
|
|
450
|
+
}
|