@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.
Files changed (258) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +34 -0
  3. package/DOCS/CI_TESTING.md +38 -0
  4. package/DOCS/CLI_ONBOARDING.md +75 -0
  5. package/DOCS/CONTROL_REFERENCE.md +64 -0
  6. package/DOCS/DEV_TRACK_ANALYSIS.md +77 -0
  7. package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +42 -0
  8. package/DOCS/DEV_TRACK_SESSION_2026-01-31.md +220 -0
  9. package/DOCS/ENV_SETUP.md +189 -0
  10. package/DOCS/EXPORT_FORMATS.md +417 -0
  11. package/DOCS/GPU_DISPOSAL_GUIDE.md +21 -0
  12. package/DOCS/LICENSING_TIERS.md +275 -0
  13. package/DOCS/MASTER_PLAN_2026-01-31.md +570 -0
  14. package/DOCS/OBS_SETUP_GUIDE.md +98 -0
  15. package/DOCS/PROJECT_SETUP.md +66 -0
  16. package/DOCS/RENDERER_LIFECYCLE.md +40 -0
  17. package/DOCS/REPO_MANIFEST.md +121 -0
  18. package/DOCS/SESSION_014_PLAN.md +195 -0
  19. package/DOCS/SESSION_LOG_2026-01-07.md +56 -0
  20. package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +72 -0
  21. package/DOCS/SYSTEM_AUDIT_2026-01-30.md +738 -0
  22. package/DOCS/SYSTEM_INVENTORY.md +520 -0
  23. package/DOCS/TELEMETRY_EXPORTS.md +34 -0
  24. package/DOCS/WEBGPU_STATUS.md +38 -0
  25. package/DOCS/XR_BENCHMARKS.md +608 -0
  26. package/LICENSE +21 -0
  27. package/README.md +426 -0
  28. package/docs/.nojekyll +0 -0
  29. package/docs/01-dissolution_of_euclidean_hegemony.html +346 -0
  30. package/docs/02-hyperspatial_ego_death.html +346 -0
  31. package/docs/03-post_cartesian_sublime.html +346 -0
  32. package/docs/04-crystalline_void_meditation.html +346 -0
  33. package/docs/05-quantum_decoherence_ballet.html +346 -0
  34. package/docs/06-dissolution_of_euclidean_hegemony.html +346 -0
  35. package/docs/07-hyperspatial_ego_death.html +346 -0
  36. package/docs/08-post_cartesian_sublime.html +346 -0
  37. package/docs/09-crystalline_void_meditation.html +346 -0
  38. package/docs/10-quantum_decoherence_ballet.html +346 -0
  39. package/docs/11-dissolution_of_euclidean_hegemony.html +346 -0
  40. package/docs/12-hyperspatial_ego_death.html +346 -0
  41. package/docs/13-post_cartesian_sublime.html +346 -0
  42. package/docs/index.html +794 -0
  43. package/docs/test-hub.html +441 -0
  44. package/docs/url-state.js +102 -0
  45. package/docs/vib3-exports/01-quantum-quantum-tetrahedron-lattice.html +489 -0
  46. package/docs/vib3-exports/02-quantum-quantum-hypersphere-matrix.html +489 -0
  47. package/docs/vib3-exports/03-quantum-quantum-hypertetra-fractal.html +489 -0
  48. package/docs/vib3-exports/04-faceted-faceted-crystal-structure.html +407 -0
  49. package/docs/vib3-exports/05-faceted-faceted-klein-bottle.html +407 -0
  50. package/docs/vib3-exports/06-faceted-faceted-hypertetra-torus.html +407 -0
  51. package/docs/vib3-exports/07-holographic-holographic-wave-field.html +457 -0
  52. package/docs/vib3-exports/08-holographic-holographic-hypersphere-sphere.html +457 -0
  53. package/docs/vib3-exports/09-holographic-holographic-hypertetra-crystal.html +457 -0
  54. package/docs/vib3-exports/index.html +238 -0
  55. package/docs/webgpu-live.html +702 -0
  56. package/package.json +367 -0
  57. package/src/advanced/AIPresetGenerator.js +777 -0
  58. package/src/advanced/MIDIController.js +703 -0
  59. package/src/advanced/OffscreenWorker.js +1051 -0
  60. package/src/advanced/WebGPUCompute.js +1051 -0
  61. package/src/advanced/WebXRRenderer.js +680 -0
  62. package/src/agent/cli/AgentCLI.js +615 -0
  63. package/src/agent/cli/index.js +14 -0
  64. package/src/agent/index.js +73 -0
  65. package/src/agent/mcp/MCPServer.js +950 -0
  66. package/src/agent/mcp/index.js +9 -0
  67. package/src/agent/mcp/tools.js +548 -0
  68. package/src/agent/telemetry/EventStream.js +669 -0
  69. package/src/agent/telemetry/Instrumentation.js +618 -0
  70. package/src/agent/telemetry/TelemetryExporters.js +427 -0
  71. package/src/agent/telemetry/TelemetryService.js +464 -0
  72. package/src/agent/telemetry/index.js +52 -0
  73. package/src/benchmarks/BenchmarkRunner.js +381 -0
  74. package/src/benchmarks/MetricsCollector.js +299 -0
  75. package/src/benchmarks/index.js +9 -0
  76. package/src/benchmarks/scenes.js +259 -0
  77. package/src/cli/index.js +675 -0
  78. package/src/config/ApiConfig.js +88 -0
  79. package/src/core/CanvasManager.js +217 -0
  80. package/src/core/ErrorReporter.js +117 -0
  81. package/src/core/ParameterMapper.js +333 -0
  82. package/src/core/Parameters.js +396 -0
  83. package/src/core/RendererContracts.js +200 -0
  84. package/src/core/UnifiedResourceManager.js +370 -0
  85. package/src/core/VIB3Engine.js +636 -0
  86. package/src/core/renderers/FacetedRendererAdapter.js +32 -0
  87. package/src/core/renderers/HolographicRendererAdapter.js +29 -0
  88. package/src/core/renderers/QuantumRendererAdapter.js +29 -0
  89. package/src/core/renderers/RendererLifecycleManager.js +63 -0
  90. package/src/creative/ColorPresetsSystem.js +980 -0
  91. package/src/creative/ParameterTimeline.js +1061 -0
  92. package/src/creative/PostProcessingPipeline.js +1113 -0
  93. package/src/creative/TransitionAnimator.js +683 -0
  94. package/src/export/CSSExporter.js +226 -0
  95. package/src/export/CardGeneratorBase.js +279 -0
  96. package/src/export/ExportManager.js +580 -0
  97. package/src/export/FacetedCardGenerator.js +279 -0
  98. package/src/export/HolographicCardGenerator.js +543 -0
  99. package/src/export/LottieExporter.js +552 -0
  100. package/src/export/QuantumCardGenerator.js +315 -0
  101. package/src/export/SVGExporter.js +519 -0
  102. package/src/export/ShaderExporter.js +903 -0
  103. package/src/export/TradingCardGenerator.js +3055 -0
  104. package/src/export/TradingCardManager.js +181 -0
  105. package/src/export/VIB3PackageExporter.js +559 -0
  106. package/src/export/index.js +14 -0
  107. package/src/export/systems/TradingCardSystemFaceted.js +494 -0
  108. package/src/export/systems/TradingCardSystemHolographic.js +452 -0
  109. package/src/export/systems/TradingCardSystemQuantum.js +411 -0
  110. package/src/faceted/FacetedSystem.js +963 -0
  111. package/src/features/CollectionManager.js +433 -0
  112. package/src/gallery/CollectionManager.js +240 -0
  113. package/src/gallery/GallerySystem.js +485 -0
  114. package/src/geometry/GeometryFactory.js +314 -0
  115. package/src/geometry/GeometryLibrary.js +72 -0
  116. package/src/geometry/buffers/BufferBuilder.js +338 -0
  117. package/src/geometry/buffers/index.js +18 -0
  118. package/src/geometry/generators/Crystal.js +420 -0
  119. package/src/geometry/generators/Fractal.js +298 -0
  120. package/src/geometry/generators/KleinBottle.js +197 -0
  121. package/src/geometry/generators/Sphere.js +192 -0
  122. package/src/geometry/generators/Tesseract.js +160 -0
  123. package/src/geometry/generators/Tetrahedron.js +225 -0
  124. package/src/geometry/generators/Torus.js +304 -0
  125. package/src/geometry/generators/Wave.js +341 -0
  126. package/src/geometry/index.js +142 -0
  127. package/src/geometry/warp/HypersphereCore.js +211 -0
  128. package/src/geometry/warp/HypertetraCore.js +386 -0
  129. package/src/geometry/warp/index.js +57 -0
  130. package/src/holograms/HolographicVisualizer.js +1073 -0
  131. package/src/holograms/RealHolographicSystem.js +966 -0
  132. package/src/holograms/variantRegistry.js +69 -0
  133. package/src/integrations/FigmaPlugin.js +854 -0
  134. package/src/integrations/OBSMode.js +754 -0
  135. package/src/integrations/ThreeJsPackage.js +660 -0
  136. package/src/integrations/TouchDesignerExport.js +552 -0
  137. package/src/integrations/frameworks/Vib3React.js +591 -0
  138. package/src/integrations/frameworks/Vib3Svelte.js +654 -0
  139. package/src/integrations/frameworks/Vib3Vue.js +628 -0
  140. package/src/llm/LLMParameterInterface.js +240 -0
  141. package/src/llm/LLMParameterUI.js +577 -0
  142. package/src/math/Mat4x4.js +708 -0
  143. package/src/math/Projection.js +341 -0
  144. package/src/math/Rotor4D.js +637 -0
  145. package/src/math/Vec4.js +476 -0
  146. package/src/math/constants.js +164 -0
  147. package/src/math/index.js +68 -0
  148. package/src/math/projections.js +54 -0
  149. package/src/math/rotations.js +196 -0
  150. package/src/quantum/QuantumEngine.js +906 -0
  151. package/src/quantum/QuantumVisualizer.js +1103 -0
  152. package/src/reactivity/ReactivityConfig.js +499 -0
  153. package/src/reactivity/ReactivityManager.js +586 -0
  154. package/src/reactivity/SpatialInputSystem.js +1783 -0
  155. package/src/reactivity/index.js +93 -0
  156. package/src/render/CommandBuffer.js +465 -0
  157. package/src/render/MultiCanvasBridge.js +340 -0
  158. package/src/render/RenderCommand.js +514 -0
  159. package/src/render/RenderResourceRegistry.js +523 -0
  160. package/src/render/RenderState.js +552 -0
  161. package/src/render/RenderTarget.js +512 -0
  162. package/src/render/ShaderLoader.js +253 -0
  163. package/src/render/ShaderProgram.js +599 -0
  164. package/src/render/UnifiedRenderBridge.js +496 -0
  165. package/src/render/backends/WebGLBackend.js +1108 -0
  166. package/src/render/backends/WebGPUBackend.js +1409 -0
  167. package/src/render/commands/CommandBufferExecutor.js +607 -0
  168. package/src/render/commands/RenderCommandBuffer.js +661 -0
  169. package/src/render/commands/index.js +17 -0
  170. package/src/render/index.js +367 -0
  171. package/src/scene/Disposable.js +498 -0
  172. package/src/scene/MemoryPool.js +618 -0
  173. package/src/scene/Node4D.js +697 -0
  174. package/src/scene/ResourceManager.js +599 -0
  175. package/src/scene/Scene4D.js +540 -0
  176. package/src/scene/index.js +98 -0
  177. package/src/schemas/error.schema.json +84 -0
  178. package/src/schemas/extension.schema.json +88 -0
  179. package/src/schemas/index.js +214 -0
  180. package/src/schemas/parameters.schema.json +142 -0
  181. package/src/schemas/tool-pack.schema.json +44 -0
  182. package/src/schemas/tool-response.schema.json +127 -0
  183. package/src/shaders/common/fullscreen.vert.glsl +5 -0
  184. package/src/shaders/common/fullscreen.vert.wgsl +17 -0
  185. package/src/shaders/common/geometry24.glsl +65 -0
  186. package/src/shaders/common/geometry24.wgsl +54 -0
  187. package/src/shaders/common/rotation4d.glsl +85 -0
  188. package/src/shaders/common/rotation4d.wgsl +86 -0
  189. package/src/shaders/common/uniforms.glsl +44 -0
  190. package/src/shaders/common/uniforms.wgsl +48 -0
  191. package/src/shaders/faceted/faceted.frag.glsl +129 -0
  192. package/src/shaders/faceted/faceted.frag.wgsl +164 -0
  193. package/src/shaders/holographic/holographic.frag.glsl +406 -0
  194. package/src/shaders/holographic/holographic.frag.wgsl +185 -0
  195. package/src/shaders/quantum/quantum.frag.glsl +513 -0
  196. package/src/shaders/quantum/quantum.frag.wgsl +361 -0
  197. package/src/testing/ParallelTestFramework.js +519 -0
  198. package/src/testing/__snapshots__/exportFormats.test.js.snap +24 -0
  199. package/src/testing/exportFormats.test.js +8 -0
  200. package/src/testing/projections.test.js +14 -0
  201. package/src/testing/rotations.test.js +37 -0
  202. package/src/ui/InteractivityMenu.js +516 -0
  203. package/src/ui/StatusManager.js +96 -0
  204. package/src/ui/adaptive/renderers/webgpu/BufferLayout.ts +252 -0
  205. package/src/ui/adaptive/renderers/webgpu/PolytopeInstanceBuffer.ts +144 -0
  206. package/src/ui/adaptive/renderers/webgpu/TripleBufferedUniform.ts +170 -0
  207. package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +735 -0
  208. package/src/ui/adaptive/renderers/webgpu/index.ts +112 -0
  209. package/src/variations/VariationManager.js +431 -0
  210. package/src/viewer/AudioReactivity.js +505 -0
  211. package/src/viewer/CardBending.js +481 -0
  212. package/src/viewer/GalleryUI.js +832 -0
  213. package/src/viewer/ReactivityManager.js +590 -0
  214. package/src/viewer/TradingCardExporter.js +600 -0
  215. package/src/viewer/ViewerPortal.js +374 -0
  216. package/src/viewer/index.js +12 -0
  217. package/src/wasm/WasmLoader.js +296 -0
  218. package/src/wasm/index.js +132 -0
  219. package/tools/agentic/mcpTools.js +88 -0
  220. package/tools/cli/agent-cli.js +92 -0
  221. package/tools/export/formats.js +24 -0
  222. package/tools/math/rotation-baseline.mjs +64 -0
  223. package/tools/shader-sync-verify.js +937 -0
  224. package/tools/telemetry/manifestPipeline.js +141 -0
  225. package/tools/telemetry/telemetryEvents.js +35 -0
  226. package/types/adaptive-sdk.d.ts +185 -0
  227. package/types/advanced/AIPresetGenerator.d.ts +81 -0
  228. package/types/advanced/MIDIController.d.ts +100 -0
  229. package/types/advanced/OffscreenWorker.d.ts +82 -0
  230. package/types/advanced/WebGPUCompute.d.ts +52 -0
  231. package/types/advanced/WebXRRenderer.d.ts +77 -0
  232. package/types/advanced/index.d.ts +46 -0
  233. package/types/core/ErrorReporter.d.ts +50 -0
  234. package/types/core/VIB3Engine.d.ts +204 -0
  235. package/types/creative/ColorPresetsSystem.d.ts +91 -0
  236. package/types/creative/ParameterTimeline.d.ts +74 -0
  237. package/types/creative/PostProcessingPipeline.d.ts +109 -0
  238. package/types/creative/TransitionAnimator.d.ts +71 -0
  239. package/types/creative/index.d.ts +35 -0
  240. package/types/integrations/FigmaPlugin.d.ts +46 -0
  241. package/types/integrations/OBSMode.d.ts +74 -0
  242. package/types/integrations/ThreeJsPackage.d.ts +62 -0
  243. package/types/integrations/TouchDesignerExport.d.ts +36 -0
  244. package/types/integrations/Vib3React.d.ts +74 -0
  245. package/types/integrations/Vib3Svelte.d.ts +63 -0
  246. package/types/integrations/Vib3Vue.d.ts +55 -0
  247. package/types/integrations/index.d.ts +52 -0
  248. package/types/reactivity/SpatialInputSystem.d.ts +173 -0
  249. package/types/reactivity/index.d.ts +394 -0
  250. package/types/render/CommandBuffer.d.ts +169 -0
  251. package/types/render/RenderCommand.d.ts +312 -0
  252. package/types/render/RenderState.d.ts +279 -0
  253. package/types/render/RenderTarget.d.ts +254 -0
  254. package/types/render/ShaderProgram.d.ts +277 -0
  255. package/types/render/UnifiedRenderBridge.d.ts +143 -0
  256. package/types/render/WebGLBackend.d.ts +168 -0
  257. package/types/render/WebGPUBackend.d.ts +186 -0
  258. package/types/render/index.d.ts +141 -0
