@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,102 @@
|
|
|
1
|
+
const logger = { info: console.info, error: console.error };
|
|
2
|
+
|
|
3
|
+
export interface EpisodicMemory {
|
|
4
|
+
id: string;
|
|
5
|
+
timestamp: number;
|
|
6
|
+
action: string;
|
|
7
|
+
outcome: string;
|
|
8
|
+
entitiesInvolved: string[];
|
|
9
|
+
semanticVector?: number[]; // Mock embedding
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface SemanticFact {
|
|
13
|
+
id: string;
|
|
14
|
+
fact: string;
|
|
15
|
+
confidence: number;
|
|
16
|
+
sourceEpisodes: string[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* MemoryConsolidator
|
|
21
|
+
*
|
|
22
|
+
* Compresses raw episodic events into structured semantic facts
|
|
23
|
+
* via idle background cycles, mirroring human sleep consolidation.
|
|
24
|
+
*/
|
|
25
|
+
export class MemoryConsolidator {
|
|
26
|
+
/**
|
|
27
|
+
* Identifies conceptually similar episodic memories based on shared entities and actions.
|
|
28
|
+
*/
|
|
29
|
+
private static clusterEpisodes(episodes: EpisodicMemory[]): EpisodicMemory[][] {
|
|
30
|
+
const clusters: Record<string, EpisodicMemory[]> = {};
|
|
31
|
+
|
|
32
|
+
// Basic heuristic: Cluster by primary action and first entity
|
|
33
|
+
for (const ep of episodes) {
|
|
34
|
+
const key = `${ep.action}_${ep.entitiesInvolved[0] || 'generic'}`;
|
|
35
|
+
if (!clusters[key]) clusters[key] = [];
|
|
36
|
+
clusters[key].push(ep);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return Object.values(clusters);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Mocks an LLM-based summarization pass converting a cluster of raw events
|
|
44
|
+
* into a single concrete semantic truth.
|
|
45
|
+
*/
|
|
46
|
+
private static summarizeCluster(cluster: EpisodicMemory[]): SemanticFact | null {
|
|
47
|
+
if (cluster.length < 3) return null; // Only consolidate recurring patterns
|
|
48
|
+
|
|
49
|
+
const sample = cluster[0];
|
|
50
|
+
const successCount = cluster.filter((ep) => ep.outcome.includes('success')).length;
|
|
51
|
+
const successRate = successCount / cluster.length;
|
|
52
|
+
|
|
53
|
+
let rule = '';
|
|
54
|
+
if (successRate > 0.7) {
|
|
55
|
+
rule = `${sample.action} applied to ${sample.entitiesInvolved[0]} is generally effective.`;
|
|
56
|
+
} else {
|
|
57
|
+
rule = `${sample.action} applied to ${sample.entitiesInvolved[0]} has high failure risk.`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
id: `fact_${Date.now()}_${Math.random().toString(36).substring(7)}`,
|
|
62
|
+
fact: rule,
|
|
63
|
+
confidence: successRate,
|
|
64
|
+
sourceEpisodes: cluster.map((c) => c.id),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Executes the background consolidation pass.
|
|
70
|
+
* Takes raw episodes, clusters them, extracts truths, and returns the facts
|
|
71
|
+
* while reporting which raw episodes can be safely garbage collected.
|
|
72
|
+
*/
|
|
73
|
+
static compressEpisodes(rawEpisodes: EpisodicMemory[]): {
|
|
74
|
+
newFacts: SemanticFact[];
|
|
75
|
+
prunedEpisodes: string[];
|
|
76
|
+
} {
|
|
77
|
+
if (rawEpisodes.length < 5) return { newFacts: [], prunedEpisodes: [] };
|
|
78
|
+
|
|
79
|
+
logger.info(
|
|
80
|
+
`[Consolidation] Running idle memory compression on ${rawEpisodes.length} episodes.`
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const clusters = this.clusterEpisodes(rawEpisodes);
|
|
84
|
+
const newFacts: SemanticFact[] = [];
|
|
85
|
+
const prunedEpisodes: string[] = [];
|
|
86
|
+
|
|
87
|
+
for (const cluster of clusters) {
|
|
88
|
+
const fact = this.summarizeCluster(cluster);
|
|
89
|
+
if (fact) {
|
|
90
|
+
newFacts.push(fact);
|
|
91
|
+
// Mark these source episodes for pruning since we extracted the semantic truth
|
|
92
|
+
prunedEpisodes.push(...fact.sourceEpisodes);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
logger.info(
|
|
97
|
+
`[Consolidation] Distilled ${prunedEpisodes.length} raw episodes into ${newFacts.length} semantic facts.`
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
return { newFacts, prunedEpisodes };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MemoryScorer
|
|
3
|
+
*
|
|
4
|
+
* Generates an 'importance' dimensional scalar for Episodic memories.
|
|
5
|
+
* Allows the aggregation engine to aggressively prune trivial loops (like 'Idle')
|
|
6
|
+
* and permanently archive high-value bounds (like 'Combat' or 'Crafting').
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface EpisodicEvent {
|
|
10
|
+
agentId: string;
|
|
11
|
+
timestamp: number;
|
|
12
|
+
action: string;
|
|
13
|
+
context: Record<string, any>;
|
|
14
|
+
outcome: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class MemoryScorer {
|
|
18
|
+
/**
|
|
19
|
+
* Scores an event from -100 (Absolute Noise) to 100 (Critical Experience).
|
|
20
|
+
*/
|
|
21
|
+
static computeImportance(event: EpisodicEvent): number {
|
|
22
|
+
let score = 0;
|
|
23
|
+
|
|
24
|
+
// 1. Action Density Weighting
|
|
25
|
+
const action = event.action.toLowerCase();
|
|
26
|
+
if (action.includes('idle') || action.includes('wait') || action.includes('sleep')) {
|
|
27
|
+
score -= 50;
|
|
28
|
+
} else if (action.includes('move') || action.includes('look') || action.includes('walk')) {
|
|
29
|
+
score -= 10;
|
|
30
|
+
} else if (action.includes('craft') || action.includes('build') || action.includes('analyze')) {
|
|
31
|
+
score += 30;
|
|
32
|
+
} else if (
|
|
33
|
+
action.includes('combat') ||
|
|
34
|
+
action.includes('attack') ||
|
|
35
|
+
action.includes('defense') ||
|
|
36
|
+
action.includes('damage')
|
|
37
|
+
) {
|
|
38
|
+
score += 50;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// 2. Context Entropy (More complex context = higher density value)
|
|
42
|
+
const contextKeys = Object.keys(event.context || {}).length;
|
|
43
|
+
score += Math.min(20, contextKeys * 2);
|
|
44
|
+
|
|
45
|
+
// 3. Outcome Variance (Is the outcome signifying a concrete change?)
|
|
46
|
+
const outcome = event.outcome.toLowerCase();
|
|
47
|
+
if (outcome.includes('failed') || outcome.includes('error')) {
|
|
48
|
+
score += 25; // Agent failures are important for negative reinforcement
|
|
49
|
+
} else if (
|
|
50
|
+
outcome.includes('success') ||
|
|
51
|
+
outcome.includes('crafted') ||
|
|
52
|
+
outcome.includes('killed')
|
|
53
|
+
) {
|
|
54
|
+
score += 25; // Major achievements are important for positive reinforcement
|
|
55
|
+
} else if (outcome.includes('nothing') || outcome.includes('none')) {
|
|
56
|
+
score -= 20; // Zero variance
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Clamp between -100 and 100
|
|
60
|
+
return Math.max(-100, Math.min(100, score));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Filters arrays natively discarding negative arrays
|
|
65
|
+
*/
|
|
66
|
+
static cullLowImportance(events: EpisodicEvent[], threshold: number = 0): EpisodicEvent[] {
|
|
67
|
+
return events.filter((e) => this.computeImportance(e) >= threshold);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface ProceduralSkill { id: string; name: string; description?: string; code?: string; }
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ProceduralCompiler
|
|
5
|
+
*
|
|
6
|
+
* Takes JSON-based AI logic trees extracted from temporal LLM generation natively
|
|
7
|
+
* and compiles them strictly down into raw executable `.holo` syntax bounds.
|
|
8
|
+
*/
|
|
9
|
+
export class ProceduralCompiler {
|
|
10
|
+
/**
|
|
11
|
+
* Translates an Abstract Skill representation into native text executing within the VM.
|
|
12
|
+
*/
|
|
13
|
+
static compile(skill: ProceduralSkill): string {
|
|
14
|
+
let compiled = `// Auto-generated skill: ${skill.name}\n`;
|
|
15
|
+
compiled += `// Desc: ${(skill as unknown as { description?: string }).description || 'N/A'}\n\n`;
|
|
16
|
+
|
|
17
|
+
compiled += `agent ${skill.id.replace(/-/g, '_')} {\n`;
|
|
18
|
+
|
|
19
|
+
// Generate behavior node
|
|
20
|
+
compiled += ` behavior execute() {\n`;
|
|
21
|
+
|
|
22
|
+
const codeBlock = (skill as unknown as { code?: string }).code || '';
|
|
23
|
+
|
|
24
|
+
// MVP: The LLM outputs pseudo-code or raw JS/HoloScript lines directly in string
|
|
25
|
+
// The procedural compiler validates and formats the raw string cleanly
|
|
26
|
+
const parsedLines = codeBlock.split('\n');
|
|
27
|
+
|
|
28
|
+
for (let line of parsedLines) {
|
|
29
|
+
line = line.trim();
|
|
30
|
+
if (!line) continue;
|
|
31
|
+
|
|
32
|
+
// Map some logical conversions if needed, here we just enforce safety wrappers
|
|
33
|
+
if (line.includes('move(') || line.includes('attack(') || line.includes('craft(')) {
|
|
34
|
+
compiled += ` ensure_safety() {\n ${line}\n }\n`;
|
|
35
|
+
} else {
|
|
36
|
+
compiled += ` ${line}\n`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
compiled += ` }\n`;
|
|
41
|
+
compiled += `}\n`;
|
|
42
|
+
|
|
43
|
+
return compiled;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { EpisodicEvent } from './MemoryScorer';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SemanticClusterer
|
|
5
|
+
*
|
|
6
|
+
* Compresses raw temporal Episodic buffers into distilled arrays.
|
|
7
|
+
* Native distillation drops repeating trivial structures mapping them into aggregated
|
|
8
|
+
* density nodes explicitly reducing database storage loads across vector boundaries.
|
|
9
|
+
*/
|
|
10
|
+
export class SemanticClusterer {
|
|
11
|
+
/**
|
|
12
|
+
* Actively squash sequentially repeating abstract patterns mapping out semantic arrays.
|
|
13
|
+
*/
|
|
14
|
+
static distill(events: EpisodicEvent[]): EpisodicEvent[] {
|
|
15
|
+
if (events.length === 0) return [];
|
|
16
|
+
|
|
17
|
+
const distilled: EpisodicEvent[] = [];
|
|
18
|
+
let currentSequence: EpisodicEvent = { ...events[0] };
|
|
19
|
+
let repetitonCount = 1;
|
|
20
|
+
|
|
21
|
+
for (let i = 1; i < events.length; i++) {
|
|
22
|
+
const ev = events[i];
|
|
23
|
+
|
|
24
|
+
// If the Action and Target align, we squash them and increment the density metrics
|
|
25
|
+
if (this.isSimilar(currentSequence, ev)) {
|
|
26
|
+
repetitonCount++;
|
|
27
|
+
currentSequence.outcome = `Repeated action successfully (${repetitonCount} times)`;
|
|
28
|
+
|
|
29
|
+
// Track total time span passed over the squash boundary
|
|
30
|
+
if (!currentSequence.context.timeSpanStarted) {
|
|
31
|
+
currentSequence.context.timeSpanStarted = currentSequence.timestamp;
|
|
32
|
+
}
|
|
33
|
+
currentSequence.context.timeSpanEnded = ev.timestamp;
|
|
34
|
+
} else {
|
|
35
|
+
// Similarity broken. Push distilled sequence array and begin anew.
|
|
36
|
+
if (repetitonCount > 1) {
|
|
37
|
+
currentSequence.action = `${currentSequence.action}_Aggregated`;
|
|
38
|
+
}
|
|
39
|
+
distilled.push({ ...currentSequence });
|
|
40
|
+
|
|
41
|
+
currentSequence = { ...ev };
|
|
42
|
+
repetitonCount = 1;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Push final buffer
|
|
47
|
+
if (repetitonCount > 1) {
|
|
48
|
+
currentSequence.action = `${currentSequence.action}_Aggregated`;
|
|
49
|
+
}
|
|
50
|
+
distilled.push(currentSequence);
|
|
51
|
+
|
|
52
|
+
return distilled;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Determines heuristic thresholds to squash logic natively offline without LLM.
|
|
57
|
+
*/
|
|
58
|
+
private static isSimilar(a: EpisodicEvent, b: EpisodicEvent): boolean {
|
|
59
|
+
if (a.action !== b.action) return false;
|
|
60
|
+
|
|
61
|
+
const aTarget = a.context?.target || a.context?.location;
|
|
62
|
+
const bTarget = b.context?.target || b.context?.location;
|
|
63
|
+
|
|
64
|
+
return aTarget === bTarget;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-Agnostic LLM Adapter
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper that dispatches to Anthropic, OpenAI, xAI, or OpenRouter.
|
|
5
|
+
* Each agent can use a different provider/model.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ModelConfig } from '../types';
|
|
9
|
+
|
|
10
|
+
export interface LLMMessage {
|
|
11
|
+
role: 'system' | 'user' | 'assistant';
|
|
12
|
+
content: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface LLMResponse {
|
|
16
|
+
content: string;
|
|
17
|
+
model: string;
|
|
18
|
+
provider: string;
|
|
19
|
+
tokensUsed?: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function callLLM(
|
|
23
|
+
config: ModelConfig,
|
|
24
|
+
messages: LLMMessage[],
|
|
25
|
+
options: { maxTokens?: number; temperature?: number } = {}
|
|
26
|
+
): Promise<LLMResponse> {
|
|
27
|
+
const maxTokens = options.maxTokens ?? config.maxTokens ?? 1024;
|
|
28
|
+
const temperature = options.temperature ?? config.temperature ?? 0.7;
|
|
29
|
+
|
|
30
|
+
switch (config.provider) {
|
|
31
|
+
case 'anthropic':
|
|
32
|
+
return callAnthropic(config, messages, maxTokens, temperature);
|
|
33
|
+
case 'openai':
|
|
34
|
+
case 'xai':
|
|
35
|
+
return callOpenAICompatible(config, messages, maxTokens, temperature);
|
|
36
|
+
case 'openrouter':
|
|
37
|
+
return callOpenRouter(config, messages, maxTokens, temperature);
|
|
38
|
+
default:
|
|
39
|
+
throw new Error(`Unknown LLM provider: ${config.provider}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function callAnthropic(
|
|
44
|
+
config: ModelConfig,
|
|
45
|
+
messages: LLMMessage[],
|
|
46
|
+
maxTokens: number,
|
|
47
|
+
temperature: number
|
|
48
|
+
): Promise<LLMResponse> {
|
|
49
|
+
const apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY;
|
|
50
|
+
if (!apiKey) throw new Error('ANTHROPIC_API_KEY required');
|
|
51
|
+
|
|
52
|
+
const system = messages.filter(m => m.role === 'system').map(m => m.content).join('\n');
|
|
53
|
+
const userMessages = messages.filter(m => m.role !== 'system').map(m => ({
|
|
54
|
+
role: m.role as 'user' | 'assistant',
|
|
55
|
+
content: m.content,
|
|
56
|
+
}));
|
|
57
|
+
|
|
58
|
+
const res = await fetch('https://api.anthropic.com/v1/messages', {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'application/json',
|
|
62
|
+
'x-api-key': apiKey,
|
|
63
|
+
'anthropic-version': '2023-06-01',
|
|
64
|
+
},
|
|
65
|
+
body: JSON.stringify({
|
|
66
|
+
model: config.model,
|
|
67
|
+
max_tokens: maxTokens,
|
|
68
|
+
temperature,
|
|
69
|
+
system: system || undefined,
|
|
70
|
+
messages: userMessages,
|
|
71
|
+
}),
|
|
72
|
+
signal: AbortSignal.timeout(60_000),
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
if (!res.ok) throw new Error(`Anthropic API error: ${res.status}`);
|
|
76
|
+
const data = await res.json() as { content: Array<{ text: string }>; usage?: { output_tokens: number } };
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
content: data.content?.[0]?.text || '',
|
|
80
|
+
model: config.model,
|
|
81
|
+
provider: 'anthropic',
|
|
82
|
+
tokensUsed: data.usage?.output_tokens,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function callOpenAICompatible(
|
|
87
|
+
config: ModelConfig,
|
|
88
|
+
messages: LLMMessage[],
|
|
89
|
+
maxTokens: number,
|
|
90
|
+
temperature: number
|
|
91
|
+
): Promise<LLMResponse> {
|
|
92
|
+
const isXAI = config.provider === 'xai';
|
|
93
|
+
const apiKey = config.apiKey || (isXAI ? process.env.XAI_API_KEY : process.env.OPENAI_API_KEY);
|
|
94
|
+
if (!apiKey) throw new Error(`${config.provider.toUpperCase()}_API_KEY required`);
|
|
95
|
+
|
|
96
|
+
const baseUrl = isXAI ? 'https://api.x.ai/v1' : 'https://api.openai.com/v1';
|
|
97
|
+
|
|
98
|
+
const res = await fetch(`${baseUrl}/chat/completions`, {
|
|
99
|
+
method: 'POST',
|
|
100
|
+
headers: {
|
|
101
|
+
'Content-Type': 'application/json',
|
|
102
|
+
Authorization: `Bearer ${apiKey}`,
|
|
103
|
+
},
|
|
104
|
+
body: JSON.stringify({
|
|
105
|
+
model: config.model,
|
|
106
|
+
max_tokens: maxTokens,
|
|
107
|
+
temperature,
|
|
108
|
+
messages: messages.map(m => ({ role: m.role, content: m.content })),
|
|
109
|
+
}),
|
|
110
|
+
signal: AbortSignal.timeout(60_000),
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
if (!res.ok) throw new Error(`${config.provider} API error: ${res.status}`);
|
|
114
|
+
const data = await res.json() as { choices: Array<{ message: { content: string } }>; usage?: { completion_tokens: number } };
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
content: data.choices?.[0]?.message?.content || '',
|
|
118
|
+
model: config.model,
|
|
119
|
+
provider: config.provider,
|
|
120
|
+
tokensUsed: data.usage?.completion_tokens,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async function callOpenRouter(
|
|
125
|
+
config: ModelConfig,
|
|
126
|
+
messages: LLMMessage[],
|
|
127
|
+
maxTokens: number,
|
|
128
|
+
temperature: number
|
|
129
|
+
): Promise<LLMResponse> {
|
|
130
|
+
const apiKey = config.apiKey || process.env.OPENROUTER_API_KEY;
|
|
131
|
+
if (!apiKey) throw new Error('OPENROUTER_API_KEY required');
|
|
132
|
+
|
|
133
|
+
const res = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
134
|
+
method: 'POST',
|
|
135
|
+
headers: {
|
|
136
|
+
'Content-Type': 'application/json',
|
|
137
|
+
Authorization: `Bearer ${apiKey}`,
|
|
138
|
+
'HTTP-Referer': 'https://holoscript.net',
|
|
139
|
+
'X-Title': 'HoloScript Framework',
|
|
140
|
+
},
|
|
141
|
+
body: JSON.stringify({
|
|
142
|
+
model: config.model,
|
|
143
|
+
max_tokens: maxTokens,
|
|
144
|
+
temperature,
|
|
145
|
+
messages: messages.map(m => ({ role: m.role, content: m.content })),
|
|
146
|
+
}),
|
|
147
|
+
signal: AbortSignal.timeout(60_000),
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
if (!res.ok) throw new Error(`OpenRouter API error: ${res.status}`);
|
|
151
|
+
const data = await res.json() as { choices: Array<{ message: { content: string } }>; usage?: { completion_tokens: number } };
|
|
152
|
+
|
|
153
|
+
return {
|
|
154
|
+
content: data.choices?.[0]?.message?.content || '',
|
|
155
|
+
model: config.model,
|
|
156
|
+
provider: 'openrouter',
|
|
157
|
+
tokensUsed: data.usage?.completion_tokens,
|
|
158
|
+
};
|
|
159
|
+
}
|