@zhin.js/adapter-kook 5.0.2 → 5.0.3

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 (88) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +58 -452
  3. package/adapters/kook.ts +46 -0
  4. package/agent/tools/blacklist.ts +2 -2
  5. package/agent/tools/create_role.ts +2 -2
  6. package/agent/tools/delete_role.ts +2 -2
  7. package/agent/tools/grant_role.ts +2 -2
  8. package/agent/tools/list_roles.ts +2 -2
  9. package/agent/tools/revoke_role.ts +2 -2
  10. package/lib/endpoint.d.ts +84 -0
  11. package/lib/endpoint.js +299 -0
  12. package/lib/index.d.ts +6 -0
  13. package/lib/index.js +6 -0
  14. package/lib/kook-agent-deps.d.ts +29 -0
  15. package/lib/kook-agent-deps.js +30 -0
  16. package/lib/platform-permit.d.ts +23 -0
  17. package/lib/{src/platform-permit.js → platform-permit.js} +2 -3
  18. package/lib/protocol.d.ts +147 -0
  19. package/lib/protocol.js +279 -0
  20. package/lib/webhook.d.ts +15 -0
  21. package/lib/webhook.js +76 -0
  22. package/lib/ws.d.ts +42 -0
  23. package/lib/ws.js +63 -0
  24. package/package.json +44 -40
  25. package/plugin.ts +13 -0
  26. package/schema.json +55 -0
  27. package/src/endpoint.ts +287 -879
  28. package/src/index.ts +55 -177
  29. package/src/kook-agent-deps.ts +44 -11
  30. package/src/platform-permit.ts +13 -3
  31. package/src/protocol.ts +429 -0
  32. package/src/webhook.ts +116 -0
  33. package/src/ws.ts +120 -0
  34. package/client/Dashboard.tsx +0 -255
  35. package/client/index.tsx +0 -11
  36. package/client/tsconfig.json +0 -7
  37. package/client/utils/api.ts +0 -30
  38. package/dist/index.js +0 -31
  39. package/lib/agent/tools/blacklist.js +0 -33
  40. package/lib/agent/tools/blacklist.js.map +0 -1
  41. package/lib/agent/tools/create_role.js +0 -25
  42. package/lib/agent/tools/create_role.js.map +0 -1
  43. package/lib/agent/tools/delete_role.js +0 -21
  44. package/lib/agent/tools/delete_role.js.map +0 -1
  45. package/lib/agent/tools/grant_role.js +0 -22
  46. package/lib/agent/tools/grant_role.js.map +0 -1
  47. package/lib/agent/tools/list_roles.js +0 -27
  48. package/lib/agent/tools/list_roles.js.map +0 -1
  49. package/lib/agent/tools/revoke_role.js +0 -22
  50. package/lib/agent/tools/revoke_role.js.map +0 -1
  51. package/lib/src/adapter.js +0 -67
  52. package/lib/src/adapter.js.map +0 -1
  53. package/lib/src/endpoint.js +0 -796
  54. package/lib/src/endpoint.js.map +0 -1
  55. package/lib/src/index.js +0 -197
  56. package/lib/src/index.js.map +0 -1
  57. package/lib/src/kook-agent-deps.js +0 -10
  58. package/lib/src/kook-agent-deps.js.map +0 -1
  59. package/lib/src/kook-asset-upload.js +0 -46
  60. package/lib/src/kook-asset-upload.js.map +0 -1
  61. package/lib/src/kook-inbound.js +0 -22
  62. package/lib/src/kook-inbound.js.map +0 -1
  63. package/lib/src/kook-msg-route.js +0 -106
  64. package/lib/src/kook-msg-route.js.map +0 -1
  65. package/lib/src/kook-side-events.js +0 -166
  66. package/lib/src/kook-side-events.js.map +0 -1
  67. package/lib/src/outbound-keyboard.js +0 -66
  68. package/lib/src/outbound-keyboard.js.map +0 -1
  69. package/lib/src/outbound-media.js +0 -45
  70. package/lib/src/outbound-media.js.map +0 -1
  71. package/lib/src/outbound-sendable.js +0 -64
  72. package/lib/src/outbound-sendable.js.map +0 -1
  73. package/lib/src/platform-permit.js.map +0 -1
  74. package/lib/src/segment-mapper.js +0 -2
  75. package/lib/src/segment-mapper.js.map +0 -1
  76. package/lib/src/types.js +0 -8
  77. package/lib/src/types.js.map +0 -1
  78. package/plugin.yml +0 -3
  79. package/src/adapter.ts +0 -75
  80. package/src/kook-asset-upload.ts +0 -55
  81. package/src/kook-inbound.ts +0 -22
  82. package/src/kook-msg-route.ts +0 -122
  83. package/src/kook-side-events.ts +0 -230
  84. package/src/outbound-keyboard.ts +0 -77
  85. package/src/outbound-media.ts +0 -60
  86. package/src/outbound-sendable.ts +0 -73
  87. package/src/segment-mapper.ts +0 -1
  88. package/src/types.ts +0 -58
