@neomei/agent-soul-framework 4.5.7 → 4.5.15

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.
Files changed (43) hide show
  1. package/.opencode/tools/read-plugin.js +4 -4
  2. package/.opencode/tools/search-memory.mjs +258 -39
  3. package/AGENTS.md.example +8 -6
  4. package/bin/hunqi +8 -1
  5. package/bin/hunqi-knowledge +8 -1
  6. package/connectors/feishu/hooks/on-session-created.js +6 -0
  7. package/connectors/feishu/hooks/on-session-created.sh +3 -94
  8. package/connectors/feishu/hooks/on-session-idle.js +6 -0
  9. package/connectors/feishu/hooks/on-session-idle.sh +3 -56
  10. package/connectors/feishu/scripts/session-cleanup.sh +10 -8
  11. package/connectors/feishu/stop.sh +12 -0
  12. package/connectors/feishu/systemd/hunqi-core@.service +1 -1
  13. package/connectors/feishu/watchdog.sh +2 -2
  14. package/connectors/qiwei/hooks/on-session-created.js +6 -0
  15. package/connectors/qiwei/hooks/on-session-created.sh +6 -0
  16. package/connectors/qiwei/hooks/on-session-idle.js +6 -0
  17. package/connectors/qiwei/hooks/on-session-idle.sh +6 -0
  18. package/connectors/qiwei/scripts/session-cleanup.sh +74 -0
  19. package/connectors/qiwei/start.sh +91 -0
  20. package/connectors/qiwei/systemd/channel-qiwei@.service +63 -0
  21. package/dist/cli/hunqi.js +109 -38
  22. package/dist/cli/hunqi.js.map +1 -1
  23. package/dist/content-filter.d.ts +15 -0
  24. package/dist/content-filter.js +105 -0
  25. package/dist/content-filter.js.map +1 -0
  26. package/dist/heartbeat/runner.js +8 -1
  27. package/dist/heartbeat/runner.js.map +1 -1
  28. package/dist/memory/manager.js +12 -2
  29. package/dist/memory/manager.js.map +1 -1
  30. package/dist/memory/search.js +32 -10
  31. package/dist/memory/search.js.map +1 -1
  32. package/dist/memory/structured.d.ts +1 -1
  33. package/dist/memory/structured.js +31 -18
  34. package/dist/memory/structured.js.map +1 -1
  35. package/dist/plugin/index.d.ts +1 -0
  36. package/dist/plugin/index.js +24 -9
  37. package/dist/plugin/index.js.map +1 -1
  38. package/heartbeat_wrapper.sh +5 -5
  39. package/package.json +2 -3
  40. package/plugin/index.js +26 -9
  41. package/plugin/manifest.json +3 -2
  42. package/scripts/session-cleanup.sh +2 -2
  43. package/connectors/feishu/hooks/query-memory.mjs +0 -27
@@ -65,24 +65,30 @@ function injectSoul(output) {
65
65
  }
66
66
  return false;
67
67
  }
68
+ let _dbSingleton = null;
69
+ function getDb() {
70
+ if (_dbSingleton)
71
+ return _dbSingleton;
72
+ const DB_PATH = path.join(PROJECT_DIR, 'memory', 'short-term', 'conversations.db');
73
+ fs.mkdirSync(path.dirname(DB_PATH), { recursive: true });
74
+ _dbSingleton = new DatabaseSync(DB_PATH);
75
+ _dbSingleton.exec('PRAGMA journal_mode=WAL');
76
+ _dbSingleton.exec(`CREATE TABLE IF NOT EXISTS conversations (
77
+ id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT, role TEXT,
78
+ content TEXT, timestamp REAL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)`);
79
+ return _dbSingleton;
80
+ }
68
81
  function saveMessage(sessionID, role, content) {
82
+ const db = getDb();
69
83
  try {
70
- const DB_PATH = path.join(PROJECT_DIR, 'memory', 'short-term', 'conversations.db');
71
- fs.mkdirSync(path.dirname(DB_PATH), { recursive: true });
72
- const db = new DatabaseSync(DB_PATH);
73
- db.exec('PRAGMA journal_mode=WAL');
74
- db.exec(`CREATE TABLE IF NOT EXISTS conversations (
75
- id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT, role TEXT,
76
- content TEXT, timestamp REAL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)`);
77
84
  db.prepare('INSERT INTO conversations (session_id, role, content, timestamp) VALUES (?, ?, ?, ?)')
78
85
  .run(String(sessionID), role, content, Date.now() / 1000);
79
- db.close();
80
86
  }
81
87
  catch { }
82
88
  }
