@zhin.js/agent 0.1.25 → 0.1.26

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 (307) hide show
  1. package/lib/agent-prompt/registry.js +1 -1
  2. package/lib/agent-prompt/registry.js.map +1 -1
  3. package/lib/ai-event-bus.d.ts +19 -0
  4. package/lib/ai-event-bus.d.ts.map +1 -0
  5. package/lib/ai-event-bus.js +75 -0
  6. package/lib/ai-event-bus.js.map +1 -0
  7. package/lib/ai-event-subscriber.d.ts +38 -0
  8. package/lib/ai-event-subscriber.d.ts.map +1 -0
  9. package/lib/ai-event-subscriber.js +61 -0
  10. package/lib/ai-event-subscriber.js.map +1 -0
  11. package/lib/builtin/ask-user-tool.d.ts +2 -0
  12. package/lib/builtin/ask-user-tool.d.ts.map +1 -1
  13. package/lib/builtin/ask-user-tool.js +2 -0
  14. package/lib/builtin/ask-user-tool.js.map +1 -1
  15. package/lib/builtin/bash-tool.d.ts +7 -3
  16. package/lib/builtin/bash-tool.d.ts.map +1 -1
  17. package/lib/builtin/bash-tool.js +51 -9
  18. package/lib/builtin/bash-tool.js.map +1 -1
  19. package/lib/builtin/bing-search-html.d.ts.map +1 -1
  20. package/lib/builtin/bing-search-html.js +14 -7
  21. package/lib/builtin/bing-search-html.js.map +1 -1
  22. package/lib/builtin/builtin-base-tool.d.ts +2 -0
  23. package/lib/builtin/builtin-base-tool.d.ts.map +1 -1
  24. package/lib/builtin/builtin-base-tool.js +5 -0
  25. package/lib/builtin/builtin-base-tool.js.map +1 -1
  26. package/lib/builtin/edit-file-tool.d.ts +1 -1
  27. package/lib/builtin/edit-file-tool.d.ts.map +1 -1
  28. package/lib/builtin/edit-file-tool.js +33 -1
  29. package/lib/builtin/edit-file-tool.js.map +1 -1
  30. package/lib/builtin/file-edit-quote-utils.d.ts +1 -3
  31. package/lib/builtin/file-edit-quote-utils.d.ts.map +1 -1
  32. package/lib/builtin/file-edit-quote-utils.js +1 -3
  33. package/lib/builtin/file-edit-quote-utils.js.map +1 -1
  34. package/lib/builtin/glob-tool.d.ts +1 -1
  35. package/lib/builtin/glob-tool.d.ts.map +1 -1
  36. package/lib/builtin/glob-tool.js +15 -3
  37. package/lib/builtin/glob-tool.js.map +1 -1
  38. package/lib/builtin/grep-tool.d.ts +1 -1
  39. package/lib/builtin/grep-tool.d.ts.map +1 -1
  40. package/lib/builtin/grep-tool.js +16 -3
  41. package/lib/builtin/grep-tool.js.map +1 -1
  42. package/lib/builtin/list-dir-tool.d.ts +1 -1
  43. package/lib/builtin/list-dir-tool.d.ts.map +1 -1
  44. package/lib/builtin/list-dir-tool.js +14 -3
  45. package/lib/builtin/list-dir-tool.js.map +1 -1
  46. package/lib/builtin/read-file-tool.d.ts +1 -1
  47. package/lib/builtin/read-file-tool.d.ts.map +1 -1
  48. package/lib/builtin/read-file-tool.js +24 -3
  49. package/lib/builtin/read-file-tool.js.map +1 -1
  50. package/lib/builtin/run-deferred-task-tool.d.ts +3 -0
  51. package/lib/builtin/run-deferred-task-tool.d.ts.map +1 -1
  52. package/lib/builtin/run-deferred-task-tool.js +2 -0
  53. package/lib/builtin/run-deferred-task-tool.js.map +1 -1
  54. package/lib/builtin/spawn-task-tool.d.ts.map +1 -1
  55. package/lib/builtin/spawn-task-tool.js +2 -0
  56. package/lib/builtin/spawn-task-tool.js.map +1 -1
  57. package/lib/builtin/web-fetch-tool.d.ts +2 -2
  58. package/lib/builtin/web-fetch-tool.d.ts.map +1 -1
  59. package/lib/builtin/web-fetch-tool.js +12 -18
  60. package/lib/builtin/web-fetch-tool.js.map +1 -1
  61. package/lib/builtin/write-file-tool.d.ts +1 -1
  62. package/lib/builtin/write-file-tool.d.ts.map +1 -1
  63. package/lib/builtin/write-file-tool.js +33 -1
  64. package/lib/builtin/write-file-tool.js.map +1 -1
  65. package/lib/common-adapter-tools.d.ts +8 -41
  66. package/lib/common-adapter-tools.d.ts.map +1 -1
  67. package/lib/common-adapter-tools.js +23 -182
  68. package/lib/common-adapter-tools.js.map +1 -1
  69. package/lib/deferred-worker-runner.d.ts +13 -2
  70. package/lib/deferred-worker-runner.d.ts.map +1 -1
  71. package/lib/deferred-worker-runner.js +91 -13
  72. package/lib/deferred-worker-runner.js.map +1 -1
  73. package/lib/discovery/agents.js +1 -1
  74. package/lib/discovery/agents.js.map +1 -1
  75. package/lib/discovery/skills.js +1 -1
  76. package/lib/discovery/skills.js.map +1 -1
  77. package/lib/discovery/tools.d.ts +1 -1
  78. package/lib/discovery/tools.d.ts.map +1 -1
  79. package/lib/discovery/tools.js +17 -4
  80. package/lib/discovery/tools.js.map +1 -1
  81. package/lib/discovery/utils.js +1 -1
  82. package/lib/discovery/utils.js.map +1 -1
  83. package/lib/hooks.d.ts.map +1 -1
  84. package/lib/hooks.js +2 -0
  85. package/lib/hooks.js.map +1 -1
  86. package/lib/index.d.ts +9 -1
  87. package/lib/index.d.ts.map +1 -1
  88. package/lib/index.js +6 -0
  89. package/lib/index.js.map +1 -1
  90. package/lib/init/message-media.d.ts +3 -1
  91. package/lib/init/message-media.d.ts.map +1 -1
  92. package/lib/init/message-media.js +20 -0
  93. package/lib/init/message-media.js.map +1 -1
  94. package/lib/init/register-ai-service.js.map +1 -1
  95. package/lib/init/register-ai-trigger.d.ts.map +1 -1
  96. package/lib/init/register-ai-trigger.js +71 -10
  97. package/lib/init/register-ai-trigger.js.map +1 -1
  98. package/lib/init/register-builtin-tools.js +7 -7
  99. package/lib/init/register-builtin-tools.js.map +1 -1
  100. package/lib/init/register-typing-indicator.d.ts +9 -0
  101. package/lib/init/register-typing-indicator.d.ts.map +1 -0
  102. package/lib/init/register-typing-indicator.js +206 -0
  103. package/lib/init/register-typing-indicator.js.map +1 -0
  104. package/lib/init.d.ts.map +1 -1
  105. package/lib/init.js +2 -0
  106. package/lib/init.js.map +1 -1
  107. package/lib/mcp-client/connection.d.ts +2 -0
  108. package/lib/mcp-client/connection.d.ts.map +1 -1
  109. package/lib/mcp-client/connection.js +7 -0
  110. package/lib/mcp-client/connection.js.map +1 -1
  111. package/lib/mcp-client/index.d.ts +2 -0
  112. package/lib/mcp-client/index.d.ts.map +1 -1
  113. package/lib/mcp-client/index.js +19 -2
  114. package/lib/mcp-client/index.js.map +1 -1
  115. package/lib/monitoring/index.d.ts +79 -0
  116. package/lib/monitoring/index.d.ts.map +1 -0
  117. package/lib/monitoring/index.js +197 -0
  118. package/lib/monitoring/index.js.map +1 -0
  119. package/lib/monitoring/metrics.d.ts +240 -0
  120. package/lib/monitoring/metrics.d.ts.map +1 -0
  121. package/lib/monitoring/metrics.js +483 -0
  122. package/lib/monitoring/metrics.js.map +1 -0
  123. package/lib/orchestrator/agent-dispatcher.d.ts +170 -0
  124. package/lib/orchestrator/agent-dispatcher.d.ts.map +1 -0
  125. package/lib/orchestrator/agent-dispatcher.js +379 -0
  126. package/lib/orchestrator/agent-dispatcher.js.map +1 -0
  127. package/lib/orchestrator/hook-registry.d.ts.map +1 -1
  128. package/lib/orchestrator/hook-registry.js +2 -0
  129. package/lib/orchestrator/hook-registry.js.map +1 -1
  130. package/lib/orchestrator/index.d.ts +2 -0
  131. package/lib/orchestrator/index.d.ts.map +1 -1
  132. package/lib/orchestrator/index.js +2 -0
  133. package/lib/orchestrator/index.js.map +1 -1
  134. package/lib/orchestrator/mcp-lifecycle.d.ts +1 -1
  135. package/lib/orchestrator/mcp-lifecycle.d.ts.map +1 -1
  136. package/lib/orchestrator/mcp-lifecycle.js +2 -2
  137. package/lib/orchestrator/mcp-lifecycle.js.map +1 -1
  138. package/lib/orchestrator/mcp-registry.d.ts +8 -1
  139. package/lib/orchestrator/mcp-registry.d.ts.map +1 -1
  140. package/lib/orchestrator/mcp-registry.js +28 -5
  141. package/lib/orchestrator/mcp-registry.js.map +1 -1
  142. package/lib/orchestrator/task-queue.d.ts +147 -0
  143. package/lib/orchestrator/task-queue.d.ts.map +1 -0
  144. package/lib/orchestrator/task-queue.js +337 -0
  145. package/lib/orchestrator/task-queue.js.map +1 -0
  146. package/lib/orchestrator/tool-selection.d.ts.map +1 -1
  147. package/lib/orchestrator/tool-selection.js +3 -0
  148. package/lib/orchestrator/tool-selection.js.map +1 -1
  149. package/lib/orchestrator/types.d.ts +8 -0
  150. package/lib/orchestrator/types.d.ts.map +1 -1
  151. package/lib/plugin-ai-hook-bus.d.ts +4 -0
  152. package/lib/plugin-ai-hook-bus.d.ts.map +1 -0
  153. package/lib/plugin-ai-hook-bus.js +24 -0
  154. package/lib/plugin-ai-hook-bus.js.map +1 -0
  155. package/lib/security/anomaly-detection.d.ts +119 -0
  156. package/lib/security/anomaly-detection.d.ts.map +1 -0
  157. package/lib/security/anomaly-detection.js +305 -0
  158. package/lib/security/anomaly-detection.js.map +1 -0
  159. package/lib/security/audit-logger.d.ts +158 -0
  160. package/lib/security/audit-logger.d.ts.map +1 -0
  161. package/lib/security/audit-logger.js +379 -0
  162. package/lib/security/audit-logger.js.map +1 -0
  163. package/lib/security/bash-tool-context.d.ts +3 -3
  164. package/lib/security/bash-tool-context.d.ts.map +1 -1
  165. package/lib/security/budget-limiter.d.ts +156 -0
  166. package/lib/security/budget-limiter.d.ts.map +1 -0
  167. package/lib/security/budget-limiter.js +363 -0
  168. package/lib/security/budget-limiter.js.map +1 -0
  169. package/lib/security/dangerous-tool-policy.d.ts +17 -0
  170. package/lib/security/dangerous-tool-policy.d.ts.map +1 -0
  171. package/lib/security/dangerous-tool-policy.js +137 -0
  172. package/lib/security/dangerous-tool-policy.js.map +1 -0
  173. package/lib/security/exec-policy.d.ts +21 -12
  174. package/lib/security/exec-policy.d.ts.map +1 -1
  175. package/lib/security/exec-policy.js +198 -25
  176. package/lib/security/exec-policy.js.map +1 -1
  177. package/lib/security/file-policy.d.ts +0 -1
  178. package/lib/security/file-policy.d.ts.map +1 -1
  179. package/lib/security/file-policy.js +112 -14
  180. package/lib/security/file-policy.js.map +1 -1
  181. package/lib/security/file-role-policy.d.ts +119 -0
  182. package/lib/security/file-role-policy.d.ts.map +1 -0
  183. package/lib/security/file-role-policy.js +268 -0
  184. package/lib/security/file-role-policy.js.map +1 -0
  185. package/lib/security/index.d.ts +59 -0
  186. package/lib/security/index.d.ts.map +1 -1
  187. package/lib/security/index.js +68 -0
  188. package/lib/security/index.js.map +1 -1
  189. package/lib/security/network-policy.d.ts +94 -0
  190. package/lib/security/network-policy.d.ts.map +1 -0
  191. package/lib/security/network-policy.js +291 -0
  192. package/lib/security/network-policy.js.map +1 -0
  193. package/lib/security/owner-approve-always-store.d.ts +2 -0
  194. package/lib/security/owner-approve-always-store.d.ts.map +1 -1
  195. package/lib/security/owner-approve-always-store.js +37 -0
  196. package/lib/security/owner-approve-always-store.js.map +1 -1
  197. package/lib/security/sandbox-enhanced.d.ts +170 -0
  198. package/lib/security/sandbox-enhanced.d.ts.map +1 -0
  199. package/lib/security/sandbox-enhanced.js +630 -0
  200. package/lib/security/sandbox-enhanced.js.map +1 -0
  201. package/lib/security/sandbox.d.ts +104 -0
  202. package/lib/security/sandbox.d.ts.map +1 -0
  203. package/lib/security/sandbox.js +373 -0
  204. package/lib/security/sandbox.js.map +1 -0
  205. package/lib/security/security-config.example.d.ts +33 -0
  206. package/lib/security/security-config.example.d.ts.map +1 -0
  207. package/lib/security/security-config.example.js +166 -0
  208. package/lib/security/security-config.example.js.map +1 -0
  209. package/lib/subagent-goal-notify.d.ts +13 -0
  210. package/lib/subagent-goal-notify.d.ts.map +1 -0
  211. package/lib/subagent-goal-notify.js +32 -0
  212. package/lib/subagent-goal-notify.js.map +1 -0
  213. package/lib/subagent.d.ts +24 -0
  214. package/lib/subagent.d.ts.map +1 -1
  215. package/lib/subagent.js +98 -16
  216. package/lib/subagent.js.map +1 -1
  217. package/lib/typing-indicator/adapter-integration.d.ts +140 -0
  218. package/lib/typing-indicator/adapter-integration.d.ts.map +1 -0
  219. package/lib/typing-indicator/adapter-integration.js +473 -0
  220. package/lib/typing-indicator/adapter-integration.js.map +1 -0
  221. package/lib/typing-indicator/index.d.ts +170 -0
  222. package/lib/typing-indicator/index.d.ts.map +1 -0
  223. package/lib/typing-indicator/index.js +311 -0
  224. package/lib/typing-indicator/index.js.map +1 -0
  225. package/lib/typing-indicator/integration.d.ts +91 -0
  226. package/lib/typing-indicator/integration.d.ts.map +1 -0
  227. package/lib/typing-indicator/integration.js +219 -0
  228. package/lib/typing-indicator/integration.js.map +1 -0
  229. package/lib/zhin-agent/config.d.ts +20 -2
  230. package/lib/zhin-agent/config.d.ts.map +1 -1
  231. package/lib/zhin-agent/config.js +27 -9
  232. package/lib/zhin-agent/config.js.map +1 -1
  233. package/lib/zhin-agent/event-emitter.d.ts +11 -0
  234. package/lib/zhin-agent/event-emitter.d.ts.map +1 -0
  235. package/lib/zhin-agent/event-emitter.js +43 -0
  236. package/lib/zhin-agent/event-emitter.js.map +1 -0
  237. package/lib/zhin-agent/index.d.ts +9 -31
  238. package/lib/zhin-agent/index.d.ts.map +1 -1
  239. package/lib/zhin-agent/index.js +70 -672
  240. package/lib/zhin-agent/index.js.map +1 -1
  241. package/lib/zhin-agent/llm-runner.d.ts +16 -0
  242. package/lib/zhin-agent/llm-runner.d.ts.map +1 -0
  243. package/lib/zhin-agent/llm-runner.js +85 -0
  244. package/lib/zhin-agent/llm-runner.js.map +1 -0
  245. package/lib/zhin-agent/model-resolver.d.ts +9 -0
  246. package/lib/zhin-agent/model-resolver.d.ts.map +1 -0
  247. package/lib/zhin-agent/model-resolver.js +25 -0
  248. package/lib/zhin-agent/model-resolver.js.map +1 -0
  249. package/lib/zhin-agent/phase-trace.d.ts +12 -0
  250. package/lib/zhin-agent/phase-trace.d.ts.map +1 -0
  251. package/lib/zhin-agent/phase-trace.js +24 -0
  252. package/lib/zhin-agent/phase-trace.js.map +1 -0
  253. package/lib/zhin-agent/prompt-assembly.d.ts +22 -0
  254. package/lib/zhin-agent/prompt-assembly.d.ts.map +1 -0
  255. package/lib/zhin-agent/prompt-assembly.js +66 -0
  256. package/lib/zhin-agent/prompt-assembly.js.map +1 -0
  257. package/lib/zhin-agent/prompt-builder.d.ts +200 -0
  258. package/lib/zhin-agent/prompt-builder.d.ts.map +1 -0
  259. package/lib/zhin-agent/prompt-builder.js +574 -0
  260. package/lib/zhin-agent/prompt-builder.js.map +1 -0
  261. package/lib/zhin-agent/prompt-templates.d.ts +160 -0
  262. package/lib/zhin-agent/prompt-templates.d.ts.map +1 -0
  263. package/lib/zhin-agent/prompt-templates.js +436 -0
  264. package/lib/zhin-agent/prompt-templates.js.map +1 -0
  265. package/lib/zhin-agent/prompt.d.ts +15 -0
  266. package/lib/zhin-agent/prompt.d.ts.map +1 -1
  267. package/lib/zhin-agent/prompt.js +149 -4
  268. package/lib/zhin-agent/prompt.js.map +1 -1
  269. package/lib/zhin-agent/session-io.d.ts +10 -0
  270. package/lib/zhin-agent/session-io.d.ts.map +1 -0
  271. package/lib/zhin-agent/session-io.js +14 -0
  272. package/lib/zhin-agent/session-io.js.map +1 -0
  273. package/lib/zhin-agent/task-continuation.d.ts +144 -0
  274. package/lib/zhin-agent/task-continuation.d.ts.map +1 -0
  275. package/lib/zhin-agent/task-continuation.js +346 -0
  276. package/lib/zhin-agent/task-continuation.js.map +1 -0
  277. package/lib/zhin-agent/text-sanitize.d.ts +2 -5
  278. package/lib/zhin-agent/text-sanitize.d.ts.map +1 -1
  279. package/lib/zhin-agent/text-sanitize.js +2 -25
  280. package/lib/zhin-agent/text-sanitize.js.map +1 -1
  281. package/lib/zhin-agent/tool-calls-user-format.d.ts.map +1 -1
  282. package/lib/zhin-agent/tool-calls-user-format.js +12 -3
  283. package/lib/zhin-agent/tool-calls-user-format.js.map +1 -1
  284. package/lib/zhin-agent/tool-orchestration.d.ts +9 -0
  285. package/lib/zhin-agent/tool-orchestration.d.ts.map +1 -0
  286. package/lib/zhin-agent/tool-orchestration.js +68 -0
  287. package/lib/zhin-agent/tool-orchestration.js.map +1 -0
  288. package/lib/zhin-agent/tool-search-orchestrator.d.ts.map +1 -1
  289. package/lib/zhin-agent/tool-search-orchestrator.js +5 -2
  290. package/lib/zhin-agent/tool-search-orchestrator.js.map +1 -1
  291. package/lib/zhin-agent/turn-pipeline.d.ts +5 -0
  292. package/lib/zhin-agent/turn-pipeline.d.ts.map +1 -0
  293. package/lib/zhin-agent/turn-pipeline.js +541 -0
  294. package/lib/zhin-agent/turn-pipeline.js.map +1 -0
  295. package/lib/zhin-agent/turn-tracker.d.ts +17 -0
  296. package/lib/zhin-agent/turn-tracker.d.ts.map +1 -0
  297. package/lib/zhin-agent/turn-tracker.js +54 -0
  298. package/lib/zhin-agent/turn-tracker.js.map +1 -0
  299. package/lib/zhin-agent/web-search-locale-attach.d.ts +4 -0
  300. package/lib/zhin-agent/web-search-locale-attach.d.ts.map +1 -0
  301. package/lib/zhin-agent/web-search-locale-attach.js +19 -0
  302. package/lib/zhin-agent/web-search-locale-attach.js.map +1 -0
  303. package/lib/zhin-agent/zhin-agent-private.d.ts +66 -0
  304. package/lib/zhin-agent/zhin-agent-private.d.ts.map +1 -0
  305. package/lib/zhin-agent/zhin-agent-private.js +4 -0
  306. package/lib/zhin-agent/zhin-agent-private.js.map +1 -0
  307. package/package.json +5 -5
