@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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zhin.js/adapter-napcat",
3
- "version": "1.0.1",
4
- "description": "Zhin.js adapter for NapCatQQ (OneBot11 superset with go-cqhttp & NapCat extensions)",
3
+ "version": "1.1.2",
4
+ "description": "Zhin.js NapCat adapter for Plugin Runtime (WebSocket client, OneBot11 + NapCat extensions)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
7
7
  "types": "./lib/index.d.ts",
@@ -13,14 +13,17 @@
13
13
  }
14
14
  },
15
15
  "files": [
16
+ "adapters",
17
+ "commands",
18
+ "plugin.js",
19
+ "schema.json",
16
20
  "src",
17
21
  "lib",
18
- "client",
19
- "dist",
20
- "skills",
21
- "plugin.yml",
22
+ "tools",
23
+ "agents",
22
24
  "README.md",
23
- "CHANGELOG.md"
25
+ "CHANGELOG.md",
26
+ "PERMITS.md"
24
27
  ],
25
28
  "keywords": [
26
29
  "zhin",
@@ -34,58 +37,97 @@
34
37
  "qq",
35
38
  "chatbot"
36
39
  ],
37
- "author": {
38
- "name": "lc-cn",
39
- "email": "admin@liucl.cn",
40
- "url": "https://github.com/lc-cn"
41
- },
42
40
  "license": "MIT",
43
41
  "repository": {
44
- "url": "git+https://github.com/zhinjs/zhin.git",
45
42
  "type": "git",
43
+ "url": "https://github.com/zhinjs/zhin",
46
44
  "directory": "plugins/adapters/napcat"
47
45
  },
48
46
  "dependencies": {
49
- "ws": "^8.21.0"
47
+ "ws": "^8.21.1",
48
+ "@zhin.js/adapter": "1.1.14",
49
+ "@zhin.js/agent-feature": "1.1.1",
50
+ "@zhin.js/core": "1.1.37",
51
+ "@zhin.js/feature-kit": "1.1.1",
52
+ "@zhin.js/host-http": "1.1.1",
53
+ "@zhin.js/im-contract": "1.1.1",
54
+ "@zhin.js/logger": "1.1.1",
55
+ "@zhin.js/permission": "1.1.1",
56
+ "@zhin.js/skill": "1.1.1",
57
+ "@zhin.js/tool": "1.1.1"
50
58
  },
51
59
  "devDependencies": {
52
- "@types/node": "^25.9.2",
53
- "@types/react": "^19.2.15",
54
- "@types/react-dom": "^19.2.3",
60
+ "@types/node": "^26.1.2",
55
61
  "@types/ws": "^8.18.1",
56
- "lucide-react": "^1.17.0",
57
62
  "typescript": "^6.0.3",
58
- "@zhin.js/agent": "0.2.1",
59
- "@zhin.js/cli": "1.0.89",
60
- "@zhin.js/contract": "1.0.1",
61
- "@zhin.js/host-api": "1.0.1",
62
- "@zhin.js/host-router": "1.0.1",
63
- "zhin.js": "2.0.1"
63
+ "vitest": "^4.1.10",
64
+ "zod": "^4.4.3",
65
+ "@zhin.js/host-http": "1.1.1",
66
+ "zhin.js": "1.1.2"
64
67
  },
65
68
  "peerDependencies": {
66
- "@zhin.js/agent": "0.2.1",
67
- "@zhin.js/host-api": "1.0.1",
68
- "@zhin.js/contract": "1.0.1",
69
- "@zhin.js/host-router": "1.0.1",
70
- "zhin.js": "2.0.1"
69
+ "zod": "^4.0.0",
70
+ "@zhin.js/adapter": "^1.1.14",
71
+ "@zhin.js/command": "^1.1.1",
72
+ "@zhin.js/core": "^1.1.37",
73
+ "zhin.js": "^1.1.2"
71
74
  },
