#!/bin/bash
# M3 v11：给存量实例注入 trust key → 重装 llm-proxy → 验证 LLM 健康 → ingest 全链路
BASE=http://10.168.3.36:19088
INST=friend-48beca9b
C=friend-deploy-0acc642d-5c1
AUTH="Authorization: Bearer dev-admin-token"
CT="Content-Type: application/json"

echo "=== 1. 注入 trust key 并重启容器 ==="
docker exec $C sh -c 'mkdir -p /var/lib/friend-cluster && echo "release-2026=qEvynp6sTeb1a5iMkorOdhjVN0tznJIPd/MGTk/+PsE=" > /var/lib/friend-cluster/artifact-trust-key'
docker restart $C >/dev/null
echo "restarted, waiting 25s for agent+friend boot..."
sleep 25

echo "=== 2. 重发 extension.install ==="
curl -sS --max-time 15 -X POST -H "$AUTH" -H "$CT" \
  -d '{"action":"install","artifact_id":"artifact-f0ae75f6-1"}' \
  "$BASE/api/v1/instances/$INST/extension-actions" | head -c 200; echo

echo "=== 3. 轮询 extensions 状态（最多60s）==="
for i in 1 2 3 4 5 6; do
  sleep 10
  ST=$(curl -sS -H "$AUTH" "$BASE/api/v1/instances/$INST/extensions" | python3 -c "
import sys,json
try:
    e=json.load(sys.stdin)[0]
    print(e.get('state',''))
except Exception: print('err')")
  echo "[poll $i] llm-proxy state=$ST"
  [ "$ST" = "present" ] || [ "$ST" = "enabled" ] && break
done

echo "=== 4. 验证 39527 监听 ==="
docker exec $C sh -c 'cat /proc/net/tcp /proc/net/tcp6 2>/dev/null' | awk 'NR>1 {split($2,a,":"); p=strtonum("0x" a[2]); if (p==39527) print "39527_LISTENING"}'

echo "=== 5. LLM 模型健康 ==="
ITOK=$(docker exec $C sh -c "grep api_auth_token /app/config/config.yaml" | awk '{print $2}')
TTOK=$(curl -sS --max-time 10 -X POST -H "$AUTH" -H "$CT" -d '{}' "$BASE/api/v1/instances/$INST/tunnels" | python3 -c "
import sys,json,urllib.parse as u
print(u.parse_qs(u.urlparse(json.load(sys.stdin)['url']).query)['__friend_tunnel'][0])")
api() { curl -sS --max-time 15 -H "Cookie: friend_cluster_tunnel=$TTOK" -H "Authorization: Bearer $ITOK" "$BASE/panel/$INST$1"; }
api /api/llm/models | python3 -c "
import sys,json
for m in json.load(sys.stdin):
    r=m.get('runtime') or {}
    print(m.get('model_key'),'|',r.get('state'),'|',(r.get('last_error') or '')[:80])"

echo "=== 6. ingest 注入测试消息 ==="
TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
docker exec $C sh -c "wget -qO- --header='Authorization: Bearer $ITOK' --header='Content-Type: application/json' --post-data='{\"platform\":\"yunwo\",\"platform_user_id\":\"u97\",\"platform_chat_id\":\"chat97\",\"message_type\":\"text\",\"content\":{\"parts\":[{\"type\":\"text\",\"text\":\"请用一句话介绍你自己\"}]},\"timestamp\":\"$TS\"}' http://127.0.0.1:8787/ingest 2>&1"

echo "=== 7. 轮询主链节点（最多90s）等 LLM 回复 ==="
MAINID=c89441e6-1962-4048-807c-db4f011f9336
for i in 1 2 3 4 5 6; do
  sleep 15
  OUT=$(api "/api/chains/$MAINID/nodes")
  INFO=$(echo "$OUT" | python3 -c "
import sys,json
nodes=json.load(sys.stdin)
types=[n.get('type') for n in nodes]
print(len(nodes),'|',','.join(types))" 2>/dev/null)
  echo "[poll $i] nodes=$INFO"
  echo "$INFO" | grep -qE "assistant|transmission|tool_call" && { echo "$OUT" | python3 -c "
import sys,json
for n in json.load(sys.stdin)[-3:]:
    p=n.get('payload') or {}
    t=str(p)[:200]
    print(n.get('seq'), n.get('type'), t)"; break; }
done

echo "=== 8. brain 日志尾部 ==="
docker exec $C sh -c 'grep -E "brain\.|llm\." /var/lib/friend/logs/friend.log 2>/dev/null' | tail -8
echo DONE
