← Files LegalQuants TransactionalARCHIVED FILE

skills/timenarratives/scripts/packet_io.py

3.55 KB · Oct 3, 2026 · 06:34 UTC

↓ Download file

"""Atomic packet output and the command-line boundary."""

from __future__ import annotations

import argparse
import json
import math
import sys
from collections.abc import Callable
from pathlib import Path
from typing import Any

from canonical_json import pretty_json_bytes
from packet_core import PacketBuildError
from safe_output import OutputSafetyError, publish_owned_directory, write_new_bytes
from source_paths import SourcePathError, validate_source_root

CompilePacket = Callable[[Any, Path], dict]


class RequestFormatError(ValueError):
    pass


def _unique_object(pairs: list[tuple[str, Any]]) -> dict[str, Any]:
    value: dict[str, Any] = {}
    for key, item in pairs:
        if key in value:
            raise RequestFormatError("duplicate request key")
        value[key] = item
    return value


def _reject_constant(value: str) -> None:
    raise RequestFormatError("non-standard JSON numeric constant")


def _finite_float(value: str) -> float:
    parsed = float(value)
    if not math.isfinite(parsed):
        raise RequestFormatError("non-finite JSON number")
    return parsed


def _read_request(path: Path) -> Any:
    text = path.read_text(encoding="utf-8")
    return json.loads(
        text,
        object_pairs_hook=_unique_object,
        parse_constant=_reject_constant,
        parse_float=_finite_float,
    )


def compile_to_file(
    compile_packet: CompilePacket,
    request: Any,
    source_root: Path,
    output: Path,
) -> dict:
    target = Path(output)
    result = compile_packet(request, Path(source_root))
    write_new_bytes(target, pretty_json_bytes(result), forbidden_roots=(source_root,))
    return result


def compile_to_directory(
    compile_packet: CompilePacket,
    request: Any,
    source_root: Path,
    run_dir: Path,
) -> dict:
    result = compile_packet(request, Path(source_root))
    publish_owned_directory(
        Path(run_dir),
        {"packet.private.json": pretty_json_bytes(result)},
        forbidden_roots=(source_root,),
    )
    return result


def _failure(code: str, exit_code: int) -> int:
    print(f"packet build failed: {code}", file=sys.stderr)
    return exit_code


def run_cli(
    compile_packet: CompilePacket,
    argv: list[str] | None = None,
    *,
    description: str | None = None,
) -> int:
    parser = argparse.ArgumentParser(description=description)
    parser.add_argument("--request", required=True)
    parser.add_argument("--source-root", required=True)
    parser.add_argument("--out", required=True)
    args = parser.parse_args(argv)
    try:
        request = _read_request(Path(args.request))
    except OSError:
        return _failure("operational_failure", 2)
    except (UnicodeError, json.JSONDecodeError, RequestFormatError):
        return _failure("invalid_request", 1)
    try:
        source_root = validate_source_root(Path(args.source_root))
    except SourcePathError:
        return _failure("operational_failure", 2)
    try:
        result = compile_packet(request, source_root)
    except PacketBuildError:
        return _failure("invalid_request", 1)
    except Exception:
        return _failure("operational_failure", 2)
    try:
        write_new_bytes(
            Path(args.out),
            pretty_json_bytes(result),
            protected_paths=(args.request,),
            forbidden_roots=(source_root,),
        )
    except OutputSafetyError as exc:
        return _failure(f"operational_failure:{exc.args[0]}", 2)
    except BaseException:
        return _failure("operational_failure", 2)
    print(json.dumps({"status": result["status"], "runId": result["runId"]}))
    return 0

SHA-256: 54cfaf1f2b578234ea940e37be5e5e9aeac46fb9035ec7ebcf43d682744f0c3d