@zhin.js/adapter-napcat 3.0.2 → 5.0.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.
- package/CHANGELOG.md +62 -0
- package/README.md +47 -98
- package/adapters/napcat.ts +39 -0
- package/agent/tools/ai_tts.ts +2 -2
- package/agent/tools/del_group_notice.ts +2 -2
- package/agent/tools/delete_essence_msg.ts +2 -2
- package/agent/tools/delete_friend.ts +2 -2
- package/agent/tools/download_file.ts +2 -2
- package/agent/tools/forward_single_msg.ts +2 -2
- package/agent/tools/get_ai_characters.ts +2 -2
- package/agent/tools/get_essence_list.ts +2 -2
- package/agent/tools/get_friend_msg_history.ts +2 -2
- package/agent/tools/get_group_file_url.ts +2 -2
- package/agent/tools/get_group_info_ex.ts +2 -2
- package/agent/tools/get_group_msg_history.ts +2 -2
- package/agent/tools/get_group_notice.ts +2 -2
- package/agent/tools/get_group_root_files.ts +2 -2
- package/agent/tools/get_group_shut_list.ts +2 -2
- package/agent/tools/get_mini_app_ark.ts +2 -2
- package/agent/tools/get_user_status.ts +2 -2
- package/agent/tools/group_sign.ts +2 -2
- package/agent/tools/mark_msg_as_read.ts +2 -2
- package/agent/tools/ocr_image.ts +2 -2
- package/agent/tools/send_forward_msg.ts +2 -2
- package/agent/tools/send_group_notice.ts +2 -2
- package/agent/tools/send_like.ts +2 -2
- package/agent/tools/send_poke.ts +2 -2
- package/agent/tools/set_avatar.ts +2 -2
- package/agent/tools/set_emoji_reaction.ts +2 -2
- package/agent/tools/set_essence_msg.ts +2 -2
- package/agent/tools/set_group_portrait.ts +2 -2
- package/agent/tools/set_online_status.ts +2 -2
- package/agent/tools/set_profile.ts +2 -2
- package/agent/tools/set_signature.ts +2 -2
- package/agent/tools/set_title.ts +2 -2
- package/agent/tools/translate.ts +2 -2
- package/agent/tools/upload_group_file.ts +2 -2
- package/lib/http-endpoint.d.ts +26 -0
- package/lib/http-endpoint.js +147 -0
- package/lib/index.d.ts +11 -0
- package/lib/index.js +10 -0
- package/lib/napcat-agent-deps.d.ts +51 -0
- package/lib/napcat-agent-deps.js +33 -0
- package/lib/napcat-inbound.d.ts +28 -0
- package/lib/{src/napcat-inbound.js → napcat-inbound.js} +28 -13
- package/lib/onebot-get-msg.d.ts +14 -0
- package/lib/{src/onebot-get-msg.js → onebot-get-msg.js} +0 -1
- package/lib/protocol.d.ts +151 -0
- package/lib/protocol.js +217 -0
- package/lib/webhook.d.ts +2 -0
- package/lib/webhook.js +14 -0
- package/lib/ws-endpoint.d.ts +61 -0
- package/lib/ws-endpoint.js +357 -0
- package/lib/ws-transport.d.ts +13 -0
- package/lib/ws-transport.js +75 -0
- package/lib/ws-types.d.ts +17 -0
- package/lib/ws-types.js +1 -0
- package/lib/wss-auth.d.ts +2 -0
- package/lib/wss-auth.js +16 -0
- package/lib/wss-endpoint.d.ts +25 -0
- package/lib/wss-endpoint.js +157 -0
- package/package.json +44 -33
- package/plugin.ts +13 -0
- package/schema.json +74 -0
- package/src/http-endpoint.ts +197 -0
- package/src/index.ts +66 -81
- package/src/napcat-agent-deps.ts +81 -15
- package/src/napcat-inbound.ts +34 -10
- package/src/onebot-get-msg.ts +8 -2
- package/src/protocol.ts +373 -0
- package/src/webhook.ts +16 -0
- package/src/ws-endpoint.ts +452 -0
- package/src/ws-transport.ts +105 -0
- package/src/ws-types.ts +20 -0
- package/src/wss-auth.ts +17 -0
- package/src/wss-endpoint.ts +205 -0
- package/client/NapCatManagement.tsx +0 -113
- package/client/index.tsx +0 -11
- package/client/tsconfig.json +0 -7
- package/client/utils/api.ts +0 -30
- package/dist/index.js +0 -27
- package/lib/agent/tools/ai_tts.js +0 -21
- package/lib/agent/tools/ai_tts.js.map +0 -1
- package/lib/agent/tools/del_group_notice.js +0 -22
- package/lib/agent/tools/del_group_notice.js.map +0 -1
- package/lib/agent/tools/delete_essence_msg.js +0 -21
- package/lib/agent/tools/delete_essence_msg.js.map +0 -1
- package/lib/agent/tools/delete_friend.js +0 -20
- package/lib/agent/tools/delete_friend.js.map +0 -1
- package/lib/agent/tools/download_file.js +0 -19
- package/lib/agent/tools/download_file.js.map +0 -1
- package/lib/agent/tools/forward_single_msg.js +0 -24
- package/lib/agent/tools/forward_single_msg.js.map +0 -1
- package/lib/agent/tools/get_ai_characters.js +0 -19
- package/lib/agent/tools/get_ai_characters.js.map +0 -1
- package/lib/agent/tools/get_essence_list.js +0 -19
- package/lib/agent/tools/get_essence_list.js.map +0 -1
- package/lib/agent/tools/get_friend_msg_history.js +0 -20
- package/lib/agent/tools/get_friend_msg_history.js.map +0 -1
- package/lib/agent/tools/get_group_file_url.js +0 -21
- package/lib/agent/tools/get_group_file_url.js.map +0 -1
- package/lib/agent/tools/get_group_info_ex.js +0 -19
- package/lib/agent/tools/get_group_info_ex.js.map +0 -1
- package/lib/agent/tools/get_group_msg_history.js +0 -21
- package/lib/agent/tools/get_group_msg_history.js.map +0 -1
- package/lib/agent/tools/get_group_notice.js +0 -19
- package/lib/agent/tools/get_group_notice.js.map +0 -1
- package/lib/agent/tools/get_group_root_files.js +0 -19
- package/lib/agent/tools/get_group_root_files.js.map +0 -1
- package/lib/agent/tools/get_group_shut_list.js +0 -19
- package/lib/agent/tools/get_group_shut_list.js.map +0 -1
- package/lib/agent/tools/get_mini_app_ark.js +0 -22
- package/lib/agent/tools/get_mini_app_ark.js.map +0 -1
- package/lib/agent/tools/get_user_status.js +0 -18
- package/lib/agent/tools/get_user_status.js.map +0 -1
- package/lib/agent/tools/group_sign.js +0 -20
- package/lib/agent/tools/group_sign.js.map +0 -1
- package/lib/agent/tools/mark_msg_as_read.js +0 -19
- package/lib/agent/tools/mark_msg_as_read.js.map +0 -1
- package/lib/agent/tools/ocr_image.js +0 -18
- package/lib/agent/tools/ocr_image.js.map +0 -1
- package/lib/agent/tools/send_forward_msg.js +0 -21
- package/lib/agent/tools/send_forward_msg.js.map +0 -1
- package/lib/agent/tools/send_group_notice.js +0 -23
- package/lib/agent/tools/send_group_notice.js.map +0 -1
- package/lib/agent/tools/send_like.js +0 -20
- package/lib/agent/tools/send_like.js.map +0 -1
- package/lib/agent/tools/send_poke.js +0 -20
- package/lib/agent/tools/send_poke.js.map +0 -1
- package/lib/agent/tools/set_avatar.js +0 -19
- package/lib/agent/tools/set_avatar.js.map +0 -1
- package/lib/agent/tools/set_emoji_reaction.js +0 -20
- package/lib/agent/tools/set_emoji_reaction.js.map +0 -1
- package/lib/agent/tools/set_essence_msg.js +0 -21
- package/lib/agent/tools/set_essence_msg.js.map +0 -1
- package/lib/agent/tools/set_group_portrait.js +0 -22
- package/lib/agent/tools/set_group_portrait.js.map +0 -1
- package/lib/agent/tools/set_online_status.js +0 -20
- package/lib/agent/tools/set_online_status.js.map +0 -1
- package/lib/agent/tools/set_profile.js +0 -23
- package/lib/agent/tools/set_profile.js.map +0 -1
- package/lib/agent/tools/set_signature.js +0 -19
- package/lib/agent/tools/set_signature.js.map +0 -1
- package/lib/agent/tools/set_title.js +0 -23
- package/lib/agent/tools/set_title.js.map +0 -1
- package/lib/agent/tools/translate.js +0 -18
- package/lib/agent/tools/translate.js.map +0 -1
- package/lib/agent/tools/upload_group_file.js +0 -23
- package/lib/agent/tools/upload_group_file.js.map +0 -1
- package/lib/src/adapter.js +0 -102
- package/lib/src/adapter.js.map +0 -1
- package/lib/src/agent-prompt.js +0 -106
- package/lib/src/agent-prompt.js.map +0 -1
- package/lib/src/endpoint-base.js +0 -315
- package/lib/src/endpoint-base.js.map +0 -1
- package/lib/src/endpoint-http.js +0 -106
- package/lib/src/endpoint-http.js.map +0 -1
- package/lib/src/endpoint-ws-client.js +0 -139
- package/lib/src/endpoint-ws-client.js.map +0 -1
- package/lib/src/endpoint-ws-server.js +0 -137
- package/lib/src/endpoint-ws-server.js.map +0 -1
- package/lib/src/index.js +0 -58
- package/lib/src/index.js.map +0 -1
- package/lib/src/napcat-agent-deps.js +0 -19
- package/lib/src/napcat-agent-deps.js.map +0 -1
- package/lib/src/napcat-inbound.js.map +0 -1
- package/lib/src/onebot-get-msg.js.map +0 -1
- package/lib/src/routes.js +0 -61
- package/lib/src/routes.js.map +0 -1
- package/lib/src/segment-mapper.js +0 -2
- package/lib/src/segment-mapper.js.map +0 -1
- package/lib/src/types.js +0 -6
- package/lib/src/types.js.map +0 -1
- package/plugin.yml +0 -3
- package/src/adapter.ts +0 -109
- package/src/agent-prompt.ts +0 -115
- package/src/endpoint-base.ts +0 -362
- package/src/endpoint-http.ts +0 -95
- package/src/endpoint-ws-client.ts +0 -137
- package/src/endpoint-ws-server.ts +0 -136
- package/src/routes.ts +0 -61
- package/src/segment-mapper.ts +0 -1
- package/src/types.ts +0 -266
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NapCat reverse WSS endpoint — accepts inbound WebSocket from NapCat.
|
|
3
|
+
*/
|
|
4
|
+
import { clearInterval } from 'node:timers';
|
|
5
|
+
import type { EndpointInstance } from '@zhin.js/adapter';
|
|
6
|
+
import type { MessageGateway } from '@zhin.js/core/runtime';
|
|
7
|
+
import type { HttpHost, WsConnection } from '@zhin.js/host-http';
|
|
8
|
+
import { formatCompact, getLogger } from '@zhin.js/logger';
|
|
9
|
+
import type { CapabilityId } from '@zhin.js/plugin-runtime';
|
|
10
|
+
import { registerNapcatAgentEndpoint } from './napcat-agent-deps.js';
|
|
11
|
+
import {
|
|
12
|
+
InboundMessageDeduper,
|
|
13
|
+
isNapCatBotMentioned,
|
|
14
|
+
isSelfMessage,
|
|
15
|
+
normalizeMessage,
|
|
16
|
+
} from './napcat-inbound.js';
|
|
17
|
+
import {
|
|
18
|
+
buildSendAction,
|
|
19
|
+
formatInboundContent,
|
|
20
|
+
formatInboundTarget,
|
|
21
|
+
formatOutboundSegments,
|
|
22
|
+
isMessageEvent,
|
|
23
|
+
senderNickname,
|
|
24
|
+
senderUserId,
|
|
25
|
+
type NapCatEvent,
|
|
26
|
+
type NapCatWssConfig,
|
|
27
|
+
} from './protocol.js';
|
|
28
|
+
import {
|
|
29
|
+
callNapCatWsAction,
|
|
30
|
+
handleNapCatWsMessage,
|
|
31
|
+
rejectAllPending,
|
|
32
|
+
startNapCatHeartbeat,
|
|
33
|
+
} from './ws-transport.js';
|
|
34
|
+
import { NapCatWsEndpoint } from './ws-endpoint.js';
|
|
35
|
+
import {
|
|
36
|
+
type NapCatPendingAction,
|
|
37
|
+
type NapCatWsSocket,
|
|
38
|
+
} from './ws-types.js';
|
|
39
|
+
import { verifyNapCatAccessToken } from './wss-auth.js';
|
|
40
|
+
|
|
41
|
+
const logger = getLogger('napcat');
|
|
42
|
+
|
|
43
|
+
export interface NapCatWssEndpointOptions {
|
|
44
|
+
readonly id: CapabilityId;
|
|
45
|
+
readonly gateway: MessageGateway;
|
|
46
|
+
readonly http: HttpHost;
|
|
47
|
+
readonly config: NapCatWssConfig;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export class NapCatWssEndpoint implements EndpointInstance {
|
|
51
|
+
readonly #options: NapCatWssEndpointOptions;
|
|
52
|
+
readonly #inboundDeduper = new InboundMessageDeduper();
|
|
53
|
+
#ws?: NapCatWsSocket;
|
|
54
|
+
#wsRelease?: () => void;
|
|
55
|
+
#heartbeatTimer?: NodeJS.Timeout;
|
|
56
|
+
#requestId = { value: 0 };
|
|
57
|
+
#pending = new Map<string, NapCatPendingAction>();
|
|
58
|
+
#open = false;
|
|
59
|
+
#started = false;
|
|
60
|
+
#unregisterAgent?: () => void;
|
|
61
|
+
|
|
62
|
+
constructor(options: NapCatWssEndpointOptions) {
|
|
63
|
+
this.#options = options;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async start(): Promise<void> {
|
|
67
|
+
if (this.#started) return;
|
|
68
|
+
this.#started = true;
|
|
69
|
+
this.#unregisterAgent = registerNapcatAgentEndpoint(
|
|
70
|
+
this.#options.config.name,
|
|
71
|
+
this as unknown as NapCatWsEndpoint,
|
|
72
|
+
);
|
|
73
|
+
const handle = this.#options.http.ws(this.#options.config.path);
|
|
74
|
+
this.#wsRelease = handle.onConnection((connection) => {
|
|
75
|
+
this.#acceptConnection(connection);
|
|
76
|
+
});
|
|
77
|
+
logger.info(formatCompact({
|
|
78
|
+
op: 'listen',
|
|
79
|
+
endpoint: this.#options.config.name,
|
|
80
|
+
mode: 'wss',
|
|
81
|
+
path: this.#options.config.path,
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
open(): void {
|
|
86
|
+
this.#open = true;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
close(): void {
|
|
90
|
+
this.#open = false;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async stop(): Promise<void> {
|
|
94
|
+
this.#open = false;
|
|
95
|
+
this.#unregisterAgent?.();
|
|
96
|
+
this.#unregisterAgent = undefined;
|
|
97
|
+
this.#wsRelease?.();
|
|
98
|
+
this.#wsRelease = undefined;
|
|
99
|
+
if (this.#heartbeatTimer) {
|
|
100
|
+
clearInterval(this.#heartbeatTimer);
|
|
101
|
+
this.#heartbeatTimer = undefined;
|
|
102
|
+
}
|
|
103
|
+
rejectAllPending(this.#pending);
|
|
104
|
+
this.#inboundDeduper.clear();
|
|
105
|
+
if (this.#ws) {
|
|
106
|
+
try {
|
|
107
|
+
this.#ws.close();
|
|
108
|
+
} catch {
|
|
109
|
+
/* ignore */
|
|
110
|
+
}
|
|
111
|
+
this.#ws = undefined;
|
|
112
|
+
}
|
|
113
|
+
this.#started = false;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async send({ target, payload }: { readonly target: string; readonly payload: unknown }): Promise<string> {
|
|
117
|
+
const message = formatOutboundSegments(payload);
|
|
118
|
+
const { action, params } = buildSendAction(target, message);
|
|
119
|
+
const data = await this.callApi(action, params) as { message_id?: number | string } | undefined;
|
|
120
|
+
return data?.message_id != null ? String(data.message_id) : '';
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
callApi(action: string, params: Record<string, unknown> = {}): Promise<unknown> {
|
|
124
|
+
return callNapCatWsAction(this.#ws, this.#pending, this.#requestId, action, params);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
admit(ev: NapCatEvent): void {
|
|
128
|
+
if (!this.#open || !isMessageEvent(ev)) return;
|
|
129
|
+
if (isSelfMessage(ev)) return;
|
|
130
|
+
const msgId = String(ev.message_id);
|
|
131
|
+
if (!this.#inboundDeduper.shouldProcess(msgId)) return;
|
|
132
|
+
if (Array.isArray(ev.message) || typeof ev.message === 'string') {
|
|
133
|
+
ev = { ...ev, message: normalizeMessage(ev.message) };
|
|
134
|
+
}
|
|
135
|
+
const target = formatInboundTarget(ev);
|
|
136
|
+
const nickname = senderNickname(ev);
|
|
137
|
+
const mentioned = isNapCatBotMentioned(ev);
|
|
138
|
+
void this.#options.gateway.receive({
|
|
139
|
+
adapter: this.#options.id,
|
|
140
|
+
target,
|
|
141
|
+
content: formatInboundContent(ev),
|
|
142
|
+
sender: senderUserId(ev),
|
|
143
|
+
id: msgId,
|
|
144
|
+
metadata: Object.freeze({
|
|
145
|
+
message_type: ev.message_type,
|
|
146
|
+
user_id: ev.user_id != null ? String(ev.user_id) : undefined,
|
|
147
|
+
group_id: ev.group_id != null ? String(ev.group_id) : undefined,
|
|
148
|
+
endpoint: this.#options.config.name,
|
|
149
|
+
time: ev.time,
|
|
150
|
+
self_id: ev.self_id != null ? String(ev.self_id) : undefined,
|
|
151
|
+
role: ev.sender?.role,
|
|
152
|
+
...(nickname ? { nickname } : {}),
|
|
153
|
+
...(mentioned ? { mentioned: true } : {}),
|
|
154
|
+
}),
|
|
155
|
+
}).catch((err) => {
|
|
156
|
+
logger.warn(formatCompact({
|
|
157
|
+
op: 'napcat_gateway_receive_failed',
|
|
158
|
+
target,
|
|
159
|
+
error: err instanceof Error ? err.message : String(err),
|
|
160
|
+
}));
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
#acceptConnection(connection: WsConnection): void {
|
|
165
|
+
if (!verifyNapCatAccessToken(this.#options.config.access_token, connection.request)) {
|
|
166
|
+
connection.socket.close(4003, 'Unauthorized');
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const socket = connection.socket as unknown as NapCatWsSocket;
|
|
170
|
+
if (this.#ws) {
|
|
171
|
+
try {
|
|
172
|
+
this.#ws.close();
|
|
173
|
+
} catch {
|
|
174
|
+
/* ignore */
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
this.#ws = socket;
|
|
178
|
+
this.#heartbeatTimer = startNapCatHeartbeat(
|
|
179
|
+
this.#ws,
|
|
180
|
+
this.#options.config.heartbeat_interval,
|
|
181
|
+
this.#heartbeatTimer,
|
|
182
|
+
);
|
|
183
|
+
socket.on('message', (data) => {
|
|
184
|
+
handleNapCatWsMessage(data, {
|
|
185
|
+
endpointName: this.#options.config.name,
|
|
186
|
+
pending: this.#pending,
|
|
187
|
+
admit: (event) => this.admit(event),
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
socket.on('close', () => {
|
|
191
|
+
if (this.#ws === socket) {
|
|
192
|
+
this.#ws = undefined;
|
|
193
|
+
if (this.#heartbeatTimer) {
|
|
194
|
+
clearInterval(this.#heartbeatTimer);
|
|
195
|
+
this.#heartbeatTimer = undefined;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
logger.debug(formatCompact({
|
|
200
|
+
endpoint: this.#options.config.name,
|
|
201
|
+
mode: 'wss',
|
|
202
|
+
peer: connection.request.socket.remoteAddress,
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useState } from "react";
|
|
2
|
-
import { Bot, Users, RefreshCw, Wifi, WifiOff, Loader2, Activity } from "lucide-react";
|
|
3
|
-
import { apiFetch } from "./utils/api";
|
|
4
|
-
|
|
5
|
-
interface EndpointRow {
|
|
6
|
-
name: string;
|
|
7
|
-
connected: boolean;
|
|
8
|
-
connection: string;
|
|
9
|
-
groupCount: number;
|
|
10
|
-
friendCount: number;
|
|
11
|
-
status: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export default function NapCatManagement() {
|
|
15
|
-
const [endpoints, setEndpoints] = useState<EndpointRow[]>([]);
|
|
16
|
-
const [loading, setLoading] = useState(true);
|
|
17
|
-
const [err, setErr] = useState<string | null>(null);
|
|
18
|
-
|
|
19
|
-
const loadBots = useCallback(async () => {
|
|
20
|
-
setLoading(true);
|
|
21
|
-
setErr(null);
|
|
22
|
-
try {
|
|
23
|
-
const res = await apiFetch("/api/napcat/endpoints");
|
|
24
|
-
const json = (await res.json()) as { success?: boolean; data?: EndpointRow[]; message?: string };
|
|
25
|
-
if (!res.ok || !json.success) throw new Error(json.message || "加载失败");
|
|
26
|
-
setEndpoints(Array.isArray(json.data) ? json.data : []);
|
|
27
|
-
} catch (e) {
|
|
28
|
-
setErr((e as Error).message);
|
|
29
|
-
setEndpoints([]);
|
|
30
|
-
} finally {
|
|
31
|
-
setLoading(false);
|
|
32
|
-
}
|
|
33
|
-
}, []);
|
|
34
|
-
|
|
35
|
-
useEffect(() => {
|
|
36
|
-
void loadBots();
|
|
37
|
-
}, [loadBots]);
|
|
38
|
-
|
|
39
|
-
const connectionLabel = (c: string) => {
|
|
40
|
-
switch (c) {
|
|
41
|
-
case 'ws': return '正向 WS';
|
|
42
|
-
case 'wss': return '反向 WS';
|
|
43
|
-
case 'http': return 'HTTP';
|
|
44
|
-
default: return c;
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
return (
|
|
49
|
-
<div className="p-6 max-w-5xl mx-auto space-y-5">
|
|
50
|
-
<div className="flex items-center justify-between">
|
|
51
|
-
<div>
|
|
52
|
-
<h1 className="text-2xl font-bold flex items-center gap-2">
|
|
53
|
-
<Bot className="w-6 h-6" /> NapCat 管理
|
|
54
|
-
</h1>
|
|
55
|
-
<p className="text-sm text-muted-foreground mt-1">
|
|
56
|
-
NapCatQQ 机器人概览(OneBot11 + go-cqhttp + NapCat 扩展)
|
|
57
|
-
</p>
|
|
58
|
-
</div>
|
|
59
|
-
<button
|
|
60
|
-
onClick={loadBots}
|
|
61
|
-
disabled={loading}
|
|
62
|
-
className="flex items-center gap-1 px-3 py-1.5 rounded bg-blue-500 text-white hover:bg-blue-600 disabled:opacity-50 text-sm"
|
|
63
|
-
>
|
|
64
|
-
<RefreshCw className={`w-4 h-4 ${loading ? "animate-spin" : ""}`} /> 刷新
|
|
65
|
-
</button>
|
|
66
|
-
</div>
|
|
67
|
-
|
|
68
|
-
{err && (
|
|
69
|
-
<div className="p-3 bg-red-50 text-red-600 rounded border border-red-200 text-sm dark:bg-red-900/20 dark:text-red-400 dark:border-red-800">
|
|
70
|
-
{err}
|
|
71
|
-
</div>
|
|
72
|
-
)}
|
|
73
|
-
{loading ? (
|
|
74
|
-
<div className="flex justify-center py-12">
|
|
75
|
-
<Loader2 className="w-6 h-6 animate-spin text-blue-500" />
|
|
76
|
-
</div>
|
|
77
|
-
) : endpoints.length === 0 ? (
|
|
78
|
-
<div className="text-center text-muted-foreground py-12">
|
|
79
|
-
暂无 NapCat Endpoint 实例
|
|
80
|
-
</div>
|
|
81
|
-
) : (
|
|
82
|
-
<div className="grid gap-4 md:grid-cols-2">
|
|
83
|
-
{endpoints.map((endpoint) => (
|
|
84
|
-
<div key={endpoint.name} className="border rounded-lg p-4 bg-card shadow-sm">
|
|
85
|
-
<div className="flex items-center justify-between mb-3">
|
|
86
|
-
<span className="font-medium text-lg">{endpoint.name}</span>
|
|
87
|
-
{endpoint.connected ? (
|
|
88
|
-
<span className="flex items-center gap-1 text-green-600 text-sm">
|
|
89
|
-
<Wifi className="w-4 h-4" /> 在线
|
|
90
|
-
</span>
|
|
91
|
-
) : (
|
|
92
|
-
<span className="flex items-center gap-1 text-gray-400 text-sm">
|
|
93
|
-
<WifiOff className="w-4 h-4" /> 离线
|
|
94
|
-
</span>
|
|
95
|
-
)}
|
|
96
|
-
</div>
|
|
97
|
-
<div className="space-y-2 text-sm text-muted-foreground">
|
|
98
|
-
<div className="flex items-center gap-1.5">
|
|
99
|
-
<Users className="w-3.5 h-3.5" />
|
|
100
|
-
群 {endpoint.groupCount} · 好友 {endpoint.friendCount}
|
|
101
|
-
</div>
|
|
102
|
-
<div className="flex items-center gap-1.5">
|
|
103
|
-
<Activity className="w-3.5 h-3.5" />
|
|
104
|
-
连接方式 {connectionLabel(endpoint.connection)} · {endpoint.status}
|
|
105
|
-
</div>
|
|
106
|
-
</div>
|
|
107
|
-
</div>
|
|
108
|
-
))}
|
|
109
|
-
</div>
|
|
110
|
-
)}
|
|
111
|
-
</div>
|
|
112
|
-
);
|
|
113
|
-
}
|
package/client/index.tsx
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { PluginRegisterHostApi } from '@zhin.js/contract';
|
|
2
|
-
import NapCatManagement from './NapCatManagement';
|
|
3
|
-
|
|
4
|
-
export function register(api: PluginRegisterHostApi) {
|
|
5
|
-
api.addRoute({
|
|
6
|
-
path: '/console/napcat',
|
|
7
|
-
name: 'NapCat管理',
|
|
8
|
-
element: api.React.createElement(NapCatManagement, { hostReact: api.React }),
|
|
9
|
-
});
|
|
10
|
-
api.addTool({ id: 'napcat', name: 'NapCat', path: '/console/napcat' });
|
|
11
|
-
}
|
package/client/tsconfig.json
DELETED
package/client/utils/api.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
const TOKEN_KEY = "zhin_api_token";
|
|
2
|
-
const API_BASE_KEY = "zhin_api_base";
|
|
3
|
-
|
|
4
|
-
export function getApiBase(): string {
|
|
5
|
-
const stored = localStorage.getItem(API_BASE_KEY)?.trim();
|
|
6
|
-
if (stored) return stored.replace(/\/$/, "");
|
|
7
|
-
if (typeof window !== "undefined") return window.location.origin;
|
|
8
|
-
return "";
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function getToken(): string | null {
|
|
12
|
-
return localStorage.getItem(TOKEN_KEY);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export async function apiFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {
|
|
16
|
-
const token = getToken();
|
|
17
|
-
const headers = new Headers(init?.headers);
|
|
18
|
-
if (token) headers.set("Authorization", `Bearer ${token}`);
|
|
19
|
-
|
|
20
|
-
const base = getApiBase();
|
|
21
|
-
const url =
|
|
22
|
-
typeof input === "string" && input.startsWith("/") ? `${base}${input}` : input;
|
|
23
|
-
|
|
24
|
-
const res = await fetch(url, { ...init, headers });
|
|
25
|
-
if (res.status === 401) {
|
|
26
|
-
localStorage.removeItem(TOKEN_KEY);
|
|
27
|
-
window.dispatchEvent(new CustomEvent("zhin:auth-required"));
|
|
28
|
-
}
|
|
29
|
-
return res;
|
|
30
|
-
}
|
package/dist/index.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import{useCallback as ta,useEffect as ua,useState as P}from"react";import{forwardRef as X,createElement as N}from"react";var S=(...a)=>a.filter((e,u,o)=>!!e&&e.trim()!==""&&o.indexOf(e)===u).join(" ").trim();var B=a=>a.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var M=a=>a.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,u,o)=>o?o.toUpperCase():u.toLowerCase());var k=a=>{let e=M(a);return e.charAt(0).toUpperCase()+e.slice(1)};import{forwardRef as z,createElement as R}from"react";var g={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var D=a=>{for(let e in a)if(e.startsWith("aria-")||e==="role"||e==="title")return!0;return!1};import{createContext as W,useContext as E,useMemo as na,createElement as pa}from"react";var V=W({});var F=()=>E(V);var T=z(({color:a,size:e,strokeWidth:u,absoluteStrokeWidth:o,className:s="",children:r,iconNode:i,...h},t)=>{let{size:c=24,strokeWidth:A=2,absoluteStrokeWidth:b=!1,color:U="currentColor",className:O=""}=F()??{},v=o??b?Number(u??A)*24/Number(e??c):u??A;return R("svg",{ref:t,...g,width:e??c??g.width,height:e??c??g.height,stroke:a??U,strokeWidth:v,className:S("lucide",O,s),...!r&&!D(h)&&{"aria-hidden":"true"},...h},[...i.map(([H,G])=>R(H,G)),...Array.isArray(r)?r:[r]])});var d=(a,e)=>{let u=X(({className:o,...s},r)=>N(T,{ref:r,iconNode:e,className:S(`lucide-${B(k(a))}`,`lucide-${a}`,o),...s}));return u.displayName=k(a),u};var K=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],p=d("activity",K);var Z=[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]],L=d("bot",Z);var Q=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],n=d("loader-circle",Q);var J=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],m=d("refresh-cw",J);var _=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],I=d("users",_);var j=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],x=d("wifi-off",j);var Y=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]],C=d("wifi",Y);var y="zhin_api_token",$="zhin_api_base";function aa(){let a=localStorage.getItem($)?.trim();return a?a.replace(/\/$/,""):typeof window<"u"?window.location.origin:""}function ea(){return localStorage.getItem(y)}async function q(a,e){let u=ea(),o=new Headers(e?.headers);u&&o.set("Authorization",`Bearer ${u}`);let s=aa(),r=typeof a=="string"&&a.startsWith("/")?`${s}${a}`:a,i=await fetch(r,{...e,headers:o});return i.status===401&&(localStorage.removeItem(y),window.dispatchEvent(new CustomEvent("zhin:auth-required"))),i}import{jsx as l,jsxs as f}from"react/jsx-runtime";function w(){let[a,e]=P([]),[u,o]=P(!0),[s,r]=P(null),i=ta(async()=>{o(!0),r(null);try{let t=await q("/api/napcat/endpoints"),c=await t.json();if(!t.ok||!c.success)throw new Error(c.message||"\u52A0\u8F7D\u5931\u8D25");e(Array.isArray(c.data)?c.data:[])}catch(t){r(t.message),e([])}finally{o(!1)}},[]);ua(()=>{i()},[i]);let h=t=>{switch(t){case"ws":return"\u6B63\u5411 WS";case"wss":return"\u53CD\u5411 WS";case"http":return"HTTP";default:return t}};return f("div",{className:"p-6 max-w-5xl mx-auto space-y-5",children:[f("div",{className:"flex items-center justify-between",children:[f("div",{children:[f("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[l(L,{className:"w-6 h-6"})," NapCat \u7BA1\u7406"]}),l("p",{className:"text-sm text-muted-foreground mt-1",children:"NapCatQQ \u673A\u5668\u4EBA\u6982\u89C8\uFF08OneBot11 + go-cqhttp + NapCat \u6269\u5C55\uFF09"})]}),f("button",{onClick:i,disabled:u,className:"flex items-center gap-1 px-3 py-1.5 rounded bg-blue-500 text-white hover:bg-blue-600 disabled:opacity-50 text-sm",children:[l(m,{className:`w-4 h-4 ${u?"animate-spin":""}`})," \u5237\u65B0"]})]}),s&&l("div",{className:"p-3 bg-red-50 text-red-600 rounded border border-red-200 text-sm dark:bg-red-900/20 dark:text-red-400 dark:border-red-800",children:s}),u?l("div",{className:"flex justify-center py-12",children:l(n,{className:"w-6 h-6 animate-spin text-blue-500"})}):a.length===0?l("div",{className:"text-center text-muted-foreground py-12",children:"\u6682\u65E0 NapCat Endpoint \u5B9E\u4F8B"}):l("div",{className:"grid gap-4 md:grid-cols-2",children:a.map(t=>f("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[f("div",{className:"flex items-center justify-between mb-3",children:[l("span",{className:"font-medium text-lg",children:t.name}),t.connected?f("span",{className:"flex items-center gap-1 text-green-600 text-sm",children:[l(C,{className:"w-4 h-4"})," \u5728\u7EBF"]}):f("span",{className:"flex items-center gap-1 text-gray-400 text-sm",children:[l(x,{className:"w-4 h-4"})," \u79BB\u7EBF"]})]}),f("div",{className:"space-y-2 text-sm text-muted-foreground",children:[f("div",{className:"flex items-center gap-1.5",children:[l(I,{className:"w-3.5 h-3.5"}),"\u7FA4 ",t.groupCount," \xB7 \u597D\u53CB ",t.friendCount]}),f("div",{className:"flex items-center gap-1.5",children:[l(p,{className:"w-3.5 h-3.5"}),"\u8FDE\u63A5\u65B9\u5F0F ",h(t.connection)," \xB7 ",t.status]})]})]},t.name))})]})}function te(a){a.addRoute({path:"/console/napcat",name:"NapCat\u7BA1\u7406",element:a.React.createElement(w,{hostReact:a.React})}),a.addTool({id:"napcat",name:"NapCat",path:"/console/napcat"})}export{te as register};
|
|
2
|
-
/*! Bundled license information:
|
|
3
|
-
|
|
4
|
-
lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs:
|
|
5
|
-
lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs:
|
|
6
|
-
lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs:
|
|
7
|
-
lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs:
|
|
8
|
-
lucide-react/dist/esm/defaultAttributes.mjs:
|
|
9
|
-
lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs:
|
|
10
|
-
lucide-react/dist/esm/context.mjs:
|
|
11
|
-
lucide-react/dist/esm/Icon.mjs:
|
|
12
|
-
lucide-react/dist/esm/createLucideIcon.mjs:
|
|
13
|
-
lucide-react/dist/esm/icons/activity.mjs:
|
|
14
|
-
lucide-react/dist/esm/icons/bot.mjs:
|
|
15
|
-
lucide-react/dist/esm/icons/loader-circle.mjs:
|
|
16
|
-
lucide-react/dist/esm/icons/refresh-cw.mjs:
|
|
17
|
-
lucide-react/dist/esm/icons/users.mjs:
|
|
18
|
-
lucide-react/dist/esm/icons/wifi-off.mjs:
|
|
19
|
-
lucide-react/dist/esm/icons/wifi.mjs:
|
|
20
|
-
lucide-react/dist/esm/lucide-react.mjs:
|
|
21
|
-
(**
|
|
22
|
-
* @license lucide-react v1.23.0 - ISC
|
|
23
|
-
*
|
|
24
|
-
* This source code is licensed under the ISC license.
|
|
25
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
26
|
-
*)
|
|
27
|
-
*/
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getEndpoint } from '../../src/napcat-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: 'AI 文字转语音,在群聊中发送 AI 语音消息。',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
group_id: z.number().describe('群号'),
|
|
9
|
-
character: z.string().describe('AI 语音角色 ID(可先用 napcat_get_ai_characters 查询)'),
|
|
10
|
-
text: z.string().describe('要转为语音的文字'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['napcat'],
|
|
13
|
-
tags: ['napcat', 'qq'],
|
|
14
|
-
keywords: ['AI语音', 'TTS', '文字转语音', 'ai record'],
|
|
15
|
-
scopes: ['group'],
|
|
16
|
-
async execute({ endpoint_id, group_id, character, text }) {
|
|
17
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
18
|
-
return endpoint.sendGroupAiRecord(group_id, character, text);
|
|
19
|
-
},
|
|
20
|
-
});
|
|
21
|
-
//# sourceMappingURL=ai_tts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai_tts.js","sourceRoot":"","sources":["../../../agent/tools/ai_tts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,eAAe,UAAU,CAA6E;IACpG,WAAW,EAAE,0BAA0B;IACvC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAC7E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;KACtC,CAAC;IACF,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC;IAC/C,MAAM,EAAE,CAAC,OAAO,CAAC;IACjB,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAA8E;QAClI,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getEndpoint } from '../../src/napcat-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '删除群公告。',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
group_id: z.number().describe('群号'),
|
|
9
|
-
notice_id: z.string().describe('公告 ID'),
|
|
10
|
-
}),
|
|
11
|
-
platforms: ['napcat'],
|
|
12
|
-
tags: ['napcat', 'qq'],
|
|
13
|
-
keywords: ['删除公告', 'delete notice'],
|
|
14
|
-
permissions: ['platform(napcat,scene_admin)'],
|
|
15
|
-
scopes: ['group'],
|
|
16
|
-
async execute({ endpoint_id, group_id, notice_id }) {
|
|
17
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
18
|
-
await endpoint.deleteGroupNotice(group_id, notice_id);
|
|
19
|
-
return { success: true };
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
//# sourceMappingURL=del_group_notice.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"del_group_notice.js","sourceRoot":"","sources":["../../../agent/tools/del_group_notice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,eAAe,UAAU,CAA+D;IACtF,WAAW,EAAE,QAAQ;IACrB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACxC,CAAC;IACF,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;IACnC,WAAW,EAAE,CAAC,8BAA8B,CAAC;IAC7C,MAAM,EAAE,CAAC,OAAO,CAAC;IACjB,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAgE;QAC9G,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getEndpoint } from '../../src/napcat-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '移除群精华消息。',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
message_id: z.number().describe('消息 ID'),
|
|
9
|
-
}),
|
|
10
|
-
platforms: ['napcat'],
|
|
11
|
-
tags: ['napcat', 'qq'],
|
|
12
|
-
keywords: ['取消精华', '移除精华', 'delete essence'],
|
|
13
|
-
permissions: ['platform(napcat,scene_admin)'],
|
|
14
|
-
scopes: ['group'],
|
|
15
|
-
async execute({ endpoint_id, message_id }) {
|
|
16
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
17
|
-
await endpoint.deleteEssenceMsg(message_id);
|
|
18
|
-
return { success: true };
|
|
19
|
-
},
|
|
20
|
-
});
|
|
21
|
-
//# sourceMappingURL=delete_essence_msg.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete_essence_msg.js","sourceRoot":"","sources":["../../../agent/tools/delete_essence_msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,eAAe,UAAU,CAA8C;IACrE,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACzC,CAAC;IACF,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC;IAC5C,WAAW,EAAE,CAAC,8BAA8B,CAAC;IAC7C,MAAM,EAAE,CAAC,OAAO,CAAC;IACjB,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,UAAU,EAA+C;QACpF,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getEndpoint } from '../../src/napcat-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '删除好友。',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
user_id: z.number().describe('好友 QQ 号'),
|
|
9
|
-
}),
|
|
10
|
-
platforms: ['napcat'],
|
|
11
|
-
tags: ['napcat', 'qq'],
|
|
12
|
-
keywords: ['删除好友', 'delete friend', '删好友'],
|
|
13
|
-
permissions: ['platform(napcat,scene_admin)'],
|
|
14
|
-
async execute({ endpoint_id, user_id }) {
|
|
15
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
16
|
-
await endpoint.deleteFriend(user_id);
|
|
17
|
-
return { success: true };
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
//# sourceMappingURL=delete_friend.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete_friend.js","sourceRoot":"","sources":["../../../agent/tools/delete_friend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,eAAe,UAAU,CAA2C;IAClE,WAAW,EAAE,OAAO;IACpB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;KACxC,CAAC;IACF,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC;IAC1C,WAAW,EAAE,CAAC,8BAA8B,CAAC;IAC7C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAA4C;QAC9E,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getEndpoint } from '../../src/napcat-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '下载文件到 NapCat 缓存目录,返回本地路径。',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
url: z.string().describe('文件 URL'),
|
|
9
|
-
thread_count: z.number().optional().describe('下载线程数(可选,默认 1)'),
|
|
10
|
-
}),
|
|
11
|
-
platforms: ['napcat'],
|
|
12
|
-
tags: ['napcat', 'qq'],
|
|
13
|
-
keywords: ['下载', 'download', '下载文件'],
|
|
14
|
-
async execute({ endpoint_id, url, thread_count }) {
|
|
15
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
16
|
-
return endpoint.downloadFile(url, thread_count || 1);
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
//# sourceMappingURL=download_file.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"download_file.js","sourceRoot":"","sources":["../../../agent/tools/download_file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,eAAe,UAAU,CAA8D;IACrF,WAAW,EAAE,2BAA2B;IACxC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAClC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;KAC/D,CAAC;IACF,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC;IACpC,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAA+D;QAC3G,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getEndpoint } from '../../src/napcat-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '转发单条消息到指定好友或群。',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
target_type: z.enum(['friend', 'group']).describe('friend 或 group'),
|
|
9
|
-
target_id: z.number().describe('目标好友 QQ 号或群号'),
|
|
10
|
-
message_id: z.number().describe('要转发的消息 ID'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['napcat'],
|
|
13
|
-
tags: ['napcat', 'qq'],
|
|
14
|
-
keywords: ['转发', 'forward', '单条转发'],
|
|
15
|
-
async execute({ endpoint_id, target_type, target_id, message_id }) {
|
|
16
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
17
|
-
if (target_type === 'friend')
|
|
18
|
-
await endpoint.forwardFriendSingleMsg(target_id, message_id);
|
|
19
|
-
else
|
|
20
|
-
await endpoint.forwardGroupSingleMsg(target_id, message_id);
|
|
21
|
-
return { success: true };
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
//# sourceMappingURL=forward_single_msg.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forward_single_msg.js","sourceRoot":"","sources":["../../../agent/tools/forward_single_msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,eAAe,UAAU,CAKtB;IACD,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACnE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC9C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;KAC7C,CAAC;IACF,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC;IACnC,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAK9D;QACC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,WAAW,KAAK,QAAQ;YAAE,MAAM,QAAQ,CAAC,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;;YACtF,MAAM,QAAQ,CAAC,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getEndpoint } from '../../src/napcat-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '获取 AI 语音角色列表,用于 napcat_ai_tts 的 character 参数。',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
group_id: z.number().describe('群号'),
|
|
9
|
-
}),
|
|
10
|
-
platforms: ['napcat'],
|
|
11
|
-
tags: ['napcat', 'qq'],
|
|
12
|
-
keywords: ['AI角色', 'ai characters', '语音角色'],
|
|
13
|
-
scopes: ['group'],
|
|
14
|
-
async execute({ endpoint_id, group_id }) {
|
|
15
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
16
|
-
return endpoint.getAiCharacters(group_id);
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
//# sourceMappingURL=get_ai_characters.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get_ai_characters.js","sourceRoot":"","sources":["../../../agent/tools/get_ai_characters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,eAAe,UAAU,CAA4C;IACnE,WAAW,EAAE,+CAA+C;IAC5D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;KACpC,CAAC;IACF,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC;IAC3C,MAAM,EAAE,CAAC,OAAO,CAAC;IACjB,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAA6C;QAChF,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getEndpoint } from '../../src/napcat-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '获取群精华消息列表。',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
group_id: z.number().describe('群号'),
|
|
9
|
-
}),
|
|
10
|
-
platforms: ['napcat'],
|
|
11
|
-
tags: ['napcat', 'qq'],
|
|
12
|
-
keywords: ['精华列表', 'essence list'],
|
|
13
|
-
scopes: ['group'],
|
|
14
|
-
async execute({ endpoint_id, group_id }) {
|
|
15
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
16
|
-
return endpoint.getEssenceMsgList(group_id);
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
//# sourceMappingURL=get_essence_list.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get_essence_list.js","sourceRoot":"","sources":["../../../agent/tools/get_essence_list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,eAAe,UAAU,CAA4C;IACnE,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;KACpC,CAAC;IACF,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC;IAClC,MAAM,EAAE,CAAC,OAAO,CAAC;IACjB,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAA6C;QAChF,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getEndpoint } from '../../src/napcat-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '获取私聊消息历史记录。',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
user_id: z.number().describe('QQ 号'),
|
|
9
|
-
message_seq: z.number().optional().describe('起始消息序号(可选)'),
|
|
10
|
-
count: z.number().optional().describe('获取条数(可选)'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['napcat'],
|
|
13
|
-
tags: ['napcat', 'qq'],
|
|
14
|
-
keywords: ['私聊记录', '好友聊天记录', 'friend history'],
|
|
15
|
-
async execute({ endpoint_id, user_id, message_seq, count }) {
|
|
16
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
17
|
-
return endpoint.getFriendMsgHistory(user_id, message_seq, count);
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
//# sourceMappingURL=get_friend_msg_history.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get_friend_msg_history.js","sourceRoot":"","sources":["../../../agent/tools/get_friend_msg_history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,eAAe,UAAU,CAAiF;IACxG,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACzD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;KAClD,CAAC;IACF,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC;IAC9C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAkF;QACxI,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IACrE,CAAC;CACF,CAAC,CAAC"}
|