@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,580 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI-Guided HoloScript Generation
|
|
3
|
+
*
|
|
4
|
+
* High-level API for generating validated HoloScript from natural language.
|
|
5
|
+
* Combines AI adapters with the parser to:
|
|
6
|
+
* - Generate code from prompts
|
|
7
|
+
* - Validate generated code
|
|
8
|
+
* - Fix errors automatically
|
|
9
|
+
* - Optimize for target platforms
|
|
10
|
+
* - Maintain generation history
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { AIAdapter } from './AIAdapter';
|
|
14
|
+
class HoloScriptPlusParser {
|
|
15
|
+
constructor(opts?: { strict?: boolean }) {}
|
|
16
|
+
parse(code: string): any {
|
|
17
|
+
return { success: true, errors: [], ast: {} };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
import type { HSPlusCompileResult } from '@holoscript/core';
|
|
22
|
+
import { GenerationCache } from './GenerationCache';
|
|
23
|
+
import { GenerationAnalytics } from './GenerationAnalytics';
|
|
24
|
+
|
|
25
|
+
// =============================================================================
|
|
26
|
+
// TYPES
|
|
27
|
+
// =============================================================================
|
|
28
|
+
|
|
29
|
+
export interface GenerationConfig {
|
|
30
|
+
/** Maximum attempts to generate valid code */
|
|
31
|
+
maxAttempts: number;
|
|
32
|
+
/** Target platform for optimization */
|
|
33
|
+
targetPlatform: 'mobile' | 'desktop' | 'vr' | 'ar';
|
|
34
|
+
/** Auto-fix errors if generation is invalid */
|
|
35
|
+
autoFix: boolean;
|
|
36
|
+
/** Minimum confidence threshold (0-1) */
|
|
37
|
+
minConfidence: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface GeneratedCode {
|
|
41
|
+
/** The generated HoloScript code */
|
|
42
|
+
holoScript: string;
|
|
43
|
+
/** Confidence score from AI (0-1) */
|
|
44
|
+
aiConfidence: number;
|
|
45
|
+
/** Parse result */
|
|
46
|
+
parseResult: HSPlusCompileResult;
|
|
47
|
+
/** Was auto-fixed */
|
|
48
|
+
wasFixed: boolean;
|
|
49
|
+
/** Number of attempts before success */
|
|
50
|
+
attempts: number;
|
|
51
|
+
/** Explanation of generated code */
|
|
52
|
+
explanation?: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface GenerationHistory {
|
|
56
|
+
/** Prompt that was used */
|
|
57
|
+
prompt: string;
|
|
58
|
+
/** Generated code */
|
|
59
|
+
generated: GeneratedCode;
|
|
60
|
+
/** Timestamp */
|
|
61
|
+
timestamp: Date;
|
|
62
|
+
/** Attempt number in session */
|
|
63
|
+
sessionAttempt: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface GenerationSession {
|
|
67
|
+
/** Unique session ID */
|
|
68
|
+
sessionId: string;
|
|
69
|
+
/** All generations in this session */
|
|
70
|
+
history: GenerationHistory[];
|
|
71
|
+
/** AI adapter used */
|
|
72
|
+
adapter: AIAdapter;
|
|
73
|
+
/** Configuration */
|
|
74
|
+
config: GenerationConfig;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// =============================================================================
|
|
78
|
+
// AI-GUIDED GENERATOR
|
|
79
|
+
// =============================================================================
|
|
80
|
+
|
|
81
|
+
export class HoloScriptGenerator {
|
|
82
|
+
private parser: HoloScriptPlusParser;
|
|
83
|
+
private currentSession?: GenerationSession;
|
|
84
|
+
private sessionCounter = 0;
|
|
85
|
+
private cache: GenerationCache;
|
|
86
|
+
private analytics: GenerationAnalytics;
|
|
87
|
+
private cacheEnabled: boolean = true;
|
|
88
|
+
|
|
89
|
+
constructor(enableCache: boolean = true) {
|
|
90
|
+
this.parser = new HoloScriptPlusParser({ strict: false });
|
|
91
|
+
this.cache = new GenerationCache();
|
|
92
|
+
this.analytics = new GenerationAnalytics();
|
|
93
|
+
this.cacheEnabled = enableCache;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Create a new generation session
|
|
98
|
+
*/
|
|
99
|
+
createSession(adapter: AIAdapter, config: Partial<GenerationConfig> = {}): GenerationSession {
|
|
100
|
+
const defaultConfig: GenerationConfig = {
|
|
101
|
+
maxAttempts: 3,
|
|
102
|
+
targetPlatform: 'vr',
|
|
103
|
+
autoFix: true,
|
|
104
|
+
minConfidence: 0.7,
|
|
105
|
+
...config,
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const session: GenerationSession = {
|
|
109
|
+
sessionId: `session-${Date.now()}-${++this.sessionCounter}`,
|
|
110
|
+
history: [],
|
|
111
|
+
adapter,
|
|
112
|
+
config: defaultConfig,
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
this.currentSession = session;
|
|
116
|
+
return session;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Generate HoloScript from a natural language prompt
|
|
121
|
+
*/
|
|
122
|
+
async generate(prompt: string, session?: GenerationSession): Promise<GeneratedCode> {
|
|
123
|
+
const s = session || this.currentSession;
|
|
124
|
+
if (!s) {
|
|
125
|
+
throw new Error('No generation session created. Call createSession first.');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Try cache first
|
|
129
|
+
if (this.cacheEnabled) {
|
|
130
|
+
const cachedEntry = this.cache.get(prompt, s.adapter.name);
|
|
131
|
+
if (cachedEntry) {
|
|
132
|
+
// Record cache hit in analytics
|
|
133
|
+
this.analytics.recordMetric({
|
|
134
|
+
promptLength: prompt.length,
|
|
135
|
+
codeLength: cachedEntry.code.length,
|
|
136
|
+
confidence: 1.0, // Cached results are highly confident
|
|
137
|
+
parseSuccess: true,
|
|
138
|
+
errorCount: 0,
|
|
139
|
+
wasFixed: false,
|
|
140
|
+
responseTimeMs: 0,
|
|
141
|
+
attemptsNeeded: 1,
|
|
142
|
+
adapterName: s.adapter.name,
|
|
143
|
+
timestamp: new Date(),
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
const parseResult = this.parser.parse(cachedEntry.code);
|
|
147
|
+
const generated: GeneratedCode = {
|
|
148
|
+
holoScript: cachedEntry.code,
|
|
149
|
+
aiConfidence: 1.0,
|
|
150
|
+
parseResult,
|
|
151
|
+
wasFixed: false,
|
|
152
|
+
attempts: 1,
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// Get explanation
|
|
156
|
+
try {
|
|
157
|
+
if (s.adapter.explainHoloScript) {
|
|
158
|
+
const explanation = await s.adapter.explainHoloScript(generated.holoScript);
|
|
159
|
+
generated.explanation = explanation.explanation;
|
|
160
|
+
}
|
|
161
|
+
} catch {
|
|
162
|
+
// Explanation is optional
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Record in history
|
|
166
|
+
s.history.push({
|
|
167
|
+
prompt,
|
|
168
|
+
generated,
|
|
169
|
+
timestamp: new Date(),
|
|
170
|
+
sessionAttempt: s.history.length + 1,
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
return generated;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
let attempts = 0;
|
|
178
|
+
let lastError: Error | null = null;
|
|
179
|
+
let generated: GeneratedCode | null = null;
|
|
180
|
+
const startTime = performance.now();
|
|
181
|
+
|
|
182
|
+
while (attempts < s.config.maxAttempts) {
|
|
183
|
+
attempts++;
|
|
184
|
+
|
|
185
|
+
try {
|
|
186
|
+
// Generate code via AI
|
|
187
|
+
if (!s.adapter.generateHoloScript) {
|
|
188
|
+
throw new Error(`Adapter "${s.adapter.name}" does not support generateHoloScript`);
|
|
189
|
+
}
|
|
190
|
+
const result = await s.adapter.generateHoloScript(prompt);
|
|
191
|
+
const responseTimeMs = performance.now() - startTime;
|
|
192
|
+
|
|
193
|
+
// Check confidence threshold
|
|
194
|
+
if ((result.confidence ?? 0) < s.config.minConfidence) {
|
|
195
|
+
console.warn(`Generated code has low confidence (${result.confidence}). Retrying...`);
|
|
196
|
+
|
|
197
|
+
this.analytics.recordMetric({
|
|
198
|
+
promptLength: prompt.length,
|
|
199
|
+
codeLength: result.holoScript.length,
|
|
200
|
+
confidence: result.confidence ?? 0,
|
|
201
|
+
parseSuccess: false,
|
|
202
|
+
errorCount: 1,
|
|
203
|
+
wasFixed: false,
|
|
204
|
+
responseTimeMs,
|
|
205
|
+
attemptsNeeded: attempts,
|
|
206
|
+
adapterName: s.adapter.name,
|
|
207
|
+
timestamp: new Date(),
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Parse the generated code
|
|
214
|
+
const parseResult = this.parser.parse(result.holoScript);
|
|
215
|
+
|
|
216
|
+
let holoScript = result.holoScript;
|
|
217
|
+
let wasFixed = false;
|
|
218
|
+
|
|
219
|
+
// Auto-fix if enabled and parsing failed
|
|
220
|
+
if (!parseResult.success && s.config.autoFix && attempts < s.config.maxAttempts) {
|
|
221
|
+
if (!s.adapter.fixHoloScript) {
|
|
222
|
+
throw new Error(`Adapter "${s.adapter.name}" does not support fixHoloScript`);
|
|
223
|
+
}
|
|
224
|
+
const fixResult = await s.adapter.fixHoloScript(
|
|
225
|
+
result.holoScript,
|
|
226
|
+
parseResult.errors.map((e: any) => e.message)
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
const fixedParseResult = this.parser.parse(fixResult.holoScript);
|
|
230
|
+
|
|
231
|
+
// If fixed version is better, use it
|
|
232
|
+
if (
|
|
233
|
+
fixedParseResult.success ||
|
|
234
|
+
fixedParseResult.errors.length < parseResult.errors.length
|
|
235
|
+
) {
|
|
236
|
+
holoScript = fixResult.holoScript;
|
|
237
|
+
wasFixed = true;
|
|
238
|
+
// Re-parse with fixed code
|
|
239
|
+
const reparseResult = this.parser.parse(holoScript);
|
|
240
|
+
generated = {
|
|
241
|
+
holoScript,
|
|
242
|
+
aiConfidence: result.confidence ?? 0,
|
|
243
|
+
parseResult: reparseResult,
|
|
244
|
+
wasFixed,
|
|
245
|
+
attempts,
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
// Cache successful result
|
|
249
|
+
if (this.cacheEnabled && reparseResult.success) {
|
|
250
|
+
this.cache.set(prompt, holoScript, result.confidence ?? 0, s.adapter.name);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// If we got here, use the generated code (even if not fully valid)
|
|
258
|
+
generated = {
|
|
259
|
+
holoScript,
|
|
260
|
+
aiConfidence: result.confidence ?? 0,
|
|
261
|
+
parseResult,
|
|
262
|
+
wasFixed,
|
|
263
|
+
attempts,
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
// Record metrics
|
|
267
|
+
this.analytics.recordMetric({
|
|
268
|
+
promptLength: prompt.length,
|
|
269
|
+
codeLength: holoScript.length,
|
|
270
|
+
confidence: result.confidence ?? 0,
|
|
271
|
+
parseSuccess: parseResult.success,
|
|
272
|
+
errorCount: parseResult.errors.length,
|
|
273
|
+
wasFixed,
|
|
274
|
+
responseTimeMs,
|
|
275
|
+
attemptsNeeded: attempts,
|
|
276
|
+
adapterName: s.adapter.name,
|
|
277
|
+
timestamp: new Date(),
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
// Cache successful results
|
|
281
|
+
if (this.cacheEnabled && parseResult.success) {
|
|
282
|
+
this.cache.set(prompt, holoScript, result.confidence ?? 0, s.adapter.name);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (parseResult.success) {
|
|
286
|
+
break; // Success!
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// If parsing failed and we can't auto-fix, log error and continue
|
|
290
|
+
lastError = new Error(`Parse failed: ${parseResult.errors[0]?.message || 'Unknown error'}`);
|
|
291
|
+
} catch (e) {
|
|
292
|
+
lastError = e instanceof Error ? e : new Error(String(e));
|
|
293
|
+
|
|
294
|
+
this.analytics.recordMetric({
|
|
295
|
+
promptLength: prompt.length,
|
|
296
|
+
codeLength: 0,
|
|
297
|
+
confidence: 0,
|
|
298
|
+
parseSuccess: false,
|
|
299
|
+
errorCount: 1,
|
|
300
|
+
wasFixed: false,
|
|
301
|
+
responseTimeMs: performance.now() - startTime,
|
|
302
|
+
attemptsNeeded: attempts,
|
|
303
|
+
adapterName: s.adapter.name,
|
|
304
|
+
timestamp: new Date(),
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
if (!generated) {
|
|
310
|
+
throw (
|
|
311
|
+
lastError || new Error(`Failed to generate valid HoloScript after ${attempts} attempts`)
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Get explanation
|
|
316
|
+
try {
|
|
317
|
+
if (s.adapter.explainHoloScript) {
|
|
318
|
+
const explanation = await s.adapter.explainHoloScript(generated.holoScript);
|
|
319
|
+
generated.explanation = explanation.explanation;
|
|
320
|
+
}
|
|
321
|
+
} catch {
|
|
322
|
+
// Explanation is optional
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Record in history
|
|
326
|
+
s.history.push({
|
|
327
|
+
prompt,
|
|
328
|
+
generated,
|
|
329
|
+
timestamp: new Date(),
|
|
330
|
+
sessionAttempt: s.history.length + 1,
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
return generated;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Optimize generated code for a target platform
|
|
338
|
+
*/
|
|
339
|
+
async optimize(
|
|
340
|
+
code: string,
|
|
341
|
+
targetPlatform: 'mobile' | 'desktop' | 'vr' | 'ar',
|
|
342
|
+
session?: GenerationSession
|
|
343
|
+
): Promise<GeneratedCode> {
|
|
344
|
+
const s = session || this.currentSession;
|
|
345
|
+
if (!s) {
|
|
346
|
+
throw new Error('No generation session created. Call createSession first.');
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Optimize via AI
|
|
350
|
+
if (!s.adapter.optimizeHoloScript) {
|
|
351
|
+
throw new Error(`Adapter "${s.adapter.name}" does not support optimizeHoloScript`);
|
|
352
|
+
}
|
|
353
|
+
const optimized = await s.adapter.optimizeHoloScript(code, targetPlatform);
|
|
354
|
+
|
|
355
|
+
// Parse optimized code
|
|
356
|
+
const parseResult = this.parser.parse(optimized.holoScript);
|
|
357
|
+
|
|
358
|
+
return {
|
|
359
|
+
holoScript: optimized.holoScript,
|
|
360
|
+
aiConfidence: 0.9, // Optimization is usually reliable
|
|
361
|
+
parseResult,
|
|
362
|
+
wasFixed: false,
|
|
363
|
+
attempts: 1,
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Fix invalid HoloScript code
|
|
369
|
+
*/
|
|
370
|
+
async fix(code: string, session?: GenerationSession): Promise<GeneratedCode> {
|
|
371
|
+
const s = session || this.currentSession;
|
|
372
|
+
if (!s) {
|
|
373
|
+
throw new Error('No generation session created. Call createSession first.');
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Parse current code to find errors
|
|
377
|
+
const parseResult = this.parser.parse(code);
|
|
378
|
+
const errors = parseResult.errors.map((e: any) => e.message);
|
|
379
|
+
|
|
380
|
+
if (errors.length === 0) {
|
|
381
|
+
return {
|
|
382
|
+
holoScript: code,
|
|
383
|
+
aiConfidence: 1.0,
|
|
384
|
+
parseResult,
|
|
385
|
+
wasFixed: false,
|
|
386
|
+
attempts: 1,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Fix via AI
|
|
391
|
+
if (!s.adapter.fixHoloScript) {
|
|
392
|
+
throw new Error(`Adapter "${s.adapter.name}" does not support fixHoloScript`);
|
|
393
|
+
}
|
|
394
|
+
const fixed = await s.adapter.fixHoloScript(code, errors);
|
|
395
|
+
|
|
396
|
+
// Parse fixed code
|
|
397
|
+
const fixedParseResult = this.parser.parse(fixed.holoScript);
|
|
398
|
+
|
|
399
|
+
return {
|
|
400
|
+
holoScript: fixed.holoScript,
|
|
401
|
+
aiConfidence: 0.85,
|
|
402
|
+
parseResult: fixedParseResult,
|
|
403
|
+
wasFixed: true,
|
|
404
|
+
attempts: 1,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Explain generated code
|
|
410
|
+
*/
|
|
411
|
+
async explain(code: string, session?: GenerationSession): Promise<string> {
|
|
412
|
+
const s = session || this.currentSession;
|
|
413
|
+
if (!s) {
|
|
414
|
+
throw new Error('No generation session created. Call createSession first.');
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
if (!s.adapter.explainHoloScript) {
|
|
418
|
+
throw new Error(`Adapter "${s.adapter.name}" does not support explainHoloScript`);
|
|
419
|
+
}
|
|
420
|
+
const result = await s.adapter.explainHoloScript(code);
|
|
421
|
+
return result.explanation;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Multi-turn conversation for iterative code generation
|
|
426
|
+
*/
|
|
427
|
+
async chat(
|
|
428
|
+
message: string,
|
|
429
|
+
session?: GenerationSession,
|
|
430
|
+
history?: Array<{ role: 'user' | 'assistant'; content: string }>
|
|
431
|
+
): Promise<string> {
|
|
432
|
+
const s = session || this.currentSession;
|
|
433
|
+
if (!s) {
|
|
434
|
+
throw new Error('No generation session created. Call createSession first.');
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if (!s.adapter.chat) {
|
|
438
|
+
throw new Error(`Adapter "${s.adapter.name}" does not support chat`);
|
|
439
|
+
}
|
|
440
|
+
return s.adapter.chat(message, '', history);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* Get current generation session
|
|
445
|
+
*/
|
|
446
|
+
getCurrentSession(): GenerationSession | undefined {
|
|
447
|
+
return this.currentSession;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Get generation history
|
|
452
|
+
*/
|
|
453
|
+
getHistory(session?: GenerationSession): GenerationHistory[] {
|
|
454
|
+
const s = session || this.currentSession;
|
|
455
|
+
return s?.history || [];
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Clear history
|
|
460
|
+
*/
|
|
461
|
+
clearHistory(session?: GenerationSession): void {
|
|
462
|
+
const s = session || this.currentSession;
|
|
463
|
+
if (s) {
|
|
464
|
+
s.history = [];
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Get statistics for a session
|
|
470
|
+
*/
|
|
471
|
+
getStats(session?: GenerationSession) {
|
|
472
|
+
const s = session || this.currentSession;
|
|
473
|
+
if (!s) {
|
|
474
|
+
return null;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
const history = s.history;
|
|
478
|
+
const successCount = history.filter((h) => h.generated.parseResult.success).length;
|
|
479
|
+
const fixedCount = history.filter((h) => h.generated.wasFixed).length;
|
|
480
|
+
const avgAttempts =
|
|
481
|
+
history.length > 0
|
|
482
|
+
? history.reduce((sum, h) => sum + h.generated.attempts, 0) / history.length
|
|
483
|
+
: 0;
|
|
484
|
+
const avgConfidence =
|
|
485
|
+
history.length > 0
|
|
486
|
+
? history.reduce((sum, h) => sum + h.generated.aiConfidence, 0) / history.length
|
|
487
|
+
: 0;
|
|
488
|
+
|
|
489
|
+
return {
|
|
490
|
+
totalGenerations: history.length,
|
|
491
|
+
successCount,
|
|
492
|
+
fixedCount,
|
|
493
|
+
avgAttempts,
|
|
494
|
+
avgConfidence,
|
|
495
|
+
successRate: history.length > 0 ? successCount / history.length : 0,
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Get cache statistics
|
|
501
|
+
*/
|
|
502
|
+
getCacheStats() {
|
|
503
|
+
return this.cache.getStats();
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Get analytics metrics
|
|
508
|
+
*/
|
|
509
|
+
getAnalytics() {
|
|
510
|
+
return {
|
|
511
|
+
aggregateMetrics: this.analytics.getAggregateMetrics(),
|
|
512
|
+
adapterMetrics: this.analytics.getAllAdapterMetrics(),
|
|
513
|
+
confidenceDistribution: this.analytics.getConfidenceDistribution(),
|
|
514
|
+
responseTimeDistribution: this.analytics.getResponseTimeDistribution(),
|
|
515
|
+
errorPatterns: this.analytics.getErrorPatterns(),
|
|
516
|
+
recommendations: this.analytics.getRecommendations(),
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* Generate analytics report
|
|
522
|
+
*/
|
|
523
|
+
generateReport() {
|
|
524
|
+
return this.analytics.generateReport();
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// =============================================================================
|
|
529
|
+
// HELPER FUNCTIONS
|
|
530
|
+
// =============================================================================
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
* Quick generation helper
|
|
534
|
+
*/
|
|
535
|
+
export async function generateHoloScript(
|
|
536
|
+
prompt: string,
|
|
537
|
+
adapter: AIAdapter,
|
|
538
|
+
config?: Partial<GenerationConfig>
|
|
539
|
+
): Promise<GeneratedCode> {
|
|
540
|
+
const generator = new HoloScriptGenerator();
|
|
541
|
+
const session = generator.createSession(adapter, config);
|
|
542
|
+
return generator.generate(prompt, session);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* Batch generation helper
|
|
547
|
+
*/
|
|
548
|
+
export async function generateBatch(
|
|
549
|
+
prompts: string[],
|
|
550
|
+
adapter: AIAdapter,
|
|
551
|
+
config?: Partial<GenerationConfig>
|
|
552
|
+
): Promise<GeneratedCode[]> {
|
|
553
|
+
const generator = new HoloScriptGenerator();
|
|
554
|
+
const session = generator.createSession(adapter, config);
|
|
555
|
+
|
|
556
|
+
const results: GeneratedCode[] = [];
|
|
557
|
+
for (const prompt of prompts) {
|
|
558
|
+
results.push(await generator.generate(prompt, session));
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
return results;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* Validate batch of generated code
|
|
566
|
+
*/
|
|
567
|
+
export function validateBatch(
|
|
568
|
+
codes: string[]
|
|
569
|
+
): Array<{ code: string; valid: boolean; errors: number }> {
|
|
570
|
+
const parser = new HoloScriptPlusParser({ strict: false });
|
|
571
|
+
|
|
572
|
+
return codes.map((code) => {
|
|
573
|
+
const result = parser.parse(code);
|
|
574
|
+
return {
|
|
575
|
+
code,
|
|
576
|
+
valid: result.success,
|
|
577
|
+
errors: result.errors.length,
|
|
578
|
+
};
|
|
579
|
+
});
|
|
580
|
+
}
|