oracle7-chameleon / scripts /capture_module_pilot.py
psiloceyeben's picture
Upload folder using huggingface_hub
09aeaeb verified
Raw History Blame Contribute Delete
4.52 kB
"""Bounded syntax-only module discovery and optional pinned subset expansion."""
import argparse
import json
import shutil
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "packages/core"))
from chameleon_core.entry_capture import capture_entry
from chameleon_core.module_completion import complete_modules
from chameleon_core.repository_capture import safe_path, verify_package
from chameleon_core.windows_job import run_bounded
def plan_package(package, output):
output.mkdir(exist_ok=False)
node = shutil.which("node")
if not node:
raise ValueError("NODE_UNAVAILABLE")
runtime = run_bounded(
[node, str(ROOT / "scripts/module_dependency_driver.mjs")], json.dumps(package), ROOT
)
stdout = runtime.pop("stdout")
(output / "runtime.json").write_text(json.dumps(runtime, indent=2), encoding="utf-8")
if (
runtime.get("returncode") != 0
or runtime.get("remaining_job_processes") != 0
or any(
runtime.get(k) is not False
for k in ("timed_out", "cpu_budget_exhausted", "output_budget_exhausted")
)
):
raise ValueError("MODULE_PARSER_EXECUTION_FAILED")
plan = json.loads(stdout)
(output / "plan.json").write_text(json.dumps(plan, indent=2), encoding="utf-8")
return plan
def main():
parser = argparse.ArgumentParser()
parser.add_argument("package")
parser.add_argument("output")
parser.add_argument("--capture", action="store_true")
parser.add_argument("--transitive", action="store_true")
args = parser.parse_args()
source, output = Path(args.package).resolve(), Path(args.output).resolve()
pilot = ROOT / ".local/repository-pilot"
if (
not source.is_relative_to(pilot)
or not output.is_relative_to(pilot)
or output == pilot
or source.stat().st_size > 8 * 1024 * 1024
):
raise ValueError("MODULE_PILOT_BOUNDARY")
package = json.loads(source.read_text(encoding="utf-8"))
verify_package(package)
output.mkdir(exist_ok=False)
if args.transitive:
if not args.capture:
raise ValueError("TRANSITIVE_REQUIRES_CAPTURE")
def save(candidate, index):
(output / f"package-{index}.json").write_text(json.dumps(candidate), encoding="utf-8")
save(package, 0)
try:
result = complete_modules(
package, lambda p, i: plan_package(p, output / f"round-{i}"), capture_entry, save
)
except (ValueError, RuntimeError) as exc:
result = {"status": "FAILED", "reason": str(exc)[:500]}
(output / "completion.json").write_text(json.dumps(result, indent=2), encoding="utf-8")
print(json.dumps(result))
if result["status"] != "LOCAL_DEPENDENCIES_CAPTURED":
raise SystemExit(1)
return
node = shutil.which("node")
if not node:
raise ValueError("NODE_UNAVAILABLE")
runtime = run_bounded(
[node, str(ROOT / "scripts/module_dependency_driver.mjs")], json.dumps(package), ROOT
)
stdout = runtime.pop("stdout")
(output / "runtime.json").write_text(json.dumps(runtime, indent=2), encoding="utf-8")
if (
runtime.get("returncode") != 0
or runtime.get("remaining_job_processes") != 0
or any(
runtime.get(k) is not False
for k in ("timed_out", "cpu_budget_exhausted", "output_budget_exhausted")
)
):
raise ValueError("MODULE_PARSER_EXECUTION_FAILED")
plan = json.loads(stdout)
if plan["package_digest"] != package["digest"] or len(plan["paths"]) > 16:
raise ValueError("MODULE_PLAN_BINDING_FAILED")
for name in plan["paths"]:
safe_path(name)
(output / "plan.json").write_text(json.dumps(plan, indent=2), encoding="utf-8")
if args.capture and plan["paths"]:
repo = package["repository"]
paths = sorted(set(plan["paths"]) | set(repo.get("projection", {}).get("additional_local_paths", [])))
expanded = capture_entry(
repo["source"] + "/tree/" + repo["commit_sha"], repo["entry"], additional_paths=paths
)
if any(expanded["repository"]["files"].get(n) != v for n, v in repo["files"].items()):
raise ValueError("MODULE_CAPTURE_EXISTING_BYTES_CHANGED")
(output / "expanded.json").write_text(json.dumps(expanded), encoding="utf-8")
print(json.dumps(plan))
if __name__ == "__main__":
main()