"""Publish only the reviewed public client files and pin the release to its commit.""" import argparse import json from pathlib import Path from huggingface_hub import CommitOperationAdd, HfApi def deploy(space): root = Path(__file__).resolve().parents[1] names = ["README.md", "index.html", "style.css", "bootstrap.md", "requirements.txt", ".gitignore", "docs/agent-memory-design.md", "scripts/deploy_space.py", "tests/test_memory.py", "tests/live_smoke.py"] names += [p.relative_to(root).as_posix() for p in (root / "memory-use").rglob("*") if p.is_file() and "__pycache__" not in p.parts and p.suffix != ".pyc"] api = HfApi() try: info = api.repo_info(space, repo_type="space") except Exception as exc: if getattr(getattr(exc, "response", None), "status_code", None) != 404: raise api.create_repo(space, repo_type="space", space_sdk="static", private=False) info = api.repo_info(space, repo_type="space") if info.private or info.sdk != "static": raise RuntimeError("Existing Space must already be public and static; no settings were changed.") existing = set(api.list_repo_files(space, repo_type="space")) unknown = existing - set(names) - {".gitattributes", "release.json"} if unknown: raise RuntimeError("Existing Space contains unrelated files; inspect before publishing.") if "release.json" in existing: from huggingface_hub import hf_hub_download release = json.loads(Path(hf_hub_download(space, "release.json", repo_type="space", revision=info.sha)).read_text()) if release.get("space") != space or release.get("version") is None: raise RuntimeError("Existing release descriptor does not identify this client.") operations = [] for name in names: path = root / name if path.is_symlink(): raise RuntimeError("Public release cannot contain symlinks.") operations.append(CommitOperationAdd(path_in_repo=name, path_or_fileobj=path)) source = api.create_commit(space, repo_type="space", operations=operations, parent_commit=info.sha, commit_message="Release portable agent memory client 0.1.0") descriptor = {"version": "0.1.0", "space": space, "revision": source.oid} payload = (json.dumps(descriptor, indent=2) + "\n").encode() release_commit = api.create_commit(space, repo_type="space", parent_commit=source.oid, operations=[CommitOperationAdd(path_in_repo="release.json", path_or_fileobj=payload)], commit_message="Pin bootstrap client to the published source revision") (root / "release.json").write_bytes(payload) return {"space": f"https://huggingface.co/spaces/{space}", "client_revision": source.oid, "release_commit": release_commit.oid, "files": len(names)} if __name__ == "__main__": p = argparse.ArgumentParser(description=__doc__) p.add_argument("--space", required=True) args = p.parse_args() try: print(json.dumps(deploy(args.space), indent=2)) except Exception as exc: # SDK errors may contain signed URLs. Keep deployment diagnostics credential-free. if isinstance(exc, RuntimeError): print(str(exc)) else: print(f"Deployment failed ({type(exc).__name__}); check HF authentication and permissions.") raise SystemExit(1)