@dsh-plugin/dsh-synapse 0.1.0-dev.41044228975 → 0.1.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.
Files changed (74) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +0 -14
  3. package/package.json +1 -1
  4. package/vendor/gugle-chat-bot/LICENSE +661 -661
  5. package/vendor/gugle-chat-bot/package.json +57 -57
  6. package/vendor/gugle-chat-bot/src/allow-rule.yml +9345 -9345
  7. package/vendor/gugle-chat-bot/src/api.json +4284 -4284
  8. package/vendor/gugle-chat-bot/src/command/index.ts +141 -141
  9. package/vendor/gugle-chat-bot/src/config/features.ts +547 -547
  10. package/vendor/gugle-chat-bot/src/config/index.ts +184 -184
  11. package/vendor/gugle-chat-bot/src/config/manager.ts +356 -356
  12. package/vendor/gugle-chat-bot/src/constants/index.ts +13 -13
  13. package/vendor/gugle-chat-bot/src/custom.ts +548 -548
  14. package/vendor/gugle-chat-bot/src/event/index.ts +118 -118
  15. package/vendor/gugle-chat-bot/src/features/admin/index.ts +414 -414
  16. package/vendor/gugle-chat-bot/src/features/bili/image/impl/video.ts +39 -39
  17. package/vendor/gugle-chat-bot/src/features/bili/image/index.ts +37 -37
  18. package/vendor/gugle-chat-bot/src/features/bili/index.ts +65 -65
  19. package/vendor/gugle-chat-bot/src/features/bili/template/style/video.css +97 -97
  20. package/vendor/gugle-chat-bot/src/features/bili/template/video.html +56 -56
  21. package/vendor/gugle-chat-bot/src/features/discord-bridge/index.ts +1128 -1128
  22. package/vendor/gugle-chat-bot/src/features/discord-bridge/markdown.ts +105 -105
  23. package/vendor/gugle-chat-bot/src/features/discord-bridge/slash.ts +355 -355
  24. package/vendor/gugle-chat-bot/src/features/discord-bridge/source.ts +96 -96
  25. package/vendor/gugle-chat-bot/src/features/discord-bridge/template/message.html +14 -14
  26. package/vendor/gugle-chat-bot/src/features/discord-bridge/template/style/message.css +144 -144
  27. package/vendor/gugle-chat-bot/src/features/github/api.ts +93 -93
  28. package/vendor/gugle-chat-bot/src/features/github/binding.ts +161 -161
  29. package/vendor/gugle-chat-bot/src/features/github/image/impl/issue.ts +132 -132
  30. package/vendor/gugle-chat-bot/src/features/github/image/impl/pr.ts +144 -144
  31. package/vendor/gugle-chat-bot/src/features/github/image/impl/release.ts +160 -160
  32. package/vendor/gugle-chat-bot/src/features/github/image/index.ts +310 -310
  33. package/vendor/gugle-chat-bot/src/features/github/index.ts +302 -302
  34. package/vendor/gugle-chat-bot/src/features/github/template/issue.html +118 -118
  35. package/vendor/gugle-chat-bot/src/features/github/template/pull_request.html +125 -125
  36. package/vendor/gugle-chat-bot/src/features/github/template/release.html +53 -53
  37. package/vendor/gugle-chat-bot/src/features/github/template/style/issue.css +468 -468
  38. package/vendor/gugle-chat-bot/src/features/github/template/style/pull_request.css +468 -468
  39. package/vendor/gugle-chat-bot/src/features/github/template/style/release.css +412 -412
  40. package/vendor/gugle-chat-bot/src/features/hermes/client.ts +184 -184
  41. package/vendor/gugle-chat-bot/src/features/hermes/config.ts +210 -210
  42. package/vendor/gugle-chat-bot/src/features/hermes/context.ts +67 -67
  43. package/vendor/gugle-chat-bot/src/features/hermes/history.ts +86 -86
  44. package/vendor/gugle-chat-bot/src/features/hermes/index.ts +1533 -1533
  45. package/vendor/gugle-chat-bot/src/features/hermes/message.ts +319 -319
  46. package/vendor/gugle-chat-bot/src/features/hermes/reaction.ts +181 -181
  47. package/vendor/gugle-chat-bot/src/features/hermes/render.ts +118 -118
  48. package/vendor/gugle-chat-bot/src/features/hermes/reply-units.ts +331 -331
  49. package/vendor/gugle-chat-bot/src/features/hermes/skills.ts +406 -406
  50. package/vendor/gugle-chat-bot/src/features/hermes/template/approval.html +30 -30
  51. package/vendor/gugle-chat-bot/src/features/hermes/template/progress.html +21 -21
  52. package/vendor/gugle-chat-bot/src/features/hermes/template/style/approval.css +81 -81
  53. package/vendor/gugle-chat-bot/src/features/hermes/template/style/progress.css +120 -120
  54. package/vendor/gugle-chat-bot/src/features/hermes/trigger.ts +86 -86
  55. package/vendor/gugle-chat-bot/src/features/hermes/types.ts +327 -327
  56. package/vendor/gugle-chat-bot/src/features/management/index.ts +156 -156
  57. package/vendor/gugle-chat-bot/src/features/minecraft/index.ts +127 -127
  58. package/vendor/gugle-chat-bot/src/features/modrinth/index.ts +71 -71
  59. package/vendor/gugle-chat-bot/src/features/parentheses/index.ts +117 -117
  60. package/vendor/gugle-chat-bot/src/features/peak-valley-timer/index.ts +451 -451
  61. package/vendor/gugle-chat-bot/src/features/poke/index.ts +24 -24
  62. package/vendor/gugle-chat-bot/src/features/version-tracker/index.ts +77 -77
  63. package/vendor/gugle-chat-bot/src/features/welcome/index.ts +57 -57
  64. package/vendor/gugle-chat-bot/src/github-ip.json +5814 -5814
  65. package/vendor/gugle-chat-bot/src/image/index.ts +278 -278
  66. package/vendor/gugle-chat-bot/src/index.ts +695 -695
  67. package/vendor/gugle-chat-bot/src/logger/index.ts +54 -54
  68. package/vendor/gugle-chat-bot/src/result.json +359 -359
  69. package/vendor/gugle-chat-bot/src/type/bili.d.ts +825 -825
  70. package/vendor/gugle-chat-bot/src/type/event.d.ts +146 -146
  71. package/vendor/gugle-chat-bot/src/type/github.d.ts +446 -446
  72. package/vendor/gugle-chat-bot/src/type/index.d.ts +254 -254
  73. package/vendor/gugle-chat-bot/tsconfig.json +46 -46
  74. package/scripts/dump-npm-latest.mjs +0 -30