83
89
  export const meta = {
84
90
  name: 'hunqi-plugin',
85
- version: '4.5.0',
91
+ version: '4.5.8',
86
92
  description: '魂器 OpenCode 插件 — 自动注入灵魂 + 保存对话',
87
93
  hooks: [
88
94
  'session.created',
@@ -90,6 +96,7 @@ export const meta = {
90
96
  'experimental.chat.system.transform',
91
97
  'chat.message',
92
98
  'session.closed',
99
+ 'session.idle',
93
100
  'session.error'
94
101
  ]
95
102
  };
@@ -134,6 +141,14 @@ export default function HunqiPlugin(_ctx) {
134
141
  }
135
142
  catch { }
136
143
  },
144
+ 'session.idle': async (_input, output) => {
145
+ try {
146
+ if (!output?.system)
147
+ return;
148
+ injectSoul(output);
149
+ }
150
+ catch { }
151
+ },
137
152
  'session.closed': async (_input) => {
138
153
  // 清理不再需要的缓存(当前无需额外状态)
139
154
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"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"}
@@ -11,11 +11,11 @@ if [ -f ".env" ]; then
11
11
  fi
12
12
 
13
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
14
+ if [ -f "node_modules/.bin/agent-soul-heartbeat" ]; then
15
+ ./node_modules/.bin/agent-soul-heartbeat >> heartbeat/runner.log 2>&1
16
+ elif command -v agent-soul-heartbeat &>/dev/null; then
17
+ agent-soul-heartbeat >> heartbeat/runner.log 2>&1
18
18
  else
19
- echo "未找到 hunqi-heartbeat,请确保 @neomei/agent-soul-framework 已安装" >&2
19
+ echo "未找到 agent-soul-heartbeat,请确保 @neomei/agent-soul-framework 已安装" >&2
20
20
  exit 1
21
21
  fi
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neomei/agent-soul-framework",
3
- "version": "4.5.7",
3
+ "version": "4.5.15",
4
4
  "description": "魂器核心框架 — 基于 OpenCode 的 AI Agent 管理层框架。持久记忆 · 自主学习 · 多端部署 · 心跳自治(纯 TypeScript)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -38,8 +38,7 @@
38
38
  "test.sh",
39
39
  "verify.sh",
40
40
  "start-feishu-daemon.sh",
41
- ".opencode/tools/search-memory.mjs",
42
- "connectors/feishu/hooks/query-memory.mjs"
41
+ ".opencode/tools/search-memory.mjs"
43
42
  ],
44
43
  "scripts": {
45
44
  "build": "tsc",
package/plugin/index.js CHANGED
@@ -79,24 +79,31 @@ function injectSoul(output) {
79
79
  }
80
80
 
81
81
 
82
+ let _dbSingleton: DatabaseSync | null = null;
83
+
84
+ function getDb(): DatabaseSync {
85
+ if (_dbSingleton) return _dbSingleton;
86
+ const DB_PATH = path.join(PROJECT_DIR, 'memory', 'short-term', 'conversations.db');
87
+ fs.mkdirSync(path.dirname(DB_PATH), { recursive: true });
88
+ _dbSingleton = new DatabaseSync(DB_PATH);
89
+ _dbSingleton.exec('PRAGMA journal_mode=WAL');
90
+ _dbSingleton.exec(`CREATE TABLE IF NOT EXISTS conversations (
91
+ id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT, role TEXT,
92
+ content TEXT, timestamp REAL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)`);
93
+ return _dbSingleton;
94
+ }
95
+
82
96
  function saveMessage(sessionID, role, content) {
97
+ const db = getDb();
83
98
  try {
84
- const DB_PATH = path.join(PROJECT_DIR, 'memory', 'short-term', 'conversations.db');
85
- fs.mkdirSync(path.dirname(DB_PATH), { recursive: true });
86
- const db = new DatabaseSync(DB_PATH);
87
- db.exec('PRAGMA journal_mode=WAL');
88
- db.exec(`CREATE TABLE IF NOT EXISTS conversations (
89
- id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT, role TEXT,
90
- content TEXT, timestamp REAL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)`);
91
99
  db.prepare('INSERT INTO conversations (session_id, role, content, timestamp) VALUES (?, ?, ?, ?)')
92
100
  .run(String(sessionID), role, content, Date.now() / 1000);
93
- db.close();
94
101
  } catch {}
95
102
  }
96
103
 
97
104
  export const meta = {
98
105
  name: 'hunqi-plugin',
99
- version: '4.5.0',
106
+ version: '4.5.8',
100
107
  description: '魂器 OpenCode 插件 — 自动注入灵魂 + 保存对话',
101
108
  hooks: [
102
109
  'session.created',
@@ -104,6 +111,7 @@ export const meta = {
104
111
  'experimental.chat.system.transform',
105
112
  'chat.message',
106
113
  'session.closed',
114
+ 'session.idle',
107
115
  'session.error'
108
116
  ]
109
117
  };
@@ -145,6 +153,13 @@ export default function HunqiPlugin(ctx) {
145
153
  } catch {}
146
154
  },
147
155
 
156
+ 'session.idle': async (_input, output) => {
157
+ try {
158
+ if (!output?.system) return;
159
+ injectSoul(output);
160
+ } catch {}
161
+ },
162
+
148
163
  'session.closed': async (input) => {
149
164
  // 清理不再需要的缓存(当前无需额外状态)
150
165
  },
@@ -152,3 +167,5 @@ export default function HunqiPlugin(ctx) {
152
167
  'session.error': async () => {}
153
168
  };
154
169
  }
