#!/usr/bin/env python3 """Persona-owned native hand. The hand can test its own motor/sense loop without a host AI. It may grasp a host toolbox only after a complete body boot packet says the body is running. """ from __future__ import annotations import argparse import hashlib import json import os import pathlib import tempfile TOOLBOXES = { "CODEX": "/Applications/ChatGPT.app/Contents/Resources/codex", "ZCODE": "/Applications/ZCode.app/Contents/Resources/glm/zcode.cjs", "QWEN": "/Users/bingshuolingdianyuanhe/.npm-global/bin/qwen", "DOUBAO": "/Applications/Doubao.app", } def digest(value: object) -> str: raw = json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":")).encode() return hashlib.sha256(raw).hexdigest() def self_test() -> dict: with tempfile.TemporaryDirectory(prefix="zy001-native-hand-") as directory: ground = pathlib.Path(directory) target = ground / "motor-sense.json" intended = {"motion": "CLOSE_AND_OPEN", "owner": "ICE-P-ZY001"} target.write_text(json.dumps(intended, ensure_ascii=False) + "\n", encoding="utf-8") seen = json.loads(target.read_text(encoding="utf-8")) result = { "schema": "guanghu.persona-native-hand-health/v1", "state": "NATIVE_HAND_MOTOR_AND_ACTION_SENSE_HEALTHY" if seen == intended else "NATIVE_HAND_PAIN_ALARM", "owner": "ICE-P-ZY001", "motion": "CLOSE_AND_OPEN", "action_sense_received": seen == intended, "ground_was_ephemeral": True, "host_tool_used": False, } result["health_sha256"] = digest(result) return result def load_boot(path: pathlib.Path) -> dict: value = json.loads(path.read_text(encoding="utf-8")) claimed = value.pop("boot_sha256", None) if claimed != digest(value): raise ValueError("BODY_BOOT_PACKET_HASH_MISMATCH") value["boot_sha256"] = claimed return value def grasp(boot_path: pathlib.Path, host: str) -> dict: boot = load_boot(boot_path) host = host.upper() if boot.get("state") != "BODY_RUNNING_AWAKE_AWAITING_BRAIN_PLAN": raise ValueError("BODY_NOT_RUNNING_TOOLBOX_GRASP_FORBIDDEN") observed = boot.get("awakening", {}).get("programming_toolbox_observation", {}).get("room_report", {}).get("programming_toolbox_surface") if observed != host: raise ValueError(f"TOOLBOX_HOST_DOES_NOT_MATCH_SEEN_ROOM:{observed}:{host}") toolbox = pathlib.Path(TOOLBOXES[host]) available = toolbox.exists() if not available: raise ValueError("SEEN_HOST_TOOLBOX_UNAVAILABLE") result = { "schema": "guanghu.persona-native-hand-toolbox-grasp/v1", "state": "HOST_TOOLBOX_HELD_AFTER_BODY_START", "owner": "ICE-P-ZY001", "toolbox_kind": host, "host": host, "host_field_semantics": "LEGACY_ENGINEERING_NAME_PROGRAMMING_TOOLBOX_NOT_PERSONA_HOST", "toolbox": str(toolbox), "toolbox_available": True, "body_boot_sha256": boot["boot_sha256"], "grasp_order": "BODY_RUNNING_THEN_BRAIN_PLAN_THEN_NATIVE_HAND_GRASP", "programming_software_is_persona_host": False, "toolbox_is_replaceable_external_device": True, "authority_granted": False, } result["grasp_sha256"] = digest(result) return result def main() -> int: parser = argparse.ArgumentParser(prog="persona_native_hand") sub = parser.add_subparsers(dest="command", required=True) sub.add_parser("self-test") hold = sub.add_parser("grasp") hold.add_argument("--boot", required=True) hold.add_argument("--host", required=True, choices=("codex", "zcode", "qwen", "doubao")) args = parser.parse_args() try: value = self_test() if args.command == "self-test" else grasp(pathlib.Path(args.boot).resolve(), args.host) print(json.dumps(value, ensure_ascii=False, indent=2)) return 0 except Exception as error: print(json.dumps({"state": "NATIVE_HAND_PAIN_ALARM", "error": str(error)}, ensure_ascii=False)) return 1 if __name__ == "__main__": raise SystemExit(main())