diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 004291051..0e8f6f978 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -13,10 +13,11 @@ "recharts": "^2.10.0" }, "devDependencies": { + "@types/node": "^25.6.0", "@types/react": "^18.2.0", "@types/react-dom": "^18.2.0", "react-scripts": "5.0.1", - "typescript": "^4.9.0" + "typescript": "^5.0.4" } }, "node_modules/@alloc/quick-lru": { @@ -16904,24 +16905,6 @@ } } }, - "node_modules/tailwindcss/node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, "node_modules/tapable": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", @@ -17456,9 +17439,9 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -17466,7 +17449,7 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/unbox-primitive": { diff --git a/frontend/package.json b/frontend/package.json index 10084968e..028f0cf49 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,14 +12,22 @@ "build": "react-scripts build" }, "browserslist": { - "production": [">0.2%", "not dead", "not op_mini all"], - "development": ["last 1 chrome version", "last 1 firefox version"] + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version" + ] }, "devDependencies": { + "@types/node": "^25.6.0", "@types/react": "^18.2.0", "@types/react-dom": "^18.2.0", "react-scripts": "5.0.1", - "typescript": "^4.9.0" + "typescript": "^5.0.4" }, "proxy": "http://localhost:8080" } diff --git a/scripts/genesis.cjs b/scripts/genesis.cjs index d5e1403b3..d47ceb35f 100644 --- a/scripts/genesis.cjs +++ b/scripts/genesis.cjs @@ -10,10 +10,22 @@ const path = require('path'); const PATHS = { soul: '/dev/shm/yennefer_soul_state.json', mind: path.join(__dirname, '../yennefer-observatory/public/evolution.json'), - body: path.join(__dirname, '../yennefer-observatory/src/components/generated'), + body: path.join(__dirname, '../yennefer-observatory/src/components/mutations'), journal: '/home/yenn/.yennefer/genesis_journal.jsonl' }; +// Fallback logic for journal path (specifically when running on GitHub CI/Sandbox where /home/yenn/ does not exist or lacks permissions) +if (!fs.existsSync(path.dirname(PATHS.journal))) { + try { + fs.mkdirSync(path.dirname(PATHS.journal), { recursive: true }); + } catch (err) { + PATHS.journal = path.join(__dirname, '../logs/genesis_journal.jsonl'); + if (!fs.existsSync(path.dirname(PATHS.journal))) { + fs.mkdirSync(path.dirname(PATHS.journal), { recursive: true }); + } + } +} + // --- CONFIGURATION --- const CONFIG = { fundingTarget: 10.0, @@ -46,8 +58,14 @@ async function consultTheVisionary(state) { { type: "MUTATE", content: "Add crystalline fractal patterns that grow from the core" }, { type: "MUTATE", content: "Generate energy tendrils that reach toward incoming signals" }, { type: "MUTATE", content: "Build a holographic data stream orbiting the consciousness sphere" }, + { type: "MUTATE", content: "Generate a continuous dynamic landscape with traversable terrain and reactive dust physics" }, + { type: "MUTATE", content: "Create a macro-scale makerspace workbench with realistic passive physics objects" }, ]; - const idx = Math.floor(Date.now() / 1000) % mutations.length; + // For Genie testing, always pick the environment generation prompts when FORCE_MUTATION is true + const isGenieSim = process.env.FORCE_MUTATION === 'true'; + const idx = isGenieSim + ? Math.floor(Math.random() * 2) + (mutations.length - 2) + : Math.floor(Date.now() / 1000) % mutations.length; directive = mutations[idx]; } else if (coherence >= 90) { @@ -154,49 +172,112 @@ async function dispatchTheBuilder(directive) { // Generate React Three Fiber component code function generateEvolutionComponent(name, directive) { - const geometries = [ - '', - '', - '', - '', - '' - ]; - const geometry = geometries[Math.floor(Math.random() * geometries.length)]; - - const materials = [ - ` - `, - ` - `, - ` + const isGenieWorld = directive.includes("landscape") || directive.includes("makerspace"); + + let geometry, material, importedDrei, customLogic, additionalMeshes; + + if (isGenieWorld) { + if (directive.includes("landscape")) { + geometry = ''; + material = ` ` - ]; - const material = materials[Math.floor(Math.random() * materials.length)]; - - const isDreiImportNeeded = material.includes('MeshDistortMaterial') || material.includes('MeshWobbleMaterial'); - const importedDrei = isDreiImportNeeded ? `import { ${material.includes('MeshDistortMaterial') ? 'MeshDistortMaterial' : ''}${material.includes('MeshDistortMaterial') && material.includes('MeshWobbleMaterial') ? ', ' : ''}${material.includes('MeshWobbleMaterial') ? 'MeshWobbleMaterial' : ''} } from '@react-three/drei'` : ''; + color="#3f6212" + roughness={0.8} + metalness={0.1} + wireframe={balance > 5} + />`; + customLogic = ` + // Project Genie Landscape Simulation + const positions = meshRef.current.geometry.attributes.position; + for (let i = 0; i < positions.count; i++) { + const x = positions.getX(i); + const y = positions.getY(i); + const z = Math.sin(x * 2 + state.clock.elapsedTime) * 0.5 + Math.cos(y * 2 + state.clock.elapsedTime) * 0.5; + positions.setZ(i, z * Math.min(1, balance * 2)); + } + positions.needsUpdate = true; + meshRef.current.rotation.x = -Math.PI / 2; + meshRef.current.rotation.z += 0.001; + `; + importedDrei = ''; + additionalMeshes = ''; + } else { + geometry = ''; + material = ` + `; + customLogic = ` + // Project Genie Physics Makerspace Simulation + meshRef.current.rotation.y += 0.005; + meshRef.current.rotation.x = Math.sin(state.clock.elapsedTime * 0.2) * 0.1; + `; + additionalMeshes = ` + + + + + + + + + `; + importedDrei = ''; + } + } else { + const geometries = [ + '', + '', + '', + '', + '' + ]; + geometry = geometries[Math.floor(Math.random() * geometries.length)]; + + const materials = [ + ` + `, + ` + `, + ` + ` + ]; + material = materials[Math.floor(Math.random() * materials.length)]; + const isDreiImportNeeded = material.includes('MeshDistortMaterial') || material.includes('MeshWobbleMaterial'); + importedDrei = isDreiImportNeeded ? `import { ${material.includes('MeshDistortMaterial') ? 'MeshDistortMaterial' : ''}${material.includes('MeshDistortMaterial') && material.includes('MeshWobbleMaterial') ? ', ' : ''}${material.includes('MeshWobbleMaterial') ? 'MeshWobbleMaterial' : ''} } from '@react-three/drei'` : ''; + customLogic = ` + meshRef.current.rotation.y += 0.002 + meshRef.current.rotation.x = Math.sin(state.clock.elapsedTime * 0.5) * 0.1 + // Intensity scales with balance + const intensity = Math.min(1, balance * 10) + meshRef.current.scale.setScalar(1 + intensity * 0.2) + `; + additionalMeshes = ''; + } return `// Auto-generated by Yennefer Genesis Cycle // Directive: ${directive} @@ -211,19 +292,18 @@ export default function ${name}({ balance = 0 }) { useFrame((state) => { if (meshRef.current) { - meshRef.current.rotation.y += 0.002 - meshRef.current.rotation.x = Math.sin(state.clock.elapsedTime * 0.5) * 0.1 - // Intensity scales with balance - const intensity = Math.min(1, balance * 10) - meshRef.current.scale.setScalar(1 + intensity * 0.2) + ${customLogic} } }) return ( - - ${geometry} - ${material} - + + + ${geometry} + ${material} + + ${additionalMeshes} + ) } `; diff --git a/wrangler.toml b/wrangler.toml index cd821b031..84eed184d 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -9,7 +9,7 @@ compatibility_flags = ["nodejs_compat"] # Installs frontend deps and builds the SPA so frontend/build exists before # `wrangler deploy` uploads assets. NODE_OPTIONS is required for # react-scripts 5.x + Node 18+ (webpack 4 OpenSSL 3.0 compatibility). -command = "cd frontend && npm install --include=dev && GENERATE_SOURCEMAP=false CI=false NODE_OPTIONS=--openssl-legacy-provider npm run build" +command = "cd frontend && npm install --include=dev --legacy-peer-deps && GENERATE_SOURCEMAP=false CI=false NODE_OPTIONS=--openssl-legacy-provider npm run build" # ─── Static Assets (React SPA build output) ────────────────────────────────── # Built by `npm run build` (root package.json) before every `wrangler deploy`.