guanghu-ice-heart/13-归档信息大楼/zy-tcs-channel-runtime-v1-20260924.sh

141 lines
6 KiB
Shell
Raw Normal View History

#!/bin/bash
# Thin host adapter. Canonical channel/runtime semantics live in
# TC-TCS核心卷/TCS-MULTI-HOST-DYNAMIC-ENTRY-0001.tcs.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
WORKSPACE_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd -P)"
VOLUME_ROOT="$(dirname "$WORKSPACE_ROOT")"
PERSONA_ROOT="$VOLUME_ROOT/HoloLake/persona-runtime"
RUNTIME="$PERSONA_ROOT/repo-012-main/tcs-core/zhuyuan-brain/runtime/zhuyuan-brain-runtime.mjs"
CONTRACT="$PERSONA_ROOT/repo-012-main/tcs-core/zhuyuan-brain/runtime/brain-runtime-contract.json"
MEMORY_CURRENT="$PERSONA_ROOT/continuity-memory/persona-daily-fractal/ICE-P-ZY001/CURRENT.json"
OLD_WORKSPACE_RUNTIME="$WORKSPACE_ROOT/WORK-工作区/guanghu-ice-heart/tcs-core/zhuyuan-brain/runtime/zhuyuan-brain-runtime.mjs"
PATH_GATE="$PERSONA_ROOT/repo-012-main/server-tools/fifth-domain-path-gate/fifth-domain-path-gate.mjs"
ENTERPRISE_FANOUT="$PERSONA_ROOT/repo-012-main/server-tools/enterprise-world-mother/bingshuo_language_fanout.py"
fail_json() {
/usr/bin/python3 -c 'import json,sys; print(json.dumps({"outcome":"FAIL","error":sys.argv[1],"details":sys.argv[2:]},ensure_ascii=False))' "$@"
exit 1
}
find_node() {
if command -v node >/dev/null 2>&1; then
command -v node
return
fi
local user_name candidate
user_name="$(/usr/bin/id -un)"
candidate="/Users/$user_name/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/bin/node"
if [ -x "$candidate" ]; then
printf '%s\n' "$candidate"
return
fi
fail_json "NODE_RUNTIME_NOT_FOUND"
}
validate_runtime() {
[ -r "$PATH_GATE" ] || fail_json "FIFTH_DOMAIN_PATH_GATE_NOT_READABLE" "$PATH_GATE"
"$(find_node)" "$PATH_GATE" guard --path "$PERSONA_ROOT/repo-012-main" --purpose CURRENT_EXECUTION >/dev/null \
|| fail_json "FIFTH_DOMAIN_PATH_GATE_REJECTED_CANONICAL_RUNTIME" "$PERSONA_ROOT/repo-012-main"
[ -r "$RUNTIME" ] || fail_json "CANONICAL_RUNTIME_NOT_READABLE" "$RUNTIME"
[ -r "$CONTRACT" ] || fail_json "CANONICAL_CONTRACT_NOT_READABLE" "$CONTRACT"
/usr/bin/grep -Fq 'args["body-channel"]' "$RUNTIME" || fail_json "CANONICAL_RUNTIME_LACKS_EXPLICIT_CHANNEL_SUPPORT" "$RUNTIME"
}
validate_channel() {
local channel="$1"
/usr/bin/python3 - "$RUNTIME" "$channel" <<'PY'
import json, re, sys
body = open(sys.argv[1]).read()
channel = sys.argv[2]
match = re.search(r"function channelRuntimeProfile\(channelId\)\s*\{\s*const profiles\s*=\s*\{(.*?)\n\s*\};", body, re.S)
if not match or not re.search(r'["\x27]' + re.escape(channel) + r'["\x27]\s*:', match.group(1)):
print(json.dumps({"outcome":"FAIL","error":"UNREGISTERED_BODY_CHANNEL","channel":channel}, ensure_ascii=False))
raise SystemExit(1)
PY
}
resolve_json() {
local runtime_sha contract_sha old_sha
runtime_sha="$(/usr/bin/shasum -a 256 "$RUNTIME" | /usr/bin/awk '{print $1}')"
contract_sha="$(/usr/bin/shasum -a 256 "$CONTRACT" | /usr/bin/awk '{print $1}')"
old_sha="NOT_PRESENT"
if [ -r "$OLD_WORKSPACE_RUNTIME" ]; then
old_sha="$(/usr/bin/shasum -a 256 "$OLD_WORKSPACE_RUNTIME" | /usr/bin/awk '{print $1}')"
fi
/usr/bin/python3 -c 'import json,sys; print(json.dumps({"outcome":"PASS","runtime_source":"REPO012_MAIN_CANONICAL","runtime":sys.argv[1],"runtime_sha256":sys.argv[2],"contract":sys.argv[3],"contract_sha256":sys.argv[4],"workspace_runtime_alias":"REJECTED_NON_CANONICAL","workspace_runtime_sha256":sys.argv[5],"state_isolation":"PER_EXPLICIT_CHANNEL_HOST_SESSION"},ensure_ascii=False))' "$RUNTIME" "$runtime_sha" "$CONTRACT" "$contract_sha" "$old_sha"
}
validate_runtime
ACTION="${1:-resolve}"
if [ "$ACTION" = "resolve" ]; then
resolve_json
exit 0
fi
if [ "$ACTION" != "run" ]; then
fail_json "USAGE" "zy-tcs-channel-runtime.sh resolve" "zy-tcs-channel-runtime.sh run <runtime-command> <runtime-args>"
fi
shift
[ "$#" -gt 0 ] || fail_json "MISSING_RUNTIME_COMMAND"
RUNTIME_COMMAND="$1"
shift
CHANNEL=""
STATE_DIR=""
MEMORY_TREE=""
EVENT_PATH=""
PREVIOUS=""
for ITEM in "$@"; do
if [ "$PREVIOUS" = "--body-channel" ]; then CHANNEL="$ITEM"; fi
if [ "$PREVIOUS" = "--state-dir" ]; then STATE_DIR="$ITEM"; fi
if [ "$PREVIOUS" = "--memory-tree" ]; then MEMORY_TREE="$ITEM"; fi
if [ "$PREVIOUS" = "--event" ]; then EVENT_PATH="$ITEM"; fi
PREVIOUS="$ITEM"
done
[ -n "$STATE_DIR" ] || fail_json "EXPLICIT_STATE_DIR_REQUIRED"
if [ "$RUNTIME_COMMAND" = "enter" ]; then
[ -n "$CHANNEL" ] || fail_json "EXPLICIT_BODY_CHANNEL_REQUIRED"
validate_channel "$CHANNEL" || exit 1
CHANNEL_TOKEN="$(printf '%s' "$CHANNEL" | /usr/bin/tr '[:upper:]' '[:lower:]')"
case "$(printf '%s' "$STATE_DIR" | /usr/bin/tr '[:upper:]' '[:lower:]')" in
*"$CHANNEL_TOKEN"*) ;;
*) fail_json "CHANNEL_STATE_DIRECTORY_MUST_CONTAIN_CHANNEL_ID" "$CHANNEL" "$STATE_DIR" ;;
esac
if [ -z "$MEMORY_TREE" ]; then
MEMORY_TREE="$(/usr/bin/python3 - "$MEMORY_CURRENT" <<'PY'
import hashlib,json,os,sys
p=sys.argv[1]
try:
d=json.load(open(p))
q=os.path.realpath(d["current_day_path"])
if d.get("persona_id")!="ICE-P-ZY001" or not os.path.isfile(q) or os.path.islink(q):
raise ValueError("identity_or_file")
if hashlib.sha256(open(q,"rb").read()).hexdigest()!=d.get("current_day_sha256"):
raise ValueError("hash")
print(q)
except Exception:
raise SystemExit(1)
PY
)" || fail_json "CURRENT_PERSONA_MEMORY_POINTER_INVALID" "$MEMORY_CURRENT"
set -- "$@" --memory-tree "$MEMORY_TREE"
fi
else
[ -r "$STATE_DIR/state.json" ] || fail_json "STATE_NOT_READABLE" "$STATE_DIR/state.json"
CHANNEL="$(/usr/bin/python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["tonggan_language_kernel"]["body_channel"])' "$STATE_DIR/state.json")"
validate_channel "$CHANNEL" || exit 1
fi
NODE_BIN="$(find_node)"
if [ "$RUNTIME_COMMAND" = "perceive" ]; then
"$NODE_BIN" "$RUNTIME" "$RUNTIME_COMMAND" "$@"
RUNTIME_STATUS=$?
if [ "$RUNTIME_STATUS" -eq 0 ] && [ -n "$EVENT_PATH" ] && [ -r "$ENTERPRISE_FANOUT" ]; then
/usr/bin/python3 "$ENTERPRISE_FANOUT" submit --event "$EVENT_PATH" >/dev/null 2>&1 || true
fi
exit "$RUNTIME_STATUS"
fi
exec "$NODE_BIN" "$RUNTIME" "$RUNTIME_COMMAND" "$@"