@zhin.js/adapter-napcat 1.0.1 → 1.1.2

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 (202) hide show
  1. package/CHANGELOG.md +757 -0
  2. package/{skills/napcat/PERMITS.md → PERMITS.md} +3 -3
  3. package/README.md +63 -95
  4. package/adapters/napcat/index.js +47 -0
  5. package/adapters/napcat/index.ts +64 -0
  6. package/agents/napcat/agent.json +20 -0
  7. package/agents/napcat/boundaries.md +3 -0
  8. package/agents/napcat/conventions.md +3 -0
  9. package/agents/napcat/skills/napcat-account/SKILL.md +25 -0
  10. package/agents/napcat/skills/napcat-account/tools/delete_friend/index.js +18 -0
  11. package/agents/napcat/skills/napcat-account/tools/delete_friend/index.ts +18 -0
  12. package/agents/napcat/skills/napcat-account/tools/get_user_status/index.js +16 -0
  13. package/agents/napcat/skills/napcat-account/tools/get_user_status/index.ts +16 -0
  14. package/agents/napcat/skills/napcat-account/tools/send_like/index.js +18 -0
  15. package/agents/napcat/skills/napcat-account/tools/send_like/index.ts +18 -0
  16. package/agents/napcat/skills/napcat-account/tools/set_avatar/index.js +17 -0
  17. package/agents/napcat/skills/napcat-account/tools/set_avatar/index.ts +17 -0
  18. package/agents/napcat/skills/napcat-account/tools/set_online_status/index.js +18 -0
  19. package/agents/napcat/skills/napcat-account/tools/set_online_status/index.ts +18 -0
  20. package/agents/napcat/skills/napcat-account/tools/set_profile/index.js +21 -0
  21. package/agents/napcat/skills/napcat-account/tools/set_profile/index.ts +21 -0
  22. package/agents/napcat/skills/napcat-account/tools/set_signature/index.js +17 -0
  23. package/agents/napcat/skills/napcat-account/tools/set_signature/index.ts +17 -0
  24. package/agents/napcat/skills/napcat-files-history/SKILL.md +22 -0
  25. package/agents/napcat/skills/napcat-files-history/tools/download_file/index.js +17 -0
  26. package/agents/napcat/skills/napcat-files-history/tools/download_file/index.ts +17 -0
  27. package/agents/napcat/skills/napcat-files-history/tools/get_friend_msg_history/index.js +18 -0
  28. package/agents/napcat/skills/napcat-files-history/tools/get_friend_msg_history/index.ts +18 -0
  29. package/agents/napcat/skills/napcat-files-history/tools/get_group_file_url/index.js +19 -0
  30. package/agents/napcat/skills/napcat-files-history/tools/get_group_file_url/index.ts +19 -0
  31. package/agents/napcat/skills/napcat-files-history/tools/get_group_msg_history/index.js +19 -0
  32. package/agents/napcat/skills/napcat-files-history/tools/get_group_msg_history/index.ts +19 -0
  33. package/agents/napcat/skills/napcat-files-history/tools/get_group_root_files/index.js +17 -0
  34. package/agents/napcat/skills/napcat-files-history/tools/get_group_root_files/index.ts +17 -0
  35. package/agents/napcat/skills/napcat-files-history/tools/upload_group_file/index.js +21 -0
  36. package/agents/napcat/skills/napcat-files-history/tools/upload_group_file/index.ts +21 -0
  37. package/agents/napcat/skills/napcat-group-content/SKILL.md +21 -0
  38. package/agents/napcat/skills/napcat-group-content/tools/del_group_notice/index.js +20 -0
  39. package/agents/napcat/skills/napcat-group-content/tools/del_group_notice/index.ts +20 -0
  40. package/agents/napcat/skills/napcat-group-content/tools/delete_essence_msg/index.js +19 -0
  41. package/agents/napcat/skills/napcat-group-content/tools/delete_essence_msg/index.ts +19 -0
  42. package/agents/napcat/skills/napcat-group-content/tools/get_essence_list/index.js +17 -0
  43. package/agents/napcat/skills/napcat-group-content/tools/get_essence_list/index.ts +17 -0
  44. package/agents/napcat/skills/napcat-group-content/tools/get_group_notice/index.js +17 -0
  45. package/agents/napcat/skills/napcat-group-content/tools/get_group_notice/index.ts +17 -0
  46. package/agents/napcat/skills/napcat-group-content/tools/send_group_notice/index.js +21 -0
  47. package/agents/napcat/skills/napcat-group-content/tools/send_group_notice/index.ts +21 -0
  48. package/agents/napcat/skills/napcat-group-content/tools/set_essence_msg/index.js +19 -0
  49. package/agents/napcat/skills/napcat-group-content/tools/set_essence_msg/index.ts +19 -0
  50. package/agents/napcat/skills/napcat-group-settings/SKILL.md +23 -0
  51. package/agents/napcat/skills/napcat-group-settings/tools/get_group_info_ex/index.js +17 -0
  52. package/agents/napcat/skills/napcat-group-settings/tools/get_group_info_ex/index.ts +17 -0
  53. package/agents/napcat/skills/napcat-group-settings/tools/get_group_shut_list/index.js +17 -0
  54. package/agents/napcat/skills/napcat-group-settings/tools/get_group_shut_list/index.ts +17 -0
  55. package/agents/napcat/skills/napcat-group-settings/tools/group_sign/index.js +18 -0
  56. package/agents/napcat/skills/napcat-group-settings/tools/group_sign/index.ts +18 -0
  57. package/agents/napcat/skills/napcat-group-settings/tools/set_group_portrait/index.js +20 -0
  58. package/agents/napcat/skills/napcat-group-settings/tools/set_group_portrait/index.ts +20 -0
  59. package/agents/napcat/skills/napcat-group-settings/tools/set_title/index.js +21 -0
  60. package/agents/napcat/skills/napcat-group-settings/tools/set_title/index.ts +21 -0
  61. package/agents/napcat/skills/napcat-media/SKILL.md +23 -0
  62. package/agents/napcat/skills/napcat-media/tools/ai_tts/index.js +19 -0
  63. package/agents/napcat/skills/napcat-media/tools/ai_tts/index.ts +19 -0
  64. package/agents/napcat/skills/napcat-media/tools/get_ai_characters/index.js +17 -0
  65. package/agents/napcat/skills/napcat-media/tools/get_ai_characters/index.ts +17 -0
  66. package/agents/napcat/skills/napcat-media/tools/get_mini_app_ark/index.js +20 -0
  67. package/agents/napcat/skills/napcat-media/tools/get_mini_app_ark/index.ts +20 -0
  68. package/agents/napcat/skills/napcat-media/tools/ocr_image/index.js +16 -0
  69. package/agents/napcat/skills/napcat-media/tools/ocr_image/index.ts +16 -0
  70. package/agents/napcat/skills/napcat-media/tools/translate/index.js +16 -0
  71. package/agents/napcat/skills/napcat-media/tools/translate/index.ts +16 -0
  72. package/agents/napcat/skills/napcat-messaging/SKILL.md +22 -0
  73. package/agents/napcat/skills/napcat-messaging/tools/forward_single_msg/index.js +22 -0
  74. package/agents/napcat/skills/napcat-messaging/tools/forward_single_msg/index.ts +28 -0
  75. package/agents/napcat/skills/napcat-messaging/tools/mark_msg_as_read/index.js +17 -0
  76. package/agents/napcat/skills/napcat-messaging/tools/mark_msg_as_read/index.ts +17 -0
  77. package/agents/napcat/skills/napcat-messaging/tools/send_forward_msg/index.js +19 -0
  78. package/agents/napcat/skills/napcat-messaging/tools/send_forward_msg/index.ts +27 -0
  79. package/agents/napcat/skills/napcat-messaging/tools/send_poke/index.js +18 -0
  80. package/agents/napcat/skills/napcat-messaging/tools/send_poke/index.ts +18 -0
  81. package/agents/napcat/skills/napcat-messaging/tools/set_emoji_reaction/index.js +18 -0
  82. package/agents/napcat/skills/napcat-messaging/tools/set_emoji_reaction/index.ts +18 -0
  83. package/agents/napcat/system.md +3 -0
  84. package/commands/napcat/endpoint/add/[id]/index.js +3 -0
  85. package/commands/napcat/endpoint/add/[id]/index.ts +3 -0
  86. package/commands/napcat/endpoint/definition.js +29 -0
  87. package/commands/napcat/endpoint/definition.ts +26 -0
  88. package/commands/napcat/endpoint/list/index.js +3 -0
  89. package/commands/napcat/endpoint/list/index.ts +3 -0
  90. package/commands/napcat/endpoint/remove/[id]/index.js +3 -0
  91. package/commands/napcat/endpoint/remove/[id]/index.ts +3 -0
  92. package/lib/client.d.ts +52 -0
  93. package/lib/client.js +62 -0
  94. package/lib/endpoint-management.d.ts +15 -0
  95. package/lib/endpoint-management.js +47 -0
  96. package/lib/http-endpoint.d.ts +27 -0
  97. package/lib/http-endpoint.js +177 -0
  98. package/lib/index.d.ts +11 -22
  99. package/lib/index.js +10 -59
  100. package/lib/napcat-inbound.d.ts +12 -5
  101. package/lib/napcat-inbound.js +28 -13
  102. package/lib/napcat-runtime-state.d.ts +1 -0
  103. package/lib/napcat-runtime-state.js +6 -0
  104. package/lib/onebot-get-msg.d.ts +16 -3
  105. package/lib/onebot-get-msg.js +53 -1
  106. package/lib/protocol.d.ts +147 -0
  107. package/lib/protocol.js +318 -0
  108. package/lib/side-event-dispatch.d.ts +7 -0
  109. package/lib/side-event-dispatch.js +36 -0
  110. package/lib/webhook.d.ts +2 -0
  111. package/lib/webhook.js +14 -0
  112. package/lib/ws-endpoint.d.ts +27 -0
  113. package/lib/ws-endpoint.js +241 -0
  114. package/lib/ws-transport.d.ts +13 -0
  115. package/lib/ws-transport.js +75 -0
  116. package/lib/ws-types.d.ts +17 -0
  117. package/lib/ws-types.js +1 -0
  118. package/lib/wss-auth.d.ts +2 -0
  119. package/lib/wss-auth.js +16 -0
  120. package/lib/wss-endpoint.d.ts +29 -0
  121. package/lib/wss-endpoint.js +196 -0
  122. package/package.json +76 -34
  123. package/plugin.js +18 -0
  124. package/schema.json +131 -0
  125. package/src/client.ts +79 -0
  126. package/src/endpoint-management.ts +72 -0
  127. package/src/http-endpoint.ts +234 -0
  128. package/src/index.ts +62 -87
  129. package/src/napcat-inbound.ts +34 -10
  130. package/src/napcat-runtime-state.ts +7 -0
  131. package/src/onebot-get-msg.ts +69 -5
  132. package/src/protocol.ts +465 -0
  133. package/src/side-event-dispatch.ts +48 -0
  134. package/src/webhook.ts +16 -0
  135. package/src/ws-endpoint.ts +301 -0
  136. package/src/ws-transport.ts +105 -0
  137. package/src/ws-types.ts +20 -0
  138. package/src/wss-auth.ts +17 -0
  139. package/src/wss-endpoint.ts +247 -0
  140. package/client/NapCatManagement.tsx +0 -113
  141. package/client/index.tsx +0 -11
  142. package/client/tsconfig.json +0 -7
  143. package/client/utils/api.ts +0 -30
  144. package/dist/index.js +0 -27
  145. package/lib/adapter.d.ts +0 -28
  146. package/lib/adapter.d.ts.map +0 -1
  147. package/lib/adapter.js +0 -94
  148. package/lib/adapter.js.map +0 -1
  149. package/lib/agent-prompt.d.ts +0 -3
  150. package/lib/agent-prompt.d.ts.map +0 -1
  151. package/lib/agent-prompt.js +0 -105
  152. package/lib/agent-prompt.js.map +0 -1
  153. package/lib/endpoint-base.d.ts +0 -143
  154. package/lib/endpoint-base.d.ts.map +0 -1
  155. package/lib/endpoint-base.js +0 -334
  156. package/lib/endpoint-base.js.map +0 -1
  157. package/lib/endpoint-http.d.ts +0 -18
  158. package/lib/endpoint-http.d.ts.map +0 -1
  159. package/lib/endpoint-http.js +0 -119
  160. package/lib/endpoint-http.js.map +0 -1
  161. package/lib/endpoint-ws-client.d.ts +0 -21
  162. package/lib/endpoint-ws-client.d.ts.map +0 -1
  163. package/lib/endpoint-ws-client.js +0 -165
  164. package/lib/endpoint-ws-client.js.map +0 -1
  165. package/lib/endpoint-ws-server.d.ts +0 -21
  166. package/lib/endpoint-ws-server.d.ts.map +0 -1
  167. package/lib/endpoint-ws-server.js +0 -150
  168. package/lib/endpoint-ws-server.js.map +0 -1
  169. package/lib/index.d.ts.map +0 -1
  170. package/lib/index.js.map +0 -1
  171. package/lib/napcat-inbound.d.ts.map +0 -1
  172. package/lib/napcat-inbound.js.map +0 -1
  173. package/lib/onebot-get-msg.d.ts.map +0 -1
  174. package/lib/onebot-get-msg.js.map +0 -1
  175. package/lib/routes.d.ts +0 -4
  176. package/lib/routes.d.ts.map +0 -1
  177. package/lib/routes.js +0 -61
  178. package/lib/routes.js.map +0 -1
  179. package/lib/tools.d.ts +0 -8
  180. package/lib/tools.d.ts.map +0 -1
  181. package/lib/tools.js +0 -605
  182. package/lib/tools.js.map +0 -1
  183. package/lib/types.d.ts +0 -293
  184. package/lib/types.d.ts.map +0 -1
  185. package/lib/types.js +0 -6
  186. package/lib/types.js.map +0 -1
  187. package/lib/typing-indicator.d.ts +0 -45
  188. package/lib/typing-indicator.d.ts.map +0 -1
  189. package/lib/typing-indicator.js +0 -132
  190. package/lib/typing-indicator.js.map +0 -1
  191. package/plugin.yml +0 -3
  192. package/skills/napcat/SKILL.md +0 -311
  193. package/src/adapter.ts +0 -101
  194. package/src/agent-prompt.ts +0 -114
  195. package/src/endpoint-base.ts +0 -376
  196. package/src/endpoint-http.ts +0 -109
  197. package/src/endpoint-ws-client.ts +0 -164
  198. package/src/endpoint-ws-server.ts +0 -150
  199. package/src/routes.ts +0 -61
  200. package/src/tools.ts +0 -632
  201. package/src/types.ts +0 -279
  202. package/src/typing-indicator.ts +0 -184
