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`.