72
75
  "peerDependenciesMeta": {
73
- "@zhin.js/agent": {
76
+ "@zhin.js/command": {
74
77
  "optional": true
75
78
  },
76
- "@zhin.js/host-api": {
79
+ "zhin.js": {
77
80
  "optional": true
78
81
  },
79
- "@zhin.js/host-router": {
82
+ "zod": {
80
83
  "optional": true
81
84
  }
82
85
  },
86
+ "author": {
87
+ "name": "lc-cn",
88
+ "email": "admin@liucl.cn",
89
+ "url": "https://github.com/lc-cn"
90
+ },
83
91
  "publishConfig": {
84
92
  "access": "public",
85
93
  "registry": "https://registry.npmjs.org"
86
94
  },
95
+ "engines": {
96
+ "node": "^20.19.0 || >=22.12.0"
97
+ },
98
+ "zhin": {
99
+ "protocol": 1,
100
+ "type": "plugin",
101
+ "entry": "./plugin.js",
102
+ "engine": "^1.0.0",
103
+ "runtime": "trusted",
104
+ "features": [
105
+ {
106
+ "package": "@zhin.js/adapter",
107
+ "api": "^1.0.0"
108
+ },
109
+ {
110
+ "package": "@zhin.js/command",
111
+ "api": "^1.0.0"
112
+ },
113
+ {
114
+ "package": "@zhin.js/tool",
115
+ "api": "^1.0.0"
116
+ },
117
+ {
118
+ "package": "@zhin.js/skill",
119
+ "api": "^1.0.0"
120
+ },
121
+ {
122
+ "package": "@zhin.js/agent-feature",
123
+ "api": "^1.0.0"
124
+ }
125
+ ],
126
+ "plugins": []
127
+ },
87
128
  "scripts": {
88
- "build": "zhin build",
89
- "clean": "rimraf lib"
129
+ "build": "tsc",
130
+ "clean": "rimraf lib",
131
+ "test": "NODE_OPTIONS=--experimental-strip-types vitest run --root ../../.. plugins/adapters/napcat/tests"
90
132
  }
91
133
  }
package/plugin.js ADDED
@@ -0,0 +1,18 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { createEndpointRuntimeState } from 'zhin.js/adapter';
3
+ import { definePlugin } from 'zhin.js';
4
+ import { permissionHostToken, createSceneRolePlatformChecker } from '@zhin.js/permission';
5
+ import { napcatRuntimeStateToken } from "./lib/napcat-runtime-state.js";
6
+ export default definePlugin({
7
+ name: 'napcat',
8
+ metadata: {
9
+ displayName: 'NapCat Adapter',
10
+ },
11
+ setup(context) {
12
+ context.resources.provide(napcatRuntimeStateToken, createEndpointRuntimeState());
13
+ if (context.resources.has(permissionHostToken)) {
14
+ const host = context.resources.use(permissionHostToken);
15
+ return host.registerPlatform('napcat', createSceneRolePlatformChecker());
16
+ }
17
+ },
18
+ });
package/schema.json ADDED
@@ -0,0 +1,131 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "properties": {
6
+ "connection": {
7
+ "type": "string",
8
+ "enum": [
9
+ "ws",
10
+ "wss",
11
+ "http"
12
+ ],
13
+ "default": "ws",
14
+ "description": "ws (default), wss (reverse WS), or http (POST webhook + HTTP API outbound)"
15
+ },
16
+ "reconnect_interval": {
17
+ "type": "number",
18
+ "default": 5000
19
+ },
20
+ "heartbeat_interval": {
21
+ "type": "number",
22
+ "default": 30000
23
+ },
24
+ "poll_interval": {
25
+ "type": "number",
26
+ "default": 30000
27
+ },
28
+ "master": {
29
+ "type": [
30
+ "string",
31
+ "number"
32
+ ],
33
+ "description": "框架 master(QQ uin;AI/工具权限、endpoint 管理)。endpoints[i].master 可逐项覆盖"
34
+ },
35
+ "trusted": {
36
+ "type": "array",
37
+ "items": {
38
+ "type": [
39
+ "string",
40
+ "number"
41
+ ],
42
+ "description": "Trusted QQ uin"
43
+ },
44
+ "description": "框架 trusted 用户列表(弱于 master)。endpoints[i].trusted 可逐项追加"
45
+ },
46
+ "endpoints": {
47
+ "type": "array",
48
+ "minItems": 1,
49
+ "description": "多账号:一个插件实例挂多个 endpoint。每项与顶层字段同构(id 必填,其余覆盖顶层)",
50
+ "items": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "properties": {
54
+ "master": {
55
+ "type": [
56
+ "string",
57
+ "number"
58
+ ],
59
+ "description": "本 endpoint 的框架 master(QQ uin);覆盖顶层 master"
60
+ },
61
+ "trusted": {
62
+ "type": "array",
63
+ "items": {
64
+ "type": [
65
+ "string",
66
+ "number"
67
+ ],
68
+ "description": "Trusted QQ uin"
69
+ },
70
+ "description": "本 endpoint 的 trusted 列表"
71
+ },
72
+ "connection": {
73
+ "type": "string",
74
+ "enum": [
75
+ "ws",
76
+ "wss",
77
+ "http"
78
+ ]
79
+ },
80
+ "url": {
81
+ "type": "string",
82
+ "description": "NapCat WebSocket URL (required for connection: ws)"
83
+ },
84
+ "path": {
85
+ "type": "string",
86
+ "description": "WS path for reverse-wss"
87
+ },
88
+ "http_url": {
89
+ "type": "string",
90
+ "description": "HTTP API base URL (connection: http outbound)"
91
+ },
92
+ "post_path": {
93
+ "type": "string",
94
+ "description": "HTTP POST event path (connection: http inbound)"
95
+ },
96
+ "access_token": {
97
+ "type": "string",
98
+ "description": "NapCat access token"
99
+ },
100
+ "reconnect_interval": {
101
+ "type": "number"
102
+ },
103
+ "heartbeat_interval": {
104
+ "type": "number"
105
+ },
106
+ "poll_interval": {
107
+ "type": "number"
108
+ },
109
+ "commandPrefix": {
110
+ "type": "string"
111
+ },
112
+ "id": {
113
+ "type": "string",
114
+ "description": "NapCat bot name"
115
+ }
116
+ },
117
+ "required": [
118
+ "id"
119
+ ]
120
+ }
121
+ },
122
+ "commandPrefix": {
123
+ "type": "string",
124
+ "default": "",
125
+ "description": "命令前缀(默认 '' 无前缀,任意文本按命令匹配;如 '/' 要求 / 开头)。endpoints[i] 可逐项覆盖"
126
+ }
127
+ },
128
+ "required": [
129
+ "endpoints"
130
+ ]
131
+ }
package/src/client.ts ADDED
@@ -0,0 +1,79 @@
1
+ import { defineEndpointClient } from 'zhin.js/adapter';
2
+ import type { NapCatEvent } from './protocol.js';
3
+
4
+ export type NapcatApiCall = (
5
+ action: string,
6
+ params?: Record<string, unknown>,
7
+ ) => Promise<unknown>;
8
+
9
+ /** Transport-independent NapCat protocol Client produced by every Endpoint mode. */
10
+ export class NapcatClient {
11
+ constructor(readonly callApi: NapcatApiCall) {}
12
+
13
+ async setTitle(groupId: number, userId: number, title: string, duration = -1): Promise<boolean> {
14
+ await this.callApi('set_group_special_title', {
15
+ group_id: groupId,
16
+ user_id: userId,
17
+ special_title: title,
18
+ duration,
19
+ });
20
+ return true;
21
+ }
22
+
23
+ sendLike(userId: number, times = 1) { return this.callApi('send_like', { user_id: userId, times }); }
24
+ deleteFriend(userId: number) { return this.callApi('delete_friend', { user_id: userId }); }
25
+ markMsgAsRead(messageId: number) { return this.callApi('mark_msg_as_read', { message_id: messageId }); }
26
+ ocrImage(image: string) { return this.callApi('ocr_image', { image }); }
27
+ setQQProfile(nickname: string, company?: string, email?: string, college?: string, personalNote?: string) {
28
+ return this.callApi('set_qq_profile', { nickname, company, email, college, personal_note: personalNote });
29
+ }
30
+ setGroupPortrait(groupId: number, file: string) { return this.callApi('set_group_portrait', { group_id: groupId, file }); }
31
+ setEssenceMsg(messageId: number) { return this.callApi('set_essence_msg', { message_id: messageId }); }
32
+ deleteEssenceMsg(messageId: number) { return this.callApi('delete_essence_msg', { message_id: messageId }); }
33
+ getEssenceMsgList(groupId: number) { return this.callApi('get_essence_msg_list', { group_id: groupId }); }
34
+ sendGroupSign(groupId: number) { return this.callApi('send_group_sign', { group_id: groupId }); }
35
+ sendGroupNotice(groupId: number, content: string, image?: string) { return this.callApi('_send_group_notice', { group_id: groupId, content, image }); }
36
+ getGroupNotice(groupId: number) { return this.callApi('_get_group_notice', { group_id: groupId }); }
37
+ deleteGroupNotice(groupId: number, noticeId: string) { return this.callApi('_del_group_notice', { group_id: groupId, notice_id: noticeId }); }
38
+ uploadGroupFile(groupId: number, file: string, name: string, folder?: string) { return this.callApi('upload_group_file', { group_id: groupId, file, name, folder }); }
39
+ getGroupRootFiles(groupId: number) { return this.callApi('get_group_root_files', { group_id: groupId }); }
40
+ getGroupFileUrl(groupId: number, fileId: string, busid: number) { return this.callApi('get_group_file_url', { group_id: groupId, file_id: fileId, busid }); }
41
+ downloadFile(url: string, threadCount = 1, headers?: string[]) { return this.callApi('download_file', { url, thread_count: threadCount, headers }); }
42
+ setOnlineStatus(status: number, extStatus: number) { return this.callApi('set_online_status', { status, ext_status: extStatus }); }
43
+ setQQAvatar(file: string) { return this.callApi('set_qq_avatar', { file }); }
44
+ forwardFriendSingleMsg(userId: number, messageId: number) { return this.callApi('forward_friend_single_msg', { user_id: userId, message_id: messageId }); }
45
+ forwardGroupSingleMsg(groupId: number, messageId: number) { return this.callApi('forward_group_single_msg', { group_id: groupId, message_id: messageId }); }
46
+ translateEn2Zh(sourceText: string) { return this.callApi('translate_en2zh', { source_text: sourceText }); }
47
+ setMsgEmojiLike(messageId: number, emojiId: string) { return this.callApi('set_msg_emoji_like', { message_id: messageId, emoji_id: emojiId }); }
48
+ sendForwardMsg(messageType: 'private' | 'group', id: number, messages: unknown[]) {
49
+ return this.callApi('send_forward_msg', {
50
+ message_type: messageType,
51
+ [messageType === 'group' ? 'group_id' : 'user_id']: id,
52
+ messages,
53
+ });
54
+ }
55
+ getFriendMsgHistory(userId: number, messageSeq?: number, count?: number) { return this.callApi('get_friend_msg_history', { user_id: userId, message_seq: messageSeq, count }); }
56
+ getGroupMsgHistory(groupId: number, messageSeq?: number, count?: number) { return this.callApi('get_group_msg_history', { group_id: groupId, message_seq: messageSeq, count }); }
57
+ setSelfLongnick(longnick: string) { return this.callApi('set_self_longnick', { longNick: longnick }); }
58
+ getGroupInfoEx(groupId: number) { return this.callApi('get_group_info_ex', { group_id: groupId }); }
59
+ sendPoke(userId: number, groupId?: number) { return this.callApi('send_poke', { user_id: userId, group_id: groupId }); }
60
+ ncGetUserStatus(userId: number) { return this.callApi('nc_get_user_status', { user_id: userId }); }
61
+ getGroupShutList(groupId: number) { return this.callApi('get_group_shut_list', { group_id: groupId }); }
62
+ getMiniAppArk(type: string, title: string, desc: string, picUrl: string, jumpUrl: string) { return this.callApi('get_mini_app_ark', { type, title, desc, picUrl, jumpUrl }); }
63
+ getAiCharacters(groupId: number) { return this.callApi('get_ai_characters', { group_id: groupId }); }
64
+ sendGroupAiRecord(groupId: number, characterId: string, text: string) {
65
+ return this.callApi('send_group_ai_record', { group_id: groupId, character: characterId, text });
66
+ }
67
+ }
68
+ export type NapcatClientEventMap = Record<string, NapCatEvent>;
69
+
70
+ declare module '@zhin.js/feature-kit' {
71
+ interface AdapterClientRegistry {
72
+ readonly napcat: {
73
+ readonly client: NapcatClient;
74
+ readonly events: NapcatClientEventMap;
75
+ };
76
+ }
77
+ }
78
+
79
+ export const napcatClient = defineEndpointClient<NapcatClient, NapcatClientEventMap>('napcat');
@@ -0,0 +1,72 @@
1
+ /**
2
+ * NapCat endpoint management 语义端口(Console 社交面 RPC 消费,见
3
+ * packages/im/adapter/src/endpoint-management.ts)。
4
+ *
5
+ * 归一化取舍:
6
+ * - friend → {user_id:number, nickname, remark: remark ?? ''}
7
+ * - group → {group_id:number, name: group_name ?? name}
8
+ * - 群成员列表保持 OneBot11 原生形状,仅保证数组
9
+ */
10
+ import type {
11
+ EndpointFriend,
12
+ EndpointGroup,
13
+ EndpointManagement,
14
+ } from 'zhin.js/adapter';
15
+
16
+ /** 管理面只依赖 endpoint 的 callApi(ws/wss/http 三种传输各自实现)。 */
17
+ export interface NapCatManagementCaller {
18
+ callApi(action: string, params?: Record<string, unknown>): Promise<unknown>;
19
+ }
20
+
21
+ export function createNapCatEndpointManagement(
22
+ endpoint: NapCatManagementCaller,
23
+ ): EndpointManagement {
24
+ return Object.freeze<EndpointManagement>({
25
+ async listFriends(): Promise<readonly EndpointFriend[]> {
26
+ const data = await endpoint.callApi('get_friend_list');
27
+ return toArray(data).map((value) => {
28
+ const friend = asRecord(value);
29
+ return {
30
+ user_id: toNumberId(friend.user_id, 'user_id'),
31
+ nickname: String(friend.nickname ?? ''),
32
+ remark: String(friend.remark ?? ''),
33
+ };
34
+ });
35
+ },
36
+ async listGroups(): Promise<readonly EndpointGroup[]> {
37
+ const data = await endpoint.callApi('get_group_list');
38
+ return toArray(data).map((value) => {
39
+ const group = asRecord(value);
40
+ return {
41
+ group_id: toNumberId(group.group_id, 'group_id'),
42
+ name: String(group.group_name ?? group.name ?? ''),
43
+ };
44
+ });
45
+ },
46
+ async listGroupMembers(groupId: string): Promise<readonly unknown[]> {
47
+ const data = await endpoint.callApi('get_group_member_list', {
48
+ group_id: toNumberId(groupId, 'group_id'),
49
+ });
50
+ return toArray(data);
51
+ },
52
+ });
53
+ }
54
+
55
+ function asRecord(value: unknown): Record<string, unknown> {
56
+ return value !== null && typeof value === 'object'
57
+ ? value as Record<string, unknown>
58
+ : {};
59
+ }
60
+
61
+ function toArray(value: unknown): readonly unknown[] {
62
+ return Array.isArray(value) ? value : [];
63
+ }
64
+
65
+ /** console RPC 传入的 gid/uid 可能是字符串,统一收敛为数字。 */
66
+ function toNumberId(value: unknown, label: string): number {
67
+ const n = Number(value);
68
+ if (!Number.isFinite(n) || String(value ?? '').trim() === '') {
69
+ throw new TypeError(`napcat ${label} 必须是数字: ${String(value)}`);
70
+ }
71
+ return n;
72
+ }