@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.
- package/CHANGELOG.md +36 -0
- package/DOCS/AGENT_HARNESS_ARCHITECTURE.md +245 -0
- package/DOCS/ANDROID_DEPLOYMENT.md +59 -0
- package/DOCS/ARCHITECTURE.md +1 -0
- package/DOCS/CI_TESTING.md +2 -0
- package/DOCS/CLI_ONBOARDING.md +3 -1
- package/DOCS/CONTROL_REFERENCE.md +2 -0
- package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +119 -0
- package/DOCS/ENV_SETUP.md +2 -0
- package/DOCS/EPIC_SCROLL_EVENTS.md +775 -0
- package/DOCS/EXPANSION_DESIGN.md +979 -0
- package/DOCS/EXPANSION_DESIGN_ULTRA.md +389 -0
- package/DOCS/EXPORT_FORMATS.md +2 -0
- package/DOCS/GPU_DISPOSAL_GUIDE.md +2 -0
- package/DOCS/HANDOFF_LANDING_PAGE.md +156 -0
- package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +495 -0
- package/DOCS/LICENSING_TIERS.md +2 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +4 -2
- package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +939 -0
- package/DOCS/OBS_SETUP_GUIDE.md +2 -0
- package/DOCS/OPTIMIZATION_PLAN_MATH.md +119 -0
- package/DOCS/PRODUCT_STRATEGY.md +65 -0
- package/DOCS/PROJECT_SETUP.md +2 -0
- package/DOCS/README.md +105 -0
- package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +99 -0
- package/DOCS/RENDERER_LIFECYCLE.md +2 -0
- package/DOCS/REPO_MANIFEST.md +2 -0
- package/DOCS/ROADMAP.md +113 -0
- package/DOCS/SCROLL_TIMELINE_v3.md +271 -0
- package/DOCS/SITE_REFACTOR_PLAN.md +102 -0
- package/DOCS/STATUS.md +26 -0
- package/DOCS/SYSTEM_INVENTORY.md +37 -32
- package/DOCS/TELEMETRY_EXPORTS.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +87 -0
- package/DOCS/VISUAL_ANALYSIS_FACETAD.md +135 -0
- package/DOCS/VISUAL_ANALYSIS_SIMONE.md +97 -0
- package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +88 -0
- package/DOCS/WEBGPU_STATUS.md +121 -38
- package/DOCS/XR_BENCHMARKS.md +2 -0
- package/DOCS/archive/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +1 -0
- package/DOCS/archive/DEV_TRACK_ANALYSIS.md +1 -0
- package/DOCS/archive/DEV_TRACK_PLAN_2026-01-07.md +1 -0
- package/DOCS/archive/SESSION_014_PLAN.md +1 -0
- package/DOCS/archive/SESSION_LOG_2026-01-07.md +1 -0
- package/DOCS/archive/STRATEGIC_BLUEPRINT_2026-01-07.md +1 -0
- package/DOCS/archive/SYSTEM_AUDIT_2026-01-30.md +1 -0
- package/DOCS/archive/WEBGPU_STATUS_2026-02-15_STALE.md +1 -0
- package/DOCS/{DEV_TRACK_SESSION_2026-01-31.md → dev-tracks/DEV_TRACK_SESSION_2026-01-31.md} +3 -1
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +233 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +129 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md +144 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-16.md +110 -0
- package/DOCS/dev-tracks/PERF_UPGRADE_2026-02-16.md +310 -0
- package/DOCS/dev-tracks/README.md +12 -0
- package/README.md +26 -13
- package/cpp/CMakeLists.txt +236 -0
- package/cpp/bindings/embind.cpp +269 -0
- package/cpp/build.sh +129 -0
- package/cpp/geometry/Crystal.cpp +103 -0
- package/cpp/geometry/Fractal.cpp +136 -0
- package/cpp/geometry/GeometryGenerator.cpp +262 -0
- package/cpp/geometry/KleinBottle.cpp +71 -0
- package/cpp/geometry/Sphere.cpp +134 -0
- package/cpp/geometry/Tesseract.cpp +94 -0
- package/cpp/geometry/Tetrahedron.cpp +83 -0
- package/cpp/geometry/Torus.cpp +65 -0
- package/cpp/geometry/WarpFunctions.cpp +238 -0
- package/cpp/geometry/Wave.cpp +85 -0
- package/cpp/include/vib3_ffi.h +238 -0
- package/cpp/math/Mat4x4.cpp +409 -0
- package/cpp/math/Mat4x4.hpp +209 -0
- package/cpp/math/Projection.cpp +142 -0
- package/cpp/math/Projection.hpp +148 -0
- package/cpp/math/Rotor4D.cpp +322 -0
- package/cpp/math/Rotor4D.hpp +204 -0
- package/cpp/math/Vec4.cpp +303 -0
- package/cpp/math/Vec4.hpp +225 -0
- package/cpp/src/vib3_ffi.cpp +607 -0
- package/cpp/tests/Geometry_test.cpp +213 -0
- package/cpp/tests/Mat4x4_test.cpp +494 -0
- package/cpp/tests/Projection_test.cpp +298 -0
- package/cpp/tests/Rotor4D_test.cpp +423 -0
- package/cpp/tests/Vec4_test.cpp +489 -0
- package/docs/webgpu-live.html +1 -1
- package/package.json +41 -30
- package/src/agent/index.js +1 -3
- package/src/agent/mcp/MCPServer.js +1220 -144
- package/src/agent/mcp/index.js +1 -1
- package/src/agent/mcp/stdio-server.js +264 -0
- package/src/agent/mcp/tools.js +498 -31
- package/src/cli/index.js +431 -47
- package/src/core/CanvasManager.js +97 -204
- package/src/core/ErrorReporter.js +1 -1
- package/src/core/Parameters.js +1 -1
- package/src/core/VIB3Engine.js +93 -4
- package/src/core/VitalitySystem.js +53 -0
- package/src/core/index.js +18 -0
- package/src/core/renderers/FacetedRendererAdapter.js +10 -9
- package/src/core/renderers/HolographicRendererAdapter.js +13 -9
- package/src/core/renderers/QuantumRendererAdapter.js +11 -7
- package/src/creative/AestheticMapper.js +628 -0
- package/src/creative/ChoreographyPlayer.js +481 -0
- package/src/creative/index.js +11 -0
- package/src/experimental/GameLoop.js +72 -0
- package/src/experimental/LatticePhysics.js +100 -0
- package/src/experimental/LiveDirector.js +143 -0
- package/src/experimental/PlayerController4D.js +154 -0
- package/src/experimental/VIB3Actor.js +138 -0
- package/src/experimental/VIB3Compositor.js +117 -0
- package/src/experimental/VIB3Link.js +122 -0
- package/src/experimental/VIB3Orchestrator.js +146 -0
- package/src/experimental/VIB3Universe.js +109 -0
- package/src/experimental/demos/CrystalLabyrinth.js +202 -0
- package/src/export/TradingCardManager.js +3 -4
- package/src/export/index.js +11 -1
- package/src/faceted/FacetedSystem.js +260 -394
- package/src/games/glyph-war/GlyphWarVisualizer.js +641 -0
- package/src/geometry/generators/Crystal.js +2 -2
- package/src/geometry/warp/HypersphereCore.js +53 -24
- package/src/holograms/HolographicVisualizer.js +84 -98
- package/src/holograms/RealHolographicSystem.js +194 -43
- package/src/math/Mat4x4.js +308 -105
- package/src/math/Rotor4D.js +124 -40
- package/src/math/Vec4.js +200 -103
- package/src/math/index.js +7 -7
- package/src/polychora/PolychoraSystem.js +77 -0
- package/src/quantum/QuantumEngine.js +103 -66
- package/src/quantum/QuantumVisualizer.js +31 -22
- package/src/reactivity/index.js +3 -5
- package/src/render/LayerPresetManager.js +372 -0
- package/src/render/LayerReactivityBridge.js +344 -0
- package/src/render/LayerRelationshipGraph.js +610 -0
- package/src/render/MultiCanvasBridge.js +148 -25
- package/src/render/ShaderLoader.js +38 -0
- package/src/render/ShaderProgram.js +4 -4
- package/src/render/UnifiedRenderBridge.js +4 -1
- package/src/render/backends/WebGPUBackend.js +8 -4
- package/src/render/index.js +27 -2
- package/src/scene/Node4D.js +74 -24
- package/src/scene/index.js +4 -4
- package/src/shaders/common/geometry24.glsl +65 -0
- package/src/shaders/common/geometry24.wgsl +54 -0
- package/src/shaders/common/rotation4d.glsl +4 -4
- package/src/shaders/common/rotation4d.wgsl +2 -2
- package/src/shaders/common/uniforms.wgsl +15 -8
- package/src/shaders/faceted/faceted.frag.glsl +220 -80
- package/src/shaders/faceted/faceted.frag.wgsl +144 -90
- package/src/shaders/holographic/holographic.frag.glsl +28 -9
- package/src/shaders/holographic/holographic.frag.wgsl +112 -41
- package/src/shaders/quantum/quantum.frag.glsl +1 -0
- package/src/shaders/quantum/quantum.frag.wgsl +6 -4
- package/src/testing/ParallelTestFramework.js +2 -2
- package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +2 -2
- package/src/viewer/GalleryUI.js +17 -0
- package/src/viewer/ViewerPortal.js +2 -2
- package/src/viewer/index.js +1 -1
- package/tools/headless-renderer.js +258 -0
- package/tools/shader-sync-verify.js +14 -8
- package/tools/site-analysis/all-reports.json +32 -0
- package/tools/site-analysis/combined-analysis.md +50 -0
- package/tools/site-analyzer.mjs +779 -0
- package/tools/visual-catalog/capture.js +276 -0
- package/tools/visual-catalog/composite.js +138 -0
- package/types/adaptive-sdk.d.ts +204 -5
- package/types/agent/cli.d.ts +78 -0
- package/types/agent/index.d.ts +18 -0
- package/types/agent/mcp.d.ts +87 -0
- package/types/agent/telemetry.d.ts +190 -0
- package/types/core/VIB3Engine.d.ts +26 -0
- package/types/core/index.d.ts +261 -0
- package/types/creative/AestheticMapper.d.ts +72 -0
- package/types/creative/ChoreographyPlayer.d.ts +96 -0
- package/types/creative/index.d.ts +17 -0
- package/types/export/index.d.ts +243 -0
- package/types/geometry/index.d.ts +164 -0
- package/types/math/index.d.ts +214 -0
- package/types/render/LayerPresetManager.d.ts +78 -0
- package/types/render/LayerReactivityBridge.d.ts +85 -0
- package/types/render/LayerRelationshipGraph.d.ts +174 -0
- package/types/render/index.d.ts +3 -0
- package/types/scene/index.d.ts +204 -0
- package/types/systems/index.d.ts +244 -0
- package/types/variations/index.d.ts +62 -0
- package/types/viewer/index.d.ts +225 -0
- package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +0 -34
- package/DOCS/DEV_TRACK_ANALYSIS.md +0 -77
- package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +0 -42
- package/DOCS/SESSION_014_PLAN.md +0 -195
- package/DOCS/SESSION_LOG_2026-01-07.md +0 -56
- package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +0 -72
- package/DOCS/SYSTEM_AUDIT_2026-01-30.md +0 -738
- /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(
|
|
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 =
|
|
195
|
+
link.download = `${filename}.${format}`;
|
|
196
196
|
link.href = dataUrl;
|
|
197
197
|
link.click();
|
|
198
198
|
}
|
package/src/viewer/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
export { ViewerPortal, ViewerMode, ProjectionMode } from './ViewerPortal.js';
|
|
8
|
-
export { ReactivityManager } from './
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
|