@@ -0,0 +1,950 @@
1
+ /**
2
+ * VIB3+ MCP Server
3
+ * Model Context Protocol server for agentic integration
4
+ */
5
+
6
+ import { toolDefinitions, getToolList, validateToolInput } from './tools.js';
7
+ import { schemaRegistry } from '../../schemas/index.js';
8
+ import { telemetry, EventType, withTelemetry } from '../telemetry/index.js';
9
+
10
+ /**
11
+ * Generate unique IDs
12
+ */
13
+ function generateId(prefix = 'scene') {
14
+ return `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).substr(2, 9)}`;
15
+ }
16
+
17
+ /**
18
+ * Geometry metadata lookup
19
+ */
20
+ const BASE_GEOMETRIES = [
21
+ { name: 'tetrahedron', vertices: 4, edges: 6, faces: 4 },
22
+ { name: 'hypercube', vertices: 16, edges: 32, faces: 24 },
23
+ { name: 'sphere', vertices: 'variable', edges: 'variable', faces: 'variable' },
24
+ { name: 'torus', vertices: 'variable', edges: 'variable', faces: 'variable' },
25
+ { name: 'klein_bottle', vertices: 'variable', edges: 'variable', faces: 'variable' },
26
+ { name: 'fractal', vertices: 'variable', edges: 'variable', faces: 'variable' },
27
+ { name: 'wave', vertices: 'variable', edges: 'variable', faces: 'variable' },
28
+ { name: 'crystal', vertices: 8, edges: 12, faces: 6 }
29
+ ];
30
+
31
+ const CORE_TYPES = ['base', 'hypersphere', 'hypertetrahedron'];
32
+
33
+ /**
34
+ * MCP Server implementation
35
+ */
36
+ export class MCPServer {
37
+ constructor(engine = null) {
38
+ this.engine = engine;
39
+ this.sceneId = null;
40
+ this.initialized = false;
41
+ }
42
+
43
+ buildResponse(operation, data, options = {}) {
44
+ const response = {
45
+ success: options.success ?? true,
46
+ operation,
47
+ timestamp: new Date().toISOString(),
48
+ duration_ms: options.duration_ms ?? 0,
49
+ ...data
50
+ };
51
+ return this.validateToolResponse(response);
52
+ }
53
+
54
+ validateToolResponse(response) {
55
+ const validation = schemaRegistry.validate('toolResponse', response);
56
+ if (!validation.valid) {
57
+ telemetry.recordEvent(EventType.TOOL_INVOCATION_ERROR, {
58
+ tool: response.operation,
59
+ error: 'TOOL_RESPONSE_INVALID'
60
+ });
61
+ return {
62
+ ...response,
63
+ validation_errors: validation.errors
64
+ };
65
+ }
66
+ return response;
67
+ }
68
+
69
+ /**
70
+ * Set the VIB3 engine instance
71
+ */
72
+ setEngine(engine) {
73
+ this.engine = engine;
74
+ this.initialized = !!engine;
75
+ }
76
+
77
+ /**
78
+ * Handle MCP tool call
79
+ */
80
+ async handleToolCall(toolName, args = {}) {
81
+ const startTime = performance.now();
82
+
83
+ // Validate input
84
+ const validation = validateToolInput(toolName, args);
85
+ if (!validation.valid) {
86
+ telemetry.recordEvent(EventType.TOOL_INVOCATION_ERROR, {
87
+ tool: toolName,
88
+ error: validation.error.code
89
+ });
90
+ return this.buildResponse(toolName, { error: validation.error }, {
91
+ success: false,
92
+ duration_ms: performance.now() - startTime
93
+ });
94
+ }
95
+
96
+ // Record start
97
+ telemetry.recordEvent(EventType.TOOL_INVOCATION_START, { tool: toolName });
98
+
99
+ try {
100
+ let result;
101
+
102
+ switch (toolName) {
103
+ case 'create_4d_visualization':
104
+ result = await this.createVisualization(args);
105
+ break;
106
+ case 'set_rotation':
107
+ result = this.setRotation(args);
108
+ break;
109
+ case 'set_visual_parameters':
110
+ result = this.setVisualParameters(args);
111
+ break;
112
+ case 'switch_system':
113
+ result = await this.switchSystem(args);
114
+ break;
115
+ case 'change_geometry':
116
+ result = this.changeGeometry(args);
117
+ break;
118
+ case 'get_state':
119
+ result = this.getState();
120
+ break;
121
+ case 'randomize_parameters':
122
+ result = this.randomizeParameters(args);
123
+ break;
124
+ case 'reset_parameters':
125
+ result = this.resetParameters();
126
+ break;
127
+ case 'save_to_gallery':
128
+ result = this.saveToGallery(args);
129
+ break;
130
+ case 'load_from_gallery':
131
+ result = this.loadFromGallery(args);
132
+ break;
133
+ case 'search_geometries':
134
+ result = this.searchGeometries(args);
135
+ break;
136
+ case 'get_parameter_schema':
137
+ result = this.getParameterSchema();
138
+ break;
139
+ case 'get_sdk_context':
140
+ result = this.getSDKContext();
141
+ break;
142
+ case 'verify_knowledge':
143
+ result = this.verifyKnowledge(args);
144
+ break;
145
+ // Reactivity tools (Phase 6.5)
146
+ case 'set_reactivity_config':
147
+ result = this.setReactivityConfig(args);
148
+ break;
149
+ case 'get_reactivity_config':
150
+ result = this.getReactivityConfig();
151
+ break;
152
+ case 'configure_audio_band':
153
+ result = this.configureAudioBand(args);
154
+ break;
155
+ // Export tools (Phase 6.5)
156
+ case 'export_package':
157
+ result = this.exportPackage(args);
158
+ break;
159
+ // Preset tools (Phase 6.6)
160
+ case 'apply_behavior_preset':
161
+ result = this.applyBehaviorPreset(args);
162
+ break;
163
+ case 'list_behavior_presets':
164
+ result = this.listBehaviorPresets();
165
+ break;
166
+ default:
167
+ throw new Error(`Unknown tool: ${toolName}`);
168
+ }
169
+
170
+ // Record success
171
+ const duration = performance.now() - startTime;
172
+ telemetry.recordEvent(EventType.TOOL_INVOCATION_END, {
173
+ tool: toolName,
174
+ duration_ms: duration,
175
+ success: true
176
+ });
177
+
178
+ return this.buildResponse(toolName, result, { duration_ms: duration });
179
+
180
+ } catch (error) {
181
+ const duration = performance.now() - startTime;
182
+ telemetry.recordEvent(EventType.TOOL_INVOCATION_ERROR, {
183
+ tool: toolName,
184
+ duration_ms: duration,
185
+ error: error.message
186
+ });
187
+
188
+ return this.buildResponse(toolName, {
189
+ error: {
190
+ type: 'SystemError',
191
+ code: 'TOOL_EXECUTION_FAILED',
192
+ message: error.message,
193
+ suggestion: 'Check engine initialization and parameters',
194
+ retry_possible: true
195
+ }
196
+ }, { success: false, duration_ms: duration });
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Create a new visualization
202
+ */
203
+ async createVisualization(args) {
204
+ const { system = 'quantum', geometry_index = 0, projection = 'perspective' } = args;
205
+
206
+ if (this.engine) {
207
+ await this.engine.switchSystem(system);
208
+ if (geometry_index !== undefined) {
209
+ this.engine.setParameter('geometry', geometry_index);
210
+ }
211
+ }
212
+
213
+ this.sceneId = generateId('scene_4d');
214
+
215
+ const baseIndex = geometry_index % 8;
216
+ const coreIndex = Math.floor(geometry_index / 8);
217
+
218
+ return {
219
+ scene_id: this.sceneId,
220
+ geometry: {
221
+ index: geometry_index,
222
+ base_type: BASE_GEOMETRIES[baseIndex].name,
223
+ core_type: CORE_TYPES[coreIndex],
224
+ vertex_count: BASE_GEOMETRIES[baseIndex].vertices,
225
+ edge_count: BASE_GEOMETRIES[baseIndex].edges
226
+ },
227
+ system,
228
+ projection,
229
+ render_info: {
230
+ complexity: geometry_index > 15 ? 'high' : geometry_index > 7 ? 'medium' : 'low',
231
+ estimated_fps: 60
232
+ },
233
+ suggested_next_actions: ['set_rotation', 'set_visual_parameters', 'render_preview']
234
+ };
235
+ }
236
+
237
+ /**
238
+ * Set rotation parameters
239
+ */
240
+ setRotation(args) {
241
+ if (this.engine) {
242
+ if (args.XY !== undefined) this.engine.setParameter('rot4dXY', args.XY);
243
+ if (args.XZ !== undefined) this.engine.setParameter('rot4dXZ', args.XZ);
244
+ if (args.YZ !== undefined) this.engine.setParameter('rot4dYZ', args.YZ);
245
+ if (args.XW !== undefined) this.engine.setParameter('rot4dXW', args.XW);
246
+ if (args.YW !== undefined) this.engine.setParameter('rot4dYW', args.YW);
247
+ if (args.ZW !== undefined) this.engine.setParameter('rot4dZW', args.ZW);
248
+
249
+ telemetry.recordEvent(EventType.PARAMETER_CHANGE, { type: 'rotation' });
250
+ }
251
+
252
+ return {
253
+ rotation_state: {
254
+ XY: args.XY ?? 0,
255
+ XZ: args.XZ ?? 0,
256
+ YZ: args.YZ ?? 0,
257
+ XW: args.XW ?? 0,
258
+ YW: args.YW ?? 0,
259
+ ZW: args.ZW ?? 0
260
+ },
261
+ suggested_next_actions: ['set_visual_parameters', 'render_preview']
262
+ };
263
+ }
264
+
265
+ /**
266
+ * Set visual parameters
267
+ */
268
+ setVisualParameters(args) {
269
+ if (this.engine) {
270
+ for (const [key, value] of Object.entries(args)) {
271
+ this.engine.setParameter(key, value);
272
+ }
273
+ telemetry.recordEvent(EventType.PARAMETER_BATCH_CHANGE, {
274
+ count: Object.keys(args).length
275
+ });
276
+ }
277
+
278
+ return {
279
+ parameters_updated: Object.keys(args),
280
+ suggested_next_actions: ['render_preview', 'save_to_gallery']
281
+ };
282
+ }
283
+
284
+ /**
285
+ * Switch visualization system
286
+ */
287
+ async switchSystem(args) {
288
+ const { system } = args;
289
+
290
+ if (this.engine) {
291
+ await this.engine.switchSystem(system);
292
+ telemetry.recordEvent(EventType.SYSTEM_SWITCH, { system });
293
+ }
294
+
295
+ return {
296
+ active_system: system,
297
+ available_geometries: 24,
298
+ suggested_next_actions: ['change_geometry', 'set_visual_parameters']
299
+ };
300
+ }
301
+
302
+ /**
303
+ * Change geometry
304
+ */
305
+ changeGeometry(args) {
306
+ let geometryIndex = args.geometry_index;
307
+
308
+ // Convert from base_type + core_type if provided
309
+ if (args.base_type !== undefined) {
310
+ const baseIndex = BASE_GEOMETRIES.findIndex(g => g.name === args.base_type);
311
+ if (baseIndex === -1) {
312
+ return {
313
+ error: {
314
+ type: 'ValidationError',
315
+ code: 'INVALID_BASE_TYPE',
316
+ message: `Unknown base type: ${args.base_type}`,
317
+ valid_options: BASE_GEOMETRIES.map(g => g.name),
318
+ suggestion: 'Use one of the valid base geometry types'
319
+ }
320
+ };
321
+ }
322
+
323
+ const coreIndex = CORE_TYPES.indexOf(args.core_type || 'base');
324
+ geometryIndex = coreIndex * 8 + baseIndex;
325
+ }
326
+
327
+ if (this.engine && geometryIndex !== undefined) {
328
+ this.engine.setParameter('geometry', geometryIndex);
329
+ telemetry.recordEvent(EventType.GEOMETRY_CHANGE, { geometry: geometryIndex });
330
+ }
331
+
332
+ const baseIndex = geometryIndex % 8;
333
+ const coreIndex = Math.floor(geometryIndex / 8);
334
+
335
+ return {
336
+ geometry: {
337
+ index: geometryIndex,
338
+ base_type: BASE_GEOMETRIES[baseIndex].name,
339
+ core_type: CORE_TYPES[coreIndex]
340
+ },
341
+ suggested_next_actions: ['set_rotation', 'set_visual_parameters']
342
+ };
343
+ }
344
+
345
+ /**
346
+ * Get current state
347
+ */
348
+ getState() {
349
+ let params = {};
350
+ let system = 'quantum';
351
+
352
+ if (this.engine) {
353
+ params = this.engine.getAllParameters();
354
+ system = this.engine.getCurrentSystem();
355
+ }
356
+
357
+ const geometryIndex = params.geometry || 0;
358
+ const baseIndex = geometryIndex % 8;
359
+ const coreIndex = Math.floor(geometryIndex / 8);
360
+
361
+ return {
362
+ scene_id: this.sceneId,
363
+ system,
364
+ geometry: {
365
+ index: geometryIndex,
366
+ base_type: BASE_GEOMETRIES[baseIndex].name,
367
+ core_type: CORE_TYPES[coreIndex]
368
+ },
369
+ rotation_state: {
370
+ XY: params.rot4dXY || 0,
371
+ XZ: params.rot4dXZ || 0,
372
+ YZ: params.rot4dYZ || 0,
373
+ XW: params.rot4dXW || 0,
374
+ YW: params.rot4dYW || 0,
375
+ ZW: params.rot4dZW || 0
376
+ },
377
+ visual: {
378
+ dimension: params.dimension,
379
+ gridDensity: params.gridDensity,
380
+ morphFactor: params.morphFactor,
381
+ chaos: params.chaos,
382
+ speed: params.speed,
383
+ hue: params.hue,
384
+ intensity: params.intensity,
385
+ saturation: params.saturation
386
+ },
387
+ suggested_next_actions: ['set_rotation', 'set_visual_parameters', 'save_to_gallery']
388
+ };
389
+ }
390
+
391
+ /**
392
+ * Randomize parameters
393
+ */
394
+ randomizeParameters(args) {
395
+ if (this.engine) {
396
+ this.engine.randomizeAll();
397
+ telemetry.recordEvent(EventType.PARAMETER_RANDOMIZE, {});
398
+ }
399
+
400
+ return {
401
+ ...this.getState(),
402
+ randomized: true
403
+ };
404
+ }
405
+
406
+ /**
407
+ * Reset parameters
408
+ */
409
+ resetParameters() {
410
+ if (this.engine) {
411
+ this.engine.resetAll();
412
+ telemetry.recordEvent(EventType.PARAMETER_RESET, {});
413
+ }
414
+
415
+ return {
416
+ ...this.getState(),
417
+ reset: true
418
+ };
419
+ }
420
+
421
+ /**
422
+ * Save to gallery
423
+ */
424
+ saveToGallery(args) {
425
+ const { slot, name } = args;
426
+
427
+ telemetry.recordEvent(EventType.GALLERY_SAVE, { slot });
428
+
429
+ return {
430
+ slot,
431
+ name: name || `Variation ${slot}`,
432
+ saved_at: new Date().toISOString(),
433
+ suggested_next_actions: ['load_from_gallery', 'randomize_parameters']
434
+ };
435
+ }
436
+
437
+ /**
438
+ * Load from gallery
439
+ */
440
+ loadFromGallery(args) {
441
+ const { slot } = args;
442
+
443
+ if (this.engine) {
444
+ // Apply variation
445
+ const params = this.engine.parameters?.generateVariationParameters?.(slot) || {};
446
+ this.engine.setParameters(params);
447
+ }
448
+
449
+ telemetry.recordEvent(EventType.GALLERY_LOAD, { slot });
450
+
451
+ return {
452
+ slot,
453
+ loaded_at: new Date().toISOString(),
454
+ ...this.getState()
455
+ };
456
+ }
457
+
458
+ /**
459
+ * Search geometries
460
+ */
461
+ searchGeometries(args) {
462
+ const { core_type = 'all' } = args;
463
+
464
+ const geometries = [];
465
+ for (let i = 0; i < 24; i++) {
466
+ const baseIndex = i % 8;
467
+ const coreIndex = Math.floor(i / 8);
468
+ const coreTypeName = CORE_TYPES[coreIndex];
469
+
470
+ if (core_type !== 'all' && coreTypeName !== core_type) continue;
471
+
472
+ geometries.push({
473
+ index: i,
474
+ base_type: BASE_GEOMETRIES[baseIndex].name,
475
+ core_type: coreTypeName,
476
+ vertex_count: BASE_GEOMETRIES[baseIndex].vertices,
477
+ edge_count: BASE_GEOMETRIES[baseIndex].edges,
478
+ description: this.getGeometryDescription(baseIndex, coreIndex)
479
+ });
480
+ }
481
+
482
+ return {
483
+ count: geometries.length,
484
+ geometries,
485
+ encoding_formula: 'geometry_index = core_index * 8 + base_index'
486
+ };
487
+ }
488
+
489
+ /**
490
+ * Get geometry description
491
+ */
492
+ getGeometryDescription(baseIndex, coreIndex) {
493
+ const baseDesc = {
494
+ 0: 'Simple 4-vertex lattice, fundamental polytope',
495
+ 1: '4D cube projection with 16 vertices and 32 edges',
496
+ 2: 'Radial harmonic sphere with smooth surfaces',
497
+ 3: 'Toroidal field with continuous surface',
498
+ 4: 'Non-orientable surface with topological twist',
499
+ 5: 'Recursive subdivision with self-similar structure',
500
+ 6: 'Sinusoidal interference patterns',
501
+ 7: 'Octahedral crystal structure'
502
+ };
503
+
504
+ const coreDesc = {
505
+ 0: 'Pure base geometry',
506
+ 1: 'Wrapped in 4D hypersphere using warpHypersphereCore()',
507
+ 2: 'Wrapped in 4D hypertetrahedron using warpHypertetraCore()'
508
+ };
509
+
510
+ return `${baseDesc[baseIndex]}. ${coreDesc[coreIndex]}`;
511
+ }
512
+
513
+ /**
514
+ * Get parameter schema
515
+ */
516
+ getParameterSchema() {
517
+ return {
518
+ schema: schemaRegistry.getSchema('parameters'),
519
+ usage: 'Validate parameters using this schema before setting them',
520
+ suggested_next_actions: ['set_rotation', 'set_visual_parameters']
521
+ };
522
+ }
523
+
524
+ /**
525
+ * Get SDK context for agent onboarding
526
+ */
527
+ getSDKContext() {
528
+ return {
529
+ sdk_name: 'VIB3+ SDK',
530
+ version: '1.9.0',
531
+ purpose: 'General-purpose 4D rotation visualization SDK for plugins, extensions, wearables, and agentic use',
532
+
533
+ quick_reference: {
534
+ active_visualization_systems: 3,
535
+ placeholder_systems: 1,
536
+ rotation_planes: 6,
537
+ base_geometries: 8,
538
+ core_warp_types: 3,
539
+ total_geometries: 24,
540
+ canvas_layers_per_system: 5
541
+ },
542
+
543
+ systems: {
544
+ ACTIVE: [
545
+ { name: 'quantum', description: 'Complex quantum lattice visualizations with 24 geometries' },
546
+ { name: 'faceted', description: 'Clean 2D geometric patterns with 4D rotation' },
547
+ { name: 'holographic', description: '5-layer audio-reactive holographic effects' }
548
+ ],
549
+ PLACEHOLDER_TBD: [
550
+ { name: 'polychora', status: 'TBD', description: '4D polytopes - placeholder, not production ready' }
551
+ ]
552
+ },
553
+
554
+ geometry_encoding: {
555
+ formula: 'geometry_index = core_index * 8 + base_index',
556
+ base_geometries: ['tetrahedron', 'hypercube', 'sphere', 'torus', 'klein_bottle', 'fractal', 'wave', 'crystal'],
557
+ core_types: ['base (0)', 'hypersphere (1)', 'hypertetrahedron (2)'],
558
+ example: 'geometry 10 = hypersphere(sphere) because 1*8+2=10'
559
+ },
560
+
561
+ rotation_planes: {
562
+ total: 6,
563
+ '3D_space': ['XY', 'XZ', 'YZ'],
564
+ '4D_hyperspace': ['XW', 'YW', 'ZW'],
565
+ range: '-6.28 to 6.28 radians'
566
+ },
567
+
568
+ canvas_layers: {
569
+ count: 5,
570
+ names: ['background', 'shadow', 'content', 'highlight', 'accent']
571
+ },
572
+
573
+ knowledge_quiz: {
574
+ IMPORTANT: 'Call verify_knowledge with multiple choice answers (a/b/c/d) to confirm understanding',
575
+ questions: [
576
+ 'Q1: How many rotation planes? a)3 b)4 c)6 d)8',
577
+ 'Q2: Geometry encoding formula? a)base*3+core b)core*8+base c)base+core d)core*base',
578
+ 'Q3: Canvas layers per system? a)3 b)4 c)5 d)6',
579
+ 'Q4: Which are the 3 ACTIVE systems? a)quantum,faceted,holographic b)quantum,faceted,polychora c)all four d)none',
580
+ 'Q5: How many base geometry types? a)6 b)8 c)10 d)24',
581
+ 'Q6: Core warp types? a)base,sphere,cube b)base,hypersphere,hypertetrahedron c)2D,3D,4D d)none'
582
+ ]
583
+ },
584
+
585
+ documentation: {
586
+ primary: 'DOCS/SYSTEM_INVENTORY.md',
587
+ geometry: '24-GEOMETRY-6D-ROTATION-SUMMARY.md',
588
+ controls: 'DOCS/CONTROL_REFERENCE.md',
589
+ cli: 'DOCS/CLI_ONBOARDING.md'
590
+ },
591
+
592
+ suggested_next_actions: ['verify_knowledge', 'create_4d_visualization', 'search_geometries']
593
+ };
594
+ }
595
+
596
+ /**
597
+ * Verify agent knowledge of SDK (multiple choice)
598
+ */
599
+ verifyKnowledge(answers) {
600
+ const correctAnswers = {
601
+ q1_rotation_planes: 'c', // 6 rotation planes
602
+ q2_geometry_formula: 'b', // core*8+base
603
+ q3_canvas_layers: 'c', // 5 layers
604
+ q4_active_systems: 'a', // quantum, faceted, holographic (polychora is TBD)
605
+ q5_base_geometries: 'b', // 8 base geometries
606
+ q6_core_types: 'b' // base, hypersphere, hypertetrahedron
607
+ };
608
+
609
+ const docReferences = {
610
+ q1_rotation_planes: {
611
+ topic: '6D ROTATION SYSTEM',
612
+ doc: 'DOCS/SYSTEM_INVENTORY.md#the-6d-rotation-system',
613
+ reason: '6 planes: XY, XZ, YZ (3D) + XW, YW, ZW (4D hyperspace)'
614
+ },
615
+ q2_geometry_formula: {
616
+ topic: 'GEOMETRY ENCODING',
617
+ doc: '24-GEOMETRY-6D-ROTATION-SUMMARY.md',
618
+ reason: 'geometry = coreIndex * 8 + baseIndex. Example: 10 = 1*8+2 = hypersphere+sphere'
619
+ },
620
+ q3_canvas_layers: {
621
+ topic: 'CANVAS LAYER SYSTEM',
622
+ doc: 'DOCS/SYSTEM_INVENTORY.md#the-4-visualization-systems',
623
+ reason: '5 layers: background, shadow, content, highlight, accent'
624
+ },
625
+ q4_active_systems: {
626
+ topic: 'ACTIVE VS PLACEHOLDER SYSTEMS',
627
+ doc: 'DOCS/SYSTEM_INVENTORY.md',
628
+ reason: 'Only 3 ACTIVE: quantum, faceted, holographic. Polychora is TBD/placeholder!'
629
+ },
630
+ q5_base_geometries: {
631
+ topic: 'BASE GEOMETRY TYPES',
632
+ doc: '24-GEOMETRY-6D-ROTATION-SUMMARY.md',
633
+ reason: '8 base: tetrahedron, hypercube, sphere, torus, klein, fractal, wave, crystal'
634
+ },
635
+ q6_core_types: {
636
+ topic: 'CORE WARP TYPES',
637
+ doc: '24-GEOMETRY-6D-ROTATION-SUMMARY.md',
638
+ reason: '3 cores: base (no warp), hypersphere, hypertetrahedron'
639
+ }
640
+ };
641
+
642
+ const results = {
643
+ score: 0,
644
+ max_score: 6,
645
+ details: [],
646
+ REVIEW_REQUIRED: []
647
+ };
648
+
649
+ // Check each answer
650
+ for (const [question, correct] of Object.entries(correctAnswers)) {
651
+ const given = answers[question]?.toLowerCase?.() || answers[question];
652
+ if (given === correct) {
653
+ results.score++;
654
+ results.details.push({ question, status: '✓ CORRECT' });
655
+ } else if (given !== undefined) {
656
+ results.details.push({
657
+ question,
658
+ status: '✗ WRONG',
659
+ your_answer: given,
660
+ correct_answer: correct
661
+ });
662
+ results.REVIEW_REQUIRED.push(docReferences[question]);
663
+ }
664
+ }
665
+
666
+ results.percentage = Math.round((results.score / results.max_score) * 100);
667
+
668
+ // Build response
669
+ if (results.REVIEW_REQUIRED.length > 0) {
670
+ results.MESSAGE = `Score: ${results.score}/${results.max_score}. YOU MAY PROCEED but PLEASE review the topics below to avoid errors.`;
671
+ results.URGENT = results.REVIEW_REQUIRED.map(ref => ({
672
+ TOPIC: ref.topic,
673
+ READ: ref.doc,
674
+ WHY: ref.reason
675
+ }));
676
+ } else {
677
+ results.MESSAGE = `PERFECT SCORE! You understand the VIB3+ SDK architecture.`;
678
+ }
679
+
680
+ results.suggested_next_actions = ['create_4d_visualization', 'get_state', 'search_geometries'];
681
+
682
+ return results;
683
+ }
684
+
685
+ /**
686
+ * Get available tools (for progressive disclosure)
687
+ */
688
+ listTools(includeSchemas = false) {
689
+ if (includeSchemas) {
690
+ return getToolList();
691
+ }
692
+
693
+ return Object.keys(toolDefinitions).map(name => ({
694
+ name,
695
+ description: toolDefinitions[name].description
696
+ }));
697
+ }
698
+
699
+ // ===== REACTIVITY HANDLERS (Phase 6.5) =====
700
+
701
+ /**
702
+ * Set reactivity configuration
703
+ */
704
+ setReactivityConfig(args) {
705
+ const { audio, tilt, interaction } = args;
706
+
707
+ // Update via global reactivity manager if available (browser only)
708
+ const isBrowser = typeof window !== 'undefined';
709
+ if (isBrowser && window.reactivityManager) {
710
+ if (audio) {
711
+ if (audio.enabled !== undefined) window.audioEnabled = audio.enabled;
712
+ if (audio.globalSensitivity !== undefined) {
713
+ window.reactivityManager.setAudioSensitivity?.(audio.globalSensitivity);
714
+ }
715
+ }
716
+ if (tilt) {
717
+ if (tilt.enabled !== undefined) window.toggleDeviceTilt?.();
718
+ if (tilt.dramaticMode !== undefined) {
719
+ window.setDramaticMode?.(tilt.dramaticMode);
720
+ }
721
+ }
722
+ if (interaction) {
723
+ if (interaction.mouseMode) window.setMouseMode?.(interaction.mouseMode);
724
+ if (interaction.clickMode) window.setClickMode?.(interaction.clickMode);
725
+ if (interaction.scrollMode) window.setScrollMode?.(interaction.scrollMode);
726
+ }
727
+ }
728
+
729
+ telemetry.recordEvent(EventType.PARAMETER_CHANGE, { type: 'reactivity' });
730
+
731
+ return {
732
+ updated: true,
733
+ config: { audio: audio || {}, tilt: tilt || {}, interaction: interaction || {} },
734
+ suggested_next_actions: ['get_reactivity_config', 'apply_behavior_preset']
735
+ };
736
+ }
737
+
738
+ /**
739
+ * Get current reactivity configuration
740
+ */
741
+ getReactivityConfig() {
742
+ const isBrowser = typeof window !== 'undefined';
743
+ return {
744
+ config: {
745
+ audio: {
746
+ enabled: isBrowser ? (window.audioEnabled || false) : false,
747
+ globalSensitivity: isBrowser ? (window.reactivityManager?.audioSensitivity || 1.0) : 1.0
748
+ },
749
+ tilt: {
750
+ enabled: isBrowser ? (window.deviceTiltHandler?.isEnabled || false) : false,
751
+ dramaticMode: isBrowser ? (window.dramaticMode || false) : false
752
+ },
753
+ interaction: {
754
+ enabled: isBrowser ? (window.interactivityEnabled !== false) : true,
755
+ mouseMode: isBrowser ? (window.currentMouseMode || 'rotation') : 'rotation',
756
+ clickMode: isBrowser ? (window.currentClickMode || 'burst') : 'burst',
757
+ scrollMode: isBrowser ? (window.currentScrollMode || 'cycle') : 'cycle'
758
+ }
759
+ },
760
+ suggested_next_actions: ['set_reactivity_config', 'configure_audio_band', 'apply_behavior_preset']
761
+ };
762
+ }
763
+
764
+ /**
765
+ * Configure a single audio band
766
+ */
767
+ configureAudioBand(args) {
768
+ const { band, enabled, sensitivity, targets } = args;
769
+
770
+ const isBrowser = typeof window !== 'undefined';
771
+ if (isBrowser && window.reactivityManager?.configureAudioBand) {
772
+ window.reactivityManager.configureAudioBand(band, { enabled, sensitivity, targets });
773
+ }
774
+
775
+ telemetry.recordEvent(EventType.PARAMETER_CHANGE, { type: 'audio_band', band });
776
+
777
+ return {
778
+ band,
779
+ updated: true,
780
+ config: { enabled, sensitivity, targets },
781
+ suggested_next_actions: ['get_reactivity_config', 'configure_audio_band']
782
+ };
783
+ }
784
+
785
+ // ===== EXPORT HANDLERS (Phase 6.5) =====
786
+
787
+ /**
788
+ * Export VIB3Package
789
+ */
790
+ exportPackage(args) {
791
+ const { name, description, includeReactivity = true, includeEmbed = true, format = 'json' } = args;
792
+
793
+ const visualParams = this.getState()?.parameters || {};
794
+ const isBrowser = typeof window !== 'undefined';
795
+ const system = isBrowser ? (window.currentSystem || 'quantum') : 'quantum';
796
+ const reactivityConfig = includeReactivity ? this.getReactivityConfig().config : null;
797
+
798
+ const package_ = {
799
+ id: generateId('pkg'),
800
+ version: '2.0',
801
+ type: 'vib3-package',
802
+ name: name || `VIB3 ${system} Export`,
803
+ description: description || 'Exported visualization package',
804
+ created: new Date().toISOString(),
805
+ system,
806
+ visual: {
807
+ parameters: visualParams,
808
+ geometry: {
809
+ index: visualParams.geometry || 0,
810
+ coreIndex: Math.floor((visualParams.geometry || 0) / 8),
811
+ baseIndex: (visualParams.geometry || 0) % 8
812
+ }
813
+ }
814
+ };
815
+
816
+ if (includeReactivity && reactivityConfig) package_.reactivity = reactivityConfig;
817
+ if (includeEmbed) {
818
+ package_.embed = {
819
+ html: `<div id="vib3-container" data-package="${package_.id}"></div>`,
820
+ js: `VIB3.loadPackage(${JSON.stringify(package_.id)});`,
821
+ iframe: `<iframe src="https://vib3.app/embed/${package_.id}" width="100%" height="400"></iframe>`
822
+ };
823
+ }
824
+
825
+ return { package: package_, format, suggested_next_actions: ['save_to_gallery', 'apply_behavior_preset'] };
826
+ }
827
+
828
+ // ===== PRESET HANDLERS (Phase 6.6) =====
829
+
830
+ static BEHAVIOR_PRESETS = {
831
+ ambient: {
832
+ name: 'Ambient',
833
+ description: 'Calm, slow, minimal reactivity - perfect for backgrounds',
834
+ config: {
835
+ audio: { enabled: false },
836
+ tilt: { enabled: true, sensitivity: 0.3, dramaticMode: false },
837
+ interaction: { mouseMode: 'shimmer', clickMode: 'none', scrollMode: 'none' }
838
+ },
839
+ visualOverrides: { speed: 0.3, chaos: 0.1 }
840
+ },
841
+ reactive: {
842
+ name: 'Reactive',
843
+ description: 'High audio reactivity - responds to music/sound',
844
+ config: {
845
+ audio: { enabled: true, globalSensitivity: 1.5 },
846
+ tilt: { enabled: false },
847
+ interaction: { mouseMode: 'rotation', clickMode: 'burst', scrollMode: 'cycle' }
848
+ },
849
+ visualOverrides: { speed: 1.0, chaos: 0.3 }
850
+ },
851
+ immersive: {
852
+ name: 'Immersive',
853
+ description: 'Full tilt control with dramatic rotations',
854
+ config: {
855
+ audio: { enabled: true, globalSensitivity: 0.8 },
856
+ tilt: { enabled: true, sensitivity: 1.0, dramaticMode: true },
857
+ interaction: { mouseMode: 'velocity', clickMode: 'ripple', scrollMode: 'zoom' }
858
+ },
859
+ visualOverrides: { speed: 0.8 }
860
+ },
861
+ energetic: {
862
+ name: 'Energetic',
863
+ description: 'Fast, chaotic, high-energy visuals',
864
+ config: {
865
+ audio: { enabled: true, globalSensitivity: 2.0 },
866
+ tilt: { enabled: true, sensitivity: 1.5, dramaticMode: true },
867
+ interaction: { mouseMode: 'velocity', clickMode: 'blast', scrollMode: 'wave' }
868
+ },
869
+ visualOverrides: { speed: 2.5, chaos: 0.8, morphFactor: 1.5 }
870
+ },
871
+ calm: {
872
+ name: 'Calm',
873
+ description: 'Slow, smooth, meditative patterns',
874
+ config: {
875
+ audio: { enabled: false },
876
+ tilt: { enabled: true, sensitivity: 0.2, dramaticMode: false },
877
+ interaction: { mouseMode: 'shimmer', clickMode: 'pulse', scrollMode: 'none' }
878
+ },
879
+ visualOverrides: { speed: 0.2, chaos: 0.05, morphFactor: 0.3 }
880
+ },
881
+ cinematic: {
882
+ name: 'Cinematic',
883
+ description: 'Dramatic rotations, smooth transitions for video',
884
+ config: {
885
+ audio: { enabled: false },
886
+ tilt: { enabled: false },
887
+ interaction: { mouseMode: 'none', clickMode: 'none', scrollMode: 'none' }
888
+ },
889
+ visualOverrides: { speed: 0.5, chaos: 0.2 }
890
+ }
891
+ };
892
+
893
+ /**
894
+ * Apply a behavior preset
895
+ */
896
+ applyBehaviorPreset(args) {
897
+ const { preset } = args;
898
+ const presetConfig = MCPServer.BEHAVIOR_PRESETS[preset];
899
+
900
+ if (!presetConfig) {
901
+ return {
902
+ error: {
903
+ type: 'ValidationError',
904
+ code: 'INVALID_PRESET',
905
+ message: `Unknown preset: ${preset}`,
906
+ valid_options: Object.keys(MCPServer.BEHAVIOR_PRESETS)
907
+ }
908
+ };
909
+ }
910
+
911
+ this.setReactivityConfig(presetConfig.config);
912
+
913
+ if (presetConfig.visualOverrides && this.engine) {
914
+ for (const [param, value] of Object.entries(presetConfig.visualOverrides)) {
915
+ this.engine.setParameter(param, value);
916
+ }
917
+ }
918
+
919
+ telemetry.recordEvent(EventType.PARAMETER_CHANGE, { type: 'preset', preset });
920
+
921
+ return {
922
+ preset,
923
+ applied: true,
924
+ name: presetConfig.name,
925
+ description: presetConfig.description,
926
+ config: presetConfig.config,
927
+ visualOverrides: presetConfig.visualOverrides,
928
+ suggested_next_actions: ['get_reactivity_config', 'set_visual_parameters', 'export_package']
929
+ };
930
+ }
931
+
932
+ /**
933
+ * List available behavior presets
934
+ */
935
+ listBehaviorPresets() {
936
+ return {
937
+ count: Object.keys(MCPServer.BEHAVIOR_PRESETS).length,
938
+ presets: Object.entries(MCPServer.BEHAVIOR_PRESETS).map(([key, value]) => ({
939
+ id: key,
940
+ name: value.name,
941
+ description: value.description
942
+ })),
943
+ suggested_next_actions: ['apply_behavior_preset']
944
+ };
945
+ }
946
+ }
947
+
948
+ // Singleton instance
949
+ export const mcpServer = new MCPServer();
950
+ export default mcpServer;