@zhin.js/adapter-napcat 0.1.13 → 0.1.15

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 (67) hide show
  1. package/CHANGELOG.md +36 -13
  2. package/README.md +121 -0
  3. package/client/NapCatManagement.tsx +113 -0
  4. package/client/index.tsx +11 -0
  5. package/client/tsconfig.json +7 -0
  6. package/client/utils/api.ts +30 -0
  7. package/dist/index.js +27 -0
  8. package/lib/adapter.d.ts +3 -0
  9. package/lib/adapter.d.ts.map +1 -1
  10. package/lib/adapter.js +5 -2
  11. package/lib/adapter.js.map +1 -1
  12. package/lib/agent-prompt.d.ts +3 -0
  13. package/lib/agent-prompt.d.ts.map +1 -0
  14. package/lib/agent-prompt.js +107 -0
  15. package/lib/agent-prompt.js.map +1 -0
  16. package/lib/bot-base.d.ts +6 -1
  17. package/lib/bot-base.d.ts.map +1 -1
  18. package/lib/bot-base.js +35 -1
  19. package/lib/bot-base.js.map +1 -1
  20. package/lib/bot-http.d.ts +2 -1
  21. package/lib/bot-http.d.ts.map +1 -1
  22. package/lib/bot-http.js +23 -1
  23. package/lib/bot-http.js.map +1 -1
  24. package/lib/bot-ws-client.d.ts +2 -0
  25. package/lib/bot-ws-client.d.ts.map +1 -1
  26. package/lib/bot-ws-client.js +32 -0
  27. package/lib/bot-ws-client.js.map +1 -1
  28. package/lib/bot-ws-server.d.ts +2 -1
  29. package/lib/bot-ws-server.d.ts.map +1 -1
  30. package/lib/bot-ws-server.js +14 -0
  31. package/lib/bot-ws-server.js.map +1 -1
  32. package/lib/index.d.ts +5 -1
  33. package/lib/index.d.ts.map +1 -1
  34. package/lib/index.js +22 -1
  35. package/lib/index.js.map +1 -1
  36. package/lib/napcat-inbound.d.ts +21 -0
  37. package/lib/napcat-inbound.d.ts.map +1 -0
  38. package/lib/napcat-inbound.js +55 -0
  39. package/lib/napcat-inbound.js.map +1 -0
  40. package/lib/onebot-get-msg.d.ts +3 -0
  41. package/lib/onebot-get-msg.d.ts.map +1 -0
  42. package/lib/onebot-get-msg.js +27 -0
  43. package/lib/onebot-get-msg.js.map +1 -0
  44. package/lib/routes.d.ts +4 -0
  45. package/lib/routes.d.ts.map +1 -0
  46. package/lib/routes.js +61 -0
  47. package/lib/routes.js.map +1 -0
  48. package/lib/types.d.ts +18 -0
  49. package/lib/types.d.ts.map +1 -1
  50. package/lib/typing-indicator.d.ts +45 -0
  51. package/lib/typing-indicator.d.ts.map +1 -0
  52. package/lib/typing-indicator.js +132 -0
  53. package/lib/typing-indicator.js.map +1 -0
  54. package/package.json +22 -6
  55. package/plugin.yml +1 -1
  56. package/src/adapter.ts +3 -3
  57. package/src/agent-prompt.ts +115 -0
  58. package/src/bot-base.ts +36 -1
  59. package/src/bot-http.ts +19 -1
  60. package/src/bot-ws-client.ts +34 -0
  61. package/src/bot-ws-server.ts +16 -1
  62. package/src/index.ts +41 -2
  63. package/src/napcat-inbound.ts +57 -0
  64. package/src/onebot-get-msg.ts +33 -0
  65. package/src/routes.ts +61 -0
  66. package/src/types.ts +13 -0
  67. package/src/typing-indicator.ts +183 -0
package/CHANGELOG.md CHANGED
@@ -1,11 +1,34 @@
1
1
  # @zhin.js/adapter-napcat
2
2
 
3
+ ## 0.1.15
4
+
5
+ ### Patch Changes
6
+
7
+ - 90d9efd: fix: 处理包名
8
+ - zhin.js@1.0.87
9
+ - @zhin.js/agent@0.1.27
10
+ - @zhin.js/host-api@0.0.1
11
+ - @zhin.js/host-router@0.0.1
12
+
13
+ ## 0.1.14
14
+
15
+ ### Patch Changes
16
+
17
+ - 7e14f8d: fix: 统一发个版,优化一些列安全问题
18
+ - Updated dependencies [6295cbd]
19
+ - Updated dependencies [7e14f8d]
20
+ - Updated dependencies [996ebb3]
21
+ - @zhin.js/agent@0.1.26
22
+ - zhin.js@1.0.86
23
+ - @zhin.js/console@3.0.5
24
+ - @zhin.js/host-router@1.0.79
25
+
3
26
  ## 0.1.13