170
+
171
+
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hunqi-plugin",
3
- "version": "4.5.0",
3
+ "version": "4.5.8",
4
4
  "description": "魂器 OpenCode 插件 — 自动注入灵魂 + 保存对话",
5
5
  "author": "NeoMei",
6
6
  "license": "MIT",
@@ -22,7 +22,7 @@
22
22
  "session.closed": {
23
23
  "description": "会话关闭时清理缓存"
24
24
  },
25
- "session.error": {
25
+ "session.idle": { "description": "会话 idle 时重新注入灵魂上下文(无头模式)" }, "session.error": {
26
26
  "description": "会话错误时忽略"
27
27
  }
28
28
  },
@@ -35,3 +35,4 @@
35
35
  "memoryDir": "memory/short-term"
36
36
  }
37
37
  }
38
+
@@ -16,7 +16,7 @@ log() {
16
16
 
17
17
  # 从日志中提取当前 busy 的会话
18
18
  detect_busy_sessions() {
19
- local log_file="/path/to/your/home/.config/opencode/feishu.log"
19
+ local log_file="$HOME/.config/opencode/feishu.log"
20
20
 
21
21
  # 获取每个会话最后的状态
22
22
  grep -E '"status":"(busy|idle)"' "$log_file" 2>/dev/null | \
@@ -66,7 +66,7 @@ if [ -n "$busy_sessions" ]; then
66
66
 
67
67
  # 检查这些会话是否长时间 busy
68
68
  current_time=$(date +%s%3N)
69
- last_busy_time=$(grep '"status":"busy"' /path/to/your/home/.config/opencode/feishu.log 2>/dev/null | tail -1 | grep -o '"time":[0-9]*' | cut -d: -f2 || echo "0")
69
+ 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")
70
70
 
71
71
  if [ -n "$last_busy_time" ] && [ "$last_busy_time" != "0" ]; then
72
72
  elapsed_min=$(( (current_time - last_busy_time) / 60000 ))
@@ -1,27 +0,0 @@
1
- import { DatabaseSync } from 'node:sqlite';
2
- import { join } from 'node:path';
3
- import { existsSync } from 'node:fs';
4
-
5
- const projectDir = process.argv[2] || process.cwd();
6
- const dbPath = join(projectDir, 'memory', 'short-term', 'conversations.db');
7
-
8
- if (!existsSync(dbPath)) {
9
- console.log('');
10
- process.exit(0);
11
- }
12
-
13
- const db = new DatabaseSync(dbPath, { readOnly: true });
14
- try {
15
- const rows = db.prepare(
16
- "SELECT role, content FROM conversations ORDER BY timestamp DESC LIMIT 20"
17
- ).all();
18
-
19
- let output = '';
20
- for (const row of rows) {
21
- const emoji = row.role === 'user' ? '👤' : '🤖';
22
- output += emoji + ' ' + row.content.slice(0, 200) + '\n\n';
23
- }
24
- console.log(output);
25
- } finally {
26
- db.close();
27
- }