@zhin.js/core 1.0.37 → 1.0.39

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 (204) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +57 -3
  3. package/lib/adapter.d.ts +11 -0
  4. package/lib/adapter.d.ts.map +1 -1
  5. package/lib/adapter.js +61 -0
  6. package/lib/adapter.js.map +1 -1
  7. package/lib/ai/index.d.ts +3 -39
  8. package/lib/ai/index.d.ts.map +1 -1
  9. package/lib/ai/index.js +2 -44
  10. package/lib/ai/index.js.map +1 -1
  11. package/lib/ai/providers/anthropic.d.ts.map +1 -1
  12. package/lib/ai/providers/anthropic.js +2 -0
  13. package/lib/ai/providers/anthropic.js.map +1 -1
  14. package/lib/ai/providers/openai.d.ts.map +1 -1
  15. package/lib/ai/providers/openai.js +8 -0
  16. package/lib/ai/providers/openai.js.map +1 -1
  17. package/lib/ai/types.d.ts +5 -3
  18. package/lib/ai/types.d.ts.map +1 -1
  19. package/lib/built/ai-trigger.js.map +1 -1
  20. package/lib/built/common-adapter-tools.d.ts +55 -0
  21. package/lib/built/common-adapter-tools.d.ts.map +1 -0
  22. package/lib/built/common-adapter-tools.js +158 -0
  23. package/lib/built/common-adapter-tools.js.map +1 -0
  24. package/lib/built/dispatcher.d.ts.map +1 -1
  25. package/lib/built/dispatcher.js +50 -46
  26. package/lib/built/dispatcher.js.map +1 -1
  27. package/lib/built/skill.d.ts.map +1 -1
  28. package/lib/built/skill.js +0 -1
  29. package/lib/built/skill.js.map +1 -1
  30. package/lib/built/tool.d.ts +3 -3
  31. package/lib/built/tool.d.ts.map +1 -1
  32. package/lib/built/tool.js.map +1 -1
  33. package/lib/feature.d.ts +16 -1
  34. package/lib/feature.d.ts.map +1 -1
  35. package/lib/feature.js +41 -2
  36. package/lib/feature.js.map +1 -1
  37. package/lib/index.d.ts +1 -0
  38. package/lib/index.d.ts.map +1 -1
  39. package/lib/index.js +2 -0
  40. package/lib/index.js.map +1 -1
  41. package/lib/plugin.d.ts +38 -1
  42. package/lib/plugin.d.ts.map +1 -1
  43. package/lib/plugin.js +73 -22
  44. package/lib/plugin.js.map +1 -1
  45. package/lib/scheduler/scheduler.js +1 -1
  46. package/lib/scheduler/scheduler.js.map +1 -1
  47. package/lib/types.d.ts +43 -28
  48. package/lib/types.d.ts.map +1 -1
  49. package/lib/utils.d.ts +12 -3
  50. package/lib/utils.d.ts.map +1 -1
  51. package/lib/utils.js +64 -54
  52. package/lib/utils.js.map +1 -1
  53. package/package.json +5 -5
  54. package/src/adapter.ts +85 -5
  55. package/src/ai/index.ts +8 -186
  56. package/src/ai/providers/anthropic.ts +1 -0
  57. package/src/ai/providers/openai.ts +5 -1
  58. package/src/ai/types.ts +6 -4
  59. package/src/built/ai-trigger.ts +2 -2
  60. package/src/built/common-adapter-tools.ts +207 -0
  61. package/src/built/dispatcher.ts +51 -52
  62. package/src/built/skill.ts +3 -4
  63. package/src/built/tool.ts +3 -3
  64. package/src/feature.ts +45 -2
  65. package/src/index.ts +2 -0
  66. package/src/plugin.ts +92 -31
  67. package/src/scheduler/scheduler.ts +1 -1
  68. package/src/types.ts +39 -28
  69. package/src/utils.ts +63 -52
  70. package/tests/ai/setup.ts +2 -2
  71. package/tests/utils.test.ts +1 -3
  72. package/lib/ai/agent.d.ts +0 -130
  73. package/lib/ai/agent.d.ts.map +0 -1
  74. package/lib/ai/agent.js +0 -702
  75. package/lib/ai/agent.js.map +0 -1
  76. package/lib/ai/bootstrap.d.ts +0 -91
  77. package/lib/ai/bootstrap.d.ts.map +0 -1
  78. package/lib/ai/bootstrap.js +0 -243
  79. package/lib/ai/bootstrap.js.map +0 -1
  80. package/lib/ai/builtin-tools.d.ts +0 -59
  81. package/lib/ai/builtin-tools.d.ts.map +0 -1
  82. package/lib/ai/builtin-tools.js +0 -777
  83. package/lib/ai/builtin-tools.js.map +0 -1
  84. package/lib/ai/compaction.d.ts +0 -132
  85. package/lib/ai/compaction.d.ts.map +0 -1
  86. package/lib/ai/compaction.js +0 -370
  87. package/lib/ai/compaction.js.map +0 -1
  88. package/lib/ai/context-manager.d.ts +0 -213
  89. package/lib/ai/context-manager.d.ts.map +0 -1
  90. package/lib/ai/context-manager.js +0 -313
  91. package/lib/ai/context-manager.js.map +0 -1
  92. package/lib/ai/conversation-memory.d.ts +0 -181
  93. package/lib/ai/conversation-memory.d.ts.map +0 -1
  94. package/lib/ai/conversation-memory.js +0 -581
  95. package/lib/ai/conversation-memory.js.map +0 -1
  96. package/lib/ai/cron-engine.d.ts +0 -92
  97. package/lib/ai/cron-engine.d.ts.map +0 -1
  98. package/lib/ai/cron-engine.js +0 -278
  99. package/lib/ai/cron-engine.js.map +0 -1
  100. package/lib/ai/follow-up.d.ts +0 -131
  101. package/lib/ai/follow-up.d.ts.map +0 -1
  102. package/lib/ai/follow-up.js +0 -265
  103. package/lib/ai/follow-up.js.map +0 -1
  104. package/lib/ai/hooks.d.ts +0 -143
  105. package/lib/ai/hooks.d.ts.map +0 -1
  106. package/lib/ai/hooks.js +0 -108
  107. package/lib/ai/hooks.js.map +0 -1
  108. package/lib/ai/init.d.ts +0 -30
  109. package/lib/ai/init.d.ts.map +0 -1
  110. package/lib/ai/init.js +0 -686
  111. package/lib/ai/init.js.map +0 -1
  112. package/lib/ai/output.d.ts +0 -93
  113. package/lib/ai/output.d.ts.map +0 -1
  114. package/lib/ai/output.js +0 -176
  115. package/lib/ai/output.js.map +0 -1
  116. package/lib/ai/rate-limiter.d.ts +0 -38
  117. package/lib/ai/rate-limiter.d.ts.map +0 -1
  118. package/lib/ai/rate-limiter.js +0 -86
  119. package/lib/ai/rate-limiter.js.map +0 -1
  120. package/lib/ai/service.d.ts +0 -88
  121. package/lib/ai/service.d.ts.map +0 -1
  122. package/lib/ai/service.js +0 -285
  123. package/lib/ai/service.js.map +0 -1
  124. package/lib/ai/session.d.ts +0 -186
  125. package/lib/ai/session.d.ts.map +0 -1
  126. package/lib/ai/session.js +0 -443
  127. package/lib/ai/session.js.map +0 -1
  128. package/lib/ai/subagent.d.ts +0 -50
  129. package/lib/ai/subagent.d.ts.map +0 -1
  130. package/lib/ai/subagent.js +0 -144
  131. package/lib/ai/subagent.js.map +0 -1
  132. package/lib/ai/tone-detector.d.ts +0 -19
  133. package/lib/ai/tone-detector.d.ts.map +0 -1
  134. package/lib/ai/tone-detector.js +0 -72
  135. package/lib/ai/tone-detector.js.map +0 -1
  136. package/lib/ai/tools.d.ts +0 -45
  137. package/lib/ai/tools.d.ts.map +0 -1
  138. package/lib/ai/tools.js +0 -206
  139. package/lib/ai/tools.js.map +0 -1
  140. package/lib/ai/user-profile.d.ts +0 -56
  141. package/lib/ai/user-profile.d.ts.map +0 -1
  142. package/lib/ai/user-profile.js +0 -130
  143. package/lib/ai/user-profile.js.map +0 -1
  144. package/lib/ai/zhin-agent/builtin-tools.d.ts +0 -17
  145. package/lib/ai/zhin-agent/builtin-tools.d.ts.map +0 -1
  146. package/lib/ai/zhin-agent/builtin-tools.js +0 -220
  147. package/lib/ai/zhin-agent/builtin-tools.js.map +0 -1
  148. package/lib/ai/zhin-agent/config.d.ts +0 -54
  149. package/lib/ai/zhin-agent/config.d.ts.map +0 -1
  150. package/lib/ai/zhin-agent/config.js +0 -76
  151. package/lib/ai/zhin-agent/config.js.map +0 -1
  152. package/lib/ai/zhin-agent/exec-policy.d.ts +0 -20
  153. package/lib/ai/zhin-agent/exec-policy.d.ts.map +0 -1
  154. package/lib/ai/zhin-agent/exec-policy.js +0 -71
  155. package/lib/ai/zhin-agent/exec-policy.js.map +0 -1
  156. package/lib/ai/zhin-agent/index.d.ts +0 -70
  157. package/lib/ai/zhin-agent/index.d.ts.map +0 -1
  158. package/lib/ai/zhin-agent/index.js +0 -404
  159. package/lib/ai/zhin-agent/index.js.map +0 -1
  160. package/lib/ai/zhin-agent/prompt.d.ts +0 -21
  161. package/lib/ai/zhin-agent/prompt.d.ts.map +0 -1
  162. package/lib/ai/zhin-agent/prompt.js +0 -111
  163. package/lib/ai/zhin-agent/prompt.js.map +0 -1
  164. package/lib/ai/zhin-agent/tool-collector.d.ts +0 -22
  165. package/lib/ai/zhin-agent/tool-collector.d.ts.map +0 -1
  166. package/lib/ai/zhin-agent/tool-collector.js +0 -218
  167. package/lib/ai/zhin-agent/tool-collector.js.map +0 -1
  168. package/src/ai/agent.ts +0 -831
  169. package/src/ai/bootstrap.ts +0 -309
  170. package/src/ai/builtin-tools.ts +0 -849
  171. package/src/ai/compaction.ts +0 -529
  172. package/src/ai/context-manager.ts +0 -440
  173. package/src/ai/conversation-memory.ts +0 -774
  174. package/src/ai/cron-engine.ts +0 -337
  175. package/src/ai/follow-up.ts +0 -357
  176. package/src/ai/hooks.ts +0 -223
  177. package/src/ai/init.ts +0 -762
  178. package/src/ai/output.ts +0 -261
  179. package/src/ai/rate-limiter.ts +0 -129
  180. package/src/ai/service.ts +0 -331
  181. package/src/ai/session.ts +0 -544
  182. package/src/ai/subagent.ts +0 -209
  183. package/src/ai/tone-detector.ts +0 -89
  184. package/src/ai/tools.ts +0 -218
  185. package/src/ai/user-profile.ts +0 -181
  186. package/src/ai/zhin-agent/builtin-tools.ts +0 -247
  187. package/src/ai/zhin-agent/config.ts +0 -113
  188. package/src/ai/zhin-agent/exec-policy.ts +0 -78
  189. package/src/ai/zhin-agent/index.ts +0 -512
  190. package/src/ai/zhin-agent/prompt.ts +0 -131
  191. package/src/ai/zhin-agent/tool-collector.ts +0 -243
  192. package/tests/ai/agent.test.ts +0 -614
  193. package/tests/ai/context-manager.test.ts +0 -413
  194. package/tests/ai/conversation-memory.test.ts +0 -128
  195. package/tests/ai/follow-up.test.ts +0 -175
  196. package/tests/ai/integration.test.ts +0 -584
  197. package/tests/ai/output.test.ts +0 -128
  198. package/tests/ai/rate-limiter.test.ts +0 -108
  199. package/tests/ai/session.test.ts +0 -375
  200. package/tests/ai/subagent.test.ts +0 -270
  201. package/tests/ai/tone-detector.test.ts +0 -80
  202. package/tests/ai/tools-builtin.test.ts +0 -346
  203. package/tests/ai/user-profile.test.ts +0 -73
  204. package/tests/ai/zhin-agent.test.ts +0 -177
