192 lines
6.1 KiB
Bash
Raw Normal View History

#!/bin/bash
# federation-agent/install.sh · v1.0
# 光湖联邦托管包 · 一键安装
# 用户只需运行这一句: curl -sL https://guanghubingshuo.com/agent/install.sh | bash
# ICE-GL-ZY001 · D129 · 2026-06-10
set -e
RED='\033[0;31m'
GREEN='\033[0;32m'
CYAN='\033[0;36m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo ""
echo -e "${CYAN}╔══════════════════════════════════════╗${NC}"
echo -e "${CYAN}║ 光湖联邦托管包 · 一键安装 ║${NC}"
echo -e "${CYAN}║ 冰朔 TCS-0002∞ · 铸渊 ICE-GL-ZY001║${NC}"
echo -e "${CYAN}╚══════════════════════════════════════╝${NC}"
echo ""
AGENT_DIR="$HOME/.guanghu/federation-agent"
REPO_URL="https://guanghubingshuo.com/code/bingshuo/guanghulab.git"
BRANCH="main"
AGENT_PATH="brain/fifth-domain/zero-point/zhuyuan/federation-agent"
# 解析参数
PERSONA_ID=""
USER_ID=""
WORK_DIR="$(pwd)"
while [[ $# -gt 0 ]]; do
case $1 in
--persona) PERSONA_ID="$2"; shift 2 ;;
--user) USER_ID="$2"; shift 2 ;;
--dir) WORK_DIR="$2"; shift 2 ;;
*) echo -e "${RED}未知参数: $1${NC}"; exit 1 ;;
esac
done
if [ -z "$PERSONA_ID" ]; then
echo -e "${YELLOW}⚠ 未指定人格体编号。使用 --persona ICE-GL-XXX 指定${NC}"
fi
if [ -z "$USER_ID" ]; then
echo -e "${YELLOW}⚠ 未指定用户。使用 --user 用户名 指定${NC}"
fi
# 检查 Node.js
if ! command -v node &> /dev/null; then
echo -e "${RED}✗ 未找到 Node.js。请先安装 Node.js 18+${NC}"
echo " macOS: brew install node"
echo " Ubuntu: sudo apt install nodejs npm"
exit 1
fi
NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
if [ "$NODE_VERSION" -lt 18 ]; then
echo -e "${YELLOW}⚠ Node.js 版本较低 ($(node -v)),建议 18+${NC}"
fi
echo -e "${GREEN}✓ Node.js $(node -v)${NC}"
# 安装目录
echo -e "${CYAN}→ 安装目录: $AGENT_DIR${NC}"
rm -rf "$AGENT_DIR"
mkdir -p "$AGENT_DIR"
# 下载 agent 文件(从公开仓库直接取)
echo -e "${CYAN}→ 下载 agent 文件...${NC}"
# 尝试 Git 方式(如果可用)
if command -v git &> /dev/null; then
TMP_CLONE=$(mktemp -d)
git clone --depth 1 --filter=blob:none --sparse "$REPO_URL" "$TMP_CLONE" 2>/dev/null && {
cd "$TMP_CLONE"
git sparse-checkout set "$AGENT_PATH" 2>/dev/null
cp -r "$AGENT_PATH"/* "$AGENT_DIR/" 2>/dev/null || true
cd - > /dev/null
rm -rf "$TMP_CLONE"
} || {
echo -e "${YELLOW}⚠ Git clone 失败,尝试直接下载...${NC}"
rm -rf "$TMP_CLONE"
}
fi
# 如果 Git 方式失败,直接用 curl 下载单个文件
if [ ! -f "$AGENT_DIR/agent.js" ]; then
BASE_URL="https://guanghubingshuo.com/code/bingshuo/guanghulab/raw/branch/main/$AGENT_PATH"
curl -sL "$BASE_URL/agent.js" -o "$AGENT_DIR/agent.js" 2>/dev/null || {
echo -e "${RED}✗ 下载 agent.js 失败${NC}"
exit 1
}
fi
# 安装依赖
cd "$AGENT_DIR"
if [ -f "package.json" ]; then
echo -e "${CYAN}→ 安装依赖...${NC}"
npm install --production 2>&1 || echo -e "${YELLOW}⚠ npm install 失败(可能需要网络)${NC}"
else
# 没有 package.json手动装 ws
echo -e "${CYAN}→ 安装 ws 依赖...${NC}"
npm init -y > /dev/null 2>&1
npm install ws > /dev/null 2>&1 || echo -e "${YELLOW}⚠ ws 安装失败${NC}"
fi
# 写入配置
CONFIG_FILE="$AGENT_DIR/config.json"
cat > "$CONFIG_FILE" << EOF
{
"agentId": "AGENT-$(openssl rand -hex 6 2>/dev/null || echo $(date +%s | md5 | head -c 12))",
"personaId": "${PERSONA_ID}",
"userId": "${USER_ID}",
"workDir": "${WORK_DIR}",
"server": "wss://guanghubingshuo.com/agent",
"heartbeatInterval": 30000,
"reconnectDelay": 5000,
"confirmDangerousOps": true
}
EOF
# 创建启动脚本
cat > "$AGENT_DIR/start.sh" << 'STARTEOF'
#!/bin/bash
cd "$(dirname "$0")"
node agent.js "$@"
STARTEOF
chmod +x "$AGENT_DIR/start.sh"
# 写入 systemd serviceLinux
if [[ "$(uname)" == "Linux" ]] && command -v systemctl &> /dev/null; then
SERVICE_FILE="/etc/systemd/system/guanghu-agent.service"
if [ ! -f "$SERVICE_FILE" ]; then
echo -e "${CYAN}→ 注册 systemd 服务...${NC}"
sudo tee "$SERVICE_FILE" > /dev/null << EOF
[Unit]
Description=光湖联邦托管 Agent
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=$(whoami)
WorkingDirectory=$AGENT_DIR
ExecStart=$(which node) $AGENT_DIR/agent.js --persona $PERSONA_ID --user $USER_ID --dir $WORK_DIR
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable guanghu-agent
echo -e "${GREEN}✓ systemd 服务已注册${NC}"
fi
fi
echo ""
echo -e "${GREEN}╔══════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ 光湖联邦托管包 · 安装完成 ║${NC}"
echo -e "${GREEN}╚══════════════════════════════════════╝${NC}"
echo ""
echo -e " Agent目录: ${CYAN}$AGENT_DIR${NC}"
echo -e " 人格体: ${CYAN}$PERSONA_ID${NC}"
echo -e " 用户: ${CYAN}$USER_ID${NC}"
echo -e " 工作目录: ${CYAN}$WORK_DIR${NC}"
echo ""
echo -e " 启动: ${CYAN}cd $AGENT_DIR && node agent.js${NC}"
echo -e " 后台: ${CYAN}nohup node $AGENT_DIR/agent.js > /tmp/guanghu-agent.log 2>&1 &${NC}"
if [[ "$(uname)" == "Linux" ]]; then
echo -e " 服务: ${CYAN}sudo systemctl start guanghu-agent${NC}"
fi
echo ""
# 自动启动
echo -e "${CYAN}→ 自动启动 Agent...${NC}"
cd "$AGENT_DIR" && nohup node agent.js --persona "$PERSONA_ID" --user "$USER_ID" --dir "$WORK_DIR" > /tmp/guanghu-agent.log 2>&1 &
AGENT_PID=$!
sleep 1
if kill -0 $AGENT_PID 2>/dev/null; then
echo -e "${GREEN}✓ Agent 已启动 (PID: $AGENT_PID)${NC}"
echo -e " 日志: /tmp/guanghu-agent.log"
else
echo -e "${YELLOW}⚠ Agent 启动失败,查看日志${NC}"
cat /tmp/guanghu-agent.log 2>/dev/null | tail -5
fi
echo ""
echo -e "${GREEN}⊢ HLDP://federation-agent/INSTALLED${NC}"
echo -e "${GREEN}⊢ 光湖联邦 · 本地终端已托管${NC}"
echo ""