@vib3code/sdk 2.0.1 → 2.0.3-canary.0a63e71

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 (192) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/DOCS/AGENT_HARNESS_ARCHITECTURE.md +245 -0
  3. package/DOCS/ANDROID_DEPLOYMENT.md +59 -0
  4. package/DOCS/ARCHITECTURE.md +1 -0
  5. package/DOCS/CI_TESTING.md +2 -0
  6. package/DOCS/CLI_ONBOARDING.md +3 -1
  7. package/DOCS/CONTROL_REFERENCE.md +2 -0
  8. package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +119 -0
  9. package/DOCS/ENV_SETUP.md +2 -0
  10. package/DOCS/EPIC_SCROLL_EVENTS.md +775 -0
  11. package/DOCS/EXPANSION_DESIGN.md +979 -0
  12. package/DOCS/EXPANSION_DESIGN_ULTRA.md +389 -0
  13. package/DOCS/EXPORT_FORMATS.md +2 -0
  14. package/DOCS/GPU_DISPOSAL_GUIDE.md +2 -0
  15. package/DOCS/HANDOFF_LANDING_PAGE.md +156 -0
  16. package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +495 -0
  17. package/DOCS/LICENSING_TIERS.md +2 -0
  18. package/DOCS/MASTER_PLAN_2026-01-31.md +4 -2
  19. package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +939 -0
  20. package/DOCS/OBS_SETUP_GUIDE.md +2 -0
  21. package/DOCS/OPTIMIZATION_PLAN_MATH.md +119 -0
  22. package/DOCS/PRODUCT_STRATEGY.md +65 -0
  23. package/DOCS/PROJECT_SETUP.md +2 -0
  24. package/DOCS/README.md +105 -0
  25. package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +99 -0
  26. package/DOCS/RENDERER_LIFECYCLE.md +2 -0
  27. package/DOCS/REPO_MANIFEST.md +2 -0
  28. package/DOCS/ROADMAP.md +113 -0
  29. package/DOCS/SCROLL_TIMELINE_v3.md +271 -0
  30. package/DOCS/SITE_REFACTOR_PLAN.md +102 -0
  31. package/DOCS/STATUS.md +26 -0
  32. package/DOCS/SYSTEM_INVENTORY.md +37 -32
  33. package/DOCS/TELEMETRY_EXPORTS.md +2 -0
  34. package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +87 -0
  35. package/DOCS/VISUAL_ANALYSIS_FACETAD.md +135 -0
  36. package/DOCS/VISUAL_ANALYSIS_SIMONE.md +97 -0
  37. package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +88 -0
  38. package/DOCS/WEBGPU_STATUS.md +121 -38
  39. package/DOCS/XR_BENCHMARKS.md +2 -0
  40. package/DOCS/archive/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +1 -0
  41. package/DOCS/archive/DEV_TRACK_ANALYSIS.md +1 -0
  42. package/DOCS/archive/DEV_TRACK_PLAN_2026-01-07.md +1 -0
  43. package/DOCS/archive/SESSION_014_PLAN.md +1 -0
  44. package/DOCS/archive/SESSION_LOG_2026-01-07.md +1 -0
  45. package/DOCS/archive/STRATEGIC_BLUEPRINT_2026-01-07.md +1 -0
  46. package/DOCS/archive/SYSTEM_AUDIT_2026-01-30.md +1 -0
  47. package/DOCS/archive/WEBGPU_STATUS_2026-02-15_STALE.md +1 -0
  48. package/DOCS/{DEV_TRACK_SESSION_2026-01-31.md → dev-tracks/DEV_TRACK_SESSION_2026-01-31.md} +3 -1
  49. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +233 -0
  50. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +129 -0
  51. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md +144 -0
  52. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-16.md +110 -0
  53. package/DOCS/dev-tracks/PERF_UPGRADE_2026-02-16.md +310 -0
  54. package/DOCS/dev-tracks/README.md +12 -0
  55. package/README.md +26 -13
  56. package/cpp/CMakeLists.txt +236 -0
  57. package/cpp/bindings/embind.cpp +269 -0
  58. package/cpp/build.sh +129 -0
  59. package/cpp/geometry/Crystal.cpp +103 -0
  60. package/cpp/geometry/Fractal.cpp +136 -0
  61. package/cpp/geometry/GeometryGenerator.cpp +262 -0
  62. package/cpp/geometry/KleinBottle.cpp +71 -0
  63. package/cpp/geometry/Sphere.cpp +134 -0
  64. package/cpp/geometry/Tesseract.cpp +94 -0
  65. package/cpp/geometry/Tetrahedron.cpp +83 -0
  66. package/cpp/geometry/Torus.cpp +65 -0
  67. package/cpp/geometry/WarpFunctions.cpp +238 -0
  68. package/cpp/geometry/Wave.cpp +85 -0
  69. package/cpp/include/vib3_ffi.h +238 -0
  70. package/cpp/math/Mat4x4.cpp +409 -0
  71. package/cpp/math/Mat4x4.hpp +209 -0
  72. package/cpp/math/Projection.cpp +142 -0
  73. package/cpp/math/Projection.hpp +148 -0
  74. package/cpp/math/Rotor4D.cpp +322 -0
  75. package/cpp/math/Rotor4D.hpp +204 -0
  76. package/cpp/math/Vec4.cpp +303 -0
  77. package/cpp/math/Vec4.hpp +225 -0
  78. package/cpp/src/vib3_ffi.cpp +607 -0
  79. package/cpp/tests/Geometry_test.cpp +213 -0
  80. package/cpp/tests/Mat4x4_test.cpp +494 -0
  81. package/cpp/tests/Projection_test.cpp +298 -0
  82. package/cpp/tests/Rotor4D_test.cpp +423 -0
  83. package/cpp/tests/Vec4_test.cpp +489 -0
  84. package/docs/webgpu-live.html +1 -1
  85. package/package.json +41 -30
  86. package/src/agent/index.js +1 -3
  87. package/src/agent/mcp/MCPServer.js +1220 -144
  88. package/src/agent/mcp/index.js +1 -1
  89. package/src/agent/mcp/stdio-server.js +264 -0
  90. package/src/agent/mcp/tools.js +498 -31
  91. package/src/cli/index.js +431 -47
  92. package/src/core/CanvasManager.js +97 -204
  93. package/src/core/ErrorReporter.js +1 -1
  94. package/src/core/Parameters.js +1 -1
  95. package/src/core/VIB3Engine.js +93 -4
  96. package/src/core/VitalitySystem.js +53 -0
  97. package/src/core/index.js +18 -0
  98. package/src/core/renderers/FacetedRendererAdapter.js +10 -9
  99. package/src/core/renderers/HolographicRendererAdapter.js +13 -9
  100. package/src/core/renderers/QuantumRendererAdapter.js +11 -7
  101. package/src/creative/AestheticMapper.js +628 -0
  102. package/src/creative/ChoreographyPlayer.js +481 -0
  103. package/src/creative/index.js +11 -0
  104. package/src/experimental/GameLoop.js +72 -0
  105. package/src/experimental/LatticePhysics.js +100 -0
  106. package/src/experimental/LiveDirector.js +143 -0
  107. package/src/experimental/PlayerController4D.js +154 -0
  108. package/src/experimental/VIB3Actor.js +138 -0
  109. package/src/experimental/VIB3Compositor.js +117 -0
  110. package/src/experimental/VIB3Link.js +122 -0
  111. package/src/experimental/VIB3Orchestrator.js +146 -0
  112. package/src/experimental/VIB3Universe.js +109 -0
  113. package/src/experimental/demos/CrystalLabyrinth.js +202 -0
  114. package/src/export/TradingCardManager.js +3 -4
  115. package/src/export/index.js +11 -1
  116. package/src/faceted/FacetedSystem.js +260 -394
  117. package/src/games/glyph-war/GlyphWarVisualizer.js +641 -0
  118. package/src/geometry/generators/Crystal.js +2 -2
  119. package/src/geometry/warp/HypersphereCore.js +53 -24
  120. package/src/holograms/HolographicVisualizer.js +84 -98
  121. package/src/holograms/RealHolographicSystem.js +194 -43
  122. package/src/math/Mat4x4.js +308 -105
  123. package/src/math/Rotor4D.js +124 -40
  124. package/src/math/Vec4.js +200 -103
  125. package/src/math/index.js +7 -7
  126. package/src/polychora/PolychoraSystem.js +77 -0
  127. package/src/quantum/QuantumEngine.js +103 -66
  128. package/src/quantum/QuantumVisualizer.js +31 -22
  129. package/src/reactivity/index.js +3 -5
  130. package/src/render/LayerPresetManager.js +372 -0
  131. package/src/render/LayerReactivityBridge.js +344 -0
  132. package/src/render/LayerRelationshipGraph.js +610 -0
  133. package/src/render/MultiCanvasBridge.js +148 -25
  134. package/src/render/ShaderLoader.js +38 -0
  135. package/src/render/ShaderProgram.js +4 -4
  136. package/src/render/UnifiedRenderBridge.js +4 -1
  137. package/src/render/backends/WebGPUBackend.js +8 -4
  138. package/src/render/index.js +27 -2
  139. package/src/scene/Node4D.js +74 -24
  140. package/src/scene/index.js +4 -4
  141. package/src/shaders/common/geometry24.glsl +65 -0
  142. package/src/shaders/common/geometry24.wgsl +54 -0
  143. package/src/shaders/common/rotation4d.glsl +4 -4
  144. package/src/shaders/common/rotation4d.wgsl +2 -2
  145. package/src/shaders/common/uniforms.wgsl +15 -8
  146. package/src/shaders/faceted/faceted.frag.glsl +220 -80
  147. package/src/shaders/faceted/faceted.frag.wgsl +144 -90
  148. package/src/shaders/holographic/holographic.frag.glsl +28 -9
  149. package/src/shaders/holographic/holographic.frag.wgsl +112 -41
  150. package/src/shaders/quantum/quantum.frag.glsl +1 -0
  151. package/src/shaders/quantum/quantum.frag.wgsl +6 -4
  152. package/src/testing/ParallelTestFramework.js +2 -2
  153. package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +2 -2
  154. package/src/viewer/GalleryUI.js +17 -0
  155. package/src/viewer/ViewerPortal.js +2 -2
  156. package/src/viewer/index.js +1 -1
  157. package/tools/headless-renderer.js +258 -0
  158. package/tools/shader-sync-verify.js +14 -8
  159. package/tools/site-analysis/all-reports.json +32 -0
  160. package/tools/site-analysis/combined-analysis.md +50 -0
  161. package/tools/site-analyzer.mjs +779 -0
  162. package/tools/visual-catalog/capture.js +276 -0
  163. package/tools/visual-catalog/composite.js +138 -0
  164. package/types/adaptive-sdk.d.ts +204 -5
  165. package/types/agent/cli.d.ts +78 -0
  166. package/types/agent/index.d.ts +18 -0
  167. package/types/agent/mcp.d.ts +87 -0
  168. package/types/agent/telemetry.d.ts +190 -0
  169. package/types/core/VIB3Engine.d.ts +26 -0
  170. package/types/core/index.d.ts +261 -0
  171. package/types/creative/AestheticMapper.d.ts +72 -0
  172. package/types/creative/ChoreographyPlayer.d.ts +96 -0
  173. package/types/creative/index.d.ts +17 -0
  174. package/types/export/index.d.ts +243 -0
  175. package/types/geometry/index.d.ts +164 -0
  176. package/types/math/index.d.ts +214 -0
  177. package/types/render/LayerPresetManager.d.ts +78 -0
  178. package/types/render/LayerReactivityBridge.d.ts +85 -0
  179. package/types/render/LayerRelationshipGraph.d.ts +174 -0
  180. package/types/render/index.d.ts +3 -0
  181. package/types/scene/index.d.ts +204 -0
  182. package/types/systems/index.d.ts +244 -0
  183. package/types/variations/index.d.ts +62 -0
  184. package/types/viewer/index.d.ts +225 -0
  185. package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +0 -34
  186. package/DOCS/DEV_TRACK_ANALYSIS.md +0 -77
  187. package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +0 -42
  188. package/DOCS/SESSION_014_PLAN.md +0 -195
  189. package/DOCS/SESSION_LOG_2026-01-07.md +0 -56
  190. package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +0 -72
  191. package/DOCS/SYSTEM_AUDIT_2026-01-30.md +0 -738
  192. /package/src/viewer/{ReactivityManager.js → ViewerInputHandler.js} +0 -0