4
27
 
5
28
  ### Patch Changes
6
29
 
7
30
  - zhin.js@1.0.85
8
- - @zhin.js/http@1.0.78
31
+ - @zhin.js/host-router@1.0.78
9
32
 
10
33
  ## 0.1.12
11
34
 
@@ -15,7 +38,7 @@
15
38
  - Updated dependencies [0db9fed]
16
39
  - Updated dependencies [f19d2e0]
17
40
  - zhin.js@1.0.84
18
- - @zhin.js/http@1.0.77
41
+ - @zhin.js/host-router@1.0.77
19
42
 
20
43
  ## 0.1.11
21
44
 
@@ -23,7 +46,7 @@
23
46
 
24
47
  - 775427e: fix: edge 支持
25
48
  - Updated dependencies [775427e]
26
- - @zhin.js/http@1.0.76
49
+ - @zhin.js/host-router@1.0.76
27
50
  - zhin.js@1.0.83
28
51
 
29
52
  ## 0.1.10
@@ -32,7 +55,7 @@
32
55
 
33
56
  - 32049f5: fix: init publish
34
57
  - Updated dependencies [32049f5]
35
- - @zhin.js/http@1.0.75
58
+ - @zhin.js/host-router@1.0.75
36
59
  - zhin.js@1.0.82
37
60
 
38
61
  ## 0.1.9
@@ -41,35 +64,35 @@
41
64
 
42
65
  - Updated dependencies [8086ccb]
43
66
  - zhin.js@1.0.81
44
- - @zhin.js/http@1.0.74
67
+ - @zhin.js/host-router@1.0.74
45
68
 
46
69
  ## 0.1.8
47
70
 
48
71
  ### Patch Changes
49
72
 
50
73
  - zhin.js@1.0.80
51
- - @zhin.js/http@1.0.73
74
+ - @zhin.js/host-router@1.0.73
52
75
 
53
76
  ## 0.1.7
54
77
 
55
78
  ### Patch Changes
56
79
 
57
80
  - zhin.js@1.0.79
58
- - @zhin.js/http@1.0.72
81
+ - @zhin.js/host-router@1.0.72
59
82
 
60
83
  ## 0.1.6
61
84
 
62
85
  ### Patch Changes
63
86
 
64
87
  - zhin.js@1.0.78
65
- - @zhin.js/http@1.0.71
88
+ - @zhin.js/host-router@1.0.71
66
89
 
67
90
  ## 0.1.5
68
91
 
69
92
  ### Patch Changes
70
93
 
71
94
  - zhin.js@1.0.77
72
- - @zhin.js/http@1.0.70
95
+ - @zhin.js/host-router@1.0.70
73
96
 
74
97
  ## 0.1.4
75
98
 
@@ -77,14 +100,14 @@
77
100
 
78
101
  - Updated dependencies [cb9fbf1]
79
102
  - zhin.js@1.0.76
80
- - @zhin.js/http@1.0.69
103
+ - @zhin.js/host-router@1.0.69
81
104
 
82
105
  ## 0.1.3
83
106
 
84
107
  ### Patch Changes
85
108
 
86
109
  - zhin.js@1.0.75
87
- - @zhin.js/http@1.0.68
110
+ - @zhin.js/host-router@1.0.68
88
111
 
89
112
  ## 0.1.2
90
113
 
@@ -92,7 +115,7 @@
92
115
 
93
116
  - Updated dependencies [c9dec38]
94
117
  - zhin.js@1.0.74
95
- - @zhin.js/http@1.0.67
118
+ - @zhin.js/host-router@1.0.67
96
119
 
97
120
  ## 0.1.1
98
121
 
@@ -100,4 +123,4 @@
100
123
 
101
124
  - f1e9a76: fix: 提高 skill 质量
102
125
  - zhin.js@1.0.73
