@neomei/agent-soul-framework 4.5.2 → 4.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -19
- package/connectors/feishu/background.sh +2 -2
- package/connectors/feishu/core-start.sh +20 -10
- package/connectors/feishu/hooks/on-session-created.sh +1 -1
- package/connectors/feishu/hooks/on-session-idle.sh +1 -1
- package/connectors/feishu/model-failover.sh +15 -3
- package/connectors/feishu/restart-all.sh +5 -4
- package/connectors/feishu/restart-feishu.sh +1 -1
- package/connectors/feishu/restart-serve.sh +1 -1
- package/connectors/feishu/scripts/session-cleanup.sh +1 -1
- package/connectors/feishu/start.sh +1 -1
- package/connectors/feishu/stop.sh +3 -4
- package/connectors/feishu/systemd/install-systemd.sh +11 -2
- package/connectors/feishu/systemd/sleep-hooks/99-hunqi-resume.sh +1 -1
- package/connectors/feishu/watchdog.sh +1 -1
- package/dist/cli/hunqi.d.ts +1 -1
- package/dist/cli/hunqi.js +49 -200
- package/dist/cli/hunqi.js.map +1 -1
- package/heartbeat_wrapper.sh +1 -1
- package/hunqi.sh +1 -1
- package/install.sh +13 -280
- package/package.json +4 -4
- package/scripts/content-filter.js +3 -1
- package/scripts/health-check.sh +2 -2
- package/scripts/session-cleanup.sh +1 -1
- package/start-feishu-daemon.sh +2 -2
- package/start.sh +1 -1
- package/test.sh +1 -1
- package/uninstall.sh +13 -2
- package/verify.sh +1 -1
- package/setup-wizard.sh +0 -420
- package/setup.sh +0 -128
package/install.sh
CHANGED
|
@@ -3,299 +3,32 @@
|
|
|
3
3
|
# 用法: curl -fsSL https://raw.githubusercontent.com/NeoMei/agent-soul-framework/master/install.sh | bash
|
|
4
4
|
set -e
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
trap 'echo "❌ 安装脚本在第 ${LINENO} 行出错: $BASH_COMMAND" >&2; exit 1' ERR
|
|
8
|
-
|
|
9
|
-
# 警告:如果通过管道执行且需要交互式输入,建议先下载再执行
|
|
10
|
-
if [ ! -t 0 ]; then
|
|
11
|
-
echo "⚠️ 检测到通过管道执行 (curl | bash)。建议先下载再执行以避免下载中断:"
|
|
12
|
-
echo " curl -fsSL https://raw.githubusercontent.com/NeoMei/agent-soul-framework/master/install.sh -o install.sh"
|
|
13
|
-
echo " bash install.sh"
|
|
14
|
-
echo ""
|
|
15
|
-
sleep 2
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
REPO="https://github.com/NeoMei/agent-soul-framework.git"
|
|
19
|
-
HUNQI_HOME="${HOME}/.hunqi"
|
|
20
|
-
|
|
21
|
-
echo "🔮 魂器 · Agent Soul Framework 安装脚本"
|
|
6
|
+
echo "🔮 魂器 · Agent Soul Framework"
|
|
22
7
|
echo ""
|
|
23
8
|
|
|
24
9
|
# 检查 Node.js
|
|
25
10
|
if ! command -v node &>/dev/null; then
|
|
26
|
-
echo "❌ 未检测到 Node.js,请先安装 Node.js
|
|
11
|
+
echo "❌ 未检测到 Node.js,请先安装 Node.js >= 20"
|
|
27
12
|
exit 1
|
|
28
13
|
fi
|
|
29
14
|
NODE_VERSION=$(node -v | sed 's/v//')
|
|
30
15
|
NODE_MAJOR=$(echo "$NODE_VERSION" | cut -d. -f1)
|
|
31
16
|
if [ "$NODE_MAJOR" -lt 20 ]; then
|
|
32
|
-
echo "❌ Node.js 版本过低: $NODE_VERSION,需要
|
|
17
|
+
echo "❌ Node.js 版本过低: $NODE_VERSION,需要 >= 20"
|
|
33
18
|
exit 1
|
|
34
19
|
fi
|
|
35
20
|
echo "✅ Node.js $NODE_VERSION"
|
|
36
21
|
|
|
37
|
-
#
|
|
38
|
-
if ! command -v opencode &>/dev/null; then
|
|
39
|
-
echo ""
|
|
40
|
-
echo "⚠️ 未检测到 OpenCode 引擎"
|
|
41
|
-
echo " hunqi-core 服务依赖 opencode,必须安装才能运行"
|
|
42
|
-
echo ""
|
|
43
|
-
if [ -t 0 ] || [ -e /dev/tty ]; then
|
|
44
|
-
read -p "是否自动安装 OpenCode?(Y/n) " -n 1 -r < /dev/tty
|
|
45
|
-
echo
|
|
46
|
-
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
|
|
47
|
-
echo " 正在安装 opencode-ai..."
|
|
48
|
-
npm install -g opencode-ai || {
|
|
49
|
-
echo "❌ OpenCode 安装失败"
|
|
50
|
-
echo " 请手动运行: npm install -g opencode-ai"
|
|
51
|
-
exit 1
|
|
52
|
-
}
|
|
53
|
-
echo "✅ OpenCode 已安装"
|
|
54
|
-
else
|
|
55
|
-
echo "⚠️ 跳过 OpenCode 安装"
|
|
56
|
-
echo " 请注意:hunqi-core 服务将无法启动"
|
|
57
|
-
echo " 后续手动安装: npm install -g opencode-ai"
|
|
58
|
-
fi
|
|
59
|
-
else
|
|
60
|
-
echo "⚠️ 非交互式环境,跳过 OpenCode 安装"
|
|
61
|
-
echo " 请手动运行: npm install -g opencode-ai"
|
|
62
|
-
fi
|
|
63
|
-
else
|
|
64
|
-
echo "✅ OpenCode 已安装"
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
|
-
# 检查 npm 全局安装权限
|
|
68
|
-
if ! npm prefix -g &>/dev/null; then
|
|
69
|
-
echo "❌ npm 全局目录不可写,请检查权限或配置 npm prefix"
|
|
70
|
-
exit 1
|
|
71
|
-
fi
|
|
72
|
-
|
|
73
|
-
# Python(仅在使用可选技能包时需要)
|
|
74
|
-
if command -v python3 &>/dev/null; then
|
|
75
|
-
echo "✅ Python $(python3 --version 2>&1 | cut -d' ' -f2)(可选技能包需要)"
|
|
76
|
-
else
|
|
77
|
-
echo "⚠️ Python 未安装(仅影响可选技能包 @neomei/agent-soul-skills)"
|
|
78
|
-
fi
|
|
79
|
-
|
|
80
|
-
# 检查磁盘空间(至少 500MB)
|
|
81
|
-
AVAILABLE_MB=$(df -m "$HOME" 2>/dev/null | awk 'NR==2 {print $4}')
|
|
82
|
-
if [ -n "$AVAILABLE_MB" ] && [ "$AVAILABLE_MB" -lt 500 ]; then
|
|
83
|
-
echo "❌ 磁盘空间不足: ${AVAILABLE_MB}MB 可用,至少需要 500MB"
|
|
84
|
-
exit 1
|
|
85
|
-
fi
|
|
86
|
-
|
|
87
|
-
# 检查端口占用
|
|
88
|
-
if command -v ss &>/dev/null && ss -tlnp 2>/dev/null | grep -q ":19876 "; then
|
|
89
|
-
echo "⚠️ 端口 19876 已被占用,安装完成后请确认无冲突"
|
|
90
|
-
fi
|
|
91
|
-
|
|
92
|
-
# 下载 + 构建魂器
|
|
93
|
-
echo ""
|
|
94
|
-
echo "📦 安装魂器核心框架..."
|
|
95
|
-
rm -rf "${HUNQI_HOME}/agent-soul-framework"
|
|
96
|
-
git clone --depth 1 "${REPO}" "${HUNQI_HOME}/agent-soul-framework"
|
|
97
|
-
|
|
98
|
-
cd "${HUNQI_HOME}/agent-soul-framework"
|
|
99
|
-
echo " 安装 npm 依赖..."
|
|
100
|
-
npm install || { echo "❌ npm install 失败"; exit 1; }
|
|
101
|
-
echo " 构建项目..."
|
|
102
|
-
npm run build || { echo "❌ npm run build 失败"; exit 1; }
|
|
103
|
-
|
|
104
|
-
# 全局链接核心框架
|
|
105
|
-
npm uninstall -g @neomei/agent-soul-framework @neomei/agent-soul 2>/dev/null || true
|
|
106
|
-
cd "${HUNQI_HOME}/agent-soul-framework/packages/agent-soul-framework"
|
|
107
|
-
npm link || { echo "❌ npm link 核心框架失败"; exit 1; }
|
|
108
|
-
cd "${HUNQI_HOME}/agent-soul-framework"
|
|
109
|
-
|
|
110
|
-
# 安装核心框架(channel 插件由用户按需单独安装)
|
|
111
|
-
echo "📦 安装魂器核心框架..."
|
|
112
|
-
npm install -g @neomei/agent-soul-framework@latest || {
|
|
113
|
-
echo "❌ 核心框架安装失败"
|
|
114
|
-
echo " 请检查网络连接和 npm registry 可访问性"
|
|
115
|
-
exit 1
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
# 全局链接核心框架(开发/本地 clone 模式)
|
|
119
|
-
# cd "${HUNQI_HOME}/agent-soul-framework/packages/agent-soul-framework"
|
|
120
|
-
# npm link || { echo "❌ npm link 核心框架失败"; exit 1; }
|
|
121
|
-
# cd "${HUNQI_HOME}/agent-soul-framework"
|
|
122
|
-
|
|
123
|
-
# 可选:如需飞书/企微通道,请手动安装:
|
|
124
|
-
# npm install -g @neomei/opencode-feishu @neomei/opencode-qiwei
|
|
125
|
-
|
|
126
|
-
# 初始化默认项目
|
|
127
|
-
echo "📝 初始化配置..."
|
|
128
|
-
mkdir -p "${HUNQI_HOME}"/{soul,skills,knowledge,memory/{short-term,long-term},.opencode}
|
|
129
|
-
|
|
130
|
-
# 复制模板文件(使用 while read 处理文件名中的空格)
|
|
131
|
-
find "${HUNQI_HOME}/agent-soul-framework/packages/agent-soul-framework" -name "*.example" -type f 2>/dev/null | while IFS= read -r f; do
|
|
132
|
-
rel="${f#${HUNQI_HOME}/agent-soul-framework/packages/agent-soul-framework/}"
|
|
133
|
-
target="${HUNQI_HOME}/${rel%.example}"
|
|
134
|
-
if [ ! -f "$target" ]; then
|
|
135
|
-
mkdir -p "$(dirname "$target")"
|
|
136
|
-
cp "$f" "$target"
|
|
137
|
-
fi
|
|
138
|
-
done
|
|
139
|
-
|
|
140
|
-
# 复制技能包(先清理再复制,避免嵌套目录)
|
|
141
|
-
if [ -d "${HUNQI_HOME}/skills" ]; then
|
|
142
|
-
rm -rf "${HUNQI_HOME}/skills"
|
|
143
|
-
fi
|
|
144
|
-
cp -r "${HUNQI_HOME}/agent-soul-framework/packages/agent-soul-skills/skills" "${HUNQI_HOME}/skills"
|
|
145
|
-
|
|
146
|
-
# .env(如果已存在则保留,避免覆盖用户配置)
|
|
147
|
-
ENV_FILE="${HUNQI_HOME}/.env"
|
|
148
|
-
if [ ! -f "$ENV_FILE" ]; then
|
|
149
|
-
cat > "$ENV_FILE" << 'EOF'
|
|
150
|
-
# 魂器环境配置
|
|
151
|
-
DASHSCOPE_API_KEY=
|
|
152
|
-
FEISHU_APP_ID=
|
|
153
|
-
FEISHU_APP_SECRET=
|
|
154
|
-
JIMENG_API_KEY=
|
|
155
|
-
EOF
|
|
156
|
-
fi
|
|
157
|
-
|
|
158
|
-
# 同时创建项目目录下的 .env(供脚本直接加载)
|
|
159
|
-
PROJECT_ENV="${HUNQI_HOME}/agent-soul-framework/.env"
|
|
160
|
-
if [ ! -f "$PROJECT_ENV" ]; then
|
|
161
|
-
cp "$ENV_FILE" "$PROJECT_ENV"
|
|
162
|
-
fi
|
|
163
|
-
|
|
164
|
-
# 首次心跳
|
|
165
|
-
echo "💓 初始化记忆系统..."
|
|
166
|
-
cd "${HUNQI_HOME}"
|
|
167
|
-
if command -v hunqi-heartbeat &>/dev/null; then
|
|
168
|
-
hunqi-heartbeat || {
|
|
169
|
-
echo "⚠️ 心跳初始化失败(非致命,可后续手动运行)"
|
|
170
|
-
}
|
|
171
|
-
else
|
|
172
|
-
echo "⚠️ hunqi-heartbeat 未找到,跳过心跳初始化"
|
|
173
|
-
fi
|
|
174
|
-
|
|
175
|
-
# crontab
|
|
176
|
-
if ! crontab -l 2>/dev/null | grep -q "heartbeat_wrapper"; then
|
|
177
|
-
(crontab -l 2>/dev/null || true; echo "*/30 * * * * cd ${HUNQI_HOME} && ${HUNQI_HOME}/agent-soul-framework/packages/agent-soul-framework/heartbeat_wrapper.sh") | crontab -
|
|
178
|
-
fi
|
|
179
|
-
|
|
180
|
-
# systemd 服务(可选)
|
|
181
|
-
echo ""
|
|
182
|
-
if [ "${AUTO_SYSTEMD:-0}" = "1" ]; then
|
|
183
|
-
echo "🤖 自动模式: 安装 systemd 服务..."
|
|
184
|
-
REPLY="y"
|
|
185
|
-
else
|
|
186
|
-
read -p "是否安装 systemd 服务(支持开机启动和挂起/恢复自动恢复)?(Y/n) " -n 1 -r < /dev/tty
|
|
187
|
-
echo
|
|
188
|
-
fi
|
|
189
|
-
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
|
|
190
|
-
cd "${HUNQI_HOME}/agent-soul-framework/packages/agent-soul-framework"
|
|
191
|
-
if [ -f "connectors/feishu/systemd/install-systemd.sh" ]; then
|
|
192
|
-
sudo bash connectors/feishu/systemd/install-systemd.sh
|
|
193
|
-
echo "✅ systemd 服务已安装"
|
|
194
|
-
echo " 启动核心: sudo systemctl start hunqi-core@\$USER"
|
|
195
|
-
echo " 启动飞书: sudo systemctl start channel-feishu@\$USER"
|
|
196
|
-
echo " 查看日志: sudo journalctl -u hunqi-core@\$USER -f"
|
|
197
|
-
else
|
|
198
|
-
echo "⚠️ systemd 安装脚本不存在,跳过"
|
|
199
|
-
fi
|
|
200
|
-
fi
|
|
201
|
-
|
|
202
|
-
# 配置向导(统一配置 .env + 连接器)
|
|
203
|
-
echo ""
|
|
204
|
-
if [ "${AUTO_WIZARD:-0}" = "1" ]; then
|
|
205
|
-
# 自动向导模式:
|
|
206
|
-
# - 有 tty 时,交互式运行(支持飞书扫码配置)
|
|
207
|
-
# - 无 tty 时(curl | bash),提示用户下载后单独运行
|
|
208
|
-
if [ -t 0 ]; then
|
|
209
|
-
echo "🤖 自动模式: 运行配置向导..."
|
|
210
|
-
REPLY="y"
|
|
211
|
-
else
|
|
212
|
-
echo "⚠️ 检测到管道执行,无法交互配置飞书"
|
|
213
|
-
echo " 如需完整配置(含飞书扫码),请运行:"
|
|
214
|
-
echo ""
|
|
215
|
-
echo " curl -fsSL https://raw.githubusercontent.com/NeoMei/agent-soul-framework/master/install.sh -o install.sh"
|
|
216
|
-
echo " bash install.sh"
|
|
217
|
-
echo ""
|
|
218
|
-
REPLY="n"
|
|
219
|
-
fi
|
|
220
|
-
else
|
|
221
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
222
|
-
echo ""
|
|
223
|
-
read -p "是否运行初始配置向导(设置 API Key、飞书/企微连接)?(Y/n) " -n 1 -r < /dev/tty
|
|
224
|
-
echo
|
|
225
|
-
fi
|
|
226
|
-
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
|
|
227
|
-
cd "${HUNQI_HOME}/agent-soul-framework/packages/agent-soul-framework"
|
|
228
|
-
if [ -f "setup-wizard.sh" ]; then
|
|
229
|
-
if [ "${AUTO_WIZARD:-0}" = "1" ] && [ ! -t 0 ]; then
|
|
230
|
-
# 管道模式下以非交互方式运行(只启动服务,不配置连接器)
|
|
231
|
-
NONINTERACTIVE=1 bash setup-wizard.sh
|
|
232
|
-
else
|
|
233
|
-
# 有 tty 时交互式运行(完整的配置向导,含飞书扫码)
|
|
234
|
-
bash setup-wizard.sh
|
|
235
|
-
fi
|
|
236
|
-
fi
|
|
237
|
-
fi
|
|
238
|
-
|
|
239
|
-
# 安装后验证
|
|
22
|
+
# 安装
|
|
240
23
|
echo ""
|
|
241
|
-
echo "
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
INSTALL_OK=0
|
|
248
|
-
fi
|
|
249
|
-
|
|
250
|
-
# channel 插件为可选组件,不影响核心安装成功判定
|
|
251
|
-
if command -v opencode-feishu &>/dev/null; then
|
|
252
|
-
echo " ✅ opencode-feishu 可用(可选 channel 插件)"
|
|
253
|
-
else
|
|
254
|
-
echo " ℹ️ opencode-feishu 未安装,如需飞书通道请运行: npm install -g @neomei/opencode-feishu"
|
|
255
|
-
fi
|
|
256
|
-
if command -v opencode-qiwei &>/dev/null; then
|
|
257
|
-
echo " ✅ opencode-qiwei 可用(可选 channel 插件)"
|
|
258
|
-
else
|
|
259
|
-
echo " ℹ️ opencode-qiwei 未安装,如需企微通道请运行: npm install -g @neomei/opencode-qiwei"
|
|
260
|
-
fi
|
|
24
|
+
echo "📦 npm install -g @neomei/agent-soul-framework..."
|
|
25
|
+
npm install -g @neomei/agent-soul-framework@latest || {
|
|
26
|
+
echo "❌ 安装失败,请检查网络连接"
|
|
27
|
+
exit 1
|
|
28
|
+
}
|
|
29
|
+
echo "✅ 安装完成"
|
|
261
30
|
|
|
31
|
+
# 初始化
|
|
262
32
|
echo ""
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
else
|
|
266
|
-
echo "⚠️ 安装完成,但部分组件需要手动排查"
|
|
267
|
-
fi
|
|
268
|
-
echo ""
|
|
269
|
-
if [ -f "/etc/systemd/system/hunqi-core@${USER}.service" ]; then
|
|
270
|
-
echo " ✅ systemd 服务已安装,推荐用法:"
|
|
271
|
-
echo " sudo systemctl start hunqi-core@${USER} # 启动核心"
|
|
272
|
-
echo " sudo systemctl start channel-feishu@${USER} # 启动飞书"
|
|
273
|
-
echo " sudo systemctl status channel-feishu@${USER} # 查看状态"
|
|
274
|
-
echo ""
|
|
275
|
-
echo " 前端交互(需要图形界面):"
|
|
276
|
-
echo " hunqi start # 一键启动全部服务(前台)"
|
|
277
|
-
else
|
|
278
|
-
echo " 现在运行:"
|
|
279
|
-
echo " hunqi start # 一键启动本地服务"
|
|
280
|
-
fi
|
|
281
|
-
echo ""
|
|
282
|
-
echo " 可选 channel 插件(按需安装):"
|
|
283
|
-
echo " npm install -g @neomei/opencode-feishu # 飞书通道"
|
|
284
|
-
echo " npm install -g @neomei/opencode-qiwei # 企业微信通道"
|
|
285
|
-
echo ""
|
|
286
|
-
echo " 连接器配置:"
|
|
287
|
-
echo " opencode-feishu setup # 飞书配置向导"
|
|
288
|
-
echo " opencode-feishu doctor # 检查飞书连接"
|
|
289
|
-
echo " opencode-qiwei setup # 企微配置向导"
|
|
290
|
-
echo ""
|
|
291
|
-
if [ "${BASHRC_UPDATED:-0}" -eq 1 ]; then
|
|
292
|
-
echo " 💡 PATH 已更新,请运行: source ~/.bashrc"
|
|
293
|
-
echo ""
|
|
294
|
-
fi
|
|
295
|
-
if ! command -v opencode &>/dev/null; then
|
|
296
|
-
echo " ⚠️ OpenCode 未安装,hunqi-core 服务将无法启动"
|
|
297
|
-
echo " 安装命令: npm install -g opencode-ai"
|
|
298
|
-
echo ""
|
|
299
|
-
fi
|
|
300
|
-
echo " 卸载:"
|
|
301
|
-
echo " curl -fsSL https://raw.githubusercontent.com/NeoMei/agent-soul-framework/master/uninstall.sh | bash"
|
|
33
|
+
echo "🔧 agent-soul-framework setup..."
|
|
34
|
+
agent-soul-framework setup
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neomei/agent-soul-framework",
|
|
3
|
-
"version": "4.5.
|
|
3
|
+
"version": "4.5.3",
|
|
4
4
|
"description": "魂器核心框架 — 基于 OpenCode 的 AI Agent 管理层框架。持久记忆 · 自主学习 · 多端部署 · 心跳自治(纯 TypeScript)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
9
|
+
"agent-soul-framework": "bin/hunqi",
|
|
10
|
+
"agent-soul-heartbeat": "dist/heartbeat/runner.js",
|
|
11
|
+
"agent-soul-knowledge": "bin/hunqi-knowledge"
|
|
12
12
|
},
|
|
13
13
|
"files": [
|
|
14
14
|
"dist",
|
|
@@ -150,7 +150,9 @@ export class ContentFilter {
|
|
|
150
150
|
*/
|
|
151
151
|
static logBlock(text, userId, classification) {
|
|
152
152
|
const timestamp = new Date().toISOString();
|
|
153
|
-
const
|
|
153
|
+
const crypto = require('crypto');
|
|
154
|
+
const uidHash = crypto.createHash('sha256').update(String(userId)).digest('hex').substring(0, 12);
|
|
155
|
+
const logEntry = `[${timestamp}] BLOCKED user=${uidHash} classification=${classification} text="${text.substring(0, 100)}"\n`;
|
|
154
156
|
|
|
155
157
|
try {
|
|
156
158
|
const fs = require('fs');
|
package/scripts/health-check.sh
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/bin/bash
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
2
|
#
|
|
3
3
|
# 魂器健康检查与自动恢复脚本
|
|
4
4
|
# 用途:检测 OpenCode serve 和飞书连接器状态,卡死时自动重启
|
|
@@ -83,7 +83,7 @@ restart_services() {
|
|
|
83
83
|
log " 启动 OpenCode serve..."
|
|
84
84
|
cd "$PROJECT_DIR"
|
|
85
85
|
export $(grep -v '^#' .env | xargs)
|
|
86
|
-
|
|
86
|
+
nohup bash -c " opencode serve --port $OPENCODE_PORT > /tmp/opencode-serve.log 2>&1 &" >/dev/null 2>&1
|
|
87
87
|
|
|
88
88
|
# 等待 serve 就绪
|
|
89
89
|
local retries=0
|
package/start-feishu-daemon.sh
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/bin/bash
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
2
|
#
|
|
3
3
|
# start-feishu-daemon.sh - 稳定启动飞书连接器(守护进程模式)
|
|
4
4
|
# 解决终端超时信号导致的进程终止问题
|
|
@@ -100,7 +100,7 @@ done
|
|
|
100
100
|
# setsid: 创建新会话,忽略 SIGHUP
|
|
101
101
|
# nohup: 忽略挂起信号
|
|
102
102
|
FEISHU_BIN="$(command -v opencode-feishu || echo "$HOME/.npm-global/bin/opencode-feishu")"
|
|
103
|
-
nohup
|
|
103
|
+
nohup "$FEISHU_BIN" start >> "$LOG_FILE" 2>&1 &
|
|
104
104
|
disown %1 2>/dev/null || true
|
|
105
105
|
|
|
106
106
|
# 等待进程真正启动并验证
|
package/start.sh
CHANGED
package/test.sh
CHANGED
package/uninstall.sh
CHANGED
|
@@ -11,7 +11,12 @@ echo ""
|
|
|
11
11
|
|
|
12
12
|
# 确认卸载
|
|
13
13
|
echo "⚠️ 此操作将删除 ~/.hunqi、~/.config/opencode 和相关配置"
|
|
14
|
-
|
|
14
|
+
# 安全读取输入 (兼容无 /dev/tty 环境)
|
|
15
|
+
if [ -e /dev/tty ]; then
|
|
16
|
+
read -rp "确认卸载?(y/N) " CONFIRM < /dev/tty
|
|
17
|
+
else
|
|
18
|
+
read -rp "确认卸载?(y/N) " CONFIRM 2>/dev/null || CONFIRM="n"
|
|
19
|
+
fi
|
|
15
20
|
echo
|
|
16
21
|
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
|
|
17
22
|
echo "已取消"
|
|
@@ -55,7 +60,13 @@ safe_kill_pidfile "${HOME}/.config/opencode/qiwei.pid" "opencode-qiwei"
|
|
|
55
60
|
|
|
56
61
|
# 只杀监听 19876 端口的 opencode serve,避免误杀其他实例
|
|
57
62
|
PORT="${OPENCODE_PORT:-19876}"
|
|
58
|
-
|
|
63
|
+
# 跨平台获取端口 PID
|
|
64
|
+
SERVE_PID=""
|
|
65
|
+
if command -v lsof &>/dev/null; then
|
|
66
|
+
SERVE_PID=$(lsof -iTCP:"$PORT" -sTCP:LISTEN -t 2>/dev/null | head -1)
|
|
67
|
+
elif command -v ss &>/dev/null; then
|
|
68
|
+
SERVE_PID=$(ss -tlnp 2>/dev/null | grep ":$PORT " | sed -n 's/.*pid=\([0-9]*\).*/\1/p' | head -1)
|
|
69
|
+
fi
|
|
59
70
|
if [ -n "$SERVE_PID" ]; then
|
|
60
71
|
if kill -0 "$SERVE_PID" 2>/dev/null; then
|
|
61
72
|
kill "$SERVE_PID" 2>/dev/null && echo " ✅ opencode serve (PID: $SERVE_PID, 端口: $PORT) 已停止" || echo " ⚠️ 停止失败"
|
package/verify.sh
CHANGED