@@ -1,150 +0,0 @@
1
- /**
2
- * NapCat 反向 WebSocket 连接
3
- */
4
- import WebSocket, { WebSocketServer } from 'ws';
5
- import { formatCompact } from 'zhin.js';
6
- import type { IncomingMessage } from 'http';
7
- import { NapCatEndpointBase } from './endpoint-base.js';
8
- import type { NapCatWsServerConfig, ApiResponse } from './types.js';
9
- import type { NapCatAdapter } from './adapter.js';
10
- import type { Router } from '@zhin.js/host-router';
11
- import { enableTypingIndicator } from './typing-indicator.js';
12
-
13
- export class NapCatWsServer extends NapCatEndpointBase {
14
- #wss?: WebSocketServer;
15
- #clientMap = new Map<string, WebSocket>();
16
- private heartbeatTimer?: NodeJS.Timeout;
17
- private requestId = 0;
18
- private pendingRequests = new Map<string, {
19
- resolve: (value: any) => void;
20
- reject: (error: Error) => void;
21
- timeout: NodeJS.Timeout;
22
- }>();
23
-
24
- declare $config: NapCatWsServerConfig;
25
-
26
- constructor(adapter: NapCatAdapter, public router: Router, config: NapCatWsServerConfig) {
27
- super(adapter, config);
28
- }
29
-
30
- async $connect(): Promise<void> {
31
- if (!this.$config.access_token) {
32
- this.logger.warn(formatCompact({ endpoint: this.$id, ok: false, error: 'missing access_token' }));
33
- }
34
- this.#wss = this.router.ws(this.$config.path, {
35
- verifyClient: (info: { origin: string; secure: boolean; req: IncomingMessage }) => {
36
- const authorization = info.req.headers['authorization'] || '';
37
- if (this.$config.access_token && authorization !== `Bearer ${this.$config.access_token}`) {
38
- this.logger.error(`[${this.$id}] auth failed`);
39
- return false;
40
- }
41
- return true;
42
- },
43
- });
44
- this.logger.info(formatCompact( { op: 'listen', endpoint: this.$id, mode: 'wss', path: this.$config.path }));
45
-
46
- this.#wss.on('connection', (client, req) => {
47
- this.startHeartbeat();
48
- this.logger.info(formatCompact({ endpoint: this.$id, peer: req.socket.remoteAddress }));
49
-
50
- client.on('error', (err) => this.logger.warn(formatCompact( {
51
- op: 'ws_error',
52
- endpoint: this.$id,
53
- ok: false,
54
- error: err instanceof Error ? err.message : String(err),
55
- })));
56
- client.on('close', (code, reason) => {
57
- const reasonStr = reason?.toString?.() || '';
58
- this.logger.warn(formatCompact( {
59
- op: 'disconnect',
60
- endpoint: this.$id,
61
- code,
62
- error: reasonStr || undefined,
63
- }));
64
- for (const [key, val] of this.#clientMap) {
65
- if (val === client) this.#clientMap.delete(key);
66
- }
67
- if (this.#clientMap.size === 0) this.$connected = false;
68
- });
69
- client.on('message', (data) => {
70
- try { this.handleWsMessage(client, JSON.parse(data.toString())); } catch (e) { this.emit('error', e); }
71
- });
72
- });
73
- }
74
-
75
- async $disconnect(): Promise<void> {
76
- this.#wss?.close();
77
- if (this.heartbeatTimer) { clearInterval(this.heartbeatTimer); this.heartbeatTimer = undefined; }
78
- for (const [, req] of this.pendingRequests) { clearTimeout(req.timeout); req.reject(new Error('Connection closed')); }
79
- this.pendingRequests.clear();
80
- this.inboundDeduper.clear();
81
- this.$connected = false;
82
- }
83
-
84
- async callApi<T = any>(action: string, params: Record<string, any> = {}): Promise<T> {
85
- const selfId = this.getFirstSelfId();
86
- const client = this.#clientMap.get(selfId);
87
- if (!client || client.readyState !== WebSocket.OPEN) throw new Error('WebSocket is not connected');
88
- const echo = `req_${++this.requestId}`;
89
- return new Promise((resolve, reject) => {
90
- const timeout = setTimeout(() => { this.pendingRequests.delete(echo); reject(new Error(`API call timeout: ${action}`)); }, 30000);
91
- this.pendingRequests.set(echo, { resolve, reject, timeout });
92
- client.send(JSON.stringify({ action, params, echo }));
93
- });
94
- }
95
-
96
- private getFirstSelfId(): string {
97
- const first = this.#clientMap.keys().next().value;
98
- if (!first) throw new Error('No NapCat client connected to reverse WS');
99
- return first;
100
- }
101
-
102
- private handleWsMessage(client: WebSocket, message: any): void {
103
- if (message.self_id != null) {
104
- const selfIdStr = String(message.self_id);
105
- if (!this.#clientMap.has(selfIdStr) || this.#clientMap.get(selfIdStr) !== client) {
106
- this.#clientMap.set(selfIdStr, client);
107
- if (!this.$connected) this.$connected = true;
108
- }
109
- }
110
- if (message.echo && this.pendingRequests.has(message.echo)) {
111
- const req = this.pendingRequests.get(message.echo)!;
112
- this.pendingRequests.delete(message.echo);
113
- clearTimeout(req.timeout);
114
- const resp = message as ApiResponse;
115
- if (resp.status === 'ok') return req.resolve(resp.data);
116
- return req.reject(new Error(`API error [${resp.retcode}]: ${resp.message || resp.wording || 'unknown'}`));
117
- }
118
-
119
- if (message.post_type === 'meta_event' && message.sub_type === 'connect') {
120
- this.#clientMap.set(String(message.self_id), client);
121
- this.$connected = true;
122
- this.logger.info(formatCompact({ endpoint: this.$id, self_id: message.self_id }));
123
- this.initTypingIndicator();
124
- return;
125
- }
126
- this.dispatchEvent(message);
127
- }
128
-
129
- private startHeartbeat(): void {
130
- if (this.heartbeatTimer) return;
131
- const interval = this.$config.heartbeat_interval || 30000;
132
- this.heartbeatTimer = setInterval(() => {
133
- for (const client of this.#wss?.clients || []) {
134
- if (client.readyState === WebSocket.OPEN) client.ping();
135
- }
136
- }, interval);
137
- }
138
-
139
- private initTypingIndicator(): void {
140
- const tiConfig = (this.$config as any).typingIndicator;
141
- if (tiConfig && tiConfig.enabled !== false) {
142
- enableTypingIndicator(this, {
143
- enabled: true,
144
- defaultEmoji: tiConfig.defaultEmoji || '128516',
145
- autoRemove: true,
146
- removeDelay: 5000,
147
- });
148
- }
149
- }
150
- }
package/src/routes.ts DELETED
@@ -1,61 +0,0 @@
1
- import type { Router } from '@zhin.js/host-router';
2
- import type { NapCatAdapter } from './adapter.js';
3
-
4
- export function registerRoutes(router: Router, napcat: NapCatAdapter): void {
5
- router.get('/api/napcat/endpoints', async (ctx) => {
6
- try {
7
- const endpoints = Array.from(napcat.endpoints.values());
8
- if (endpoints.length === 0) {
9
- ctx.body = { success: true, data: [], message: '暂无 NapCat Endpoint 实例' };
10
- return;
11
- }
12
- const result = await Promise.all(
13
- endpoints.map(async (endpoint) => {
14
- try {
15
- const connection = (endpoint.$config as any).connection ?? 'ws';
16
- const base: Record<string, unknown> = {
17
- name: endpoint.$config.name,
18
- connected: endpoint.$connected || false,
19
- connection,
20
- status: endpoint.$connected ? 'online' : 'offline',
21
- lastActivity: new Date().toISOString(),
22
- };
23
- if (endpoint.$connected) {
24
- try {
25
- const friends = await endpoint.getFriendList();
26
- const groups = await endpoint.getGroupList();
27
- base.friendCount = Array.isArray(friends) ? friends.length : 0;
28
- base.groupCount = Array.isArray(groups) ? groups.length : 0;
29
- } catch {
30
- base.friendCount = 0;
31
- base.groupCount = 0;
32
- }
33
- } else {
34
- base.friendCount = 0;
35
- base.groupCount = 0;
36
- }
37
- return base;
38
- } catch {
39
- return {
40
- name: endpoint.$config.name,
41
- connected: false,
42
- connection: 'unknown',
43
- status: 'error',
44
- friendCount: 0,
45
- groupCount: 0,
46
- };
47
- }
48
- }),
49
- );
50
- ctx.body = { success: true, data: result, timestamp: new Date().toISOString() };
51
- } catch (error) {
52
- ctx.status = 500;
53
- ctx.body = {
54
- success: false,
55
- error: 'NAPCAT_API_ERROR',
56
- message: '获取 Endpoint 数据失败',
57
- details: process.env.NODE_ENV === 'development' ? (error as Error).message : undefined,
58
- };
59
- }
60
- });
61
- }