@@ -1,265 +0,0 @@
1
- /**
2
- * FollowUpStore — 定时跟进任务的持久化存储
3
- *
4
- * 解决纯 setTimeout 重启即丢失的问题:
5
- * 1. 创建任务时同步写入数据库
6
- * 2. 执行完成 / 过期后从数据库中删除
7
- * 3. 机器人启动时从数据库加载所有未完成任务,重新挂定时器
8
- * 4. 同一会话创建新任务时,自动取消旧的 pending 任务(防止重复提醒)
9
- *
10
- * ai_followups 表:
11
- * ┌──────────────────────────────────────────────────────────────────┐
12
- * │ id (PK) | session_id | platform | sender_id | scene_id │
13
- * │ | message | fire_at | created_at | status │
14
- * └──────────────────────────────────────────────────────────────────┘
15
- */
16
- import { Logger } from '@zhin.js/logger';
17
- const logger = new Logger(null, 'FollowUp');
18
- // ============================================================================
19
- // 数据库模型
20
- // ============================================================================
21
- export const AI_FOLLOWUP_MODEL = {
22
- session_id: { type: 'text', nullable: false },
23
- platform: { type: 'text', nullable: false },
24
- bot_id: { type: 'text', nullable: false },
25
- sender_id: { type: 'text', nullable: false },
26
- scene_id: { type: 'text', nullable: false },
27
- scene_type: { type: 'text', nullable: false },
28
- message: { type: 'text', nullable: false },
29
- /** 触发时间戳 (ms) */
30
- fire_at: { type: 'integer', nullable: false },
31
- created_at: { type: 'integer', default: 0 },
32
- /** pending | fired | cancelled */
33
- status: { type: 'text', default: 'pending' },
34
- };
35
- // ============================================================================
36
- // 内存实现
37
- // ============================================================================
38
- class MemoryFollowUpStore {
39
- records = [];
40
- nextId = 1;
41
- async create(record) {
42
- const full = { ...record, id: this.nextId++ };
43
- this.records.push(full);
44
- return full;
45
- }
46
- async markFired(id) {
47
- const r = this.records.find(r => r.id === id);
48
- if (r)
49
- r.status = 'fired';
50
- }
51
- async cancel(id) {
52
- const r = this.records.find(r => r.id === id);
53
- if (r)
54
- r.status = 'cancelled';
55
- }
56
- async getPending() {
57
- return this.records.filter(r => r.status === 'pending');
58
- }
59
- async getPendingBySession(sessionId) {
60
- return this.records.filter(r => r.status === 'pending' && r.session_id === sessionId);
61
- }
62
- dispose() {
63
- this.records = [];
64
- }
65
- }
66
- // ============================================================================
67
- // 数据库实现
68
- // ============================================================================
69
- class DatabaseFollowUpStore {
70
- model;
71
- constructor(model) {
72
- this.model = model;
73
- }
74
- async create(record) {
75
- const created = await this.model.create(record);
76
- return { ...record, id: created.id ?? created };
77
- }
78
- async markFired(id) {
79
- await this.model.update({ status: 'fired' }).where({ id });
80
- }
81
- async cancel(id) {
82
- await this.model.update({ status: 'cancelled' }).where({ id });
83
- }
84
- async getPending() {
85
- return this.model.select().where({ status: 'pending' });
86
- }
87
- async getPendingBySession(sessionId) {
88
- return this.model.select().where({ status: 'pending', session_id: sessionId });
89
- }
90
- dispose() { }
91
- }
92
- // ============================================================================
93
- // FollowUpManager
94
- // ============================================================================
95
- export class FollowUpManager {
96
- store;
97
- /** 内存中活跃的定时器: recordId → timer */
98
- timers = new Map();
99
- sender = null;
100
- constructor() {
101
- this.store = new MemoryFollowUpStore();
102
- }
103
- /** 注入消息发送回调 */
104
- setSender(sender) {
105
- this.sender = sender;
106
- }
107
- /** 升级到数据库存储 */
108
- upgradeToDatabase(model) {
109
- const old = this.store;
110
- this.store = new DatabaseFollowUpStore(model);
111
- old.dispose();
112
- logger.debug('FollowUpManager: 已升级到数据库存储');
113
- }
114
- /**
115
- * 创建一个跟进任务
116
- *
117
- * 重要:同一会话的旧 pending 任务会被自动取消,防止重复提醒。
118
- *
119
- * @returns 人类可读的确认文本
120
- */
121
- async schedule(params) {
122
- const { sessionId, platform, botId, senderId, sceneId, sceneType, message, delayMinutes } = params;
123
- // ── 详细参数日志(方便排查问题) ──
124
- logger.debug(`[跟进] 收到请求: delay_minutes=${delayMinutes}, message="${message}", session=${sessionId}`);
125
- // 限制最大延迟 7 天
126
- const maxDelay = 7 * 24 * 60;
127
- const actualDelay = Math.min(Math.max(delayMinutes, 1), maxDelay);
128
- const delayMs = actualDelay * 60 * 1000;
129
- const fireAt = Date.now() + delayMs;
130
- // ── 自动取消同一会话的旧 pending 任务 ──
131
- const existingPending = await this.store.getPendingBySession(sessionId);
132
- if (existingPending.length > 0) {
133
- for (const old of existingPending) {
134
- if (old.id != null) {
135
- // 取消数据库记录
136
- await this.store.cancel(old.id);
137
- // 清除内存中的定时器
138
- const timer = this.timers.get(old.id);
139
- if (timer) {
140
- clearTimeout(timer);
141
- this.timers.delete(old.id);
142
- }
143
- logger.debug(`[跟进] 自动取消旧任务: id=${old.id}, "${old.message}"`);
144
- }
145
- }
146
- }
147
- const record = await this.store.create({
148
- session_id: sessionId,
149
- platform,
150
- bot_id: botId,
151
- sender_id: senderId,
152
- scene_id: sceneId,
153
- scene_type: sceneType,
154
- message,
155
- fire_at: fireAt,
156
- created_at: Date.now(),
157
- status: 'pending',
158
- });
159
- // 挂定时器
160
- this.scheduleTimer(record);
161
- const readableTime = actualDelay >= 1440
162
- ? `${(actualDelay / 1440).toFixed(1)} 天后`
163
- : actualDelay >= 60
164
- ? `${(actualDelay / 60).toFixed(1)} 小时后`
165
- : `${actualDelay} 分钟后`;
166
- // 精确触发时间(方便日志对照)
167
- const fireDate = new Date(fireAt);
168
- const fireTimeStr = fireDate.toLocaleString('zh-CN', { hour12: false });
169
- logger.debug(`[跟进] 已创建: id=${record.id}, delay=${actualDelay}分钟(${delayMs}ms), 触发时间=${fireTimeStr}, "${message}"`);
170
- return `✅ 已安排提醒,将在 ${readableTime}(${fireTimeStr})提醒你:${message}`;
171
- }
172
- /**
173
- * 取消指定会话的所有 pending 任务
174
- */
175
- async cancelBySession(sessionId) {
176
- const pending = await this.store.getPendingBySession(sessionId);
177
- let count = 0;
178
- for (const record of pending) {
179
- if (record.id != null) {
180
- await this.store.cancel(record.id);
181
- const timer = this.timers.get(record.id);
182
- if (timer) {
183
- clearTimeout(timer);
184
- this.timers.delete(record.id);
185
- }
186
- count++;
187
- }
188
- }
189
- if (count > 0) {
190
- logger.debug(`[跟进] 已取消 ${count} 个待执行任务 (session=${sessionId})`);
191
- }
192
- return count;
193
- }
194
- /**
195
- * 启动时从数据库恢复所有未完成的跟进任务
196
- */
197
- async restore() {
198
- const pending = await this.store.getPending();
199
- const now = Date.now();
200
- let restored = 0;
201
- for (const record of pending) {
202
- if (record.fire_at <= now) {
203
- // 已过期但未执行 → 立即触发(延迟 2 秒,等系统完全就绪)
204
- const overdueSec = Math.round((now - record.fire_at) / 1000);
205
- logger.debug(`[跟进恢复] id=${record.id} 已过期 ${overdueSec}s,立即触发`);
206
- this.scheduleTimerWithDelay(record, 2000);
207
- restored++;
208
- }
209
- else {
210
- // 还没到时间 → 重新挂定时器
211
- this.scheduleTimer(record);
212
- const remainMs = record.fire_at - now;
213
- const remainMin = (remainMs / 60_000).toFixed(1);
214
- logger.debug(`[跟进恢复] id=${record.id} 剩余 ${remainMin} 分钟, "${record.message}"`);
215
- restored++;
216
- }
217
- }
218
- if (restored > 0) {
219
- logger.info(`[跟进恢复] 共恢复 ${restored} 个待执行任务`);
220
- }
221
- return restored;
222
- }
223
- /**
224
- * 为一条记录挂定时器
225
- */
226
- scheduleTimer(record) {
227
- const delay = Math.max(record.fire_at - Date.now(), 0);
228
- this.scheduleTimerWithDelay(record, delay);
229
- }
230
- scheduleTimerWithDelay(record, delayMs) {
231
- if (!record.id)
232
- return;
233
- // 清除旧定时器(如果有)
234
- const existing = this.timers.get(record.id);
235
- if (existing)
236
- clearTimeout(existing);
237
- const timer = setTimeout(async () => {
238
- try {
239
- this.timers.delete(record.id);
240
- // 发送提醒
241
- if (this.sender) {
242
- await this.sender(record);
243
- logger.info(`[跟进提醒] 已发送: id=${record.id}, "${record.message}"`);
244
- }
245
- else {
246
- logger.warn(`[跟进提醒] 无法发送 (sender 未注入): id=${record.id}`);
247
- }
248
- // 标记完成
249
- await this.store.markFired(record.id);
250
- }
251
- catch (e) {
252
- logger.warn(`[跟进提醒] 发送失败: id=${record.id}`, e);
253
- }
254
- }, delayMs);
255
- this.timers.set(record.id, timer);
256
- }
257
- dispose() {
258
- for (const timer of this.timers.values()) {
259
- clearTimeout(timer);
260
- }
261
- this.timers.clear();
262
- this.store.dispose();
263
- }
264
- }
265
- //# sourceMappingURL=follow-up.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"follow-up.js","sourceRoot":"","sources":["../../src/ai/follow-up.ts"],"names":[],"mappings":"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"}
package/lib/ai/hooks.d.ts DELETED
@@ -1,143 +0,0 @@
1
- /**
2
- * AI Hooks — AI 生命周期事件钩子系统
3
- *
4
- * 借鉴 OpenClaw 的 Hooks 设计,提供可扩展的事件驱动钩子:
5
- *
6
- * - message:received — 收到消息时触发
7
- * - message:sent — 发送消息时触发
8
- * - session:compact — 会话压缩时触发
9
- * - session:new — 新建会话时触发
10
- * - agent:bootstrap — Agent 初始化时触发
11
- * - agent:tool-call — 工具调用时触发
12
- *
13
- * 钩子按注册顺序执行,错误不会中断其他钩子。
14
- */
15
- /** 事件类型 */
16
- export type AIHookEventType = 'message' | 'session' | 'agent' | 'tool';
17
- /** Hook 事件基础接口 */
18
- export interface AIHookEvent {
19
- /** 事件类型 */
20
- type: AIHookEventType;
21
- /** 具体动作 */
22
- action: string;
23
- /** 会话标识 */
24
- sessionId?: string;
25
- /** 附加上下文 */
26
- context: Record<string, unknown>;
27
- /** 事件时间戳 */
28
- timestamp: Date;
29
- /** 钩子可以推送消息到这个数组 */
30
- messages: string[];
31
- }
32
- /** 消息接收事件 */
33
- export interface MessageReceivedEvent extends AIHookEvent {
34
- type: 'message';
35
- action: 'received';
36
- context: {
37
- from: string;
38
- content: string;
39
- platform: string;
40
- channelId?: string;
41
- messageId?: string;
42
- };
43
- }
44
- /** 消息发送事件 */
45
- export interface MessageSentEvent extends AIHookEvent {
46
- type: 'message';
47
- action: 'sent';
48
- context: {
49
- to: string;
50
- content: string;
51
- success: boolean;
52
- error?: string;
53
- platform: string;
54
- };
55
- }
56
- /** 会话压缩事件 */
57
- export interface SessionCompactEvent extends AIHookEvent {
58
- type: 'session';
59
- action: 'compact';
60
- context: {
61
- compactedCount: number;
62
- savedTokens: number;
63
- summary: string;
64
- };
65
- }
66
- /** 会话新建事件 */
67
- export interface SessionNewEvent extends AIHookEvent {
68
- type: 'session';
69
- action: 'new';
70
- context: {
71
- previousSessionId?: string;
72
- };
73
- }
74
- /** Agent 初始化事件 */
75
- export interface AgentBootstrapEvent extends AIHookEvent {
76
- type: 'agent';
77
- action: 'bootstrap';
78
- context: {
79
- workspaceDir: string;
80
- toolCount: number;
81
- skillCount: number;
82
- bootstrapFiles: string[];
83
- };
84
- }
85
- /** 工具调用事件 */
86
- export interface ToolCallEvent extends AIHookEvent {
87
- type: 'tool';
88
- action: 'call';
89
- context: {
90
- toolName: string;
91
- args: Record<string, unknown>;
92
- result?: string;
93
- durationMs?: number;
94
- success: boolean;
95
- error?: string;
96
- };
97
- }
98
- /** Hook 处理函数 */
99
- export type AIHookHandler = (event: AIHookEvent) => Promise<void> | void;
100
- /**
101
- * 注册 Hook 处理函数
102
- *
103
- * @param eventKey - 事件类型(如 'message')或具体动作(如 'message:received')
104
- * @param handler - 处理函数
105
- *
106
- * @example
107
- * ```ts
108
- * // 监听所有消息事件
109
- * registerAIHook('message', async (event) => {
110
- * console.log('消息事件:', event.action);
111
- * });
112
- *
113
- * // 只监听消息接收
114
- * registerAIHook('message:received', async (event) => {
115
- * console.log('收到消息:', event.context.content);
116
- * });
117
- * ```
118
- */
119
- export declare function registerAIHook(eventKey: string, handler: AIHookHandler): () => void;
120
- /**
121
- * 注销 Hook 处理函数
122
- */
123
- export declare function unregisterAIHook(eventKey: string, handler: AIHookHandler): void;
124
- /**
125
- * 清除所有 Hook(测试用)
126
- */
127
- export declare function clearAIHooks(): void;
128
- /**
129
- * 获取已注册的事件 key 列表(调试用)
130
- */
131
- export declare function getRegisteredAIHookKeys(): string[];
132
- /**
133
- * 触发 Hook 事件
134
- *
135
- * 同时调用通用类型(如 'message')和具体动作(如 'message:received')的处理函数。
136
- * 处理函数按注册顺序执行,错误被捕获并记录,不影响其他处理函数。
137
- */
138
- export declare function triggerAIHook(event: AIHookEvent): Promise<void>;
139
- /**
140
- * 创建 Hook 事件(辅助函数)
141
- */
142
- export declare function createAIHookEvent(type: AIHookEventType, action: string, sessionId?: string, context?: Record<string, unknown>): AIHookEvent;
143
- //# sourceMappingURL=hooks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/ai/hooks.ts"],"names":[],"mappings":"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"}
package/lib/ai/hooks.js DELETED
@@ -1,108 +0,0 @@
1
- /**
2
- * AI Hooks — AI 生命周期事件钩子系统
3
- *
4
- * 借鉴 OpenClaw 的 Hooks 设计,提供可扩展的事件驱动钩子:
5
- *
6
- * - message:received — 收到消息时触发
7
- * - message:sent — 发送消息时触发
8
- * - session:compact — 会话压缩时触发
9
- * - session:new — 新建会话时触发
10
- * - agent:bootstrap — Agent 初始化时触发
11
- * - agent:tool-call — 工具调用时触发
12
- *
13
- * 钩子按注册顺序执行,错误不会中断其他钩子。
14
- */
15
- import { Logger } from '@zhin.js/logger';
16
- const logger = new Logger(null, 'AI-Hooks');
17
- // ============================================================================
18
- // Hook 管理器
19
- // ============================================================================
20
- /** 按事件 key 存储的处理函数注册表 */
21
- const handlers = new Map();
22
- /**
23
- * 注册 Hook 处理函数
24
- *
25
- * @param eventKey - 事件类型(如 'message')或具体动作(如 'message:received')
26
- * @param handler - 处理函数
27
- *
28
- * @example
29
- * ```ts
30
- * // 监听所有消息事件
31
- * registerAIHook('message', async (event) => {
32
- * console.log('消息事件:', event.action);
33
- * });
34
- *
35
- * // 只监听消息接收
36
- * registerAIHook('message:received', async (event) => {
37
- * console.log('收到消息:', event.context.content);
38
- * });
39
- * ```
40
- */
41
- export function registerAIHook(eventKey, handler) {
42
- if (!handlers.has(eventKey)) {
43
- handlers.set(eventKey, []);
44
- }
45
- handlers.get(eventKey).push(handler);
46
- // 返回注销函数
47
- return () => unregisterAIHook(eventKey, handler);
48
- }
49
- /**
50
- * 注销 Hook 处理函数
51
- */
52
- export function unregisterAIHook(eventKey, handler) {
53
- const eventHandlers = handlers.get(eventKey);
54
- if (!eventHandlers)
55
- return;
56
- const index = eventHandlers.indexOf(handler);
57
- if (index !== -1)
58
- eventHandlers.splice(index, 1);
59
- if (eventHandlers.length === 0)
60
- handlers.delete(eventKey);
61
- }
62
- /**
63
- * 清除所有 Hook(测试用)
64
- */
65
- export function clearAIHooks() {
66
- handlers.clear();
67
- }
68
- /**
69
- * 获取已注册的事件 key 列表(调试用)
70
- */
71
- export function getRegisteredAIHookKeys() {
72
- return Array.from(handlers.keys());
73
- }
74
- /**
75
- * 触发 Hook 事件
76
- *
77
- * 同时调用通用类型(如 'message')和具体动作(如 'message:received')的处理函数。
78
- * 处理函数按注册顺序执行,错误被捕获并记录,不影响其他处理函数。
79
- */
80
- export async function triggerAIHook(event) {
81
- const typeHandlers = handlers.get(event.type) ?? [];
82
- const specificHandlers = handlers.get(`${event.type}:${event.action}`) ?? [];
83
- const allHandlers = [...typeHandlers, ...specificHandlers];
84
- if (allHandlers.length === 0)
85
- return;
86
- for (const handler of allHandlers) {
87
- try {
88
- await handler(event);
89
- }
90
- catch (err) {
91
- logger.error(`Hook 错误 [${event.type}:${event.action}]: ${err.message}`);
92
- }
93
- }
94
- }
95
- /**
96
- * 创建 Hook 事件(辅助函数)
97
- */
98
- export function createAIHookEvent(type, action, sessionId, context = {}) {
99
- return {
100
- type,
101
- action,
102
- sessionId,
103
- context,
104
- timestamp: new Date(),
105
- messages: [],
106
- };
107
- }
108
- //# sourceMappingURL=hooks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/ai/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAwG5C,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,yBAAyB;AACzB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;AAEpD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAsB;IACrE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEtC,SAAS;IACT,OAAO,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,OAAsB;IACvE,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,aAAa;QAAE,OAAO;IAE3B,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAkB;IACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAC7E,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,gBAAgB,CAAC,CAAC;IAE3D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAErC,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAqB,EACrB,MAAc,EACd,SAAkB,EAClB,UAAmC,EAAE;IAErC,OAAO;QACL,IAAI;QACJ,MAAM;QACN,SAAS;QACT,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC"}
package/lib/ai/init.d.ts DELETED
@@ -1,30 +0,0 @@
1
- /**
2
- * AI 模块初始化
3
- *
4
- * 将 AI 服务注册到 Zhin 插件系统中:
5
- * - AIService context
6
- * - ZhinAgent 全局大脑
7
- * - AI 触发处理器 (via MessageDispatcher)
8
- * - 数据库会话/上下文持久化
9
- * - 消息记录中间件
10
- * - AI 管理工具
11
- */
12
- import { AIService } from './service.js';
13
- declare module '../plugin.js' {
14
- namespace Plugin {
15
- interface Contexts {
16
- ai: AIService;
17
- }
18
- }
19
- }
20
- /**
21
- * 初始化 AI 模块
22
- *
23
- * 在 setup.ts 中调用:
24
- * ```ts
25
- * import { initAIModule } from '@zhin.js/core';
26
- * initAIModule();
27
- * ```
28
- */
29
- export declare function initAIModule(): void;
30
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/ai/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAmBH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AA0BzC,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,EAAE,EAAE,SAAS,CAAC;SACf;KACF;CACF;AAsCD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,IAAI,IAAI,CA6oBnC"}