@zhin.js/adapter-icqq 5.0.2 → 6.0.1
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.
- package/CHANGELOG.md +32 -0
- package/README.md +32 -4
- package/client/LoginAssistPanel.tsx +38 -3
- package/dist/index.js +2 -2
- package/lib/adapter.d.ts +12 -4
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +14 -6
- package/lib/adapter.js.map +1 -1
- package/lib/cq-message.d.ts.map +1 -1
- package/lib/cq-message.js +12 -3
- package/lib/cq-message.js.map +1 -1
- package/lib/endpoint.d.ts +12 -8
- package/lib/endpoint.d.ts.map +1 -1
- package/lib/endpoint.js +135 -47
- package/lib/endpoint.js.map +1 -1
- package/lib/icqq-guild.d.ts +48 -0
- package/lib/icqq-guild.d.ts.map +1 -0
- package/lib/icqq-guild.js +115 -0
- package/lib/icqq-guild.js.map +1 -0
- package/lib/icqq-inbound.d.ts +7 -0
- package/lib/icqq-inbound.d.ts.map +1 -1
- package/lib/icqq-inbound.js +39 -6
- package/lib/icqq-inbound.js.map +1 -1
- package/lib/icqq-login-assist-bridge.d.ts +5 -0
- package/lib/icqq-login-assist-bridge.d.ts.map +1 -0
- package/lib/icqq-login-assist-bridge.js +148 -0
- package/lib/icqq-login-assist-bridge.js.map +1 -0
- package/lib/index.d.ts +0 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/login-assist-routes.d.ts +7 -0
- package/lib/login-assist-routes.d.ts.map +1 -0
- package/lib/login-assist-routes.js +29 -0
- package/lib/login-assist-routes.js.map +1 -0
- package/lib/login-ipc-contract.d.ts +44 -0
- package/lib/login-ipc-contract.d.ts.map +1 -0
- package/lib/login-ipc-contract.js +35 -0
- package/lib/login-ipc-contract.js.map +1 -0
- package/lib/protocol.d.ts +32 -1
- package/lib/protocol.d.ts.map +1 -1
- package/lib/protocol.js +23 -0
- package/lib/protocol.js.map +1 -1
- package/lib/segment-mapper.d.ts +2 -0
- package/lib/segment-mapper.d.ts.map +1 -0
- package/lib/segment-mapper.js +2 -0
- package/lib/segment-mapper.js.map +1 -0
- package/lib/tools/index.d.ts +1 -1
- package/lib/tools/index.js +8 -8
- package/lib/types.d.ts +0 -44
- package/lib/types.d.ts.map +1 -1
- package/package.json +18 -18
- package/skills/icqq/PERMITS.md +6 -6
- package/src/adapter.ts +14 -6
- package/src/cq-message.ts +11 -3
- package/src/endpoint.ts +169 -52
- package/src/icqq-guild.ts +157 -0
- package/src/icqq-inbound.ts +52 -7
- package/src/icqq-login-assist-bridge.ts +196 -0
- package/src/index.ts +2 -8
- package/src/login-assist-routes.ts +39 -0
- package/src/login-ipc-contract.ts +52 -0
- package/src/protocol.ts +32 -1
- package/src/segment-mapper.ts +1 -0
- package/src/tools/index.ts +9 -9
- package/src/types.ts +0 -45
- package/lib/typing-indicator-example.d.ts +0 -108
- package/lib/typing-indicator-example.d.ts.map +0 -1
- package/lib/typing-indicator-example.js +0 -220
- package/lib/typing-indicator-example.js.map +0 -1
- package/lib/typing-indicator.d.ts +0 -87
- package/lib/typing-indicator.d.ts.map +0 -1
- package/lib/typing-indicator.js +0 -225
- package/lib/typing-indicator.js.map +0 -1
- package/src/typing-indicator-example.ts +0 -269
- package/src/typing-indicator.ts +0 -313
package/lib/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,sBAAsB;AACtB,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC;AAEF,sBAAsB;AACtB,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEhD,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,wCAAwC;AACxC,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAEhE,mBAAmB;AACnB,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsMV,CAAC"}
|
package/lib/protocol.js
CHANGED
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* CLI 与守护进程通过 Unix Domain Socket 通信,
|
|
5
5
|
* 使用 JSON + 换行符(\n)分隔的文本协议。
|
|
6
|
+
*
|
|
7
|
+
* 通信流程(@icqqjs/cli `src/daemon/protocol.ts`):
|
|
8
|
+
* 1. CLI 连接 Socket → auth(token)
|
|
9
|
+
* 2. 认证通过后发送 IpcRequest → 等待 IpcResponse
|
|
10
|
+
* 3. 认证通过后自动接收 icqq 事件推送(IpcEvent),断开连接自动停止
|
|
11
|
+
*
|
|
12
|
+
* 登录相关:**推送**走 IpcEvent(`system.login.*`),续传 invoke 见 `login-ipc-contract.ts`。
|
|
6
13
|
*/
|
|
7
14
|
/** 从 IPC 入站 payload 解析可用于引用/撤回的消息 ID */
|
|
8
15
|
export { resolveIcqqInboundMessageId } from "./icqq-inbound.js";
|
|
@@ -11,6 +18,7 @@ export { resolveIcqqInboundMessageId } from "./icqq-inbound.js";
|
|
|
11
18
|
*/
|
|
12
19
|
export const Actions = {
|
|
13
20
|
PING: "ping",
|
|
21
|
+
LOGOUT: "logout",
|
|
14
22
|
// ── 列表查询 ──
|
|
15
23
|
LIST_FRIENDS: "list_friends",
|
|
16
24
|
LIST_GROUPS: "list_groups",
|
|
@@ -22,7 +30,10 @@ export const Actions = {
|
|
|
22
30
|
GET_GROUP_INFO: "get_group_info",
|
|
23
31
|
GET_GROUP_MEMBER_INFO: "get_group_member_info",
|
|
24
32
|
GET_STRANGER_INFO: "get_stranger_info",
|
|
33
|
+
LIST_STRANGERS: "list_strangers",
|
|
34
|
+
GET_PROFILE: "get_profile",
|
|
25
35
|
GET_STATUS: "get_status",
|
|
36
|
+
GET_ONLINE_STATUS: "get_online_status",
|
|
26
37
|
GET_SELF_PROFILE: "get_self_profile",
|
|
27
38
|
// ── 消息发送 ──
|
|
28
39
|
SEND_PRIVATE_MSG: "send_private_msg",
|
|
@@ -32,6 +43,8 @@ export const Actions = {
|
|
|
32
43
|
GET_MSG: "get_msg",
|
|
33
44
|
HISTORY_PRIVATE: "history_private",
|
|
34
45
|
HISTORY_GROUP: "history_group",
|
|
46
|
+
HISTORY_BY_MSG_ID: "history_by_msg_id",
|
|
47
|
+
SEND_LONG_MSG: "send_long_msg",
|
|
35
48
|
MARK_READ: "mark_read",
|
|
36
49
|
DELETE_MSG: "delete_msg",
|
|
37
50
|
// ── 个人设置 ──
|
|
@@ -107,6 +120,9 @@ export const Actions = {
|
|
|
107
120
|
SEND_PRIVATE_FILE: "send_private_file",
|
|
108
121
|
SEND_GROUP_FILE: "send_group_file",
|
|
109
122
|
FRIEND_RECALL_FILE: "friend_recall_file",
|
|
123
|
+
FRIEND_FORWARD_FILE: "friend_forward_file",
|
|
124
|
+
SEARCH_SAME_GROUP: "search_same_group",
|
|
125
|
+
SEND_CONTACT_SHARE: "send_contact_share",
|
|
110
126
|
GFS_UPLOAD: "gfs_upload",
|
|
111
127
|
// ── 群消息表态 ──
|
|
112
128
|
GROUP_SET_REACTION: "group_set_reaction",
|
|
@@ -118,6 +134,7 @@ export const Actions = {
|
|
|
118
134
|
GUILD_LIST: "guild_list",
|
|
119
135
|
GUILD_INFO: "guild_info",
|
|
120
136
|
GUILD_CHANNELS: "guild_channels",
|
|
137
|
+
GET_CHANNEL_INFO: "get_channel_info",
|
|
121
138
|
GUILD_MEMBERS: "guild_members",
|
|
122
139
|
GUILD_SEND_MSG: "guild_send_msg",
|
|
123
140
|
GUILD_RECALL_MSG: "guild_recall_msg",
|
|
@@ -141,7 +158,13 @@ export const Actions = {
|
|
|
141
158
|
GET_CLIENT_KEY: "get_client_key",
|
|
142
159
|
GET_PSKEY: "get_pskey",
|
|
143
160
|
UID2UIN: "uid2uin",
|
|
161
|
+
UID2UINS: "uid2uins",
|
|
144
162
|
UIN2UID: "uin2uid",
|
|
163
|
+
UIN2UIDS: "uin2uids",
|
|
164
|
+
GET_COOKIES: "get_cookies",
|
|
165
|
+
GET_CSRF_TOKEN: "get_csrf_token",
|
|
166
|
+
REFRESH_NT_PIC_RKEY: "refresh_nt_pic_rkey",
|
|
167
|
+
SEND_DISCUSS_MSG: "send_discuss_msg",
|
|
145
168
|
// ── 视频/加好友设置 ──
|
|
146
169
|
GET_VIDEO_URL: "get_video_url",
|
|
147
170
|
GET_ADD_FRIEND_SETTING: "get_add_friend_setting",
|
package/lib/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segment-mapper.d.ts","sourceRoot":"","sources":["../src/segment-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segment-mapper.js","sourceRoot":"","sources":["../src/segment-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC"}
|
package/lib/tools/index.d.ts
CHANGED
package/lib/tools/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createSceneManagementTools } from "zhin.js";
|
|
2
2
|
import { Actions } from "../protocol.js";
|
|
3
3
|
export function registerTools(toolService, icqq, pluginName) {
|
|
4
4
|
const disposers = [];
|
|
5
5
|
// ── 通用群管工具 ───────────────────────────────────────────────────
|
|
6
|
-
const
|
|
7
|
-
disposers.push(...
|
|
6
|
+
const sceneTools = createSceneManagementTools(icqq, "icqq");
|
|
7
|
+
disposers.push(...sceneTools.map((t) => toolService.addTool(t, pluginName)));
|
|
8
8
|
// ── 设置头衔 ───────────────────────────────────────────────────────
|
|
9
9
|
disposers.push(toolService.addTool({
|
|
10
10
|
name: "icqq_set_title",
|
|
@@ -22,7 +22,7 @@ export function registerTools(toolService, icqq, pluginName) {
|
|
|
22
22
|
},
|
|
23
23
|
platforms: ["icqq"],
|
|
24
24
|
tags: ["icqq"],
|
|
25
|
-
permissions: ["platform(icqq,
|
|
25
|
+
permissions: ["platform(icqq,scene_owner)"],
|
|
26
26
|
execute: async (args) => {
|
|
27
27
|
const endpoint = icqq.endpoints.get(args.endpoint_id);
|
|
28
28
|
if (!endpoint)
|
|
@@ -51,7 +51,7 @@ export function registerTools(toolService, icqq, pluginName) {
|
|
|
51
51
|
},
|
|
52
52
|
platforms: ["icqq"],
|
|
53
53
|
tags: ["icqq"],
|
|
54
|
-
permissions: ["platform(icqq,
|
|
54
|
+
permissions: ["platform(icqq,scene_admin)"],
|
|
55
55
|
execute: async (args) => {
|
|
56
56
|
const endpoint = icqq.endpoints.get(args.endpoint_id);
|
|
57
57
|
if (!endpoint)
|
|
@@ -103,7 +103,7 @@ export function registerTools(toolService, icqq, pluginName) {
|
|
|
103
103
|
},
|
|
104
104
|
platforms: ["icqq"],
|
|
105
105
|
tags: ["icqq"],
|
|
106
|
-
permissions: ["platform(icqq,
|
|
106
|
+
permissions: ["platform(icqq,scene_admin)"],
|
|
107
107
|
execute: async (args) => {
|
|
108
108
|
const endpoint = icqq.endpoints.get(args.endpoint_id);
|
|
109
109
|
if (!endpoint)
|
|
@@ -158,7 +158,7 @@ export function registerTools(toolService, icqq, pluginName) {
|
|
|
158
158
|
},
|
|
159
159
|
platforms: ["icqq"],
|
|
160
160
|
tags: ["icqq"],
|
|
161
|
-
permissions: ["platform(icqq,
|
|
161
|
+
permissions: ["platform(icqq,scene_owner)"],
|
|
162
162
|
execute: async (args) => {
|
|
163
163
|
const endpoint = icqq.endpoints.get(args.endpoint_id);
|
|
164
164
|
if (!endpoint)
|
|
@@ -324,7 +324,7 @@ export function registerTools(toolService, icqq, pluginName) {
|
|
|
324
324
|
},
|
|
325
325
|
platforms: ["icqq"],
|
|
326
326
|
tags: ["icqq"],
|
|
327
|
-
permissions: ["platform(icqq,
|
|
327
|
+
permissions: ["platform(icqq,scene_admin)"],
|
|
328
328
|
execute: async (args) => {
|
|
329
329
|
const endpoint = icqq.endpoints.get(args.endpoint_id);
|
|
330
330
|
if (!endpoint)
|
package/lib/types.d.ts
CHANGED
|
@@ -14,45 +14,6 @@ export interface IcqqSenderInfo {
|
|
|
14
14
|
card?: string;
|
|
15
15
|
title?: string;
|
|
16
16
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Typing Indicator 配置
|
|
19
|
-
*/
|
|
20
|
-
export interface TypingIndicatorConfig {
|
|
21
|
-
/** 是否启用(默认 true) */
|
|
22
|
-
enabled?: boolean;
|
|
23
|
-
/** 默认表情(默认 '⏳') */
|
|
24
|
-
defaultEmoji?: string;
|
|
25
|
-
/** 是否在完成后自动移除(默认 true) */
|
|
26
|
-
autoRemove?: boolean;
|
|
27
|
-
/** 自动移除延迟,毫秒(默认 5000) */
|
|
28
|
-
removeDelay?: number;
|
|
29
|
-
/** 私聊配置 */
|
|
30
|
-
privateConfig?: {
|
|
31
|
-
/** 提示类型 */
|
|
32
|
-
type: 'message' | 'reaction';
|
|
33
|
-
/** 消息内容(type='message' 时使用) */
|
|
34
|
-
message?: string;
|
|
35
|
-
/** 表情符号(type='reaction' 时使用) */
|
|
36
|
-
emoji?: string;
|
|
37
|
-
/** 是否自动移除 */
|
|
38
|
-
autoRemove?: boolean;
|
|
39
|
-
/** 自动移除延迟 */
|
|
40
|
-
removeDelay?: number;
|
|
41
|
-
};
|
|
42
|
-
/** 群聊配置 */
|
|
43
|
-
groupConfig?: {
|
|
44
|
-
/** 提示类型 */
|
|
45
|
-
type: 'message' | 'reaction';
|
|
46
|
-
/** 消息内容(type='message' 时使用) */
|
|
47
|
-
message?: string;
|
|
48
|
-
/** 表情符号(type='reaction' 时使用) */
|
|
49
|
-
emoji?: string;
|
|
50
|
-
/** 是否自动移除 */
|
|
51
|
-
autoRemove?: boolean;
|
|
52
|
-
/** 自动移除延迟 */
|
|
53
|
-
removeDelay?: number;
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
17
|
/**
|
|
57
18
|
* Endpoint 配置:支持本地 IPC 和远程 RPC 两种连接模式。
|
|
58
19
|
*
|
|
@@ -77,11 +38,6 @@ export interface IcqqEndpointConfig {
|
|
|
77
38
|
* 默认 true;设为 false 则断开后仅将 `$connected` 置为 false,需手动重连。
|
|
78
39
|
*/
|
|
79
40
|
autoReconnect?: boolean;
|
|
80
|
-
/**
|
|
81
|
-
* Typing Indicator 配置
|
|
82
|
-
* 用于在 AI 处理消息时提示用户正在处理中
|
|
83
|
-
*/
|
|
84
|
-
typingIndicator?: TypingIndicatorConfig;
|
|
85
41
|
/**
|
|
86
42
|
* 出站图片/语音/视频:file=本机临时文件路径(需与 icqq 守护进程同机可读);
|
|
87
43
|
* base64=经 CQ `base64://` 交给守护进程解码(Zhin 与 icqq 异进程/异机时用,配置 rpc 时默认 base64)。
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAClB,+BAA+B;IAC/B,GAAG,CAAC,EAAE;QACJ,aAAa;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW;QACX,IAAI,EAAE,MAAM,CAAC;QACb,4CAA4C;QAC5C,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CACnC;AAED,kBAAkB;AAClB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,iBAAiB;AACjB,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,mBAAmB;AACnB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/adapter-icqq",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.1",
|
|
4
4
|
"description": "Zhin.js adapter for ICQQ (QQ Bot)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -48,26 +48,26 @@
|
|
|
48
48
|
"@radix-ui/themes": "^3.2.1",
|
|
49
49
|
"@types/react": "^19.2.17",
|
|
50
50
|
"@types/react-dom": "^19.2.3",
|
|
51
|
-
"lucide-react": "^1.
|
|
52
|
-
"radix-ui": "^1.
|
|
51
|
+
"lucide-react": "^1.22.0",
|
|
52
|
+
"radix-ui": "^1.6.2",
|
|
53
53
|
"typescript": "^6.0.3",
|
|
54
|
-
"@zhin.js/agent": "0.
|
|
55
|
-
"@zhin.js/cli": "1.0.
|
|
56
|
-
"@zhin.js/client": "2.0.
|
|
57
|
-
"@zhin.js/contract": "1.0.
|
|
58
|
-
"@zhin.js/core": "1.3.
|
|
59
|
-
"@zhin.js/host-api": "2.0.
|
|
60
|
-
"@zhin.js/host-router": "2.0.
|
|
61
|
-
"zhin.js": "4.
|
|
54
|
+
"@zhin.js/agent": "1.0.2",
|
|
55
|
+
"@zhin.js/cli": "1.0.92",
|
|
56
|
+
"@zhin.js/client": "2.0.4",
|
|
57
|
+
"@zhin.js/contract": "1.0.2",
|
|
58
|
+
"@zhin.js/core": "1.3.3",
|
|
59
|
+
"@zhin.js/host-api": "2.0.4",
|
|
60
|
+
"@zhin.js/host-router": "2.0.2",
|
|
61
|
+
"zhin.js": "4.1.1"
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
|
-
"@zhin.js/agent": "0.
|
|
65
|
-
"@zhin.js/client": "2.0.
|
|
66
|
-
"@zhin.js/host-api": "2.0.
|
|
67
|
-
"@zhin.js/contract": "1.0.
|
|
68
|
-
"@zhin.js/core": "1.3.
|
|
69
|
-
"@zhin.js/host-router": "2.0.
|
|
70
|
-
"zhin.js": "4.
|
|
64
|
+
"@zhin.js/agent": "1.0.2",
|
|
65
|
+
"@zhin.js/client": "2.0.4",
|
|
66
|
+
"@zhin.js/host-api": "2.0.4",
|
|
67
|
+
"@zhin.js/contract": "1.0.2",
|
|
68
|
+
"@zhin.js/core": "1.3.3",
|
|
69
|
+
"@zhin.js/host-router": "2.0.2",
|
|
70
|
+
"zhin.js": "4.1.1"
|
|
71
71
|
},
|
|
72
72
|
"peerDependenciesMeta": {
|
|
73
73
|
"@zhin.js/agent": {
|
package/skills/icqq/PERMITS.md
CHANGED
|
@@ -8,15 +8,15 @@
|
|
|
8
8
|
|
|
9
9
|
| `platform(icqq,…)` | 含义 |
|
|
10
10
|
|--------------------|------|
|
|
11
|
-
| `
|
|
12
|
-
| `
|
|
11
|
+
| `scene_owner` | 群主 |
|
|
12
|
+
| `scene_admin` | 群管理员(含群主) |
|
|
13
13
|
|
|
14
14
|
## 扩展工具示例
|
|
15
15
|
|
|
16
16
|
| 工具 | permit |
|
|
17
17
|
|------|--------|
|
|
18
|
-
| `icqq_set_title` | `
|
|
19
|
-
| `icqq_announce` / `icqq_essence` / `icqq_list_muted` | `
|
|
20
|
-
| `icqq_set_anonymous` | `
|
|
18
|
+
| `icqq_set_title` | `scene_owner` |
|
|
19
|
+
| `icqq_announce` / `icqq_essence` / `icqq_list_muted` | `scene_admin` |
|
|
20
|
+
| `icqq_set_anonymous` | `scene_owner` |
|
|
21
21
|
|
|
22
|
-
工厂群管工具使用默认 `
|
|
22
|
+
工厂群管工具使用默认 `scene_admin` / `scene_owner`。
|
package/src/adapter.ts
CHANGED
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ICQQ 适配器 — 通过 @icqqjs/cli 守护进程 IPC 管理 Endpoint 实例
|
|
3
3
|
*/
|
|
4
|
-
import { formatCompact, Adapter, Plugin } from 'zhin.js';
|
|
4
|
+
import { formatCompact, Adapter, Plugin, OUTBOUND_RICH_SEGMENT_POLICY_IM_FULL, ONEBOT_KEYBOARD_AI_OUTBOUND_EXTENSION } from 'zhin.js';
|
|
5
5
|
import { IcqqEndpoint } from "./endpoint.js";
|
|
6
6
|
import type { IcqqEndpointConfig, IpcMemberInfo } from "./types.js";
|
|
7
7
|
import { Actions } from "./protocol.js";
|
|
8
8
|
|
|
9
9
|
export class IcqqAdapter extends Adapter<IcqqEndpoint> {
|
|
10
10
|
static override readonly capabilities = ['inbound', 'outbound'] as const;
|
|
11
|
+
static override outboundRichSegmentPolicy = OUTBOUND_RICH_SEGMENT_POLICY_IM_FULL;
|
|
12
|
+
static override interactivePolicy = 'text' as const;
|
|
13
|
+
static override aiOutboundCapabilities = {
|
|
14
|
+
mentions: true,
|
|
15
|
+
richSegments: ['qrcode', 'html', 'markdown', 'tts'],
|
|
16
|
+
interactive: 'text' as const,
|
|
17
|
+
};
|
|
18
|
+
static override aiOutboundExtensions = [ONEBOT_KEYBOARD_AI_OUTBOUND_EXTENSION];
|
|
11
19
|
|
|
12
20
|
constructor(plugin: Plugin) {
|
|
13
21
|
super(plugin, "icqq", []);
|
|
@@ -36,7 +44,7 @@ export class IcqqAdapter extends Adapter<IcqqEndpoint> {
|
|
|
36
44
|
this.logger.debug(formatCompact({ stop: true }));
|
|
37
45
|
}
|
|
38
46
|
|
|
39
|
-
// ──
|
|
47
|
+
// ── ISceneManagement 标准群管方法(通过 IPC) ─────────────────────
|
|
40
48
|
|
|
41
49
|
private getEndpoint(endpointId: string): IcqqEndpoint {
|
|
42
50
|
const endpoint = this.endpoints.get(endpointId);
|
|
@@ -44,7 +52,7 @@ export class IcqqAdapter extends Adapter<IcqqEndpoint> {
|
|
|
44
52
|
return endpoint;
|
|
45
53
|
}
|
|
46
54
|
|
|
47
|
-
async
|
|
55
|
+
async removeMember(endpointId: string, sceneId: string, userId: string) {
|
|
48
56
|
const endpoint = this.getEndpoint(endpointId);
|
|
49
57
|
const resp = await endpoint.ipc.request(Actions.GROUP_KICK, {
|
|
50
58
|
group_id: Number(sceneId),
|
|
@@ -71,7 +79,7 @@ export class IcqqAdapter extends Adapter<IcqqEndpoint> {
|
|
|
71
79
|
return true;
|
|
72
80
|
}
|
|
73
81
|
|
|
74
|
-
async
|
|
82
|
+
async setSceneMuted(endpointId: string, sceneId: string, enable = true) {
|
|
75
83
|
const endpoint = this.getEndpoint(endpointId);
|
|
76
84
|
const resp = await endpoint.ipc.request(Actions.GROUP_MUTE_ALL, {
|
|
77
85
|
group_id: Number(sceneId),
|
|
@@ -81,7 +89,7 @@ export class IcqqAdapter extends Adapter<IcqqEndpoint> {
|
|
|
81
89
|
return true;
|
|
82
90
|
}
|
|
83
91
|
|
|
84
|
-
async
|
|
92
|
+
async setModerator(
|
|
85
93
|
endpointId: string,
|
|
86
94
|
sceneId: string,
|
|
87
95
|
userId: string,
|
|
@@ -113,7 +121,7 @@ export class IcqqAdapter extends Adapter<IcqqEndpoint> {
|
|
|
113
121
|
return true;
|
|
114
122
|
}
|
|
115
123
|
|
|
116
|
-
async
|
|
124
|
+
async renameScene(endpointId: string, sceneId: string, name: string) {
|
|
117
125
|
const endpoint = this.getEndpoint(endpointId);
|
|
118
126
|
const resp = await endpoint.ipc.request(Actions.SET_GROUP_NAME, {
|
|
119
127
|
group_id: Number(sceneId),
|
package/src/cq-message.ts
CHANGED
|
@@ -35,7 +35,7 @@ function pushCqSegment(segments: MessageSegment[], type: string, arg: string): v
|
|
|
35
35
|
segments.push({ type: "video", data: { file: arg } });
|
|
36
36
|
break;
|
|
37
37
|
case "reply":
|
|
38
|
-
segments.push({ type: "reply", data: {
|
|
38
|
+
segments.push({ type: "reply", data: { message_id: arg } });
|
|
39
39
|
break;
|
|
40
40
|
default:
|
|
41
41
|
segments.push({ type, data: { text: `[${type}:${arg}]` } });
|
|
@@ -98,6 +98,11 @@ export function toCqString(content: SendContent): string {
|
|
|
98
98
|
case "face":
|
|
99
99
|
return `[face:${data.id}]`;
|
|
100
100
|
case "image": {
|
|
101
|
+
const media = data.media as { kind?: string; value?: string } | undefined;
|
|
102
|
+
if (media?.value) {
|
|
103
|
+
if (media.kind === "base64") return `[image:base64://${media.value}]`;
|
|
104
|
+
return `[image:${media.value}]`;
|
|
105
|
+
}
|
|
101
106
|
const b64 =
|
|
102
107
|
typeof data.base64 === "string"
|
|
103
108
|
? data.base64
|
|
@@ -108,7 +113,10 @@ export function toCqString(content: SendContent): string {
|
|
|
108
113
|
return `[image:${data.file || data.url || data.src}]`;
|
|
109
114
|
}
|
|
110
115
|
case "at":
|
|
111
|
-
|
|
116
|
+
case "mention": {
|
|
117
|
+
const target = data.target ?? data.qq ?? data.id ?? data.user_id;
|
|
118
|
+
return `[at:${target}]`;
|
|
119
|
+
}
|
|
112
120
|
case "dice":
|
|
113
121
|
return "[dice]";
|
|
114
122
|
case "rps":
|
|
@@ -130,7 +138,7 @@ export function toCqString(content: SendContent): string {
|
|
|
130
138
|
return `[video:${data.file || data.url}]`;
|
|
131
139
|
}
|
|
132
140
|
case "reply":
|
|
133
|
-
return `[reply:${data.id}]`;
|
|
141
|
+
return `[reply:${data.message_id ?? data.id}]`;
|
|
134
142
|
default:
|
|
135
143
|
return segment.toString(seg);
|
|
136
144
|
}
|