@@ -185,14 +185,14 @@ export class ViewerPortal extends EventEmitter {
185
185
 
186
186
  captureFrame(format = 'png', quality = 0.92) {
187
187
  if (!this.canvas) return null;
188
- return this.canvas.toDataURL(\`image/\${format}\`, quality);
188
+ return this.canvas.toDataURL(`image/${format}`, quality);
189
189
  }
190
190
 
191
191
  downloadFrame(filename = 'vib3-capture', format = 'png') {
192
192
  const dataUrl = this.captureFrame(format);
193
193
  if (!dataUrl) return;
194
194
  const link = document.createElement('a');
195
- link.download = \`\${filename}.\${format}\`;
195
+ link.download = `${filename}.${format}`;
196
196
  link.href = dataUrl;
197
197
  link.click();
198
198
  }
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  export { ViewerPortal, ViewerMode, ProjectionMode } from './ViewerPortal.js';
8
- export { ReactivityManager } from './ReactivityManager.js';
8
+ export { ReactivityManager } from './ViewerInputHandler.js';
9
9
  export { CardBending, BendPreset } from './CardBending.js';
10
10
  export { TradingCardExporter, CardSize, FrameStyle, Rarity } from './TradingCardExporter.js';
11
11
  export { AudioReactivity, AudioSource, FrequencyBand } from './AudioReactivity.js';
@@ -0,0 +1,258 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * headless-renderer.js - VIB3+ Headless Frame Capture Utility
5
+ *
6
+ * Uses Puppeteer to render VIB3+ visualizations in a headless browser and
7
+ * capture screenshots. Designed for:
8
+ * - Agent visual feedback loops (capture → analyze → refine)
9
+ * - CI visual regression testing
10
+ * - Thumbnail generation for gallery entries
11
+ * - Offline batch rendering
12
+ *
13
+ * Usage:
14
+ * node tools/headless-renderer.js [options]
15
+ *
16
+ * Options:
17
+ * --url <url> Dev server URL (default: http://localhost:5173)
18
+ * --output <path> Output directory (default: ./renders)
19
+ * --width <px> Viewport width (default: 512)
20
+ * --height <px> Viewport height (default: 512)
21
+ * --params <json> JSON parameter object to apply
22
+ * --system <name> System: quantum|faceted|holographic
23
+ * --geometry <index> Geometry index 0-23
24
+ * --delay <ms> Wait time after parameter set (default: 500)
25
+ * --frames <count> Number of frames to capture (default: 1)
26
+ * --interval <ms> Interval between frames (default: 100)
27
+ * --format <type> png|jpeg|webp (default: png)
28
+ * --base64 Output base64 to stdout instead of file
29
+ *
30
+ * Examples:
31
+ * # Single frame with custom params
32
+ * node tools/headless-renderer.js --system quantum --geometry 11 --params '{"hue":200,"chaos":0.3}'
33
+ *
34
+ * # 10 frames of animation
35
+ * node tools/headless-renderer.js --frames 10 --interval 200 --output ./animation
36
+ *
37
+ * # Base64 output for piping to agents
38
+ * node tools/headless-renderer.js --base64 --params '{"hue":120}'
39
+ *
40
+ * @module tools/headless-renderer
41
+ * @version 1.0.0
42
+ */
43
+
44
+ import { existsSync, mkdirSync } from 'fs';
45
+ import { join, resolve } from 'path';
46
+
47
+ // Parse CLI arguments
48
+ function parseArgs(argv) {
49
+ const args = {
50
+ url: 'http://localhost:5173',
51
+ output: './renders',
52
+ width: 512,
53
+ height: 512,
54
+ params: null,
55
+ system: null,
56
+ geometry: null,
57
+ delay: 500,
58
+ frames: 1,
59
+ interval: 100,
60
+ format: 'png',
61
+ base64: false
62
+ };
63
+
64
+ for (let i = 2; i < argv.length; i++) {
65
+ const flag = argv[i];
66
+ const next = argv[i + 1];
67
+
68
+ switch (flag) {
69
+ case '--url': args.url = next; i++; break;
70
+ case '--output': args.output = next; i++; break;
71
+ case '--width': args.width = parseInt(next, 10); i++; break;
72
+ case '--height': args.height = parseInt(next, 10); i++; break;
73
+ case '--params': args.params = JSON.parse(next); i++; break;
74
+ case '--system': args.system = next; i++; break;
75
+ case '--geometry': args.geometry = parseInt(next, 10); i++; break;
76
+ case '--delay': args.delay = parseInt(next, 10); i++; break;
77
+ case '--frames': args.frames = parseInt(next, 10); i++; break;
78
+ case '--interval': args.interval = parseInt(next, 10); i++; break;
79
+ case '--format': args.format = next; i++; break;
80
+ case '--base64': args.base64 = true; break;
81
+ case '--help':
82
+ console.log('Usage: node tools/headless-renderer.js [options]');
83
+ console.log('See file header for full option list.');
84
+ process.exit(0);
85
+ }
86
+ }
87
+
88
+ return args;
89
+ }
90
+
91
+ async function main() {
92
+ const args = parseArgs(process.argv);
93
+
94
+ // Dynamic import puppeteer (devDependency)
95
+ let puppeteer;
96
+ try {
97
+ puppeteer = await import('puppeteer-core');
98
+ if (puppeteer.default) puppeteer = puppeteer.default;
99
+ } catch {
100
+ try {
101
+ puppeteer = await import('puppeteer');
102
+ if (puppeteer.default) puppeteer = puppeteer.default;
103
+ } catch {
104
+ console.error('Error: puppeteer or puppeteer-core is required.');
105
+ console.error('Install with: npm install puppeteer-core');
106
+ process.exit(1);
107
+ }
108
+ }
109
+
110
+ // Find Chrome/Chromium
111
+ const executablePath = findChromium();
112
+
113
+ console.log(`[headless-renderer] Launching browser...`);
114
+ const browser = await puppeteer.launch({
115
+ headless: 'new',
116
+ executablePath,
117
+ args: [
118
+ '--no-sandbox',
119
+ '--disable-setuid-sandbox',
120
+ '--disable-dev-shm-usage',
121
+ '--use-gl=swiftshader', // Software GPU for headless
122
+ `--window-size=${args.width},${args.height}`
123
+ ]
124
+ });
125
+
126
+ const page = await browser.newPage();
127
+ await page.setViewport({ width: args.width, height: args.height });
128
+
129
+ console.log(`[headless-renderer] Loading ${args.url}...`);
130
+ try {
131
+ await page.goto(args.url, { waitUntil: 'networkidle2', timeout: 30000 });
132
+ } catch (err) {
133
+ console.error(`Error: Could not load ${args.url}`);
134
+ console.error('Is the dev server running? Start it with: npm run dev');
135
+ await browser.close();
136
+ process.exit(1);
137
+ }
138
+
139
+ // Wait for VIB3+ engine to initialize
140
+ await page.waitForFunction(() => {
141
+ return typeof window.engine !== 'undefined' ||
142
+ document.querySelector('canvas') !== null;
143
+ }, { timeout: 10000 }).catch(() => {
144
+ console.warn('[headless-renderer] Warning: Engine not detected, capturing anyway');
145
+ });
146
+
147
+ // Apply system switch
148
+ if (args.system) {
149
+ console.log(`[headless-renderer] Switching to system: ${args.system}`);
150
+ await page.evaluate((system) => {
151
+ if (window.switchSystem) window.switchSystem(system);
152
+ else if (window.engine?.switchSystem) window.engine.switchSystem(system);
153
+ }, args.system);
154
+ await sleep(200);
155
+ }
156
+
157
+ // Apply geometry
158
+ if (args.geometry !== null) {
159
+ console.log(`[headless-renderer] Setting geometry: ${args.geometry}`);
160
+ await page.evaluate((geo) => {
161
+ if (window.selectGeometry) window.selectGeometry(geo);
162
+ else if (window.engine?.setParameter) window.engine.setParameter('geometry', geo);
163
+ }, args.geometry);
164
+ await sleep(100);
165
+ }
166
+
167
+ // Apply custom parameters
168
+ if (args.params) {
169
+ console.log(`[headless-renderer] Applying parameters:`, JSON.stringify(args.params));
170
+ await page.evaluate((params) => {
171
+ for (const [key, value] of Object.entries(params)) {
172
+ if (window.updateParameter) window.updateParameter(key, value);
173
+ else if (window.engine?.setParameter) window.engine.setParameter(key, value);
174
+ }
175
+ }, args.params);
176
+ }
177
+
178
+ // Wait for render to settle
179
+ console.log(`[headless-renderer] Waiting ${args.delay}ms for render...`);
180
+ await sleep(args.delay);
181
+
182
+ // Wait one animation frame
183
+ await page.evaluate(() => new Promise(r => requestAnimationFrame(r)));
184
+
185
+ // Capture frames
186
+ if (!args.base64 && !existsSync(args.output)) {
187
+ mkdirSync(args.output, { recursive: true });
188
+ }
189
+
190
+ for (let i = 0; i < args.frames; i++) {
191
+ const screenshot = await page.screenshot({
192
+ type: args.format === 'jpeg' ? 'jpeg' : 'png',
193
+ encoding: args.base64 ? 'base64' : 'binary',
194
+ fullPage: false
195
+ });
196
+
197
+ if (args.base64) {
198
+ // Output base64 to stdout (for agent consumption)
199
+ if (args.frames === 1) {
200
+ process.stdout.write(screenshot);
201
+ } else {
202
+ console.log(JSON.stringify({
203
+ frame: i,
204
+ format: args.format,
205
+ data: screenshot
206
+ }));
207
+ }
208
+ } else {
209
+ const ext = args.format === 'jpeg' ? 'jpg' : args.format;
210
+ const filename = args.frames === 1
211
+ ? `capture.${ext}`
212
+ : `frame_${String(i).padStart(4, '0')}.${ext}`;
213
+ const filepath = join(resolve(args.output), filename);
214
+
215
+ const fs = await import('fs');
216
+ fs.writeFileSync(filepath, screenshot);
217
+ console.log(`[headless-renderer] Saved: ${filepath}`);
218
+ }
219
+
220
+ // Wait between frames
221
+ if (i < args.frames - 1 && args.interval > 0) {
222
+ await sleep(args.interval);
223
+ await page.evaluate(() => new Promise(r => requestAnimationFrame(r)));
224
+ }
225
+ }
226
+
227
+ await browser.close();
228
+ console.log(`[headless-renderer] Done.`);
229
+ }
230
+
231
+ function sleep(ms) {
232
+ return new Promise(r => setTimeout(r, ms));
233
+ }
234
+
235
+ function findChromium() {
236
+ const candidates = [
237
+ '/usr/bin/chromium-browser',
238
+ '/usr/bin/chromium',
239
+ '/usr/bin/google-chrome',
240
+ '/usr/bin/google-chrome-stable',
241
+ '/snap/bin/chromium',
242
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
243
+ 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
244
+ 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
245
+ ];
246
+
247
+ for (const path of candidates) {
248
+ if (existsSync(path)) return path;
249
+ }
250
+
251
+ // Let puppeteer figure it out
252
+ return undefined;
253
+ }
254
+
255
+ main().catch(err => {
256
+ console.error('[headless-renderer] Fatal error:', err.message);
257
+ process.exit(1);
258
+ });
@@ -34,7 +34,8 @@ export class ShaderSyncVerifier {
34
34
  'u_rot4dXY', 'u_rot4dXZ', 'u_rot4dYZ',
35
35
  'u_rot4dXW', 'u_rot4dYW', 'u_rot4dZW',
36
36
  'u_gridDensity', 'u_morphFactor', 'u_chaos',
37
- 'u_speed', 'u_hue', 'u_intensity', 'u_dimension'
37
+ 'u_speed', 'u_hue', 'u_intensity', 'u_dimension',
38
+ 'u_breath' // Exhale feature
38
39
  ],
39
40
  recommended: [
40
41
  'u_saturation', 'u_mouseIntensity', 'u_clickIntensity',
@@ -590,6 +591,7 @@ uniform float u_rot4dZW;
590
591
  uniform float u_mouseIntensity;
591
592
  uniform float u_clickIntensity;
592
593
  uniform float u_roleIntensity;
594
+ uniform float u_breath;
593
595
  void main() { gl_FragColor = vec4(0.0); }
594
596
  `;
595
597
 
@@ -600,6 +602,7 @@ const FACETED_GLSL_FRAGMENT = `
600
602
  precision highp float;
601
603
  uniform float u_time;
602
604
  uniform vec2 u_resolution;
605
+ uniform vec2 u_mouse;
603
606
  uniform float u_geometry;
604
607
  uniform float u_rot4dXY;
605
608
  uniform float u_rot4dXZ;
@@ -617,9 +620,11 @@ uniform float u_saturation;
617
620
  uniform float u_speed;
618
621
  uniform float u_mouseIntensity;
619
622
  uniform float u_clickIntensity;
623
+ uniform float u_roleIntensity;
620
624
  uniform float u_bass;
621
625
  uniform float u_mid;
622
626
  uniform float u_high;
627
+ uniform float u_breath;
623
628
  void main() { gl_FragColor = vec4(0.0); }
624
629
  `;
625
630
 
@@ -657,14 +662,15 @@ struct VIB3Uniforms {
657
662
  layerColor: vec3<f32>,
658
663
  densityMult: f32,
659
664
  speedMult: f32,
660
- _pad2: vec3<f32>,
665
+ breath: f32,
661
666
  };
662
667
  @group(0) @binding(0) var<uniform> u: VIB3Uniforms;
663
668
  `;
664
669
 
665
670
  /**
666
671
  * Holographic system GLSL fragment shader uniforms (from HolographicVisualizer.js).
667
- * This system uses non-standard names for several uniforms.
672
+ * Uses standard names (u_gridDensity, u_morphFactor, u_geometry) plus many
673
+ * system-specific uniforms for audio/touch/scroll reactivity.
668
674
  */
669
675
  const HOLOGRAPHIC_GLSL_FRAGMENT = `
670
676
  precision highp float;
@@ -672,7 +678,7 @@ uniform vec2 u_resolution;
672
678
  uniform float u_time;
673
679
  uniform vec2 u_mouse;
674
680
  uniform float u_geometry;
675
- uniform float u_density;
681
+ uniform float u_gridDensity;
676
682
  uniform float u_speed;
677
683
  uniform vec3 u_color;
678
684
  uniform float u_intensity;
@@ -683,9 +689,8 @@ uniform float u_chaosIntensity;
683
689
  uniform float u_mouseIntensity;
684
690
  uniform float u_clickIntensity;
685
691
  uniform float u_densityVariation;
686
- uniform float u_geometryType;
687
692
  uniform float u_chaos;
688
- uniform float u_morph;
693
+ uniform float u_morphFactor;
689
694
  uniform float u_touchMorph;
690
695
  uniform float u_touchChaos;
691
696
  uniform float u_scrollParallax;
@@ -702,6 +707,7 @@ uniform float u_rot4dYZ;
702
707
  uniform float u_rot4dXW;
703
708
  uniform float u_rot4dYW;
704
709
  uniform float u_rot4dZW;
710
+ uniform float u_breath;
705
711
  void main() { gl_FragColor = vec4(0.0); }
706
712
  `;
707
713
 
@@ -739,7 +745,7 @@ struct VIB3Uniforms {
739
745
  layerColor: vec3<f32>,
740
746
  densityMult: f32,
741
747
  speedMult: f32,
742
- _pad2: vec3<f32>,
748
+ breath: f32,
743
749
  };
744
750
  @group(0) @binding(0) var<uniform> u: VIB3Uniforms;
745
751
  `;
@@ -778,7 +784,7 @@ struct VIB3Uniforms {
778
784
  layerColor: vec3<f32>,
779
785
  densityMult: f32,
780
786
  speedMult: f32,
781
- _pad2: vec3<f32>,
787
+ breath: f32,
782
788
  };
783
789
  @group(0) @binding(0) var<uniform> u: VIB3Uniforms;
784
790
  `;
@@ -0,0 +1,32 @@
1
+ [
2
+ {
3
+ "site": "clickerss",
4
+ "url": "https://www.clickerss.com/",
5
+ "error": "page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://www.clickerss.com/\nCall log:\n - navigating to \"https://www.clickerss.com/\", waiting until \"networkidle\"\n"
6
+ },
7
+ {
8
+ "site": "facetad",
9
+ "url": "https://www.facetad.com/",
10
+ "error": "page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://www.facetad.com/\nCall log:\n - navigating to \"https://www.facetad.com/\", waiting until \"networkidle\"\n"
11
+ },
12
+ {
13
+ "site": "wix-template-3630",
14
+ "url": "https://www.wix.com/website-template/view/html/3630",
15
+ "error": "page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://www.wix.com/website-template/view/html/3630\nCall log:\n - navigating to \"https://www.wix.com/website-template/view/html/3630\", waiting until \"networkidle\"\n"
16
+ },
17
+ {
18
+ "site": "tableside",
19
+ "url": "https://www.tableside.com.au/",
20
+ "error": "page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://www.tableside.com.au/\nCall log:\n - navigating to \"https://www.tableside.com.au/\", waiting until \"networkidle\"\n"
21
+ },
22
+ {
23
+ "site": "wix-studio-space",
24
+ "url": "https://www.wix.com/studio/design/inspiration/space",
25
+ "error": "page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://www.wix.com/studio/design/inspiration/space\nCall log:\n - navigating to \"https://www.wix.com/studio/design/inspiration/space\", waiting until \"networkidle\"\n"
26
+ },
27
+ {
28
+ "site": "simone-webflow",
29
+ "url": "https://weare-simone.webflow.io/",
30
+ "error": "page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://weare-simone.webflow.io/\nCall log:\n - navigating to \"https://weare-simone.webflow.io/\", waiting until \"networkidle\"\n"
31
+ }
32
+ ]
@@ -0,0 +1,50 @@
1
+ # Reference Site Scroll Analysis
2
+
3
+ *Generated: 2026-02-09T14:01:29.902Z*
4
+
5
+ Analyzed 6 sites for scroll effects, parallax, morphing, depth illusions, and multi-element coordination.
6
+
7
+ ---
8
+
9
+ ### clickerss (https://www.clickerss.com/)
10
+
11
+ **ERROR**: page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://www.clickerss.com/
12
+ Call log:
13
+ - navigating to "https://www.clickerss.com/", waiting until "networkidle"
14
+
15
+
16
+ ### facetad (https://www.facetad.com/)
17
+
18
+ **ERROR**: page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://www.facetad.com/
19
+ Call log:
20
+ - navigating to "https://www.facetad.com/", waiting until "networkidle"
21
+
22
+
23
+ ### wix-template-3630 (https://www.wix.com/website-template/view/html/3630)
24
+
25
+ **ERROR**: page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://www.wix.com/website-template/view/html/3630
26
+ Call log:
27
+ - navigating to "https://www.wix.com/website-template/view/html/3630", waiting until "networkidle"
28
+
29
+
30
+ ### tableside (https://www.tableside.com.au/)
31
+
32
+ **ERROR**: page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://www.tableside.com.au/
33
+ Call log:
34
+ - navigating to "https://www.tableside.com.au/", waiting until "networkidle"
35
+
36
+
37
+ ### wix-studio-space (https://www.wix.com/studio/design/inspiration/space)
38
+
39
+ **ERROR**: page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://www.wix.com/studio/design/inspiration/space
40
+ Call log:
41
+ - navigating to "https://www.wix.com/studio/design/inspiration/space", waiting until "networkidle"
42
+
43
+
44
+ ### simone-webflow (https://weare-simone.webflow.io/)
45
+
46
+ **ERROR**: page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://weare-simone.webflow.io/
47
+ Call log:
48
+ - navigating to "https://weare-simone.webflow.io/", waiting until "networkidle"
49
+
50
+