103
- - @zhin.js/http@1.0.66
126
+ - @zhin.js/host-router@1.0.66
package/README.md ADDED
@@ -0,0 +1,121 @@
1
+ # @zhin.js/adapter-napcat
2
+
3
+ Zhin.js NapCatQQ 适配器,支持 OneBot11 标准 + go-cqhttp 扩展 + NapCat 独有 API。
4
+
5
+ ## 功能特性
6
+
7
+ - 完整 OneBot v11 协议兼容 + go-cqhttp 扩展 + NapCat 独有 API(92+ 接口)
8
+ - **单一适配器**:`context: napcat`,通过 `connection` 选择连接方式
9
+ - **正向 WebSocket**(`connection: ws`):应用连 NapCat 的 WS
10
+ - **反向 WebSocket**(`connection: wss`):应用开 WS 服务端,NapCat 连上来
11
+ - **HTTP API + POST 上报**(`connection: http`):出站 HTTP 调用,入站 webhook
12
+ - Access Token 认证支持(Bearer / HMAC 签名)
13
+ - 自动重连机制(WS)与心跳检测
14
+ - 群聊和私聊消息处理
15
+ - 入站消息去重与 bot 自发消息过滤
16
+ - Typing Indicator(处理中提示:群聊表情回应 / 私聊输入状态)
17
+ - 41 个 AI 工具(群管、戳一戳、表情回应、精华消息、群公告、AI 语音等)
18
+ - Console 管理页面(`/console/napcat`)
19
+ - Agent Prompt 贡献器(deferred 任务自动优选 napcat 工具)
20
+
21
+ ## 安装
22
+
23
+ ```bash
24
+ pnpm add @zhin.js/adapter-napcat ws
25
+ ```
26
+
27
+ 反向 WS / HTTP 模式需同时启用 `@zhin.js/host-router`。
28
+
29
+ ## 配置
30
+
31
+ 所有 Bot 使用 **同一 context:`napcat`**,通过 **`connection`** 区分连接方式。
32
+
33
+ ### 正向 WebSocket(connection: ws)
34
+
35
+ ```yaml
36
+ plugins:
37
+ - "@zhin.js/adapter-napcat"
38
+
39
+ bots:
40
+ - context: napcat
41
+ connection: ws
42
+ name: my-bot
43
+ url: "ws://127.0.0.1:3001"
44
+ access_token: "${NAPCAT_TOKEN}"
45
+ reconnect_interval: 5000
46
+ heartbeat_interval: 30000
47
+ ```
48
+
49
+ ### 反向 WebSocket(connection: wss)
50
+
51
+ ```yaml
52
+ plugins:
53
+ - "@zhin.js/host-router"
54
+ - "@zhin.js/adapter-napcat"
55
+
56
+ bots:
57
+ - context: napcat
58
+ connection: wss
59
+ name: my-bot
60
+ path: "/napcat/ws"
61
+ access_token: "${NAPCAT_TOKEN}"
62
+ heartbeat_interval: 30000
63
+ ```
64
+
65
+ ### HTTP API + POST 上报(connection: http)
66
+
67
+ ```yaml
68
+ plugins:
69
+ - "@zhin.js/host-router"
70
+ - "@zhin.js/adapter-napcat"
71
+
72
+ bots:
73
+ - context: napcat
74
+ connection: http
75
+ name: my-bot
76
+ http_url: "http://127.0.0.1:3000"
77
+ post_path: "/napcat/post"
78
+ access_token: "${NAPCAT_TOKEN}"
79
+ poll_interval: 30000
80
+ ```
81
+
82
+ ### Typing Indicator(处理中提示)
83
+
84
+ ```yaml
85
+ bots:
86
+ - context: napcat
87
+ connection: ws
88
+ name: my-bot
89
+ url: "ws://127.0.0.1:3001"
90
+ typingIndicator:
91
+ enabled: true
92
+ defaultEmoji: "128516"
93
+ privateConfig:
94
+ type: "message"
95
+ message: "正在思考中..."
96
+ groupConfig:
97
+ type: "reaction"
98
+ emoji: "128516"
99
+ ```
100
+
101
+ ## NapCat 独有能力
102
+
103
+ 相比标准 OneBot11 适配器,NapCat 额外支持:
104
+
105
+ - 戳一戳(群聊 / 私聊)
106
+ - 表情回应(贴表情)
107
+ - 合并 / 单条消息转发
108
+ - 精华消息管理
109
+ - 群公告管理
110
+ - 群文件管理
111
+ - AI 语音 TTS
112
+ - 图片 OCR 文字识别
113
+ - 小程序卡片签名
114
+ - 个人资料 / 头像 / 签名修改
115
+ - 在线状态设置
116
+ - 消息历史查询
117
+ - 英译中翻译
118
+
119
+ ## AI 工具
120
+
121
+ 适配器自动注册 41 个 AI 工具(7 个群管理标准工具 + 34 个 NapCat 扩展工具),详见 `skills/napcat/SKILL.md`。
@@ -0,0 +1,113 @@
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 BotRow {
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 [bots, setBots] = useState<BotRow[]>([]);
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/bots");
24
+ const json = (await res.json()) as { success?: boolean; data?: BotRow[]; message?: string };
25
+ if (!res.ok || !json.success) throw new Error(json.message || "加载失败");
26
+ setBots(Array.isArray(json.data) ? json.data : []);
27
+ } catch (e) {
28
+ setErr((e as Error).message);
29
+ setBots([]);
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
+ ) : bots.length === 0 ? (
78
+ <div className="text-center text-muted-foreground py-12">
79
+ 暂无 NapCat 机器人实例
80
+ </div>
81
+ ) : (
82
+ <div className="grid gap-4 md:grid-cols-2">
83
+ {bots.map((b) => (
84
+ <div key={b.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">{b.name}</span>
87
+ {b.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
+ 群 {b.groupCount} · 好友 {b.friendCount}
101
+ </div>
102
+ <div className="flex items-center gap-1.5">
103
+ <Activity className="w-3.5 h-3.5" />
104
+ 连接方式 {connectionLabel(b.connection)} · {b.status}
105
+ </div>
106
+ </div>
107
+ </div>
108
+ ))}
109
+ </div>
110
+ )}
111
+ </div>
112
+ );
113
+ }
@@ -0,0 +1,11 @@
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
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "../node_modules/@zhin.js/host-api/browser.tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "../dist"
5
+ },
6
+ "include": ["./**/*"]
7
+ }
@@ -0,0 +1,30 @@
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 ADDED
@@ -0,0 +1,27 @@
1
+ import{useCallback as te,useEffect as ue,useState as w}from"react";import{forwardRef as X,createElement as N}from"react";var S=(...e)=>e.filter((a,u,o)=>!!a&&a.trim()!==""&&o.indexOf(a)===u).join(" ").trim();var B=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var M=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(a,u,o)=>o?o.toUpperCase():u.toLowerCase());var k=e=>{let a=M(e);return a.charAt(0).toUpperCase()+a.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 F=e=>{for(let a in e)if(a.startsWith("aria-")||a==="role"||a==="title")return!0;return!1};import{createContext as W,useContext as V,useMemo as ne,createElement as pe}from"react";var E=W({});var D=()=>V(E);var T=z(({color:e,size:a,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=""}=D()??{},v=o??b?Number(u??A)*24/Number(a??c):u??A;return R("svg",{ref:t,...g,width:a??c??g.width,height:a??c??g.height,stroke:e??U,strokeWidth:v,className:S("lucide",O,s),...!r&&!F(h)&&{"aria-hidden":"true"},...h},[...i.map(([H,G])=>R(H,G)),...Array.isArray(r)?r:[r]])});var d=(e,a)=>{let u=X(({className:o,...s},r)=>N(T,{ref:r,iconNode:a,className:S(`lucide-${B(k(e))}`,`lucide-${e}`,o),...s}));return u.displayName=k(e),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 ee(){let e=localStorage.getItem($)?.trim();return e?e.replace(/\/$/,""):typeof window<"u"?window.location.origin:""}function ae(){return localStorage.getItem(y)}async function q(e,a){let u=ae(),o=new Headers(a?.headers);u&&o.set("Authorization",`Bearer ${u}`);let s=ee(),r=typeof e=="string"&&e.startsWith("/")?`${s}${e}`:e,i=await fetch(r,{...a,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 P(){let[e,a]=w([]),[u,o]=w(!0),[s,r]=w(null),i=te(async()=>{o(!0),r(null);try{let t=await q("/api/napcat/bots"),c=await t.json();if(!t.ok||!c.success)throw new Error(c.message||"\u52A0\u8F7D\u5931\u8D25");a(Array.isArray(c.data)?c.data:[])}catch(t){r(t.message),a([])}finally{o(!1)}},[]);ue(()=>{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"})}):e.length===0?l("div",{className:"text-center text-muted-foreground py-12",children:"\u6682\u65E0 NapCat \u673A\u5668\u4EBA\u5B9E\u4F8B"}):l("div",{className:"grid gap-4 md:grid-cols-2",children:e.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 ta(e){e.addRoute({path:"/console/napcat",name:"NapCat\u7BA1\u7406",element:e.React.createElement(P,{hostReact:e.React})}),e.addTool({id:"napcat",name:"NapCat",path:"/console/napcat"})}export{ta 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.17.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
+ */
package/lib/adapter.d.ts CHANGED
@@ -1,3 +1,6 @@
1
+ /**
2
+ * NapCat 适配器:支持正向 WS / 反向 WS / HTTP
3
+ */
1
4
  import { Adapter, Plugin } from 'zhin.js';
2
5
  import { NapCatWsClient } from './bot-ws-client.js';
3
6
  import { NapCatWsServer } from './bot-ws-server.js';
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAgE,MAAM,YAAY,CAAC;AAEhH,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,cAAc,GAAG,aAAa,CAAC;AAExE,qBAAa,aAAc,SAAQ,OAAO,CAAC,SAAS,CAAC;;gBAGvC,MAAM,EAAE,MAAM;IAI1B,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS;IAkBvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMzD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAM;IAMzE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAO;IAMrD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAO;IAMtE,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAMlF,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAMzD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;IAY1C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAM3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAiB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAgE,MAAM,YAAY,CAAC;AAEhH,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,cAAc,GAAG,aAAa,CAAC;AAExE,qBAAa,aAAc,SAAQ,OAAO,CAAC,SAAS,CAAC;;gBAGvC,MAAM,EAAE,MAAM;IAI1B,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS;IAkBvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMzD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAM;IAMzE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAO;IAMrD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAO;IAMtE,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAMlF,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAMzD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;IAY1C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAM3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
package/lib/adapter.js CHANGED
@@ -1,3 +1,6 @@
1
+ /**
2
+ * NapCat 适配器:支持正向 WS / 反向 WS / HTTP
3
+ */
1
4
  import { Adapter } from 'zhin.js';
2
5
  import { NapCatWsClient } from './bot-ws-client.js';
3
6
  import { NapCatWsServer } from './bot-ws-server.js';
@@ -14,11 +17,11 @@ export class NapCatAdapter extends Adapter {
14
17
  return new NapCatWsClient(this, config);
15
18
  case 'wss':
16
19
  if (!this.#router)
17
- throw new Error('NapCat connection: wss requires router. Enable @zhin.js/http first.');
20
+ throw new Error('NapCat connection: wss requires router. Enable @zhin.js/host-router first.');
18
21
  return new NapCatWsServer(this, this.#router, config);
19
22
  case 'http':
20
23
  if (!this.#router)
21
- throw new Error('NapCat connection: http requires router. Enable @zhin.js/http first.');
24
+ throw new Error('NapCat connection: http requires router. Enable @zhin.js/host-router first.');
22
25
  return new NapCatHttpBot(this, this.#router, config);
23
26
  default:
24
27
  throw new Error(`Unknown NapCat connection: ${connection}`);
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentPromptContributor } from 'zhin.js';
2
+ export declare function createNapCatAgentPromptContributor(): AgentPromptContributor;
3
+ //# sourceMappingURL=agent-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-prompt.d.ts","sourceRoot":"","sources":["../src/agent-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,sBAAsB,EAGvB,MAAM,SAAS,CAAC;AAsEjB,wBAAgB,kCAAkC,IAAI,sBAAsB,CAuC3E"}
@@ -0,0 +1,107 @@
1
+ import { filterTools } from 'zhin.js';
2
+ function isNapCatDelegatedTask(query, goal) {
3
+ const text = `${query} ${goal}`;
4
+ if (/\bnapcat\b|napcat_|mcp_napcat/i.test(text))
5
+ return true;
6
+ if (/戳一戳|poke|表情回应|emoji.*reaction/i.test(text))
7
+ return true;
8
+ if (/精华消息|essence|群公告|group.*notice/i.test(text))
9
+ return true;
10
+ if (/AI语音|ai.*record|tts|文字转语音/i.test(text))
11
+ return true;
12
+ if (/群文件|upload.*file|群签到|group.*sign/i.test(text))
13
+ return true;
14
+ if (/合并转发|forward.*msg|转发消息/i.test(text))
15
+ return true;
16
+ if (/点赞/.test(text) && /qq|好友|\d{5,}/i.test(text))
17
+ return true;
18
+ return false;
19
+ }
20
+ function selectNapCatDeferredTools(query, goal, deferredCatalog, maxTools) {
21
+ const pool = deferredCatalog.filter(t => !t.name.startsWith('mcp_filesystem') && !t.name.startsWith('mcp_memory_'));
22
+ const napcatTools = pool.filter(t => t.name.startsWith('napcat_'));
23
+ const pinned = [];
24
+ const preferOrder = [
25
+ 'napcat_send_poke',
26
+ 'napcat_set_emoji_reaction',
27
+ 'napcat_send_like',
28
+ 'napcat_set_essence_msg',
29
+ 'napcat_send_group_notice',
30
+ 'napcat_ai_tts',
31
+ ];
32
+ for (const name of preferOrder) {
33
+ const t = napcatTools.find(x => x.name === name);
34
+ if (t)
35
+ pinned.push(t);
36
+ }
37
+ for (const t of napcatTools) {
38
+ if (pinned.length >= maxTools)
39
+ break;
40
+ if (!pinned.some(p => p.name === t.name))
41
+ pinned.push(t);
42
+ }
43
+ const extra = filterTools(query, pool, { maxTools, minScore: 0.08 })
44
+ .filter(t => !pinned.some(p => p.name === t.name));
45
+ const merged = [...pinned];
46
+ for (const t of extra) {
47
+ if (merged.length >= maxTools)
48
+ break;
49
+ merged.push(t);
50
+ }
51
+ return merged.slice(0, maxTools);
52
+ }
53
+ const ORCHESTRATOR_NAPCAT = [
54
+ 'On napcat/QQ: use run_deferred_task with tool_query "napcat_send_poke" or "napcat_set_emoji_reaction".',
55
+ 'NapCat supports: poke, emoji reaction, forward msg, essence, group notice, AI TTS, OCR, group files.',
56
+ 'Skip tool_search when the user clearly asks for QQ-specific features like poke, reaction, or group management.',
57
+ ].join('\n');
58
+ const WORKER_NAPCAT = [
59
+ '- Use `napcat_send_poke` for poke/戳一戳.',
60
+ '- Use `napcat_set_emoji_reaction` for emoji reaction/表情回应.',
61
+ '- Use `napcat_send_like` for friend like/点赞.',
62
+ '- Use `napcat_ai_tts` for AI voice/AI语音.',
63
+ '- Use `napcat_set_essence_msg` / `napcat_delete_essence_msg` for essence messages.',
64
+ '- Use `napcat_send_group_notice` for group announcements.',
65
+ '- Do NOT use mcp_filesystem_* or explore node_modules for QQ tasks.',
66
+ ].join('\n');
67
+ export function createNapCatAgentPromptContributor() {
68
+ return {
69
+ platform: 'napcat',
70
+ async buildSections(ctx) {
71
+ if (ctx.slot === 'orchestrator') {
72
+ if (!ctx.toolSearch)
73
+ return null;
74
+ return [{
75
+ id: 'platform.napcat.orchestrator',
76
+ title: '## napcat / QQ',
77
+ body: ORCHESTRATOR_NAPCAT,
78
+ priority: 50,
79
+ }];
80
+ }
81
+ if (ctx.slot === 'deferred_worker') {
82
+ const query = ctx.deferred?.toolQuery ?? ctx.deferred?.goal ?? '';
83
+ const goal = ctx.deferred?.goal ?? '';
84
+ if (!isNapCatDelegatedTask(query, goal))
85
+ return null;
86
+ return [{
87
+ id: 'platform.napcat.deferred_worker',
88
+ title: '## napcat / QQ(本任务)',
89
+ body: WORKER_NAPCAT,
90
+ priority: 50,
91
+ }];
92
+ }
93
+ return null;
94
+ },
95
+ matchesDeferredTask(ctx) {
96
+ const query = ctx.deferred?.toolQuery ?? ctx.deferred?.goal ?? ctx.userMessagePreview ?? '';
97
+ const goal = ctx.deferred?.goal ?? ctx.userMessagePreview ?? '';
98
+ return isNapCatDelegatedTask(query, goal);
99
+ },
100
+ selectDeferredTools(query, goal, catalog, maxTools) {
101
+ if (!isNapCatDelegatedTask(query, goal))
102
+ return null;
103
+ return selectNapCatDeferredTools(query, goal, catalog, maxTools);
104
+ },
105
+ };
106
+ }
107
+ //# sourceMappingURL=agent-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-prompt.js","sourceRoot":"","sources":["../src/agent-prompt.ts"],"names":[],"mappings":"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"}