@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/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 20"
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,需要 20"
17
+ echo "❌ Node.js 版本过低: $NODE_VERSION,需要 >= 20"
33
18
  exit 1
34
19
  fi
35
20
  echo "✅ Node.js $NODE_VERSION"
36
21
 
37
- # 检查 OpenCode 引擎
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
- INSTALL_OK=1
243
- if command -v hunqi &>/dev/null; then
244
- echo " ✅ hunqi 命令可用"
245
- else
246
- echo " hunqi 命令不可用(可能需要重新打开终端或 source ~/.bashrc)"
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
- if [ "$INSTALL_OK" -eq 1 ]; then
264
- echo "✅ 安装完成!"
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.2",
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
- "hunqi": "bin/hunqi",
10
- "hunqi-heartbeat": "dist/heartbeat/runner.js",
11
- "hunqi-knowledge": "bin/hunqi-knowledge"
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 logEntry = `[${timestamp}] BLOCKED user=${userId} classification=${classification} text="${text.substring(0, 100)}"\n`;
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');
@@ -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
- setsid bash -c "nohup opencode serve --port $OPENCODE_PORT > /tmp/opencode-serve.log 2>&1 &" >/dev/null 2>&1
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
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  #
3
3
  # 会话清理脚本
4
4
  # 用途:强制重置 stuck/busy 状态的会话,无需重启服务
@@ -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 setsid "$FEISHU_BIN" start >> "$LOG_FILE" 2>&1 &
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
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # start.sh - 启动魂器(Agent Soul Framework)
3
3
 
4
4
  echo "🚀 启动魂器..."
package/test.sh CHANGED
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # test.sh - 测试魂器(Agent Soul Framework)
3
3
 
4
4
  echo "🧪 测试魂器..."
package/uninstall.sh CHANGED
@@ -11,7 +11,12 @@ echo ""
11
11
 
12
12
  # 确认卸载
13
13
  echo "⚠️ 此操作将删除 ~/.hunqi、~/.config/opencode 和相关配置"
14
- read -rp "确认卸载?(y/N) " CONFIRM < /dev/tty
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
- SERVE_PID=$(ss -tlnp 2>/dev/null | grep ":${PORT} " | sed -n 's/.*pid=\([0-9]*\).*/\1/p')
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
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # verify.sh - 验证魂器是否正确加载
3
3
 
4
4
  echo "🔍 验证魂器配置..."