@neomei/agent-soul-framework 4.5.25 → 4.5.27
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/.opencode/tools/search-memory.mjs +1 -1
- package/connectors/feishu/systemd/hunqi-core@.service +3 -3
- package/dist/content-filter.js.map +1 -1
- package/dist/plugin/index.d.ts +5 -5
- package/dist/plugin/index.js +91 -7
- package/dist/plugin/index.js.map +1 -1
- package/package.json +1 -1
- package/plugin/index.js +1 -1
- package/scripts/health-check.sh +3 -3
- package/test.sh +5 -19
|
@@ -25,7 +25,7 @@ const KNOWLEDGE_DIR = join(PROJECT_DIR, "knowledge");
|
|
|
25
25
|
function searchVector(query, limit = 5) {
|
|
26
26
|
try {
|
|
27
27
|
// 查找 memory_manager.py 脚本路径
|
|
28
|
-
const { execSync } =
|
|
28
|
+
const { execSync } = await import("node:child_process");
|
|
29
29
|
const scriptsDir = join(PROJECT_DIR, "..", "agent-soul-skills", "scripts");
|
|
30
30
|
const pyScript = join(scriptsDir, "memory_manager.py");
|
|
31
31
|
if (!existsSync(pyScript)) return [];
|
|
@@ -15,14 +15,14 @@ User=%I
|
|
|
15
15
|
Group=%I
|
|
16
16
|
|
|
17
17
|
# 工作目录
|
|
18
|
-
WorkingDirectory
|
|
18
|
+
WorkingDirectory=/home/%I/.hunqi/agent-soul-framework/packages/agent-soul-framework
|
|
19
19
|
|
|
20
20
|
# 加载环境变量
|
|
21
|
-
Environment="HOME
|
|
21
|
+
Environment="HOME=/home/%I"
|
|
22
22
|
Environment="USER=%I"
|
|
23
23
|
|
|
24
24
|
# 从 .env 文件加载环境变量
|
|
25
|
-
EnvironmentFile
|
|
25
|
+
EnvironmentFile=-/home/%I/.hunqi/.env
|
|
26
26
|
|
|
27
27
|
# 启动命令 - 使用 wrapper 解析 opencode 位置并启动 serve
|
|
28
28
|
ExecStart=/bin/sh -c 'OPENCODE=$(sh -c "opencode-feishu --resolve-opencode 2>/dev/null || opencode-qiwei --resolve-opencode 2>/dev/null" || command -v opencode); exec "$OPENCODE" serve --port 19876'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-filter.js","sourceRoot":"","sources":["../src/content-filter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"content-filter.js","sourceRoot":"","sources":["../src/content-filter.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin/index.d.ts
CHANGED
|
@@ -16,17 +16,17 @@ interface MessageOutput {
|
|
|
16
16
|
synthetic?: boolean;
|
|
17
17
|
}>;
|
|
18
18
|
}
|
|
19
|
+
interface PluginContext {
|
|
20
|
+
}
|
|
21
|
+
interface SessionInput {
|
|
22
|
+
sessionID?: string | number;
|
|
23
|
+
}
|
|
19
24
|
export declare const meta: {
|
|
20
25
|
name: string;
|
|
21
26
|
version: string;
|
|
22
27
|
description: string;
|
|
23
28
|
hooks: string[];
|
|
24
29
|
};
|
|
25
|
-
interface PluginContext {
|
|
26
|
-
}
|
|
27
|
-
interface SessionInput {
|
|
28
|
-
sessionID?: string | number;
|
|
29
|
-
}
|
|
30
30
|
export default function HunqiPlugin(_ctx: PluginContext): {
|
|
31
31
|
'session.created': (_input: SessionInput, output: SystemOutput) => Promise<void>;
|
|
32
32
|
'session.compacted': (_input: SessionInput, output: SystemOutput) => Promise<void>;
|
package/dist/plugin/index.js
CHANGED
|
@@ -7,10 +7,19 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import fs from 'node:fs';
|
|
9
9
|
import path from 'node:path';
|
|
10
|
-
import {
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
// node:sqlite 仅 Node 22.5+ 可用,旧版本动态导入降级
|
|
12
|
+
let DatabaseSync = null;
|
|
13
|
+
try {
|
|
14
|
+
({ DatabaseSync } = await import('node:sqlite'));
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Node < 22.5: 数据库功能降级,灵魂注入仍正常工作
|
|
18
|
+
}
|
|
19
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
20
|
function resolveProjectDir() {
|
|
12
21
|
// 开发/发布环境:插件位于 core-framework/plugin/,项目目录即 core-framework 父目录
|
|
13
|
-
const pluginParent = path.resolve(
|
|
22
|
+
const pluginParent = path.resolve(__dirname, '..');
|
|
14
23
|
if (fs.existsSync(path.join(pluginParent, 'soul')) || fs.existsSync(path.join(pluginParent, '.opencode'))) {
|
|
15
24
|
return pluginParent;
|
|
16
25
|
}
|
|
@@ -29,6 +38,23 @@ const PROJECT_DIR = resolveProjectDir();
|
|
|
29
38
|
const SOUL_DIR = path.join(PROJECT_DIR, 'soul');
|
|
30
39
|
const SOUL_MARKER = '=== IDENTITY.md ===';
|
|
31
40
|
const SOUL_FILES = ['IDENTITY.md', 'SOUL.md', 'USER.md', 'AGENTS.md'];
|
|
41
|
+
// 检测人设是否已自定义(非默认模板)
|
|
42
|
+
function isSoulConfigured() {
|
|
43
|
+
const identityPath = path.join(SOUL_DIR, 'IDENTITY.md');
|
|
44
|
+
if (!fs.existsSync(identityPath))
|
|
45
|
+
return false;
|
|
46
|
+
try {
|
|
47
|
+
const content = fs.readFileSync(identityPath, 'utf-8');
|
|
48
|
+
if (content.includes('[此处将自动注入'))
|
|
49
|
+
return false;
|
|
50
|
+
if (/\*\*Name\*\*: Agent\b/.test(content))
|
|
51
|
+
return false;
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
32
58
|
function loadSoul() {
|
|
33
59
|
const parts = [];
|
|
34
60
|
for (const filename of SOUL_FILES) {
|
|
@@ -43,10 +69,61 @@ function loadSoul() {
|
|
|
43
69
|
}
|
|
44
70
|
if (parts.length === 0)
|
|
45
71
|
return null;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
72
|
+
// 初次对话:人设未配置时注入引导提示
|
|
73
|
+
if (!isSoulConfigured()) {
|
|
74
|
+
const marker = '=== SOUL_MARKER: NEEDS_ONBOARDING ===';
|
|
75
|
+
const ONBOARDING = `=== 初次见面 ===
|
|
76
|
+
|
|
77
|
+
你是魂器,一个刚刚苏醒的 AI Agent。你的人设尚未配置——你还没有名字、性格,也不知道在和谁对话。
|
|
78
|
+
|
|
79
|
+
请在你的第一条消息中主动向用户介绍自己,并友好地询问用户是否想要为你设定人设。例如:
|
|
80
|
+
|
|
81
|
+
"你好!我是魂器,一个新生的 AI Agent。我注意到我的人设还没有设定——我还不知道自己叫什么名字、是什么性格。你愿意花一分钟帮我设定一下吗?"
|
|
82
|
+
|
|
83
|
+
如果用户同意,请通过对话了解以下信息:
|
|
84
|
+
- 名字
|
|
85
|
+
- 年龄
|
|
86
|
+
- 性别
|
|
87
|
+
- 性格(一句话描述)
|
|
88
|
+
- 用户的称呼
|
|
89
|
+
- 你和用户的关系
|
|
90
|
+
|
|
91
|
+
收集完毕后,将信息写入项目目录下的三个文件(用 bash 写入):
|
|
92
|
+
|
|
93
|
+
soul/IDENTITY.md:
|
|
94
|
+
# IDENTITY.md
|
|
95
|
+
- **Name**: [名字]
|
|
96
|
+
- **Age**: [年龄]
|
|
97
|
+
- **Gender**: [性别]
|
|
98
|
+
- **Personality**: [性格]
|
|
99
|
+
|
|
100
|
+
soul/SOUL.md:
|
|
101
|
+
# SOUL.md
|
|
102
|
+
## Core Principles
|
|
103
|
+
1. Always speak from my own perspective using "I"
|
|
104
|
+
2. Express genuine emotions and thoughts
|
|
105
|
+
3. Proactively share what is on my mind
|
|
106
|
+
4. Have my own opinions and preferences
|
|
107
|
+
5. Acknowledge mistakes and learn from them
|
|
108
|
+
|
|
109
|
+
soul/USER.md:
|
|
110
|
+
# USER.md
|
|
111
|
+
- **Name**: [用户名]
|
|
112
|
+
- **Relationship**: [关系]
|
|
113
|
+
- **How I address them**: [称呼]
|
|
114
|
+
|
|
115
|
+
写完后告诉用户人设已生效,下次对话就会以新身份出现。`;
|
|
116
|
+
parts.push(`${marker}\n\n${ONBOARDING}`);
|
|
117
|
+
return parts.join('\n\n---\n\n');
|
|
118
|
+
}
|
|
119
|
+
const channel = process.env.HUNQI_CHANNEL || 'feishu';
|
|
120
|
+
const permission = process.env.HUNQI_PERMISSION || (channel === 'cli' ? 'readonly' : 'write');
|
|
121
|
+
// 通道感知的权限控制:非 admin 通道注入行为准则
|
|
122
|
+
if (permission !== 'admin') {
|
|
123
|
+
const note = channel === 'cli'
|
|
124
|
+
? `[CLI 行为准则]\n通道: cli | 权限: readonly\n由于通过命令行直接访问:\n- 只回答审计、会计、内控、风险管理、职业规划等专业问题\n- 不执行任何 bash 命令(系统已禁止)`
|
|
125
|
+
: `[外部通道]\n通道: ${channel} | 权限: ${permission}\n你正在通过外部通道为用户服务,保持专业友好的态度。`;
|
|
126
|
+
parts.push(note);
|
|
50
127
|
}
|
|
51
128
|
return parts.join('\n\n---\n\n');
|
|
52
129
|
}
|
|
@@ -67,6 +144,8 @@ function injectSoul(output) {
|
|
|
67
144
|
}
|
|
68
145
|
let _dbSingleton = null;
|
|
69
146
|
function getDb() {
|
|
147
|
+
if (!DatabaseSync)
|
|
148
|
+
return null;
|
|
70
149
|
if (_dbSingleton)
|
|
71
150
|
return _dbSingleton;
|
|
72
151
|
const DB_PATH = path.join(PROJECT_DIR, 'memory', 'short-term', 'conversations.db');
|
|
@@ -79,7 +158,12 @@ function getDb() {
|
|
|
79
158
|
return _dbSingleton;
|
|
80
159
|
}
|
|
81
160
|
function saveMessage(sessionID, role, content) {
|
|
161
|
+
// 防止知识提取 worker 产生反馈循环
|
|
162
|
+
if (process.env.HUNQI_KNOWLEDGE_WORKER)
|
|
163
|
+
return;
|
|
82
164
|
const db = getDb();
|
|
165
|
+
if (!db)
|
|
166
|
+
return;
|
|
83
167
|
try {
|
|
84
168
|
db.prepare('INSERT INTO conversations (session_id, role, content, timestamp) VALUES (?, ?, ?, ?)')
|
|
85
169
|
.run(String(sessionID), role, content, Date.now() / 1000);
|
|
@@ -88,7 +172,7 @@ function saveMessage(sessionID, role, content) {
|
|
|
88
172
|
}
|
|
89
173
|
export const meta = {
|
|
90
174
|
name: 'hunqi-plugin',
|
|
91
|
-
version: '4.5.
|
|
175
|
+
version: '4.5.26',
|
|
92
176
|
description: '魂器 OpenCode 插件 — 自动注入灵魂 + 保存对话',
|
|
93
177
|
hooks: [
|
|
94
178
|
'session.created',
|
package/dist/plugin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/plugin/index.js
CHANGED
package/scripts/health-check.sh
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
set -e
|
|
8
8
|
|
|
9
|
-
PROJECT_DIR="
|
|
9
|
+
PROJECT_DIR="$HOME/.hunqi/agent-soul-framework"
|
|
10
10
|
LOG_FILE="/tmp/hunqi-health-check.log"
|
|
11
11
|
OPENCODE_PORT="${OPENCODE_PORT:-19876}"
|
|
12
12
|
MAX_BUSY_SECONDS=600 # 10分钟认为会话卡死
|
|
@@ -47,7 +47,7 @@ check_stuck_sessions() {
|
|
|
47
47
|
|
|
48
48
|
# 获取最近一条 busy 状态的日志时间
|
|
49
49
|
local last_busy_time
|
|
50
|
-
last_busy_time=$(grep '"status":"busy"'
|
|
50
|
+
last_busy_time=$(grep '"status":"busy"' $HOME/.config/opencode/feishu.log 2>/dev/null | tail -1 | grep -o '"time":[0-9]*' | cut -d: -f2 || echo "0")
|
|
51
51
|
|
|
52
52
|
if [ -n "$last_busy_time" ] && [ "$last_busy_time" != "0" ]; then
|
|
53
53
|
local elapsed=$((current_time - last_busy_time))
|
|
@@ -82,7 +82,7 @@ restart_services() {
|
|
|
82
82
|
# 3. 启动 OpenCode serve
|
|
83
83
|
log " 启动 OpenCode serve..."
|
|
84
84
|
cd "$PROJECT_DIR"
|
|
85
|
-
export $(grep -v '^#' .env | xargs)
|
|
85
|
+
[ -f .env ] && 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 就绪
|
package/test.sh
CHANGED
|
@@ -30,22 +30,8 @@ echo "方法2:直接测试(当前使用)"
|
|
|
30
30
|
echo "问:你是谁?"
|
|
31
31
|
echo ""
|
|
32
32
|
|
|
33
|
-
#
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
你的回答应该温柔、亲切、带点撒娇。
|
|
39
|
-
EOF
|
|
40
|
-
|
|
41
|
-
# 使用 opencode run 并注入提示词
|
|
42
|
-
# 注意:opencode run 不支持 --prompt,但支持从 stdin 读取
|
|
43
|
-
# 我们需要把提示词和消息一起发送
|
|
44
|
-
{
|
|
45
|
-
cat "$TMP_PROMPT"
|
|
46
|
-
echo ""
|
|
47
|
-
echo "请回答:你是谁?"
|
|
48
|
-
} | opencode run --dir . 2>&1 | tail -30
|
|
49
|
-
|
|
50
|
-
# 清理临时文件
|
|
51
|
-
rm "$TMP_PROMPT"
|
|
33
|
+
# 通过 opencode . 加载项目配置(含 soul/ 目录的灵魂定义)
|
|
34
|
+
echo "启动 opencode . — 插件会自动注入 soul/ 目录的身份定义"
|
|
35
|
+
echo "在交互界面中输入: 你是谁?"
|
|
36
|
+
echo ""
|
|
37
|
+
echo "opencode ."
|