"""계산 등록부 파이썬 실행기(PLAN 472-3 3-B) — 등록부 id 를 받아 서버 Node 입구 하나를 부름. 등록부 = `A00_Common/design/logic/design_calc_registry.ts` · 입구 = `design_calc_node.ts` (`build:design-calc`). 부름은 `common_util_node_bundle.run_bundle_json` 한 길 · 계산 없음. `NODE_IDS` = 등록부에서 실행기가 `node:` 인 줄(같은지 시험 `test_472_3_calc_runner.py`). 입력 꼴 = 입구 머리(`detail` · `route_points` · `context` · `excavation`). """ from __future__ import annotations from collections.abc import Sequence from pathlib import Path from typing import Any from common_util.common_util_node_bundle import run_bundle_json ROOT = Path(__file__).resolve().parents[1] BUNDLE = ROOT / "config" / "design_calc_node" / "design_calc_node.js" NPM_SCRIPT = "build:design-calc" NODE_IDS = frozenset( { "structure.layouts", "masshaul.cumulative", "haul.plan", "excavation.trench", "corridor.mesh", "profile.seat", "facility.plus_follow", "facility.follow", "cross.design", "cross.berm_spans", "facility.rebase", "stations.carry", } ) def run_calc(ids: Sequence[str], inputs: dict[str, Any]) -> dict[str, Any] | None: """id 들을 한 번에 돌려 `{id: 값}` · 묶음 실패는 None · Node 실행기 아닌 id 는 ValueError.""" unknown = [item for item in ids if item not in NODE_IDS] if unknown: raise ValueError(f"Node 실행기 아닌 id: {', '.join(unknown)}") output = run_bundle_json(BUNDLE, NPM_SCRIPT, {"run": list(ids), "inputs": inputs}) return output.get("results") if isinstance(output, dict) else None