@@ -1,327 +1,327 @@
1
- /**
2
- * Hermes 桥接类型定义(移植自 qq-hermes-bridge src/types.d.ts,MIT 协议,原作者 Amorter)。
3
- * OneBot 消息段类型复用 @/type,此处只保留 Hermes API / 会话 / 审批 / 技能相关类型。
4
- */
5
-
6
- import type { QQBot } from '@/index';
7
-
8
- // ── 路由 ──
9
-
10
- /**
11
- * Discord 路由的发送委托(由 DiscordBridge 注入,随 RouteInfo 传递)。
12
- * HermesBridge 不直接持有 discord.js Client,经委托向原频道发送回复/图片。
13
- */
14
- export interface DiscordRouteContext {
15
- guildName: string;
16
- channelName: string;
17
- /** 发送者是否为 Discord 侧管理员(服务器拥有者/管理服务器/管理员权限) */
18
- isAdmin: boolean;
19
- /** 发送文本;quote=true 时首条引用原始消息 */
20
- send(text: string, quote: boolean): Promise<void>;
21
- /** 发送 base64 图片(Discord 附件) */
22
- sendImage(base64: string): Promise<void>;
23
- /** 摘除机器人对触发消息的「处理中」表情回应(由 DiscordBridge 注入,绑定原消息) */
24
- removeReaction?(): Promise<void>;
25
- }
26
-
27
- /** handleDiscordMessage 的调用参数(DiscordRouteContext + 消息元信息) */
28
- export interface DiscordChatParams extends DiscordRouteContext {
29
- /** 该频道桥接的 QQ 群号(会话共享与启用门控) */
30
- groupId: string;
31
- /** bot 的 Discord 用户 ID(@提及检测与剔除) */
32
- botUserId?: string;
33
- }
34
-
35
- /** 消息来源路由:QQ 群聊、QQ 私聊或 Discord 频道 */
36
- export interface RouteInfo {
37
- type: 'group' | 'user' | 'discord';
38
- /** QQ 群号;discord 路由为桥接的 QQ 群号(与 QQ 群共享会话上下文) */
39
- groupId?: string;
40
- /** QQ 号字符串;discord 路由为 `dc:<Discord用户ID>` */
41
- userId: string;
42
- /** discord 路由:频道 ID */
43
- channelId?: string;
44
- /** discord 路由:发送委托(DiscordBridge 注入) */
45
- discord?: DiscordRouteContext;
46
- }
47
-
48
- // ── 会话 ──
49
-
50
- /** 对话历史条目 */
51
- export interface HistoryEntry {
52
- role: string;
53
- content: string;
54
- /** 发言人(user 消息)或回复对象(assistant 消息)的用户 id */
55
- userId?: string;
56
- /** assistant 消息回复对象的发送者标签(用于在历史中标注「你回复 xxx 的话」) */
57
- label?: string;
58
- }
59
-
60
- /** 对话会话 */
61
- export interface Session {
62
- history: HistoryEntry[];
63
- sessionVersion: number;
64
- }
65
-
66
- // ── 运行状态 ──
67
-
68
- /** 活跃运行中的工具调用记录 */
69
- export interface RunToolRecord {
70
- name: string;
71
- duration: number;
72
- error: boolean;
73
- preview?: string;
74
- }
75
-
76
- /** 活跃运行中正在执行的工具 */
77
- export interface RunCurrentTool {
78
- name: string;
79
- preview?: string;
80
- startedAt: number;
81
- }
82
-
83
- /** 活跃的 Hermes 运行状态 */
84
- export interface RunState {
85
- route: RouteInfo;
86
- tools: RunToolRecord[];
87
- currentTool: RunCurrentTool | null;
88
- startedAt: number;
89
- lastProgressSent: number;
90
- sendingProgress: boolean;
91
- messageDelta: string;
92
- pendingText: string;
93
- sentTextLength: number;
94
- lastTextSent: number;
95
- finalOutput: string;
96
- userMsgId: number;
97
- /** 本轮对话发送者的展示标签(assistant 历史据此标注回复对象) */
98
- senderLabel: string;
99
- /** 工具结果回喂轮次(0 = 用户消息首轮;达上限后查询结果不再回喂,直接附在回复里) */
100
- feedbackDepth?: number;
101
- /** 「处理中」表情回应的持久化记录键(回喂轮转移给下一轮,对话链完全结束时摘除) */
102
- reactionKey?: string;
103
- /** 本轮是否已经贴过引用(逐句发送时只有首条单元贴引用,避免每条都重复引用) */
104
- replySent?: boolean;
105
- /** 本轮是否以 run.failed 结束(失败文案必须发出,不因已逐句下发而跳过) */
106
- failed?: boolean;
107
- /** 私聊文字回执的消息 id(AI 开始回复时撤回;QQ 表情回应失败时的降级方案) */
108
- receiptId?: number;
109
- /** 回执是否已转移给查询技能的回喂轮(转移后由下一轮负责撤回) */
110
- receiptTransferred?: boolean;
111
- /**
112
- * 发送串行链:所有逐句/尾段发送都挂到这条链上按序执行。
113
- * message.delta 的 flush 是 fire-and-forget,若并发执行会互相插队,
114
- * 导致分条消息顺序错乱(后一批的句子插到前一批未发完的句子之前)。
115
- */
116
- sendChain?: Promise<void>;
117
- stream?: { abort(): void };
118
- }
119
-
120
- // ── 审批 ──
121
-
122
- /** 待审批记录 */
123
- export interface Approval {
124
- runId: string;
125
- route: RouteInfo;
126
- data: HermesApprovalEvent;
127
- createdAt: number;
128
- timeoutTimer?: ReturnType<typeof setTimeout>;
129
- }
130
-
131
- /** 审批选择 */
132
- export type ApprovalChoice = 'once' | 'deny' | 'always' | 'session';
133
-
134
- // ── Hermes SSE 事件类型 ──
135
-
136
- export interface HermesToolStartedEvent {
137
- event: 'tool.started';
138
- run_id: string;
139
- timestamp: number;
140
- tool: string;
141
- preview?: string;
142
- }
143
-
144
- export interface HermesToolCompletedEvent {
145
- event: 'tool.completed';
146
- run_id: string;
147
- timestamp: number;
148
- tool: string;
149
- duration: number;
150
- error: boolean;
151
- }
152
-
153
- export interface HermesMessageDeltaEvent {
154
- event: 'message.delta';
155
- run_id: string;
156
- timestamp: number;
157
- delta: string;
158
- }
159
-
160
- export interface HermesApprovalEvent {
161
- event: 'approval.request';
162
- run_id: string;
163
- timestamp: number;
164
- command: string;
165
- pattern_key?: string;
166
- description?: string;
167
- }
168
-
169
- export interface HermesRunCompletedEvent {
170
- event: 'run.completed';
171
- run_id: string;
172
- timestamp: number;
173
- output: string;
174
- }
175
-
176
- export interface HermesRunFailedEvent {
177
- event: 'run.failed';
178
- run_id: string;
179
- timestamp: number;
180
- error: string;
181
- }
182
-
183
- export interface HermesReasoningEvent {
184
- event: 'reasoning.available';
185
- run_id: string;
186
- timestamp: number;
187
- text: string;
188
- }
189
-
190
- /** Hermes SSE 事件联合类型 */
191
- export type HermesSSEEvent =
192
- | HermesToolStartedEvent
193
- | HermesToolCompletedEvent
194
- | HermesMessageDeltaEvent
195
- | HermesApprovalEvent
196
- | HermesRunCompletedEvent
197
- | HermesRunFailedEvent
198
- | HermesReasoningEvent;
199
-
200
- /** Hermes SSE 事件回调映射 */
201
- export interface HermesEventCallbacks {
202
- 'tool.started'?: (ev: HermesToolStartedEvent) => void;
203
- 'tool.completed'?: (ev: HermesToolCompletedEvent) => void;
204
- 'message.delta'?: (ev: HermesMessageDeltaEvent) => void;
205
- 'approval.request'?: (ev: HermesApprovalEvent) => void;
206
- 'run.completed'?: (ev: HermesRunCompletedEvent) => void;
207
- 'run.failed'?: (ev: HermesRunFailedEvent) => void;
208
- 'reasoning.available'?: (ev: HermesReasoningEvent) => void;
209
- _end?: () => void;
210
- _error?: (err: Error) => void;
211
- _any?: (ev: HermesSSEEvent) => void;
212
- }
213
-
214
- // ── 技能系统 ──
215
-
216
- /** 群管理 API 门面(由 HermesBridge 基于 QQBot 实现后注入技能) */
217
- export interface GroupAdminApi {
218
- /** 禁言群成员(durationSec=0 解除) */
219
- setGroupBan(groupId: string, userId: string, durationSec: number): Promise<unknown>;
220
- /** 踢出群成员 */
221
- setGroupKick(groupId: string, userId: string): Promise<unknown>;
222
- /** 开启/关闭全员禁言 */
223
- setGroupWholeBan(groupId: string, enable: boolean): Promise<unknown>;
224
- }
225
-
226
- /** 技能执行上下文 */
227
- export interface SkillExecuteContext {
228
- /** QQBot 实例(卡片类技能经其 axiosInstance/logger 访问外部 API 与渲染) */
229
- bot: QQBot;
230
- api: GroupAdminApi;
231
- route: RouteInfo;
232
- args: string[];
233
- }
234
-
235
- /**
236
- * 技能执行产出:纯文本摘要字符串,或 `{ message, images }`——
237
- * images 为待发送的 base64 图片(允许带 base64:// 前缀),由完成处理器逐张发出。
238
- */
239
- export type SkillExecution = string | { message: string; images?: string[] };
240
-
241
- /** 技能定义 */
242
- export interface Skill {
243
- name: string;
244
- usage: string;
245
- description: string;
246
- adminOnly: boolean;
247
- /**
248
- * true:查询类技能——执行结果不作为摘要发给用户,而是回喂给 AI 整理回答
249
- * (完成处理器会把结果以 [工具结果] 输入再提交一轮 run,有防循环上限);
250
- * false/缺省:动作/卡片类——执行摘要附加到回复文本后直接发出。
251
- */
252
- feedback?: boolean;
253
- execute(ctx: SkillExecuteContext): Promise<SkillExecution>;
254
- }
255
-
256
- /** 查询类技能的回喂数据 */
257
- export interface SkillFeedback {
258
- skill: string;
259
- data: string;
260
- }
261
-
262
- /** 技能执行结果 */
263
- export type SkillResult =
264
- | { ok: true; skill: string; message: string; images?: string[] }
265
- | { ok: false; skill: string; error: string };
266
-
267
- /** processTags 的返回:清理后的文本 + 全部技能产出的图片 + 查询类技能的回喂数据 */
268
- export interface ProcessedSkillOutput {
269
- text: string;
270
- images: string[];
271
- feedback: SkillFeedback[];
272
- }
273
-
274
- // ── 多模态消息内容 ──
275
-
276
- /** OpenAI 风格消息内容段(用于多模态 user_message) */
277
- export type MessageContentPart = { type: 'text'; text: string } | { type: 'image_url'; image_url: { url: string } };
278
-
279
- /** formatMessage 的返回:文本 + 提取到的图片列表(均为 base64 data URL) */
280
- export interface FormattedMessage {
281
- text: string;
282
- /** base64 data URL(data:image/...;base64,...) */
283
- images: string[];
284
- }
285
-
286
- // ── OneBot API 响应(功能内使用的最小子集) ──
287
-
288
- /** get_msg API 返回值 */
289
- export interface OneBotGetMsgResponse {
290
- message_id: number;
291
- sender: {
292
- user_id: number;
293
- nickname: string;
294
- };
295
- time: number;
296
- message: import('@/type').Message[];
297
- }
298
-
299
- /** get_forward_msg 节点(兼容 NapCat node 格式与 go-cqhttp 旧格式) */
300
- export interface OneBotForwardNode {
301
- type?: 'node';
302
- data?: {
303
- user_id?: number;
304
- nickname?: string;
305
- card?: string;
306
- time?: number;
307
- message?: import('@/type').Message[];
308
- content?: import('@/type').Message[] | string;
309
- };
310
- sender?: { user_id?: number; nickname?: string; card?: string };
311
- time?: number;
312
- content?: import('@/type').Message[] | string;
313
- }
314
-
315
- /** get_forward_msg API 返回值 */
316
- export interface OneBotGetForwardMsgResponse {
317
- messages: OneBotForwardNode[];
318
- }
319
-
320
- /** get_group_member_info API 返回值 */
321
- export interface OneBotGroupMemberInfo {
322
- group_id: number;
323
- user_id: number;
324
- nickname: string;
325
- card: string;
326
- role: string;
327
- }
1
+ /**
2
+ * Hermes 桥接类型定义(移植自 qq-hermes-bridge src/types.d.ts,MIT 协议,原作者 Amorter)。
3
+ * OneBot 消息段类型复用 @/type,此处只保留 Hermes API / 会话 / 审批 / 技能相关类型。
4
+ */
5
+
6
+ import type { QQBot } from '@/index';
7
+
8
+ // ── 路由 ──
9
+
10
+ /**
11
+ * Discord 路由的发送委托(由 DiscordBridge 注入,随 RouteInfo 传递)。
12
+ * HermesBridge 不直接持有 discord.js Client,经委托向原频道发送回复/图片。
13
+ */
14
+ export interface DiscordRouteContext {
15
+ guildName: string;
16
+ channelName: string;
17
+ /** 发送者是否为 Discord 侧管理员(服务器拥有者/管理服务器/管理员权限) */
18
+ isAdmin: boolean;
19
+ /** 发送文本;quote=true 时首条引用原始消息 */
20
+ send(text: string, quote: boolean): Promise<void>;
21
+ /** 发送 base64 图片(Discord 附件) */
22
+ sendImage(base64: string): Promise<void>;
23
+ /** 摘除机器人对触发消息的「处理中」表情回应(由 DiscordBridge 注入,绑定原消息) */
24
+ removeReaction?(): Promise<void>;
25
+ }
26
+
27
+ /** handleDiscordMessage 的调用参数(DiscordRouteContext + 消息元信息) */
28
+ export interface DiscordChatParams extends DiscordRouteContext {
29
+ /** 该频道桥接的 QQ 群号(会话共享与启用门控) */
30
+ groupId: string;
31
+ /** bot 的 Discord 用户 ID(@提及检测与剔除) */
32
+ botUserId?: string;
33
+ }
34
+
35
+ /** 消息来源路由:QQ 群聊、QQ 私聊或 Discord 频道 */
36
+ export interface RouteInfo {
37
+ type: 'group' | 'user' | 'discord';
38
+ /** QQ 群号;discord 路由为桥接的 QQ 群号(与 QQ 群共享会话上下文) */
39
+ groupId?: string;
40
+ /** QQ 号字符串;discord 路由为 `dc:<Discord用户ID>` */
41
+ userId: string;
42
+ /** discord 路由:频道 ID */
43
+ channelId?: string;
44
+ /** discord 路由:发送委托(DiscordBridge 注入) */
45
+ discord?: DiscordRouteContext;
46
+ }
47
+
48
+ // ── 会话 ──
49
+
50
+ /** 对话历史条目 */
51
+ export interface HistoryEntry {
52
+ role: string;
53
+ content: string;
54
+ /** 发言人(user 消息)或回复对象(assistant 消息)的用户 id */
55
+ userId?: string;
56
+ /** assistant 消息回复对象的发送者标签(用于在历史中标注「你回复 xxx 的话」) */
57
+ label?: string;
58
+ }
59
+
60
+ /** 对话会话 */
61
+ export interface Session {
62
+ history: HistoryEntry[];
63
+ sessionVersion: number;
64
+ }
65
+
66
+ // ── 运行状态 ──
67
+
68
+ /** 活跃运行中的工具调用记录 */
69
+ export interface RunToolRecord {
70
+ name: string;
71
+ duration: number;
72
+ error: boolean;
73
+ preview?: string;
74
+ }
75
+
76
+ /** 活跃运行中正在执行的工具 */
77
+ export interface RunCurrentTool {
78
+ name: string;
79
+ preview?: string;
80
+ startedAt: number;
81
+ }
82
+
83
+ /** 活跃的 Hermes 运行状态 */
84
+ export interface RunState {
85
+ route: RouteInfo;
86
+ tools: RunToolRecord[];
87
+ currentTool: RunCurrentTool | null;
88
+ startedAt: number;
89
+ lastProgressSent: number;
90
+ sendingProgress: boolean;
91
+ messageDelta: string;
92
+ pendingText: string;
93
+ sentTextLength: number;
94
+ lastTextSent: number;
95
+ finalOutput: string;
96
+ userMsgId: number;
97
+ /** 本轮对话发送者的展示标签(assistant 历史据此标注回复对象) */
98
+ senderLabel: string;
99
+ /** 工具结果回喂轮次(0 = 用户消息首轮;达上限后查询结果不再回喂,直接附在回复里) */
100
+ feedbackDepth?: number;
101
+ /** 「处理中」表情回应的持久化记录键(回喂轮转移给下一轮,对话链完全结束时摘除) */
102
+ reactionKey?: string;
103
+ /** 本轮是否已经贴过引用(逐句发送时只有首条单元贴引用,避免每条都重复引用) */
104
+ replySent?: boolean;
105
+ /** 本轮是否以 run.failed 结束(失败文案必须发出,不因已逐句下发而跳过) */
106
+ failed?: boolean;
107
+ /** 私聊文字回执的消息 id(AI 开始回复时撤回;QQ 表情回应失败时的降级方案) */
108
+ receiptId?: number;
109
+ /** 回执是否已转移给查询技能的回喂轮(转移后由下一轮负责撤回) */
110
+ receiptTransferred?: boolean;
111
+ /**
112
+ * 发送串行链:所有逐句/尾段发送都挂到这条链上按序执行。
113
+ * message.delta 的 flush 是 fire-and-forget,若并发执行会互相插队,
114
+ * 导致分条消息顺序错乱(后一批的句子插到前一批未发完的句子之前)。
115
+ */
116
+ sendChain?: Promise<void>;
117
+ stream?: { abort(): void };
118
+ }
119
+
120
+ // ── 审批 ──
121
+
122
+ /** 待审批记录 */
123
+ export interface Approval {
124
+ runId: string;
125
+ route: RouteInfo;
126
+ data: HermesApprovalEvent;
127
+ createdAt: number;
128
+ timeoutTimer?: ReturnType<typeof setTimeout>;
129
+ }
130
+
131
+ /** 审批选择 */
132
+ export type ApprovalChoice = 'once' | 'deny' | 'always' | 'session';
133
+
134
+ // ── Hermes SSE 事件类型 ──
135
+
136
+ export interface HermesToolStartedEvent {
137
+ event: 'tool.started';
138
+ run_id: string;
139
+ timestamp: number;
140
+ tool: string;
141
+ preview?: string;
142
+ }
143
+
144
+ export interface HermesToolCompletedEvent {
145
+ event: 'tool.completed';
146
+ run_id: string;
147
+ timestamp: number;
148
+ tool: string;
149
+ duration: number;
150
+ error: boolean;
151
+ }
152
+
153
+ export interface HermesMessageDeltaEvent {
154
+ event: 'message.delta';
155
+ run_id: string;
156
+ timestamp: number;
157
+ delta: string;
158
+ }
159
+
160
+ export interface HermesApprovalEvent {
161
+ event: 'approval.request';
162
+ run_id: string;
163
+ timestamp: number;
164
+ command: string;
165
+ pattern_key?: string;
166
+ description?: string;
167
+ }
168
+
169
+ export interface HermesRunCompletedEvent {
170
+ event: 'run.completed';
171
+ run_id: string;
172
+ timestamp: number;
173
+ output: string;
174
+ }
175
+
176
+ export interface HermesRunFailedEvent {
177
+ event: 'run.failed';
178
+ run_id: string;
179
+ timestamp: number;
180
+ error: string;
181
+ }
182
+
183
+ export interface HermesReasoningEvent {
184
+ event: 'reasoning.available';
185
+ run_id: string;
186
+ timestamp: number;
187
+ text: string;
188
+ }
189
+
190
+ /** Hermes SSE 事件联合类型 */
191
+ export type HermesSSEEvent =
192
+ | HermesToolStartedEvent
193
+ | HermesToolCompletedEvent
194
+ | HermesMessageDeltaEvent
195
+ | HermesApprovalEvent
196
+ | HermesRunCompletedEvent
197
+ | HermesRunFailedEvent
198
+ | HermesReasoningEvent;
199
+
200
+ /** Hermes SSE 事件回调映射 */
201
+ export interface HermesEventCallbacks {
202
+ 'tool.started'?: (ev: HermesToolStartedEvent) => void;
203
+ 'tool.completed'?: (ev: HermesToolCompletedEvent) => void;
204
+ 'message.delta'?: (ev: HermesMessageDeltaEvent) => void;
205
+ 'approval.request'?: (ev: HermesApprovalEvent) => void;
206
+ 'run.completed'?: (ev: HermesRunCompletedEvent) => void;
207
+ 'run.failed'?: (ev: HermesRunFailedEvent) => void;
208
+ 'reasoning.available'?: (ev: HermesReasoningEvent) => void;
209
+ _end?: () => void;
210
+ _error?: (err: Error) => void;
211
+ _any?: (ev: HermesSSEEvent) => void;
212
+ }
213
+
214
+ // ── 技能系统 ──
215
+
216
+ /** 群管理 API 门面(由 HermesBridge 基于 QQBot 实现后注入技能) */
217
+ export interface GroupAdminApi {
218
+ /** 禁言群成员(durationSec=0 解除) */
219
+ setGroupBan(groupId: string, userId: string, durationSec: number): Promise<unknown>;
220
+ /** 踢出群成员 */
221
+ setGroupKick(groupId: string, userId: string): Promise<unknown>;
222
+ /** 开启/关闭全员禁言 */
223
+ setGroupWholeBan(groupId: string, enable: boolean): Promise<unknown>;
224
+ }
225
+
226
+ /** 技能执行上下文 */
227
+ export interface SkillExecuteContext {
228
+ /** QQBot 实例(卡片类技能经其 axiosInstance/logger 访问外部 API 与渲染) */
229
+ bot: QQBot;
230
+ api: GroupAdminApi;
231
+ route: RouteInfo;
232
+ args: string[];
233
+ }
234
+
235
+ /**
236
+ * 技能执行产出:纯文本摘要字符串,或 `{ message, images }`——
237
+ * images 为待发送的 base64 图片(允许带 base64:// 前缀),由完成处理器逐张发出。
238
+ */
239
+ export type SkillExecution = string | { message: string; images?: string[] };
240
+
241
+ /** 技能定义 */
242
+ export interface Skill {
243
+ name: string;
244
+ usage: string;
245
+ description: string;
246
+ adminOnly: boolean;
247
+ /**
248
+ * true:查询类技能——执行结果不作为摘要发给用户,而是回喂给 AI 整理回答
249
+ * (完成处理器会把结果以 [工具结果] 输入再提交一轮 run,有防循环上限);
250
+ * false/缺省:动作/卡片类——执行摘要附加到回复文本后直接发出。
251
+ */
252
+ feedback?: boolean;
253
+ execute(ctx: SkillExecuteContext): Promise<SkillExecution>;
254
+ }
255
+
256
+ /** 查询类技能的回喂数据 */
257
+ export interface SkillFeedback {
258
+ skill: string;
259
+ data: string;
260
+ }
261
+
262
+ /** 技能执行结果 */
263
+ export type SkillResult =
264
+ | { ok: true; skill: string; message: string; images?: string[] }
265
+ | { ok: false; skill: string; error: string };
266
+
267
+ /** processTags 的返回:清理后的文本 + 全部技能产出的图片 + 查询类技能的回喂数据 */
268
+ export interface ProcessedSkillOutput {
269
+ text: string;
270
+ images: string[];
271
+ feedback: SkillFeedback[];
272
+ }
273
+
274
+ // ── 多模态消息内容 ──
275
+
276
+ /** OpenAI 风格消息内容段(用于多模态 user_message) */
277
+ export type MessageContentPart = { type: 'text'; text: string } | { type: 'image_url'; image_url: { url: string } };
278
+
279
+ /** formatMessage 的返回:文本 + 提取到的图片列表(均为 base64 data URL) */
280
+ export interface FormattedMessage {
281
+ text: string;
282
+ /** base64 data URL(data:image/...;base64,...) */
283
+ images: string[];
284
+ }
285
+
286
+ // ── OneBot API 响应(功能内使用的最小子集) ──
287
+
288
+ /** get_msg API 返回值 */
289
+ export interface OneBotGetMsgResponse {
290
+ message_id: number;
291
+ sender: {
292
+ user_id: number;
293
+ nickname: string;
294
+ };
295
+ time: number;
296
+ message: import('@/type').Message[];
297
+ }
298
+
299
+ /** get_forward_msg 节点(兼容 NapCat node 格式与 go-cqhttp 旧格式) */
300
+ export interface OneBotForwardNode {
301
+ type?: 'node';
302
+ data?: {
303
+ user_id?: number;
304
+ nickname?: string;
305
+ card?: string;
306
+ time?: number;
307
+ message?: import('@/type').Message[];
308
+ content?: import('@/type').Message[] | string;
309
+ };
310
+ sender?: { user_id?: number; nickname?: string; card?: string };
311
+ time?: number;
312
+ content?: import('@/type').Message[] | string;
313
+ }
314
+
315
+ /** get_forward_msg API 返回值 */
316
+ export interface OneBotGetForwardMsgResponse {
317
+ messages: OneBotForwardNode[];
318
+ }
319
+
320
+ /** get_group_member_info API 返回值 */
321
+ export interface OneBotGroupMemberInfo {
322
+ group_id: number;
323
+ user_id: number;
324
+ nickname: string;
325
+ card: string;
326
+ role: string;
327
+ }