@zhin.js/adapter-telegram 5.0.2 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +62 -0
- package/README.md +63 -145
- package/adapters/telegram.ts +27 -0
- package/agent/tools/create_invite.ts +2 -2
- package/agent/tools/list_admins.ts +2 -2
- package/agent/tools/member_count.ts +2 -2
- package/agent/tools/pin_message.ts +2 -2
- package/agent/tools/react.ts +2 -2
- package/agent/tools/send_poll.ts +2 -2
- package/agent/tools/send_sticker.ts +2 -2
- package/agent/tools/set_description.ts +2 -2
- package/agent/tools/set_permissions.ts +2 -2
- package/agent/tools/unpin_message.ts +2 -2
- package/lib/endpoint.d.ts +65 -0
- package/lib/endpoint.js +332 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +4 -0
- package/lib/platform-permit.d.ts +18 -0
- package/lib/{src/platform-permit.js → platform-permit.js} +1 -2
- package/lib/polling.d.ts +9 -0
- package/lib/polling.js +52 -0
- package/lib/protocol.d.ts +250 -0
- package/lib/protocol.js +324 -0
- package/lib/telegram-agent-deps.d.ts +28 -0
- package/lib/telegram-agent-deps.js +30 -0
- package/lib/webhook.d.ts +13 -0
- package/lib/webhook.js +45 -0
- package/package.json +43 -40
- package/plugin.ts +13 -0
- package/schema.json +74 -0
- package/src/endpoint.ts +339 -1103
- package/src/index.ts +40 -186
- package/src/platform-permit.ts +1 -1
- package/src/polling.ts +71 -0
- package/src/protocol.ts +573 -0
- package/src/telegram-agent-deps.ts +52 -11
- package/src/webhook.ts +67 -0
- package/client/Dashboard.tsx +0 -295
- package/client/index.tsx +0 -11
- package/client/tsconfig.json +0 -7
- package/client/utils/api.ts +0 -30
- package/dist/index.js +0 -32
- package/lib/agent/tools/create_invite.js +0 -20
- package/lib/agent/tools/create_invite.js.map +0 -1
- package/lib/agent/tools/list_admins.js +0 -26
- package/lib/agent/tools/list_admins.js.map +0 -1
- package/lib/agent/tools/member_count.js +0 -18
- package/lib/agent/tools/member_count.js.map +0 -1
- package/lib/agent/tools/pin_message.js +0 -21
- package/lib/agent/tools/pin_message.js.map +0 -1
- package/lib/agent/tools/react.js +0 -20
- package/lib/agent/tools/react.js.map +0 -1
- package/lib/agent/tools/send_poll.js +0 -32
- package/lib/agent/tools/send_poll.js.map +0 -1
- package/lib/agent/tools/send_sticker.js +0 -19
- package/lib/agent/tools/send_sticker.js.map +0 -1
- package/lib/agent/tools/set_description.js +0 -19
- package/lib/agent/tools/set_description.js.map +0 -1
- package/lib/agent/tools/set_permissions.js +0 -34
- package/lib/agent/tools/set_permissions.js.map +0 -1
- package/lib/agent/tools/unpin_message.js +0 -21
- package/lib/agent/tools/unpin_message.js.map +0 -1
- package/lib/src/adapter.js +0 -58
- package/lib/src/adapter.js.map +0 -1
- package/lib/src/endpoint.js +0 -1046
- package/lib/src/endpoint.js.map +0 -1
- package/lib/src/index.js +0 -215
- package/lib/src/index.js.map +0 -1
- package/lib/src/platform-permit.js.map +0 -1
- package/lib/src/segment-mapper.js +0 -2
- package/lib/src/segment-mapper.js.map +0 -1
- package/lib/src/telegram-agent-deps.js +0 -10
- package/lib/src/telegram-agent-deps.js.map +0 -1
- package/lib/src/types.js +0 -2
- package/lib/src/types.js.map +0 -1
- package/plugin.yml +0 -3
- package/src/adapter.ts +0 -66
- package/src/segment-mapper.ts +0 -1
- package/src/types.ts +0 -32
package/client/Dashboard.tsx
DELETED
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState, useCallback } from 'react'
|
|
2
|
-
import { apiFetch } from './utils/api'
|
|
3
|
-
import { RefreshCw, Server, Wifi, WifiOff, Power, PowerOff, Loader2, Link2, BarChart3, ShieldCheck, Plus, X } from 'lucide-react'
|
|
4
|
-
|
|
5
|
-
interface EndpointRow {
|
|
6
|
-
name: string
|
|
7
|
-
connected: boolean
|
|
8
|
-
mode: string
|
|
9
|
-
status: string
|
|
10
|
-
botInfo: { username: string; firstName: string } | null
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
interface Admin {
|
|
14
|
-
user_id: number
|
|
15
|
-
username: string
|
|
16
|
-
first_name: string
|
|
17
|
-
status: string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
type Tab = 'overview' | 'actions'
|
|
21
|
-
|
|
22
|
-
export default function TelegramDashboard() {
|
|
23
|
-
const [endpoints, setEndpoints] = useState<EndpointRow[]>([])
|
|
24
|
-
const [loading, setLoading] = useState(true)
|
|
25
|
-
const [error, setError] = useState('')
|
|
26
|
-
const [tab, setTab] = useState<Tab>('overview')
|
|
27
|
-
const [actionLoading, setActionLoading] = useState<Record<string, boolean>>({})
|
|
28
|
-
|
|
29
|
-
// Quick actions state
|
|
30
|
-
const [selectedEndpoint, setSelectedEndpoint] = useState('')
|
|
31
|
-
const [chatId, setChatId] = useState('')
|
|
32
|
-
const [inviteResult, setInviteResult] = useState('')
|
|
33
|
-
const [admins, setAdmins] = useState<Admin[]>([])
|
|
34
|
-
const [adminsLoading, setAdminsLoading] = useState(false)
|
|
35
|
-
|
|
36
|
-
// Poll state
|
|
37
|
-
const [pollQuestion, setPollQuestion] = useState('')
|
|
38
|
-
const [pollOptions, setPollOptions] = useState(['', ''])
|
|
39
|
-
const [pollAnonymous, setPollAnonymous] = useState(true)
|
|
40
|
-
const [pollMultiple, setPollMultiple] = useState(false)
|
|
41
|
-
const [pollResult, setPollResult] = useState('')
|
|
42
|
-
const [pollLoading, setPollLoading] = useState(false)
|
|
43
|
-
|
|
44
|
-
const fetchData = useCallback(async () => {
|
|
45
|
-
setLoading(true)
|
|
46
|
-
setError('')
|
|
47
|
-
try {
|
|
48
|
-
const res = await apiFetch('/api/telegram/endpoints')
|
|
49
|
-
const json = await res.json()
|
|
50
|
-
if (json.success) setEndpoints(json.data)
|
|
51
|
-
else setError(json.error || '获取数据失败')
|
|
52
|
-
} catch {
|
|
53
|
-
setError('无法连接服务器')
|
|
54
|
-
} finally {
|
|
55
|
-
setLoading(false)
|
|
56
|
-
}
|
|
57
|
-
}, [])
|
|
58
|
-
|
|
59
|
-
useEffect(() => { fetchData() }, [fetchData])
|
|
60
|
-
|
|
61
|
-
const toggleConnect = async (name: string, connected: boolean) => {
|
|
62
|
-
setActionLoading(prev => ({ ...prev, [name]: true }))
|
|
63
|
-
try {
|
|
64
|
-
const endpoint = connected ? 'disconnect' : 'connect'
|
|
65
|
-
const res = await apiFetch(`/api/telegram/endpoints/${encodeURIComponent(name)}/${endpoint}`, { method: 'POST' })
|
|
66
|
-
const json = await res.json()
|
|
67
|
-
if (!json.success) setError(json.error || '操作失败')
|
|
68
|
-
await fetchData()
|
|
69
|
-
} catch {
|
|
70
|
-
setError('操作失败')
|
|
71
|
-
} finally {
|
|
72
|
-
setActionLoading(prev => ({ ...prev, [name]: false }))
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const createInvite = async () => {
|
|
77
|
-
if (!selectedEndpoint || !chatId) return
|
|
78
|
-
setInviteResult('')
|
|
79
|
-
try {
|
|
80
|
-
const res = await apiFetch(`/api/telegram/endpoints/${encodeURIComponent(selectedEndpoint)}/invite`, {
|
|
81
|
-
method: 'POST',
|
|
82
|
-
headers: { 'Content-Type': 'application/json' },
|
|
83
|
-
body: JSON.stringify({ chat_id: chatId }),
|
|
84
|
-
})
|
|
85
|
-
const json = await res.json()
|
|
86
|
-
if (json.success && json.data?.invite_link) setInviteResult(json.data.invite_link)
|
|
87
|
-
else setError(json.error || '创建失败')
|
|
88
|
-
} catch {
|
|
89
|
-
setError('创建邀请链接失败')
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const fetchAdmins = async () => {
|
|
94
|
-
if (!selectedEndpoint || !chatId) return
|
|
95
|
-
setAdminsLoading(true)
|
|
96
|
-
setAdmins([])
|
|
97
|
-
try {
|
|
98
|
-
const res = await apiFetch(`/api/telegram/endpoints/${encodeURIComponent(selectedEndpoint)}/admins?chat_id=${encodeURIComponent(chatId)}`)
|
|
99
|
-
const json = await res.json()
|
|
100
|
-
if (json.success && Array.isArray(json.data)) setAdmins(json.data)
|
|
101
|
-
else setError(json.error || '获取管理员失败')
|
|
102
|
-
} catch {
|
|
103
|
-
setError('获取管理员失败')
|
|
104
|
-
} finally {
|
|
105
|
-
setAdminsLoading(false)
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const sendPoll = async () => {
|
|
110
|
-
if (!selectedEndpoint || !chatId || !pollQuestion) return
|
|
111
|
-
const validOptions = pollOptions.filter(o => o.trim())
|
|
112
|
-
if (validOptions.length < 2) { setError('至少需要 2 个选项'); return }
|
|
113
|
-
setPollLoading(true)
|
|
114
|
-
setPollResult('')
|
|
115
|
-
try {
|
|
116
|
-
const res = await apiFetch(`/api/telegram/endpoints/${encodeURIComponent(selectedEndpoint)}/poll`, {
|
|
117
|
-
method: 'POST',
|
|
118
|
-
headers: { 'Content-Type': 'application/json' },
|
|
119
|
-
body: JSON.stringify({ chat_id: chatId, question: pollQuestion, options: validOptions, is_anonymous: pollAnonymous, allows_multiple: pollMultiple }),
|
|
120
|
-
})
|
|
121
|
-
const json = await res.json()
|
|
122
|
-
if (json.success) setPollResult(`投票已发送 (ID: ${json.data?.message_id ?? '未知'})`)
|
|
123
|
-
else setError(json.error || '发送失败')
|
|
124
|
-
} catch {
|
|
125
|
-
setError('发送投票失败')
|
|
126
|
-
} finally {
|
|
127
|
-
setPollLoading(false)
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const onlineEndpoints = endpoints.filter((e) => e.connected)
|
|
132
|
-
|
|
133
|
-
return (
|
|
134
|
-
<div className="p-6 max-w-5xl mx-auto">
|
|
135
|
-
<div className="flex items-center justify-between mb-6">
|
|
136
|
-
<h1 className="text-2xl font-bold flex items-center gap-2">
|
|
137
|
-
<Server className="w-6 h-6" /> Telegram 机器人
|
|
138
|
-
</h1>
|
|
139
|
-
<button onClick={fetchData} disabled={loading}
|
|
140
|
-
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">
|
|
141
|
-
<RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} /> 刷新
|
|
142
|
-
</button>
|
|
143
|
-
</div>
|
|
144
|
-
|
|
145
|
-
{error && <div className="mb-4 p-3 bg-red-50 text-red-600 rounded border border-red-200 flex items-center justify-between">
|
|
146
|
-
<span>{error}</span>
|
|
147
|
-
<button onClick={() => setError('')} className="text-red-400 hover:text-red-600"><X className="w-4 h-4" /></button>
|
|
148
|
-
</div>}
|
|
149
|
-
|
|
150
|
-
{/* Tabs */}
|
|
151
|
-
<div className="flex gap-1 mb-6 border-b">
|
|
152
|
-
<button onClick={() => setTab('overview')}
|
|
153
|
-
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'}`}>
|
|
154
|
-
概览
|
|
155
|
-
</button>
|
|
156
|
-
<button onClick={() => setTab('actions')}
|
|
157
|
-
className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${tab === 'actions' ? 'border-sky-500 text-sky-600' : 'border-transparent text-gray-500 hover:text-gray-700'}`}>
|
|
158
|
-
快捷操作
|
|
159
|
-
</button>
|
|
160
|
-
</div>
|
|
161
|
-
|
|
162
|
-
{/* Overview Tab */}
|
|
163
|
-
{tab === 'overview' && (
|
|
164
|
-
<>
|
|
165
|
-
{!loading && !endpoints.length && !error && (
|
|
166
|
-
<div className="text-center text-gray-500 py-12">暂无 Telegram Endpoint 实例</div>
|
|
167
|
-
)}
|
|
168
|
-
<div className="grid gap-4 md:grid-cols-2">
|
|
169
|
-
{endpoints.map((endpoint) => (
|
|
170
|
-
<div key={endpoint.name} className="border rounded-lg p-4 bg-card shadow-sm">
|
|
171
|
-
<div className="flex items-center justify-between mb-3">
|
|
172
|
-
<span className="font-medium text-lg">{endpoint.name}</span>
|
|
173
|
-
{endpoint.connected
|
|
174
|
-
? <span className="flex items-center gap-1 text-green-600 text-sm"><Wifi className="w-4 h-4" /> 在线</span>
|
|
175
|
-
: <span className="flex items-center gap-1 text-gray-400 text-sm"><WifiOff className="w-4 h-4" /> 离线</span>}
|
|
176
|
-
</div>
|
|
177
|
-
{endpoint.botInfo && <div className="text-sm text-gray-500 mb-2">@{endpoint.botInfo.username} ({endpoint.botInfo.firstName})</div>}
|
|
178
|
-
<div className="text-sm text-gray-600 mb-3">
|
|
179
|
-
<div className="flex justify-between"><span>模式</span><span className="font-mono">{endpoint.mode}</span></div>
|
|
180
|
-
</div>
|
|
181
|
-
<button
|
|
182
|
-
onClick={() => toggleConnect(endpoint.name, endpoint.connected)}
|
|
183
|
-
disabled={actionLoading[endpoint.name]}
|
|
184
|
-
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`}>
|
|
185
|
-
{actionLoading[endpoint.name]
|
|
186
|
-
? <Loader2 className="w-3.5 h-3.5 animate-spin" />
|
|
187
|
-
: endpoint.connected ? <PowerOff className="w-3.5 h-3.5" /> : <Power className="w-3.5 h-3.5" />}
|
|
188
|
-
{endpoint.connected ? '断开' : '连接'}
|
|
189
|
-
</button>
|
|
190
|
-
</div>
|
|
191
|
-
))}
|
|
192
|
-
</div>
|
|
193
|
-
</>
|
|
194
|
-
)}
|
|
195
|
-
|
|
196
|
-
{/* Quick Actions Tab */}
|
|
197
|
-
{tab === 'actions' && (
|
|
198
|
-
<div className="space-y-6">
|
|
199
|
-
{/* Endpoint + Chat selector */}
|
|
200
|
-
<div className="flex flex-wrap items-end gap-3">
|
|
201
|
-
<div>
|
|
202
|
-
<label className="block text-xs text-gray-500 mb-1">机器人</label>
|
|
203
|
-
<select value={selectedEndpoint} onChange={(e) => setSelectedEndpoint(e.target.value)}
|
|
204
|
-
className="border rounded px-2 py-1.5 text-sm min-w-[140px]">
|
|
205
|
-
<option value="">--</option>
|
|
206
|
-
{onlineEndpoints.map((e) => <option key={e.name} value={e.name}>{e.name}</option>)}
|
|
207
|
-
</select>
|
|
208
|
-
</div>
|
|
209
|
-
<div>
|
|
210
|
-
<label className="block text-xs text-gray-500 mb-1">Chat ID</label>
|
|
211
|
-
<input value={chatId} onChange={(e) => setChatId(e.target.value)} placeholder="-100xxxxxxxxxx"
|
|
212
|
-
className="border rounded px-2 py-1.5 text-sm w-[180px]" />
|
|
213
|
-
</div>
|
|
214
|
-
</div>
|
|
215
|
-
|
|
216
|
-
{!onlineEndpoints.length && <div className="text-center text-gray-500 py-4">暂无在线 Endpoint</div>}
|
|
217
|
-
|
|
218
|
-
{selectedEndpoint && chatId && (
|
|
219
|
-
<div className="grid gap-4 md:grid-cols-2">
|
|
220
|
-
{/* Invite Link */}
|
|
221
|
-
<div className="border rounded-lg p-4 bg-card shadow-sm">
|
|
222
|
-
<h3 className="font-medium flex items-center gap-2 mb-3"><Link2 className="w-4 h-4 text-sky-500" /> 创建邀请链接</h3>
|
|
223
|
-
<button onClick={createInvite} className="px-3 py-1.5 rounded bg-sky-500 text-white text-sm hover:bg-sky-600">
|
|
224
|
-
生成链接
|
|
225
|
-
</button>
|
|
226
|
-
{inviteResult && (
|
|
227
|
-
<div className="mt-2 p-2 bg-gray-50 rounded text-sm break-all">
|
|
228
|
-
<a href={inviteResult} target="_blank" rel="noreferrer" className="text-sky-600 hover:underline">{inviteResult}</a>
|
|
229
|
-
</div>
|
|
230
|
-
)}
|
|
231
|
-
</div>
|
|
232
|
-
|
|
233
|
-
{/* Admin List */}
|
|
234
|
-
<div className="border rounded-lg p-4 bg-card shadow-sm">
|
|
235
|
-
<h3 className="font-medium flex items-center gap-2 mb-3"><ShieldCheck className="w-4 h-4 text-sky-500" /> 管理员列表</h3>
|
|
236
|
-
<button onClick={fetchAdmins} disabled={adminsLoading}
|
|
237
|
-
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">
|
|
238
|
-
{adminsLoading && <Loader2 className="w-3.5 h-3.5 animate-spin" />} 查询
|
|
239
|
-
</button>
|
|
240
|
-
{admins.length > 0 && (
|
|
241
|
-
<div className="mt-2 space-y-1">
|
|
242
|
-
{admins.map(a => (
|
|
243
|
-
<div key={a.user_id} className="flex items-center justify-between text-sm py-1 border-b last:border-0">
|
|
244
|
-
<span>{a.first_name} {a.username ? `(@${a.username})` : ''}</span>
|
|
245
|
-
<span className="text-xs text-gray-400">{a.status}</span>
|
|
246
|
-
</div>
|
|
247
|
-
))}
|
|
248
|
-
</div>
|
|
249
|
-
)}
|
|
250
|
-
</div>
|
|
251
|
-
|
|
252
|
-
{/* Send Poll */}
|
|
253
|
-
<div className="border rounded-lg p-4 bg-card shadow-sm md:col-span-2">
|
|
254
|
-
<h3 className="font-medium flex items-center gap-2 mb-3"><BarChart3 className="w-4 h-4 text-sky-500" /> 发起投票</h3>
|
|
255
|
-
<div className="space-y-2">
|
|
256
|
-
<input value={pollQuestion} onChange={(e) => setPollQuestion(e.target.value)} placeholder="投票问题"
|
|
257
|
-
className="border rounded px-2 py-1.5 text-sm w-full" />
|
|
258
|
-
{pollOptions.map((opt, i) => (
|
|
259
|
-
<div key={i} className="flex items-center gap-2">
|
|
260
|
-
<input value={opt} onChange={(e) => {
|
|
261
|
-
const next = [...pollOptions]; next[i] = e.target.value; setPollOptions(next)
|
|
262
|
-
}} placeholder={`选项 ${i + 1}`}
|
|
263
|
-
className="border rounded px-2 py-1.5 text-sm flex-1" />
|
|
264
|
-
{pollOptions.length > 2 && (
|
|
265
|
-
<button onClick={() => setPollOptions(pollOptions.filter((_, j) => j !== i))}
|
|
266
|
-
className="text-gray-400 hover:text-red-500"><X className="w-4 h-4" /></button>
|
|
267
|
-
)}
|
|
268
|
-
</div>
|
|
269
|
-
))}
|
|
270
|
-
<button onClick={() => setPollOptions([...pollOptions, ''])}
|
|
271
|
-
className="flex items-center gap-1 text-sm text-sky-500 hover:text-sky-600">
|
|
272
|
-
<Plus className="w-3.5 h-3.5" /> 添加选项
|
|
273
|
-
</button>
|
|
274
|
-
<div className="flex items-center gap-4 text-sm text-gray-600">
|
|
275
|
-
<label className="flex items-center gap-1">
|
|
276
|
-
<input type="checkbox" checked={pollAnonymous} onChange={(e) => setPollAnonymous(e.target.checked)} /> 匿名
|
|
277
|
-
</label>
|
|
278
|
-
<label className="flex items-center gap-1">
|
|
279
|
-
<input type="checkbox" checked={pollMultiple} onChange={(e) => setPollMultiple(e.target.checked)} /> 多选
|
|
280
|
-
</label>
|
|
281
|
-
</div>
|
|
282
|
-
<button onClick={sendPoll} disabled={pollLoading || !pollQuestion}
|
|
283
|
-
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">
|
|
284
|
-
{pollLoading && <Loader2 className="w-3.5 h-3.5 animate-spin" />} 发送投票
|
|
285
|
-
</button>
|
|
286
|
-
{pollResult && <div className="text-sm text-green-600">{pollResult}</div>}
|
|
287
|
-
</div>
|
|
288
|
-
</div>
|
|
289
|
-
</div>
|
|
290
|
-
)}
|
|
291
|
-
</div>
|
|
292
|
-
)}
|
|
293
|
-
</div>
|
|
294
|
-
)
|
|
295
|
-
}
|
package/client/index.tsx
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { PluginRegisterHostApi } from '@zhin.js/contract'
|
|
2
|
-
import TelegramDashboard from './Dashboard'
|
|
3
|
-
|
|
4
|
-
export function register(api: PluginRegisterHostApi) {
|
|
5
|
-
api.addRoute({
|
|
6
|
-
path: '/telegram',
|
|
7
|
-
name: 'Telegram',
|
|
8
|
-
element: api.React.createElement(TelegramDashboard, { hostReact: api.React }),
|
|
9
|
-
})
|
|
10
|
-
api.addTool({ id: 'telegram', name: 'Telegram', path: '/telegram' })
|
|
11
|
-
}
|
package/client/tsconfig.json
DELETED
package/client/utils/api.ts
DELETED
|
@@ -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,32 +0,0 @@
|
|
|
1
|
-
import{useEffect as He,useState as r,useCallback as Ge}from"react";var oe="zhin_api_token",xe="zhin_api_base";function Ce(){let o=localStorage.getItem(xe)?.trim();return o?o.replace(/\/$/,""):typeof window<"u"?window.location.origin:""}function he(){return localStorage.getItem(oe)}async function g(o,l){let f=he(),i=new Headers(l?.headers);f&&i.set("Authorization",`Bearer ${f}`);let L=Ce(),s=typeof o=="string"&&o.startsWith("/")?`${L}${o}`:o,I=await fetch(s,{...l,headers:i});return I.status===401&&(localStorage.removeItem(oe),window.dispatchEvent(new CustomEvent("zhin:auth-required"))),I}import{forwardRef as Pe,createElement as Ae}from"react";var G=(...o)=>o.filter((l,f,i)=>!!l&&l.trim()!==""&&i.indexOf(l)===f).join(" ").trim();var ue=o=>o.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var de=o=>o.replace(/^([A-Z])|[\s-_]+(\w)/g,(l,f,i)=>i?i.toUpperCase():f.toLowerCase());var z=o=>{let l=de(o);return l.charAt(0).toUpperCase()+l.slice(1)};import{forwardRef as we,createElement as fe}from"react";var W={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 le=o=>{for(let l in o)if(l.startsWith("aria-")||l==="role"||l==="title")return!0;return!1};import{createContext as ge,useContext as Se,useMemo as Je,createElement as je}from"react";var ke=ge({});var se=()=>Se(ke);var re=we(({color:o,size:l,strokeWidth:f,absoluteStrokeWidth:i,className:L="",children:s,iconNode:I,...k},q)=>{let{size:C=24,strokeWidth:n=2,absoluteStrokeWidth:E=!1,color:p="currentColor",className:V=""}=se()??{},w=i??E?Number(f??n)*24/Number(l??C):f??n;return fe("svg",{ref:q,...W,width:l??C??W.width,height:l??C??W.height,stroke:o??p,strokeWidth:w,className:G("lucide",V,L),...!s&&!le(k)&&{"aria-hidden":"true"},...k},[...I.map(([v,U])=>fe(v,U)),...Array.isArray(s)?s:[s]])});var u=(o,l)=>{let f=Pe(({className:i,...L},s)=>Ae(re,{ref:s,iconNode:l,className:G(`lucide-${ue(z(o))}`,`lucide-${o}`,i),...L}));return f.displayName=z(o),f};var Be=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]],x=u("chart-column",Be);var Me=[["path",{d:"M9 17H7A5 5 0 0 1 7 7h2",key:"8i5ue5"}],["path",{d:"M15 7h2a5 5 0 1 1 0 10h-2",key:"1b9ql8"}],["line",{x1:"8",x2:"16",y1:"12",y2:"12",key:"1jonct"}]],A=u("link-2",Me);var De=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],m=u("loader-circle",De);var Fe=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],B=u("plus",Fe);var ye=[["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"}]],M=u("power-off",ye);var Re=[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]],D=u("power",Re);var be=[["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"}]],F=u("refresh-cw",be);var Te=[["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"}]],y=u("server",Te);var qe=[["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"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],R=u("shield-check",qe);var ve=[["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"}]],b=u("wifi-off",ve);var Ue=[["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"}]],T=u("wifi",Ue);var Oe=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],S=u("x",Oe);import{Fragment as We,jsx as a,jsxs as t}from"react/jsx-runtime";function X(){let[o,l]=r([]),[f,i]=r(!0),[L,s]=r(""),[I,k]=r("overview"),[q,C]=r({}),[n,E]=r(""),[p,V]=r(""),[w,v]=r(""),[U,K]=r([]),[Z,Q]=r(!1),[O,ie]=r(""),[h,N]=r(["",""]),[_,ce]=r(!0),[J,ne]=r(!1),[j,$]=r(""),[Y,ee]=r(!1),H=Ge(async()=>{i(!0),s("");try{let d=await(await g("/api/telegram/endpoints")).json();d.success?l(d.data):s(d.error||"\u83B7\u53D6\u6570\u636E\u5931\u8D25")}catch{s("\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u5668")}finally{i(!1)}},[]);He(()=>{H()},[H]);let pe=async(e,d)=>{C(c=>({...c,[e]:!0}));try{let c=d?"disconnect":"connect",te=await(await g(`/api/telegram/endpoints/${encodeURIComponent(e)}/${c}`,{method:"POST"})).json();te.success||s(te.error||"\u64CD\u4F5C\u5931\u8D25"),await H()}catch{s("\u64CD\u4F5C\u5931\u8D25")}finally{C(c=>({...c,[e]:!1}))}},me=async()=>{if(!(!n||!p)){v("");try{let d=await(await g(`/api/telegram/endpoints/${encodeURIComponent(n)}/invite`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({chat_id:p})})).json();d.success&&d.data?.invite_link?v(d.data.invite_link):s(d.error||"\u521B\u5EFA\u5931\u8D25")}catch{s("\u521B\u5EFA\u9080\u8BF7\u94FE\u63A5\u5931\u8D25")}}},Le=async()=>{if(!(!n||!p)){Q(!0),K([]);try{let d=await(await g(`/api/telegram/endpoints/${encodeURIComponent(n)}/admins?chat_id=${encodeURIComponent(p)}`)).json();d.success&&Array.isArray(d.data)?K(d.data):s(d.error||"\u83B7\u53D6\u7BA1\u7406\u5458\u5931\u8D25")}catch{s("\u83B7\u53D6\u7BA1\u7406\u5458\u5931\u8D25")}finally{Q(!1)}}},Ie=async()=>{if(!n||!p||!O)return;let e=h.filter(d=>d.trim());if(e.length<2){s("\u81F3\u5C11\u9700\u8981 2 \u4E2A\u9009\u9879");return}ee(!0),$("");try{let c=await(await g(`/api/telegram/endpoints/${encodeURIComponent(n)}/poll`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({chat_id:p,question:O,options:e,is_anonymous:_,allows_multiple:J})})).json();c.success?$(`\u6295\u7968\u5DF2\u53D1\u9001 (ID: ${c.data?.message_id??"\u672A\u77E5"})`):s(c.error||"\u53D1\u9001\u5931\u8D25")}catch{s("\u53D1\u9001\u6295\u7968\u5931\u8D25")}finally{ee(!1)}},ae=o.filter(e=>e.connected);return t("div",{className:"p-6 max-w-5xl mx-auto",children:[t("div",{className:"flex items-center justify-between mb-6",children:[t("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[a(y,{className:"w-6 h-6"})," Telegram \u673A\u5668\u4EBA"]}),t("button",{onClick:H,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(F,{className:`w-4 h-4 ${f?"animate-spin":""}`})," \u5237\u65B0"]})]}),L&&t("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:L}),a("button",{onClick:()=>s(""),className:"text-red-400 hover:text-red-600",children:a(S,{className:"w-4 h-4"})})]}),t("div",{className:"flex gap-1 mb-6 border-b",children:[a("button",{onClick:()=>k("overview"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${I==="overview"?"border-sky-500 text-sky-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:"\u6982\u89C8"}),a("button",{onClick:()=>k("actions"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${I==="actions"?"border-sky-500 text-sky-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:"\u5FEB\u6377\u64CD\u4F5C"})]}),I==="overview"&&t(We,{children:[!f&&!o.length&&!L&&a("div",{className:"text-center text-gray-500 py-12",children:"\u6682\u65E0 Telegram Endpoint \u5B9E\u4F8B"}),a("div",{className:"grid gap-4 md:grid-cols-2",children:o.map(e=>t("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[t("div",{className:"flex items-center justify-between mb-3",children:[a("span",{className:"font-medium text-lg",children:e.name}),e.connected?t("span",{className:"flex items-center gap-1 text-green-600 text-sm",children:[a(T,{className:"w-4 h-4"})," \u5728\u7EBF"]}):t("span",{className:"flex items-center gap-1 text-gray-400 text-sm",children:[a(b,{className:"w-4 h-4"})," \u79BB\u7EBF"]})]}),e.botInfo&&t("div",{className:"text-sm text-gray-500 mb-2",children:["@",e.botInfo.username," (",e.botInfo.firstName,")"]}),a("div",{className:"text-sm text-gray-600 mb-3",children:t("div",{className:"flex justify-between",children:[a("span",{children:"\u6A21\u5F0F"}),a("span",{className:"font-mono",children:e.mode})]})}),t("button",{onClick:()=>pe(e.name,e.connected),disabled:q[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:[q[e.name]?a(m,{className:"w-3.5 h-3.5 animate-spin"}):e.connected?a(M,{className:"w-3.5 h-3.5"}):a(D,{className:"w-3.5 h-3.5"}),e.connected?"\u65AD\u5F00":"\u8FDE\u63A5"]})]},e.name))})]}),I==="actions"&&t("div",{className:"space-y-6",children:[t("div",{className:"flex flex-wrap items-end gap-3",children:[t("div",{children:[a("label",{className:"block text-xs text-gray-500 mb-1",children:"\u673A\u5668\u4EBA"}),t("select",{value:n,onChange:e=>E(e.target.value),className:"border rounded px-2 py-1.5 text-sm min-w-[140px]",children:[a("option",{value:"",children:"--"}),ae.map(e=>a("option",{value:e.name,children:e.name},e.name))]})]}),t("div",{children:[a("label",{className:"block text-xs text-gray-500 mb-1",children:"Chat ID"}),a("input",{value:p,onChange:e=>V(e.target.value),placeholder:"-100xxxxxxxxxx",className:"border rounded px-2 py-1.5 text-sm w-[180px]"})]})]}),!ae.length&&a("div",{className:"text-center text-gray-500 py-4",children:"\u6682\u65E0\u5728\u7EBF Endpoint"}),n&&p&&t("div",{className:"grid gap-4 md:grid-cols-2",children:[t("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[t("h3",{className:"font-medium flex items-center gap-2 mb-3",children:[a(A,{className:"w-4 h-4 text-sky-500"})," \u521B\u5EFA\u9080\u8BF7\u94FE\u63A5"]}),a("button",{onClick:me,className:"px-3 py-1.5 rounded bg-sky-500 text-white text-sm hover:bg-sky-600",children:"\u751F\u6210\u94FE\u63A5"}),w&&a("div",{className:"mt-2 p-2 bg-gray-50 rounded text-sm break-all",children:a("a",{href:w,target:"_blank",rel:"noreferrer",className:"text-sky-600 hover:underline",children:w})})]}),t("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[t("h3",{className:"font-medium flex items-center gap-2 mb-3",children:[a(R,{className:"w-4 h-4 text-sky-500"})," \u7BA1\u7406\u5458\u5217\u8868"]}),t("button",{onClick:Le,disabled:Z,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:[Z&&a(m,{className:"w-3.5 h-3.5 animate-spin"})," \u67E5\u8BE2"]}),U.length>0&&a("div",{className:"mt-2 space-y-1",children:U.map(e=>t("div",{className:"flex items-center justify-between text-sm py-1 border-b last:border-0",children:[t("span",{children:[e.first_name," ",e.username?`(@${e.username})`:""]}),a("span",{className:"text-xs text-gray-400",children:e.status})]},e.user_id))})]}),t("div",{className:"border rounded-lg p-4 bg-card shadow-sm md:col-span-2",children:[t("h3",{className:"font-medium flex items-center gap-2 mb-3",children:[a(x,{className:"w-4 h-4 text-sky-500"})," \u53D1\u8D77\u6295\u7968"]}),t("div",{className:"space-y-2",children:[a("input",{value:O,onChange:e=>ie(e.target.value),placeholder:"\u6295\u7968\u95EE\u9898",className:"border rounded px-2 py-1.5 text-sm w-full"}),h.map((e,d)=>t("div",{className:"flex items-center gap-2",children:[a("input",{value:e,onChange:c=>{let P=[...h];P[d]=c.target.value,N(P)},placeholder:`\u9009\u9879 ${d+1}`,className:"border rounded px-2 py-1.5 text-sm flex-1"}),h.length>2&&a("button",{onClick:()=>N(h.filter((c,P)=>P!==d)),className:"text-gray-400 hover:text-red-500",children:a(S,{className:"w-4 h-4"})})]},d)),t("button",{onClick:()=>N([...h,""]),className:"flex items-center gap-1 text-sm text-sky-500 hover:text-sky-600",children:[a(B,{className:"w-3.5 h-3.5"})," \u6DFB\u52A0\u9009\u9879"]}),t("div",{className:"flex items-center gap-4 text-sm text-gray-600",children:[t("label",{className:"flex items-center gap-1",children:[a("input",{type:"checkbox",checked:_,onChange:e=>ce(e.target.checked)})," \u533F\u540D"]}),t("label",{className:"flex items-center gap-1",children:[a("input",{type:"checkbox",checked:J,onChange:e=>ne(e.target.checked)})," \u591A\u9009"]})]}),t("button",{onClick:Ie,disabled:Y||!O,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:[Y&&a(m,{className:"w-3.5 h-3.5 animate-spin"})," \u53D1\u9001\u6295\u7968"]}),j&&a("div",{className:"text-sm text-green-600",children:j})]})]})]})]})]})}function et(o){o.addRoute({path:"/telegram",name:"Telegram",element:o.React.createElement(X,{hostReact:o.React})}),o.addTool({id:"telegram",name:"Telegram",path:"/telegram"})}export{et 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/chart-column.mjs:
|
|
14
|
-
lucide-react/dist/esm/icons/link-2.mjs:
|
|
15
|
-
lucide-react/dist/esm/icons/loader-circle.mjs:
|
|
16
|
-
lucide-react/dist/esm/icons/plus.mjs:
|
|
17
|
-
lucide-react/dist/esm/icons/power-off.mjs:
|
|
18
|
-
lucide-react/dist/esm/icons/power.mjs:
|
|
19
|
-
lucide-react/dist/esm/icons/refresh-cw.mjs:
|
|
20
|
-
lucide-react/dist/esm/icons/server.mjs:
|
|
21
|
-
lucide-react/dist/esm/icons/shield-check.mjs:
|
|
22
|
-
lucide-react/dist/esm/icons/wifi-off.mjs:
|
|
23
|
-
lucide-react/dist/esm/icons/wifi.mjs:
|
|
24
|
-
lucide-react/dist/esm/icons/x.mjs:
|
|
25
|
-
lucide-react/dist/esm/lucide-react.mjs:
|
|
26
|
-
(**
|
|
27
|
-
* @license lucide-react v1.23.0 - ISC
|
|
28
|
-
*
|
|
29
|
-
* This source code is licensed under the ISC license.
|
|
30
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
31
|
-
*)
|
|
32
|
-
*/
|
|
@@ -1,20 +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 { getTelegramAgentDeps } from '../../src/telegram-agent-deps.js';
|
|
5
|
-
export default defineTool({
|
|
6
|
-
description: '创建 Telegram 群组邀请链接',
|
|
7
|
-
inputSchema: z.object({
|
|
8
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
9
|
-
chat_id: z.string().describe('聊天 ID'),
|
|
10
|
-
}),
|
|
11
|
-
platforms: ['telegram'],
|
|
12
|
-
tags: ['telegram'],
|
|
13
|
-
permissions: [platformPermit('chat_administrator')],
|
|
14
|
-
async execute({ endpoint_id, chat_id }) {
|
|
15
|
-
const endpoint = getTelegramAgentDeps().getEndpoint(endpoint_id);
|
|
16
|
-
const link = await endpoint.createInviteLink(Number(chat_id));
|
|
17
|
-
return { invite_link: link, message: `邀请链接: ${link}` };
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
//# sourceMappingURL=create_invite.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create_invite.js","sourceRoot":"","sources":["../../../agent/tools/create_invite.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,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,eAAe,UAAU,CAA2C;IAClE,WAAW,EAAE,oBAAoB;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACtC,CAAC;IACF,SAAS,EAAE,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,WAAW,EAAE,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;IACnD,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAA6C;QAC/E,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9D,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC;IACzD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getTelegramAgentDeps } from '../../src/telegram-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '获取 Telegram 群组管理员列表',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
chat_id: z.string().describe('聊天 ID'),
|
|
9
|
-
}),
|
|
10
|
-
platforms: ['telegram'],
|
|
11
|
-
tags: ['telegram'],
|
|
12
|
-
async execute({ endpoint_id, chat_id }) {
|
|
13
|
-
const endpoint = getTelegramAgentDeps().getEndpoint(endpoint_id);
|
|
14
|
-
const admins = await endpoint.getChatAdmins(Number(chat_id));
|
|
15
|
-
return {
|
|
16
|
-
admins: admins.map((a) => ({
|
|
17
|
-
user_id: a.user.id,
|
|
18
|
-
username: a.user.username,
|
|
19
|
-
first_name: a.user.first_name,
|
|
20
|
-
status: a.status,
|
|
21
|
-
})),
|
|
22
|
-
count: admins.length,
|
|
23
|
-
};
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
//# sourceMappingURL=list_admins.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list_admins.js","sourceRoot":"","sources":["../../../agent/tools/list_admins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,eAAe,UAAU,CAA2C;IAClE,WAAW,EAAE,qBAAqB;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACtC,CAAC;IACF,SAAS,EAAE,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAA6C;QAC/E,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmF,EAAE,EAAE,CAAC,CAAC;gBAC3G,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE;gBAClB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACzB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU;gBAC7B,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC;YACH,KAAK,EAAE,MAAM,CAAC,MAAM;SACrB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getTelegramAgentDeps } from '../../src/telegram-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '获取 Telegram 群组成员数量',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
chat_id: z.string().describe('聊天 ID'),
|
|
9
|
-
}),
|
|
10
|
-
platforms: ['telegram'],
|
|
11
|
-
tags: ['telegram'],
|
|
12
|
-
async execute({ endpoint_id, chat_id }) {
|
|
13
|
-
const endpoint = getTelegramAgentDeps().getEndpoint(endpoint_id);
|
|
14
|
-
const count = await endpoint.getChatMemberCount(Number(chat_id));
|
|
15
|
-
return { count, message: `群组共有 ${count} 名成员` };
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
//# sourceMappingURL=member_count.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"member_count.js","sourceRoot":"","sources":["../../../agent/tools/member_count.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,eAAe,UAAU,CAA2C;IAClE,WAAW,EAAE,oBAAoB;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACtC,CAAC;IACF,SAAS,EAAE,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAA6C;QAC/E,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACjE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,CAAC;IACjD,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 { getTelegramAgentDeps } from '../../src/telegram-agent-deps.js';
|
|
5
|
-
export default defineTool({
|
|
6
|
-
description: '置顶 Telegram 群组消息',
|
|
7
|
-
inputSchema: z.object({
|
|
8
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
9
|
-
chat_id: z.string().describe('聊天 ID'),
|
|
10
|
-
message_id: z.string().describe('消息 ID'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['telegram'],
|
|
13
|
-
tags: ['telegram'],
|
|
14
|
-
permissions: [platformPermit('pin_messages')],
|
|
15
|
-
async execute({ endpoint_id, chat_id, message_id }) {
|
|
16
|
-
const endpoint = getTelegramAgentDeps().getEndpoint(endpoint_id);
|
|
17
|
-
const success = await endpoint.pinMessage(Number(chat_id), Number(message_id));
|
|
18
|
-
return { success, message: success ? '消息已置顶' : '操作失败' };
|
|
19
|
-
},
|
|
20
|
-
});
|
|
21
|
-
//# sourceMappingURL=pin_message.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pin_message.js","sourceRoot":"","sources":["../../../agent/tools/pin_message.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,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,eAAe,UAAU,CAA+D;IACtF,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,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACzC,CAAC;IACF,SAAS,EAAE,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,WAAW,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC7C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAiE;QAC/G,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1D,CAAC;CACF,CAAC,CAAC"}
|
package/lib/agent/tools/react.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getTelegramAgentDeps } from '../../src/telegram-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '对 Telegram 消息添加表情反应',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
chat_id: z.string().describe('聊天 ID'),
|
|
9
|
-
message_id: z.string().describe('消息 ID'),
|
|
10
|
-
reaction: z.string().describe('反应表情(如 👍、❤️、🔥)'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['telegram'],
|
|
13
|
-
tags: ['telegram'],
|
|
14
|
-
async execute({ endpoint_id, chat_id, message_id, reaction }) {
|
|
15
|
-
const endpoint = getTelegramAgentDeps().getEndpoint(endpoint_id);
|
|
16
|
-
const success = await endpoint.setMessageReaction(Number(chat_id), Number(message_id), reaction);
|
|
17
|
-
return { success, message: success ? `已添加反应 ${reaction}` : '操作失败' };
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
//# sourceMappingURL=react.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../../agent/tools/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,eAAe,UAAU,CAAiF;IACxG,WAAW,EAAE,qBAAqB;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAClD,CAAC;IACF,SAAS,EAAE,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAmF;QAC3I,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACtE,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getTelegramAgentDeps } from '../../src/telegram-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '在 Telegram 群组中发起投票',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
chat_id: z.string().describe('聊天 ID'),
|
|
9
|
-
question: z.string().describe('投票问题'),
|
|
10
|
-
options: z.string().describe('选项 JSON 数组,如 ["A","B","C"]'),
|
|
11
|
-
is_anonymous: z.boolean().optional().describe('是否匿名投票,默认 true'),
|
|
12
|
-
allows_multiple: z.boolean().optional().describe('是否允许多选,默认 false'),
|
|
13
|
-
}),
|
|
14
|
-
platforms: ['telegram'],
|
|
15
|
-
tags: ['telegram'],
|
|
16
|
-
async execute({ endpoint_id, chat_id, question, options, is_anonymous, allows_multiple }) {
|
|
17
|
-
const endpoint = getTelegramAgentDeps().getEndpoint(endpoint_id);
|
|
18
|
-
let optList;
|
|
19
|
-
try {
|
|
20
|
-
optList = JSON.parse(options);
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
return { success: false, message: 'options 格式错误,应为 JSON 数组' };
|
|
24
|
-
}
|
|
25
|
-
if (!Array.isArray(optList) || optList.length < 2) {
|
|
26
|
-
return { success: false, message: '至少需要 2 个选项' };
|
|
27
|
-
}
|
|
28
|
-
const result = await endpoint.sendPoll(Number(chat_id), question, optList, is_anonymous ?? true, allows_multiple ?? false);
|
|
29
|
-
return { success: true, message_id: result.message_id, message: '投票已发送' };
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
//# sourceMappingURL=send_poll.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"send_poll.js","sourceRoot":"","sources":["../../../agent/tools/send_poll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,eAAe,UAAU,CAAiI;IACxJ,WAAW,EAAE,oBAAoB;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAC1D,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC/D,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;KACpE,CAAC;IACF,SAAS,EAAE,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAmI;QACvN,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QACnD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CACpC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAClC,YAAY,IAAI,IAAI,EAAE,eAAe,IAAI,KAAK,CAC/C,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC5E,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getTelegramAgentDeps } from '../../src/telegram-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '发送 Telegram 贴纸',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
chat_id: z.string().describe('聊天 ID'),
|
|
9
|
-
sticker: z.string().describe('贴纸 file_id 或 URL'),
|
|
10
|
-
}),
|
|
11
|
-
platforms: ['telegram'],
|
|
12
|
-
tags: ['telegram'],
|
|
13
|
-
async execute({ endpoint_id, chat_id, sticker }) {
|
|
14
|
-
const endpoint = getTelegramAgentDeps().getEndpoint(endpoint_id);
|
|
15
|
-
const result = await endpoint.sendStickerMessage(Number(chat_id), sticker);
|
|
16
|
-
return { success: true, message_id: result.message_id, message: '贴纸已发送' };
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
//# sourceMappingURL=send_sticker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"send_sticker.js","sourceRoot":"","sources":["../../../agent/tools/send_sticker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,eAAe,UAAU,CAA4D;IACnF,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KACjD,CAAC;IACF,SAAS,EAAE,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAA8D;QACzG,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC5E,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getTelegramAgentDeps } from '../../src/telegram-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '设置 Telegram 群组描述',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
chat_id: z.string().describe('聊天 ID'),
|
|
9
|
-
description: z.string().describe('群描述文字'),
|
|
10
|
-
}),
|
|
11
|
-
platforms: ['telegram'],
|
|
12
|
-
tags: ['telegram'],
|
|
13
|
-
async execute({ endpoint_id, chat_id, description }) {
|
|
14
|
-
const endpoint = getTelegramAgentDeps().getEndpoint(endpoint_id);
|
|
15
|
-
const success = await endpoint.setChatDescription(Number(chat_id), description);
|
|
16
|
-
return { success, message: success ? '群描述已更新' : '操作失败' };
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
//# sourceMappingURL=set_description.js.map
|