release: bump version to 0.66.2
Some checks failed
ci / backend (push) Has been cancelled
ci / frontend (push) Has been cancelled
ci / delivery (push) Has been cancelled
release / images (push) Has been cancelled

This commit is contained in:
rayd1o
2026-05-26 08:45:33 +08:00
parent 887fec972e
commit eb4c4b7904
46 changed files with 250 additions and 235 deletions

View File

@@ -122,8 +122,8 @@ export function AdminLayout({ children }: { children: ReactNode }) {
</Button>
{!collapsed ? (
<div className="admin__brand-copy">
<span className="admin__brand-text">Planet</span>
<span className="admin__brand-subtitle">Admin</span>
<span className="admin__brand-text"></span>
<span className="admin__brand-subtitle"></span>
</div>
) : null}
</div>
@@ -208,7 +208,7 @@ export function AdminLayout({ children }: { children: ReactNode }) {
<strong>v{packageJson.version}</strong>
</div>
<SegmentedControl<AdminThemeMode>
ariaLabel="Admin 主题"
ariaLabel="控制台主题"
className="admin__theme-control admin__theme-control--sider"
options={themeOptions}
scale={0.72}

View File

@@ -334,7 +334,7 @@ function DashboardContent() {
</CardHeader>
<CardContent>
<Button asChild variant="primary">
<Link to="/earth"><Globe2 size={16} />访 Earth</Link>
<Link to="/earth"><Globe2 size={16} />访</Link>
</Button>
</CardContent>
</Card>

View File

@@ -801,7 +801,7 @@ const fieldLabels: Record<string, string> = {
}
const fieldHelp: Record<string, string> = {
demo_mode: '开启后访问 Earth 会直接显示 OOBE 引导,不再要求首次采集条件,也会忽略本机“先浏览”临时跳过。',
demo_mode: '开启后访问智能星球会直接显示 OOBE 引导,不再要求首次采集条件,也会忽略本机“先浏览”临时跳过。',
}
function fieldLabel(key: string) {
@@ -2977,7 +2977,7 @@ function ModuleConsole({ config }: { config: ModuleConfig }) {
scheduleDatasourceTaskPoll(record, taskId)
toast({
title: '数据库清理已入队',
description: `任务 ${text(taskId, '-')} 会异步删除采集记录并刷新 Earth`,
description: `任务 ${text(taskId, '-')} 会异步删除采集记录并刷新智能星球`,
tone: 'success',
})
} catch (error) {
@@ -3004,7 +3004,7 @@ function ModuleConsole({ config }: { config: ModuleConfig }) {
scheduleDatasourceTaskPoll(record, taskId)
toast({
title: '展示缓存清理已入队',
description: `任务 ${text(taskId, '-')} 会异步清理缓存并刷新 Earth`,
description: `任务 ${text(taskId, '-')} 会异步清理缓存并刷新智能星球`,
tone: 'success',
})
} catch (error) {
@@ -3519,9 +3519,9 @@ function ModuleConsole({ config }: { config: ModuleConfig }) {
setActionLoading(true)
try {
const response = await axios.get(apiPath('/system/cache/earth-layers'))
replaceSelectedWithPayload('earth-layer-cache', 'Earth 图层缓存', [{
replaceSelectedWithPayload('earth-layer-cache', '智能星球图层缓存', [{
...response.data,
__title: 'Earth 图层缓存',
__title: '智能星球图层缓存',
__module: '缓存',
__status: '已读取',
__metric: recordMetric(response.data),
@@ -4624,14 +4624,14 @@ function ModuleConsole({ config }: { config: ModuleConfig }) {
<Button variant="primary" onClick={() => void uploadBrandAsset()} loading={actionLoading} disabled={!brandUploadFile}><ImageUp size={15} /></Button>
<Button size="icon" variant="subtle" title="重置品牌配置" aria-label="重置品牌配置" onClick={() => setConfirmAction({
title: '重置品牌配置',
description: '确认恢复默认 Earth 品牌配置?当前自定义配置会被清空。',
description: '确认恢复默认智能星球品牌配置?当前自定义配置会被清空。',
danger: true,
confirmLabel: '重置',
run: () => requestAction('重置品牌配置', 'delete', '/earth/brand'),
})} loading={actionLoading}><RefreshCw size={15} /></Button>
<Button size="icon" variant="danger" title="删除品牌配置" aria-label="删除品牌配置" onClick={() => setConfirmAction({
title: '删除品牌配置',
description: '确认删除 Earth 品牌配置?',
description: '确认删除智能星球品牌配置?',
danger: true,
confirmLabel: '删除',
run: () => requestAction('删除品牌配置', 'delete', '/earth/brand'),
@@ -4641,7 +4641,7 @@ function ModuleConsole({ config }: { config: ModuleConfig }) {
{config === configs.earthContent && activeSection.key === 'about' ? (
<Button size="icon" variant="subtle" title="恢复默认关于信息" aria-label="恢复默认关于信息" onClick={() => setConfirmAction({
title: '恢复默认关于信息',
description: '确认恢复 Earth 关于卡片的默认内容?',
description: '确认恢复智能星球关于卡片的默认内容?',
danger: false,
confirmLabel: '恢复',
run: () => requestAction('恢复默认关于信息', 'delete', '/earth/about'),
@@ -4877,7 +4877,7 @@ function ModuleConsole({ config }: { config: ModuleConfig }) {
</details>
)}
</div>
) : <EmptyState title={isPlaceholderSection(activeSection.key) ? '后端能力未提供' : '暂无分组'} description={isPlaceholderSection(activeSection.key) ? '当前分区没有可用后端能力,Admin 不混入其他配置或假数据。' : '当前分区没有可配置项。'} />}
) : <EmptyState title={isPlaceholderSection(activeSection.key) ? '后端能力未提供' : '暂无分组'} description={isPlaceholderSection(activeSection.key) ? '当前分区没有可用后端能力,控制台不混入其他配置或假数据。' : '当前分区没有可配置项。'} />}
</Scrollbar>
</div>
</Panel>
@@ -4923,7 +4923,7 @@ function ModuleConsole({ config }: { config: ModuleConfig }) {
<Button key="task-status" size="icon" variant="subtle" icon="status" onClick={() => void loadTaskStatus(selected)} loading={actionLoading} title="任务状态" aria-label="任务状态" />,
<Button key="clear-cache" size="icon" variant="subtle" onClick={() => setConfirmAction({
title: '清理数据源缓存',
description: `确认清理 ${recordTitle(selected)} Earth 展示缓存?这不会删除数据库里的采集数据。`,
description: `确认清理 ${recordTitle(selected)}智能星球展示缓存?这不会删除数据库里的采集数据。`,
danger: false,
confirmLabel: '清理缓存',
run: () => clearDatasourceCache(selected),
@@ -4933,7 +4933,7 @@ function ModuleConsole({ config }: { config: ModuleConfig }) {
) : (
<Button key="delete-data" size="icon" variant="danger" onClick={() => setConfirmAction({
title: '清理数据库数据',
description: `确认删除 ${recordTitle(selected)} 的已采集数据库记录?这不会清理 Earth 展示缓存,此操作不可恢复。`,
description: `确认删除 ${recordTitle(selected)} 的已采集数据库记录?这不会清理智能星球展示缓存,此操作不可恢复。`,
danger: true,
confirmLabel: '删除数据',
run: () => clearDatasourceData(selected),
@@ -5042,14 +5042,14 @@ function ModuleConsole({ config }: { config: ModuleConfig }) {
<Button key="brand-upload-run" variant="primary" onClick={() => void uploadBrandAsset()} loading={actionLoading} disabled={!brandUploadFile}><ImageUp size={15} /></Button>,
<Button key="delete-brand" variant="danger" onClick={() => setConfirmAction({
title: '删除品牌配置',
description: '确认删除 Earth 品牌配置?',
description: '确认删除智能星球品牌配置?',
danger: true,
confirmLabel: '删除',
run: () => requestAction('删除品牌配置', 'delete', '/earth/brand'),
})} loading={actionLoading}><Trash2 size={15} /></Button>,
<Button key="reset-brand" variant="subtle" onClick={() => setConfirmAction({
title: '重置品牌配置',
description: '确认恢复默认 Earth 品牌配置?当前自定义配置会被清空。',
description: '确认恢复默认智能星球品牌配置?当前自定义配置会被清空。',
danger: true,
confirmLabel: '重置',
run: () => requestAction('重置品牌配置', 'delete', '/earth/brand'),
@@ -5171,16 +5171,16 @@ function ModuleConsole({ config }: { config: ModuleConfig }) {
}
if (config === configs.earthContent) {
actions.push(
<Button key="cache-status" size="icon" variant="subtle" onClick={() => void loadEarthLayerCacheStatus()} loading={actionLoading} title="查看 Earth 图层缓存" aria-label="查看 Earth 图层缓存">
<Button key="cache-status" size="icon" variant="subtle" onClick={() => void loadEarthLayerCacheStatus()} loading={actionLoading} title="查看智能星球图层缓存" aria-label="查看智能星球图层缓存">
<DatabaseZap size={15} />
</Button>,
<Button key="cache-clear" size="icon" variant="danger" onClick={() => setConfirmAction({
title: '清理 Earth 图层缓存',
description: '确认清理 Earth 图层缓存?清理后下次访问会重新生成。',
title: '清理智能星球图层缓存',
description: '确认清理智能星球图层缓存?清理后下次访问会重新生成。',
danger: true,
confirmLabel: '清理',
run: () => requestAction('清理 Earth 图层缓存', 'delete', '/system/cache/earth-layers', undefined, { refresh: false, successDescription: '缓存清理请求已提交,不会保存当前页面配置。' }),
})} loading={actionLoading} title="清理 Earth 图层缓存" aria-label="清理 Earth 图层缓存">
run: () => requestAction('清理智能星球图层缓存', 'delete', '/system/cache/earth-layers', undefined, { refresh: false, successDescription: '缓存清理请求已提交,不会保存当前页面配置。' }),
})} loading={actionLoading} title="清理智能星球图层缓存" aria-label="清理智能星球图层缓存">
<Trash2 size={15} />
</Button>,
)
@@ -5800,10 +5800,10 @@ const configs = {
detailTitle: 'AI 配置详情',
},
earthContent: {
title: 'Earth 内容',
description: '管理 Earth 品牌、边界、电视内容和内容资产。',
listTitle: 'Earth 内容配置',
listDescription: '只展示 Earth 品牌、边界构建和 TV 内容配置。',
title: '智能星球内容',
description: '管理智能星球品牌、边界、电视内容和内容资产。',
listTitle: '智能星球内容配置',
listDescription: '只展示智能星球品牌、边界构建和电视内容配置。',
viewMode: 'management',
sections: [
{ key: 'brand', label: '品牌标识', url: '/earth/brand', map: (payload) => singleRow(payload, 'brand', { __title: '品牌配置', __module: '品牌' }).map((row) => ({ ...row, __title: '品牌配置', __module: '品牌', __status: '已读取' })) },
@@ -5831,8 +5831,8 @@ const configs = {
{ key: 'models_3d', label: '3D 模型', map: emptyRows },
{ key: 'news_anchor_strategy', label: '新闻锚点策略', map: emptyRows },
],
actions: [makeAction('打开 Earth', <Globe2 size={15} />, '/earth')],
detailTitle: 'Earth 配置详情',
actions: [makeAction('打开智能星球', <Globe2 size={15} />, '/earth')],
detailTitle: '智能星球配置详情',
},
collection: {
title: '采集管理',

View File

@@ -43,9 +43,9 @@ const roleOptions = [
]
const gatekeeperOptions = [
{ value: 'docs_user', label: 'Docs 用户文档' },
{ value: 'docs_developer', label: 'Docs 开发文档' },
{ value: 'docs_admin', label: 'Docs 管理/运维文档' },
{ value: 'docs_user', label: '文档:用户文档' },
{ value: 'docs_developer', label: '文档:开发文档' },
{ value: 'docs_admin', label: '文档:管理/运维文档' },
]
function roleTone(role: string) {

View File

@@ -39,8 +39,8 @@ export const adminRouteGroups: AdminRouteGroup[] = [
export const adminRoutes: AdminRouteItem[] = [
{ path: '/admin', label: '仪表盘', group: 'overview', icon: CircleGauge, keywords: ['dashboard', '总览', '驾驶舱'] },
{ path: '/earth', label: 'Earth', group: 'overview', icon: Globe2, keywords: ['earth', '地球'] },
{ path: '/docs', label: 'Docs', group: 'overview', icon: FileText, keywords: ['docs', '文档', 'manual', '使用手册'] },
{ path: '/earth', label: '智能星球', group: 'overview', icon: Globe2, keywords: ['earth', '地球', '智能星球'] },
{ path: '/docs', label: '文档', group: 'overview', icon: FileText, keywords: ['docs', '文档', 'manual', '使用手册'] },
{ path: '/datasources', label: '数据源', group: 'collection', icon: Database, keywords: ['datasource', '采集', '目录'] },
{ path: '/data', label: '采集数据', group: 'collection', icon: AppWindow, keywords: ['data', 'records', '采集数据'] },
{ path: '/bgp', label: 'BGP观测', group: 'observability', icon: Network, keywords: ['bgp', '观测', '网络'] },
@@ -48,7 +48,7 @@ export const adminRoutes: AdminRouteItem[] = [
{ path: '/alerts/bgp', label: 'BGP 告警', group: 'alerts', icon: Network, keywords: ['alert', 'bgp', '风险'] },
{ path: '/alerts/situational', label: '态势告警', group: 'alerts', icon: Globe2, keywords: ['situational', '态势', '研判'] },
{ path: '/ai', label: 'AI', group: 'ops', icon: Bot, keywords: ['ai', 'provider', 'playground', 'prompt'] },
{ path: '/earth-content', label: 'Earth 内容', group: 'ops', icon: Globe2, keywords: ['earth', 'tv', 'boundary', 'brand'] },
{ path: '/earth-content', label: '智能星球内容', group: 'ops', icon: Globe2, keywords: ['earth', '地球', '智能星球', 'tv', 'boundary', 'brand'] },
{ path: '/collection-management', label: '采集管理', group: 'ops', icon: Database, keywords: ['collector', 'mapping', 'custom source'] },
{ path: '/logs', label: '系统日志', group: 'ops', icon: FileText, keywords: ['log', '日志', 'tail'], superAdminOnly: true },
{ path: '/users', label: '用户管理', group: 'ops', icon: Users, keywords: ['users', 'role', 'gatekeeper'] },

View File

@@ -77,7 +77,7 @@ const sectionTargets = [
{ key: 'prompts', label: '提示词', terms: ['prompt', 'system prompt', 'AI prompts'] },
{ key: 'playground', label: 'Playground', terms: ['playground', '测试', '对话'] },
] },
{ routePath: '/earth-content', routeLabel: 'Earth 内容', icon: Globe2, sections: [
{ routePath: '/earth-content', routeLabel: '智能星球内容', icon: Globe2, sections: [
{ key: 'brand', label: '品牌标识', terms: ['logo', '标题', 'subtitle'] },
{ key: 'earth_assets', label: '国界精度', terms: ['boundary', 'PMTiles', '边界'] },
{ key: 'tv', label: '电视直播', terms: ['TV', '直播源', '频道'] },
@@ -115,7 +115,7 @@ const fieldTargets = [
{ routePath: '/ai', routeLabel: 'AI', sectionKey: 'tools', sectionLabel: '工具调用', labels: ['搜索供应商', 'API 基础地址', 'WebSearch API Key', '最大结果数', '搜索深度', 'SerpAPI 引擎', 'SearXNG 分类', 'OCR 供应商', 'OCR API Key', '测试 Web Search 连通性'] },
{ routePath: '/ai', routeLabel: 'AI', sectionKey: 'prompts', sectionLabel: '提示词', labels: ['System Prompt', '任务提示词', '重置 Prompt'] },
{ routePath: '/collection-management', routeLabel: '采集管理', sectionKey: 'collector_credentials', sectionLabel: '采集器', labels: ['凭证教程', '生成凭证教程', '采集器配置', '映射模板', '目标 Schema'] },
{ routePath: '/earth-content', routeLabel: 'Earth 内容', sectionKey: 'tv', sectionLabel: '电视直播', labels: ['默认频道', '自动回退', '直播源', '频道', '主页地址'] },
{ routePath: '/earth-content', routeLabel: '智能星球内容', sectionKey: 'tv', sectionLabel: '电视直播', labels: ['默认频道', '自动回退', '直播源', '频道', '主页地址'] },
{ routePath: '/settings', routeLabel: '设置', sectionKey: 'smtp', sectionLabel: 'SMTP 邮件', labels: ['主机', '端口', '用户名', '密码', '使用 TLS', '发件邮箱'] },
]
@@ -200,7 +200,7 @@ const dynamicEndpoints = [
{ routePath: '/users', routeLabel: '用户管理', icon: Users, sectionKey: 'users', sectionLabel: '用户', url: '/users' },
{ routePath: '/admin', routeLabel: '仪表盘', icon: CircleGauge, sectionKey: 'overview', sectionLabel: '总览', url: '/health' },
{ routePath: '/collection-management', routeLabel: '采集管理', icon: HardDrive, sectionKey: 'collector_credentials', sectionLabel: '采集器', url: '/datasources/configs/all' },
{ routePath: '/earth-content', routeLabel: 'Earth 内容', icon: Globe2, sectionKey: 'tv', sectionLabel: '电视直播', url: '/settings/tv' },
{ routePath: '/earth-content', routeLabel: '智能星球内容', icon: Globe2, sectionKey: 'tv', sectionLabel: '电视直播', url: '/settings/tv' },
]
function flattenRecordValues(record: Record<string, unknown>, limit = 16) {

View File

@@ -31,7 +31,7 @@ export function AuthShell({ eyebrow, title, description, children, aside }: Auth
<aside className="auth-shell__aside">
{aside || (
<>
<span className="auth-shell__aside-kicker">Modern Admin</span>
<span className="auth-shell__aside-kicker"></span>
<h2>AI Earth </h2>
<p>使 `/admin` </p>
</>

View File

@@ -310,10 +310,10 @@ export default function Docs() {
<main className="docs-page" data-theme={effectiveTheme}>
<aside className="docs-sidebar" aria-label="Documentation navigation">
<Link className="docs-brand" to="/docs">
<span className="docs-brand__mark">P</span>
<span className="docs-brand__mark"></span>
<span>
<span className="docs-brand__title">
{lang === 'zh' ? '星球计划文档' : 'Planet Docs'}
{lang === 'zh' ? '智能星球文档' : 'Intelligent Planet Docs'}
</span>
<span className="docs-brand__subtitle">
{lang === 'zh' ? '开发者和用户手册' : 'Developer & User Guide'}
@@ -385,7 +385,7 @@ export default function Docs() {
<header className="docs-header">
<div>
<p className="docs-header__eyebrow">
{activeHeaderEntry ? getDocsGroupLabel(activeHeaderEntry.group, lang) : 'Docs'}
{activeHeaderEntry ? getDocsGroupLabel(activeHeaderEntry.group, lang) : lang === 'zh' ? '文档' : 'Docs'}
</p>
<h1 className="docs-header__title">
{activeHeaderEntry?.title || (lang === 'zh' ? '文档不可用' : 'Document unavailable')}

View File

@@ -38,7 +38,7 @@ const DOCS_GROUP_LABELS: Record<DocsLang, Record<DocsGroup, string>> = {
Overview: '概览',
Architecture: '业务架构',
Manual: '使用手册',
Earth: '地球可视化',
Earth: '智能星球',
Frontend: '前端',
Backend: '后端',
Agents: '智能体',
@@ -49,7 +49,7 @@ const DOCS_GROUP_LABELS: Record<DocsLang, Record<DocsGroup, string>> = {
Overview: 'Overview',
Architecture: 'Architecture',
Manual: 'Manual',
Earth: 'Earth',
Earth: 'Intelligent Planet',
Frontend: 'Frontend',
Backend: 'Backend',
Agents: 'Agents',
@@ -72,8 +72,8 @@ export const DOCS_METADATA: Record<string, DocsMetadataEntry> = {
en: { title: 'Quickstart', group: 'Manual', order: 2 },
},
'manual.md': {
zh: { title: 'Planet 使用手册', group: 'Manual', order: 1 },
en: { title: 'Planet Manual', group: 'Manual', order: 1 },
zh: { title: '智能星球使用手册', group: 'Manual', order: 1 },
en: { title: 'Intelligent Planet Manual', group: 'Manual', order: 1 },
},
'faq.md': {
zh: { title: '常见问题', group: 'Manual', order: 3 },
@@ -84,20 +84,20 @@ export const DOCS_METADATA: Record<string, DocsMetadataEntry> = {
en: { title: 'Business Architecture and Data Flows', group: 'Architecture', order: 5 },
},
'earth-frontend-context.md': {
zh: { title: 'Earth 前端结构', group: 'Earth', order: 10 },
en: { title: 'Earth Frontend Context', group: 'Earth', order: 10 },
zh: { title: '智能星球前端结构', group: 'Earth', order: 10 },
en: { title: 'Intelligent Planet Frontend Context', group: 'Earth', order: 10 },
},
'earth-layer-style-reference.md': {
zh: { title: 'Earth 图层样式属性索引', group: 'Earth', order: 11 },
en: { title: 'Earth Layer Style Reference', group: 'Earth', order: 11 },
zh: { title: '智能星球图层样式属性索引', group: 'Earth', order: 11 },
en: { title: 'Intelligent Planet Layer Style Reference', group: 'Earth', order: 11 },
},
'earth-render-layer-order.md': {
zh: { title: 'Earth 渲染图层顺序', group: 'Earth', order: 12 },
en: { title: 'Earth Render Layer Order', group: 'Earth', order: 12 },
zh: { title: '智能星球渲染图层顺序', group: 'Earth', order: 12 },
en: { title: 'Intelligent Planet Render Layer Order', group: 'Earth', order: 12 },
},
'earth-satellite-footprint-policy.md': {
zh: { title: 'Earth 卫星覆盖策略', group: 'Earth', order: 13 },
en: { title: 'Earth Satellite Footprint Policy', group: 'Earth', order: 13 },
zh: { title: '智能星球卫星覆盖策略', group: 'Earth', order: 13 },
en: { title: 'Intelligent Planet Satellite Footprint Policy', group: 'Earth', order: 13 },
},
'earth-bgp-context.md': {
zh: { title: 'BGP 态势上下文', group: 'Earth', order: 14 },
@@ -108,12 +108,12 @@ export const DOCS_METADATA: Record<string, DocsMetadataEntry> = {
en: { title: 'News Live Streams Collector Format', group: 'Backend', order: 36 },
},
'earth-interactable-usage.md': {
zh: { title: 'Earth 可交互图标接入', group: 'Earth', order: 16 },
en: { title: 'Earth Interactable Usage', group: 'Earth', order: 16 },
zh: { title: '智能星球可交互图标接入', group: 'Earth', order: 16 },
en: { title: 'Intelligent Planet Interactable Usage', group: 'Earth', order: 16 },
},
'earth-toolbar-overlay-coordination.md': {
zh: { title: 'Earth 工具栏与浮层协同', group: 'Earth', order: 17 },
en: { title: 'Earth Toolbar and Overlay Coordination', group: 'Earth', order: 17 },
zh: { title: '智能星球工具栏与浮层协同', group: 'Earth', order: 17 },
en: { title: 'Intelligent Planet Toolbar and Overlay Coordination', group: 'Earth', order: 17 },
},
'frontend-admin-frontend-context.md': {
zh: { title: '控制台前端结构', group: 'Frontend', order: 20 },
@@ -164,8 +164,8 @@ export const DOCS_METADATA: Record<string, DocsMetadataEntry> = {
en: { title: 'AI Provider Guide', group: 'Agents', order: 40 },
},
'ops-runbook.md': {
zh: { title: 'Planet 运维手册', group: 'Ops', order: 49 },
en: { title: 'Planet Ops Runbook', group: 'Ops', order: 49 },
zh: { title: '智能星球运维手册', group: 'Ops', order: 49 },
en: { title: 'Intelligent Planet Ops Runbook', group: 'Ops', order: 49 },
},
'ops-docker-compose-buildx-upgrade.md': {
zh: { title: 'Docker + Compose + Buildx 升级', group: 'Ops', order: 50 },