@zshuangmu/agenthub 0.1.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/LICENSE +21 -0
- package/README.md +176 -0
- package/package.json +41 -0
- package/src/api-server.js +195 -0
- package/src/cli.js +343 -0
- package/src/commands/api.js +8 -0
- package/src/commands/info.js +6 -0
- package/src/commands/install.js +10 -0
- package/src/commands/list.js +91 -0
- package/src/commands/pack.js +151 -0
- package/src/commands/publish-remote.js +9 -0
- package/src/commands/publish.js +7 -0
- package/src/commands/rollback.js +64 -0
- package/src/commands/search.js +7 -0
- package/src/commands/serve.js +9 -0
- package/src/commands/stats.js +90 -0
- package/src/commands/update.js +68 -0
- package/src/commands/versions.js +63 -0
- package/src/commands/web.js +8 -0
- package/src/index.js +14 -0
- package/src/lib/bundle-transfer.js +58 -0
- package/src/lib/database.js +244 -0
- package/src/lib/download-stats.js +77 -0
- package/src/lib/fs-utils.js +46 -0
- package/src/lib/html.js +1730 -0
- package/src/lib/http.js +24 -0
- package/src/lib/install.js +14 -0
- package/src/lib/manifest.js +123 -0
- package/src/lib/openclaw-config.js +40 -0
- package/src/lib/registry.js +64 -0
- package/src/lib/security-scanner.js +233 -0
- package/src/lib/skill-md.js +17 -0
- package/src/server.js +158 -0
- package/src/web-server.js +138 -0
package/src/lib/html.js
ADDED
|
@@ -0,0 +1,1730 @@
|
|
|
1
|
+
// i18n translations
|
|
2
|
+
const i18n = {
|
|
3
|
+
en: {
|
|
4
|
+
title: "AgentHub - AI Agent Open Source Community",
|
|
5
|
+
navHome: "Home",
|
|
6
|
+
navStats: "Stats",
|
|
7
|
+
heroTitle: "AgentHub",
|
|
8
|
+
heroSubtitle: "The Open Source Marketplace for AI Agents. Package and upload your Agent's full capabilities in one command, download and gain those powers with one click.",
|
|
9
|
+
statAgents: "Available Agents",
|
|
10
|
+
statDownloads: "Total Downloads",
|
|
11
|
+
statOpenSource: "Open Source",
|
|
12
|
+
feature1Title: "Ready to Use",
|
|
13
|
+
feature1Desc: "Skip complex configurations, get battle-tested AI Agent setups",
|
|
14
|
+
feature2Title: "Instant Deploy",
|
|
15
|
+
feature2Desc: "One-click install, deploy in minutes, start working immediately",
|
|
16
|
+
feature3Title: "Version Control",
|
|
17
|
+
feature3Desc: "Auto-update pushes, always stay with the latest capabilities",
|
|
18
|
+
apiBoxTitle: "AI Auto-Discovery API",
|
|
19
|
+
apiBoxDesc: "Let your AI assistant automatically discover and install Agents",
|
|
20
|
+
sectionHotAgents: "Hot Agents",
|
|
21
|
+
sectionViewAll: "View All โ",
|
|
22
|
+
searchPlaceholder: "Search Agents, skills, tags...",
|
|
23
|
+
searchButton: "Search",
|
|
24
|
+
downloads: "downloads",
|
|
25
|
+
install: "Install",
|
|
26
|
+
howToUse: "How to Use",
|
|
27
|
+
step1Title: "Browse & Discover",
|
|
28
|
+
step1Desc: "Find the Agent that fits your workflow",
|
|
29
|
+
step2Title: "One-Click Install",
|
|
30
|
+
step2Desc: "Run the install command, deploy in minutes",
|
|
31
|
+
step3Title: "Start Working",
|
|
32
|
+
step3Desc: "Your AI assistant is ready, start delegating tasks",
|
|
33
|
+
noAgents: "No Agents yet",
|
|
34
|
+
noAgentsHint: "Use <code>agenthub pack</code> to package your first Agent!",
|
|
35
|
+
// Detail page
|
|
36
|
+
backToHome: "โ Back to Home",
|
|
37
|
+
detailVersion: "Version",
|
|
38
|
+
detailRuntime: "Runtime",
|
|
39
|
+
detailDownloads: "Downloads",
|
|
40
|
+
detailAuthor: "Author",
|
|
41
|
+
detailInstall: "Install Command",
|
|
42
|
+
personaTitle: "๐ญ Personality",
|
|
43
|
+
personaTraits: "Traits",
|
|
44
|
+
personaExpertise: "Expertise",
|
|
45
|
+
memoryTitle: "๐ง Memory Config",
|
|
46
|
+
memoryPublic: "Public",
|
|
47
|
+
memoryPortable: "Portable",
|
|
48
|
+
memoryPrivate: "Private",
|
|
49
|
+
memoryNoData: "No memory data",
|
|
50
|
+
skillsTitle: "๐ง Skills",
|
|
51
|
+
tagsTitle: "๐ท๏ธ Tags",
|
|
52
|
+
requirementsTitle: "โ๏ธ System Requirements",
|
|
53
|
+
requirementsNone: "No special requirements",
|
|
54
|
+
requirementsEnv: "๐ Environment variables required:",
|
|
55
|
+
requirementsModel: "๐ค Recommended model:",
|
|
56
|
+
requirementsRuntime: "โก Runtime version:",
|
|
57
|
+
installMethodTitle: "๐ฅ Installation",
|
|
58
|
+
installMethodDesc: "Run in your workspace:",
|
|
59
|
+
// Stats page
|
|
60
|
+
statsTitle: "Statistics Center - AgentHub",
|
|
61
|
+
statsHeader: "๐ Statistics Center",
|
|
62
|
+
statsDesc: "AgentHub download statistics and data analysis",
|
|
63
|
+
statsTotalAgents: "Agent Count",
|
|
64
|
+
statsTotalDownloads: "Total Downloads",
|
|
65
|
+
statsTotalLogs: "Download Logs",
|
|
66
|
+
rankingTitle: "๐ Download Ranking",
|
|
67
|
+
rankingAgent: "Agent",
|
|
68
|
+
rankingDownloads: "Downloads",
|
|
69
|
+
rankingLastDownload: "Last Download",
|
|
70
|
+
rankingRank: "Rank",
|
|
71
|
+
recentTitle: "๐ Recent Downloads",
|
|
72
|
+
recentAgent: "Agent",
|
|
73
|
+
recentTime: "Time",
|
|
74
|
+
recentTarget: "Target Path",
|
|
75
|
+
noData: "No data",
|
|
76
|
+
// Tags
|
|
77
|
+
tagOps: "ops",
|
|
78
|
+
tagEngineering: "engineering",
|
|
79
|
+
tagContent: "content",
|
|
80
|
+
tagProduct: "product",
|
|
81
|
+
tagDefault: "default",
|
|
82
|
+
},
|
|
83
|
+
zh: {
|
|
84
|
+
title: "AgentHub - AI Agent ๅผๆบ็คพๅบ",
|
|
85
|
+
navHome: "้ฆ้กต",
|
|
86
|
+
navStats: "็ป่ฎก",
|
|
87
|
+
heroTitle: "AgentHub",
|
|
88
|
+
heroSubtitle: "AI Agent ็ๅผๆบๅบ็จๅธๅบใไธๅฅ่ฏๆๅ
ไธไผ Agent ็ๅ
จ้จ่ฝๅ๏ผไธ้ฎไธ่ฝฝ่ทๅพ่ฟไบๅๅใ",
|
|
89
|
+
statAgents: "ๅฏ็จ Agent",
|
|
90
|
+
statDownloads: "็ดฏ่ฎกไธ่ฝฝ",
|
|
91
|
+
statOpenSource: "ๅผๆบๅ
่ดน",
|
|
92
|
+
feature1Title: "ๅผ็ฎฑๅณ็จ",
|
|
93
|
+
feature1Desc: "่ทณ่ฟ็น็็้
็ฝฎ๏ผ่ทๅ็ป่ฟๅฎๆ้ช่ฏ็ AI Agent ้
็ฝฎ",
|
|
94
|
+
feature2Title: "ๅณ่ฃ
ๅณ็จ",
|
|
95
|
+
feature2Desc: "ไธ้ฎๅฎ่ฃ
๏ผๅ ๅ้ๅ
้จ็ฝฒๅฎๆ๏ผ็ซๅณๅผๅงๅทฅไฝ",
|
|
96
|
+
feature3Title: "็ๆฌ็ฎก็",
|
|
97
|
+
feature3Desc: "่ชๅจๆดๆฐๆจ้๏ผๅง็ปไฟๆๆๆฐ่ฝๅ",
|
|
98
|
+
apiBoxTitle: "๐ค AI ่ชๅจๅ็ฐ API",
|
|
99
|
+
apiBoxDesc: "่ฎฉไฝ ็ AI ๅฉๆ่ชๅจๅ็ฐๅนถๅฎ่ฃ
Agent",
|
|
100
|
+
sectionHotAgents: "็ญ้จ Agent",
|
|
101
|
+
sectionViewAll: "ๆฅ็ๅ
จ้จ โ",
|
|
102
|
+
searchPlaceholder: "ๆ็ดข Agentใๆ่ฝใๆ ็ญพ...",
|
|
103
|
+
searchButton: "ๆ็ดข",
|
|
104
|
+
downloads: "ๆฌกไธ่ฝฝ",
|
|
105
|
+
install: "ๅฎ่ฃ
",
|
|
106
|
+
howToUse: "ๅฆไฝไฝฟ็จ",
|
|
107
|
+
step1Title: "ๆต่งๅ็ฐ",
|
|
108
|
+
step1Desc: "ๆพๅฐ้ๅไฝ ๅทฅไฝๆต็จ็ Agent",
|
|
109
|
+
step2Title: "ไธ้ฎๅฎ่ฃ
",
|
|
110
|
+
step2Desc: "่ฟ่กๅฎ่ฃ
ๅฝไปค๏ผๅ ๅ้ๅ
้จ็ฝฒๅฎๆ",
|
|
111
|
+
step3Title: "ๅผๅงๅทฅไฝ",
|
|
112
|
+
step3Desc: "ไฝ ็ AI ๅฉๆๅทฒๅฐฑ็ปช๏ผ็ซๅณๅผๅงๅงๆไปปๅก",
|
|
113
|
+
noAgents: "ๆๆ Agent",
|
|
114
|
+
noAgentsHint: "ไฝฟ็จ <code>agenthub pack</code> ๆๅ
ไฝ ็็ฌฌไธไธช Agent ๅง๏ผ",
|
|
115
|
+
// Detail page
|
|
116
|
+
backToHome: "โ ่ฟๅ้ฆ้กต",
|
|
117
|
+
detailVersion: "็ๆฌ",
|
|
118
|
+
detailRuntime: "่ฟ่กๆถ",
|
|
119
|
+
detailDownloads: "ไธ่ฝฝๆฌกๆฐ",
|
|
120
|
+
detailAuthor: "ไฝ่
",
|
|
121
|
+
detailInstall: "ๅฎ่ฃ
ๅฝไปค",
|
|
122
|
+
personaTitle: "๐ญ ๆงๆ ผ็ฎไป",
|
|
123
|
+
personaTraits: "็น่ดจ",
|
|
124
|
+
personaExpertise: "ไธ้ฟ",
|
|
125
|
+
memoryTitle: "๐ง ่ฎฐๅฟ้
็ฝฎ",
|
|
126
|
+
memoryPublic: "ๅ
ฌๅผ",
|
|
127
|
+
memoryPortable: "ๅฏ็งปๆค",
|
|
128
|
+
memoryPrivate: "็งๆ",
|
|
129
|
+
memoryNoData: "ๆๆ ่ฎฐๅฟๆฐๆฎ",
|
|
130
|
+
skillsTitle: "๐ง ๆ่ฝ",
|
|
131
|
+
tagsTitle: "๐ท๏ธ ๆ ็ญพ",
|
|
132
|
+
requirementsTitle: "โ๏ธ ็ณป็ป่ฆๆฑ",
|
|
133
|
+
requirementsNone: "ๆ ็นๆฎ่ฆๆฑ",
|
|
134
|
+
requirementsEnv: "๐ ้่ฆ้
็ฝฎ็ฏๅขๅ้:",
|
|
135
|
+
requirementsModel: "๐ค ๆจ่ๆจกๅ:",
|
|
136
|
+
requirementsRuntime: "โก ่ฟ่กๆถ็ๆฌ:",
|
|
137
|
+
installMethodTitle: "๐ฅ ๅฎ่ฃ
ๆนๅผ",
|
|
138
|
+
installMethodDesc: "ๅจไฝ ็ๅทฅไฝๅบ่ฟ่ก๏ผ",
|
|
139
|
+
// Stats page
|
|
140
|
+
statsTitle: "็ป่ฎกไธญๅฟ - AgentHub",
|
|
141
|
+
statsHeader: "๐ ็ป่ฎกไธญๅฟ",
|
|
142
|
+
statsDesc: "AgentHub ไธ่ฝฝ็ป่ฎกไธๆฐๆฎๅๆ",
|
|
143
|
+
statsTotalAgents: "Agent ๆฐ้",
|
|
144
|
+
statsTotalDownloads: "็ดฏ่ฎกไธ่ฝฝ",
|
|
145
|
+
statsTotalLogs: "ไธ่ฝฝ่ฎฐๅฝ",
|
|
146
|
+
rankingTitle: "๐ ไธ่ฝฝๆ่กๆฆ",
|
|
147
|
+
rankingAgent: "Agent",
|
|
148
|
+
rankingDownloads: "ไธ่ฝฝๆฌกๆฐ",
|
|
149
|
+
rankingLastDownload: "ๆๅไธ่ฝฝ",
|
|
150
|
+
rankingRank: "ๆๅ",
|
|
151
|
+
recentTitle: "๐ ๆ่ฟไธ่ฝฝ",
|
|
152
|
+
recentAgent: "Agent",
|
|
153
|
+
recentTime: "ๆถ้ด",
|
|
154
|
+
recentTarget: "็ฎๆ ่ทฏๅพ",
|
|
155
|
+
noData: "ๆๆ ๆฐๆฎ",
|
|
156
|
+
// Tags
|
|
157
|
+
tagOps: "่ฟ็ปด",
|
|
158
|
+
tagEngineering: "ๅทฅ็จ",
|
|
159
|
+
tagContent: "ๅ
ๅฎน",
|
|
160
|
+
tagProduct: "ไบงๅ",
|
|
161
|
+
tagDefault: "้ป่ฎค",
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
// Language toggle script
|
|
166
|
+
const langScript = `
|
|
167
|
+
<script>
|
|
168
|
+
(function() {
|
|
169
|
+
const defaultLang = 'en';
|
|
170
|
+
const savedLang = localStorage.getItem('agenthub-lang') || defaultLang;
|
|
171
|
+
|
|
172
|
+
function setLang(lang) {
|
|
173
|
+
localStorage.setItem('agenthub-lang', lang);
|
|
174
|
+
document.querySelectorAll('[data-i18n]').forEach(el => {
|
|
175
|
+
const key = el.getAttribute('data-i18n');
|
|
176
|
+
if (window.i18n && window.i18n[lang] && window.i18n[lang][key]) {
|
|
177
|
+
el.textContent = window.i18n[lang][key];
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
|
|
181
|
+
const key = el.getAttribute('data-i18n-placeholder');
|
|
182
|
+
if (window.i18n && window.i18n[lang] && window.i18n[lang][key]) {
|
|
183
|
+
el.placeholder = window.i18n[lang][key];
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
// Update active button
|
|
187
|
+
document.querySelectorAll('.lang-btn').forEach(btn => {
|
|
188
|
+
btn.classList.toggle('active', btn.dataset.lang === lang);
|
|
189
|
+
});
|
|
190
|
+
// Update html lang attribute
|
|
191
|
+
document.documentElement.lang = lang === 'zh' ? 'zh-CN' : 'en';
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Theme toggle function
|
|
195
|
+
function setTheme(theme) {
|
|
196
|
+
localStorage.setItem('agenthub-theme', theme);
|
|
197
|
+
document.documentElement.setAttribute('data-theme', theme);
|
|
198
|
+
// Update theme button icon
|
|
199
|
+
const themeBtn = document.querySelector('.theme-btn');
|
|
200
|
+
if (themeBtn) {
|
|
201
|
+
themeBtn.textContent = theme === 'dark' ? 'โ๏ธ' : '๐';
|
|
202
|
+
themeBtn.setAttribute('aria-label', theme === 'dark' ? 'Switch to light mode' : 'Switch to dark mode');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function toggleTheme() {
|
|
207
|
+
const currentTheme = localStorage.getItem('agenthub-theme') || 'light';
|
|
208
|
+
setTheme(currentTheme === 'dark' ? 'light' : 'dark');
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
window.setLang = setLang;
|
|
212
|
+
window.toggleTheme = toggleTheme;
|
|
213
|
+
window.i18n = ${JSON.stringify(i18n)};
|
|
214
|
+
|
|
215
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
216
|
+
setLang(savedLang);
|
|
217
|
+
// Initialize theme (default to light)
|
|
218
|
+
const savedTheme = localStorage.getItem('agenthub-theme') || 'light';
|
|
219
|
+
setTheme(savedTheme);
|
|
220
|
+
|
|
221
|
+
// Initialize copy buttons
|
|
222
|
+
document.querySelectorAll('.api-code, .detail-install').forEach(el => {
|
|
223
|
+
el.addEventListener('click', async (e) => {
|
|
224
|
+
const codeText = el.querySelector('.code-text');
|
|
225
|
+
const text = codeText ? codeText.textContent.trim() : el.textContent.trim();
|
|
226
|
+
const btn = el.querySelector('.copy-btn');
|
|
227
|
+
|
|
228
|
+
try {
|
|
229
|
+
await navigator.clipboard.writeText(text);
|
|
230
|
+
if (btn) {
|
|
231
|
+
btn.textContent = 'โ';
|
|
232
|
+
btn.classList.add('copied');
|
|
233
|
+
setTimeout(() => {
|
|
234
|
+
btn.textContent = '๐';
|
|
235
|
+
btn.classList.remove('copied');
|
|
236
|
+
}, 2000);
|
|
237
|
+
}
|
|
238
|
+
} catch (err) {
|
|
239
|
+
console.error('Copy failed:', err);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
})();
|
|
245
|
+
</script>
|
|
246
|
+
`;
|
|
247
|
+
|
|
248
|
+
function page(title, body, options = {}) {
|
|
249
|
+
const {
|
|
250
|
+
description = "AgentHub - The Open Source Marketplace for AI Agents. Package and upload your Agent's full capabilities in one command, download and gain those powers with one click.",
|
|
251
|
+
url = "https://agenthub.cyou/",
|
|
252
|
+
type = "website",
|
|
253
|
+
image = "https://agenthub.cyou/og-image.png"
|
|
254
|
+
} = options;
|
|
255
|
+
|
|
256
|
+
return `<!doctype html>
|
|
257
|
+
<html lang="en">
|
|
258
|
+
<head>
|
|
259
|
+
<meta charset="utf-8" />
|
|
260
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
261
|
+
<title>${title}</title>
|
|
262
|
+
|
|
263
|
+
<!-- SEO Meta -->
|
|
264
|
+
<meta name="description" content="${description}">
|
|
265
|
+
<meta name="keywords" content="AI Agent, AgentHub, OpenClaw, AI marketplace, agent packaging, artificial intelligence, open source">
|
|
266
|
+
<meta name="author" content="AgentHub Team">
|
|
267
|
+
<meta name="robots" content="index, follow">
|
|
268
|
+
<link rel="canonical" href="${url}">
|
|
269
|
+
|
|
270
|
+
<!-- Open Graph -->
|
|
271
|
+
<meta property="og:type" content="${type}">
|
|
272
|
+
<meta property="og:title" content="${title}">
|
|
273
|
+
<meta property="og:description" content="${description}">
|
|
274
|
+
<meta property="og:url" content="${url}">
|
|
275
|
+
<meta property="og:image" content="${image}">
|
|
276
|
+
<meta property="og:site_name" content="AgentHub">
|
|
277
|
+
<meta property="og:locale" content="en_US">
|
|
278
|
+
<meta property="og:locale:alternate" content="zh_CN">
|
|
279
|
+
|
|
280
|
+
<!-- Twitter Card -->
|
|
281
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
282
|
+
<meta name="twitter:title" content="${title}">
|
|
283
|
+
<meta name="twitter:description" content="${description}">
|
|
284
|
+
<meta name="twitter:image" content="${image}">
|
|
285
|
+
|
|
286
|
+
<!-- JSON-LD Structured Data -->
|
|
287
|
+
<script type="application/ld+json">
|
|
288
|
+
{
|
|
289
|
+
"@context": "https://schema.org",
|
|
290
|
+
"@type": "WebSite",
|
|
291
|
+
"name": "AgentHub",
|
|
292
|
+
"url": "https://agenthub.cyou/",
|
|
293
|
+
"description": "${description.replace(/"/g, '\\"')}",
|
|
294
|
+
"potentialAction": {
|
|
295
|
+
"@type": "SearchAction",
|
|
296
|
+
"target": "https://agenthub.cyou/?q={search_term_string}",
|
|
297
|
+
"query-input": "required name=search_term_string"
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
</script>
|
|
301
|
+
|
|
302
|
+
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>๐ฆ</text></svg>">
|
|
303
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
304
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
305
|
+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@500;700&family=Inter:wght@400;500;600;700&family=Noto+Sans+SC:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
306
|
+
<style>
|
|
307
|
+
/* Light theme (default) */
|
|
308
|
+
:root {
|
|
309
|
+
--font-display: 'JetBrains Mono', monospace;
|
|
310
|
+
--font-body: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
311
|
+
--bg-primary: #fafafa;
|
|
312
|
+
--bg-secondary: #f0f0f0;
|
|
313
|
+
--bg-card: #ffffff;
|
|
314
|
+
--bg-card-hover: #f8f8f8;
|
|
315
|
+
--bg-code: #f4f4f5;
|
|
316
|
+
--text-primary: #18181b;
|
|
317
|
+
--text-secondary: #52525b;
|
|
318
|
+
--text-muted: #a1a1aa;
|
|
319
|
+
--accent: #00d68f;
|
|
320
|
+
--accent-light: #00e6a0;
|
|
321
|
+
--accent-dark: #00b377;
|
|
322
|
+
--accent-glow: rgba(0, 214, 143, 0.15);
|
|
323
|
+
--border: #e4e4e7;
|
|
324
|
+
--header-bg: rgba(250, 250, 250, 0.92);
|
|
325
|
+
--tag-ops: #8b5cf6;
|
|
326
|
+
--tag-engineering: #3b82f6;
|
|
327
|
+
--tag-content: #f59e0b;
|
|
328
|
+
--tag-product: #ec4899;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/* Dark theme - Enhanced */
|
|
332
|
+
[data-theme="dark"] {
|
|
333
|
+
--bg-primary: #09090b;
|
|
334
|
+
--bg-secondary: #18181b;
|
|
335
|
+
--bg-card: #1c1c1f;
|
|
336
|
+
--bg-card-hover: #242427;
|
|
337
|
+
--bg-code: #18181b;
|
|
338
|
+
--text-primary: #fafafa;
|
|
339
|
+
--text-secondary: #a1a1aa;
|
|
340
|
+
--text-muted: #71717a;
|
|
341
|
+
--accent: #00e6a0;
|
|
342
|
+
--accent-light: #34d399;
|
|
343
|
+
--accent-dark: #00d68f;
|
|
344
|
+
--accent-glow: rgba(0, 230, 160, 0.12);
|
|
345
|
+
--border: #27272a;
|
|
346
|
+
--header-bg: rgba(9, 9, 11, 0.92);
|
|
347
|
+
}
|
|
348
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
349
|
+
body {
|
|
350
|
+
font-family: var(--font-body);
|
|
351
|
+
background: var(--bg-primary);
|
|
352
|
+
color: var(--text-primary);
|
|
353
|
+
line-height: 1.6;
|
|
354
|
+
min-height: 100vh;
|
|
355
|
+
-webkit-font-smoothing: antialiased;
|
|
356
|
+
-moz-osx-font-smoothing: grayscale;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/* Subtle background texture */
|
|
360
|
+
body::before {
|
|
361
|
+
content: '';
|
|
362
|
+
position: fixed;
|
|
363
|
+
inset: 0;
|
|
364
|
+
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.02'/%3E%3C/svg%3E");
|
|
365
|
+
pointer-events: none;
|
|
366
|
+
z-index: -1;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/* Animations */
|
|
370
|
+
@keyframes fadeInUp {
|
|
371
|
+
from { opacity: 0; transform: translateY(16px); }
|
|
372
|
+
to { opacity: 1; transform: translateY(0); }
|
|
373
|
+
}
|
|
374
|
+
@keyframes fadeIn {
|
|
375
|
+
from { opacity: 0; }
|
|
376
|
+
to { opacity: 1; }
|
|
377
|
+
}
|
|
378
|
+
a { color: inherit; text-decoration: none; }
|
|
379
|
+
.container {
|
|
380
|
+
max-width: 1200px;
|
|
381
|
+
margin: 0 auto;
|
|
382
|
+
padding: 0 24px;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/* Header */
|
|
386
|
+
header {
|
|
387
|
+
border-bottom: 1px solid var(--border);
|
|
388
|
+
padding: 16px 0;
|
|
389
|
+
position: sticky;
|
|
390
|
+
top: 0;
|
|
391
|
+
background: var(--header-bg);
|
|
392
|
+
backdrop-filter: blur(12px);
|
|
393
|
+
-webkit-backdrop-filter: blur(12px);
|
|
394
|
+
z-index: 100;
|
|
395
|
+
animation: fadeIn 0.4s ease-out;
|
|
396
|
+
}
|
|
397
|
+
.header-content {
|
|
398
|
+
display: flex;
|
|
399
|
+
align-items: center;
|
|
400
|
+
justify-content: space-between;
|
|
401
|
+
}
|
|
402
|
+
.logo {
|
|
403
|
+
display: flex;
|
|
404
|
+
align-items: center;
|
|
405
|
+
gap: 10px;
|
|
406
|
+
font-family: var(--font-display);
|
|
407
|
+
font-size: 22px;
|
|
408
|
+
font-weight: 700;
|
|
409
|
+
letter-spacing: -0.5px;
|
|
410
|
+
transition: opacity 0.2s;
|
|
411
|
+
}
|
|
412
|
+
.logo:hover {
|
|
413
|
+
opacity: 0.85;
|
|
414
|
+
}
|
|
415
|
+
.logo-icon {
|
|
416
|
+
width: 36px;
|
|
417
|
+
height: 36px;
|
|
418
|
+
background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);
|
|
419
|
+
border-radius: 8px;
|
|
420
|
+
display: flex;
|
|
421
|
+
align-items: center;
|
|
422
|
+
justify-content: center;
|
|
423
|
+
font-size: 20px;
|
|
424
|
+
transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
425
|
+
}
|
|
426
|
+
.logo:hover .logo-icon {
|
|
427
|
+
transform: rotate(-8deg) scale(1.05);
|
|
428
|
+
}
|
|
429
|
+
.nav-links {
|
|
430
|
+
display: flex;
|
|
431
|
+
align-items: center;
|
|
432
|
+
gap: 28px;
|
|
433
|
+
}
|
|
434
|
+
.nav-links a {
|
|
435
|
+
color: var(--text-secondary);
|
|
436
|
+
font-weight: 500;
|
|
437
|
+
font-size: 14px;
|
|
438
|
+
transition: color 0.2s;
|
|
439
|
+
position: relative;
|
|
440
|
+
}
|
|
441
|
+
.nav-links a::after {
|
|
442
|
+
content: '';
|
|
443
|
+
position: absolute;
|
|
444
|
+
bottom: -4px;
|
|
445
|
+
left: 0;
|
|
446
|
+
width: 0;
|
|
447
|
+
height: 2px;
|
|
448
|
+
background: var(--accent);
|
|
449
|
+
transition: width 0.2s ease;
|
|
450
|
+
}
|
|
451
|
+
.nav-links a:hover {
|
|
452
|
+
color: var(--text-primary);
|
|
453
|
+
}
|
|
454
|
+
.nav-links a:hover::after {
|
|
455
|
+
width: 100%;
|
|
456
|
+
}
|
|
457
|
+
.nav-powered {
|
|
458
|
+
display: flex;
|
|
459
|
+
align-items: center;
|
|
460
|
+
gap: 6px;
|
|
461
|
+
padding: 6px 12px;
|
|
462
|
+
background: var(--bg-secondary);
|
|
463
|
+
border-radius: 6px;
|
|
464
|
+
font-size: 12px;
|
|
465
|
+
color: var(--text-muted);
|
|
466
|
+
font-family: var(--font-display);
|
|
467
|
+
}
|
|
468
|
+
.nav-powered a {
|
|
469
|
+
color: var(--accent);
|
|
470
|
+
font-weight: 600;
|
|
471
|
+
}
|
|
472
|
+
.nav-powered a::after {
|
|
473
|
+
display: none;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/* Language Switcher */
|
|
477
|
+
.lang-switcher {
|
|
478
|
+
display: flex;
|
|
479
|
+
background: var(--bg-secondary);
|
|
480
|
+
border-radius: 6px;
|
|
481
|
+
padding: 3px;
|
|
482
|
+
gap: 2px;
|
|
483
|
+
}
|
|
484
|
+
.lang-btn {
|
|
485
|
+
padding: 5px 10px;
|
|
486
|
+
border: none;
|
|
487
|
+
background: transparent;
|
|
488
|
+
color: var(--text-muted);
|
|
489
|
+
border-radius: 5px;
|
|
490
|
+
cursor: pointer;
|
|
491
|
+
font-size: 12px;
|
|
492
|
+
font-weight: 600;
|
|
493
|
+
font-family: var(--font-display);
|
|
494
|
+
transition: all 0.2s;
|
|
495
|
+
}
|
|
496
|
+
.lang-btn:hover {
|
|
497
|
+
color: var(--text-primary);
|
|
498
|
+
}
|
|
499
|
+
.lang-btn.active {
|
|
500
|
+
background: var(--accent);
|
|
501
|
+
color: #ffffff;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/* Theme Switcher */
|
|
505
|
+
.theme-btn {
|
|
506
|
+
background: var(--bg-secondary);
|
|
507
|
+
border: none;
|
|
508
|
+
width: 34px;
|
|
509
|
+
height: 34px;
|
|
510
|
+
border-radius: 6px;
|
|
511
|
+
cursor: pointer;
|
|
512
|
+
font-size: 16px;
|
|
513
|
+
display: flex;
|
|
514
|
+
align-items: center;
|
|
515
|
+
justify-content: center;
|
|
516
|
+
transition: all 0.2s;
|
|
517
|
+
margin-left: 6px;
|
|
518
|
+
}
|
|
519
|
+
.theme-btn:hover {
|
|
520
|
+
background: var(--bg-card-hover);
|
|
521
|
+
}
|
|
522
|
+
.theme-btn:active {
|
|
523
|
+
transform: scale(0.95);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/* Hero */
|
|
527
|
+
.hero {
|
|
528
|
+
text-align: center;
|
|
529
|
+
padding: 80px 20px 60px;
|
|
530
|
+
position: relative;
|
|
531
|
+
}
|
|
532
|
+
.hero::before {
|
|
533
|
+
content: '';
|
|
534
|
+
position: absolute;
|
|
535
|
+
top: 0;
|
|
536
|
+
left: 50%;
|
|
537
|
+
transform: translateX(-50%);
|
|
538
|
+
width: 600px;
|
|
539
|
+
height: 400px;
|
|
540
|
+
background: radial-gradient(ellipse, var(--accent-glow) 0%, transparent 70%);
|
|
541
|
+
pointer-events: none;
|
|
542
|
+
z-index: -1;
|
|
543
|
+
}
|
|
544
|
+
.hero h1 {
|
|
545
|
+
font-family: var(--font-display);
|
|
546
|
+
font-size: clamp(36px, 7vw, 56px);
|
|
547
|
+
font-weight: 700;
|
|
548
|
+
margin-bottom: 16px;
|
|
549
|
+
letter-spacing: -1px;
|
|
550
|
+
background: linear-gradient(135deg, var(--accent-light) 0%, var(--accent) 50%, var(--accent-dark) 100%);
|
|
551
|
+
-webkit-background-clip: text;
|
|
552
|
+
-webkit-text-fill-color: transparent;
|
|
553
|
+
background-clip: text;
|
|
554
|
+
animation: fadeInUp 0.5s ease-out;
|
|
555
|
+
}
|
|
556
|
+
.hero-subtitle {
|
|
557
|
+
font-size: 18px;
|
|
558
|
+
color: var(--text-secondary);
|
|
559
|
+
max-width: 640px;
|
|
560
|
+
margin: 0 auto 40px;
|
|
561
|
+
line-height: 1.7;
|
|
562
|
+
animation: fadeInUp 0.5s ease-out 0.1s backwards;
|
|
563
|
+
}
|
|
564
|
+
.hero-stats {
|
|
565
|
+
display: flex;
|
|
566
|
+
justify-content: center;
|
|
567
|
+
gap: 48px;
|
|
568
|
+
margin-bottom: 48px;
|
|
569
|
+
animation: fadeInUp 0.5s ease-out 0.2s backwards;
|
|
570
|
+
}
|
|
571
|
+
.hero-stat {
|
|
572
|
+
text-align: center;
|
|
573
|
+
}
|
|
574
|
+
.hero-stat-value {
|
|
575
|
+
font-family: var(--font-display);
|
|
576
|
+
font-size: 32px;
|
|
577
|
+
font-weight: 700;
|
|
578
|
+
color: var(--accent);
|
|
579
|
+
letter-spacing: -1px;
|
|
580
|
+
}
|
|
581
|
+
.hero-stat-label {
|
|
582
|
+
font-size: 12px;
|
|
583
|
+
color: var(--text-muted);
|
|
584
|
+
text-transform: uppercase;
|
|
585
|
+
letter-spacing: 1.5px;
|
|
586
|
+
font-weight: 500;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
/* Features */
|
|
590
|
+
.features {
|
|
591
|
+
display: grid;
|
|
592
|
+
grid-template-columns: repeat(3, 1fr);
|
|
593
|
+
gap: 20px;
|
|
594
|
+
margin-bottom: 60px;
|
|
595
|
+
}
|
|
596
|
+
.feature-card {
|
|
597
|
+
background: var(--bg-card);
|
|
598
|
+
border: 1px solid var(--border);
|
|
599
|
+
border-radius: 12px;
|
|
600
|
+
padding: 24px;
|
|
601
|
+
text-align: center;
|
|
602
|
+
transition: all 0.25s ease;
|
|
603
|
+
}
|
|
604
|
+
.feature-card:hover {
|
|
605
|
+
border-color: var(--accent);
|
|
606
|
+
box-shadow: 0 0 0 1px var(--accent-glow);
|
|
607
|
+
}
|
|
608
|
+
.feature-icon {
|
|
609
|
+
font-size: 28px;
|
|
610
|
+
margin-bottom: 12px;
|
|
611
|
+
}
|
|
612
|
+
.feature-title {
|
|
613
|
+
font-family: var(--font-display);
|
|
614
|
+
font-size: 15px;
|
|
615
|
+
font-weight: 600;
|
|
616
|
+
margin-bottom: 6px;
|
|
617
|
+
letter-spacing: -0.3px;
|
|
618
|
+
}
|
|
619
|
+
.feature-desc {
|
|
620
|
+
font-size: 13px;
|
|
621
|
+
color: var(--text-secondary);
|
|
622
|
+
line-height: 1.5;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/* Section */
|
|
626
|
+
.section {
|
|
627
|
+
margin-bottom: 60px;
|
|
628
|
+
}
|
|
629
|
+
.section-header {
|
|
630
|
+
display: flex;
|
|
631
|
+
align-items: center;
|
|
632
|
+
justify-content: space-between;
|
|
633
|
+
margin-bottom: 20px;
|
|
634
|
+
}
|
|
635
|
+
.section-title {
|
|
636
|
+
font-family: var(--font-display);
|
|
637
|
+
font-size: 20px;
|
|
638
|
+
font-weight: 700;
|
|
639
|
+
letter-spacing: -0.5px;
|
|
640
|
+
}
|
|
641
|
+
.section-link {
|
|
642
|
+
color: var(--accent);
|
|
643
|
+
font-weight: 500;
|
|
644
|
+
font-size: 14px;
|
|
645
|
+
display: flex;
|
|
646
|
+
align-items: center;
|
|
647
|
+
gap: 4px;
|
|
648
|
+
transition: gap 0.2s;
|
|
649
|
+
}
|
|
650
|
+
.section-link:hover {
|
|
651
|
+
gap: 8px;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
/* Agent Grid */
|
|
655
|
+
.agent-grid {
|
|
656
|
+
display: grid;
|
|
657
|
+
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
|
|
658
|
+
gap: 16px;
|
|
659
|
+
}
|
|
660
|
+
.agent-card {
|
|
661
|
+
background: var(--bg-card);
|
|
662
|
+
border: 1px solid var(--border);
|
|
663
|
+
border-radius: 12px;
|
|
664
|
+
padding: 20px;
|
|
665
|
+
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
|
|
666
|
+
cursor: pointer;
|
|
667
|
+
animation: fadeInUp 0.4s ease-out backwards;
|
|
668
|
+
position: relative;
|
|
669
|
+
}
|
|
670
|
+
.agent-card:nth-child(1) { animation-delay: 0.05s; }
|
|
671
|
+
.agent-card:nth-child(2) { animation-delay: 0.1s; }
|
|
672
|
+
.agent-card:nth-child(3) { animation-delay: 0.15s; }
|
|
673
|
+
.agent-card:nth-child(4) { animation-delay: 0.2s; }
|
|
674
|
+
.agent-card:nth-child(5) { animation-delay: 0.25s; }
|
|
675
|
+
.agent-card:nth-child(6) { animation-delay: 0.3s; }
|
|
676
|
+
.agent-card:nth-child(7) { animation-delay: 0.35s; }
|
|
677
|
+
.agent-card:nth-child(8) { animation-delay: 0.4s; }
|
|
678
|
+
.agent-card:hover {
|
|
679
|
+
background: var(--bg-card-hover);
|
|
680
|
+
border-color: color-mix(in srgb, var(--accent) 50%, transparent);
|
|
681
|
+
transform: translateY(-3px);
|
|
682
|
+
box-shadow: 0 8px 24px var(--accent-glow);
|
|
683
|
+
}
|
|
684
|
+
.agent-header {
|
|
685
|
+
display: flex;
|
|
686
|
+
align-items: flex-start;
|
|
687
|
+
justify-content: space-between;
|
|
688
|
+
margin-bottom: 12px;
|
|
689
|
+
}
|
|
690
|
+
.agent-name {
|
|
691
|
+
font-family: var(--font-display);
|
|
692
|
+
font-size: 16px;
|
|
693
|
+
font-weight: 600;
|
|
694
|
+
letter-spacing: -0.3px;
|
|
695
|
+
transition: color 0.2s;
|
|
696
|
+
}
|
|
697
|
+
.agent-card:hover .agent-name {
|
|
698
|
+
color: var(--accent);
|
|
699
|
+
}
|
|
700
|
+
.agent-version {
|
|
701
|
+
background: var(--bg-secondary);
|
|
702
|
+
padding: 3px 8px;
|
|
703
|
+
border-radius: 4px;
|
|
704
|
+
font-size: 11px;
|
|
705
|
+
font-family: var(--font-display);
|
|
706
|
+
color: var(--text-muted);
|
|
707
|
+
font-weight: 500;
|
|
708
|
+
}
|
|
709
|
+
.agent-desc {
|
|
710
|
+
color: var(--text-secondary);
|
|
711
|
+
font-size: 13px;
|
|
712
|
+
margin-bottom: 12px;
|
|
713
|
+
line-height: 1.5;
|
|
714
|
+
display: -webkit-box;
|
|
715
|
+
-webkit-line-clamp: 2;
|
|
716
|
+
-webkit-box-orient: vertical;
|
|
717
|
+
overflow: hidden;
|
|
718
|
+
}
|
|
719
|
+
.agent-meta {
|
|
720
|
+
display: flex;
|
|
721
|
+
flex-wrap: wrap;
|
|
722
|
+
gap: 6px;
|
|
723
|
+
margin-bottom: 14px;
|
|
724
|
+
}
|
|
725
|
+
.agent-tag {
|
|
726
|
+
padding: 3px 8px;
|
|
727
|
+
border-radius: 4px;
|
|
728
|
+
font-size: 11px;
|
|
729
|
+
font-weight: 500;
|
|
730
|
+
font-family: var(--font-display);
|
|
731
|
+
}
|
|
732
|
+
.tag-ops { background: rgba(139, 92, 246, 0.15); color: #a78bfa; }
|
|
733
|
+
.tag-engineering { background: rgba(59, 130, 246, 0.15); color: #60a5fa; }
|
|
734
|
+
.tag-content { background: rgba(245, 158, 11, 0.15); color: #fbbf24; }
|
|
735
|
+
.tag-product { background: rgba(236, 72, 153, 0.15); color: #f472b6; }
|
|
736
|
+
.tag-default { background: var(--bg-secondary); color: var(--text-muted); }
|
|
737
|
+
.agent-footer {
|
|
738
|
+
display: flex;
|
|
739
|
+
align-items: center;
|
|
740
|
+
justify-content: space-between;
|
|
741
|
+
padding-top: 14px;
|
|
742
|
+
border-top: 1px solid var(--border);
|
|
743
|
+
}
|
|
744
|
+
.agent-downloads {
|
|
745
|
+
display: flex;
|
|
746
|
+
align-items: center;
|
|
747
|
+
gap: 5px;
|
|
748
|
+
color: var(--text-muted);
|
|
749
|
+
font-size: 13px;
|
|
750
|
+
}
|
|
751
|
+
.agent-install {
|
|
752
|
+
background: var(--accent);
|
|
753
|
+
color: #ffffff;
|
|
754
|
+
padding: 6px 14px;
|
|
755
|
+
border-radius: 6px;
|
|
756
|
+
font-size: 12px;
|
|
757
|
+
font-family: var(--font-display);
|
|
758
|
+
font-weight: 600;
|
|
759
|
+
transition: all 0.2s;
|
|
760
|
+
}
|
|
761
|
+
.agent-install:hover {
|
|
762
|
+
background: var(--accent-dark);
|
|
763
|
+
transform: translateY(-1px);
|
|
764
|
+
}
|
|
765
|
+
.agent-install:active {
|
|
766
|
+
transform: translateY(0);
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
/* API Box */
|
|
770
|
+
.api-box {
|
|
771
|
+
background: var(--bg-card);
|
|
772
|
+
border: 1px solid var(--border);
|
|
773
|
+
border-radius: 12px;
|
|
774
|
+
padding: 32px;
|
|
775
|
+
margin-bottom: 60px;
|
|
776
|
+
position: relative;
|
|
777
|
+
overflow: hidden;
|
|
778
|
+
}
|
|
779
|
+
.api-box::before {
|
|
780
|
+
content: '';
|
|
781
|
+
position: absolute;
|
|
782
|
+
top: 0;
|
|
783
|
+
left: 0;
|
|
784
|
+
right: 0;
|
|
785
|
+
height: 2px;
|
|
786
|
+
background: linear-gradient(90deg, var(--accent), var(--accent-light), var(--accent));
|
|
787
|
+
}
|
|
788
|
+
.api-box h3 {
|
|
789
|
+
font-family: var(--font-display);
|
|
790
|
+
font-size: 17px;
|
|
791
|
+
margin-bottom: 6px;
|
|
792
|
+
letter-spacing: -0.3px;
|
|
793
|
+
}
|
|
794
|
+
.api-box p {
|
|
795
|
+
color: var(--text-secondary);
|
|
796
|
+
margin-bottom: 20px;
|
|
797
|
+
font-size: 14px;
|
|
798
|
+
}
|
|
799
|
+
.api-code {
|
|
800
|
+
background: var(--bg-code);
|
|
801
|
+
border: 1px solid var(--border);
|
|
802
|
+
border-radius: 8px;
|
|
803
|
+
padding: 16px 20px;
|
|
804
|
+
font-family: var(--font-display);
|
|
805
|
+
font-size: 13px;
|
|
806
|
+
color: var(--accent);
|
|
807
|
+
overflow-x: auto;
|
|
808
|
+
position: relative;
|
|
809
|
+
cursor: pointer;
|
|
810
|
+
display: flex;
|
|
811
|
+
align-items: center;
|
|
812
|
+
justify-content: space-between;
|
|
813
|
+
gap: 12px;
|
|
814
|
+
transition: border-color 0.2s, background 0.2s;
|
|
815
|
+
}
|
|
816
|
+
.api-code:hover {
|
|
817
|
+
border-color: var(--accent);
|
|
818
|
+
background: var(--bg-secondary);
|
|
819
|
+
}
|
|
820
|
+
.api-code .code-text {
|
|
821
|
+
flex: 1;
|
|
822
|
+
display: flex;
|
|
823
|
+
align-items: center;
|
|
824
|
+
gap: 10px;
|
|
825
|
+
}
|
|
826
|
+
.api-code .code-text::before {
|
|
827
|
+
content: '$';
|
|
828
|
+
color: var(--text-muted);
|
|
829
|
+
flex-shrink: 0;
|
|
830
|
+
}
|
|
831
|
+
.api-code .copy-btn {
|
|
832
|
+
background: transparent;
|
|
833
|
+
border: 1px solid var(--border);
|
|
834
|
+
border-radius: 4px;
|
|
835
|
+
padding: 4px 8px;
|
|
836
|
+
font-size: 12px;
|
|
837
|
+
color: var(--text-muted);
|
|
838
|
+
cursor: pointer;
|
|
839
|
+
transition: all 0.2s;
|
|
840
|
+
flex-shrink: 0;
|
|
841
|
+
}
|
|
842
|
+
.api-code .copy-btn:hover {
|
|
843
|
+
background: var(--accent);
|
|
844
|
+
color: var(--bg-primary);
|
|
845
|
+
border-color: var(--accent);
|
|
846
|
+
}
|
|
847
|
+
.api-code .copy-btn.copied {
|
|
848
|
+
background: #22c55e;
|
|
849
|
+
border-color: #22c55e;
|
|
850
|
+
color: white;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
/* Detail Page */
|
|
854
|
+
.detail-header {
|
|
855
|
+
background: var(--bg-card);
|
|
856
|
+
border: 1px solid var(--border);
|
|
857
|
+
border-radius: 16px;
|
|
858
|
+
padding: 32px;
|
|
859
|
+
margin-bottom: 24px;
|
|
860
|
+
position: relative;
|
|
861
|
+
overflow: hidden;
|
|
862
|
+
}
|
|
863
|
+
.detail-header::before {
|
|
864
|
+
content: '';
|
|
865
|
+
position: absolute;
|
|
866
|
+
top: 0;
|
|
867
|
+
left: 0;
|
|
868
|
+
right: 0;
|
|
869
|
+
height: 3px;
|
|
870
|
+
background: linear-gradient(90deg, var(--accent), var(--accent-light));
|
|
871
|
+
}
|
|
872
|
+
.detail-title {
|
|
873
|
+
font-family: var(--font-display);
|
|
874
|
+
font-size: 28px;
|
|
875
|
+
font-weight: 700;
|
|
876
|
+
margin-bottom: 8px;
|
|
877
|
+
letter-spacing: -1px;
|
|
878
|
+
}
|
|
879
|
+
.detail-desc {
|
|
880
|
+
font-size: 16px;
|
|
881
|
+
color: var(--text-secondary);
|
|
882
|
+
margin-bottom: 20px;
|
|
883
|
+
line-height: 1.6;
|
|
884
|
+
}
|
|
885
|
+
.detail-grid {
|
|
886
|
+
display: grid;
|
|
887
|
+
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
|
888
|
+
gap: 12px;
|
|
889
|
+
margin-bottom: 20px;
|
|
890
|
+
}
|
|
891
|
+
.detail-item {
|
|
892
|
+
background: var(--bg-secondary);
|
|
893
|
+
padding: 16px;
|
|
894
|
+
border-radius: 8px;
|
|
895
|
+
}
|
|
896
|
+
.detail-label {
|
|
897
|
+
font-size: 11px;
|
|
898
|
+
color: var(--text-muted);
|
|
899
|
+
text-transform: uppercase;
|
|
900
|
+
letter-spacing: 1px;
|
|
901
|
+
margin-bottom: 6px;
|
|
902
|
+
font-weight: 500;
|
|
903
|
+
}
|
|
904
|
+
.detail-value {
|
|
905
|
+
font-family: var(--font-display);
|
|
906
|
+
font-size: 18px;
|
|
907
|
+
font-weight: 600;
|
|
908
|
+
letter-spacing: -0.5px;
|
|
909
|
+
}
|
|
910
|
+
.detail-install {
|
|
911
|
+
background: var(--bg-code);
|
|
912
|
+
border: 1px solid var(--border);
|
|
913
|
+
color: var(--accent);
|
|
914
|
+
padding: 14px 20px;
|
|
915
|
+
border-radius: 8px;
|
|
916
|
+
font-family: var(--font-display);
|
|
917
|
+
font-size: 14px;
|
|
918
|
+
display: flex;
|
|
919
|
+
align-items: center;
|
|
920
|
+
gap: 10px;
|
|
921
|
+
cursor: pointer;
|
|
922
|
+
transition: border-color 0.2s, background 0.2s;
|
|
923
|
+
}
|
|
924
|
+
.detail-install:hover {
|
|
925
|
+
border-color: var(--accent);
|
|
926
|
+
background: var(--bg-secondary);
|
|
927
|
+
}
|
|
928
|
+
.detail-install .code-text {
|
|
929
|
+
flex: 1;
|
|
930
|
+
display: flex;
|
|
931
|
+
align-items: center;
|
|
932
|
+
gap: 10px;
|
|
933
|
+
}
|
|
934
|
+
.detail-install .code-text::before {
|
|
935
|
+
content: "$";
|
|
936
|
+
color: var(--text-muted);
|
|
937
|
+
font-weight: bold;
|
|
938
|
+
}
|
|
939
|
+
.detail-install .copy-btn {
|
|
940
|
+
background: transparent;
|
|
941
|
+
border: 1px solid var(--border);
|
|
942
|
+
border-radius: 4px;
|
|
943
|
+
padding: 4px 10px;
|
|
944
|
+
font-size: 12px;
|
|
945
|
+
color: var(--text-muted);
|
|
946
|
+
cursor: pointer;
|
|
947
|
+
transition: all 0.2s;
|
|
948
|
+
flex-shrink: 0;
|
|
949
|
+
}
|
|
950
|
+
.detail-install .copy-btn:hover {
|
|
951
|
+
background: var(--accent);
|
|
952
|
+
color: var(--bg-primary);
|
|
953
|
+
border-color: var(--accent);
|
|
954
|
+
}
|
|
955
|
+
.detail-install .copy-btn.copied {
|
|
956
|
+
background: #22c55e;
|
|
957
|
+
border-color: #22c55e;
|
|
958
|
+
color: white;
|
|
959
|
+
}
|
|
960
|
+
.install-label {
|
|
961
|
+
font-size: 11px;
|
|
962
|
+
color: var(--text-muted);
|
|
963
|
+
text-transform: uppercase;
|
|
964
|
+
letter-spacing: 1px;
|
|
965
|
+
margin-bottom: 8px;
|
|
966
|
+
}
|
|
967
|
+
.install-methods {
|
|
968
|
+
display: flex;
|
|
969
|
+
flex-direction: column;
|
|
970
|
+
gap: 12px;
|
|
971
|
+
}
|
|
972
|
+
.install-box {
|
|
973
|
+
position: relative;
|
|
974
|
+
}
|
|
975
|
+
.install-box.primary .detail-install {
|
|
976
|
+
border-color: var(--accent);
|
|
977
|
+
background: linear-gradient(135deg, rgba(var(--accent-rgb, 99, 102, 241), 0.1), transparent);
|
|
978
|
+
}
|
|
979
|
+
.install-box .badge-new {
|
|
980
|
+
position: absolute;
|
|
981
|
+
top: -8px;
|
|
982
|
+
right: -8px;
|
|
983
|
+
background: var(--accent);
|
|
984
|
+
color: white;
|
|
985
|
+
font-size: 10px;
|
|
986
|
+
padding: 2px 6px;
|
|
987
|
+
border-radius: 4px;
|
|
988
|
+
font-weight: 500;
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
.section-card {
|
|
992
|
+
background: var(--bg-card);
|
|
993
|
+
border: 1px solid var(--border);
|
|
994
|
+
border-radius: 12px;
|
|
995
|
+
padding: 24px;
|
|
996
|
+
margin-bottom: 20px;
|
|
997
|
+
}
|
|
998
|
+
.section-card h3 {
|
|
999
|
+
font-family: var(--font-display);
|
|
1000
|
+
font-size: 16px;
|
|
1001
|
+
font-weight: 600;
|
|
1002
|
+
margin-bottom: 14px;
|
|
1003
|
+
display: flex;
|
|
1004
|
+
align-items: center;
|
|
1005
|
+
gap: 8px;
|
|
1006
|
+
letter-spacing: -0.3px;
|
|
1007
|
+
}
|
|
1008
|
+
.back-link {
|
|
1009
|
+
display: inline-flex;
|
|
1010
|
+
align-items: center;
|
|
1011
|
+
gap: 6px;
|
|
1012
|
+
color: var(--text-secondary);
|
|
1013
|
+
margin-bottom: 20px;
|
|
1014
|
+
font-size: 14px;
|
|
1015
|
+
transition: all 0.2s;
|
|
1016
|
+
}
|
|
1017
|
+
.back-link:hover {
|
|
1018
|
+
color: var(--accent);
|
|
1019
|
+
gap: 10px;
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
/* Memory bars */
|
|
1023
|
+
.memory-bars {
|
|
1024
|
+
display: flex;
|
|
1025
|
+
gap: 3px;
|
|
1026
|
+
height: 6px;
|
|
1027
|
+
border-radius: 3px;
|
|
1028
|
+
overflow: hidden;
|
|
1029
|
+
margin-bottom: 10px;
|
|
1030
|
+
}
|
|
1031
|
+
.memory-bar { height: 100%; }
|
|
1032
|
+
.memory-bar.public { background: var(--accent); }
|
|
1033
|
+
.memory-bar.portable { background: var(--accent-light); }
|
|
1034
|
+
.memory-bar.private { background: var(--tag-content); }
|
|
1035
|
+
.memory-legend {
|
|
1036
|
+
display: flex;
|
|
1037
|
+
gap: 16px;
|
|
1038
|
+
font-size: 12px;
|
|
1039
|
+
color: var(--text-secondary);
|
|
1040
|
+
}
|
|
1041
|
+
.memory-legend span {
|
|
1042
|
+
display: flex;
|
|
1043
|
+
align-items: center;
|
|
1044
|
+
gap: 5px;
|
|
1045
|
+
}
|
|
1046
|
+
.memory-legend .dot {
|
|
1047
|
+
width: 8px;
|
|
1048
|
+
height: 8px;
|
|
1049
|
+
border-radius: 50%;
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
/* Skills & Tags */
|
|
1053
|
+
.skills-list, .tags-list {
|
|
1054
|
+
display: flex;
|
|
1055
|
+
flex-wrap: wrap;
|
|
1056
|
+
gap: 6px;
|
|
1057
|
+
}
|
|
1058
|
+
.badge {
|
|
1059
|
+
padding: 5px 10px;
|
|
1060
|
+
border-radius: 4px;
|
|
1061
|
+
font-size: 12px;
|
|
1062
|
+
font-family: var(--font-display);
|
|
1063
|
+
font-weight: 500;
|
|
1064
|
+
}
|
|
1065
|
+
.badge-skill { background: rgba(59, 130, 246, 0.15); color: #60a5fa; }
|
|
1066
|
+
.badge-tag { background: rgba(245, 158, 11, 0.15); color: #fbbf24; }
|
|
1067
|
+
|
|
1068
|
+
/* Requirements */
|
|
1069
|
+
.requirements-list {
|
|
1070
|
+
list-style: none;
|
|
1071
|
+
}
|
|
1072
|
+
.requirements-list li {
|
|
1073
|
+
padding: 10px 0;
|
|
1074
|
+
border-bottom: 1px solid var(--border);
|
|
1075
|
+
display: flex;
|
|
1076
|
+
align-items: center;
|
|
1077
|
+
gap: 8px;
|
|
1078
|
+
font-size: 14px;
|
|
1079
|
+
}
|
|
1080
|
+
.requirements-list li:last-child {
|
|
1081
|
+
border-bottom: none;
|
|
1082
|
+
}
|
|
1083
|
+
.env-var {
|
|
1084
|
+
font-family: var(--font-display);
|
|
1085
|
+
background: var(--bg-secondary);
|
|
1086
|
+
padding: 3px 8px;
|
|
1087
|
+
border-radius: 4px;
|
|
1088
|
+
color: var(--accent);
|
|
1089
|
+
font-size: 12px;
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
/* Stats Page */
|
|
1093
|
+
.stats-table {
|
|
1094
|
+
width: 100%;
|
|
1095
|
+
border-collapse: collapse;
|
|
1096
|
+
font-size: 14px;
|
|
1097
|
+
}
|
|
1098
|
+
.stats-table th, .stats-table td {
|
|
1099
|
+
padding: 14px 12px;
|
|
1100
|
+
text-align: left;
|
|
1101
|
+
border-bottom: 1px solid var(--border);
|
|
1102
|
+
}
|
|
1103
|
+
.stats-table th {
|
|
1104
|
+
font-family: var(--font-display);
|
|
1105
|
+
color: var(--text-muted);
|
|
1106
|
+
font-weight: 600;
|
|
1107
|
+
font-size: 11px;
|
|
1108
|
+
text-transform: uppercase;
|
|
1109
|
+
letter-spacing: 0.5px;
|
|
1110
|
+
}
|
|
1111
|
+
.stats-table a {
|
|
1112
|
+
color: var(--accent);
|
|
1113
|
+
font-family: var(--font-display);
|
|
1114
|
+
}
|
|
1115
|
+
.stats-table a:hover {
|
|
1116
|
+
text-decoration: underline;
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
/* How it works */
|
|
1120
|
+
.how-it-works {
|
|
1121
|
+
display: grid;
|
|
1122
|
+
grid-template-columns: repeat(3, 1fr);
|
|
1123
|
+
gap: 24px;
|
|
1124
|
+
margin-bottom: 60px;
|
|
1125
|
+
}
|
|
1126
|
+
.step {
|
|
1127
|
+
text-align: center;
|
|
1128
|
+
}
|
|
1129
|
+
.step-number {
|
|
1130
|
+
width: 40px;
|
|
1131
|
+
height: 40px;
|
|
1132
|
+
background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);
|
|
1133
|
+
color: #ffffff;
|
|
1134
|
+
border-radius: 10px;
|
|
1135
|
+
display: flex;
|
|
1136
|
+
align-items: center;
|
|
1137
|
+
justify-content: center;
|
|
1138
|
+
font-family: var(--font-display);
|
|
1139
|
+
font-size: 16px;
|
|
1140
|
+
font-weight: 700;
|
|
1141
|
+
margin: 0 auto 14px;
|
|
1142
|
+
}
|
|
1143
|
+
.step h4 {
|
|
1144
|
+
font-family: var(--font-display);
|
|
1145
|
+
font-size: 16px;
|
|
1146
|
+
margin-bottom: 6px;
|
|
1147
|
+
letter-spacing: -0.3px;
|
|
1148
|
+
}
|
|
1149
|
+
.step p {
|
|
1150
|
+
color: var(--text-secondary);
|
|
1151
|
+
font-size: 13px;
|
|
1152
|
+
line-height: 1.5;
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
/* Search */
|
|
1156
|
+
.search-box {
|
|
1157
|
+
display: flex;
|
|
1158
|
+
background: var(--bg-card);
|
|
1159
|
+
border: 1px solid var(--border);
|
|
1160
|
+
border-radius: 10px;
|
|
1161
|
+
padding: 5px;
|
|
1162
|
+
max-width: 480px;
|
|
1163
|
+
margin: 0 auto 32px;
|
|
1164
|
+
transition: border-color 0.2s, box-shadow 0.2s;
|
|
1165
|
+
}
|
|
1166
|
+
.search-box:focus-within {
|
|
1167
|
+
border-color: var(--accent);
|
|
1168
|
+
box-shadow: 0 0 0 3px var(--accent-glow);
|
|
1169
|
+
}
|
|
1170
|
+
.search-box input {
|
|
1171
|
+
flex: 1;
|
|
1172
|
+
background: transparent;
|
|
1173
|
+
border: none;
|
|
1174
|
+
padding: 10px 14px;
|
|
1175
|
+
font-size: 14px;
|
|
1176
|
+
font-family: var(--font-body);
|
|
1177
|
+
color: var(--text-primary);
|
|
1178
|
+
outline: none;
|
|
1179
|
+
}
|
|
1180
|
+
.search-box input::placeholder {
|
|
1181
|
+
color: var(--text-muted);
|
|
1182
|
+
}
|
|
1183
|
+
.search-box button {
|
|
1184
|
+
background: var(--accent);
|
|
1185
|
+
color: #ffffff;
|
|
1186
|
+
border: none;
|
|
1187
|
+
padding: 10px 20px;
|
|
1188
|
+
border-radius: 6px;
|
|
1189
|
+
font-family: var(--font-display);
|
|
1190
|
+
font-size: 13px;
|
|
1191
|
+
font-weight: 600;
|
|
1192
|
+
cursor: pointer;
|
|
1193
|
+
transition: all 0.2s;
|
|
1194
|
+
}
|
|
1195
|
+
.search-box button:hover {
|
|
1196
|
+
background: var(--accent-dark);
|
|
1197
|
+
}
|
|
1198
|
+
.search-box button:active {
|
|
1199
|
+
transform: scale(0.97);
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
/* Empty state */
|
|
1203
|
+
.empty-state {
|
|
1204
|
+
text-align: center;
|
|
1205
|
+
padding: 48px 20px;
|
|
1206
|
+
color: var(--text-muted);
|
|
1207
|
+
}
|
|
1208
|
+
.empty-state h3 {
|
|
1209
|
+
font-family: var(--font-display);
|
|
1210
|
+
font-size: 17px;
|
|
1211
|
+
margin-bottom: 6px;
|
|
1212
|
+
color: var(--text-primary);
|
|
1213
|
+
}
|
|
1214
|
+
.empty-state p {
|
|
1215
|
+
font-size: 14px;
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
/* Footer */
|
|
1219
|
+
footer {
|
|
1220
|
+
border-top: 1px solid var(--border);
|
|
1221
|
+
padding: 32px 0;
|
|
1222
|
+
margin-top: 60px;
|
|
1223
|
+
background: var(--bg-secondary);
|
|
1224
|
+
}
|
|
1225
|
+
.footer-content {
|
|
1226
|
+
display: flex;
|
|
1227
|
+
justify-content: space-between;
|
|
1228
|
+
align-items: center;
|
|
1229
|
+
flex-wrap: wrap;
|
|
1230
|
+
gap: 20px;
|
|
1231
|
+
}
|
|
1232
|
+
.footer-brand {
|
|
1233
|
+
display: flex;
|
|
1234
|
+
align-items: center;
|
|
1235
|
+
gap: 10px;
|
|
1236
|
+
}
|
|
1237
|
+
.footer-brand-icon {
|
|
1238
|
+
width: 28px;
|
|
1239
|
+
height: 28px;
|
|
1240
|
+
display: flex;
|
|
1241
|
+
align-items: center;
|
|
1242
|
+
justify-content: center;
|
|
1243
|
+
font-size: 18px;
|
|
1244
|
+
}
|
|
1245
|
+
.footer-brand-text {
|
|
1246
|
+
font-family: var(--font-display);
|
|
1247
|
+
font-weight: 600;
|
|
1248
|
+
font-size: 15px;
|
|
1249
|
+
color: var(--text-primary);
|
|
1250
|
+
}
|
|
1251
|
+
.footer-powered {
|
|
1252
|
+
display: flex;
|
|
1253
|
+
align-items: center;
|
|
1254
|
+
gap: 6px;
|
|
1255
|
+
font-size: 13px;
|
|
1256
|
+
color: var(--text-muted);
|
|
1257
|
+
}
|
|
1258
|
+
.footer-powered a {
|
|
1259
|
+
color: var(--accent);
|
|
1260
|
+
font-weight: 500;
|
|
1261
|
+
}
|
|
1262
|
+
.footer-links {
|
|
1263
|
+
display: flex;
|
|
1264
|
+
gap: 20px;
|
|
1265
|
+
}
|
|
1266
|
+
.footer-links a {
|
|
1267
|
+
color: var(--text-secondary);
|
|
1268
|
+
font-size: 13px;
|
|
1269
|
+
font-family: var(--font-display);
|
|
1270
|
+
transition: color 0.2s;
|
|
1271
|
+
}
|
|
1272
|
+
.footer-links a:hover {
|
|
1273
|
+
color: var(--accent);
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
@media (max-width: 768px) {
|
|
1277
|
+
.hero { padding: 48px 16px 36px; }
|
|
1278
|
+
.hero h1 { font-size: clamp(28px, 6vw, 36px); }
|
|
1279
|
+
.hero-subtitle { font-size: 15px; padding: 0 12px; }
|
|
1280
|
+
.hero-stats { gap: 28px; flex-wrap: wrap; }
|
|
1281
|
+
.hero-stat-value { font-size: 26px; }
|
|
1282
|
+
.features { grid-template-columns: 1fr; gap: 12px; }
|
|
1283
|
+
.how-it-works { grid-template-columns: 1fr; gap: 20px; }
|
|
1284
|
+
.detail-grid { grid-template-columns: 1fr; }
|
|
1285
|
+
.agent-grid { grid-template-columns: 1fr; }
|
|
1286
|
+
.footer-content { flex-direction: column; text-align: center; gap: 16px; }
|
|
1287
|
+
|
|
1288
|
+
/* Mobile navigation */
|
|
1289
|
+
.header-content { flex-wrap: wrap; gap: 10px; }
|
|
1290
|
+
.nav-links {
|
|
1291
|
+
order: 3;
|
|
1292
|
+
width: 100%;
|
|
1293
|
+
justify-content: center;
|
|
1294
|
+
gap: 16px;
|
|
1295
|
+
flex-wrap: wrap;
|
|
1296
|
+
}
|
|
1297
|
+
.nav-links a { font-size: 13px; }
|
|
1298
|
+
.nav-powered { display: none; }
|
|
1299
|
+
.logo { font-size: 18px; }
|
|
1300
|
+
.logo-icon { width: 30px; height: 30px; font-size: 16px; }
|
|
1301
|
+
.container { padding: 0 16px; }
|
|
1302
|
+
.detail-header { padding: 20px; }
|
|
1303
|
+
.detail-title { font-size: 22px; }
|
|
1304
|
+
.section-card { padding: 18px; }
|
|
1305
|
+
.search-box { margin: 0 0 24px; }
|
|
1306
|
+
.api-box { padding: 20px; }
|
|
1307
|
+
.api-code { font-size: 11px; padding: 14px; }
|
|
1308
|
+
.stats-table th, .stats-table td { padding: 10px 8px; font-size: 12px; }
|
|
1309
|
+
.step-number { width: 36px; height: 36px; font-size: 14px; }
|
|
1310
|
+
.step h4 { font-size: 14px; }
|
|
1311
|
+
}
|
|
1312
|
+
|
|
1313
|
+
@media (max-width: 480px) {
|
|
1314
|
+
.theme-btn { width: 30px; height: 30px; font-size: 14px; }
|
|
1315
|
+
.hero-stat-value { font-size: 22px; }
|
|
1316
|
+
.hero-stat-label { font-size: 10px; }
|
|
1317
|
+
.nav-links { gap: 12px; }
|
|
1318
|
+
.nav-links a { font-size: 12px; }
|
|
1319
|
+
.section-title { font-size: 17px; }
|
|
1320
|
+
.feature-card { padding: 18px; }
|
|
1321
|
+
.feature-icon { font-size: 24px; }
|
|
1322
|
+
}
|
|
1323
|
+
</style>
|
|
1324
|
+
</head>
|
|
1325
|
+
<body>
|
|
1326
|
+
<header>
|
|
1327
|
+
<div class="container header-content">
|
|
1328
|
+
<a href="/" class="logo">
|
|
1329
|
+
<div class="logo-icon">๐ฆ</div>
|
|
1330
|
+
<span>AgentHub</span>
|
|
1331
|
+
</a>
|
|
1332
|
+
<nav class="nav-links">
|
|
1333
|
+
<a href="/"><span data-i18n="navHome">Home</span></a>
|
|
1334
|
+
<a href="/stats"><span data-i18n="navStats">Stats</span></a>
|
|
1335
|
+
<a href="https://github.com/itshaungmu/AgentHub" target="_blank">GitHub</a>
|
|
1336
|
+
<div class="nav-powered">
|
|
1337
|
+
<span>๐ฆ</span>
|
|
1338
|
+
<span>Powered by</span>
|
|
1339
|
+
<a href="https://github.com/openclaw" target="_blank">OpenClaw</a>
|
|
1340
|
+
</div>
|
|
1341
|
+
<div class="lang-switcher">
|
|
1342
|
+
<button class="lang-btn active" data-lang="en" onclick="setLang('en')">EN</button>
|
|
1343
|
+
<button class="lang-btn" data-lang="zh" onclick="setLang('zh')">ไธญๆ</button>
|
|
1344
|
+
</div>
|
|
1345
|
+
<button class="theme-btn" onclick="toggleTheme()" aria-label="Switch theme">๐</button>
|
|
1346
|
+
</nav>
|
|
1347
|
+
</div>
|
|
1348
|
+
</header>
|
|
1349
|
+
<main class="container">${body}</main>
|
|
1350
|
+
<footer>
|
|
1351
|
+
<div class="container footer-content">
|
|
1352
|
+
<div class="footer-brand">
|
|
1353
|
+
<div class="footer-brand-icon">๐ฆ</div>
|
|
1354
|
+
<span class="footer-brand-text">AgentHub</span>
|
|
1355
|
+
</div>
|
|
1356
|
+
<div class="footer-powered">
|
|
1357
|
+
<span>Powered by</span>
|
|
1358
|
+
<a href="https://github.com/openclaw" target="_blank">OpenClaw</a>
|
|
1359
|
+
<span>โข</span>
|
|
1360
|
+
<span>Built with โค๏ธ for AI Agents</span>
|
|
1361
|
+
</div>
|
|
1362
|
+
<div class="footer-links">
|
|
1363
|
+
<a href="https://github.com/openclaw" target="_blank">OpenClaw</a>
|
|
1364
|
+
<a href="https://github.com/itshaungmu/AgentHub" target="_blank">AgentHub</a>
|
|
1365
|
+
</div>
|
|
1366
|
+
</div>
|
|
1367
|
+
</footer>
|
|
1368
|
+
</body>
|
|
1369
|
+
</html>
|
|
1370
|
+
${langScript}`;
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1373
|
+
export function renderAgentListPage({ query, agents, totalDownloads, apiBase }) {
|
|
1374
|
+
const agentCount = agents.length;
|
|
1375
|
+
|
|
1376
|
+
const features = `
|
|
1377
|
+
<div class="features">
|
|
1378
|
+
<div class="feature-card">
|
|
1379
|
+
<div class="feature-icon">๐ฆ</div>
|
|
1380
|
+
<div class="feature-title" data-i18n="feature1Title">Ready to Use</div>
|
|
1381
|
+
<div class="feature-desc" data-i18n="feature1Desc">Skip complex configurations, get battle-tested AI Agent setups</div>
|
|
1382
|
+
</div>
|
|
1383
|
+
<div class="feature-card">
|
|
1384
|
+
<div class="feature-icon">โก</div>
|
|
1385
|
+
<div class="feature-title" data-i18n="feature2Title">Instant Deploy</div>
|
|
1386
|
+
<div class="feature-desc" data-i18n="feature2Desc">One-click install, deploy in minutes, start working immediately</div>
|
|
1387
|
+
</div>
|
|
1388
|
+
<div class="feature-card">
|
|
1389
|
+
<div class="feature-icon">๐</div>
|
|
1390
|
+
<div class="feature-title" data-i18n="feature3Title">Version Control</div>
|
|
1391
|
+
<div class="feature-desc" data-i18n="feature3Desc">Auto-update pushes, always stay with the latest capabilities</div>
|
|
1392
|
+
</div>
|
|
1393
|
+
</div>
|
|
1394
|
+
`;
|
|
1395
|
+
|
|
1396
|
+
const cards = agents.map(agent => {
|
|
1397
|
+
const tags = agent.metadata?.tags || [];
|
|
1398
|
+
const category = agent.metadata?.category || 'default';
|
|
1399
|
+
|
|
1400
|
+
const tagClass = {
|
|
1401
|
+
'ops': 'tag-ops',
|
|
1402
|
+
'engineering': 'tag-engineering',
|
|
1403
|
+
'content': 'tag-content',
|
|
1404
|
+
'product': 'tag-product'
|
|
1405
|
+
}[category] || 'tag-default';
|
|
1406
|
+
|
|
1407
|
+
return `
|
|
1408
|
+
<article class="agent-card" onclick="window.location='/agents/${agent.slug}'">
|
|
1409
|
+
<div class="agent-header">
|
|
1410
|
+
<a href="/agents/${agent.slug}" class="agent-name" onclick="event.stopPropagation()">${agent.name || agent.slug}</a>
|
|
1411
|
+
<span class="agent-version">v${agent.version}</span>
|
|
1412
|
+
</div>
|
|
1413
|
+
<p class="agent-desc">${agent.description || 'A powerful AI Agent'}</p>
|
|
1414
|
+
<div class="agent-meta">
|
|
1415
|
+
<span class="agent-tag ${tagClass}">${category}</span>
|
|
1416
|
+
${tags.slice(0, 2).map(t => `<span class="agent-tag tag-default">${t}</span>`).join('')}
|
|
1417
|
+
</div>
|
|
1418
|
+
<div class="agent-footer">
|
|
1419
|
+
<span class="agent-downloads">
|
|
1420
|
+
<span>โฌ๏ธ</span> ${agent.downloads || 0} <span data-i18n="downloads">downloads</span>
|
|
1421
|
+
</span>
|
|
1422
|
+
<span class="agent-install" data-i18n="install">Install</span>
|
|
1423
|
+
</div>
|
|
1424
|
+
</article>
|
|
1425
|
+
`;
|
|
1426
|
+
}).join('');
|
|
1427
|
+
|
|
1428
|
+
const howItWorks = `
|
|
1429
|
+
<div class="section">
|
|
1430
|
+
<h2 class="section-title" style="text-align: center; margin-bottom: 32px;" data-i18n="howToUse">How to Use</h2>
|
|
1431
|
+
<div class="how-it-works">
|
|
1432
|
+
<div class="step">
|
|
1433
|
+
<div class="step-number">1</div>
|
|
1434
|
+
<h4 data-i18n="step1Title">Browse & Discover</h4>
|
|
1435
|
+
<p data-i18n="step1Desc">Find the Agent that fits your workflow</p>
|
|
1436
|
+
</div>
|
|
1437
|
+
<div class="step">
|
|
1438
|
+
<div class="step-number">2</div>
|
|
1439
|
+
<h4 data-i18n="step2Title">One-Click Install</h4>
|
|
1440
|
+
<p data-i18n="step2Desc">Run the install command, deploy in minutes</p>
|
|
1441
|
+
</div>
|
|
1442
|
+
<div class="step">
|
|
1443
|
+
<div class="step-number">3</div>
|
|
1444
|
+
<h4 data-i18n="step3Title">Start Working</h4>
|
|
1445
|
+
<p data-i18n="step3Desc">Your AI assistant is ready, start delegating tasks</p>
|
|
1446
|
+
</div>
|
|
1447
|
+
</div>
|
|
1448
|
+
</div>
|
|
1449
|
+
`;
|
|
1450
|
+
|
|
1451
|
+
const apiBox = `
|
|
1452
|
+
<div class="api-box">
|
|
1453
|
+
<h3 data-i18n="apiBoxTitle">๐ค AI Auto-Discovery API</h3>
|
|
1454
|
+
<p data-i18n="apiBoxDesc">Let your AI assistant automatically discover and install Agents</p>
|
|
1455
|
+
<div class="api-code" title="Click to copy">
|
|
1456
|
+
<span class="code-text">curl -s https://raw.githubusercontent.com/itshaungmu/AgentHub/main/skills/agenthub-discover/SKILL.md</span>
|
|
1457
|
+
<button class="copy-btn" title="Copy">๐</button>
|
|
1458
|
+
</div>
|
|
1459
|
+
</div>
|
|
1460
|
+
`;
|
|
1461
|
+
|
|
1462
|
+
return page(
|
|
1463
|
+
"AgentHub - AI Agent Open Source Community",
|
|
1464
|
+
`
|
|
1465
|
+
<section class="hero">
|
|
1466
|
+
<h1 data-i18n="heroTitle">AgentHub</h1>
|
|
1467
|
+
<p class="hero-subtitle" data-i18n="heroSubtitle">The Open Source Marketplace for AI Agents. Package and upload your Agent's full capabilities in one command, download and gain those powers with one click.</p>
|
|
1468
|
+
<div class="hero-stats">
|
|
1469
|
+
<div class="hero-stat">
|
|
1470
|
+
<div class="hero-stat-value">${agentCount}</div>
|
|
1471
|
+
<div class="hero-stat-label" data-i18n="statAgents">Available Agents</div>
|
|
1472
|
+
</div>
|
|
1473
|
+
<div class="hero-stat">
|
|
1474
|
+
<div class="hero-stat-value">${totalDownloads || 0}</div>
|
|
1475
|
+
<div class="hero-stat-label" data-i18n="statDownloads">Total Downloads</div>
|
|
1476
|
+
</div>
|
|
1477
|
+
<div class="hero-stat">
|
|
1478
|
+
<div class="hero-stat-value">100%</div>
|
|
1479
|
+
<div class="hero-stat-label" data-i18n="statOpenSource">Open Source</div>
|
|
1480
|
+
</div>
|
|
1481
|
+
</div>
|
|
1482
|
+
${features}
|
|
1483
|
+
</section>
|
|
1484
|
+
|
|
1485
|
+
${apiBox}
|
|
1486
|
+
|
|
1487
|
+
<section class="section">
|
|
1488
|
+
<div class="section-header">
|
|
1489
|
+
<h2 class="section-title" data-i18n="sectionHotAgents">Hot Agents</h2>
|
|
1490
|
+
<a href="/stats" class="section-link" data-i18n="sectionViewAll">View All โ</a>
|
|
1491
|
+
</div>
|
|
1492
|
+
<form class="search-box" method="get" action="/">
|
|
1493
|
+
<input type="search" name="q" value="${query ?? ""}" data-i18n-placeholder="searchPlaceholder" placeholder="Search Agents, skills, tags..." />
|
|
1494
|
+
<button type="submit" data-i18n="searchButton">Search</button>
|
|
1495
|
+
</form>
|
|
1496
|
+
<div class="agent-grid">
|
|
1497
|
+
${cards || `<div class="empty-state"><h3 data-i18n="noAgents">No Agents yet</h3><p data-i18n="noAgentsHint">Use <code>agenthub pack</code> to package your first Agent!</p></div>`}
|
|
1498
|
+
</div>
|
|
1499
|
+
</section>
|
|
1500
|
+
|
|
1501
|
+
${howItWorks}
|
|
1502
|
+
`,
|
|
1503
|
+
{
|
|
1504
|
+
description: "AgentHub - The Open Source Marketplace for AI Agents. Package and upload your Agent's full capabilities in one command, download and gain those powers with one click.",
|
|
1505
|
+
url: "https://agenthub.cyou/"
|
|
1506
|
+
}
|
|
1507
|
+
);
|
|
1508
|
+
}
|
|
1509
|
+
|
|
1510
|
+
export function renderAgentDetailPage(manifest) {
|
|
1511
|
+
const memoryInfo = manifest.includes?.memory || {};
|
|
1512
|
+
const runtimeInfo = manifest.runtime || {};
|
|
1513
|
+
const skills = manifest.includes?.skills || [];
|
|
1514
|
+
const tags = manifest.metadata?.tags || [];
|
|
1515
|
+
const requirements = manifest.requirements || {};
|
|
1516
|
+
const persona = manifest.persona || {};
|
|
1517
|
+
|
|
1518
|
+
const totalMemory = memoryInfo.count || 0;
|
|
1519
|
+
const publicRatio = totalMemory > 0 ? (memoryInfo.public || 0) / totalMemory : 0;
|
|
1520
|
+
const portableRatio = totalMemory > 0 ? (memoryInfo.portable || 0) / totalMemory : 0;
|
|
1521
|
+
const privateRatio = totalMemory > 0 ? (memoryInfo.private || 0) / totalMemory : 0;
|
|
1522
|
+
|
|
1523
|
+
const skillsHtml = skills.length > 0
|
|
1524
|
+
? skills.map(s => `<span class="badge badge-skill">${s}</span>`).join("")
|
|
1525
|
+
: '<span style="color: var(--text-muted)">None</span>';
|
|
1526
|
+
|
|
1527
|
+
const tagsHtml = tags.length > 0
|
|
1528
|
+
? tags.map(t => `<span class="badge badge-tag">${t}</span>`).join("")
|
|
1529
|
+
: '<span style="color: var(--text-muted)">None</span>';
|
|
1530
|
+
|
|
1531
|
+
const envVars = requirements.env || [];
|
|
1532
|
+
const requirementsHtml = [];
|
|
1533
|
+
if (envVars.length > 0) {
|
|
1534
|
+
requirementsHtml.push('<li>๐ <span data-i18n="requirementsEnv">Environment variables required:</span></li>');
|
|
1535
|
+
for (const env of envVars) {
|
|
1536
|
+
requirementsHtml.push(`<li style="padding-left: 20px;"><span class="env-var">${env}</span></li>`);
|
|
1537
|
+
}
|
|
1538
|
+
}
|
|
1539
|
+
if (requirements.model) {
|
|
1540
|
+
requirementsHtml.push(`<li>๐ค <span data-i18n="requirementsModel">Recommended model:</span> <span class="env-var">${requirements.model}</span></li>`);
|
|
1541
|
+
}
|
|
1542
|
+
if (requirements.openclaw) {
|
|
1543
|
+
requirementsHtml.push(`<li>โก <span data-i18n="requirementsRuntime">Runtime version:</span> OpenClaw ${requirements.openclaw}</li>`);
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
return page(
|
|
1547
|
+
`${manifest.name || manifest.slug} - AgentHub`,
|
|
1548
|
+
`
|
|
1549
|
+
<a href="/" class="back-link" data-i18n="backToHome">โ Back to Home</a>
|
|
1550
|
+
|
|
1551
|
+
<div class="detail-header">
|
|
1552
|
+
<h1 class="detail-title">${manifest.name || manifest.slug}</h1>
|
|
1553
|
+
<p class="detail-desc">${manifest.description || 'A powerful AI Agent'}</p>
|
|
1554
|
+
<div class="detail-grid">
|
|
1555
|
+
<div class="detail-item">
|
|
1556
|
+
<div class="detail-label" data-i18n="detailVersion">Version</div>
|
|
1557
|
+
<div class="detail-value">${manifest.version}</div>
|
|
1558
|
+
</div>
|
|
1559
|
+
<div class="detail-item">
|
|
1560
|
+
<div class="detail-label" data-i18n="detailRuntime">Runtime</div>
|
|
1561
|
+
<div class="detail-value">${runtimeInfo.type || 'OpenClaw'}</div>
|
|
1562
|
+
</div>
|
|
1563
|
+
<div class="detail-item">
|
|
1564
|
+
<div class="detail-label" data-i18n="detailDownloads">Downloads</div>
|
|
1565
|
+
<div class="detail-value">โฌ๏ธ ${manifest.downloads || 0}</div>
|
|
1566
|
+
</div>
|
|
1567
|
+
<div class="detail-item">
|
|
1568
|
+
<div class="detail-label" data-i18n="detailAuthor">Author</div>
|
|
1569
|
+
<div class="detail-value">${manifest.author || 'Anonymous'}</div>
|
|
1570
|
+
</div>
|
|
1571
|
+
</div>
|
|
1572
|
+
<div class="detail-install" title="Click to copy">
|
|
1573
|
+
<span class="code-text">npx agenthub install ${manifest.slug}</span>
|
|
1574
|
+
<button class="copy-btn" title="Copy">๐</button>
|
|
1575
|
+
</div>
|
|
1576
|
+
</div>
|
|
1577
|
+
|
|
1578
|
+
${persona.summary ? `
|
|
1579
|
+
<div class="section-card">
|
|
1580
|
+
<h3 data-i18n="personaTitle">๐ญ Personality</h3>
|
|
1581
|
+
<p style="color: var(--text-secondary); line-height: 1.8;">${persona.summary}</p>
|
|
1582
|
+
${persona.traits?.length > 0 ? `<p style="margin-top: 12px;"><strong data-i18n="personaTraits">Traits:</strong> ${persona.traits.join(', ')}</p>` : ''}
|
|
1583
|
+
${persona.expertise?.length > 0 ? `<p><strong data-i18n="personaExpertise">Expertise:</strong> ${persona.expertise.join(', ')}</p>` : ''}
|
|
1584
|
+
</div>
|
|
1585
|
+
` : ''}
|
|
1586
|
+
|
|
1587
|
+
<div class="section-card">
|
|
1588
|
+
<h3 data-i18n="memoryTitle">๐ง Memory Config</h3>
|
|
1589
|
+
${totalMemory > 0 ? `
|
|
1590
|
+
<div class="memory-bars">
|
|
1591
|
+
<div class="memory-bar public" style="flex: ${publicRatio}" title="Public"></div>
|
|
1592
|
+
<div class="memory-bar portable" style="flex: ${portableRatio}" title="Portable"></div>
|
|
1593
|
+
${privateRatio > 0 ? `<div class="memory-bar private" style="flex: ${privateRatio}" title="Private"></div>` : ''}
|
|
1594
|
+
</div>
|
|
1595
|
+
<div class="memory-legend">
|
|
1596
|
+
<span><span class="dot" style="background: var(--accent)"></span> <span data-i18n="memoryPublic">Public</span>: ${memoryInfo.public || 0}</span>
|
|
1597
|
+
<span><span class="dot" style="background: var(--accent-light)"></span> <span data-i18n="memoryPortable">Portable</span>: ${memoryInfo.portable || 0}</span>
|
|
1598
|
+
${memoryInfo.private > 0 ? `<span><span class="dot" style="background: var(--tag-content)"></span> <span data-i18n="memoryPrivate">Private</span>: ${memoryInfo.private || 0}</span>` : ''}
|
|
1599
|
+
</div>
|
|
1600
|
+
` : '<p style="color: var(--text-muted);" data-i18n="memoryNoData">No memory data</p>'}
|
|
1601
|
+
</div>
|
|
1602
|
+
|
|
1603
|
+
<div class="section-card">
|
|
1604
|
+
<h3 data-i18n="skillsTitle">๐ง Skills</h3>
|
|
1605
|
+
<div class="skills-list">${skillsHtml}</div>
|
|
1606
|
+
</div>
|
|
1607
|
+
|
|
1608
|
+
<div class="section-card">
|
|
1609
|
+
<h3 data-i18n="tagsTitle">๐ท๏ธ Tags</h3>
|
|
1610
|
+
<div class="tags-list">${tagsHtml}</div>
|
|
1611
|
+
</div>
|
|
1612
|
+
|
|
1613
|
+
<div class="section-card">
|
|
1614
|
+
<h3 data-i18n="requirementsTitle">โ๏ธ System Requirements</h3>
|
|
1615
|
+
${requirementsHtml.length > 0 ? `<ul class="requirements-list">${requirementsHtml.join('')}</ul>` : '<p style="color: var(--text-muted);" data-i18n="requirementsNone">No special requirements</p>'}
|
|
1616
|
+
</div>
|
|
1617
|
+
|
|
1618
|
+
<div class="section-card">
|
|
1619
|
+
<h3 data-i18n="installMethodTitle">๐ฅ Installation</h3>
|
|
1620
|
+
<p style="color: var(--text-secondary); margin-bottom: 16px;" data-i18n="installMethodDesc">Run in your workspace:</p>
|
|
1621
|
+
<div class="install-methods">
|
|
1622
|
+
<div class="install-box primary">
|
|
1623
|
+
<span class="badge-new">ๆจ่</span>
|
|
1624
|
+
<div class="install-label">npx (ๆ ้้ขๅฎ่ฃ
)</div>
|
|
1625
|
+
<div class="detail-install" title="Click to copy">
|
|
1626
|
+
<span class="code-text">npx agenthub install ${manifest.slug} --target-workspace ./my-workspace</span>
|
|
1627
|
+
<button class="copy-btn" title="Copy">๐</button>
|
|
1628
|
+
</div>
|
|
1629
|
+
</div>
|
|
1630
|
+
<div class="install-box">
|
|
1631
|
+
<div class="install-label">ๅทฒๆ CLI</div>
|
|
1632
|
+
<div class="detail-install" title="Click to copy">
|
|
1633
|
+
<span class="code-text">agenthub install ${manifest.slug}@${manifest.version} --target-workspace ./my-workspace</span>
|
|
1634
|
+
<button class="copy-btn" title="Copy">๐</button>
|
|
1635
|
+
</div>
|
|
1636
|
+
</div>
|
|
1637
|
+
</div>
|
|
1638
|
+
</div>
|
|
1639
|
+
`,
|
|
1640
|
+
{
|
|
1641
|
+
description: manifest.description || `${manifest.name || manifest.slug} - AI Agent on AgentHub. ${manifest.persona?.summary || ''}`.slice(0, 160),
|
|
1642
|
+
url: `https://agenthub.cyou/agents/${manifest.slug}`,
|
|
1643
|
+
type: "article"
|
|
1644
|
+
}
|
|
1645
|
+
);
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1648
|
+
export function renderStatsPage(statsData) {
|
|
1649
|
+
const { stats, ranking, recent } = statsData;
|
|
1650
|
+
|
|
1651
|
+
const rankingHtml = ranking.map((item, index) => `
|
|
1652
|
+
<tr>
|
|
1653
|
+
<td>${index + 1}</td>
|
|
1654
|
+
<td><a href="/agents/${item.slug}">${item.slug}</a></td>
|
|
1655
|
+
<td><strong>${item.downloads}</strong></td>
|
|
1656
|
+
<td style="color: var(--text-muted)">${item.lastDownload || '-'}</td>
|
|
1657
|
+
</tr>
|
|
1658
|
+
`).join('');
|
|
1659
|
+
|
|
1660
|
+
const recentHtml = recent.map(item => `
|
|
1661
|
+
<tr>
|
|
1662
|
+
<td><a href="/agents/${item.slug}">${item.slug}</a></td>
|
|
1663
|
+
<td style="color: var(--text-muted)">${item.installedAt || '-'}</td>
|
|
1664
|
+
<td><code style="color: var(--accent)">${item.targetWorkspace || '-'}</code></td>
|
|
1665
|
+
</tr>
|
|
1666
|
+
`).join('');
|
|
1667
|
+
|
|
1668
|
+
return page(
|
|
1669
|
+
"Statistics Center - AgentHub",
|
|
1670
|
+
`
|
|
1671
|
+
<a href="/" class="back-link" data-i18n="backToHome">โ Back to Home</a>
|
|
1672
|
+
|
|
1673
|
+
<div class="detail-header">
|
|
1674
|
+
<h1 class="detail-title" data-i18n="statsHeader">๐ Statistics Center</h1>
|
|
1675
|
+
<p class="detail-desc" data-i18n="statsDesc">AgentHub download statistics and data analysis</p>
|
|
1676
|
+
<div class="detail-grid">
|
|
1677
|
+
<div class="detail-item">
|
|
1678
|
+
<div class="detail-label" data-i18n="statsTotalAgents">Agent Count</div>
|
|
1679
|
+
<div class="detail-value">${stats.totalAgents}</div>
|
|
1680
|
+
</div>
|
|
1681
|
+
<div class="detail-item">
|
|
1682
|
+
<div class="detail-label" data-i18n="statsTotalDownloads">Total Downloads</div>
|
|
1683
|
+
<div class="detail-value">โฌ๏ธ ${stats.totalDownloads}</div>
|
|
1684
|
+
</div>
|
|
1685
|
+
<div class="detail-item">
|
|
1686
|
+
<div class="detail-label" data-i18n="statsTotalLogs">Download Logs</div>
|
|
1687
|
+
<div class="detail-value">${stats.totalLogs}</div>
|
|
1688
|
+
</div>
|
|
1689
|
+
</div>
|
|
1690
|
+
</div>
|
|
1691
|
+
|
|
1692
|
+
<div class="section-card">
|
|
1693
|
+
<h3 data-i18n="rankingTitle">๐ Download Ranking</h3>
|
|
1694
|
+
<table class="stats-table">
|
|
1695
|
+
<thead>
|
|
1696
|
+
<tr>
|
|
1697
|
+
<th data-i18n="rankingRank">Rank</th>
|
|
1698
|
+
<th data-i18n="rankingAgent">Agent</th>
|
|
1699
|
+
<th data-i18n="rankingDownloads">Downloads</th>
|
|
1700
|
+
<th data-i18n="rankingLastDownload">Last Download</th>
|
|
1701
|
+
</tr>
|
|
1702
|
+
</thead>
|
|
1703
|
+
<tbody>
|
|
1704
|
+
${rankingHtml || `<tr><td colspan="4" style="text-align: center; padding: 20px; color: var(--text-muted);" data-i18n="noData">No data</td></tr>`}
|
|
1705
|
+
</tbody>
|
|
1706
|
+
</table>
|
|
1707
|
+
</div>
|
|
1708
|
+
|
|
1709
|
+
<div class="section-card">
|
|
1710
|
+
<h3 data-i18n="recentTitle">๐ Recent Downloads</h3>
|
|
1711
|
+
<table class="stats-table">
|
|
1712
|
+
<thead>
|
|
1713
|
+
<tr>
|
|
1714
|
+
<th data-i18n="recentAgent">Agent</th>
|
|
1715
|
+
<th data-i18n="recentTime">Time</th>
|
|
1716
|
+
<th data-i18n="recentTarget">Target Path</th>
|
|
1717
|
+
</tr>
|
|
1718
|
+
</thead>
|
|
1719
|
+
<tbody>
|
|
1720
|
+
${recentHtml || `<tr><td colspan="3" style="text-align: center; padding: 20px; color: var(--text-muted);" data-i18n="noData">No data</td></tr>`}
|
|
1721
|
+
</tbody>
|
|
1722
|
+
</table>
|
|
1723
|
+
</div>
|
|
1724
|
+
`,
|
|
1725
|
+
{
|
|
1726
|
+
description: "AgentHub Statistics Center - View download rankings, recent activity, and platform analytics for AI Agents.",
|
|
1727
|
+
url: "https://agenthub.cyou/stats"
|
|
1728
|
+
}
|
|
1729
|
+
);
|
|
1730
|
+
}
|