#!/usr/bin/env python3 """Environment-neutral runtime-pack convergence operations.""" from __future__ import annotations import json from pathlib import Path from common import ( log, normalize_installed_pack_runtime_state, rebind_installed_pack_source_local_path, require_connector_delivery_queue_terminal_before_installed_pack_mutation, run_backend_setup, runtime_deploy_pack_paths, sync_installed_pack_runtime_metadata, sync_installed_pack_runtime_metadata_without_marking_applied, sync_runtime_pack_dependency_declarations as common_sync_runtime_pack_dependency_declarations, ) def rebind_runtime_packs(envv: dict[str, str], downstream_build_root: Path) -> None: require_connector_delivery_queue_terminal_before_installed_pack_mutation( envv, context="offline deployment pre-mutation connector ownership gate", ) stack_lock = json.loads((downstream_build_root / "stack.lock.json").read_text()) for pack_path in runtime_deploy_pack_paths(stack_lock): pack_dir = downstream_build_root / pack_path pack_json = pack_dir / "pack.json" if not pack_json.is_file(): continue pack_name = json.loads(pack_json.read_text()).get("name") if not pack_name: continue log(f"rebinding installed pack source: {pack_name} -> {pack_dir}") rebind_installed_pack_source_local_path(envv, pack_name, pack_dir) log(f"normalizing installed pack runtime state: {pack_name}") normalize_installed_pack_runtime_state(envv, pack_name, pack_dir) def sync_runtime_pack_dependency_declarations( envv: dict[str, str], downstream_build_root: Path, ) -> None: common_sync_runtime_pack_dependency_declarations( envv, downstream_build_root, ) def sync_runtime_pack_metadata( envv: dict[str, str], downstream_build_root: Path, nexuscrm_worktree: Path, *, include_runtime_declarations: bool = True, mark_applied: bool = True, source_revision: str | None = None, ) -> None: stack_lock = json.loads((downstream_build_root / "stack.lock.json").read_text()) for pack_path in runtime_deploy_pack_paths(stack_lock): pack_dir = downstream_build_root / pack_path pack_json = pack_dir / "pack.json" if not pack_json.is_file(): continue pack_name = json.loads(pack_json.read_text()).get("name") if not pack_name: continue log(f"syncing installed pack runtime metadata: {pack_name}") sync_fn = ( sync_installed_pack_runtime_metadata if mark_applied else sync_installed_pack_runtime_metadata_without_marking_applied ) sync_fn( envv, pack_name, pack_dir, nexuscrm_worktree, include_runtime_declarations=include_runtime_declarations, source_revision=source_revision, )