@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.
Files changed (183) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +47 -98
  3. package/adapters/napcat.ts +39 -0
  4. package/agent/tools/ai_tts.ts +2 -2
  5. package/agent/tools/del_group_notice.ts +2 -2
  6. package/agent/tools/delete_essence_msg.ts +2 -2
  7. package/agent/tools/delete_friend.ts +2 -2
  8. package/agent/tools/download_file.ts +2 -2
  9. package/agent/tools/forward_single_msg.ts +2 -2
  10. package/agent/tools/get_ai_characters.ts +2 -2
  11. package/agent/tools/get_essence_list.ts +2 -2
  12. package/agent/tools/get_friend_msg_history.ts +2 -2
  13. package/agent/tools/get_group_file_url.ts +2 -2
  14. package/agent/tools/get_group_info_ex.ts +2 -2
  15. package/agent/tools/get_group_msg_history.ts +2 -2
  16. package/agent/tools/get_group_notice.ts +2 -2
  17. package/agent/tools/get_group_root_files.ts +2 -2
  18. package/agent/tools/get_group_shut_list.ts +2 -2
  19. package/agent/tools/get_mini_app_ark.ts +2 -2
  20. package/agent/tools/get_user_status.ts +2 -2
  21. package/agent/tools/group_sign.ts +2 -2
  22. package/agent/tools/mark_msg_as_read.ts +2 -2
  23. package/agent/tools/ocr_image.ts +2 -2
  24. package/agent/tools/send_forward_msg.ts +2 -2
  25. package/agent/tools/send_group_notice.ts +2 -2
  26. package/agent/tools/send_like.ts +2 -2
  27. package/agent/tools/send_poke.ts +2 -2
  28. package/agent/tools/set_avatar.ts +2 -2
  29. package/agent/tools/set_emoji_reaction.ts +2 -2
  30. package/agent/tools/set_essence_msg.ts +2 -2
  31. package/agent/tools/set_group_portrait.ts +2 -2
  32. package/agent/tools/set_online_status.ts +2 -2
  33. package/agent/tools/set_profile.ts +2 -2
  34. package/agent/tools/set_signature.ts +2 -2
  35. package/agent/tools/set_title.ts +2 -2
  36. package/agent/tools/translate.ts +2 -2
  37. package/agent/tools/upload_group_file.ts +2 -2
  38. package/lib/http-endpoint.d.ts +26 -0
  39. package/lib/http-endpoint.js +147 -0
  40. package/lib/index.d.ts +11 -0
  41. package/lib/index.js +10 -0
  42. package/lib/napcat-agent-deps.d.ts +51 -0
  43. package/lib/napcat-agent-deps.js +33 -0
  44. package/lib/napcat-inbound.d.ts +28 -0
  45. package/lib/{src/napcat-inbound.js → napcat-inbound.js} +28 -13
  46. package/lib/onebot-get-msg.d.ts +14 -0
  47. package/lib/{src/onebot-get-msg.js → onebot-get-msg.js} +0 -1
  48. package/lib/protocol.d.ts +151 -0
  49. package/lib/protocol.js +217 -0
  50. package/lib/webhook.d.ts +2 -0
  51. package/lib/webhook.js +14 -0
  52. package/lib/ws-endpoint.d.ts +61 -0
  53. package/lib/ws-endpoint.js +357 -0
  54. package/lib/ws-transport.d.ts +13 -0
  55. package/lib/ws-transport.js +75 -0
  56. package/lib/ws-types.d.ts +17 -0
  57. package/lib/ws-types.js +1 -0
  58. package/lib/wss-auth.d.ts +2 -0
  59. package/lib/wss-auth.js +16 -0
  60. package/lib/wss-endpoint.d.ts +25 -0
  61. package/lib/wss-endpoint.js +157 -0
  62. package/package.json +44 -33
  63. package/plugin.ts +13 -0
  64. package/schema.json +74 -0
  65. package/src/http-endpoint.ts +197 -0
  66. package/src/index.ts +66 -81
  67. package/src/napcat-agent-deps.ts +81 -15
  68. package/src/napcat-inbound.ts +34 -10
  69. package/src/onebot-get-msg.ts +8 -2
  70. package/src/protocol.ts +373 -0
  71. package/src/webhook.ts +16 -0
  72. package/src/ws-endpoint.ts +452 -0
  73. package/src/ws-transport.ts +105 -0
  74. package/src/ws-types.ts +20 -0
  75. package/src/wss-auth.ts +17 -0
  76. package/src/wss-endpoint.ts +205 -0
  77. package/client/NapCatManagement.tsx +0 -113
  78. package/client/index.tsx +0 -11
  79. package/client/tsconfig.json +0 -7
  80. package/client/utils/api.ts +0 -30
  81. package/dist/index.js +0 -27
  82. package/lib/agent/tools/ai_tts.js +0 -21
  83. package/lib/agent/tools/ai_tts.js.map +0 -1
  84. package/lib/agent/tools/del_group_notice.js +0 -22
  85. package/lib/agent/tools/del_group_notice.js.map +0 -1
  86. package/lib/agent/tools/delete_essence_msg.js +0 -21
  87. package/lib/agent/tools/delete_essence_msg.js.map +0 -1
  88. package/lib/agent/tools/delete_friend.js +0 -20
  89. package/lib/agent/tools/delete_friend.js.map +0 -1
  90. package/lib/agent/tools/download_file.js +0 -19
  91. package/lib/agent/tools/download_file.js.map +0 -1
  92. package/lib/agent/tools/forward_single_msg.js +0 -24
  93. package/lib/agent/tools/forward_single_msg.js.map +0 -1
  94. package/lib/agent/tools/get_ai_characters.js +0 -19
  95. package/lib/agent/tools/get_ai_characters.js.map +0 -1
  96. package/lib/agent/tools/get_essence_list.js +0 -19
  97. package/lib/agent/tools/get_essence_list.js.map +0 -1
  98. package/lib/agent/tools/get_friend_msg_history.js +0 -20
  99. package/lib/agent/tools/get_friend_msg_history.js.map +0 -1
  100. package/lib/agent/tools/get_group_file_url.js +0 -21
  101. package/lib/agent/tools/get_group_file_url.js.map +0 -1
  102. package/lib/agent/tools/get_group_info_ex.js +0 -19
  103. package/lib/agent/tools/get_group_info_ex.js.map +0 -1
  104. package/lib/agent/tools/get_group_msg_history.js +0 -21
  105. package/lib/agent/tools/get_group_msg_history.js.map +0 -1
  106. package/lib/agent/tools/get_group_notice.js +0 -19
  107. package/lib/agent/tools/get_group_notice.js.map +0 -1
  108. package/lib/agent/tools/get_group_root_files.js +0 -19
  109. package/lib/agent/tools/get_group_root_files.js.map +0 -1
  110. package/lib/agent/tools/get_group_shut_list.js +0 -19
  111. package/lib/agent/tools/get_group_shut_list.js.map +0 -1
  112. package/lib/agent/tools/get_mini_app_ark.js +0 -22
  113. package/lib/agent/tools/get_mini_app_ark.js.map +0 -1
  114. package/lib/agent/tools/get_user_status.js +0 -18
  115. package/lib/agent/tools/get_user_status.js.map +0 -1
  116. package/lib/agent/tools/group_sign.js +0 -20
  117. package/lib/agent/tools/group_sign.js.map +0 -1
  118. package/lib/agent/tools/mark_msg_as_read.js +0 -19
  119. package/lib/agent/tools/mark_msg_as_read.js.map +0 -1
  120. package/lib/agent/tools/ocr_image.js +0 -18
  121. package/lib/agent/tools/ocr_image.js.map +0 -1
  122. package/lib/agent/tools/send_forward_msg.js +0 -21
  123. package/lib/agent/tools/send_forward_msg.js.map +0 -1
  124. package/lib/agent/tools/send_group_notice.js +0 -23
  125. package/lib/agent/tools/send_group_notice.js.map +0 -1
  126. package/lib/agent/tools/send_like.js +0 -20
  127. package/lib/agent/tools/send_like.js.map +0 -1
  128. package/lib/agent/tools/send_poke.js +0 -20
  129. package/lib/agent/tools/send_poke.js.map +0 -1
  130. package/lib/agent/tools/set_avatar.js +0 -19
  131. package/lib/agent/tools/set_avatar.js.map +0 -1
  132. package/lib/agent/tools/set_emoji_reaction.js +0 -20
  133. package/lib/agent/tools/set_emoji_reaction.js.map +0 -1
  134. package/lib/agent/tools/set_essence_msg.js +0 -21
  135. package/lib/agent/tools/set_essence_msg.js.map +0 -1
  136. package/lib/agent/tools/set_group_portrait.js +0 -22
  137. package/lib/agent/tools/set_group_portrait.js.map +0 -1
  138. package/lib/agent/tools/set_online_status.js +0 -20
  139. package/lib/agent/tools/set_online_status.js.map +0 -1
  140. package/lib/agent/tools/set_profile.js +0 -23
  141. package/lib/agent/tools/set_profile.js.map +0 -1
  142. package/lib/agent/tools/set_signature.js +0 -19
  143. package/lib/agent/tools/set_signature.js.map +0 -1
  144. package/lib/agent/tools/set_title.js +0 -23
  145. package/lib/agent/tools/set_title.js.map +0 -1
  146. package/lib/agent/tools/translate.js +0 -18
  147. package/lib/agent/tools/translate.js.map +0 -1
  148. package/lib/agent/tools/upload_group_file.js +0 -23
  149. package/lib/agent/tools/upload_group_file.js.map +0 -1
  150. package/lib/src/adapter.js +0 -102
  151. package/lib/src/adapter.js.map +0 -1
  152. package/lib/src/agent-prompt.js +0 -106
  153. package/lib/src/agent-prompt.js.map +0 -1
  154. package/lib/src/endpoint-base.js +0 -315
  155. package/lib/src/endpoint-base.js.map +0 -1
  156. package/lib/src/endpoint-http.js +0 -106
  157. package/lib/src/endpoint-http.js.map +0 -1
  158. package/lib/src/endpoint-ws-client.js +0 -139
  159. package/lib/src/endpoint-ws-client.js.map +0 -1
  160. package/lib/src/endpoint-ws-server.js +0 -137
  161. package/lib/src/endpoint-ws-server.js.map +0 -1
  162. package/lib/src/index.js +0 -58
  163. package/lib/src/index.js.map +0 -1
  164. package/lib/src/napcat-agent-deps.js +0 -19
  165. package/lib/src/napcat-agent-deps.js.map +0 -1
  166. package/lib/src/napcat-inbound.js.map +0 -1
  167. package/lib/src/onebot-get-msg.js.map +0 -1
  168. package/lib/src/routes.js +0 -61
  169. package/lib/src/routes.js.map +0 -1
  170. package/lib/src/segment-mapper.js +0 -2
  171. package/lib/src/segment-mapper.js.map +0 -1
  172. package/lib/src/types.js +0 -6
  173. package/lib/src/types.js.map +0 -1
  174. package/plugin.yml +0 -3
  175. package/src/adapter.ts +0 -109
  176. package/src/agent-prompt.ts +0 -115
  177. package/src/endpoint-base.ts +0 -362
  178. package/src/endpoint-http.ts +0 -95
  179. package/src/endpoint-ws-client.ts +0 -137
  180. package/src/endpoint-ws-server.ts +0 -136
  181. package/src/routes.ts +0 -61
  182. package/src/segment-mapper.ts +0 -1
  183. 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
- }
@@ -1,7 +0,0 @@
1
- {
2
- "extends": "../node_modules/@zhin.js/host-api/browser.tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "../dist"
5
- },
6
- "include": ["./**/*"]
7
- }
@@ -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"}