@@ -1,255 +0,0 @@
1
- import { useEffect, useState, useCallback } from 'react'
2
- import { apiFetch } from './utils/api'
3
- import { RefreshCw, Server, Wifi, WifiOff, Power, PowerOff, Loader2, Shield, Plus, Trash2, X } from 'lucide-react'
4
-
5
- interface EndpointRow {
6
- name: string
7
- connected: boolean
8
- guildCount: number
9
- status: string
10
- }
11
-
12
- interface Role {
13
- id: string
14
- name: string
15
- color: number
16
- position: number
17
- }
18
-
19
- type Tab = 'overview' | 'roles'
20
-
21
- export default function KookDashboard() {
22
- const [endpoints, setEndpoints] = useState<EndpointRow[]>([])
23
- const [loading, setLoading] = useState(true)
24
- const [error, setError] = useState('')
25
- const [tab, setTab] = useState<Tab>('overview')
26
- const [actionLoading, setActionLoading] = useState<Record<string, boolean>>({})
27
-
28
- // Role management state
29
- const [selectedEndpoint, setSelectedEndpoint] = useState('')
30
- const [guildId, setGuildId] = useState('')
31
- const [roles, setRoles] = useState<Role[]>([])
32
- const [rolesLoading, setRolesLoading] = useState(false)
33
- const [newRoleName, setNewRoleName] = useState('')
34
- const [createLoading, setCreateLoading] = useState(false)
35
- const [deleteLoading, setDeleteLoading] = useState<string | null>(null)
36
-
37
- const fetchData = useCallback(async () => {
38
- setLoading(true)
39
- setError('')
40
- try {
41
- const res = await apiFetch('/api/kook/endpoints')
42
- const json = await res.json()
43
- if (json.success) setEndpoints(json.data)
44
- else setError(json.error || '获取数据失败')
45
- } catch {
46
- setError('无法连接服务器')
47
- } finally {
48
- setLoading(false)
49
- }
50
- }, [])
51
-
52
- useEffect(() => { fetchData() }, [fetchData])
53
-
54
- const toggleConnect = async (name: string, connected: boolean) => {
55
- setActionLoading(prev => ({ ...prev, [name]: true }))
56
- try {
57
- const endpoint = connected ? 'disconnect' : 'connect'
58
- const res = await apiFetch(`/api/kook/endpoints/${encodeURIComponent(name)}/${endpoint}`, { method: 'POST' })
59
- const json = await res.json()
60
- if (!json.success) setError(json.error || '操作失败')
61
- await fetchData()
62
- } catch {
63
- setError('操作失败')
64
- } finally {
65
- setActionLoading(prev => ({ ...prev, [name]: false }))
66
- }
67
- }
68
-
69
- const loadRoles = async () => {
70
- if (!selectedEndpoint || !guildId) return
71
- setRolesLoading(true)
72
- setRoles([])
73
- try {
74
- const res = await apiFetch(`/api/kook/endpoints/${encodeURIComponent(selectedEndpoint)}/guilds/${encodeURIComponent(guildId)}/roles`)
75
- const json = await res.json()
76
- if (json.success) setRoles(json.data)
77
- else setError(json.error || '获取角色失败')
78
- } catch {
79
- setError('获取角色失败')
80
- } finally {
81
- setRolesLoading(false)
82
- }
83
- }
84
-
85
- const createRole = async () => {
86
- if (!selectedEndpoint || !guildId || !newRoleName.trim()) return
87
- setCreateLoading(true)
88
- try {
89
- const res = await apiFetch(`/api/kook/endpoints/${encodeURIComponent(selectedEndpoint)}/guilds/${encodeURIComponent(guildId)}/roles`, {
90
- method: 'POST',
91
- headers: { 'Content-Type': 'application/json' },
92
- body: JSON.stringify({ name: newRoleName.trim() }),
93
- })
94
- const json = await res.json()
95
- if (json.success) {
96
- setNewRoleName('')
97
- await loadRoles()
98
- } else {
99
- setError(json.error || '创建角色失败')
100
- }
101
- } catch {
102
- setError('创建角色失败')
103
- } finally {
104
- setCreateLoading(false)
105
- }
106
- }
107
-
108
- const deleteRole = async (roleId: string) => {
109
- if (!selectedEndpoint || !guildId) return
110
- setDeleteLoading(roleId)
111
- try {
112
- const res = await apiFetch(`/api/kook/endpoints/${encodeURIComponent(selectedEndpoint)}/guilds/${encodeURIComponent(guildId)}/roles/${encodeURIComponent(roleId)}`, {
113
- method: 'DELETE',
114
- })
115
- const json = await res.json()
116
- if (json.success) {
117
- setRoles(prev => prev.filter(r => r.id !== roleId))
118
- } else {
119
- setError(json.error || '删除角色失败')
120
- }
121
- } catch {
122
- setError('删除角色失败')
123
- } finally {
124
- setDeleteLoading(null)
125
- }
126
- }
127
-
128
- const onlineEndpoints = endpoints.filter((e) => e.connected)
129
-
130
- return (
131
- <div className="p-6 max-w-5xl mx-auto">
132
- <div className="flex items-center justify-between mb-6">
133
- <h1 className="text-2xl font-bold flex items-center gap-2">
134
- <Server className="w-6 h-6" /> KOOK 机器人
135
- </h1>
136
- <button onClick={fetchData} disabled={loading}
137
- className="flex items-center gap-1 px-3 py-1.5 rounded bg-sky-500 text-white hover:bg-sky-600 disabled:opacity-50 text-sm">
138
- <RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} /> 刷新
139
- </button>
140
- </div>
141
-
142
- {error && <div className="mb-4 p-3 bg-red-50 text-red-600 rounded border border-red-200 flex items-center justify-between">
143
- <span>{error}</span>
144
- <button onClick={() => setError('')} className="text-red-400 hover:text-red-600"><X className="w-4 h-4" /></button>
145
- </div>}
146
-
147
- {/* Tabs */}
148
- <div className="flex gap-1 mb-6 border-b">
149
- <button onClick={() => setTab('overview')}
150
- className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${tab === 'overview' ? 'border-sky-500 text-sky-600' : 'border-transparent text-gray-500 hover:text-gray-700'}`}>
151
- 概览
152
- </button>
153
- <button onClick={() => setTab('roles')}
154
- className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${tab === 'roles' ? 'border-sky-500 text-sky-600' : 'border-transparent text-gray-500 hover:text-gray-700'}`}>
155
- 角色管理
156
- </button>
157
- </div>
158
-
159
- {/* Overview Tab */}
160
- {tab === 'overview' && (
161
- <>
162
- {!loading && !endpoints.length && !error && (
163
- <div className="text-center text-gray-500 py-12">暂无 KOOK Endpoint 实例</div>
164
- )}
165
- <div className="grid gap-4 md:grid-cols-2">
166
- {endpoints.map((endpoint) => (
167
- <div key={endpoint.name} className="border rounded-lg p-4 bg-card shadow-sm">
168
- <div className="flex items-center justify-between mb-3">
169
- <span className="font-medium text-lg">{endpoint.name}</span>
170
- {endpoint.connected
171
- ? <span className="flex items-center gap-1 text-green-600 text-sm"><Wifi className="w-4 h-4" /> 在线</span>
172
- : <span className="flex items-center gap-1 text-gray-400 text-sm"><WifiOff className="w-4 h-4" /> 离线</span>}
173
- </div>
174
- <div className="text-sm text-gray-600 mb-3">
175
- <div className="flex justify-between"><span>服务器</span><span className="font-mono">{endpoint.guildCount}</span></div>
176
- </div>
177
- <button
178
- onClick={() => toggleConnect(endpoint.name, endpoint.connected)}
179
- disabled={actionLoading[endpoint.name]}
180
- className={`flex items-center gap-1 px-3 py-1.5 rounded text-sm text-white ${endpoint.connected ? 'bg-red-500 hover:bg-red-600' : 'bg-green-500 hover:bg-green-600'} disabled:opacity-50`}>
181
- {actionLoading[endpoint.name]
182
- ? <Loader2 className="w-3.5 h-3.5 animate-spin" />
183
- : endpoint.connected ? <PowerOff className="w-3.5 h-3.5" /> : <Power className="w-3.5 h-3.5" />}
184
- {endpoint.connected ? '断开' : '连接'}
185
- </button>
186
- </div>
187
- ))}
188
- </div>
189
- </>
190
- )}
191
-
192
- {/* Roles Tab */}
193
- {tab === 'roles' && (
194
- <div className="space-y-4">
195
- {/* Endpoint + Guild selector */}
196
- <div className="flex flex-wrap items-end gap-3">
197
- <div>
198
- <label className="block text-xs text-gray-500 mb-1">机器人</label>
199
- <select value={selectedEndpoint} onChange={(e) => setSelectedEndpoint(e.target.value)}
200
- className="border rounded px-2 py-1.5 text-sm min-w-[140px]">
201
- <option value="">--</option>
202
- {onlineEndpoints.map((e) => <option key={e.name} value={e.name}>{e.name}</option>)}
203
- </select>
204
- </div>
205
- <div>
206
- <label className="block text-xs text-gray-500 mb-1">服务器 ID</label>
207
- <input value={guildId} onChange={(e) => setGuildId(e.target.value)} placeholder="输入服务器 ID"
208
- className="border rounded px-2 py-1.5 text-sm w-[180px]" />
209
- </div>
210
- <button onClick={loadRoles} disabled={!selectedEndpoint || !guildId || rolesLoading}
211
- className="px-3 py-1.5 rounded bg-sky-500 text-white text-sm hover:bg-sky-600 disabled:opacity-50 flex items-center gap-1">
212
- {rolesLoading ? <Loader2 className="w-3.5 h-3.5 animate-spin" /> : <Shield className="w-3.5 h-3.5" />} 查询角色
213
- </button>
214
- </div>
215
-
216
- {!onlineEndpoints.length && <div className="text-center text-gray-500 py-4">暂无在线 Endpoint</div>}
217
-
218
- {/* Create Role */}
219
- {selectedEndpoint && guildId && roles.length > 0 && (
220
- <div className="flex items-center gap-2">
221
- <input value={newRoleName} onChange={(e) => setNewRoleName(e.target.value)} placeholder="新角色名称"
222
- className="border rounded px-2 py-1.5 text-sm flex-1 max-w-[240px]"
223
- onKeyDown={(e) => e.key === 'Enter' && createRole()} />
224
- <button onClick={createRole} disabled={createLoading || !newRoleName.trim()}
225
- className="px-3 py-1.5 rounded bg-green-500 text-white text-sm hover:bg-green-600 disabled:opacity-50 flex items-center gap-1">
226
- {createLoading ? <Loader2 className="w-3.5 h-3.5 animate-spin" /> : <Plus className="w-3.5 h-3.5" />} 创建
227
- </button>
228
- </div>
229
- )}
230
-
231
- {/* Roles list */}
232
- {rolesLoading && <div className="flex justify-center py-8"><Loader2 className="w-6 h-6 animate-spin text-sky-500" /></div>}
233
-
234
- {!rolesLoading && roles.length > 0 && (
235
- <div className="border rounded-lg bg-card shadow-sm divide-y">
236
- {roles.map(role => (
237
- <div key={role.id} className="flex items-center px-4 py-2.5 hover:bg-gray-50">
238
- <div className="w-3 h-3 rounded-full mr-3" style={{ backgroundColor: role.color ? `#${role.color.toString(16).padStart(6, '0')}` : '#999' }} />
239
- <span className="font-medium text-sm flex-1">{role.name}</span>
240
- <span className="text-xs text-gray-400 mr-4">ID: {role.id}</span>
241
- <button onClick={() => deleteRole(role.id)} disabled={deleteLoading === role.id}
242
- className="text-gray-400 hover:text-red-500 disabled:opacity-50">
243
- {deleteLoading === role.id ? <Loader2 className="w-4 h-4 animate-spin" /> : <Trash2 className="w-4 h-4" />}
244
- </button>
245
- </div>
246
- ))}
247
- </div>
248
- )}
249
-
250
- {!rolesLoading && selectedEndpoint && guildId && !roles.length && <div className="text-center text-gray-400 py-6">暂无角色数据,请先查询</div>}
251
- </div>
252
- )}
253
- </div>
254
- )
255
- }
package/client/index.tsx DELETED
@@ -1,11 +0,0 @@
1
- import type { PluginRegisterHostApi } from '@zhin.js/contract'
2
- import KookDashboard from './Dashboard'
3
-
4
- export function register(api: PluginRegisterHostApi) {
5
- api.addRoute({
6
- path: '/kook',
7
- name: 'KOOK',
8
- element: api.React.createElement(KookDashboard, { hostReact: api.React }),
9
- })
10
- api.addTool({ id: 'kook', name: 'KOOK', path: '/kook' })
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,31 +0,0 @@
1
- import{useEffect as De,useState as p,useCallback as Fe}from"react";var Y="zhin_api_token",se="zhin_api_base";function re(){let t=localStorage.getItem(se)?.trim();return t?t.replace(/\/$/,""):typeof window<"u"?window.location.origin:""}function ie(){return localStorage.getItem(Y)}async function S(t,u){let f=ie(),s=new Headers(u?.headers);f&&s.set("Authorization",`Bearer ${f}`);let m=re(),l=typeof t=="string"&&t.startsWith("/")?`${m}${t}`:t,L=await fetch(l,{...u,headers:s});return L.status===401&&(localStorage.removeItem(Y),window.dispatchEvent(new CustomEvent("zhin:auth-required"))),L}import{forwardRef as Le,createElement as Ie}from"react";var O=(...t)=>t.filter((u,f,s)=>!!u&&u.trim()!==""&&s.indexOf(u)===f).join(" ").trim();var ee=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var ae=t=>t.replace(/^([A-Z])|[\s-_]+(\w)/g,(u,f,s)=>s?s.toUpperCase():f.toLowerCase());var E=t=>{let u=ae(t);return u.charAt(0).toUpperCase()+u.slice(1)};import{forwardRef as me,createElement as ue}from"react";var H={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 te=t=>{for(let u in t)if(u.startsWith("aria-")||u==="role"||u==="title")return!0;return!1};import{createContext as ce,useContext as ne,useMemo as We,createElement as Ee}from"react";var pe=ce({});var oe=()=>ne(pe);var de=me(({color:t,size:u,strokeWidth:f,absoluteStrokeWidth:s,className:m="",children:l,iconNode:L,...g},b)=>{let{size:C=24,strokeWidth:r=2,absoluteStrokeWidth:G=!1,color:c="currentColor",className:W=""}=oe()??{},h=s??G?Number(f??r)*24/Number(u??C):f??r;return ue("svg",{ref:b,...H,width:u??C??H.width,height:u??C??H.height,stroke:t??c,strokeWidth:h,className:O("lucide",W,m),...!l&&!te(g)&&{"aria-hidden":"true"},...g},[...L.map(([k,x])=>ue(k,x)),...Array.isArray(l)?l:[l]])});var d=(t,u)=>{let f=Le(({className:s,...m},l)=>Ie(de,{ref:l,iconNode:u,className:O(`lucide-${ee(E(t))}`,`lucide-${t}`,s),...m}));return f.displayName=E(t),f};var xe=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],n=d("loader-circle",xe);var Ce=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],w=d("plus",Ce);var he=[["path",{d:"M18.36 6.64A9 9 0 0 1 20.77 15",key:"dxknvb"}],["path",{d:"M6.16 6.16a9 9 0 1 0 12.68 12.68",key:"1x7qb5"}],["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],P=d("power-off",he);var Se=[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]],A=d("power",Se);var ge=[["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"}]],B=d("refresh-cw",ge);var ke=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]],M=d("server",ke);var we=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],D=d("shield",we);var Pe=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],F=d("trash-2",Pe);var Ae=[["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"}]],y=d("wifi-off",Ae);var Be=[["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"}]],R=d("wifi",Be);var Me=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],T=d("x",Me);import{Fragment as ye,jsx as a,jsxs as o}from"react/jsx-runtime";function V(){let[t,u]=p([]),[f,s]=p(!0),[m,l]=p(""),[L,g]=p("overview"),[b,C]=p({}),[r,G]=p(""),[c,W]=p(""),[h,k]=p([]),[x,N]=p(!1),[q,z]=p(""),[X,K]=p(!1),[Z,Q]=p(null),v=Fe(async()=>{s(!0),l("");try{let i=await(await S("/api/kook/endpoints")).json();i.success?u(i.data):l(i.error||"\u83B7\u53D6\u6570\u636E\u5931\u8D25")}catch{l("\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u5668")}finally{s(!1)}},[]);De(()=>{v()},[v]);let le=async(e,i)=>{C(I=>({...I,[e]:!0}));try{let I=i?"disconnect":"connect",U=await(await S(`/api/kook/endpoints/${encodeURIComponent(e)}/${I}`,{method:"POST"})).json();U.success||l(U.error||"\u64CD\u4F5C\u5931\u8D25"),await v()}catch{l("\u64CD\u4F5C\u5931\u8D25")}finally{C(I=>({...I,[e]:!1}))}},J=async()=>{if(!(!r||!c)){N(!0),k([]);try{let i=await(await S(`/api/kook/endpoints/${encodeURIComponent(r)}/guilds/${encodeURIComponent(c)}/roles`)).json();i.success?k(i.data):l(i.error||"\u83B7\u53D6\u89D2\u8272\u5931\u8D25")}catch{l("\u83B7\u53D6\u89D2\u8272\u5931\u8D25")}finally{N(!1)}}},_=async()=>{if(!(!r||!c||!q.trim())){K(!0);try{let i=await(await S(`/api/kook/endpoints/${encodeURIComponent(r)}/guilds/${encodeURIComponent(c)}/roles`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:q.trim()})})).json();i.success?(z(""),await J()):l(i.error||"\u521B\u5EFA\u89D2\u8272\u5931\u8D25")}catch{l("\u521B\u5EFA\u89D2\u8272\u5931\u8D25")}finally{K(!1)}}},fe=async e=>{if(!(!r||!c)){Q(e);try{let I=await(await S(`/api/kook/endpoints/${encodeURIComponent(r)}/guilds/${encodeURIComponent(c)}/roles/${encodeURIComponent(e)}`,{method:"DELETE"})).json();I.success?k($=>$.filter(U=>U.id!==e)):l(I.error||"\u5220\u9664\u89D2\u8272\u5931\u8D25")}catch{l("\u5220\u9664\u89D2\u8272\u5931\u8D25")}finally{Q(null)}}},j=t.filter(e=>e.connected);return o("div",{className:"p-6 max-w-5xl mx-auto",children:[o("div",{className:"flex items-center justify-between mb-6",children:[o("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[a(M,{className:"w-6 h-6"})," KOOK \u673A\u5668\u4EBA"]}),o("button",{onClick:v,disabled:f,className:"flex items-center gap-1 px-3 py-1.5 rounded bg-sky-500 text-white hover:bg-sky-600 disabled:opacity-50 text-sm",children:[a(B,{className:`w-4 h-4 ${f?"animate-spin":""}`})," \u5237\u65B0"]})]}),m&&o("div",{className:"mb-4 p-3 bg-red-50 text-red-600 rounded border border-red-200 flex items-center justify-between",children:[a("span",{children:m}),a("button",{onClick:()=>l(""),className:"text-red-400 hover:text-red-600",children:a(T,{className:"w-4 h-4"})})]}),o("div",{className:"flex gap-1 mb-6 border-b",children:[a("button",{onClick:()=>g("overview"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${L==="overview"?"border-sky-500 text-sky-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:"\u6982\u89C8"}),a("button",{onClick:()=>g("roles"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${L==="roles"?"border-sky-500 text-sky-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:"\u89D2\u8272\u7BA1\u7406"})]}),L==="overview"&&o(ye,{children:[!f&&!t.length&&!m&&a("div",{className:"text-center text-gray-500 py-12",children:"\u6682\u65E0 KOOK Endpoint \u5B9E\u4F8B"}),a("div",{className:"grid gap-4 md:grid-cols-2",children:t.map(e=>o("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[o("div",{className:"flex items-center justify-between mb-3",children:[a("span",{className:"font-medium text-lg",children:e.name}),e.connected?o("span",{className:"flex items-center gap-1 text-green-600 text-sm",children:[a(R,{className:"w-4 h-4"})," \u5728\u7EBF"]}):o("span",{className:"flex items-center gap-1 text-gray-400 text-sm",children:[a(y,{className:"w-4 h-4"})," \u79BB\u7EBF"]})]}),a("div",{className:"text-sm text-gray-600 mb-3",children:o("div",{className:"flex justify-between",children:[a("span",{children:"\u670D\u52A1\u5668"}),a("span",{className:"font-mono",children:e.guildCount})]})}),o("button",{onClick:()=>le(e.name,e.connected),disabled:b[e.name],className:`flex items-center gap-1 px-3 py-1.5 rounded text-sm text-white ${e.connected?"bg-red-500 hover:bg-red-600":"bg-green-500 hover:bg-green-600"} disabled:opacity-50`,children:[b[e.name]?a(n,{className:"w-3.5 h-3.5 animate-spin"}):e.connected?a(P,{className:"w-3.5 h-3.5"}):a(A,{className:"w-3.5 h-3.5"}),e.connected?"\u65AD\u5F00":"\u8FDE\u63A5"]})]},e.name))})]}),L==="roles"&&o("div",{className:"space-y-4",children:[o("div",{className:"flex flex-wrap items-end gap-3",children:[o("div",{children:[a("label",{className:"block text-xs text-gray-500 mb-1",children:"\u673A\u5668\u4EBA"}),o("select",{value:r,onChange:e=>G(e.target.value),className:"border rounded px-2 py-1.5 text-sm min-w-[140px]",children:[a("option",{value:"",children:"--"}),j.map(e=>a("option",{value:e.name,children:e.name},e.name))]})]}),o("div",{children:[a("label",{className:"block text-xs text-gray-500 mb-1",children:"\u670D\u52A1\u5668 ID"}),a("input",{value:c,onChange:e=>W(e.target.value),placeholder:"\u8F93\u5165\u670D\u52A1\u5668 ID",className:"border rounded px-2 py-1.5 text-sm w-[180px]"})]}),o("button",{onClick:J,disabled:!r||!c||x,className:"px-3 py-1.5 rounded bg-sky-500 text-white text-sm hover:bg-sky-600 disabled:opacity-50 flex items-center gap-1",children:[x?a(n,{className:"w-3.5 h-3.5 animate-spin"}):a(D,{className:"w-3.5 h-3.5"})," \u67E5\u8BE2\u89D2\u8272"]})]}),!j.length&&a("div",{className:"text-center text-gray-500 py-4",children:"\u6682\u65E0\u5728\u7EBF Endpoint"}),r&&c&&h.length>0&&o("div",{className:"flex items-center gap-2",children:[a("input",{value:q,onChange:e=>z(e.target.value),placeholder:"\u65B0\u89D2\u8272\u540D\u79F0",className:"border rounded px-2 py-1.5 text-sm flex-1 max-w-[240px]",onKeyDown:e=>e.key==="Enter"&&_()}),o("button",{onClick:_,disabled:X||!q.trim(),className:"px-3 py-1.5 rounded bg-green-500 text-white text-sm hover:bg-green-600 disabled:opacity-50 flex items-center gap-1",children:[X?a(n,{className:"w-3.5 h-3.5 animate-spin"}):a(w,{className:"w-3.5 h-3.5"})," \u521B\u5EFA"]})]}),x&&a("div",{className:"flex justify-center py-8",children:a(n,{className:"w-6 h-6 animate-spin text-sky-500"})}),!x&&h.length>0&&a("div",{className:"border rounded-lg bg-card shadow-sm divide-y",children:h.map(e=>o("div",{className:"flex items-center px-4 py-2.5 hover:bg-gray-50",children:[a("div",{className:"w-3 h-3 rounded-full mr-3",style:{backgroundColor:e.color?`#${e.color.toString(16).padStart(6,"0")}`:"#999"}}),a("span",{className:"font-medium text-sm flex-1",children:e.name}),o("span",{className:"text-xs text-gray-400 mr-4",children:["ID: ",e.id]}),a("button",{onClick:()=>fe(e.id),disabled:Z===e.id,className:"text-gray-400 hover:text-red-500 disabled:opacity-50",children:Z===e.id?a(n,{className:"w-4 h-4 animate-spin"}):a(F,{className:"w-4 h-4"})})]},e.id))}),!x&&r&&c&&!h.length&&a("div",{className:"text-center text-gray-400 py-6",children:"\u6682\u65E0\u89D2\u8272\u6570\u636E\uFF0C\u8BF7\u5148\u67E5\u8BE2"})]})]})}function Ea(t){t.addRoute({path:"/kook",name:"KOOK",element:t.React.createElement(V,{hostReact:t.React})}),t.addTool({id:"kook",name:"KOOK",path:"/kook"})}export{Ea 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/loader-circle.mjs:
14
- lucide-react/dist/esm/icons/plus.mjs:
15
- lucide-react/dist/esm/icons/power-off.mjs:
16
- lucide-react/dist/esm/icons/power.mjs:
17
- lucide-react/dist/esm/icons/refresh-cw.mjs:
18
- lucide-react/dist/esm/icons/server.mjs:
19
- lucide-react/dist/esm/icons/shield.mjs:
20
- lucide-react/dist/esm/icons/trash-2.mjs:
21
- lucide-react/dist/esm/icons/wifi-off.mjs:
22
- lucide-react/dist/esm/icons/wifi.mjs:
23
- lucide-react/dist/esm/icons/x.mjs:
24
- lucide-react/dist/esm/lucide-react.mjs:
25
- (**
26
- * @license lucide-react v1.23.0 - ISC
27
- *
28
- * This source code is licensed under the ISC license.
29
- * See the LICENSE file in the root directory of this source tree.
30
- *)
31
- */
@@ -1,33 +0,0 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
2
- import { z } from 'zod';
3
- import { platformPermit } from '../../src/platform-permit.js';
4
- import { getKookAgentDeps } from '../../src/kook-agent-deps.js';
5
- export default defineTool({
6
- description: 'KOOK 服务器黑名单管理:添加/移除',
7
- inputSchema: z.object({
8
- endpoint_id: z.string().describe('Endpoint 名称'),
9
- guild_id: z.string().describe('服务器 ID'),
10
- action: z.enum(['add', 'remove']).describe('add|remove'),
11
- user_id: z.string().describe('用户 ID'),
12
- remark: z.string().optional().describe('备注(add 可选)'),
13
- }),
14
- platforms: ['kook'],
15
- tags: ['kook'],
16
- permissions: [platformPermit('guild_admin')],
17
- async execute({ endpoint_id, guild_id, action, user_id, remark }) {
18
- const endpoint = getKookAgentDeps().getEndpoint(endpoint_id);
19
- switch (action) {
20
- case 'add': {
21
- const success = await endpoint.addToBlacklist(guild_id, user_id, remark);
22
- return { success, message: success ? `已将 ${user_id} 加入黑名单` : '操作失败' };
23
- }
24
- case 'remove': {
25
- const success = await endpoint.removeFromBlacklist(guild_id, user_id);
26
- return { success, message: success ? `已将 ${user_id} 从黑名单移除` : '操作失败' };
27
- }
28
- default:
29
- return { success: false, message: `未知操作: ${action}` };
30
- }
31
- },
32
- });
33
- //# sourceMappingURL=blacklist.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"blacklist.js","sourceRoot":"","sources":["../../../agent/tools/blacklist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,eAAe,UAAU,CAAwG;IAC/H,WAAW,EAAE,qBAAqB;IAClC,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,QAAQ,CAAC;QACvC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;KACrD,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,WAAW,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAyG;QACrK,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACxE,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACzE,CAAC;YACD;gBACE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC;QAC1D,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
@@ -1,25 +0,0 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
2
- import { z } from 'zod';
3
- import { platformPermit } from '../../src/platform-permit.js';
4
- import { getKookAgentDeps } from '../../src/kook-agent-deps.js';
5
- export default defineTool({
6
- description: '在 KOOK 服务器中创建新角色',
7
- inputSchema: z.object({
8
- endpoint_id: z.string().describe('Endpoint 名称'),
9
- guild_id: z.string().describe('服务器 ID'),
10
- name: z.string().describe('角色名称'),
11
- }),
12
- platforms: ['kook'],
13
- tags: ['kook'],
14
- permissions: [platformPermit('guild_owner')],
15
- async execute({ endpoint_id, guild_id, name }) {
16
- const endpoint = getKookAgentDeps().getEndpoint(endpoint_id);
17
- const role = await endpoint.createRole(guild_id, name);
18
- return {
19
- success: true,
20
- message: `已创建角色 "${name}"`,
21
- role: { id: role.role_id, name: role.name },
22
- };
23
- },
24
- });
25
- //# sourceMappingURL=create_role.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create_role.js","sourceRoot":"","sources":["../../../agent/tools/create_role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,eAAe,UAAU,CAA0D;IACjF,WAAW,EAAE,kBAAkB;IAC/B,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,QAAQ,CAAC;QACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;KAClC,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,WAAW,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAA4D;QACrG,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,UAAU,IAAI,GAAG;YAC1B,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;SAC5C,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -1,21 +0,0 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
2
- import { z } from 'zod';
3
- import { platformPermit } from '../../src/platform-permit.js';
4
- import { getKookAgentDeps } from '../../src/kook-agent-deps.js';
5
- export default defineTool({
6
- description: '删除 KOOK 服务器中的角色',
7
- inputSchema: z.object({
8
- endpoint_id: z.string().describe('Endpoint 名称'),
9
- guild_id: z.string().describe('服务器 ID'),
10
- role_id: z.string().describe('角色 ID'),
11
- }),
12
- platforms: ['kook'],
13
- tags: ['kook'],
14
- permissions: [platformPermit('guild_owner')],
15
- async execute({ endpoint_id, guild_id, role_id }) {
16
- const endpoint = getKookAgentDeps().getEndpoint(endpoint_id);
17
- const success = await endpoint.deleteRole(guild_id, role_id);
18
- return { success, message: success ? `已删除角色 ${role_id}` : '删除角色失败' };
19
- },
20
- });
21
- //# sourceMappingURL=delete_role.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delete_role.js","sourceRoot":"","sources":["../../../agent/tools/delete_role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,eAAe,UAAU,CAA6D;IACpF,WAAW,EAAE,iBAAiB;IAC9B,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,QAAQ,CAAC;QACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACtC,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,WAAW,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAA+D;QAC3G,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvE,CAAC;CACF,CAAC,CAAC"}
@@ -1,22 +0,0 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
2
- import { z } from 'zod';
3
- import { platformPermit } from '../../src/platform-permit.js';
4
- import { getKookAgentDeps } from '../../src/kook-agent-deps.js';
5
- export default defineTool({
6
- description: '给用户授予 KOOK 服务器角色',
7
- inputSchema: z.object({
8
- endpoint_id: z.string().describe('Endpoint 名称'),
9
- guild_id: z.string().describe('服务器 ID'),
10
- user_id: z.string().describe('用户 ID'),
11
- role_id: z.string().describe('角色 ID'),
12
- }),
13
- platforms: ['kook'],
14
- tags: ['kook'],
15
- permissions: [platformPermit('manage_roles')],
16
- async execute({ endpoint_id, guild_id, user_id, role_id }) {
17
- const endpoint = getKookAgentDeps().getEndpoint(endpoint_id);
18
- const success = await endpoint.grantRole(guild_id, user_id, role_id);
19
- return { success, message: success ? `已授予用户 ${user_id} 角色 ${role_id}` : '授予角色失败' };
20
- },
21
- });
22
- //# sourceMappingURL=grant_role.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"grant_role.js","sourceRoot":"","sources":["../../../agent/tools/grant_role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,eAAe,UAAU,CAA8E;IACrG,WAAW,EAAE,kBAAkB;IAC/B,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,QAAQ,CAAC;QACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACtC,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,WAAW,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC7C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAgF;QACrI,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrF,CAAC;CACF,CAAC,CAAC"}
@@ -1,27 +0,0 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
2
- import { z } from 'zod';
3
- import { getKookAgentDeps } from '../../src/kook-agent-deps.js';
4
- export default defineTool({
5
- description: '获取 KOOK 服务器的角色列表',
6
- inputSchema: z.object({
7
- endpoint_id: z.string().describe('Endpoint 名称'),
8
- guild_id: z.string().describe('服务器 ID'),
9
- }),
10
- platforms: ['kook'],
11
- tags: ['kook'],
12
- async execute({ endpoint_id, guild_id }) {
13
- const endpoint = getKookAgentDeps().getEndpoint(endpoint_id);
14
- const roles = await endpoint.getRoleList(guild_id);
15
- return {
16
- roles: roles.map((r) => ({
17
- id: String(r.role_id),
18
- name: r.name,
19
- color: r.color,
20
- position: r.position,
21
- permissions: r.permissions,
22
- })),
23
- count: roles.length,
24
- };
25
- },
26
- });
27
- //# sourceMappingURL=list_roles.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list_roles.js","sourceRoot":"","sources":["../../../agent/tools/list_roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,eAAe,UAAU,CAA4C;IACnE,WAAW,EAAE,kBAAkB;IAC/B,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,QAAQ,CAAC;KACxC,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAA8C;QACjF,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;gBACrB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC;YACH,KAAK,EAAE,KAAK,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -1,22 +0,0 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
2
- import { z } from 'zod';
3
- import { platformPermit } from '../../src/platform-permit.js';
4
- import { getKookAgentDeps } from '../../src/kook-agent-deps.js';
5
- export default defineTool({
6
- description: '撤销用户的 KOOK 服务器角色',
7
- inputSchema: z.object({
8
- endpoint_id: z.string().describe('Endpoint 名称'),
9
- guild_id: z.string().describe('服务器 ID'),
10
- user_id: z.string().describe('用户 ID'),
11
- role_id: z.string().describe('角色 ID'),
12
- }),
13
- platforms: ['kook'],
14
- tags: ['kook'],
15
- permissions: [platformPermit('manage_roles')],
16
- async execute({ endpoint_id, guild_id, user_id, role_id }) {
17
- const endpoint = getKookAgentDeps().getEndpoint(endpoint_id);
18
- const success = await endpoint.revokeRole(guild_id, user_id, role_id);
19
- return { success, message: success ? `已撤销用户 ${user_id} 的角色 ${role_id}` : '撤销角色失败' };
20
- },
21
- });
22
- //# sourceMappingURL=revoke_role.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"revoke_role.js","sourceRoot":"","sources":["../../../agent/tools/revoke_role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,eAAe,UAAU,CAA8E;IACrG,WAAW,EAAE,kBAAkB;IAC/B,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,QAAQ,CAAC;QACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACtC,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,WAAW,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC7C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAgF;QACrI,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtF,CAAC;CACF,CAAC,CAAC"}
@@ -1,67 +0,0 @@
1
- /**
2
- * KOOK 适配器
3
- */
4
- import { formatCompact, Adapter } from 'zhin.js';
5
- import { KookEndpoint } from "./endpoint.js";
6
- export class KookAdapter extends Adapter {
7
- static capabilities = ['inbound', 'outbound'];
8
- static outboundRichSegmentPolicy = {
9
- qrcode: 'image',
10
- html: 'image',
11
- markdown: 'origin',
12
- };
13
- static interactivePolicy = 'native';
14
- constructor(plugin) {
15
- super(plugin, "kook", []);
16
- }
17
- createEndpoint(config) {
18
- return new KookEndpoint(this, config);
19
- }
20
- // ── ISceneManagement 标准群管方法 ──────────────────────────────────
21
- async removeMember(endpointId, sceneId, userId) {
22
- const endpoint = this.endpoints.get(endpointId);
23
- if (!endpoint)
24
- throw new Error(`Endpoint ${endpointId} 不存在`);
25
- return endpoint.kickUser(sceneId, userId);
26
- }
27
- async banMember(endpointId, sceneId, userId, reason) {
28
- const endpoint = this.endpoints.get(endpointId);
29
- if (!endpoint)
30
- throw new Error(`Endpoint ${endpointId} 不存在`);
31
- return endpoint.addToBlacklist(sceneId, userId, reason);
32
- }
33
- async unbanMember(endpointId, sceneId, userId) {
34
- const endpoint = this.endpoints.get(endpointId);
35
- if (!endpoint)
36
- throw new Error(`Endpoint ${endpointId} 不存在`);
37
- return endpoint.removeFromBlacklist(sceneId, userId);
38
- }
39
- async setMemberNickname(endpointId, sceneId, userId, nickname) {
40
- const endpoint = this.endpoints.get(endpointId);
41
- if (!endpoint)
42
- throw new Error(`Endpoint ${endpointId} 不存在`);
43
- return endpoint.setNickname(sceneId, userId, nickname);
44
- }
45
- async listMembers(endpointId, sceneId) {
46
- const endpoint = this.endpoints.get(endpointId);
47
- if (!endpoint)
48
- throw new Error(`Endpoint ${endpointId} 不存在`);
49
- const members = await endpoint.getGuildMembers(sceneId);
50
- return {
51
- members: members.map(m => ({
52
- id: m.id, username: m.username,
53
- nickname: m.nickname, roles: m.roles,
54
- })),
55
- count: members.length,
56
- };
57
- }
58
- // ── 生命周期 ───────────────────────────────────────────────────────
59
- async start() {
60
- await super.start();
61
- }
62
- async stop() {
63
- await super.stop();
64
- this.plugin.logger.debug(formatCompact({ op: "stop" }));
65
- }
66
- }
67
- //# sourceMappingURL=adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,OAAO,EAA0C,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,MAAM,OAAO,WAAY,SAAQ,OAAqB;IACpD,MAAM,CAAmB,YAAY,GAAG,CAAC,SAAS,EAAE,UAAU,CAAU,CAAC;IACzE,MAAM,CAAU,yBAAyB,GAA8B;QACrE,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,QAAQ;KACnB,CAAC;IACF,MAAM,CAAU,iBAAiB,GAAG,QAAiB,CAAC;IAEtD,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,cAAc,CAAC,MAA0B;QACvC,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,gEAAgE;IAEhE,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,OAAe,EAAE,MAAc;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAAkB,EAAE,OAAe,EAAE,MAAc,EAAE,MAAe;QAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,OAAe,EAAE,MAAc;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,UAAkB,EAAE,OAAe,EAAE,MAAc,EAAE,QAAgB;QAC3F,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,OAAe;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBAC9B,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK;aACrC,CAAC,CAAC;YACH,KAAK,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;IAED,kEAAkE;IAElE,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC"}