From 74113b3e6e4f676bfa47ddefe7b8e6732b7a0c2b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=90=89=E9=91=AB=E5=8D=87?=
Date: Fri, 12 Jun 2026 21:20:33 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=99=BA=E8=83=BD=E4=BD=93=E4=B8=8E?=
=?UTF-8?q?=E6=8A=80=E8=83=BD=E5=88=97=E8=A1=A8=E6=98=BE=E7=A4=BA=E5=88=9B?=
=?UTF-8?q?=E5=BB=BA=E6=97=B6=E9=97=B4=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 新增共享 formatDateTime 工具(YYYY-MM-DD HH:mm)
- agent-card 卡片/列表视图在发布者下方显示创建时间
- skill 设置页 metaNodes 显示创建时间
Co-Authored-By: Claude Opus 4.8 (1M context)
---
.../components/workspace/agents/agent-card.tsx | 15 +++++++++++++++
.../workspace/settings/skill-settings-page.tsx | 9 +++++++++
frontend-web/src/core/utils/datetime.ts | 15 +++++++++++++++
3 files changed, 39 insertions(+)
diff --git a/frontend-web/src/components/workspace/agents/agent-card.tsx b/frontend-web/src/components/workspace/agents/agent-card.tsx
index 21c710f4..cfd7e8c2 100644
--- a/frontend-web/src/components/workspace/agents/agent-card.tsx
+++ b/frontend-web/src/components/workspace/agents/agent-card.tsx
@@ -2,6 +2,7 @@
import {
BotIcon,
+ ClockIcon,
CopyIcon,
EyeOffIcon,
GlobeIcon,
@@ -78,6 +79,7 @@ import type { Agent, AgentQuestion, UpdateAgentRequest } from "@/core/agents";
import { getStoredAuth } from "@/core/auth";
import { useI18n } from "@/core/i18n/hooks";
import { useSkills } from "@/core/skills/hooks";
+import { formatDateTime } from "@/core/utils/datetime";
import { desensitize } from "@/lib/desensitize";
import { cn } from "@/lib/utils";
@@ -605,6 +607,17 @@ export function AgentCard({ agent, layout = "card", onPublisherClick }: AgentCar
) : null;
+ const createdAtText = formatDateTime(agent.created_at);
+ const createdAtNode = createdAtText ? (
+
+
+ 创建时间:{createdAtText}
+
+ ) : null;
+
// 技能英文名 → 中文名映射,用于把智能体的技能徽章显示为中文(agent.skills 只存英文名)。
const skillNameZhMap = useMemo(() => {
const map = new Map();
@@ -820,6 +833,7 @@ export function AgentCard({ agent, layout = "card", onPublisherClick }: AgentCar
)}
{publisherNode && {publisherNode}
}
+ {createdAtNode && {createdAtNode}
}
{(agent.tags?.length ?? 0) > 0 && (
@@ -866,6 +880,7 @@ export function AgentCard({ agent, layout = "card", onPublisherClick }: AgentCar
)}
{publisherNode && {publisherNode}
}
+ {createdAtNode && {createdAtNode}
}
{showActionRow && actionButtons}
diff --git a/frontend-web/src/components/workspace/settings/skill-settings-page.tsx b/frontend-web/src/components/workspace/settings/skill-settings-page.tsx
index 916c83ca..9c16d7e9 100644
--- a/frontend-web/src/components/workspace/settings/skill-settings-page.tsx
+++ b/frontend-web/src/components/workspace/settings/skill-settings-page.tsx
@@ -86,6 +86,7 @@ import {
} from "@/core/skills/hooks";
import { usePublishSquares, useViewMode } from "@/core/system-settings/hooks";
import type { Skill } from "@/core/skills/type";
+import { formatDateTime } from "@/core/utils/datetime";
import { env } from "@/env";
import { desensitize } from "@/lib/desensitize";
import { cn } from "@/lib/utils";
@@ -848,6 +849,14 @@ export function SkillRow({
: t.settings.skills.useCountInlineZero}
)}
+ {formatDateTime(skill.created_at) && (
+
+
+
+ 创建时间:{formatDateTime(skill.created_at)}
+
+
+ )}
{(skill.tags?.length ?? 0) > 0 && (
)}
diff --git a/frontend-web/src/core/utils/datetime.ts b/frontend-web/src/core/utils/datetime.ts
index 3ec7203d..fea6af99 100644
--- a/frontend-web/src/core/utils/datetime.ts
+++ b/frontend-web/src/core/utils/datetime.ts
@@ -25,3 +25,18 @@ export function formatTimeAgo(date: Date | string | number, locale?: Locale) {
locale: getDateFnsLocale(effectiveLocale),
});
}
+
+/**
+ * Format a created/updated timestamp as `YYYY-MM-DD HH:mm`.
+ * Returns an empty string for missing or unparseable values.
+ */
+export function formatDateTime(value?: Date | string | number | null): string {
+ if (value === null || value === undefined || value === "") return "";
+ const date = value instanceof Date ? value : new Date(value);
+ if (Number.isNaN(date.getTime())) return "";
+ const pad = (n: number) => String(n).padStart(2, "0");
+ return (
+ `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ` +
+ `${pad(date.getHours())}:${pad(date.getMinutes())}`
+ );
+}