@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,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @holoscript/core AI Adapter Interface
|
|
3
|
+
*
|
|
4
|
+
* Provider-agnostic AI integration for HoloScript.
|
|
5
|
+
* Users can implement this interface to integrate any AI service.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { AIAdapter, registerAIAdapter } from '@holoscript/core';
|
|
10
|
+
*
|
|
11
|
+
* // Implement your own adapter
|
|
12
|
+
* class MyOpenAIAdapter implements AIAdapter {
|
|
13
|
+
* async generateHoloScript(prompt: string) {
|
|
14
|
+
* const response = await openai.chat.completions.create({...});
|
|
15
|
+
* return { holoScript: response.choices[0].message.content };
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* // Register it
|
|
20
|
+
* registerAIAdapter(new MyOpenAIAdapter());
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Core AI Adapter Interface
|
|
26
|
+
// ============================================================================
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Result of HoloScript generation from natural language
|
|
30
|
+
*/
|
|
31
|
+
export interface GenerateResult {
|
|
32
|
+
/** Generated HoloScript code */
|
|
33
|
+
holoScript: string;
|
|
34
|
+
/** Confidence score (0-1) */
|
|
35
|
+
confidence?: number;
|
|
36
|
+
/** Estimated object count */
|
|
37
|
+
objectCount?: number;
|
|
38
|
+
/** Any warnings or suggestions */
|
|
39
|
+
warnings?: string[];
|
|
40
|
+
/** Provider-specific metadata */
|
|
41
|
+
metadata?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Result of HoloScript explanation
|
|
46
|
+
*/
|
|
47
|
+
export interface ExplainResult {
|
|
48
|
+
/** Human-readable explanation */
|
|
49
|
+
explanation: string;
|
|
50
|
+
/** Line-by-line breakdown */
|
|
51
|
+
breakdown?: Array<{
|
|
52
|
+
line: number;
|
|
53
|
+
code: string;
|
|
54
|
+
description: string;
|
|
55
|
+
}>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Result of HoloScript optimization
|
|
60
|
+
*/
|
|
61
|
+
export interface OptimizeResult {
|
|
62
|
+
/** Optimized HoloScript code */
|
|
63
|
+
holoScript: string;
|
|
64
|
+
/** What was improved */
|
|
65
|
+
improvements: string[];
|
|
66
|
+
/** Performance metrics comparison */
|
|
67
|
+
metrics?: {
|
|
68
|
+
before: { polygons?: number; nodes?: number };
|
|
69
|
+
after: { polygons?: number; nodes?: number };
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Result of HoloScript validation/fixing
|
|
75
|
+
*/
|
|
76
|
+
export interface FixResult {
|
|
77
|
+
/** Fixed HoloScript code */
|
|
78
|
+
holoScript: string;
|
|
79
|
+
/** Issues that were fixed */
|
|
80
|
+
fixes: Array<{
|
|
81
|
+
line: number;
|
|
82
|
+
issue: string;
|
|
83
|
+
fix: string;
|
|
84
|
+
}>;
|
|
85
|
+
/** Issues that couldn't be fixed automatically */
|
|
86
|
+
remaining?: string[];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Generation options
|
|
91
|
+
*/
|
|
92
|
+
export interface GenerateOptions {
|
|
93
|
+
/** Style hint: modern, classic, minimal, realistic */
|
|
94
|
+
style?: 'modern' | 'classic' | 'minimal' | 'realistic';
|
|
95
|
+
/** Complexity level */
|
|
96
|
+
complexity?: 'low' | 'medium' | 'high';
|
|
97
|
+
/** Include physics simulation */
|
|
98
|
+
includePhysics?: boolean;
|
|
99
|
+
/** Target platform for optimization */
|
|
100
|
+
targetPlatform?: 'mobile' | 'desktop' | 'vr' | 'ar';
|
|
101
|
+
/** Maximum tokens/length */
|
|
102
|
+
maxTokens?: number;
|
|
103
|
+
/** Temperature for generation (0-1) */
|
|
104
|
+
temperature?: number;
|
|
105
|
+
/** Additional context about the world */
|
|
106
|
+
context?: string;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* AI Adapter Interface
|
|
111
|
+
*
|
|
112
|
+
* Implement this interface to integrate any AI provider with HoloScript.
|
|
113
|
+
* All methods are optional - implement only what your provider supports.
|
|
114
|
+
*/
|
|
115
|
+
export interface AIAdapter {
|
|
116
|
+
/** Unique identifier for this adapter */
|
|
117
|
+
readonly id: string;
|
|
118
|
+
|
|
119
|
+
/** Human-readable name */
|
|
120
|
+
readonly name: string;
|
|
121
|
+
|
|
122
|
+
/** Whether the adapter is ready to use */
|
|
123
|
+
isReady(): boolean | Promise<boolean>;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Generate HoloScript from natural language
|
|
127
|
+
* @param prompt User's natural language description
|
|
128
|
+
* @param options Generation options
|
|
129
|
+
*/
|
|
130
|
+
generateHoloScript?(prompt: string, options?: GenerateOptions): Promise<GenerateResult>;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Explain what HoloScript code does
|
|
134
|
+
* @param holoScript The code to explain
|
|
135
|
+
*/
|
|
136
|
+
explainHoloScript?(holoScript: string): Promise<ExplainResult>;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Optimize HoloScript for a target platform
|
|
140
|
+
* @param holoScript The code to optimize
|
|
141
|
+
* @param target Target platform
|
|
142
|
+
*/
|
|
143
|
+
optimizeHoloScript?(
|
|
144
|
+
holoScript: string,
|
|
145
|
+
target: 'mobile' | 'desktop' | 'vr' | 'ar'
|
|
146
|
+
): Promise<OptimizeResult>;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Fix errors in HoloScript code
|
|
150
|
+
* @param holoScript The code to fix
|
|
151
|
+
* @param errors Error messages from parser/validator
|
|
152
|
+
*/
|
|
153
|
+
fixHoloScript?(holoScript: string, errors: string[]): Promise<FixResult>;
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Complete HoloScript code (autocomplete)
|
|
157
|
+
* @param holoScript Partial code
|
|
158
|
+
* @param cursorPosition Position of cursor
|
|
159
|
+
*/
|
|
160
|
+
completeHoloScript?(holoScript: string, cursorPosition: number): Promise<string[]>;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Chat with AI about HoloScript code
|
|
164
|
+
* @param message User message
|
|
165
|
+
* @param holoScript Current code context
|
|
166
|
+
* @param history Previous messages
|
|
167
|
+
*/
|
|
168
|
+
chat?(
|
|
169
|
+
message: string,
|
|
170
|
+
holoScript?: string,
|
|
171
|
+
history?: Array<{ role: 'user' | 'assistant'; content: string }>
|
|
172
|
+
): Promise<string>;
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Get vector embeddings for text
|
|
176
|
+
* @param text Text to embed
|
|
177
|
+
*/
|
|
178
|
+
getEmbeddings?(text: string | string[]): Promise<number[][]>;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// ============================================================================
|
|
182
|
+
// Adapter Registry
|
|
183
|
+
// ============================================================================
|
|
184
|
+
|
|
185
|
+
let _defaultAdapter: AIAdapter | null = null;
|
|
186
|
+
const _adapters = new Map<string, AIAdapter>();
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Register an AI adapter
|
|
190
|
+
* @param adapter The adapter to register
|
|
191
|
+
* @param setAsDefault Whether to set as the default adapter
|
|
192
|
+
*/
|
|
193
|
+
export function registerAIAdapter(adapter: AIAdapter, setAsDefault = false): void {
|
|
194
|
+
_adapters.set(adapter.id, adapter);
|
|
195
|
+
if (setAsDefault || _defaultAdapter === null) {
|
|
196
|
+
_defaultAdapter = adapter;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Get an AI adapter by ID
|
|
202
|
+
* @param id Adapter ID
|
|
203
|
+
*/
|
|
204
|
+
export function getAIAdapter(id: string): AIAdapter | undefined {
|
|
205
|
+
return _adapters.get(id);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Get the default AI adapter
|
|
210
|
+
*/
|
|
211
|
+
export function getDefaultAIAdapter(): AIAdapter | null {
|
|
212
|
+
return _defaultAdapter;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Set the default AI adapter
|
|
217
|
+
* @param id Adapter ID
|
|
218
|
+
*/
|
|
219
|
+
export function setDefaultAIAdapter(id: string): boolean {
|
|
220
|
+
const adapter = _adapters.get(id);
|
|
221
|
+
if (adapter) {
|
|
222
|
+
_defaultAdapter = adapter;
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* List all registered adapters
|
|
230
|
+
*/
|
|
231
|
+
export function listAIAdapters(): Array<{ id: string; name: string }> {
|
|
232
|
+
return Array.from(_adapters.values()).map((a) => ({
|
|
233
|
+
id: a.id,
|
|
234
|
+
name: a.name,
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Unregister an AI adapter
|
|
240
|
+
* @param id Adapter ID
|
|
241
|
+
*/
|
|
242
|
+
export function unregisterAIAdapter(id: string): boolean {
|
|
243
|
+
const deleted = _adapters.delete(id);
|
|
244
|
+
if (deleted && _defaultAdapter?.id === id) {
|
|
245
|
+
const firstAdapter = _adapters.values().next().value;
|
|
246
|
+
_defaultAdapter = firstAdapter ?? null;
|
|
247
|
+
}
|
|
248
|
+
return deleted;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// ============================================================================
|
|
252
|
+
// Convenience Functions (use default adapter)
|
|
253
|
+
// ============================================================================
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Generate HoloScript from natural language using the default adapter
|
|
257
|
+
*/
|
|
258
|
+
export async function generateHoloScript(
|
|
259
|
+
prompt: string,
|
|
260
|
+
options?: GenerateOptions
|
|
261
|
+
): Promise<GenerateResult> {
|
|
262
|
+
if (!_defaultAdapter) {
|
|
263
|
+
throw new Error(
|
|
264
|
+
'No AI adapter registered. Call registerAIAdapter() first or use @holoscript/infinityassistant for Infinity Assistant integration.'
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
if (!_defaultAdapter.generateHoloScript) {
|
|
268
|
+
throw new Error(`AI adapter "${_defaultAdapter.name}" does not support generateHoloScript`);
|
|
269
|
+
}
|
|
270
|
+
return _defaultAdapter.generateHoloScript(prompt, options);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Explain HoloScript code using the default adapter
|
|
275
|
+
*/
|
|
276
|
+
export async function explainHoloScript(holoScript: string): Promise<ExplainResult> {
|
|
277
|
+
if (!_defaultAdapter) {
|
|
278
|
+
throw new Error('No AI adapter registered.');
|
|
279
|
+
}
|
|
280
|
+
if (!_defaultAdapter.explainHoloScript) {
|
|
281
|
+
throw new Error(`AI adapter "${_defaultAdapter.name}" does not support explainHoloScript`);
|
|
282
|
+
}
|
|
283
|
+
return _defaultAdapter.explainHoloScript(holoScript);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Optimize HoloScript using the default adapter
|
|
288
|
+
*/
|
|
289
|
+
export async function optimizeHoloScript(
|
|
290
|
+
holoScript: string,
|
|
291
|
+
target: 'mobile' | 'desktop' | 'vr' | 'ar'
|
|
292
|
+
): Promise<OptimizeResult> {
|
|
293
|
+
if (!_defaultAdapter) {
|
|
294
|
+
throw new Error('No AI adapter registered.');
|
|
295
|
+
}
|
|
296
|
+
if (!_defaultAdapter.optimizeHoloScript) {
|
|
297
|
+
throw new Error(`AI adapter "${_defaultAdapter.name}" does not support optimizeHoloScript`);
|
|
298
|
+
}
|
|
299
|
+
return _defaultAdapter.optimizeHoloScript(holoScript, target);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Fix HoloScript errors using the default adapter
|
|
304
|
+
*/
|
|
305
|
+
export async function fixHoloScript(holoScript: string, errors: string[]): Promise<FixResult> {
|
|
306
|
+
if (!_defaultAdapter) {
|
|
307
|
+
throw new Error('No AI adapter registered.');
|
|
308
|
+
}
|
|
309
|
+
if (!_defaultAdapter.fixHoloScript) {
|
|
310
|
+
throw new Error(`AI adapter "${_defaultAdapter.name}" does not support fixHoloScript`);
|
|
311
|
+
}
|
|
312
|
+
return _defaultAdapter.fixHoloScript(holoScript, errors);
|
|
313
|
+
}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AICopilot.ts
|
|
3
|
+
*
|
|
4
|
+
* Editor-aware AI assistant that bridges the existing AIAdapter/HoloScriptGenerator
|
|
5
|
+
* infrastructure with the runtime and editor for real-time AI assistance.
|
|
6
|
+
*
|
|
7
|
+
* @module ai
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { AIAdapter, GenerateOptions, GenerateResult } from './AIAdapter';
|
|
11
|
+
import { HoloScriptGenerator, GeneratedCode } from './HoloScriptGenerator';
|
|
12
|
+
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// TYPES
|
|
15
|
+
// =============================================================================
|
|
16
|
+
|
|
17
|
+
export interface CopilotContext {
|
|
18
|
+
/** Currently selected entity type/id */
|
|
19
|
+
selectedEntity?: { id: string; type: string; properties?: Record<string, unknown> };
|
|
20
|
+
/** Current scene node types */
|
|
21
|
+
sceneNodeTypes?: string[];
|
|
22
|
+
/** Active state keys */
|
|
23
|
+
stateKeys?: string[];
|
|
24
|
+
/** Recent user actions */
|
|
25
|
+
recentActions?: string[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface CopilotSuggestion {
|
|
29
|
+
type: 'modify' | 'create' | 'explain' | 'fix';
|
|
30
|
+
description: string;
|
|
31
|
+
holoScript?: string;
|
|
32
|
+
confidence: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface CopilotResponse {
|
|
36
|
+
text: string;
|
|
37
|
+
suggestions: CopilotSuggestion[];
|
|
38
|
+
generatedCode?: GeneratedCode;
|
|
39
|
+
error?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface CopilotMessage {
|
|
43
|
+
role: 'user' | 'assistant';
|
|
44
|
+
content: string;
|
|
45
|
+
timestamp: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// =============================================================================
|
|
49
|
+
// AI COPILOT
|
|
50
|
+
// =============================================================================
|
|
51
|
+
|
|
52
|
+
export class AICopilot {
|
|
53
|
+
private adapter: AIAdapter | null = null;
|
|
54
|
+
private generator: HoloScriptGenerator;
|
|
55
|
+
private history: CopilotMessage[] = [];
|
|
56
|
+
private context: CopilotContext = {};
|
|
57
|
+
|
|
58
|
+
constructor(adapter?: AIAdapter) {
|
|
59
|
+
this.generator = new HoloScriptGenerator();
|
|
60
|
+
if (adapter) {
|
|
61
|
+
this.setAdapter(adapter);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Adapter Management
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
|
|
69
|
+
setAdapter(adapter: AIAdapter): void {
|
|
70
|
+
this.adapter = adapter;
|
|
71
|
+
this.generator.createSession(adapter);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
getAdapter(): AIAdapter | null {
|
|
75
|
+
return this.adapter;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
isReady(): boolean {
|
|
79
|
+
return this.adapter !== null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Context Management
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
|
|
86
|
+
updateContext(context: Partial<CopilotContext>): void {
|
|
87
|
+
this.context = { ...this.context, ...context };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
getContext(): CopilotContext {
|
|
91
|
+
return { ...this.context };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// Core Operations
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Generate HoloScript from a natural language prompt.
|
|
100
|
+
* Uses the full HoloScriptGenerator pipeline (generate → validate → auto-fix).
|
|
101
|
+
*/
|
|
102
|
+
async generateFromPrompt(
|
|
103
|
+
prompt: string,
|
|
104
|
+
options?: Partial<GenerateOptions>
|
|
105
|
+
): Promise<CopilotResponse> {
|
|
106
|
+
const adapter = this.adapter;
|
|
107
|
+
if (!adapter) {
|
|
108
|
+
return {
|
|
109
|
+
text: 'No AI adapter configured. Please set an adapter first.',
|
|
110
|
+
suggestions: [],
|
|
111
|
+
error: 'NO_ADAPTER',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (!adapter.generateHoloScript) {
|
|
115
|
+
return {
|
|
116
|
+
text: 'Adapter does not support generateHoloScript.',
|
|
117
|
+
suggestions: [],
|
|
118
|
+
error: 'UNSUPPORTED',
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
this.addMessage('user', prompt);
|
|
123
|
+
|
|
124
|
+
try {
|
|
125
|
+
const result = await adapter.generateHoloScript(prompt, {
|
|
126
|
+
targetPlatform: 'vr',
|
|
127
|
+
includePhysics: true,
|
|
128
|
+
...options,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const response: CopilotResponse = {
|
|
132
|
+
text: `Generated HoloScript with ${result.objectCount || 'unknown'} objects (confidence: ${((result.confidence || 0) * 100).toFixed(0)}%).`,
|
|
133
|
+
suggestions: [
|
|
134
|
+
{
|
|
135
|
+
type: 'create',
|
|
136
|
+
description: `Create scene from: "${prompt}"`,
|
|
137
|
+
holoScript: result.holoScript,
|
|
138
|
+
confidence: result.confidence || 0,
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
if (result.warnings?.length) {
|
|
144
|
+
response.text += ` Warnings: ${result.warnings.join(', ')}`;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
this.addMessage('assistant', response.text);
|
|
148
|
+
return response;
|
|
149
|
+
} catch (error) {
|
|
150
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
151
|
+
this.addMessage('assistant', `Error: ${errorMsg}`);
|
|
152
|
+
return {
|
|
153
|
+
text: `Generation failed: ${errorMsg}`,
|
|
154
|
+
suggestions: [],
|
|
155
|
+
error: errorMsg,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Suggest modifications for the currently selected entity.
|
|
162
|
+
*/
|
|
163
|
+
async suggestFromSelection(): Promise<CopilotResponse> {
|
|
164
|
+
const adapter = this.adapter;
|
|
165
|
+
if (!adapter) {
|
|
166
|
+
return { text: 'No adapter configured.', suggestions: [], error: 'NO_ADAPTER' };
|
|
167
|
+
}
|
|
168
|
+
if (!adapter.generateHoloScript) {
|
|
169
|
+
return {
|
|
170
|
+
text: 'Adapter does not support generateHoloScript.',
|
|
171
|
+
suggestions: [],
|
|
172
|
+
error: 'UNSUPPORTED',
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const entity = this.context.selectedEntity;
|
|
177
|
+
if (!entity) {
|
|
178
|
+
return {
|
|
179
|
+
text: 'No entity selected. Select an entity in the editor first.',
|
|
180
|
+
suggestions: [],
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const prompt = `Suggest improvements for a ${entity.type} entity with properties: ${JSON.stringify(entity.properties || {})}`;
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
const result = await adapter.generateHoloScript(prompt, {
|
|
188
|
+
style: 'modern',
|
|
189
|
+
complexity: 'medium',
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
text: `Suggestions for ${entity.type} (${entity.id}):`,
|
|
194
|
+
suggestions: [
|
|
195
|
+
{
|
|
196
|
+
type: 'modify',
|
|
197
|
+
description: `Enhance ${entity.type} with AI suggestions`,
|
|
198
|
+
holoScript: result.holoScript,
|
|
199
|
+
confidence: result.confidence || 0,
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
};
|
|
203
|
+
} catch (error) {
|
|
204
|
+
return {
|
|
205
|
+
text: `Suggestion failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
206
|
+
suggestions: [],
|
|
207
|
+
error: String(error),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Explain the current scene in natural language.
|
|
214
|
+
*/
|
|
215
|
+
async explainScene(sceneCode: string): Promise<CopilotResponse> {
|
|
216
|
+
const adapter = this.adapter;
|
|
217
|
+
if (!adapter) {
|
|
218
|
+
return { text: 'No adapter configured.', suggestions: [], error: 'NO_ADAPTER' };
|
|
219
|
+
}
|
|
220
|
+
if (!adapter.explainHoloScript) {
|
|
221
|
+
return {
|
|
222
|
+
text: 'Adapter does not support explainHoloScript.',
|
|
223
|
+
suggestions: [],
|
|
224
|
+
error: 'UNSUPPORTED',
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
try {
|
|
229
|
+
const result = await adapter.explainHoloScript(sceneCode);
|
|
230
|
+
return {
|
|
231
|
+
text: result.explanation,
|
|
232
|
+
suggestions: [],
|
|
233
|
+
};
|
|
234
|
+
} catch (error) {
|
|
235
|
+
return {
|
|
236
|
+
text: `Explanation failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
237
|
+
suggestions: [],
|
|
238
|
+
error: String(error),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Auto-fix runtime errors using the AI adapter.
|
|
245
|
+
*/
|
|
246
|
+
async autoFix(code: string, errors: string[]): Promise<CopilotResponse> {
|
|
247
|
+
const adapter = this.adapter;
|
|
248
|
+
if (!adapter) {
|
|
249
|
+
return { text: 'No adapter configured.', suggestions: [], error: 'NO_ADAPTER' };
|
|
250
|
+
}
|
|
251
|
+
if (!adapter.fixHoloScript) {
|
|
252
|
+
return {
|
|
253
|
+
text: 'Adapter does not support fixHoloScript.',
|
|
254
|
+
suggestions: [],
|
|
255
|
+
error: 'UNSUPPORTED',
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
try {
|
|
260
|
+
const result = await adapter.fixHoloScript(code, errors);
|
|
261
|
+
return {
|
|
262
|
+
text: `Fixed ${result.fixes.length} issue(s).`,
|
|
263
|
+
suggestions: result.fixes.map((fix) => ({
|
|
264
|
+
type: 'fix' as const,
|
|
265
|
+
description: `Line ${fix.line}: ${fix.issue} → ${fix.fix}`,
|
|
266
|
+
holoScript: result.holoScript,
|
|
267
|
+
confidence: 0.8,
|
|
268
|
+
})),
|
|
269
|
+
};
|
|
270
|
+
} catch (error) {
|
|
271
|
+
return {
|
|
272
|
+
text: `Auto-fix failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
273
|
+
suggestions: [],
|
|
274
|
+
error: String(error),
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Chat with the AI about HoloScript code (multi-turn conversation).
|
|
281
|
+
*/
|
|
282
|
+
async chat(message: string): Promise<CopilotResponse> {
|
|
283
|
+
const adapter = this.adapter;
|
|
284
|
+
if (!adapter) {
|
|
285
|
+
return { text: 'No adapter configured.', suggestions: [], error: 'NO_ADAPTER' };
|
|
286
|
+
}
|
|
287
|
+
if (!adapter.chat) {
|
|
288
|
+
return { text: 'Adapter does not support chat.', suggestions: [], error: 'UNSUPPORTED' };
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
this.addMessage('user', message);
|
|
292
|
+
|
|
293
|
+
try {
|
|
294
|
+
const chatHistory = this.history.map((m) => ({
|
|
295
|
+
role: m.role,
|
|
296
|
+
content: m.content,
|
|
297
|
+
}));
|
|
298
|
+
|
|
299
|
+
const response = await adapter.chat(message, undefined, chatHistory);
|
|
300
|
+
this.addMessage('assistant', response);
|
|
301
|
+
|
|
302
|
+
return {
|
|
303
|
+
text: response,
|
|
304
|
+
suggestions: [],
|
|
305
|
+
};
|
|
306
|
+
} catch (error) {
|
|
307
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
308
|
+
return {
|
|
309
|
+
text: `Chat failed: ${errorMsg}`,
|
|
310
|
+
suggestions: [],
|
|
311
|
+
error: errorMsg,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// ---------------------------------------------------------------------------
|
|
317
|
+
// History Management
|
|
318
|
+
// ---------------------------------------------------------------------------
|
|
319
|
+
|
|
320
|
+
getHistory(): CopilotMessage[] {
|
|
321
|
+
return [...this.history];
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
clearHistory(): void {
|
|
325
|
+
this.history = [];
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
private addMessage(role: 'user' | 'assistant', content: string): void {
|
|
329
|
+
this.history.push({ role, content, timestamp: Date.now() });
|
|
330
|
+
}
|
|
331
|
+
}
|