108 lines
4.1 KiB
Python
108 lines
4.1 KiB
Python
#!/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())
|