@holoscript/framework 6.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/ALL-test-results.json +1 -0
  2. package/CHANGELOG.md +8 -0
  3. package/LICENSE +21 -0
  4. package/ROADMAP.md +175 -0
  5. package/dist/AgentManifest-CB4xM-Ma.d.cts +704 -0
  6. package/dist/AgentManifest-CB4xM-Ma.d.ts +704 -0
  7. package/dist/BehaviorTree-BrBFECv5.d.cts +103 -0
  8. package/dist/BehaviorTree-BrBFECv5.d.ts +103 -0
  9. package/dist/InvisibleWallet-BB6tFvRA.d.cts +1732 -0
  10. package/dist/InvisibleWallet-rtRrBOA8.d.ts +1732 -0
  11. package/dist/OrchestratorAgent-BvWgf9uw.d.cts +798 -0
  12. package/dist/OrchestratorAgent-Q_CbVTmO.d.ts +798 -0
  13. package/dist/agents/index.cjs +4790 -0
  14. package/dist/agents/index.d.cts +1788 -0
  15. package/dist/agents/index.d.ts +1788 -0
  16. package/dist/agents/index.js +4695 -0
  17. package/dist/ai/index.cjs +5347 -0
  18. package/dist/ai/index.d.cts +1753 -0
  19. package/dist/ai/index.d.ts +1753 -0
  20. package/dist/ai/index.js +5244 -0
  21. package/dist/behavior.cjs +449 -0
  22. package/dist/behavior.d.cts +130 -0
  23. package/dist/behavior.d.ts +130 -0
  24. package/dist/behavior.js +407 -0
  25. package/dist/economy/index.cjs +3659 -0
  26. package/dist/economy/index.d.cts +747 -0
  27. package/dist/economy/index.d.ts +747 -0
  28. package/dist/economy/index.js +3617 -0
  29. package/dist/implementations-D9T3un9D.d.cts +236 -0
  30. package/dist/implementations-D9T3un9D.d.ts +236 -0
  31. package/dist/index.cjs +24550 -0
  32. package/dist/index.d.cts +1729 -0
  33. package/dist/index.d.ts +1729 -0
  34. package/dist/index.js +24277 -0
  35. package/dist/learning/index.cjs +219 -0
  36. package/dist/learning/index.d.cts +104 -0
  37. package/dist/learning/index.d.ts +104 -0
  38. package/dist/learning/index.js +189 -0
  39. package/dist/negotiation/index.cjs +970 -0
  40. package/dist/negotiation/index.d.cts +610 -0
  41. package/dist/negotiation/index.d.ts +610 -0
  42. package/dist/negotiation/index.js +931 -0
  43. package/dist/skills/index.cjs +1118 -0
  44. package/dist/skills/index.d.cts +289 -0
  45. package/dist/skills/index.d.ts +289 -0
  46. package/dist/skills/index.js +1079 -0
  47. package/dist/swarm/index.cjs +5268 -0
  48. package/dist/swarm/index.d.cts +2433 -0
  49. package/dist/swarm/index.d.ts +2433 -0
  50. package/dist/swarm/index.js +5221 -0
  51. package/dist/training/index.cjs +2745 -0
  52. package/dist/training/index.d.cts +1734 -0
  53. package/dist/training/index.d.ts +1734 -0
  54. package/dist/training/index.js +2687 -0
  55. package/extract-failures.js +10 -0
  56. package/package.json +82 -0
  57. package/src/__tests__/bounty-marketplace.test.ts +374 -0
  58. package/src/__tests__/delegation.test.ts +144 -0
  59. package/src/__tests__/distributed-claimer.test.ts +147 -0
  60. package/src/__tests__/done-log-audit.test.ts +342 -0
  61. package/src/__tests__/framework.test.ts +865 -0
  62. package/src/__tests__/goal-synthesizer.test.ts +236 -0
  63. package/src/__tests__/presence.test.ts +223 -0
  64. package/src/__tests__/protocol-agent.test.ts +254 -0
  65. package/src/__tests__/revenue-splitter.test.ts +114 -0
  66. package/src/__tests__/scenario-driven-todo.test.ts +197 -0
  67. package/src/__tests__/self-improve.test.ts +349 -0
  68. package/src/__tests__/service-lifecycle.test.ts +237 -0
  69. package/src/__tests__/skill-router.test.ts +121 -0
  70. package/src/agents/AgentManifest.ts +493 -0
  71. package/src/agents/AgentRegistry.ts +475 -0
  72. package/src/agents/AgentTypes.ts +585 -0
  73. package/src/agents/AgentWalletRegistry.ts +83 -0
  74. package/src/agents/AuthenticatedCRDT.ts +388 -0
  75. package/src/agents/CapabilityMatcher.ts +453 -0
  76. package/src/agents/CrossRealityHandoff.ts +305 -0
  77. package/src/agents/CulturalMemory.ts +454 -0
  78. package/src/agents/FederatedRegistryAdapter.ts +429 -0
  79. package/src/agents/NormEngine.ts +450 -0
  80. package/src/agents/OrchestratorAgent.ts +414 -0
  81. package/src/agents/SkillWorkflowEngine.ts +472 -0
  82. package/src/agents/TaskDelegationService.ts +551 -0
  83. package/src/agents/__tests__/AgentManifest.prod.test.ts +134 -0
  84. package/src/agents/__tests__/AgentManifest.test.ts +182 -0
  85. package/src/agents/__tests__/AgentModule.test.ts +864 -0
  86. package/src/agents/__tests__/AgentRegistry.prod.test.ts +125 -0
  87. package/src/agents/__tests__/AgentRegistry.test.ts +148 -0
  88. package/src/agents/__tests__/AgentTypes.test.ts +534 -0
  89. package/src/agents/__tests__/AgentWalletRegistry.test.ts +152 -0
  90. package/src/agents/__tests__/AuthenticatedCRDT.test.ts +558 -0
  91. package/src/agents/__tests__/CapabilityMatcher.prod.test.ts +117 -0
  92. package/src/agents/__tests__/CapabilityMatcher.test.ts +178 -0
  93. package/src/agents/__tests__/CrossRealityHandoff.test.ts +402 -0
  94. package/src/agents/__tests__/CulturalMemory.test.ts +200 -0
  95. package/src/agents/__tests__/FederatedRegistryAdapter.test.ts +409 -0
  96. package/src/agents/__tests__/NormEngine.test.ts +276 -0
  97. package/src/agents/__tests__/OrchestratorAgent.test.ts +182 -0
  98. package/src/agents/__tests__/SkillWorkflowEngine.test.ts +357 -0
  99. package/src/agents/__tests__/TaskDelegationService.test.ts +446 -0
  100. package/src/agents/index.ts +107 -0
  101. package/src/agents/spatial-comms/Layer1RealTime.ts +621 -0
  102. package/src/agents/spatial-comms/Layer2A2A.ts +661 -0
  103. package/src/agents/spatial-comms/Layer3MCP.ts +651 -0
  104. package/src/agents/spatial-comms/ProtocolTypes.ts +543 -0
  105. package/src/agents/spatial-comms/SpatialCommClient.ts +483 -0
  106. package/src/agents/spatial-comms/__tests__/performance-benchmark.test.ts +465 -0
  107. package/src/agents/spatial-comms/examples/multi-agent-world-creation.ts +409 -0
  108. package/src/agents/spatial-comms/index.ts +66 -0
  109. package/src/ai/AIAdapter.ts +313 -0
  110. package/src/ai/AICopilot.ts +331 -0
  111. package/src/ai/AIOutputValidator.ts +203 -0
  112. package/src/ai/BTNodes.ts +239 -0
  113. package/src/ai/BehaviorSelector.ts +135 -0
  114. package/src/ai/BehaviorTree.ts +153 -0
  115. package/src/ai/Blackboard.ts +165 -0
  116. package/src/ai/GenerationAnalytics.ts +461 -0
  117. package/src/ai/GenerationCache.ts +265 -0
  118. package/src/ai/GoalPlanner.ts +165 -0
  119. package/src/ai/HoloScriptGenerator.ts +580 -0
  120. package/src/ai/InfluenceMap.ts +180 -0
  121. package/src/ai/NavMesh.ts +168 -0
  122. package/src/ai/PerceptionSystem.ts +178 -0
  123. package/src/ai/PromptTemplates.ts +453 -0
  124. package/src/ai/SemanticSearchService.ts +80 -0
  125. package/src/ai/StateMachine.ts +196 -0
  126. package/src/ai/SteeringBehavior.ts +150 -0
  127. package/src/ai/SteeringBehaviors.ts +244 -0
  128. package/src/ai/TrainingDataGenerator.ts +1082 -0
  129. package/src/ai/UtilityAI.ts +145 -0
  130. package/src/ai/__tests__/AIAdapter.prod.test.ts +259 -0
  131. package/src/ai/__tests__/AIAdapter.test.ts +109 -0
  132. package/src/ai/__tests__/AICopilot.prod.test.ts +341 -0
  133. package/src/ai/__tests__/AICopilot.test.ts +178 -0
  134. package/src/ai/__tests__/AIOutputValidator.prod.test.ts +226 -0
  135. package/src/ai/__tests__/AIOutputValidator.test.ts +138 -0
  136. package/src/ai/__tests__/BTNodes.prod.test.ts +391 -0
  137. package/src/ai/__tests__/BTNodes.test.ts +263 -0
  138. package/src/ai/__tests__/BehaviorSelector.prod.test.ts +129 -0
  139. package/src/ai/__tests__/BehaviorSelector.test.ts +132 -0
  140. package/src/ai/__tests__/BehaviorTree.prod.test.ts +266 -0
  141. package/src/ai/__tests__/BehaviorTree.test.ts +216 -0
  142. package/src/ai/__tests__/Blackboard.prod.test.ts +339 -0
  143. package/src/ai/__tests__/Blackboard.test.ts +183 -0
  144. package/src/ai/__tests__/GenerationAnalytics.prod.test.ts +141 -0
  145. package/src/ai/__tests__/GenerationAnalytics.test.ts +165 -0
  146. package/src/ai/__tests__/GenerationCache.prod.test.ts +144 -0
  147. package/src/ai/__tests__/GenerationCache.test.ts +171 -0
  148. package/src/ai/__tests__/GoalPlanner.prod.test.ts +189 -0
  149. package/src/ai/__tests__/GoalPlanner.test.ts +137 -0
  150. package/src/ai/__tests__/GoalPlannerDepth.prod.test.ts +217 -0
  151. package/src/ai/__tests__/HoloScriptGenerator.test.ts +125 -0
  152. package/src/ai/__tests__/InfluenceMap.prod.test.ts +146 -0
  153. package/src/ai/__tests__/InfluenceMap.test.ts +149 -0
  154. package/src/ai/__tests__/NavMesh.prod.test.ts +141 -0
  155. package/src/ai/__tests__/NavMesh.test.ts +159 -0
  156. package/src/ai/__tests__/PerceptionSystem.prod.test.ts +135 -0
  157. package/src/ai/__tests__/PerceptionSystem.test.ts +250 -0
  158. package/src/ai/__tests__/PromptTemplates.prod.test.ts +313 -0
  159. package/src/ai/__tests__/PromptTemplates.test.ts +146 -0
  160. package/src/ai/__tests__/SemanticSearch.test.ts +37 -0
  161. package/src/ai/__tests__/StateMachine.prod.test.ts +162 -0
  162. package/src/ai/__tests__/StateMachine.test.ts +163 -0
  163. package/src/ai/__tests__/SteeringBehavior.prod.test.ts +251 -0
  164. package/src/ai/__tests__/SteeringBehavior.test.ts +135 -0
  165. package/src/ai/__tests__/SteeringBehaviors.prod.test.ts +133 -0
  166. package/src/ai/__tests__/SteeringBehaviors.test.ts +151 -0
  167. package/src/ai/__tests__/TrainingDataGenerator.prod.test.ts +286 -0
  168. package/src/ai/__tests__/TrainingDataGenerator.test.ts +286 -0
  169. package/src/ai/__tests__/UtilityAI.prod.test.ts +207 -0
  170. package/src/ai/__tests__/UtilityAI.test.ts +155 -0
  171. package/src/ai/__tests__/adapters.prod.test.ts +263 -0
  172. package/src/ai/__tests__/adapters.test.ts +320 -0
  173. package/src/ai/adapters.ts +1585 -0
  174. package/src/ai/index.ts +130 -0
  175. package/src/behavior/BehaviorPresets.ts +140 -0
  176. package/src/behavior/BehaviorTree.ts +236 -0
  177. package/src/behavior/StateMachine.ts +176 -0
  178. package/src/behavior/StateTrait.ts +67 -0
  179. package/src/behavior/index.ts +8 -0
  180. package/src/behavior.ts +8 -0
  181. package/src/board/audit.ts +284 -0
  182. package/src/board/board-ops.ts +336 -0
  183. package/src/board/board-types.ts +302 -0
  184. package/src/board/index.ts +69 -0
  185. package/src/define-agent.ts +46 -0
  186. package/src/define-team.ts +33 -0
  187. package/src/delegation.ts +265 -0
  188. package/src/distributed-claimer.ts +228 -0
  189. package/src/economy/AgentBudgetEnforcer.ts +464 -0
  190. package/src/economy/BountyManager.ts +185 -0
  191. package/src/economy/CreatorRevenueAggregator.ts +460 -0
  192. package/src/economy/InvisibleWallet.ts +82 -0
  193. package/src/economy/KnowledgeMarketplace.ts +193 -0
  194. package/src/economy/PaymentWebhookService.ts +512 -0
  195. package/src/economy/RevenueSplitter.ts +156 -0
  196. package/src/economy/SubscriptionManager.ts +546 -0
  197. package/src/economy/UnifiedBudgetOptimizer.ts +635 -0
  198. package/src/economy/UsageMeter.ts +440 -0
  199. package/src/economy/_core-stubs.ts +219 -0
  200. package/src/economy/index.ts +100 -0
  201. package/src/economy/x402-facilitator.ts +1978 -0
  202. package/src/index.ts +348 -0
  203. package/src/knowledge/__tests__/knowledge-consolidator.test.ts +444 -0
  204. package/src/knowledge/__tests__/knowledge-store-vector.test.ts +291 -0
  205. package/src/knowledge/brain.ts +167 -0
  206. package/src/knowledge/consolidation.ts +581 -0
  207. package/src/knowledge/knowledge-consolidator.ts +510 -0
  208. package/src/knowledge/knowledge-store.ts +616 -0
  209. package/src/learning/MemoryConsolidator.ts +102 -0
  210. package/src/learning/MemoryScorer.ts +69 -0
  211. package/src/learning/ProceduralCompiler.ts +45 -0
  212. package/src/learning/SemanticClusterer.ts +66 -0
  213. package/src/learning/index.ts +8 -0
  214. package/src/llm/llm-adapter.ts +159 -0
  215. package/src/mesh/index.ts +309 -0
  216. package/src/negotiation/NegotiationProtocol.ts +694 -0
  217. package/src/negotiation/NegotiationTypes.ts +473 -0
  218. package/src/negotiation/VotingMechanisms.ts +691 -0
  219. package/src/negotiation/index.ts +49 -0
  220. package/src/protocol/goal-synthesizer.ts +317 -0
  221. package/src/protocol/implementations.ts +474 -0
  222. package/src/protocol/micro-phase-decomposer.ts +299 -0
  223. package/src/protocol/micro-step-decomposer.test.ts +306 -0
  224. package/src/protocol-agent.test.ts +353 -0
  225. package/src/protocol-agent.ts +670 -0
  226. package/src/self-improve/absorb-scanner.ts +252 -0
  227. package/src/self-improve/evolution-engine.ts +149 -0
  228. package/src/self-improve/framework-absorber.ts +214 -0
  229. package/src/self-improve/index.ts +50 -0
  230. package/src/self-improve/prompt-optimizer.ts +212 -0
  231. package/src/self-improve/test-generator.ts +175 -0
  232. package/src/skill-router.ts +186 -0
  233. package/src/skills/index.ts +5 -0
  234. package/src/skills/skill-md-bridge.ts +1699 -0
  235. package/src/swarm/ACOEngine.ts +261 -0
  236. package/src/swarm/CollectiveIntelligence.ts +383 -0
  237. package/src/swarm/ContributionSynthesizer.ts +481 -0
  238. package/src/swarm/LeaderElection.ts +393 -0
  239. package/src/swarm/PSOEngine.ts +206 -0
  240. package/src/swarm/QuorumPolicy.ts +173 -0
  241. package/src/swarm/SwarmCoordinator.ts +335 -0
  242. package/src/swarm/SwarmManager.ts +442 -0
  243. package/src/swarm/SwarmMembership.ts +456 -0
  244. package/src/swarm/VotingRound.ts +255 -0
  245. package/src/swarm/__tests__/ACOEngine.prod.test.ts +164 -0
  246. package/src/swarm/__tests__/ACOEngine.test.ts +117 -0
  247. package/src/swarm/__tests__/CollectiveIntelligence.prod.test.ts +296 -0
  248. package/src/swarm/__tests__/CollectiveIntelligence.test.ts +457 -0
  249. package/src/swarm/__tests__/ContributionSynthesizer.prod.test.ts +269 -0
  250. package/src/swarm/__tests__/ContributionSynthesizer.test.ts +254 -0
  251. package/src/swarm/__tests__/LeaderElection.prod.test.ts +196 -0
  252. package/src/swarm/__tests__/LeaderElection.test.ts +151 -0
  253. package/src/swarm/__tests__/PSOEngine.prod.test.ts +162 -0
  254. package/src/swarm/__tests__/PSOEngine.test.ts +106 -0
  255. package/src/swarm/__tests__/QuorumPolicy.prod.test.ts +216 -0
  256. package/src/swarm/__tests__/QuorumPolicy.test.ts +177 -0
  257. package/src/swarm/__tests__/SwarmCoordinator.prod.test.ts +186 -0
  258. package/src/swarm/__tests__/SwarmCoordinator.test.ts +167 -0
  259. package/src/swarm/__tests__/SwarmManager.prod.test.ts +308 -0
  260. package/src/swarm/__tests__/SwarmManager.test.ts +373 -0
  261. package/src/swarm/__tests__/SwarmMembership.prod.test.ts +273 -0
  262. package/src/swarm/__tests__/SwarmMembership.test.ts +264 -0
  263. package/src/swarm/__tests__/VotingRound.prod.test.ts +233 -0
  264. package/src/swarm/__tests__/VotingRound.test.ts +174 -0
  265. package/src/swarm/analytics/SwarmInspector.ts +476 -0
  266. package/src/swarm/analytics/SwarmMetrics.ts +449 -0
  267. package/src/swarm/analytics/__tests__/SwarmInspector.prod.test.ts +366 -0
  268. package/src/swarm/analytics/__tests__/SwarmInspector.test.ts +454 -0
  269. package/src/swarm/analytics/__tests__/SwarmMetrics.prod.test.ts +254 -0
  270. package/src/swarm/analytics/__tests__/SwarmMetrics.test.ts +370 -0
  271. package/src/swarm/analytics/index.ts +7 -0
  272. package/src/swarm/index.ts +69 -0
  273. package/src/swarm/messaging/BroadcastChannel.ts +509 -0
  274. package/src/swarm/messaging/GossipProtocol.ts +565 -0
  275. package/src/swarm/messaging/SwarmEventBus.ts +443 -0
  276. package/src/swarm/messaging/__tests__/BroadcastChannel.prod.test.ts +331 -0
  277. package/src/swarm/messaging/__tests__/BroadcastChannel.test.ts +333 -0
  278. package/src/swarm/messaging/__tests__/GossipProtocol.prod.test.ts +356 -0
  279. package/src/swarm/messaging/__tests__/GossipProtocol.test.ts +437 -0
  280. package/src/swarm/messaging/__tests__/SwarmEventBus.prod.test.ts +191 -0
  281. package/src/swarm/messaging/__tests__/SwarmEventBus.test.ts +247 -0
  282. package/src/swarm/messaging/index.ts +8 -0
  283. package/src/swarm/spatial/FlockingBehavior.ts +462 -0
  284. package/src/swarm/spatial/FormationController.ts +500 -0
  285. package/src/swarm/spatial/Vector3.ts +170 -0
  286. package/src/swarm/spatial/ZoneClaiming.ts +509 -0
  287. package/src/swarm/spatial/__tests__/FlockingBehavior.prod.test.ts +239 -0
  288. package/src/swarm/spatial/__tests__/FlockingBehavior.test.ts +298 -0
  289. package/src/swarm/spatial/__tests__/FormationController.prod.test.ts +240 -0
  290. package/src/swarm/spatial/__tests__/FormationController.test.ts +297 -0
  291. package/src/swarm/spatial/__tests__/Vector3.prod.test.ts +283 -0
  292. package/src/swarm/spatial/__tests__/Vector3.test.ts +224 -0
  293. package/src/swarm/spatial/__tests__/ZoneClaiming.prod.test.ts +246 -0
  294. package/src/swarm/spatial/__tests__/ZoneClaiming.test.ts +374 -0
  295. package/src/swarm/spatial/index.ts +28 -0
  296. package/src/team.ts +1245 -0
  297. package/src/training/LRScheduler.ts +377 -0
  298. package/src/training/QualityScoringPipeline.ts +139 -0
  299. package/src/training/SoftDedup.ts +461 -0
  300. package/src/training/SparsityMonitor.ts +685 -0
  301. package/src/training/SparsityMonitorTypes.ts +209 -0
  302. package/src/training/SpatialTrainingDataGenerator.ts +1526 -0
  303. package/src/training/SpatialTrainingDataTypes.ts +216 -0
  304. package/src/training/TrainingPipelineConfig.ts +215 -0
  305. package/src/training/constants.ts +94 -0
  306. package/src/training/index.ts +138 -0
  307. package/src/training/schema.ts +147 -0
  308. package/src/training/scripts/generate-novel-use-cases-dataset.ts +272 -0
  309. package/src/training/scripts/generate-spatial-dataset.ts +521 -0
  310. package/src/training/training/data/novel-use-cases.jsonl +153 -0
  311. package/src/training/training/data/spatial-reasoning-10k.jsonl +9354 -0
  312. package/src/training/trainingmonkey/TrainingMonkeyIntegration.ts +477 -0
  313. package/src/training/trainingmonkey/TrainingMonkeyTypes.ts +230 -0
  314. package/src/training/trainingmonkey/index.ts +26 -0
  315. package/src/training/trait-mappings.ts +157 -0
  316. package/src/types/core-stubs.d.ts +113 -0
  317. package/src/types.ts +304 -0
  318. package/test-output.txt +0 -0
  319. package/test-result.json +1 -0
  320. package/tsc-errors.txt +4 -0
  321. package/tsc_output.txt +0 -0
  322. package/tsconfig.json +14 -0
  323. package/tsup-learning-esm.config.ts +12 -0
  324. package/tsup.config.ts +21 -0
  325. package/typescript-errors-2.txt +0 -0
  326. package/typescript-errors.txt +22 -0
  327. package/vitest-log-utf8.txt +268 -0
  328. package/vitest-log.txt +0 -0
  329. package/vitest.config.ts +8 -0
@@ -0,0 +1,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,8 @@
1
+ /**
2
+ * Learning module barrel
3
+ * Re-exports all learning functionality from @holoscript/framework
4
+ */
5
+ export * from './MemoryConsolidator';
6
+ export * from './MemoryScorer';
7
+ export * from './ProceduralCompiler';
8
+ export * from './SemanticClusterer';
@@ -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
+ }