@zhin.js/adapter-icqq 3.0.4 → 3.0.6

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 (67) hide show
  1. package/CHANGELOG.md +106 -78
  2. package/README.md +3 -3
  3. package/client/index.tsx +1 -1
  4. package/client/tsconfig.json +1 -1
  5. package/dist/index.js +1 -1
  6. package/lib/bot.d.ts +56 -12
  7. package/lib/bot.d.ts.map +1 -1
  8. package/lib/bot.js +416 -136
  9. package/lib/bot.js.map +1 -1
  10. package/lib/cq-message.d.ts +10 -0
  11. package/lib/cq-message.d.ts.map +1 -0
  12. package/lib/cq-message.js +119 -0
  13. package/lib/cq-message.js.map +1 -0
  14. package/lib/forward-msg.d.ts +27 -0
  15. package/lib/forward-msg.d.ts.map +1 -0
  16. package/lib/forward-msg.js +387 -0
  17. package/lib/forward-msg.js.map +1 -0
  18. package/lib/get-msg.d.ts +3 -0
  19. package/lib/get-msg.d.ts.map +1 -0
  20. package/lib/get-msg.js +46 -0
  21. package/lib/get-msg.js.map +1 -0
  22. package/lib/icqq-inbound.d.ts +114 -0
  23. package/lib/icqq-inbound.d.ts.map +1 -0
  24. package/lib/icqq-inbound.js +495 -0
  25. package/lib/icqq-inbound.js.map +1 -0
  26. package/lib/icqq-side-events.d.ts +34 -0
  27. package/lib/icqq-side-events.d.ts.map +1 -0
  28. package/lib/icqq-side-events.js +194 -0
  29. package/lib/icqq-side-events.js.map +1 -0
  30. package/lib/index.d.ts +4 -2
  31. package/lib/index.d.ts.map +1 -1
  32. package/lib/index.js +1 -0
  33. package/lib/index.js.map +1 -1
  34. package/lib/ipc-client.d.ts +7 -2
  35. package/lib/ipc-client.d.ts.map +1 -1
  36. package/lib/ipc-client.js +74 -16
  37. package/lib/ipc-client.js.map +1 -1
  38. package/lib/protocol.d.ts +3 -10
  39. package/lib/protocol.d.ts.map +1 -1
  40. package/lib/protocol.js +2 -0
  41. package/lib/protocol.js.map +1 -1
  42. package/lib/routes.d.ts +1 -1
  43. package/lib/routes.d.ts.map +1 -1
  44. package/lib/types.d.ts +44 -0
  45. package/lib/types.d.ts.map +1 -1
  46. package/lib/typing-indicator-example.d.ts +108 -0
  47. package/lib/typing-indicator-example.d.ts.map +1 -0
  48. package/lib/typing-indicator-example.js +220 -0
  49. package/lib/typing-indicator-example.js.map +1 -0
  50. package/lib/typing-indicator.d.ts +87 -0
  51. package/lib/typing-indicator.d.ts.map +1 -0
  52. package/lib/typing-indicator.js +225 -0
  53. package/lib/typing-indicator.js.map +1 -0
  54. package/package.json +18 -12
  55. package/src/bot.ts +524 -149
  56. package/src/cq-message.ts +120 -0
  57. package/src/forward-msg.ts +433 -0
  58. package/src/get-msg.ts +56 -0
  59. package/src/icqq-inbound.ts +616 -0
  60. package/src/icqq-side-events.ts +228 -0
  61. package/src/index.ts +10 -2
  62. package/src/ipc-client.ts +76 -16
  63. package/src/protocol.ts +4 -10
  64. package/src/routes.ts +1 -1
  65. package/src/types.ts +45 -0
  66. package/src/typing-indicator-example.ts +269 -0
  67. package/src/typing-indicator.ts +312 -0
package/README.md CHANGED
@@ -6,7 +6,7 @@ Zhin.js ICQQ 适配器,基于 ICQQ 库实现的 QQ 机器人适配器,支持
6
6
 
