fix: adapt frontend for legacy Chrome and runtime config

This commit is contained in:
fengxiangdebaozi committed 2026-07-11 16:55:08 +08:00
1 parent db2f21191c
commit 388a9133fc
84 files changed
+1186 -528

No files matched your search

@@ -10,7 +10,8 @@ import {
ThemeSwitcher,
} from "@/components/workspace/appearance-controls";
import { NotificationDialog } from "@/components/workspace/notification-dialog";
import { getStoredAuth, getAccountDisplayName } from "@/core/auth";
import { getStoredAuth } from "@/core/auth";
import { useLiveAccount } from "@/core/auth/use-live-account";
import { isWujieEnv } from "@/core/embed/wujie";
import { useUnreadCount } from "@/core/notifications";
import { useMyPosition } from "@/core/positions";
@@ -48,13 +49,14 @@ const Header = ({ collapsed }: HeaderProps) => {
const { data: unreadCount = 0 } = useUnreadCount();
const navigate = useNavigate();
const { pathname } = useLocation();
const liveAccount = useLiveAccount();
const auth = getStoredAuth();
const isAdmin = auth?.system_role === "admin";
const visibleMenuItems = useSidebarMenuItems(!!isAdmin);
const { data: myPosition } = useMyPosition();
const positionName = myPosition?.name?.trim() || "";
const displayName = getAccountDisplayName(auth);
const displayName = liveAccount.displayName;
const showTopNav = isDark && !collapsed && !isWujieEnv();
// 浅色(红/蓝)顶栏:一级导航正常横排进顶栏,不做深色那种围绕基座的特殊处理。
// 与 collapsed 解耦(折叠只影响侧边栏,一级导航始终可见);wujie 嵌入下隐藏,
@@ -30,6 +30,7 @@ import {
import { requestCrudService } from '@/service/request-axios-service';
import { authStorageGet } from '@/core/auth/scoped-storage';
import { copyTextToClipboard } from '@/core/clipboard';
import { readRuntimeEnv } from '@/env';
/**
* 通用问答组件
@@ -38,11 +39,11 @@ import { copyTextToClipboard } from '@/core/clipboard';
* @param initialMode - 初始模式(可选)
*/
const zncmUrl = import.meta.env.VITE_API_BASE_URL || '';
const chatUrl = import.meta.env.VITE_AIPI_CHAT_URL || '';
const generateUrl = import.meta.env.VITE_AIPI_GENERATE_CHAT_URL || '';
const taskChatUrl = import.meta.env.VITE_AIPI_TASK_CHAT_URL || '';
const knowledgeUrl = import.meta.env.VITE_AIPI_KNOWLEDGE_URL;
const zncmUrl = readRuntimeEnv('VITE_API_BASE_URL') || '';
const chatUrl = readRuntimeEnv('VITE_AIPI_CHAT_URL') || '';
const generateUrl = readRuntimeEnv('VITE_AIPI_GENERATE_CHAT_URL') || '';
const taskChatUrl = readRuntimeEnv('VITE_AIPI_TASK_CHAT_URL') || '';
const knowledgeUrl = readRuntimeEnv('VITE_AIPI_KNOWLEDGE_URL');
const service = requestCrudService;
const GeneralQA: React.FC<{
onNavigate?: (page: string) => void;
@@ -24,6 +24,7 @@ import { useTheme } from '@/contexts/ThemeContext';
import MarkdownRenderer from '@/strategy-components/MarkdownRenderer';
import { SourceItem } from './GeneralQA.types';
import '../qa/qa-animations.css';
import { readRuntimeEnv } from '@/env';
/**
* 单条检索结果。
@@ -241,7 +242,7 @@ export function ChatMessage<T extends QACommonMessage>({
const isDark = theme === 'dark';
const isUser = message.role === 'user';
const hasTrace = !isUser && !!(message.singleRagTrace || message.thinkingTrace);
const knowledgeUrl = import.meta.env.VITE_AIPI_KNOWLEDGE_URL;
const knowledgeUrl = readRuntimeEnv('VITE_AIPI_KNOWLEDGE_URL');
const [visible, setVisible] = useState(false); // 打开详情对话框
const [listData, setListData] = useState<SourceItem>({
title: '',
@@ -531,9 +532,9 @@ const RetrievalList: React.FC<RetrievalListProps> = ({ items }) => {
title: '',
content: '',
});
const knowledgeUrl = import.meta.env.VITE_AIPI_KNOWLEDGE_URL;
const b1SearchUrl = import.meta.env.VITE_AIPI_B1COH_URL;
const b2SearchUrl = import.meta.env.VITE_AIPI_B2ACTOR_URL;
const knowledgeUrl = readRuntimeEnv('VITE_AIPI_KNOWLEDGE_URL');
const b1SearchUrl = readRuntimeEnv('VITE_AIPI_B1COH_URL');
const b2SearchUrl = readRuntimeEnv('VITE_AIPI_B2ACTOR_URL');
const showDialog = (item: QARetrievalItem) => {
console.log('item', item)
if (item.type === 'more') {
@@ -13,6 +13,8 @@
--yellow: #f59e0b;
--red: #dc2626;
--purple: #7c3aed;
--accent-rgb: 220 38 38;
--text-muted-rgb: 107 114 128;
--button-text: #ffffff;
--surface-hover: rgba(220, 38, 38, 0.04);
--surface-hover-strong: rgba(220, 38, 38, 0.08);
@@ -55,6 +57,8 @@
--yellow: #f59e0b;
--red: #f43f5e;
--purple: #8b5cf6;
--accent-rgb: 59 130 246;
--text-muted-rgb: 148 163 184;
--button-text: #ffffff;
--surface-hover: rgba(255, 255, 255, 0.03);
--surface-hover-strong: rgba(255, 255, 255, 0.06);
@@ -137,6 +141,7 @@
}
.mope-chat .app-header {
background: var(--surface);
background: color-mix(in srgb, var(--surface) 92%, var(--accent) 8%);
border-bottom: 1px solid var(--border);
padding: 14px 18px;
@@ -179,6 +184,7 @@
flex-shrink: 0;
overflow-y: auto;
border-right: 1px solid var(--border);
background: var(--surface);
background: color-mix(in srgb, var(--surface) 96%, var(--accent) 4%);
}
@@ -194,6 +200,7 @@
flex-shrink: 0;
overflow-y: auto;
border-left: 1px solid var(--border);
background: var(--surface);
background: color-mix(in srgb, var(--surface) 96%, var(--accent) 4%);
}
@@ -322,11 +329,11 @@
letter-spacing: 0.3px;
}
.mope-chat .badge-starting { background: color-mix(in srgb, var(--accent) 15%, transparent); color: var(--accent); }
.mope-chat .badge-diverging { background: color-mix(in srgb, var(--yellow) 15%, transparent); color: var(--yellow); }
.mope-chat .badge-closing { background: color-mix(in srgb, var(--green) 15%, transparent); color: var(--green); }
.mope-chat .badge-done { background: color-mix(in srgb, var(--purple) 15%, transparent); color: var(--purple); }
.mope-chat .badge-default { background: color-mix(in srgb, var(--text-muted) 15%, transparent); color: var(--text-muted); }
.mope-chat .badge-starting { background: rgb(var(--accent-rgb) / 15%); background: color-mix(in srgb, var(--accent) 15%, transparent); color: var(--accent); }
.mope-chat .badge-diverging { background: rgb(245 158 11 / 15%); background: color-mix(in srgb, var(--yellow) 15%, transparent); color: var(--yellow); }
.mope-chat .badge-closing { background: rgb(16 185 129 / 15%); background: color-mix(in srgb, var(--green) 15%, transparent); color: var(--green); }
.mope-chat .badge-done { background: rgb(139 92 246 / 15%); background: color-mix(in srgb, var(--purple) 15%, transparent); color: var(--purple); }
.mope-chat .badge-default { background: rgb(var(--text-muted-rgb) / 15%); background: color-mix(in srgb, var(--text-muted) 15%, transparent); color: var(--text-muted); }
/* Spinner */
@keyframes spin {
@@ -133,6 +133,7 @@
.config-mode-switch {
display: inline-flex;
background: var(--surface);
background: color-mix(in srgb, var(--surface) 96%, var(--accent) 4%);
border: 1px solid var(--border);
border-radius: 12px;
@@ -281,6 +282,7 @@
.config-textarea::placeholder,
.config-input::placeholder,
.config-json-editor::placeholder {
color: rgb(var(--text-muted-rgb) / 72%);
color: color-mix(in srgb, var(--text-muted) 72%, transparent);
}
@@ -389,7 +389,9 @@
margin-top: 10px;
margin-bottom: 0;
padding: 10px 12px;
border: 1px solid color-mix(in srgb, var(--accent) 28%, transparent);
border: 1px solid rgb(var(--accent-rgb) / 28%);
border-color: color-mix(in srgb, var(--accent) 28%, transparent);
box-shadow: 0 8px 18px rgb(var(--accent-rgb) / 10%);
box-shadow: 0 8px 18px color-mix(in srgb, var(--accent) 10%, transparent);
}
@@ -8,6 +8,7 @@ import { Col, Loading, Pagination, Progress, Row } from 'tdesign-react';
import { requestCrudService } from '@/service/request-axios-service';
import { ActionColumn } from './ActionColumn';
import { resolveStatusIcon } from './icons';
import { readRuntimeEnv } from '@/env';
interface ActionAnalyzesProps {
TaskType?: string;
@@ -17,7 +18,7 @@ interface ActionAnalyzesProps {
}
const service = requestCrudService;
const zncmUrl = import.meta.env.VITE_API_BASE_URL || '';
const zncmUrl = readRuntimeEnv('VITE_API_BASE_URL') || '';
export const ActionAnalyzes: React.FC<ActionAnalyzesProps> = ({ title, category, subCategory}) => {
const { theme } = useTheme();
const isDark = theme === 'dark';
@@ -7,6 +7,7 @@ import { useNavigate } from 'react-router-dom';
import { Col, Pagination, Progress, Row } from 'tdesign-react';
import { requestCrudService } from '@/service/request-axios-service';
import { resolveStatusIcon } from './icons';
import { readRuntimeEnv } from '@/env';
interface ActionColumnProps {
TaskType?: string;
@@ -21,7 +22,7 @@ interface ActionColumnProps {
}
const service = requestCrudService;
const zncmUrl = import.meta.env.VITE_API_BASE_URL || '';
const zncmUrl = readRuntimeEnv('VITE_API_BASE_URL') || '';
export const ActionColumn: React.FC<ActionColumnProps> = ({ title, category, subCategory, icon, columnName, columnIndex, actionCount, actionList }) => {
const { theme } = useTheme();
const isDark = theme === 'dark';
@@ -9,6 +9,7 @@ import { toast } from 'sonner';
import { KanbanColumn } from './KanbanColumn';
import { TaskListItem } from './TaskManagement';
import { listBusinessMappings } from '@/strategy-components/api/business-mapping';
import { readRuntimeEnv } from '@/env';
interface TaskListPageProps {
title: string;
@@ -25,7 +26,7 @@ interface StateItem {
type ColumnType = 'unanalyzed' | 'running' | 'completed';
const service = requestCrudService;
const zncmUrl = import.meta.env.VITE_API_BASE_URL || '';
const zncmUrl = readRuntimeEnv('VITE_API_BASE_URL') || '';
/** 本页对应的业务码(3QFX = 3Q);用于查业务映射拿到要自动选用的业务链 / 单智能体。 */
const BUSINESS_CODE = '3Q';
@@ -9,6 +9,7 @@ import { toast } from 'sonner';
import { KanbanColumn } from './KanbanColumn';
import { TaskListItem } from './TaskManagement';
import { listBusinessMappings } from '@/strategy-components/api/business-mapping';
import { readRuntimeEnv } from '@/env';
interface TaskListPageProps {
title: string;
@@ -25,7 +26,7 @@ interface StateItem {
type ColumnType = 'unanalyzed' | 'running' | 'completed';
const service = requestCrudService;
const zncmUrl = import.meta.env.VITE_API_BASE_URL || '';
const zncmUrl = readRuntimeEnv('VITE_API_BASE_URL') || '';
/** 本页对应的业务码(任务FX = 6BF);用于查业务映射拿到要自动选用的业务链 / 单智能体。 */
const BUSINESS_CODE = '6BF';