#!/usr/bin/env python3 """Verify the current Python runtime from an isolated distribution without frontend tooling.""" import os import json from pathlib import Path import shutil import socket import subprocess import sys import tempfile ROOT = Path(__file__).resolve().parents[1] PROBE = """ from pathlib import Path import shutil import json import sys from starlette.testclient import TestClient from app import app assert not Path('frontend').exists() assert not Path('node_modules').exists() assert shutil.which('node') is None with TestClient(app) as client: for output in json.loads(sys.argv[1]): asset = client.get('/static/' + output) assert asset.status_code == 200, (output, asset.status_code) assert asset.content == Path('static', output).read_bytes(), output assert asset.headers['content-type'].startswith('text/javascript'), output assert asset.headers['cache-control'] == 'no-cache', output response = client.get('/static/js/actionMenuOrder.js') assert response.status_code == 200, response.status_code assert response.content == Path('static/js/actionMenuOrder.js').read_bytes() assert response.headers['content-type'].startswith('text/javascript'), response.headers assert response.headers['cache-control'] == 'no-cache', response.headers assert "script-src 'self' 'nonce-" in response.headers['content-security-policy'], response.headers assert client.get('/frontend/src/shared/actionMenuOrder.js').status_code == 404 assert client.get('/static/%2e%2e/app.py').status_code == 404 shell = client.get('/') assert shell.status_code == 200, shell.status_code assert '{{CSP_NONCE}}' not in shell.text assert '/static/app.js' in shell.text print('PASS: isolated Python lifespan, shell, deployed bytes, MIME, revalidation, CSP and source-tree 404') """ def main() -> int: with tempfile.TemporaryDirectory(prefix="ody-f1-distribution-") as directory, socket.socket() as chroma_guard: target = Path(directory) for name in ("app.py", "HARNESS_VERSION"): shutil.copy2(ROOT / name, target / name) for name in ("core", "routes", "src", "services", "resources", "mcp_servers", "companion", "config", "static", "scripts"): shutil.copytree(ROOT / name, target / name, ignore=shutil.ignore_patterns("__pycache__", "node_modules", ".env", "secrets.env*", "*.db", "*.sqlite*")) # Reserve a non-listening port so initialization cannot reach a real store. chroma_guard.bind(("127.0.0.1", 0)) env = dict(os.environ) env.update( ODYSSEUS_DATA_DIR=str(target / "data"), DATABASE_URL="sqlite:///:memory:", AUTH_ENABLED="false", ODYSSEUS_STARTUP_WARMUPS="0", ODYSSEUS_TOOL_INDEX_PREWARM="0", CHROMADB_HOST="127.0.0.1", CHROMADB_PORT=str(chroma_guard.getsockname()[1]), FASTEMBED_CACHE_PATH=str(target / "fastembed"), PATH=str(target / "no-development-tools"), ) # A caller's Python search path must not import the original checkout. env.pop("PYTHONPATH", None) outputs = [entry['deployment'] for entry in json.loads( (ROOT / 'frontend/modules.json').read_text(encoding='utf-8') )['modules']] result = subprocess.run([sys.executable, "-c", PROBE, json.dumps(outputs)], cwd=target, env=env, capture_output=True, text=True, timeout=60) print(result.stdout, end="") if result.returncode: print(result.stderr[-8000:], file=sys.stderr) return result.returncode if __name__ == "__main__": raise SystemExit(main())