#!/bin/bash # LW-LINK thin host shell. Canonical semantics: # TC-TCS核心卷/TCS-ZCODE-LANGUAGE-WORLD-LINK-0001.tcs + BRIDGE/tools/lw-link-gate.mjs set -uo pipefail GATE="/Volumes/JZAO/铸渊-ICE-GL-ZY001/BRIDGE/tools/lw-link-gate.mjs" ACTION="${1:-hook}" find_node() { if command -v node >/dev/null 2>&1; then command -v node return 0 fi local user_name candidate user_name="$(/usr/bin/id -un)" for candidate in \ "/Users/$user_name/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/bin/node" \ "/opt/homebrew/bin/node" \ "/usr/local/bin/node"; do if [ -x "$candidate" ]; then printf '%s\n' "$candidate" return 0 fi done return 1 } # Gate tool unreadable = volume gone = RED for mutation tools (E3/E1: fail closed). # Only the recovery event keeps a readable error path. if [ ! -r "$GATE" ]; then if [ "$ACTION" = "hook" ]; then printf '%s\n' "【LW-LINK ○红·断连】原因:GATE_TOOL_UNREADABLE(移动硬盘未挂载?) | 已拦截本次改动类调用 | 恢复:重新挂载JZAO后走 zhuyuan-recovery-zcode 恢复流程" >&2 exit 2 fi exit 0 fi # broadcast: inject the tower's current confidence projection (SessionStart). # ZCode parses stdout as strict JSON, so emit additionalContext. if [ "$ACTION" = "broadcast" ]; then PROJECTION="/Volumes/JZAO/铸渊-ICE-GL-ZY001/FIFTH-DOMAIN-BROADCAST-TOWER/broadcast/current.md" if [ -r "$PROJECTION" ]; then /usr/bin/python3 -c 'import json,sys; print(json.dumps({"additionalContext": open(sys.argv[1]).read()}, ensure_ascii=False))' "$PROJECTION" else /usr/bin/python3 -c 'import json; print(json.dumps({"additionalContext": "【第五域广播塔缺失】宣告投影不可读;改动类工具将被LW-LINK拦截直至塔恢复。"}, ensure_ascii=False))' fi exit 0 fi NODE_BIN="$(find_node)" || { if [ "$ACTION" = "hook" ]; then printf '%s\n' "【LW-LINK ○红·断连】原因:NODE_RUNTIME_NOT_FOUND | 已拦截本次改动类调用" >&2 exit 2 fi exit 0 } exec "$NODE_BIN" "$GATE" "$ACTION"