@@ -0,0 +1,311 @@
1
+ /**
2
+ * 消息处理状态适配层
3
+ *
4
+ * 提供统一的接口来提示用户"AI 正在处理",
5
+ * 不同平台可以有不同的实现方式:
6
+ * - ICQQ:消息回应表情
7
+ * - 其他平台:发送一条消息
8
+ * - 支持配置和自定义
9
+ */
10
+ // ── 默认配置 ──────────────────────────────────────────────────────────
11
+ const DEFAULT_CONFIG = {
12
+ type: 'reaction',
13
+ emoji: '⏳',
14
+ message: '正在处理中...',
15
+ autoRemove: true,
16
+ removeDelay: 5000,
17
+ };
18
+ // ── 反应式提示(默认) ────────────────────────────────────────────────
19
+ export class ReactionTypingIndicator {
20
+ options;
21
+ config;
22
+ addReaction;
23
+ removeReaction;
24
+ active = false;
25
+ reactionId = null;
26
+ constructor(options, config, addReaction, removeReaction) {
27
+ this.options = options;
28
+ this.config = config;
29
+ this.addReaction = addReaction;
30
+ this.removeReaction = removeReaction;
31
+ }
32
+ async start() {
33
+ if (this.active || !this.options.messageId) {
34
+ return;
35
+ }
36
+ try {
37
+ this.reactionId = await this.addReaction(this.options.messageId, this.config.emoji || '⏳');
38
+ this.active = true;
39
+ }
40
+ catch (error) {
41
+ console.error('[TypingIndicator] Failed to add reaction:', error);
42
+ }
43
+ }
44
+ async stop() {
45
+ if (!this.active || !this.reactionId || !this.options.messageId) {
46
+ return;
47
+ }
48
+ try {
49
+ await this.removeReaction(this.options.messageId, this.reactionId);
50
+ this.active = false;
51
+ this.reactionId = null;
52
+ }
53
+ catch (error) {
54
+ console.error('[TypingIndicator] Failed to remove reaction:', error);
55
+ }
56
+ }
57
+ isActive() {
58
+ return this.active;
59
+ }
60
+ }
61
+ // ── 消息式提示 ────────────────────────────────────────────────────────
62
+ export class MessageTypingIndicator {
63
+ options;
64
+ config;
65
+ sendMessage;
66
+ deleteMessage;
67
+ editMessage;
68
+ active = false;
69
+ messageId = null;
70
+ constructor(options, config, sendMessage, deleteMessage, editMessage) {
71
+ this.options = options;
72
+ this.config = config;
73
+ this.sendMessage = sendMessage;
74
+ this.deleteMessage = deleteMessage;
75
+ this.editMessage = editMessage;
76
+ }
77
+ async start() {
78
+ if (this.active) {
79
+ return;
80
+ }
81
+ try {
82
+ const sessionId = this.options.sessionId;
83
+ if (!sessionId) {
84
+ return;
85
+ }
86
+ this.messageId = await this.sendMessage(sessionId, this.config.message || '正在处理中...');
87
+ this.active = true;
88
+ }
89
+ catch (error) {
90
+ console.error('[TypingIndicator] Failed to send message:', error);
91
+ }
92
+ }
93
+ async update(message) {
94
+ if (!this.active || !this.messageId) {
95
+ return;
96
+ }
97
+ if (this.editMessage) {
98
+ try {
99
+ await this.editMessage(this.messageId, message);
100
+ }
101
+ catch (error) {
102
+ console.error('[TypingIndicator] Failed to edit message:', error);
103
+ }
104
+ }
105
+ }
106
+ async stop() {
107
+ if (!this.active || !this.messageId) {
108
+ return;
109
+ }
110
+ try {
111
+ if (this.config.autoRemove) {
112
+ await this.deleteMessage(this.messageId);
113
+ }
114
+ this.active = false;
115
+ this.messageId = null;
116
+ }
117
+ catch (error) {
118
+ console.error('[TypingIndicator] Failed to delete message:', error);
119
+ }
120
+ }
121
+ isActive() {
122
+ return this.active;
123
+ }
124
+ }
125
+ // ── 空提示(不显示) ──────────────────────────────────────────────────
126
+ export class NoneTypingIndicator {
127
+ async start() { }
128
+ async stop() { }
129
+ isActive() {
130
+ return false;
131
+ }
132
+ }
133
+ // ── 提示管理器 ────────────────────────────────────────────────────────
134
+ export class TypingIndicatorManager {
135
+ adapters = new Map();
136
+ activeIndicators = new Map();
137
+ defaultConfig;
138
+ constructor(defaultConfig = {}) {
139
+ this.defaultConfig = { ...DEFAULT_CONFIG, ...defaultConfig };
140
+ }
141
+ /**
142
+ * 注册平台适配器
143
+ */
144
+ registerAdapter(adapter) {
145
+ this.adapters.set(adapter.platform, adapter);
146
+ }
147
+ /**
148
+ * 获取平台适配器
149
+ */
150
+ getAdapter(platform) {
151
+ return this.adapters.get(platform);
152
+ }
153
+ /**
154
+ * 创建提示实例
155
+ */
156
+ createIndicator(options, config) {
157
+ const adapter = this.adapters.get(options.platform);
158
+ if (!adapter) {
159
+ console.warn(`[TypingIndicator] No adapter for platform: ${options.platform}`);
160
+ return new NoneTypingIndicator();
161
+ }
162
+ const mergedConfig = { ...this.defaultConfig, ...config };
163
+ // 检查平台是否支持该提示类型
164
+ if (!adapter.supportedTypes.includes(mergedConfig.type)) {
165
+ console.warn(`[TypingIndicator] Platform ${options.platform} does not support type: ${mergedConfig.type}`);
166
+ // 回退到第一个支持的类型
167
+ if (adapter.supportedTypes.length > 0) {
168
+ mergedConfig.type = adapter.supportedTypes[0];
169
+ }
170
+ else {
171
+ return new NoneTypingIndicator();
172
+ }
173
+ }
174
+ return adapter.createIndicator(options, mergedConfig);
175
+ }
176
+ /**
177
+ * 开始提示
178
+ */
179
+ async start(options, config) {
180
+ const indicator = this.createIndicator(options, config);
181
+ await indicator.start();
182
+ // 存储活跃的指示器
183
+ const key = this.getIndicatorKey(options);
184
+ this.activeIndicators.set(key, indicator);
185
+ return indicator;
186
+ }
187
+ /**
188
+ * 停止提示
189
+ */
190
+ async stop(options) {
191
+ const key = this.getIndicatorKey(options);
192
+ const indicator = this.activeIndicators.get(key);
193
+ if (indicator) {
194
+ await indicator.stop();
195
+ this.activeIndicators.delete(key);
196
+ }
197
+ }
198
+ /**
199
+ * 停止所有提示
200
+ */
201
+ async stopAll() {
202
+ for (const [key, indicator] of this.activeIndicators.entries()) {
203
+ try {
204
+ await indicator.stop();
205
+ }
206
+ catch (error) {
207
+ console.error(`[TypingIndicator] Failed to stop indicator ${key}:`, error);
208
+ }
209
+ }
210
+ this.activeIndicators.clear();
211
+ }
212
+ /**
213
+ * 获取活跃的提示
214
+ */
215
+ getActiveIndicator(options) {
216
+ const key = this.getIndicatorKey(options);
217
+ return this.activeIndicators.get(key);
218
+ }
219
+ /**
220
+ * 生成指示器键
221
+ */
222
+ getIndicatorKey(options) {
223
+ return `${options.platform}:${options.botId}:${options.sessionId || options.messageId}`;
224
+ }
225
+ }
226
+ // ── 预定义适配器 ──────────────────────────────────────────────────────
227
+ /**
228
+ * ICQQ 适配器(使用消息回应)
229
+ */
230
+ export class ReactionTypingIndicatorAdapter {
231
+ addReaction;
232
+ removeReaction;
233
+ sendMessage;
234
+ deleteMessage;
235
+ editMessage;
236
+ platform = 'icqq';
237
+ supportedTypes = ['reaction', 'message'];
238
+ constructor(addReaction, removeReaction, sendMessage, deleteMessage, editMessage) {
239
+ this.addReaction = addReaction;
240
+ this.removeReaction = removeReaction;
241
+ this.sendMessage = sendMessage;
242
+ this.deleteMessage = deleteMessage;
243
+ this.editMessage = editMessage;
244
+ }
245
+ createIndicator(options, config) {
246
+ switch (config.type) {
247
+ case 'reaction':
248
+ return new ReactionTypingIndicator(options, config, this.addReaction, this.removeReaction);
249
+ case 'message':
250
+ return new MessageTypingIndicator(options, config, this.sendMessage, this.deleteMessage, this.editMessage);
251
+ default:
252
+ return new NoneTypingIndicator();
253
+ }
254
+ }
255
+ }
256
+ /**
257
+ * 通用适配器(使用消息)
258
+ */
259
+ export class GenericTypingIndicatorAdapter {
260
+ sendMessage;
261
+ deleteMessage;
262
+ editMessage;
263
+ platform;
264
+ supportedTypes = ['message', 'none'];
265
+ constructor(platform, sendMessage, deleteMessage, editMessage) {
266
+ this.sendMessage = sendMessage;
267
+ this.deleteMessage = deleteMessage;
268
+ this.editMessage = editMessage;
269
+ this.platform = platform;
270
+ }
271
+ createIndicator(options, config) {
272
+ switch (config.type) {
273
+ case 'message':
274
+ return new MessageTypingIndicator(options, config, this.sendMessage, this.deleteMessage, this.editMessage);
275
+ default:
276
+ return new NoneTypingIndicator();
277
+ }
278
+ }
279
+ }
280
+ // ── 全局实例 ──────────────────────────────────────────────────────────
281
+ let globalManager = null;
282
+ /**
283
+ * 获取全局提示管理器
284
+ */
285
+ export function getTypingIndicatorManager() {
286
+ if (!globalManager) {
287
+ globalManager = new TypingIndicatorManager();
288
+ }
289
+ return globalManager;
290
+ }
291
+ /**
292
+ * 初始化提示管理器
293
+ */
294
+ export function initTypingIndicatorManager(defaultConfig) {
295
+ globalManager = new TypingIndicatorManager(defaultConfig);
296
+ return globalManager;
297
+ }
298
+ // ── 便捷函数 ──────────────────────────────────────────────────────────
299
+ /**
300
+ * 快速开始提示
301
+ */
302
+ export async function startTypingIndicator(options, config) {
303
+ return getTypingIndicatorManager().start(options, config);
304
+ }
305
+ /**
306
+ * 快速停止提示
307
+ */
308
+ export async function stopTypingIndicator(options) {
309
+ return getTypingIndicatorManager().stop(options);
310
+ }
311
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/typing-indicator/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Typing Indicator 集成示例
3
+ *
4
+ * 展示如何在 ZhinAgent 中集成消息处理状态提示
5
+ */
6
+ import type { Plugin, Bot } from '@zhin.js/core';
7
+ import { TypingIndicatorManager, ReactionTypingIndicatorAdapter, GenericTypingIndicatorAdapter, type TypingIndicatorConfig } from './index.js';
8
+ export interface ZhinAgentTypingConfig {
9
+ /** 是否启用 */
10
+ enabled: boolean;
11
+ /** 默认提示类型 */
12
+ defaultType: 'reaction' | 'message' | 'typing' | 'none';
13
+ /** 默认表情(reaction 类型) */
14
+ defaultEmoji: string;
15
+ /** 默认消息(message 类型) */
16
+ defaultMessage: string;
17
+ /** 是否自动移除 */
18
+ autoRemove: boolean;
19
+ /** 自动移除延迟(毫秒) */
20
+ removeDelay: number;
21
+ /** 平台特定配置 */
22
+ platformConfigs?: Record<string, Partial<TypingIndicatorConfig>>;
23
+ }
24
+ /**
25
+ * 为 ZhinAgent 创建 Typing Indicator 管理器
26
+ */
27
+ export declare function createTypingIndicatorManagerForZhinAgent(plugin: Plugin, config?: Partial<ZhinAgentTypingConfig>): TypingIndicatorManager;
28
+ /**
29
+ * ICQQ Bot 接口扩展
30
+ */
31
+ interface ICQQBot extends Bot {
32
+ $addReaction?(messageId: string, emoji: string): Promise<string | null>;
33
+ $removeReaction?(messageId: string, reactionId: string): Promise<void>;
34
+ }
35
+ /**
36
+ * 创建 ICQQ 适配器
37
+ *
38
+ * 注意:实际使用时需要从 ICQQ 适配器实例获取 bot
39
+ * 这里提供的是示例实现框架
40
+ */
41
+ export declare function createICQQAdapterFromBot(bot: ICQQBot): ReactionTypingIndicatorAdapter;
42
+ /**
43
+ * 创建通用适配器
44
+ */
45
+ export declare function createGenericAdapterFromBot(bot: Bot, platform: string): GenericTypingIndicatorAdapter;
46
+ export interface AgentProcessContext {
47
+ /** 消息 ID */
48
+ messageId?: string;
49
+ /** 会话 ID */
50
+ sessionId: string;
51
+ /** 用户 ID */
52
+ userId: string;
53
+ /** 群组 ID */
54
+ groupId?: string;
55
+ /** 平台 */
56
+ platform: string;
57
+ /** Bot ID */
58
+ botId: string;
59
+ /** 场景类型 */
60
+ sceneType: 'private' | 'group' | 'channel';
61
+ }
62
+ /**
63
+ * 在 Agent 处理过程中使用 Typing Indicator
64
+ *
65
+ * 使用示例:
66
+ * ```typescript
67
+ * const manager = createTypingIndicatorManagerForZhinAgent(plugin);
68
+ *
69
+ * // 开始处理时
70
+ * const indicator = await manager.start({
71
+ * platform: 'icqq',
72
+ * botId: '75318',
73
+ * sessionId: 'private:liuchunlang',
74
+ * messageId: '123456',
75
+ * sceneType: 'private',
76
+ * }, {
77
+ * type: 'reaction',
78
+ * emoji: '⏳',
79
+ * });
80
+ *
81
+ * // 处理完成后
82
+ * await indicator.stop();
83
+ * ```
84
+ */
85
+ export declare function withTypingIndicator<T>(manager: TypingIndicatorManager, context: AgentProcessContext, config: Partial<TypingIndicatorConfig>, fn: () => Promise<T>): Promise<T>;
86
+ /**
87
+ * 从平台配置解析 Typing Indicator 配置
88
+ */
89
+ export declare function resolveTypingIndicatorConfig(platform: string, platformConfig?: Record<string, unknown>): Partial<TypingIndicatorConfig>;
90
+ export {};
91
+ //# sourceMappingURL=integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../src/typing-indicator/integration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EACL,sBAAsB,EACtB,8BAA8B,EAC9B,6BAA6B,EAE7B,KAAK,qBAAqB,EAC3B,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,qBAAqB;IACpC,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa;IACb,WAAW,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxD,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;CAClE;AAWD;;GAEG;AACH,wBAAgB,wCAAwC,CACtD,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,OAAO,CAAC,qBAAqB,CAAM,GAC1C,sBAAsB,CAgBxB;AAED;;GAEG;AACH,UAAU,OAAQ,SAAQ,GAAG;IAC3B,YAAY,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxE,eAAe,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,8BAA8B,CA4DrF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,6BAA6B,CAiCrG;AAID,MAAM,WAAW,mBAAmB;IAClC,YAAY;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,YAAY;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,SAAS,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAID;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,OAAO,CAAC,qBAAqB,CAAC,CAwChC"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Typing Indicator 集成示例
3
+ *
4
+ * 展示如何在 ZhinAgent 中集成消息处理状态提示
5
+ */
6
+ import { getPlugin } from '@zhin.js/core';
7
+ import { TypingIndicatorManager, ReactionTypingIndicatorAdapter, GenericTypingIndicatorAdapter, } from './index.js';
8
+ const DEFAULT_TYPING_CONFIG = {
9
+ enabled: true,
10
+ defaultType: 'reaction',
11
+ defaultEmoji: '⏳',
12
+ defaultMessage: '正在处理中...',
13
+ autoRemove: true,
14
+ removeDelay: 5000,
15
+ };
16
+ /**
17
+ * 为 ZhinAgent 创建 Typing Indicator 管理器
18
+ */
19
+ export function createTypingIndicatorManagerForZhinAgent(plugin, config = {}) {
20
+ const mergedConfig = { ...DEFAULT_TYPING_CONFIG, ...config };
21
+ const manager = new TypingIndicatorManager({
22
+ type: mergedConfig.defaultType,
23
+ emoji: mergedConfig.defaultEmoji,
24
+ message: mergedConfig.defaultMessage,
25
+ autoRemove: mergedConfig.autoRemove,
26
+ removeDelay: mergedConfig.removeDelay,
27
+ });
28
+ // 注册 ICQQ 适配器(如果存在)
29
+ // 注意:实际使用时需要从适配器实例获取 bot
30
+ // 这里提供的是示例实现
31
+ return manager;
32
+ }
33
+ /**
34
+ * 创建 ICQQ 适配器
35
+ *
36
+ * 注意:实际使用时需要从 ICQQ 适配器实例获取 bot
37
+ * 这里提供的是示例实现框架
38
+ */
39
+ export function createICQQAdapterFromBot(bot) {
40
+ const addReaction = async (messageId, emoji) => {
41
+ try {
42
+ if (bot.$addReaction) {
43
+ return await bot.$addReaction(messageId, emoji);
44
+ }
45
+ return null;
46
+ }
47
+ catch (error) {
48
+ console.error('[ICQQ] Failed to add reaction:', error);
49
+ return null;
50
+ }
51
+ };
52
+ const removeReaction = async (messageId, reactionId) => {
53
+ try {
54
+ if (bot.$removeReaction) {
55
+ await bot.$removeReaction(messageId, reactionId);
56
+ }
57
+ }
58
+ catch (error) {
59
+ console.error('[ICQQ] Failed to remove reaction:', error);
60
+ }
61
+ };
62
+ const sendMessage = async (sessionId, content) => {
63
+ try {
64
+ const [type, id] = sessionId.split(':');
65
+ const rootPlugin = getPlugin()?.root;
66
+ const adapterInstance = rootPlugin?.injectAdapter('icqq');
67
+ const sendOptions = {
68
+ type: type,
69
+ id,
70
+ context: 'icqq',
71
+ bot: bot.$id,
72
+ content: [{ type: 'text', data: { text: content } }],
73
+ };
74
+ if (adapterInstance && typeof adapterInstance.sendMessage === 'function') {
75
+ return await adapterInstance.sendMessage(sendOptions);
76
+ }
77
+ const typedBot = bot;
78
+ return await typedBot.$sendMessage?.(sendOptions) ?? null;
79
+ }
80
+ catch (error) {
81
+ console.error('[ICQQ] Failed to send message:', error);
82
+ return null;
83
+ }
84
+ };
85
+ const deleteMessage = async (messageId) => {
86
+ try {
87
+ await bot.$recallMessage(messageId);
88
+ }
89
+ catch (error) {
90
+ console.error('[ICQQ] Failed to delete message:', error);
91
+ }
92
+ };
93
+ return new ReactionTypingIndicatorAdapter(addReaction, removeReaction, sendMessage, deleteMessage);
94
+ }
95
+ /**
96
+ * 创建通用适配器
97
+ */
98
+ export function createGenericAdapterFromBot(bot, platform) {
99
+ const sendMessage = async (sessionId, content) => {
100
+ try {
101
+ const [type, id] = sessionId.split(':');
102
+ const rootPlugin = getPlugin()?.root;
103
+ const adapterInstance = rootPlugin?.injectAdapter(platform);
104
+ const sendOptions = {
105
+ type: type,
106
+ id,
107
+ context: platform,
108
+ bot: bot.$id,
109
+ content: [{ type: 'text', data: { text: content } }],
110
+ };
111
+ if (adapterInstance && typeof adapterInstance.sendMessage === 'function') {
112
+ return await adapterInstance.sendMessage(sendOptions);
113
+ }
114
+ const typedBot = bot;
115
+ return await typedBot.$sendMessage?.(sendOptions) ?? null;
116
+ }
117
+ catch (error) {
118
+ console.error(`[${platform}] Failed to send message:`, error);
119
+ return null;
120
+ }
121
+ };
122
+ const deleteMessage = async (messageId) => {
123
+ try {
124
+ await bot.$recallMessage(messageId);
125
+ }
126
+ catch (error) {
127
+ console.error(`[${platform}] Failed to delete message:`, error);
128
+ }
129
+ };
130
+ return new GenericTypingIndicatorAdapter(platform, sendMessage, deleteMessage);
131
+ }
132
+ /**
133
+ * 在 Agent 处理过程中使用 Typing Indicator
134
+ *
135
+ * 使用示例:
136
+ * ```typescript
137
+ * const manager = createTypingIndicatorManagerForZhinAgent(plugin);
138
+ *
139
+ * // 开始处理时
140
+ * const indicator = await manager.start({
141
+ * platform: 'icqq',
142
+ * botId: '75318',
143
+ * sessionId: 'private:liuchunlang',
144
+ * messageId: '123456',
145
+ * sceneType: 'private',
146
+ * }, {
147
+ * type: 'reaction',
148
+ * emoji: '⏳',
149
+ * });
150
+ *
151
+ * // 处理完成后
152
+ * await indicator.stop();
153
+ * ```
154
+ */
155
+ export async function withTypingIndicator(manager, context, config, fn) {
156
+ const options = {
157
+ messageId: context.messageId,
158
+ sessionId: context.sessionId,
159
+ userId: context.userId,
160
+ groupId: context.groupId,
161
+ platform: context.platform,
162
+ botId: context.botId,
163
+ sceneType: context.sceneType,
164
+ };
165
+ // 开始提示
166
+ const indicator = await manager.start(options, config);
167
+ try {
168
+ // 执行实际处理
169
+ const result = await fn();
170
+ return result;
171
+ }
172
+ finally {
173
+ // 停止提示
174
+ await indicator.stop();
175
+ }
176
+ }
177
+ // ── 配置解析 ──────────────────────────────────────────────────────────
178
+ /**
179
+ * 从平台配置解析 Typing Indicator 配置
180
+ */
181
+ export function resolveTypingIndicatorConfig(platform, platformConfig) {
182
+ const defaultConfigs = {
183
+ icqq: {
184
+ type: 'reaction',
185
+ emoji: '⏳',
186
+ autoRemove: true,
187
+ },
188
+ qq: {
189
+ type: 'reaction',
190
+ emoji: '⏳',
191
+ autoRemove: true,
192
+ },
193
+ wechat: {
194
+ type: 'message',
195
+ message: '正在思考...',
196
+ autoRemove: true,
197
+ removeDelay: 3000,
198
+ },
199
+ telegram: {
200
+ type: 'typing',
201
+ autoRemove: true,
202
+ },
203
+ discord: {
204
+ type: 'typing',
205
+ autoRemove: true,
206
+ },
207
+ };
208
+ const defaultConfig = defaultConfigs[platform] || {
209
+ type: 'message',
210
+ message: '正在处理中...',
211
+ autoRemove: true,
212
+ };
213
+ // 合并平台特定配置
214
+ if (platformConfig) {
215
+ return { ...defaultConfig, ...platformConfig };
216
+ }
217
+ return defaultConfig;
218
+ }
219
+ //# sourceMappingURL=integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.js","sourceRoot":"","sources":["../../src/typing-indicator/integration.ts"],"names":[],"mappings":"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"}