+
{commandResult ? (commandResult.ok ? 成功 : 失败) : "-"}
@@ -956,7 +970,7 @@ export function SettingsPage({
: `${commandResult.duration_ms} ms`}
-
+
{formatJson(commandResult?.ok ? commandResult.result : commandResult?.error)}
diff --git a/apps/management-website/src/pages/SkillsPage.jsx b/apps/management-website/src/pages/SkillsPage.jsx
index aa611bea230312b168f5c50ab646bf4cbe7dc30f..1af23f4a550732c61b5de635c318468d08298f17 100644
--- a/apps/management-website/src/pages/SkillsPage.jsx
+++ b/apps/management-website/src/pages/SkillsPage.jsx
@@ -1,10 +1,11 @@
import React, { useEffect, useState } from "react";
-import { Alert, Button, Card, Form, Input, Modal, Spin, Table, Tag, Upload, message } from "antd";
+import { Button, Card, Empty, Form, Input, List, Modal, Space, Spin, Tag, Typography, Upload, message } from "antd";
import { api } from "../app/api-client.js";
import { CardTitleWithReload } from "../components/CardTitleWithReload.jsx";
import { DeleteActionButton } from "../components/DeleteActionButton.jsx";
+const { Paragraph, Text } = Typography;
const skillIdPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
function getRemoteStatusLabel(status) {
@@ -20,6 +21,10 @@ function getRemoteStatusLabel(status) {
}
}
+function getSkillDescription(skill) {
+ return String(skill?.description || "").trim();
+}
+
export function SkillsPage() {
const [items, setItems] = useState([]);
const [loading, setLoading] = useState(false);
@@ -110,51 +115,74 @@ export function SkillsPage() {
load()} />}
- extra={}
+ extra={}
>
- (row.is_builtin ? 内置 : 自定义)
- },
- { title: "远程状态", dataIndex: "remote_status", render: getRemoteStatusLabel },
- {
- title: "操作",
- render: (_, row) => (
- {
- await handleDelete(row);
- }}
- />
- )
- }
- ]}
- />
+
+ {items.length > 0 ? (
+ {
+ const description = getSkillDescription(skill);
+ return (
+
+
+
+
+ {skill.slug}
+ 技能 ID
+
+
+ {skill.is_builtin ? 内置 : 自定义}
+ {getRemoteStatusLabel(skill.remote_status)}
+
+
+
+
描述
+ {description ? (
+
+ {description}
+
+ ) : (
+
暂无描述
+ )}
+
+
+ {
+ await handleDelete(skill);
+ }}
+ />
+
+
+
+ );
+ }}
+ />
+ ) : (
+
+ )}
+
setOpen(false)}
onOk={async () => {
await handleSubmit();
}}
>
-
-
+
-
+
event?.fileList || []}
rules={[{ required: true, message: "必须上传技能 zip" }]}
- extra="zip 第一层必须包含 SKILL.md。安装过程将会跳过内建的安全检查机制,请自行确保该技能的安全性。"
+ extra="zip 第一层必须包含符合 AgentSkills 规范的 SKILL.md,frontmatter 至少包含 name 和 description。"
>
false} maxCount={1}>
diff --git a/apps/management-website/src/pages/SystemLogsPage.jsx b/apps/management-website/src/pages/SystemLogsPage.jsx
index 6b053e8af373e6146dc6c02479aa8ac9b5955002..04177e6cb2e0c92bc2fc69c2659e9f42fb40b2c7 100644
--- a/apps/management-website/src/pages/SystemLogsPage.jsx
+++ b/apps/management-website/src/pages/SystemLogsPage.jsx
@@ -154,6 +154,7 @@ export function SystemLogsPage() {
<>
loadAuditLogs()} />}
>
loadSystemInvocationLogs()} />}
>
loadKernelLogs()} />}
>
load()} />}
+ title={ load()} testId="systems-reload-button" />}
extra={(