@neomei/agent-soul-framework 4.5.0
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/.env.example +39 -0
- package/.opencode/config.json.example +17 -0
- package/.opencode/opencode.json.example +36 -0
- package/.opencode/prompt.md.example +12 -0
- package/.opencode/tools/read-plugin.js +185 -0
- package/AGENTS.md.example +43 -0
- package/README.md +466 -0
- package/SECURITY.md +117 -0
- package/TOOLS.md.example +27 -0
- package/bin/hunqi +2 -0
- package/bin/hunqi-knowledge +2 -0
- package/connectors/feishu/background.sh +124 -0
- package/connectors/feishu/core-start.sh +35 -0
- package/connectors/feishu/hooks/on-session-created.sh +97 -0
- package/connectors/feishu/hooks/on-session-idle.sh +59 -0
- package/connectors/feishu/model-failover.sh +82 -0
- package/connectors/feishu/restart-all.sh +63 -0
- package/connectors/feishu/restart-feishu.sh +101 -0
- package/connectors/feishu/restart-serve.sh +62 -0
- package/connectors/feishu/scripts/session-cleanup.sh +72 -0
- package/connectors/feishu/start.sh +91 -0
- package/connectors/feishu/stop.sh +78 -0
- package/connectors/feishu/systemd/channel-feishu@.service +63 -0
- package/connectors/feishu/systemd/hunqi-core@.service +50 -0
- package/connectors/feishu/systemd/install-systemd.sh +316 -0
- package/connectors/feishu/systemd/sleep-hooks/99-hunqi-resume.sh +14 -0
- package/connectors/feishu/thinking-icon.gif +0 -0
- package/connectors/feishu/thinking.gif +0 -0
- package/connectors/feishu/watchdog.sh +104 -0
- package/dist/bin/hunqi-knowledge.d.ts +1 -0
- package/dist/bin/hunqi-knowledge.js +12 -0
- package/dist/bin/hunqi-knowledge.js.map +1 -0
- package/dist/cli/hunqi.d.ts +6 -0
- package/dist/cli/hunqi.js +830 -0
- package/dist/cli/hunqi.js.map +1 -0
- package/dist/heartbeat/runner.d.ts +10 -0
- package/dist/heartbeat/runner.js +58 -0
- package/dist/heartbeat/runner.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/daily.d.ts +5 -0
- package/dist/knowledge/daily.js +65 -0
- package/dist/knowledge/daily.js.map +1 -0
- package/dist/knowledge/index.d.ts +5 -0
- package/dist/knowledge/index.js +34 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/memory/manager.d.ts +20 -0
- package/dist/memory/manager.js +110 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/search.d.ts +11 -0
- package/dist/memory/search.js +79 -0
- package/dist/memory/search.js.map +1 -0
- package/dist/memory/structured.d.ts +21 -0
- package/dist/memory/structured.js +88 -0
- package/dist/memory/structured.js.map +1 -0
- package/dist/opencode/api.d.ts +7 -0
- package/dist/opencode/api.js +26 -0
- package/dist/opencode/api.js.map +1 -0
- package/dist/plugin/index.d.ts +38 -0
- package/dist/plugin/index.js +143 -0
- package/dist/plugin/index.js.map +1 -0
- package/docs/bugs/opencode-feishu-permission-race.md +168 -0
- package/heartbeat/heartbeat_tasks.json +272 -0
- package/heartbeat_wrapper.sh +21 -0
- package/hunqi.sh +68 -0
- package/install.sh +301 -0
- package/knowledge/body/INDEX.md.example +6 -0
- package/knowledge/emotion/INDEX.md.example +6 -0
- package/knowledge/evolution/INDEX.md.example +6 -0
- package/knowledge/growth/INDEX.md.example +6 -0
- package/knowledge/intimacy/INDEX.md.example +6 -0
- package/knowledge/methodology/INDEX.md.example +6 -0
- package/knowledge/philosophy/INDEX.md.example +6 -0
- package/knowledge/system/INDEX.md.example +6 -0
- package/memory/MEMORY.md.example +6 -0
- package/package.json +79 -0
- package/plugin/README.md +21 -0
- package/plugin/index.js +154 -0
- package/plugin/manifest.json +37 -0
- package/plugin/package.json +19 -0
- package/scripts/content-filter.js +173 -0
- package/scripts/health-check.sh +153 -0
- package/scripts/session-cleanup.sh +85 -0
- package/setup-wizard.sh +420 -0
- package/setup.sh +128 -0
- package/soul/HEARTBEAT.md.example +13 -0
- package/soul/IDENTITY.md.example +7 -0
- package/soul/SOUL.md.example +19 -0
- package/soul/USER.md.example +7 -0
- package/start-feishu-daemon.sh +127 -0
- package/start.sh +36 -0
- package/test.sh +51 -0
- package/uninstall.sh +144 -0
- package/verify.sh +29 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2026-05-20",
|
|
3
|
+
"description": "魂器心跳任务池 v2 — Hermes 增强:wakeAgent门控 + 作业链 + 交付路由",
|
|
4
|
+
"anchors": [
|
|
5
|
+
{
|
|
6
|
+
"id": "daily-knowledge",
|
|
7
|
+
"name": "每日知识提取",
|
|
8
|
+
"time": "03:00",
|
|
9
|
+
"days": "daily",
|
|
10
|
+
"principle": "每天凌晨3点提取前24小时对话中的有价值内容,归档到知识库",
|
|
11
|
+
"action": "run_script",
|
|
12
|
+
"params": {
|
|
13
|
+
"script": "scripts/daily-knowledge-extract.py",
|
|
14
|
+
"background": false
|
|
15
|
+
},
|
|
16
|
+
"fallback": "跳过"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "daily-todolist",
|
|
20
|
+
"name": "每日待办生成",
|
|
21
|
+
"time": "10:00",
|
|
22
|
+
"days": "daily",
|
|
23
|
+
"enabled": false,
|
|
24
|
+
"principle": "生成今天能往前推一步的 3-5 个具体小任务(每个≤30min) — 已禁用:脚本尚未实现",
|
|
25
|
+
"action": "run_script",
|
|
26
|
+
"params": {
|
|
27
|
+
"script": "scripts/generate-todolist.py",
|
|
28
|
+
"background": false
|
|
29
|
+
},
|
|
30
|
+
"fallback": "跳过"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "weekly-knowledge",
|
|
34
|
+
"name": "每周知识整理",
|
|
35
|
+
"time": "04:00",
|
|
36
|
+
"days": "sunday",
|
|
37
|
+
"principle": "每周日整理知识库:去重、精炼所有分类的核心知识,重写00-核心.md,生成周报",
|
|
38
|
+
"action": "run_script",
|
|
39
|
+
"params": {
|
|
40
|
+
"script": "scripts/weekly-knowledge-sync.py",
|
|
41
|
+
"background": false
|
|
42
|
+
},
|
|
43
|
+
"fallback": "跳过"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "monthly-knowledge",
|
|
47
|
+
"name": "月度知识审查",
|
|
48
|
+
"time": "05:00",
|
|
49
|
+
"days": "monthly",
|
|
50
|
+
"principle": "每月1日深度审查:跨分类关联分析、盲区识别、冗余清理、生成月度报告",
|
|
51
|
+
"action": "run_script",
|
|
52
|
+
"params": {
|
|
53
|
+
"script": "scripts/monthly-knowledge-review.py",
|
|
54
|
+
"background": false
|
|
55
|
+
},
|
|
56
|
+
"fallback": "跳过"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"dynamic": [],
|
|
60
|
+
"history": [
|
|
61
|
+
{
|
|
62
|
+
"timestamp": "2026-04-25T09:50:01.906855+08:00",
|
|
63
|
+
"date": "2026-04-25",
|
|
64
|
+
"task_id": "hello-world",
|
|
65
|
+
"action": "update_session_state",
|
|
66
|
+
"result": "ok"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"timestamp": "2026-05-20T10:00:01.933622+08:00",
|
|
70
|
+
"date": "2026-05-20",
|
|
71
|
+
"task_id": "hello-world",
|
|
72
|
+
"action": "update_session_state",
|
|
73
|
+
"result": "ok"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"timestamp": "2026-05-21T10:00:01.423721+08:00",
|
|
77
|
+
"date": "2026-05-21",
|
|
78
|
+
"task_id": "hello-world",
|
|
79
|
+
"action": "update_session_state",
|
|
80
|
+
"result": "ok"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"timestamp": "2026-05-22T10:00:01.708081+08:00",
|
|
84
|
+
"date": "2026-05-22",
|
|
85
|
+
"task_id": "hello-world",
|
|
86
|
+
"action": "update_session_state",
|
|
87
|
+
"result": "ok"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"timestamp": "2026-05-23T03:00:59.178784+08:00",
|
|
91
|
+
"date": "2026-05-23",
|
|
92
|
+
"task_id": "daily-knowledge",
|
|
93
|
+
"action": "run_script",
|
|
94
|
+
"result": "ok"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"timestamp": "2026-05-23T10:00:01.597907+08:00",
|
|
98
|
+
"date": "2026-05-23",
|
|
99
|
+
"task_id": "hello-world",
|
|
100
|
+
"action": "update_session_state",
|
|
101
|
+
"result": "ok"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"timestamp": "2026-05-24T03:00:37.819346+08:00",
|
|
105
|
+
"date": "2026-05-24",
|
|
106
|
+
"task_id": "daily-knowledge",
|
|
107
|
+
"action": "run_script",
|
|
108
|
+
"result": "ok"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"timestamp": "2026-05-24T04:02:15.086607+08:00",
|
|
112
|
+
"date": "2026-05-24",
|
|
113
|
+
"task_id": "weekly-knowledge",
|
|
114
|
+
"action": "run_script",
|
|
115
|
+
"result": "ok"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"timestamp": "2026-05-24T10:00:03.766726+08:00",
|
|
119
|
+
"date": "2026-05-24",
|
|
120
|
+
"task_id": "hello-world",
|
|
121
|
+
"action": "update_session_state",
|
|
122
|
+
"result": "ok"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"timestamp": "2026-05-25T03:00:38.032580+08:00",
|
|
126
|
+
"date": "2026-05-25",
|
|
127
|
+
"task_id": "daily-knowledge",
|
|
128
|
+
"action": "run_script",
|
|
129
|
+
"result": "ok"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"timestamp": "2026-05-25T10:00:04.318692+08:00",
|
|
133
|
+
"date": "2026-05-25",
|
|
134
|
+
"task_id": "hello-world",
|
|
135
|
+
"action": "update_session_state",
|
|
136
|
+
"result": "ok"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"timestamp": "2026-05-27T03:00:32.634014+08:00",
|
|
140
|
+
"date": "2026-05-27",
|
|
141
|
+
"task_id": "daily-knowledge",
|
|
142
|
+
"action": "run_script",
|
|
143
|
+
"result": "ok"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"timestamp": "2026-05-28T03:00:29.897095+08:00",
|
|
147
|
+
"date": "2026-05-28",
|
|
148
|
+
"task_id": "daily-knowledge",
|
|
149
|
+
"action": "run_script",
|
|
150
|
+
"result": "ok"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"timestamp": "2026-05-28T10:00:22.056116+08:00",
|
|
154
|
+
"date": "2026-05-28",
|
|
155
|
+
"task_id": "daily-todolist",
|
|
156
|
+
"action": "run_script",
|
|
157
|
+
"result": "fail: Script not found: /path/to/your/agent/workspace"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"timestamp": "2026-06-01T03:00:21.926489+08:00",
|
|
161
|
+
"date": "2026-06-01",
|
|
162
|
+
"task_id": "daily-knowledge",
|
|
163
|
+
"action": "run_script",
|
|
164
|
+
"result": "ok"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"timestamp": "2026-06-01T05:00:44.106399+08:00",
|
|
168
|
+
"date": "2026-06-01",
|
|
169
|
+
"task_id": "monthly-knowledge",
|
|
170
|
+
"action": "run_script",
|
|
171
|
+
"result": "ok"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"timestamp": "2026-06-01T10:00:07.446124+08:00",
|
|
175
|
+
"date": "2026-06-01",
|
|
176
|
+
"task_id": "daily-todolist",
|
|
177
|
+
"action": "run_script",
|
|
178
|
+
"result": "fail: Script not found: /path/to/your/.hunqi/agent-soul-framework/scripts/generate-todolist.py"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"timestamp": "2026-06-02T03:01:23.712758+08:00",
|
|
182
|
+
"date": "2026-06-02",
|
|
183
|
+
"task_id": "daily-knowledge",
|
|
184
|
+
"action": "run_script",
|
|
185
|
+
"result": "ok"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"timestamp": "2026-06-02T10:00:12.249612+08:00",
|
|
189
|
+
"date": "2026-06-02",
|
|
190
|
+
"task_id": "daily-todolist",
|
|
191
|
+
"action": "run_script",
|
|
192
|
+
"result": "fail: Script not found: /path/to/your/.hunqi/agent-soul-framework/scripts/generate-todolist.py"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"timestamp": "2026-06-03T03:00:55.437896+08:00",
|
|
196
|
+
"date": "2026-06-03",
|
|
197
|
+
"task_id": "daily-knowledge",
|
|
198
|
+
"action": "run_script",
|
|
199
|
+
"result": "ok"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"timestamp": "2026-06-03T10:00:06.638413+08:00",
|
|
203
|
+
"date": "2026-06-03",
|
|
204
|
+
"task_id": "daily-todolist",
|
|
205
|
+
"action": "run_script",
|
|
206
|
+
"result": "fail: Script not found: /path/to/your/.hunqi/agent-soul-framework/scripts/generate-todolist.py"
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"timestamp": "2026-06-04T03:01:35.872899+08:00",
|
|
210
|
+
"date": "2026-06-04",
|
|
211
|
+
"task_id": "daily-knowledge",
|
|
212
|
+
"action": "run_script",
|
|
213
|
+
"result": "ok"
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"timestamp": "2026-06-04T10:00:06.913856+08:00",
|
|
217
|
+
"date": "2026-06-04",
|
|
218
|
+
"task_id": "daily-todolist",
|
|
219
|
+
"action": "run_script",
|
|
220
|
+
"result": "fail: Script not found: /path/to/your/.hunqi/agent-soul-framework/scripts/generate-todolist.py"
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"timestamp": "2026-06-05T03:01:13.010335+08:00",
|
|
224
|
+
"date": "2026-06-05",
|
|
225
|
+
"task_id": "daily-knowledge",
|
|
226
|
+
"action": "run_script",
|
|
227
|
+
"result": "ok"
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"timestamp": "2026-06-05T10:00:06.957247+08:00",
|
|
231
|
+
"date": "2026-06-05",
|
|
232
|
+
"task_id": "daily-todolist",
|
|
233
|
+
"action": "run_script",
|
|
234
|
+
"result": "fail: Script not found: /path/to/your/.hunqi/agent-soul-framework/scripts/generate-todolist.py"
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"timestamp": "2026-06-06T03:00:35.687620+08:00",
|
|
238
|
+
"date": "2026-06-06",
|
|
239
|
+
"task_id": "daily-knowledge",
|
|
240
|
+
"action": "run_script",
|
|
241
|
+
"result": "ok"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"timestamp": "2026-06-07T03:00:26.023416+08:00",
|
|
245
|
+
"date": "2026-06-07",
|
|
246
|
+
"task_id": "daily-knowledge",
|
|
247
|
+
"action": "run_script",
|
|
248
|
+
"result": "ok"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"timestamp": "2026-06-07T04:00:15.665542+08:00",
|
|
252
|
+
"date": "2026-06-07",
|
|
253
|
+
"task_id": "weekly-knowledge",
|
|
254
|
+
"action": "run_script",
|
|
255
|
+
"result": "ok"
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"timestamp": "2026-06-08T03:00:26.992284+08:00",
|
|
259
|
+
"date": "2026-06-08",
|
|
260
|
+
"task_id": "daily-knowledge",
|
|
261
|
+
"action": "run_script",
|
|
262
|
+
"result": "ok"
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
"timestamp": "2026-06-09T03:00:30.481167+08:00",
|
|
266
|
+
"date": "2026-06-09",
|
|
267
|
+
"task_id": "daily-knowledge",
|
|
268
|
+
"action": "run_script",
|
|
269
|
+
"result": "ok"
|
|
270
|
+
}
|
|
271
|
+
]
|
|
272
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# 魂器心跳任务 wrapper — TypeScript 核心版
|
|
3
|
+
# 由 crontab 调用
|
|
4
|
+
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
6
|
+
cd "$SCRIPT_DIR" || exit 1
|
|
7
|
+
|
|
8
|
+
# 加载 .env
|
|
9
|
+
if [ -f ".env" ]; then
|
|
10
|
+
set -a && source ".env" && set +a
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
# 优先使用本地 hunqi-heartbeat,回退到全局命令
|
|
14
|
+
if [ -f "node_modules/.bin/hunqi-heartbeat" ]; then
|
|
15
|
+
./node_modules/.bin/hunqi-heartbeat >> heartbeat/runner.log 2>&1
|
|
16
|
+
elif command -v hunqi-heartbeat &>/dev/null; then
|
|
17
|
+
hunqi-heartbeat >> heartbeat/runner.log 2>&1
|
|
18
|
+
else
|
|
19
|
+
echo "未找到 hunqi-heartbeat,请确保 @neomei/agent-soul-framework 已安装" >&2
|
|
20
|
+
exit 1
|
|
21
|
+
fi
|
package/hunqi.sh
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# hunqi.sh - 魂器启动脚本
|
|
3
|
+
|
|
4
|
+
echo "🚀 启动魂器(Agent Soul Framework)..."
|
|
5
|
+
|
|
6
|
+
# 进入项目目录
|
|
7
|
+
cd "$(dirname "$0")"
|
|
8
|
+
|
|
9
|
+
# 加载环境变量
|
|
10
|
+
if [ -f .env ]; then
|
|
11
|
+
set -a && source .env && set +a
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
# 激活虚拟环境
|
|
15
|
+
if [ -d .venv ]; then
|
|
16
|
+
source .venv/bin/activate
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
echo "✅ 环境准备完成"
|
|
20
|
+
echo "📖 身份:审宝,28岁专业审计师"
|
|
21
|
+
echo ""
|
|
22
|
+
|
|
23
|
+
# CLI 通道默认权限标记(readonly)
|
|
24
|
+
export HUNQI_CHANNEL="cli"
|
|
25
|
+
export HUNQI_PERMISSION="readonly"
|
|
26
|
+
|
|
27
|
+
# 显示用法
|
|
28
|
+
echo "启动方式:"
|
|
29
|
+
echo " 1. 交互模式: ./hunqi.sh interactive"
|
|
30
|
+
echo " 2. 单条测试: ./hunqi.sh run '你是谁?'"
|
|
31
|
+
echo ""
|
|
32
|
+
|
|
33
|
+
# 检查 opencode run 是否可用(已知 bug #8502)
|
|
34
|
+
_opencode_run_available() {
|
|
35
|
+
opencode run --help >/dev/null 2>&1
|
|
36
|
+
[ $? -eq 0 ]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if [ "$1" == "run" ] && [ -n "$2" ]; then
|
|
40
|
+
# 单条模式 - 因 opencode run 已知 bug 暂时无法使用
|
|
41
|
+
# 临时 workaround:启动 TUI 并提示用户
|
|
42
|
+
echo "⚠️ 单条模式 (./hunqi.sh run) 因 opencode bug 暂时不可用。"
|
|
43
|
+
echo " 请改用交互模式:"
|
|
44
|
+
echo ""
|
|
45
|
+
echo " ./hunqi.sh interactive"
|
|
46
|
+
echo ""
|
|
47
|
+
echo " 然后在 TUI 中输入: $2"
|
|
48
|
+
echo ""
|
|
49
|
+
echo " 或直接启动 TUI:opencode ."
|
|
50
|
+
exit 1
|
|
51
|
+
|
|
52
|
+
elif [ "$1" == "interactive" ]; then
|
|
53
|
+
# 交互模式 - @neomei/agentsoul 插件会自动注入灵魂,无需 stdin
|
|
54
|
+
echo "🎯 启动交互模式..."
|
|
55
|
+
echo ""
|
|
56
|
+
echo "💡 @neomei/agentsoul 插件会在每次 LLM 调用时自动注入灵魂"
|
|
57
|
+
echo " Agent会记得自己是谁 ✨"
|
|
58
|
+
echo ""
|
|
59
|
+
if [ -t 0 ]; then
|
|
60
|
+
read -p "按回车键启动 TUI..."
|
|
61
|
+
fi
|
|
62
|
+
opencode .
|
|
63
|
+
|
|
64
|
+
else
|
|
65
|
+
echo "用法:"
|
|
66
|
+
echo " ./hunqi.sh run '你是谁?' # 单条测试(暂时不可用)"
|
|
67
|
+
echo " ./hunqi.sh interactive # 交互模式(TUI,推荐)"
|
|
68
|
+
fi
|
package/install.sh
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# 魂器一键安装脚本
|
|
3
|
+
# 用法: curl -fsSL https://raw.githubusercontent.com/NeoMei/agent-soul-framework/master/install.sh | bash
|
|
4
|
+
set -e
|
|
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 安装脚本"
|
|
22
|
+
echo ""
|
|
23
|
+
|
|
24
|
+
# 检查 Node.js
|
|
25
|
+
if ! command -v node &>/dev/null; then
|
|
26
|
+
echo "❌ 未检测到 Node.js,请先安装 Node.js ≥ 20"
|
|
27
|
+
exit 1
|
|
28
|
+
fi
|
|
29
|
+
NODE_VERSION=$(node -v | sed 's/v//')
|
|
30
|
+
NODE_MAJOR=$(echo "$NODE_VERSION" | cut -d. -f1)
|
|
31
|
+
if [ "$NODE_MAJOR" -lt 20 ]; then
|
|
32
|
+
echo "❌ Node.js 版本过低: $NODE_VERSION,需要 ≥ 20"
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
echo "✅ Node.js $NODE_VERSION"
|
|
36
|
+
|
|
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
|
+
# 安装后验证
|
|
240
|
+
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
|
|
261
|
+
|
|
262
|
+
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"
|