diff --git a/yuthon_ai_agent/static/src/css/ai_chat.css b/yuthon_ai_agent/static/src/css/ai_chat.css
index 6ef96cd39..52aecc9a7 100644
--- a/yuthon_ai_agent/static/src/css/ai_chat.css
+++ b/yuthon_ai_agent/static/src/css/ai_chat.css
@@ -157,13 +157,6 @@
font-size: 12px;
white-space: nowrap;
}
-.o_ai_link_url {
- font-size: 11px;
- opacity: 0.7;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
/* === 消息中附件缩略图 === */
.ai-chat-msg-attachments {
diff --git a/yuthon_ai_agent/static/src/css/ai_floating.css b/yuthon_ai_agent/static/src/css/ai_floating.css
index 218b97fdc..85bc69b4e 100644
--- a/yuthon_ai_agent/static/src/css/ai_floating.css
+++ b/yuthon_ai_agent/static/src/css/ai_floating.css
@@ -366,13 +366,6 @@
font-size: 12px;
white-space: nowrap;
}
-.o_ai_link_url {
- font-size: 11px;
- opacity: 0.7;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
/* === 消息中的附件缩略图 === */
.o_ai_msg_attachments {
diff --git a/yuthon_ai_agent/static/src/js/ai_chat_action.js b/yuthon_ai_agent/static/src/js/ai_chat_action.js
index c0f784c49..673d1daf1 100644
--- a/yuthon_ai_agent/static/src/js/ai_chat_action.js
+++ b/yuthon_ai_agent/static/src/js/ai_chat_action.js
@@ -35,7 +35,24 @@ export class AiChatAction extends Component {
.replace(/【附件:[^】]+】[\s\S]*?--- 附件内容结束 ---/g, '')
.replace(/\[附件[::]\s*[^\]]+\]\n?/g, '')
.trim() || safe;
- // 不做额外处理,URL 保持纯文本显示
+ // 1) 先处理 Markdown 风格链接 [显示名](url) → 卡片使用自定义名称
+ display = display.replace(
+ /\[([^\]]+)\]\((https?:\/\/[^\s<>"')\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]+)\)/g,
+ (_, label, url) => {
+ const rawUrl = url.replace(/&/g, '&');
+ return `${this._escapeHtml(label)}`;
+ }
+ );
+ // 2) 再处理裸 URL → 域名作为卡片名称
+ display = display.replace(
+ /(https?:\/\/[^\s<>"'\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]+)/g,
+ (url) => {
+ const rawUrl = url.replace(/&/g, '&');
+ let domain = '';
+ try { domain = new URL(rawUrl).hostname; } catch (_) { domain = rawUrl; }
+ return `${this._escapeHtml(domain)}`;
+ }
+ );
return display.replace(/\n/g, '
');
}
diff --git a/yuthon_ai_agent/static/src/js/ai_floating.js b/yuthon_ai_agent/static/src/js/ai_floating.js
index e0f36358b..3d21abca8 100644
--- a/yuthon_ai_agent/static/src/js/ai_floating.js
+++ b/yuthon_ai_agent/static/src/js/ai_floating.js
@@ -235,7 +235,28 @@ function renderContent(text) {
.replace(/【附件:[^】]+】[\s\S]*?--- 附件内容结束 ---/g, '')
.replace(/\[附件[::]\s*[^\]]+\]\n?/g, '')
.trim() || safe; // 若 strip 后为空,回退到 safe 继续处理 URL
- // 不做额外处理,URL 保持纯文本显示
+ // 1) 先处理 Markdown 风格链接 [显示名](url) → 卡片使用自定义名称
+ display = display.replace(
+ /\[([^\]]+)\]\((https?:\/\/[^\s<>"')\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]+)\)/g,
+ (_, label, url) => {
+ const rawUrl = url.replace(/&/g, '&');
+ return `${escapeHtml(label)}`;
+ }
+ );
+ // 2) 再处理裸 URL → 域名作为卡片名称
+ display = display.replace(
+ /(https?:\/\/[^\s<>"'\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]+)/g,
+ (url) => {
+ const rawUrl = url.replace(/&/g, '&');
+ let domain = '';
+ try {
+ domain = new URL(rawUrl).hostname;
+ } catch (_) {
+ domain = rawUrl;
+ }
+ return `${escapeHtml(domain)}`;
+ }
+ );
// 换行转
display = display.replace(/\n/g, '
');
return display;