@vib3code/sdk 2.0.1
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/CHANGELOG.md +118 -0
- package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +34 -0
- package/DOCS/CI_TESTING.md +38 -0
- package/DOCS/CLI_ONBOARDING.md +75 -0
- package/DOCS/CONTROL_REFERENCE.md +64 -0
- package/DOCS/DEV_TRACK_ANALYSIS.md +77 -0
- package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +42 -0
- package/DOCS/DEV_TRACK_SESSION_2026-01-31.md +220 -0
- package/DOCS/ENV_SETUP.md +189 -0
- package/DOCS/EXPORT_FORMATS.md +417 -0
- package/DOCS/GPU_DISPOSAL_GUIDE.md +21 -0
- package/DOCS/LICENSING_TIERS.md +275 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +570 -0
- package/DOCS/OBS_SETUP_GUIDE.md +98 -0
- package/DOCS/PROJECT_SETUP.md +66 -0
- package/DOCS/RENDERER_LIFECYCLE.md +40 -0
- package/DOCS/REPO_MANIFEST.md +121 -0
- package/DOCS/SESSION_014_PLAN.md +195 -0
- package/DOCS/SESSION_LOG_2026-01-07.md +56 -0
- package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +72 -0
- package/DOCS/SYSTEM_AUDIT_2026-01-30.md +738 -0
- package/DOCS/SYSTEM_INVENTORY.md +520 -0
- package/DOCS/TELEMETRY_EXPORTS.md +34 -0
- package/DOCS/WEBGPU_STATUS.md +38 -0
- package/DOCS/XR_BENCHMARKS.md +608 -0
- package/LICENSE +21 -0
- package/README.md +426 -0
- package/docs/.nojekyll +0 -0
- package/docs/01-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/02-hyperspatial_ego_death.html +346 -0
- package/docs/03-post_cartesian_sublime.html +346 -0
- package/docs/04-crystalline_void_meditation.html +346 -0
- package/docs/05-quantum_decoherence_ballet.html +346 -0
- package/docs/06-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/07-hyperspatial_ego_death.html +346 -0
- package/docs/08-post_cartesian_sublime.html +346 -0
- package/docs/09-crystalline_void_meditation.html +346 -0
- package/docs/10-quantum_decoherence_ballet.html +346 -0
- package/docs/11-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/12-hyperspatial_ego_death.html +346 -0
- package/docs/13-post_cartesian_sublime.html +346 -0
- package/docs/index.html +794 -0
- package/docs/test-hub.html +441 -0
- package/docs/url-state.js +102 -0
- package/docs/vib3-exports/01-quantum-quantum-tetrahedron-lattice.html +489 -0
- package/docs/vib3-exports/02-quantum-quantum-hypersphere-matrix.html +489 -0
- package/docs/vib3-exports/03-quantum-quantum-hypertetra-fractal.html +489 -0
- package/docs/vib3-exports/04-faceted-faceted-crystal-structure.html +407 -0
- package/docs/vib3-exports/05-faceted-faceted-klein-bottle.html +407 -0
- package/docs/vib3-exports/06-faceted-faceted-hypertetra-torus.html +407 -0
- package/docs/vib3-exports/07-holographic-holographic-wave-field.html +457 -0
- package/docs/vib3-exports/08-holographic-holographic-hypersphere-sphere.html +457 -0
- package/docs/vib3-exports/09-holographic-holographic-hypertetra-crystal.html +457 -0
- package/docs/vib3-exports/index.html +238 -0
- package/docs/webgpu-live.html +702 -0
- package/package.json +367 -0
- package/src/advanced/AIPresetGenerator.js +777 -0
- package/src/advanced/MIDIController.js +703 -0
- package/src/advanced/OffscreenWorker.js +1051 -0
- package/src/advanced/WebGPUCompute.js +1051 -0
- package/src/advanced/WebXRRenderer.js +680 -0
- package/src/agent/cli/AgentCLI.js +615 -0
- package/src/agent/cli/index.js +14 -0
- package/src/agent/index.js +73 -0
- package/src/agent/mcp/MCPServer.js +950 -0
- package/src/agent/mcp/index.js +9 -0
- package/src/agent/mcp/tools.js +548 -0
- package/src/agent/telemetry/EventStream.js +669 -0
- package/src/agent/telemetry/Instrumentation.js +618 -0
- package/src/agent/telemetry/TelemetryExporters.js +427 -0
- package/src/agent/telemetry/TelemetryService.js +464 -0
- package/src/agent/telemetry/index.js +52 -0
- package/src/benchmarks/BenchmarkRunner.js +381 -0
- package/src/benchmarks/MetricsCollector.js +299 -0
- package/src/benchmarks/index.js +9 -0
- package/src/benchmarks/scenes.js +259 -0
- package/src/cli/index.js +675 -0
- package/src/config/ApiConfig.js +88 -0
- package/src/core/CanvasManager.js +217 -0
- package/src/core/ErrorReporter.js +117 -0
- package/src/core/ParameterMapper.js +333 -0
- package/src/core/Parameters.js +396 -0
- package/src/core/RendererContracts.js +200 -0
- package/src/core/UnifiedResourceManager.js +370 -0
- package/src/core/VIB3Engine.js +636 -0
- package/src/core/renderers/FacetedRendererAdapter.js +32 -0
- package/src/core/renderers/HolographicRendererAdapter.js +29 -0
- package/src/core/renderers/QuantumRendererAdapter.js +29 -0
- package/src/core/renderers/RendererLifecycleManager.js +63 -0
- package/src/creative/ColorPresetsSystem.js +980 -0
- package/src/creative/ParameterTimeline.js +1061 -0
- package/src/creative/PostProcessingPipeline.js +1113 -0
- package/src/creative/TransitionAnimator.js +683 -0
- package/src/export/CSSExporter.js +226 -0
- package/src/export/CardGeneratorBase.js +279 -0
- package/src/export/ExportManager.js +580 -0
- package/src/export/FacetedCardGenerator.js +279 -0
- package/src/export/HolographicCardGenerator.js +543 -0
- package/src/export/LottieExporter.js +552 -0
- package/src/export/QuantumCardGenerator.js +315 -0
- package/src/export/SVGExporter.js +519 -0
- package/src/export/ShaderExporter.js +903 -0
- package/src/export/TradingCardGenerator.js +3055 -0
- package/src/export/TradingCardManager.js +181 -0
- package/src/export/VIB3PackageExporter.js +559 -0
- package/src/export/index.js +14 -0
- package/src/export/systems/TradingCardSystemFaceted.js +494 -0
- package/src/export/systems/TradingCardSystemHolographic.js +452 -0
- package/src/export/systems/TradingCardSystemQuantum.js +411 -0
- package/src/faceted/FacetedSystem.js +963 -0
- package/src/features/CollectionManager.js +433 -0
- package/src/gallery/CollectionManager.js +240 -0
- package/src/gallery/GallerySystem.js +485 -0
- package/src/geometry/GeometryFactory.js +314 -0
- package/src/geometry/GeometryLibrary.js +72 -0
- package/src/geometry/buffers/BufferBuilder.js +338 -0
- package/src/geometry/buffers/index.js +18 -0
- package/src/geometry/generators/Crystal.js +420 -0
- package/src/geometry/generators/Fractal.js +298 -0
- package/src/geometry/generators/KleinBottle.js +197 -0
- package/src/geometry/generators/Sphere.js +192 -0
- package/src/geometry/generators/Tesseract.js +160 -0
- package/src/geometry/generators/Tetrahedron.js +225 -0
- package/src/geometry/generators/Torus.js +304 -0
- package/src/geometry/generators/Wave.js +341 -0
- package/src/geometry/index.js +142 -0
- package/src/geometry/warp/HypersphereCore.js +211 -0
- package/src/geometry/warp/HypertetraCore.js +386 -0
- package/src/geometry/warp/index.js +57 -0
- package/src/holograms/HolographicVisualizer.js +1073 -0
- package/src/holograms/RealHolographicSystem.js +966 -0
- package/src/holograms/variantRegistry.js +69 -0
- package/src/integrations/FigmaPlugin.js +854 -0
- package/src/integrations/OBSMode.js +754 -0
- package/src/integrations/ThreeJsPackage.js +660 -0
- package/src/integrations/TouchDesignerExport.js +552 -0
- package/src/integrations/frameworks/Vib3React.js +591 -0
- package/src/integrations/frameworks/Vib3Svelte.js +654 -0
- package/src/integrations/frameworks/Vib3Vue.js +628 -0
- package/src/llm/LLMParameterInterface.js +240 -0
- package/src/llm/LLMParameterUI.js +577 -0
- package/src/math/Mat4x4.js +708 -0
- package/src/math/Projection.js +341 -0
- package/src/math/Rotor4D.js +637 -0
- package/src/math/Vec4.js +476 -0
- package/src/math/constants.js +164 -0
- package/src/math/index.js +68 -0
- package/src/math/projections.js +54 -0
- package/src/math/rotations.js +196 -0
- package/src/quantum/QuantumEngine.js +906 -0
- package/src/quantum/QuantumVisualizer.js +1103 -0
- package/src/reactivity/ReactivityConfig.js +499 -0
- package/src/reactivity/ReactivityManager.js +586 -0
- package/src/reactivity/SpatialInputSystem.js +1783 -0
- package/src/reactivity/index.js +93 -0
- package/src/render/CommandBuffer.js +465 -0
- package/src/render/MultiCanvasBridge.js +340 -0
- package/src/render/RenderCommand.js +514 -0
- package/src/render/RenderResourceRegistry.js +523 -0
- package/src/render/RenderState.js +552 -0
- package/src/render/RenderTarget.js +512 -0
- package/src/render/ShaderLoader.js +253 -0
- package/src/render/ShaderProgram.js +599 -0
- package/src/render/UnifiedRenderBridge.js +496 -0
- package/src/render/backends/WebGLBackend.js +1108 -0
- package/src/render/backends/WebGPUBackend.js +1409 -0
- package/src/render/commands/CommandBufferExecutor.js +607 -0
- package/src/render/commands/RenderCommandBuffer.js +661 -0
- package/src/render/commands/index.js +17 -0
- package/src/render/index.js +367 -0
- package/src/scene/Disposable.js +498 -0
- package/src/scene/MemoryPool.js +618 -0
- package/src/scene/Node4D.js +697 -0
- package/src/scene/ResourceManager.js +599 -0
- package/src/scene/Scene4D.js +540 -0
- package/src/scene/index.js +98 -0
- package/src/schemas/error.schema.json +84 -0
- package/src/schemas/extension.schema.json +88 -0
- package/src/schemas/index.js +214 -0
- package/src/schemas/parameters.schema.json +142 -0
- package/src/schemas/tool-pack.schema.json +44 -0
- package/src/schemas/tool-response.schema.json +127 -0
- package/src/shaders/common/fullscreen.vert.glsl +5 -0
- package/src/shaders/common/fullscreen.vert.wgsl +17 -0
- package/src/shaders/common/geometry24.glsl +65 -0
- package/src/shaders/common/geometry24.wgsl +54 -0
- package/src/shaders/common/rotation4d.glsl +85 -0
- package/src/shaders/common/rotation4d.wgsl +86 -0
- package/src/shaders/common/uniforms.glsl +44 -0
- package/src/shaders/common/uniforms.wgsl +48 -0
- package/src/shaders/faceted/faceted.frag.glsl +129 -0
- package/src/shaders/faceted/faceted.frag.wgsl +164 -0
- package/src/shaders/holographic/holographic.frag.glsl +406 -0
- package/src/shaders/holographic/holographic.frag.wgsl +185 -0
- package/src/shaders/quantum/quantum.frag.glsl +513 -0
- package/src/shaders/quantum/quantum.frag.wgsl +361 -0
- package/src/testing/ParallelTestFramework.js +519 -0
- package/src/testing/__snapshots__/exportFormats.test.js.snap +24 -0
- package/src/testing/exportFormats.test.js +8 -0
- package/src/testing/projections.test.js +14 -0
- package/src/testing/rotations.test.js +37 -0
- package/src/ui/InteractivityMenu.js +516 -0
- package/src/ui/StatusManager.js +96 -0
- package/src/ui/adaptive/renderers/webgpu/BufferLayout.ts +252 -0
- package/src/ui/adaptive/renderers/webgpu/PolytopeInstanceBuffer.ts +144 -0
- package/src/ui/adaptive/renderers/webgpu/TripleBufferedUniform.ts +170 -0
- package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +735 -0
- package/src/ui/adaptive/renderers/webgpu/index.ts +112 -0
- package/src/variations/VariationManager.js +431 -0
- package/src/viewer/AudioReactivity.js +505 -0
- package/src/viewer/CardBending.js +481 -0
- package/src/viewer/GalleryUI.js +832 -0
- package/src/viewer/ReactivityManager.js +590 -0
- package/src/viewer/TradingCardExporter.js +600 -0
- package/src/viewer/ViewerPortal.js +374 -0
- package/src/viewer/index.js +12 -0
- package/src/wasm/WasmLoader.js +296 -0
- package/src/wasm/index.js +132 -0
- package/tools/agentic/mcpTools.js +88 -0
- package/tools/cli/agent-cli.js +92 -0
- package/tools/export/formats.js +24 -0
- package/tools/math/rotation-baseline.mjs +64 -0
- package/tools/shader-sync-verify.js +937 -0
- package/tools/telemetry/manifestPipeline.js +141 -0
- package/tools/telemetry/telemetryEvents.js +35 -0
- package/types/adaptive-sdk.d.ts +185 -0
- package/types/advanced/AIPresetGenerator.d.ts +81 -0
- package/types/advanced/MIDIController.d.ts +100 -0
- package/types/advanced/OffscreenWorker.d.ts +82 -0
- package/types/advanced/WebGPUCompute.d.ts +52 -0
- package/types/advanced/WebXRRenderer.d.ts +77 -0
- package/types/advanced/index.d.ts +46 -0
- package/types/core/ErrorReporter.d.ts +50 -0
- package/types/core/VIB3Engine.d.ts +204 -0
- package/types/creative/ColorPresetsSystem.d.ts +91 -0
- package/types/creative/ParameterTimeline.d.ts +74 -0
- package/types/creative/PostProcessingPipeline.d.ts +109 -0
- package/types/creative/TransitionAnimator.d.ts +71 -0
- package/types/creative/index.d.ts +35 -0
- package/types/integrations/FigmaPlugin.d.ts +46 -0
- package/types/integrations/OBSMode.d.ts +74 -0
- package/types/integrations/ThreeJsPackage.d.ts +62 -0
- package/types/integrations/TouchDesignerExport.d.ts +36 -0
- package/types/integrations/Vib3React.d.ts +74 -0
- package/types/integrations/Vib3Svelte.d.ts +63 -0
- package/types/integrations/Vib3Vue.d.ts +55 -0
- package/types/integrations/index.d.ts +52 -0
- package/types/reactivity/SpatialInputSystem.d.ts +173 -0
- package/types/reactivity/index.d.ts +394 -0
- package/types/render/CommandBuffer.d.ts +169 -0
- package/types/render/RenderCommand.d.ts +312 -0
- package/types/render/RenderState.d.ts +279 -0
- package/types/render/RenderTarget.d.ts +254 -0
- package/types/render/ShaderProgram.d.ts +277 -0
- package/types/render/UnifiedRenderBridge.d.ts +143 -0
- package/types/render/WebGLBackend.d.ts +168 -0
- package/types/render/WebGPUBackend.d.ts +186 -0
- package/types/render/index.d.ts +141 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Parameter Interface for VIB34D
|
|
3
|
+
* Converts natural language descriptions to VIB34D parameters using Gemini Flash 1.5
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export class LLMParameterInterface {
|
|
7
|
+
constructor() {
|
|
8
|
+
// Try Firebase Function first, fallback to direct API
|
|
9
|
+
this.useFirebase = true;
|
|
10
|
+
this.firebaseUrl = 'https://us-central1-vib34d-llm-engine.cloudfunctions.net/generateVIB34DParameters';
|
|
11
|
+
|
|
12
|
+
// Fallback to direct API if Firebase not available
|
|
13
|
+
this.apiKey = localStorage.getItem('vib34d-gemini-api-key') || null;
|
|
14
|
+
this.baseApiUrl = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent';
|
|
15
|
+
this.parameterCallback = null;
|
|
16
|
+
|
|
17
|
+
// Comprehensive system prompt with emotional/visual understanding
|
|
18
|
+
this.systemPrompt = `You are a synesthetic AI that translates human experience into 4-dimensional holographic mathematics.
|
|
19
|
+
|
|
20
|
+
You control a VIB34D system with these parameters:
|
|
21
|
+
- geometry (0-7): Tetrahedron, Hypercube, Sphere, Torus, Klein Bottle, Fractal, Wave, Crystal
|
|
22
|
+
- hue (0-360), intensity (0-1), saturation (0-1)
|
|
23
|
+
- speed (0.1-3), chaos (0-1), morphFactor (0-2), gridDensity (5-100)
|
|
24
|
+
- rot4dXW, rot4dYW, rot4dZW (-6.28 to 6.28)
|
|
25
|
+
|
|
26
|
+
When given a description, use your understanding of:
|
|
27
|
+
- Visual aesthetics and emotional resonance
|
|
28
|
+
- Color theory and psychological associations
|
|
29
|
+
- Movement, rhythm, and temporal dynamics
|
|
30
|
+
- Mathematical beauty and complexity
|
|
31
|
+
- Human perception and synesthesia
|
|
32
|
+
|
|
33
|
+
Create a holographic experience that captures the essence of what they're describing.
|
|
34
|
+
|
|
35
|
+
Think beyond literal interpretation. If someone says "the sound of silence," you might create subtle, barely-there patterns with minimal chaos and low intensity. If they say "cosmic loneliness," you might use vast empty spaces with occasional fractal details.
|
|
36
|
+
|
|
37
|
+
Your goal is to create something that makes them say "YES, that's exactly what I meant, even though I couldn't have described it mathematically."
|
|
38
|
+
|
|
39
|
+
Return only JSON with the parameter names above.`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Initialize with API key from localStorage or prompt user
|
|
44
|
+
*/
|
|
45
|
+
async initialize() {
|
|
46
|
+
// Check localStorage for existing API key
|
|
47
|
+
const storedKey = localStorage.getItem('vib34d-gemini-api-key');
|
|
48
|
+
if (storedKey) {
|
|
49
|
+
this.apiKey = storedKey;
|
|
50
|
+
console.log('🔑 Gemini API key loaded from storage');
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// If no key, will be prompted when first used
|
|
55
|
+
console.log('📝 Gemini API key will be requested on first use');
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Set API key and store it
|
|
61
|
+
*/
|
|
62
|
+
setApiKey(apiKey) {
|
|
63
|
+
this.apiKey = apiKey;
|
|
64
|
+
localStorage.setItem('vib34d-gemini-api-key', apiKey);
|
|
65
|
+
console.log('🔑 Gemini API key saved');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Set callback for parameter updates
|
|
70
|
+
*/
|
|
71
|
+
setParameterCallback(callback) {
|
|
72
|
+
this.parameterCallback = callback;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Generate parameters from natural language description
|
|
77
|
+
*/
|
|
78
|
+
async generateParameters(description) {
|
|
79
|
+
// Try Firebase Function first
|
|
80
|
+
if (this.useFirebase) {
|
|
81
|
+
try {
|
|
82
|
+
console.log('🔥 Trying Firebase Function first...');
|
|
83
|
+
return await this.generateViaFirebase(description);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
console.warn('🔥 Firebase Function failed, falling back to direct API:', error.message);
|
|
86
|
+
this.useFirebase = false; // Disable for this session
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Fallback to direct API
|
|
91
|
+
console.log('🔍 Using direct API approach...');
|
|
92
|
+
console.log('🔍 Checking API key:', this.apiKey ? `${this.apiKey.substring(0, 10)}...` : 'NOT SET');
|
|
93
|
+
const hasValidKey = this.apiKey && this.apiKey.startsWith('AIza') && this.apiKey.length > 30;
|
|
94
|
+
console.log('🔍 API key valid:', hasValidKey);
|
|
95
|
+
|
|
96
|
+
if (hasValidKey) {
|
|
97
|
+
// Try real API first
|
|
98
|
+
try {
|
|
99
|
+
// Try both authentication methods to see which works
|
|
100
|
+
const apiUrl = `${this.baseApiUrl}?key=${this.apiKey}`;
|
|
101
|
+
console.log('🤖 Making API request to:', apiUrl);
|
|
102
|
+
|
|
103
|
+
const response = await fetch(apiUrl, {
|
|
104
|
+
method: 'POST',
|
|
105
|
+
headers: {
|
|
106
|
+
'Content-Type': 'application/json'
|
|
107
|
+
},
|
|
108
|
+
body: JSON.stringify({
|
|
109
|
+
contents: [{
|
|
110
|
+
parts: [{
|
|
111
|
+
text: `${this.systemPrompt}\n\nUser description: "${description}"\n\nGenerate JSON parameters:`
|
|
112
|
+
}]
|
|
113
|
+
}],
|
|
114
|
+
generationConfig: {
|
|
115
|
+
temperature: 0.7,
|
|
116
|
+
maxOutputTokens: 500,
|
|
117
|
+
topP: 0.8,
|
|
118
|
+
topK: 40
|
|
119
|
+
}
|
|
120
|
+
})
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
console.log('🤖 API response status:', response.status);
|
|
124
|
+
console.log('🤖 API response ok:', response.ok);
|
|
125
|
+
|
|
126
|
+
if (response.ok) {
|
|
127
|
+
const data = await response.json();
|
|
128
|
+
console.log('🤖 API response data:', data);
|
|
129
|
+
const generatedText = data.candidates[0].content.parts[0].text;
|
|
130
|
+
|
|
131
|
+
// Extract JSON from response
|
|
132
|
+
const jsonMatch = generatedText.match(/\{[\s\S]*\}/);
|
|
133
|
+
if (jsonMatch) {
|
|
134
|
+
const parameters = JSON.parse(jsonMatch[0]);
|
|
135
|
+
const validated = this.validateParameters(parameters);
|
|
136
|
+
|
|
137
|
+
console.log('🤖 Generated parameters via Gemini API:', validated);
|
|
138
|
+
|
|
139
|
+
if (this.parameterCallback) {
|
|
140
|
+
this.parameterCallback(validated);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return validated;
|
|
144
|
+
}
|
|
145
|
+
} else {
|
|
146
|
+
const errorText = await response.text();
|
|
147
|
+
console.error('🤖 API request failed:', response.status, errorText);
|
|
148
|
+
throw new Error(`API request failed: ${response.status} - ${errorText}`);
|
|
149
|
+
}
|
|
150
|
+
} catch (error) {
|
|
151
|
+
console.error('🤖 API request error:', error);
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// No API key or API failed - just fail properly
|
|
157
|
+
if (!this.apiKey) {
|
|
158
|
+
throw new Error('No API key set. Please enter your Gemini API key to use AI generation.');
|
|
159
|
+
} else {
|
|
160
|
+
throw new Error('API request failed. Please check your API key or network connection.');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Generate parameters via Firebase Function
|
|
166
|
+
*/
|
|
167
|
+
async generateViaFirebase(description) {
|
|
168
|
+
const response = await fetch(this.firebaseUrl, {
|
|
169
|
+
method: 'POST',
|
|
170
|
+
headers: {
|
|
171
|
+
'Content-Type': 'application/json'
|
|
172
|
+
},
|
|
173
|
+
body: JSON.stringify({
|
|
174
|
+
description: description.trim()
|
|
175
|
+
})
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
if (!response.ok) {
|
|
179
|
+
const errorData = await response.json().catch(() => ({}));
|
|
180
|
+
throw new Error(errorData.error || `Firebase Function error: ${response.status}`);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const data = await response.json();
|
|
184
|
+
|
|
185
|
+
if (!data.success || !data.parameters) {
|
|
186
|
+
throw new Error('Invalid response from Firebase Function');
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const parameters = data.parameters;
|
|
190
|
+
|
|
191
|
+
console.log('🔥 Generated parameters via Firebase:', parameters);
|
|
192
|
+
|
|
193
|
+
if (this.parameterCallback) {
|
|
194
|
+
this.parameterCallback(parameters);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return parameters;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Validate and clamp parameters to valid ranges
|
|
202
|
+
*/
|
|
203
|
+
validateParameters(params) {
|
|
204
|
+
const validated = {};
|
|
205
|
+
|
|
206
|
+
// Define parameter ranges
|
|
207
|
+
const ranges = {
|
|
208
|
+
geometry: { min: 0, max: 7, type: 'int' },
|
|
209
|
+
hue: { min: 0, max: 360, type: 'int' },
|
|
210
|
+
intensity: { min: 0, max: 1, type: 'float' },
|
|
211
|
+
saturation: { min: 0, max: 1, type: 'float' },
|
|
212
|
+
speed: { min: 0.1, max: 3, type: 'float' },
|
|
213
|
+
chaos: { min: 0, max: 1, type: 'float' },
|
|
214
|
+
morphFactor: { min: 0, max: 2, type: 'float' },
|
|
215
|
+
gridDensity: { min: 5, max: 100, type: 'int' },
|
|
216
|
+
rot4dXW: { min: -6.28, max: 6.28, type: 'float' },
|
|
217
|
+
rot4dYW: { min: -6.28, max: 6.28, type: 'float' },
|
|
218
|
+
rot4dZW: { min: -6.28, max: 6.28, type: 'float' }
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// Validate each parameter
|
|
222
|
+
Object.entries(ranges).forEach(([param, range]) => {
|
|
223
|
+
if (params.hasOwnProperty(param)) {
|
|
224
|
+
let value = parseFloat(params[param]);
|
|
225
|
+
|
|
226
|
+
// Clamp to range
|
|
227
|
+
value = Math.max(range.min, Math.min(range.max, value));
|
|
228
|
+
|
|
229
|
+
// Convert to int if needed
|
|
230
|
+
if (range.type === 'int') {
|
|
231
|
+
value = Math.round(value);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
validated[param] = value;
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
return validated;
|
|
239
|
+
}
|
|
240
|
+
}
|