7
7
  - 🤖 支持 QQ 群聊和私聊消息处理
8
8
  - 🔐 完整的登录验证支持(短信验证、二维码、滑块验证)
9
- - 🖥️ **Web 控制台登录辅助**:与 `@zhin.js/console` 同时启用时,在 **`/icqq`** 页面提供「概览 + 登录辅助」;HTTP 接口为 **`GET /api/login-assist/pending`**、**`POST /api/login-assist/submit`**、**`POST /api/login-assist/cancel`**(由本适配器在路由上下文中注册,依赖核心 `loginAssist` 服务)。
9
+ - 🖥️ **Web 控制台登录辅助**:与 `@zhin.js/host-api` 同时启用时,在 **`/icqq`** 页面提供「概览 + 登录辅助」;HTTP 接口为 **`GET /api/login-assist/pending`**、**`POST /api/login-assist/submit`**、**`POST /api/login-assist/cancel`**(由本适配器在路由上下文中注册,依赖核心 `loginAssist` 服务)。
10
10
  - 📨 消息发送和接收处理
11
11
  - 🔄 消息格式转换和适配
12
12
  - 📁 自动数据目录管理
@@ -170,7 +170,7 @@ addCommand(new MessageCommand('at <user:at>')
170
170
 
171
171
  ## Web 控制台登录辅助
172
172
 
173
- 1. 配置中同时启用 **`@zhin.js/console`** 与本适配器(且 console 建议 **`lazyLoad: false`**,以便扩展 `addEntry` 正常注册)。
173
+ 1. 配置中同时启用 **`@zhin.js/host-api`** 与本适配器(且 console 建议 **`lazyLoad: false`**,以便扩展 `addEntry` 正常注册)。
174
174
  2. 打开控制台中的 **ICQQ 管理**(`/icqq`),切换到 **登录辅助** Tab;仅展示当前 **icqq** 适配器相关的待处理登录步骤。
175
175
  3. 若未启用 console,仅启动机器人进程时,仍可通过日志完成登录;**不提供** Console 专属的 `/api/login-assist` 降级路径。
176
176
 
@@ -384,7 +384,7 @@ onGroupMessage(async (message) => {
384
384
 
385
385
  ## icqq CLI 与 AI bash 安全
386
386
 
387
- 启用 **icqq 技能**(`skills/icqq`)时,模型通常会通过 **`bash`** 调用 `icqq …` 命令行。此时由框架 **`execSecurity` / `execAsk`** 与 **Owner 私聊指令**(`approve always bash`、`approve rule <正则>` 等)共同约束:在 `allowlist` 下,**非敏感**子命令多数可直接执行;**敏感**子命令(踢人、禁言、解散、支付等)在开启 `execAsk` 时需 Owner 确认,并可用 **正则匹配整条子命令** 做持久化放行(不必把 QQ 号写进配置)。持久化文件为数据目录下的 `owner-approve-always.json`。
387
+ 启用 **icqq 技能**(`skills/icqq`)时,模型通常会通过 **`bash`** 调用 `icqq …` 命令行。此时由框架 **`execSecurity` / `execApprovalMode`** 与 **Owner 私聊指令**(`approve always bash`、`approve rule <正则>` 等)共同约束:在 `allowlist` 下,**非敏感**子命令多数可直接执行;**敏感**子命令(踢人、禁言、解散、支付等)在 `execApprovalMode: ask` 时需 Owner 确认,并可用 **正则匹配整条子命令** 做持久化放行(不必把 QQ 号写进配置)。持久化文件为数据目录下的 `owner-approve-always.json`。
388
388
 
389
389
  完整说明与指令表见仓库文档:[docs/advanced/ai.md](../../../docs/advanced/ai.md)(锚点:`#icqq-bash-exec`、`#owner-approve-commands`)。
390
390
 
package/client/index.tsx CHANGED
@@ -1,4 +1,4 @@
1
- import type { PluginRegisterHostApi } from '@zhin.js/console-types'
1
+ import type { PluginRegisterHostApi } from '@zhin.js/contract'
2
2
  import ICQQManagement from './ICQQManagement'
3
3
 
4
4
  export function register(api: PluginRegisterHostApi) {
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "../node_modules/@zhin.js/console/browser.tsconfig.json",
2
+ "extends": "../node_modules/@zhin.js/host-api/browser.tsconfig.json",
3
3
  "compilerOptions": {
4
4
  "outDir": "../dist"
5
5
  },
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@ lucide-react/dist/esm/icons/wifi.mjs:
26
26
  lucide-react/dist/esm/icons/x.mjs:
27
27
  lucide-react/dist/esm/lucide-react.mjs:
28
28
  (**
29
- * @license lucide-react v1.16.0 - ISC
29
+ * @license lucide-react v1.17.0 - ISC
30
30
  *
31
31
  * This source code is licensed under the ISC license.
32
32
  * See the LICENSE file in the root directory of this source tree.
package/lib/bot.d.ts CHANGED
@@ -4,12 +4,15 @@
4
4
  * 不再直接依赖 @icqqjs/icqq 协议库。
5
5
  * 登录由 `icqq login` 完成,本 Bot 只负责连接守护进程并收发消息。
6
6
  */
7
- import { Bot, Message, MessageSegment, SendContent, SendOptions } from 'zhin.js';
7
+ import { Bot, Message, SendOptions, type QuotedMessagePayload } from 'zhin.js';
8
8
  import type { IcqqBotConfig, IpcFriendInfo, IpcGroupInfo } from "./types.js";
9
9
  import type { IcqqAdapter } from "./adapter.js";
10
10
  import { IpcClient } from "./ipc-client.js";
11
- import { type IpcMessageEventData } from "./protocol.js";
12
- export declare class IcqqBot implements Bot<IcqqBotConfig, IpcMessageEventData> {
11
+ import type { IcqqIpcMessageEvent } from "./icqq-inbound.js";
12
+ import { type NormalizedIcqqInbound } from "./icqq-inbound.js";
13
+ import { buildIcqqIpcMessage as buildIcqqIpcMessageImpl, parseCqMessage as parseCqMessageImpl, toCqString as toCqStringImpl } from "./cq-message.js";
14
+ import { type ICQQTypingIndicatorManager } from "./typing-indicator.js";
15
+ export declare class IcqqBot implements Bot<IcqqBotConfig, IcqqIpcMessageEvent> {
13
16
  adapter: IcqqAdapter;
14
17
  $connected: boolean;
15
18
  $config: IcqqBotConfig;
@@ -19,14 +22,25 @@ export declare class IcqqBot implements Bot<IcqqBotConfig, IpcMessageEventData>
19
22
  /** 缓存的群列表 */
20
23
  groups: Map<number, IpcGroupInfo>;
21
24
  private subscriptions;
25
+ /** 事件去重:覆盖多端回流/服务端重复推送等场景 */
26
+ private readonly inboundDeduper;
27
+ /** MessageEvent.source 解析结果,供 $getMsg 优先命中 */
28
+ private readonly quotedSourceCache;
22
29
  /** 用户主动断开时为 true,阻止自动重连 */
23
30
  private intentionalDisconnect;
24
31
  /** 是否已有重连循环在跑(避免多次 schedule 叠套) */
25
32
  private reconnectRunning;
33
+ /** Typing Indicator 管理器 */
34
+ $typingIndicator?: ICQQTypingIndicatorManager;
26
35
  get $id(): `${number}`;
27
36
  get logger(): import("zhin.js").Logger;
28
37
  constructor(adapter: IcqqAdapter, config: IcqqBotConfig);
29
38
  $connect(): Promise<void>;
39
+ /**
40
+ * 初始化 Typing Indicator
41
+ * 根据配置自动启用或禁用
42
+ */
43
+ private initTypingIndicator;
30
44
  /** 建立或恢复与守护进程的 IPC/RPC 会话(订阅、缓存列表) */
31
45
  private rebindIpcSession;
32
46
  /** IPC/RPC 意外断开时调度重连(指数退避) */
@@ -36,20 +50,50 @@ export declare class IcqqBot implements Bot<IcqqBotConfig, IpcMessageEventData>
36
50
  refreshLists(): Promise<void>;
37
51
  $disconnect(): Promise<void>;
38
52
  private handleEvent;
39
- $formatMessage(raw: IpcMessageEventData): Message<IpcMessageEventData>;
53
+ private dispatchInboundMessage;
54
+ private handleNoticeEvent;
55
+ private handleRequestEvent;
56
+ private handleMetaEvent;
57
+ /** 调试 IPC 入站字段:默认 debug;设 ICQQ_IPC_LOG_RAW=1 则 info 打完整 payload */
58
+ private logIpcInboundPayload;
59
+ $formatMessage(input: NormalizedIcqqInbound | IcqqIpcMessageEvent): ReturnType<typeof Message.from<IcqqIpcMessageEvent>>;
60
+ /**
61
+ * 有 source.message_id 时用 get_msg 拉全量正文;否则仅用 source 内联摘要。
62
+ */
63
+ private primeQuotedSourceCache;
64
+ private fetchQuotedMessagePayload;
65
+ $getMsg(messageId: string): Promise<QuotedMessagePayload>;
40
66
  $recallMessage(id: string): Promise<void>;
41
67
  $sendMessage(options: SendOptions): Promise<string>;
42
- }
43
- export declare namespace IcqqBot {
44
68
  /**
45
- * CQ 码原始消息字符串解析为 MessageSegment 数组。
46
- * 格式: `[type:value]` 或纯文本
69
+ * 表情符号到 reaction id 的映射
70
+ * QQ 使用数字 ID 来标识表情,而不是 Unicode 字符
47
71
  */
48
- function parseCqMessage(raw: string): MessageSegment[];
72
+ private static readonly EMOJI_MAP;
49
73
  /**
50
- * SendContent(MessageSegment[] 或字符串)转为 CQ 码字符串。
51
- * 守护进程使用 CQ 码字符串格式收发消息。
74
+ * 将表情符号转换为 reaction id
52
75
  */
53
- function toCqString(content: SendContent): string;
76
+ private getEmojiId;
77
+ /**
78
+ * 添加消息回应(表情)
79
+ *
80
+ * @param messageId - 消息 ID
81
+ * @param emoji - 表情符号或 reaction id
82
+ * @returns 反应 ID,可用于后续移除
83
+ */
84
+ $addReaction(messageId: string, emoji: string): Promise<string | null>;
85
+ /**
86
+ * 移除消息回应
87
+ *
88
+ * @param messageId - 消息 ID
89
+ * @param reactionId - 反应 ID(由 $addReaction 返回)
90
+ */
91
+ $removeReaction(messageId: string, reactionId: string): Promise<void>;
92
+ }
93
+ /** @deprecated 使用 `./cq-message.js` 导出 */
94
+ export declare namespace IcqqBot {
95
+ const parseCqMessage: typeof parseCqMessageImpl;
96
+ const buildIcqqIpcMessage: typeof buildIcqqIpcMessageImpl;
97
+ const toCqString: typeof toCqStringImpl;
54
98
  }
55
99
  //# sourceMappingURL=bot.d.ts.map
package/lib/bot.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAiB,GAAG,EAAE,OAAO,EAAE,cAAc,EAAW,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACzG,OAAO,KAAK,EACV,aAAa,EAEb,aAAa,EACb,YAAY,EAEb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,eAAe,CAAC;AAEvB,qBAAa,OAAQ,YAAW,GAAG,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAyB5D,OAAO,EAAE,WAAW;IAxB7B,UAAU,UAAS;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,EAAG,SAAS,CAAC;IAEhB,cAAc;IACd,OAAO,6BAAoC;IAC3C,aAAa;IACb,MAAM,4BAAmC;IAEzC,OAAO,CAAC,aAAa,CAAmD;IACxE,2BAA2B;IAC3B,OAAO,CAAC,qBAAqB,CAAS;IACtC,mCAAmC;IACnC,OAAO,CAAC,gBAAgB,CAAS;IAEjC,IAAI,GAAG,gBAEN;IAED,IAAI,MAAM,6BAET;gBAGQ,OAAO,EAAE,WAAW,EAC3B,MAAM,EAAE,aAAa;IAOjB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB/B,sCAAsC;YACxB,gBAAgB;IAiD9B,8BAA8B;IAC9B,OAAO,CAAC,iBAAiB;YAQX,gBAAgB;IA0C9B,iBAAiB;IACX,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB7B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAclC,OAAO,CAAC,WAAW;IAWnB,cAAc,CAAC,GAAG,EAAE,mBAAmB;IAwDjC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzC,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAgC1D;AAID,yBAAiB,OAAO,CAAC;IACvB;;;OAGG;IACH,SAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CA6D5D;IAED;;;OAGG;IACH,SAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA+BvD;CACF"}
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAiB,GAAG,EAAE,OAAO,EAAwB,WAAW,EAAE,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpH,OAAO,KAAK,EACV,aAAa,EAEb,aAAa,EACb,YAAY,EAEb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAUL,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,mBAAmB,IAAI,uBAAuB,EAC9C,cAAc,IAAI,kBAAkB,EACpC,UAAU,IAAI,cAAc,EAC7B,MAAM,iBAAiB,CAAC;AAazB,OAAO,EAAyB,KAAK,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAI/F,qBAAa,OAAQ,YAAW,GAAG,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAgC5D,OAAO,EAAE,WAAW;IA/B7B,UAAU,UAAS;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,EAAG,SAAS,CAAC;IAEhB,cAAc;IACd,OAAO,6BAAoC;IAC3C,aAAa;IACb,MAAM,4BAAmC;IAEzC,OAAO,CAAC,aAAa,CAAmD;IACxE,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2C;IAC7E,2BAA2B;IAC3B,OAAO,CAAC,qBAAqB,CAAS;IACtC,mCAAmC;IACnC,OAAO,CAAC,gBAAgB,CAAS;IAEjC,2BAA2B;IAC3B,gBAAgB,CAAC,EAAE,0BAA0B,CAAC;IAE9C,IAAI,GAAG,gBAEN;IAED,IAAI,MAAM,6BAET;gBAGQ,OAAO,EAAE,WAAW,EAC3B,MAAM,EAAE,aAAa;IAOjB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB/B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA6B3B,sCAAsC;YACxB,gBAAgB;IAuC9B,8BAA8B;IAC9B,OAAO,CAAC,iBAAiB;YAQX,gBAAgB;IA0C9B,iBAAiB;IACX,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB7B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBlC,OAAO,CAAC,WAAW;YA4EL,sBAAsB;IAiBpC,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,eAAe;IAkBvB,mEAAmE;IACnE,OAAO,CAAC,oBAAoB;IAyB5B,cAAc,CACZ,KAAK,EAAE,qBAAqB,GAAG,mBAAmB,GACjD,UAAU,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAkEvD;;OAEG;YACW,sBAAsB;YAkCtB,yBAAyB;IAkCjC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAUzD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzC,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAuCzD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAW/B;IAEF;;OAEG;IACH,OAAO,CAAC,UAAU;IAgBlB;;;;;;OAMG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA8C5E;;;;;OAKG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA4C5E;AAED,0CAA0C;AAC1C,yBAAiB,OAAO,CAAC;IAChB,MAAM,cAAc,2BAAqB,CAAC;IAC1C,MAAM,mBAAmB,gCAA0B,CAAC;IACpD,MAAM,UAAU,uBAAiB,CAAC;CAC1C"}