@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,461 @@
1
+ /**
2
+ * Generation Analytics & Metrics
3
+ *
4
+ * Tracks and analyzes generation metrics:
5
+ * - Success rates by adapter
6
+ * - Confidence score distributions
7
+ * - Code quality metrics
8
+ * - Performance metrics
9
+ * - User patterns and trends
10
+ */
11
+
12
+ // =============================================================================
13
+ // TYPES
14
+ // =============================================================================
15
+
16
+ export interface GenerationMetrics {
17
+ promptLength: number;
18
+ codeLength: number;
19
+ confidence: number;
20
+ parseSuccess: boolean;
21
+ errorCount: number;
22
+ wasFixed: boolean;
23
+ responseTimeMs: number;
24
+ attemptsNeeded: number;
25
+ adapterName: string;
26
+ timestamp: Date;
27
+ platform?: string;
28
+ }
29
+
30
+ export interface MetricsAggregate {
31
+ totalGenerations: number;
32
+ successRate: number;
33
+ avgConfidence: number;
34
+ avgResponseTime: number;
35
+ avgErrorCount: number;
36
+ avgAttemptsNeeded: number;
37
+ mostCommonAdapter: string;
38
+ mostCommonPlatform: string;
39
+ }
40
+
41
+ export interface AdapterMetrics {
42
+ name: string;
43
+ generationCount: number;
44
+ successRate: number;
45
+ avgConfidence: number;
46
+ avgResponseTime: number;
47
+ bestFor: string[];
48
+ reliabilityScore: number; // 0-1
49
+ }
50
+
51
+ export interface TimeSeriesMetrics {
52
+ timestamp: Date;
53
+ successRate: number;
54
+ avgConfidence: number;
55
+ avgResponseTime: number;
56
+ generationCount: number;
57
+ }
58
+
59
+ // =============================================================================
60
+ // ANALYTICS ENGINE
61
+ // =============================================================================
62
+
63
+ export class GenerationAnalytics {
64
+ private metrics: GenerationMetrics[] = [];
65
+ private timeSeriesWindow: number = 3600000; // 1 hour default
66
+
67
+ /**
68
+ * Record a generation metric
69
+ */
70
+ recordMetric(metric: GenerationMetrics): void {
71
+ this.metrics.push({
72
+ ...metric,
73
+ timestamp: new Date(),
74
+ });
75
+ }
76
+
77
+ /**
78
+ * Get all metrics
79
+ */
80
+ getAllMetrics(): GenerationMetrics[] {
81
+ return [...this.metrics];
82
+ }
83
+
84
+ /**
85
+ * Clear metrics
86
+ */
87
+ clearMetrics(): void {
88
+ this.metrics = [];
89
+ }
90
+
91
+ /**
92
+ * Get aggregate metrics
93
+ */
94
+ getAggregateMetrics(): MetricsAggregate {
95
+ if (this.metrics.length === 0) {
96
+ return {
97
+ totalGenerations: 0,
98
+ successRate: 0,
99
+ avgConfidence: 0,
100
+ avgResponseTime: 0,
101
+ avgErrorCount: 0,
102
+ avgAttemptsNeeded: 0,
103
+ mostCommonAdapter: 'N/A',
104
+ mostCommonPlatform: 'N/A',
105
+ };
106
+ }
107
+
108
+ const successful = this.metrics.filter((m) => m.parseSuccess);
109
+ const successRate = successful.length / this.metrics.length;
110
+
111
+ const avgConfidence =
112
+ this.metrics.reduce((sum, m) => sum + m.confidence, 0) / this.metrics.length;
113
+ const avgResponseTime =
114
+ this.metrics.reduce((sum, m) => sum + m.responseTimeMs, 0) / this.metrics.length;
115
+ const avgErrorCount =
116
+ this.metrics.reduce((sum, m) => sum + m.errorCount, 0) / this.metrics.length;
117
+ const avgAttemptsNeeded =
118
+ this.metrics.reduce((sum, m) => sum + m.attemptsNeeded, 0) / this.metrics.length;
119
+
120
+ // Most common adapter
121
+ const adapterCounts = new Map<string, number>();
122
+ this.metrics.forEach((m) => {
123
+ adapterCounts.set(m.adapterName, (adapterCounts.get(m.adapterName) || 0) + 1);
124
+ });
125
+ const mostCommonAdapter =
126
+ Array.from(adapterCounts.entries()).sort((a, b) => b[1] - a[1])[0]?.[0] || 'N/A';
127
+
128
+ // Most common platform
129
+ const platformCounts = new Map<string, number>();
130
+ this.metrics
131
+ .filter((m) => m.platform)
132
+ .forEach((m) => {
133
+ if (m.platform) {
134
+ platformCounts.set(m.platform, (platformCounts.get(m.platform) || 0) + 1);
135
+ }
136
+ });
137
+ const mostCommonPlatform =
138
+ Array.from(platformCounts.entries()).sort((a, b) => b[1] - a[1])[0]?.[0] || 'N/A';
139
+
140
+ return {
141
+ totalGenerations: this.metrics.length,
142
+ successRate,
143
+ avgConfidence,
144
+ avgResponseTime,
145
+ avgErrorCount,
146
+ avgAttemptsNeeded,
147
+ mostCommonAdapter,
148
+ mostCommonPlatform,
149
+ };
150
+ }
151
+
152
+ /**
153
+ * Get metrics by adapter
154
+ */
155
+ getMetricsByAdapter(adapterName: string): AdapterMetrics {
156
+ const adapterMetrics = this.metrics.filter((m) => m.adapterName === adapterName);
157
+
158
+ if (adapterMetrics.length === 0) {
159
+ return {
160
+ name: adapterName,
161
+ generationCount: 0,
162
+ successRate: 0,
163
+ avgConfidence: 0,
164
+ avgResponseTime: 0,
165
+ bestFor: [],
166
+ reliabilityScore: 0,
167
+ };
168
+ }
169
+
170
+ const successful = adapterMetrics.filter((m) => m.parseSuccess);
171
+ const successRate = successful.length / adapterMetrics.length;
172
+
173
+ const avgConfidence =
174
+ adapterMetrics.reduce((sum, m) => sum + m.confidence, 0) / adapterMetrics.length;
175
+ const avgResponseTime =
176
+ adapterMetrics.reduce((sum, m) => sum + m.responseTimeMs, 0) / adapterMetrics.length;
177
+
178
+ // Determine what this adapter is best for
179
+ const bestFor: string[] = [];
180
+ if (successRate > 0.9) bestFor.push('high-accuracy');
181
+ if (avgResponseTime < 2000) bestFor.push('fast');
182
+ if (avgConfidence > 0.85) bestFor.push('confident');
183
+
184
+ const reliabilityScore = (successRate + avgConfidence) / 2;
185
+
186
+ return {
187
+ name: adapterName,
188
+ generationCount: adapterMetrics.length,
189
+ successRate,
190
+ avgConfidence,
191
+ avgResponseTime,
192
+ bestFor,
193
+ reliabilityScore,
194
+ };
195
+ }
196
+
197
+ /**
198
+ * Get all adapter metrics
199
+ */
200
+ getAllAdapterMetrics(): AdapterMetrics[] {
201
+ const adapters = new Set(this.metrics.map((m) => m.adapterName));
202
+ return Array.from(adapters)
203
+ .map((adapter) => this.getMetricsByAdapter(adapter))
204
+ .sort((a, b) => b.reliabilityScore - a.reliabilityScore);
205
+ }
206
+
207
+ /**
208
+ * Get confidence distribution
209
+ */
210
+ getConfidenceDistribution(): { range: string; count: number; percentage: number }[] {
211
+ const ranges = [
212
+ { name: '0.0-0.2', min: 0, max: 0.2 },
213
+ { name: '0.2-0.4', min: 0.2, max: 0.4 },
214
+ { name: '0.4-0.6', min: 0.4, max: 0.6 },
215
+ { name: '0.6-0.8', min: 0.6, max: 0.8 },
216
+ { name: '0.8-1.0', min: 0.8, max: 1.0 },
217
+ ];
218
+
219
+ const distribution = ranges.map((range) => {
220
+ const count = this.metrics.filter(
221
+ (m) => m.confidence >= range.min && m.confidence <= range.max
222
+ ).length;
223
+ return {
224
+ range: range.name,
225
+ count,
226
+ percentage: (count / this.metrics.length) * 100,
227
+ };
228
+ });
229
+
230
+ return distribution.filter((d) => d.count > 0);
231
+ }
232
+
233
+ /**
234
+ * Get error patterns
235
+ */
236
+ getErrorPatterns(): { errorType: string; frequency: number; percentage: number }[] {
237
+ const errorCounts = new Map<string, number>();
238
+
239
+ this.metrics
240
+ .filter((m) => m.errorCount > 0)
241
+ .forEach((m) => {
242
+ // Error types: parse, validation, timeout, etc.
243
+ const errorType = m.wasFixed ? 'fixed' : 'unresolved';
244
+ errorCounts.set(errorType, (errorCounts.get(errorType) || 0) + 1);
245
+ });
246
+
247
+ const total = Array.from(errorCounts.values()).reduce((a, b) => a + b, 0);
248
+
249
+ return Array.from(errorCounts.entries())
250
+ .map(([errorType, frequency]) => ({
251
+ errorType,
252
+ frequency,
253
+ percentage: (frequency / total) * 100,
254
+ }))
255
+ .sort((a, b) => b.frequency - a.frequency);
256
+ }
257
+
258
+ /**
259
+ * Get response time distribution
260
+ */
261
+ getResponseTimeDistribution(): { range: string; count: number; percentage: number }[] {
262
+ if (this.metrics.length === 0) return [];
263
+
264
+ const maxTime = Math.max(...this.metrics.map((m) => m.responseTimeMs));
265
+ const ranges = [
266
+ { name: '0-500ms', min: 0, max: 500 },
267
+ { name: '500ms-1s', min: 500, max: 1000 },
268
+ { name: '1s-2s', min: 1000, max: 2000 },
269
+ { name: '2s-5s', min: 2000, max: 5000 },
270
+ { name: '5s+', min: 5000, max: maxTime + 1 },
271
+ ];
272
+
273
+ const distribution = ranges.map((range) => {
274
+ const count = this.metrics.filter(
275
+ (m) => m.responseTimeMs >= range.min && m.responseTimeMs <= range.max
276
+ ).length;
277
+ return {
278
+ range: range.name,
279
+ count,
280
+ percentage: (count / this.metrics.length) * 100,
281
+ };
282
+ });
283
+
284
+ return distribution.filter((d) => d.count > 0);
285
+ }
286
+
287
+ /**
288
+ * Get time series metrics for a window
289
+ */
290
+ getTimeSeries(windowMs?: number): TimeSeriesMetrics[] {
291
+ const window = windowMs || this.timeSeriesWindow;
292
+ const now = Date.now();
293
+ const cutoff = now - window;
294
+
295
+ const relevantMetrics = this.metrics.filter((m) => m.timestamp.getTime() >= cutoff);
296
+
297
+ if (relevantMetrics.length === 0) {
298
+ return [];
299
+ }
300
+
301
+ // Group by 5-minute intervals
302
+ const intervals = new Map<number, GenerationMetrics[]>();
303
+ const intervalDuration = 5 * 60 * 1000; // 5 minutes
304
+
305
+ relevantMetrics.forEach((m) => {
306
+ const intervalStart = Math.floor(m.timestamp.getTime() / intervalDuration) * intervalDuration;
307
+ if (!intervals.has(intervalStart)) {
308
+ intervals.set(intervalStart, []);
309
+ }
310
+ intervals.get(intervalStart)!.push(m);
311
+ });
312
+
313
+ const timeSeries = Array.from(intervals.entries())
314
+ .sort((a, b) => a[0] - b[0])
315
+ .map(([timestamp, metrics]) => {
316
+ const successful = metrics.filter((m) => m.parseSuccess);
317
+ return {
318
+ timestamp: new Date(timestamp),
319
+ successRate: successful.length / metrics.length,
320
+ avgConfidence: metrics.reduce((sum, m) => sum + m.confidence, 0) / metrics.length,
321
+ avgResponseTime: metrics.reduce((sum, m) => sum + m.responseTimeMs, 0) / metrics.length,
322
+ generationCount: metrics.length,
323
+ };
324
+ });
325
+
326
+ return timeSeries;
327
+ }
328
+
329
+ /**
330
+ * Get recommendations based on metrics
331
+ */
332
+ getRecommendations(): string[] {
333
+ const recommendations: string[] = [];
334
+ const aggregate = this.getAggregateMetrics();
335
+
336
+ if (aggregate.successRate < 0.8) {
337
+ recommendations.push(
338
+ 'Success rate is below 80%. Consider adjusting confidence thresholds or improving prompts.'
339
+ );
340
+ }
341
+
342
+ if (aggregate.avgConfidence < 0.7) {
343
+ recommendations.push(
344
+ 'Average confidence is low. Try using high-performing adapters like Anthropic or OpenAI.'
345
+ );
346
+ }
347
+
348
+ if (aggregate.avgResponseTime > 5000) {
349
+ recommendations.push(
350
+ 'Response times are slow. Consider using a cache to reduce redundant API calls.'
351
+ );
352
+ }
353
+
354
+ if (aggregate.avgErrorCount > 1 && aggregate.avgAttemptsNeeded > 2) {
355
+ recommendations.push('High error counts. Improving prompts or using auto-fix could help.');
356
+ }
357
+
358
+ const allAdapters = this.getAllAdapterMetrics();
359
+ if (allAdapters.length > 1) {
360
+ const best = allAdapters[0];
361
+ const worst = allAdapters[allAdapters.length - 1];
362
+ if (best.reliabilityScore > worst.reliabilityScore + 0.2) {
363
+ recommendations.push(
364
+ `${best.name} performs significantly better than ${worst.name}. Consider using it preferentially.`
365
+ );
366
+ }
367
+ }
368
+
369
+ return recommendations;
370
+ }
371
+
372
+ /**
373
+ * Export metrics as JSON
374
+ */
375
+ exportMetrics(): string {
376
+ return JSON.stringify(
377
+ {
378
+ aggregate: this.getAggregateMetrics(),
379
+ adapters: this.getAllAdapterMetrics(),
380
+ confidenceDistribution: this.getConfidenceDistribution(),
381
+ responseTimeDistribution: this.getResponseTimeDistribution(),
382
+ errorPatterns: this.getErrorPatterns(),
383
+ recommendations: this.getRecommendations(),
384
+ exportedAt: new Date(),
385
+ },
386
+ null,
387
+ 2
388
+ );
389
+ }
390
+
391
+ /**
392
+ * Create a detailed report
393
+ */
394
+ generateReport(): string {
395
+ const aggregate = this.getAggregateMetrics();
396
+ const adapters = this.getAllAdapterMetrics();
397
+ const confidenceDistribution = this.getConfidenceDistribution();
398
+ const responseTimeDistribution = this.getResponseTimeDistribution();
399
+ const recommendations = this.getRecommendations();
400
+
401
+ let report = 'GENERATION ANALYTICS REPORT\n';
402
+ report += '='.repeat(50) + '\n\n';
403
+
404
+ report += 'SUMMARY\n';
405
+ report += '-'.repeat(50) + '\n';
406
+ report += `Total Generations: ${aggregate.totalGenerations}\n`;
407
+ report += `Success Rate: ${(aggregate.successRate * 100).toFixed(1)}%\n`;
408
+ report += `Avg Confidence: ${aggregate.avgConfidence.toFixed(2)}\n`;
409
+ report += `Avg Response Time: ${aggregate.avgResponseTime.toFixed(0)}ms\n`;
410
+ report += `Most Used Adapter: ${aggregate.mostCommonAdapter}\n\n`;
411
+
412
+ report += 'ADAPTER PERFORMANCE\n';
413
+ report += '-'.repeat(50) + '\n';
414
+ adapters.forEach((adapter) => {
415
+ report += `${adapter.name}:\n`;
416
+ report += ` Generations: ${adapter.generationCount}\n`;
417
+ report += ` Success Rate: ${(adapter.successRate * 100).toFixed(1)}%\n`;
418
+ report += ` Reliability: ${(adapter.reliabilityScore * 100).toFixed(0)}%\n`;
419
+ report += ` Avg Response: ${adapter.avgResponseTime.toFixed(0)}ms\n`;
420
+ if (adapter.bestFor.length > 0) {
421
+ report += ` Best For: ${adapter.bestFor.join(', ')}\n`;
422
+ }
423
+ report += '\n';
424
+ });
425
+
426
+ report += 'CONFIDENCE DISTRIBUTION\n';
427
+ report += '-'.repeat(50) + '\n';
428
+ confidenceDistribution.forEach((dist) => {
429
+ report += `${dist.range}: ${dist.percentage.toFixed(1)}% (${dist.count})\n`;
430
+ });
431
+ report += '\n';
432
+
433
+ report += 'RESPONSE TIME DISTRIBUTION\n';
434
+ report += '-'.repeat(50) + '\n';
435
+ responseTimeDistribution.forEach((dist) => {
436
+ report += `${dist.range}: ${dist.percentage.toFixed(1)}% (${dist.count})\n`;
437
+ });
438
+ report += '\n';
439
+
440
+ if (recommendations.length > 0) {
441
+ report += 'RECOMMENDATIONS\n';
442
+ report += '-'.repeat(50) + '\n';
443
+ recommendations.forEach((rec, i) => {
444
+ report += `${i + 1}. ${rec}\n`;
445
+ });
446
+ }
447
+
448
+ return report;
449
+ }
450
+ }
451
+
452
+ // =============================================================================
453
+ // HELPER FUNCTIONS
454
+ // =============================================================================
455
+
456
+ /**
457
+ * Quick analytics creation
458
+ */
459
+ export function createAnalytics(): GenerationAnalytics {
460
+ return new GenerationAnalytics();
461
+ }
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Generation Cache System
3
+ *
4
+ * Caches generated HoloScript code to avoid redundant API calls.
5
+ * Implements LRU (Least Recently Used) eviction policy.
6
+ *
7
+ * Features:
8
+ * - Prompt-based caching (hash of prompt + adapter)
9
+ * - TTL (Time-To-Live) support
10
+ * - Statistics tracking
11
+ * - Serialization for persistence
12
+ */
13
+
14
+ import * as crypto from 'crypto';
15
+
16
+ // =============================================================================
17
+ // TYPES
18
+ // =============================================================================
19
+
20
+ export interface CacheEntry {
21
+ prompt: string;
22
+ code: string;
23
+ confidence: number;
24
+ timestamp: number;
25
+ ttl?: number; // milliseconds
26
+ hits: number; // Number of times this entry was hit
27
+ adapterName: string;
28
+ }
29
+
30
+ export interface CacheStats {
31
+ totalHits: number;
32
+ totalMisses: number;
33
+ hitRate: number;
34
+ entriesCount: number;
35
+ maxSize: number;
36
+ averageHitCount: number;
37
+ }
38
+
39
+ // =============================================================================
40
+ // GENERATION CACHE
41
+ // =============================================================================
42
+
43
+ export class GenerationCache {
44
+ private cache: Map<string, CacheEntry> = new Map();
45
+ private maxSize: number;
46
+ private ttlMs: number;
47
+
48
+ // Statistics
49
+ private hits = 0;
50
+ private misses = 0;
51
+
52
+ constructor(options: { maxSize?: number; ttlMs?: number } = {}) {
53
+ this.maxSize = options.maxSize || 1000;
54
+ this.ttlMs = options.ttlMs || 24 * 60 * 60 * 1000; // 24 hours default
55
+ }
56
+
57
+ /**
58
+ * Generate cache key from prompt and adapter
59
+ */
60
+ private generateKey(prompt: string, adapterName: string): string {
61
+ const combined = `${prompt}::${adapterName}`;
62
+ return crypto.createHash('sha256').update(combined).digest('hex').substring(0, 16);
63
+ }
64
+
65
+ /**
66
+ * Get cached code if available and valid
67
+ */
68
+ get(prompt: string, adapterName: string): CacheEntry | null {
69
+ const key = this.generateKey(prompt, adapterName);
70
+ const entry = this.cache.get(key);
71
+
72
+ if (!entry) {
73
+ this.misses++;
74
+ return null;
75
+ }
76
+
77
+ // Check if expired
78
+ if (entry.ttl && Date.now() - entry.timestamp > entry.ttl) {
79
+ this.cache.delete(key);
80
+ this.misses++;
81
+ return null;
82
+ }
83
+
84
+ // Update hit tracking
85
+ entry.hits++;
86
+ this.hits++;
87
+
88
+ return entry;
89
+ }
90
+
91
+ /**
92
+ * Store generated code in cache
93
+ */
94
+ set(prompt: string, code: string, confidence: number, adapterName: string): void {
95
+ const key = this.generateKey(prompt, adapterName);
96
+
97
+ // Check if cache is full and evict LRU entry
98
+ if (this.cache.size >= this.maxSize && !this.cache.has(key)) {
99
+ this.evictLRU();
100
+ }
101
+
102
+ const entry: CacheEntry = {
103
+ prompt,
104
+ code,
105
+ confidence,
106
+ timestamp: Date.now(),
107
+ ttl: this.ttlMs,
108
+ hits: 0,
109
+ adapterName,
110
+ };
111
+
112
+ this.cache.set(key, entry);
113
+ }
114
+
115
+ /**
116
+ * Evict least recently used entry
117
+ */
118
+ private evictLRU(): void {
119
+ if (this.cache.size === 0) return;
120
+
121
+ let oldestEntry: [string, CacheEntry] | null = null;
122
+ let oldestTime = Infinity;
123
+
124
+ for (const [key, entry] of this.cache) {
125
+ if (entry.timestamp < oldestTime) {
126
+ oldestTime = entry.timestamp;
127
+ oldestEntry = [key, entry];
128
+ }
129
+ }
130
+
131
+ if (oldestEntry) {
132
+ this.cache.delete(oldestEntry[0]);
133
+ }
134
+ }
135
+
136
+ /**
137
+ * Clear entire cache
138
+ */
139
+ clear(): void {
140
+ this.cache.clear();
141
+ this.hits = 0;
142
+ this.misses = 0;
143
+ }
144
+
145
+ /**
146
+ * Get cache statistics
147
+ */
148
+ getStats(): CacheStats {
149
+ const total = this.hits + this.misses;
150
+ const avgHits =
151
+ this.cache.size > 0
152
+ ? Array.from(this.cache.values()).reduce((sum, e) => sum + e.hits, 0) / this.cache.size
153
+ : 0;
154
+
155
+ return {
156
+ totalHits: this.hits,
157
+ totalMisses: this.misses,
158
+ hitRate: total > 0 ? this.hits / total : 0,
159
+ entriesCount: this.cache.size,
160
+ maxSize: this.maxSize,
161
+ averageHitCount: avgHits,
162
+ };
163
+ }
164
+
165
+ /**
166
+ * Export cache as JSON
167
+ */
168
+ serialize(): string {
169
+ const entries = Array.from(this.cache.entries()).map(([key, entry]) => ({
170
+ key,
171
+ ...entry,
172
+ }));
173
+
174
+ return JSON.stringify({
175
+ entries,
176
+ stats: { hits: this.hits, misses: this.misses },
177
+ });
178
+ }
179
+
180
+ /**
181
+ * Import cache from JSON
182
+ */
183
+ deserialize(json: string): void {
184
+ try {
185
+ const data = JSON.parse(json);
186
+
187
+ this.cache.clear();
188
+ data.entries.forEach((entry: CacheEntry & { key: string }) => {
189
+ const { key, ...cacheEntry } = entry;
190
+ this.cache.set(key, cacheEntry);
191
+ });
192
+
193
+ this.hits = data.stats.hits;
194
+ this.misses = data.stats.misses;
195
+ } catch (error) {
196
+ throw new Error(
197
+ `Failed to deserialize cache: ${error instanceof Error ? error.message : String(error)}`
198
+ );
199
+ }
200
+ }
201
+
202
+ /**
203
+ * Get all cache entries
204
+ */
205
+ getEntries(): CacheEntry[] {
206
+ return Array.from(this.cache.values());
207
+ }
208
+
209
+ /**
210
+ * Remove specific entry
211
+ */
212
+ remove(prompt: string, adapterName: string): boolean {
213
+ const key = this.generateKey(prompt, adapterName);
214
+ return this.cache.delete(key);
215
+ }
216
+
217
+ /**
218
+ * Get cache size in bytes (approximate)
219
+ */
220
+ getSize(): number {
221
+ return this.serialize().length;
222
+ }
223
+ }
224
+
225
+ // =============================================================================
226
+ // CACHED GENERATION RESULT
227
+ // =============================================================================
228
+
229
+ export interface CachedGenerationResult {
230
+ code: string;
231
+ confidence: number;
232
+ fromCache: boolean;
233
+ cacheAge?: number; // milliseconds
234
+ }
235
+
236
+ /**
237
+ * Wrap generation with caching
238
+ */
239
+ export async function cachedGenerate(
240
+ prompt: string,
241
+ adapterName: string,
242
+ cache: GenerationCache,
243
+ generator: () => Promise<{ holoScript: string; aiConfidence: number }>
244
+ ): Promise<CachedGenerationResult> {
245
+ // Check cache first
246
+ const cached = cache.get(prompt, adapterName);
247
+ if (cached) {
248
+ return {
249
+ code: cached.code,
250
+ confidence: cached.confidence,
251
+ fromCache: true,
252
+ cacheAge: Date.now() - cached.timestamp,
253
+ };
254
+ }
255
+
256
+ // Generate if not cached
257
+ const result = await generator();
258
+ cache.set(prompt, result.holoScript, result.aiConfidence, adapterName);
259
+
260
+ return {
261
+ code: result.holoScript,
262
+ confidence: result.aiConfidence,
263
+ fromCache: false,
264
+ };
265
+ }