From 5ad0cf1d28130da03ec1e935152919471e2e8d21 Mon Sep 17 00:00:00 2001 From: Asfmq <2696428814@qq.com> Date: Sat, 11 Jul 2026 14:12:11 +0800 Subject: [PATCH] =?UTF-8?q?-=20Config=20=E6=8C=89=E8=81=8C=E8=B4=A3?= =?UTF-8?q?=E6=8B=86=E5=88=86=E4=B8=BA=20LlmConfig/EmbeddingConfig/VisionC?= =?UTF-8?q?onfig/CdsConfig/StorageConfig=20=E4=BA=94=E4=B8=AA=E5=AD=90?= =?UTF-8?q?=E7=BB=93=E6=9E=84=20-=20AppState=20=E6=8B=86=E5=88=86=E4=B8=BA?= =?UTF-8?q?=20LlmState/DataSourceState/SessionState=20=E4=B8=89=E4=B8=AA?= =?UTF-8?q?=E5=AD=90=E7=BB=93=E6=9E=84=EF=BC=8C=E6=B6=88=E9=99=A4=2050+=20?= =?UTF-8?q?=E5=B9=B3=E9=93=BA=E5=AD=97=E6=AE=B5=20-=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20ServiceError=20=E7=BB=93=E6=9E=84=E5=8C=96=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=9B=BF=E4=BB=A3=20handler=20=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=20msg.contains()=20=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=20-=20=E7=A7=BB=E9=99=A4=20api::handlers=20?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E5=91=BD=E5=90=8D=E7=A9=BA=E9=97=B4=EF=BC=8C?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E7=9B=B4=E6=8E=A5=E5=BC=95=E7=94=A8=20agent/?= =?UTF-8?q?auth/papers=20=E7=AD=89=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - login_rate_limiter/upload_rate_limiter 从 Mutex\ 迁移为 DashMap(无锁) - 新增 session_last_active: DashMap\,auth 中间件快速路径免写锁 - 会话过期清理改为按间隔触发(300s),避免每次请求全表扫描 - MAX_SESSIONS 1000→10000,SSE 广播通道 256→1024 - AgentTool trait 新增 is_internal()/display_name(),SSE 事件携带工具元数据 - 新增 GET /chat/tools 端点暴露注册工具列表 - pending_questions/pending_permissions 增加 created_at 时间戳,自动清理过期条目(10min TTL) - Agent 超时现在正确 abort 后台任务并设置取消令牌 - FITS 解析: APOGEE/DESI 改用 read_image+切片替代 read_rows(修复 fitsio panic) - ZTF: CIRCLE 参数分隔符 +→空格(修复 IRSA 400),半径自动裁剪至硬上限 - MAST TESS: parse_tic_json 兼容数组/对象两种 API 响应格式 - 统一检索: per_target_limit 默认 50→1,sources 支持 per-source release/version - Gaia 测光从 VizieR 镜像切换至官方 TAP 服务 - 向量化降级从串行改为并发 5 条/批(buffer_unordered) - 混合检索 RRF 合并从借用改为 owned RetrievalResult - PDF 中间件: URL 解码 %2F/%2E 后判扩展名;文件名过滤非 ASCII + 禁 \ 防头注入 - chat_agent 日志截断问题内容至 50 字符;list_sessions 强制 limit clamp - 设计令牌三层架构: primitive→semantic→component,浅色暖纸张学术/暗色 Night Indigo - useTheme hook + ThemeToggle 侧边栏组件 + main.tsx 防 FOUC 初始化 - 全组件从硬编码 slate 色迁移至语义令牌(bg-surface/text-content/border-subtle 等) - 新增 ToastContainer 非阻塞通知系统 - deploy.sh 引入 SSH ControlMaster 单次密码复用 --- .gitignore | 2 + dashboard/src/App.tsx | 675 +++++---- dashboard/src/components/AIAssistantPanel.tsx | 141 +- .../src/components/CitationGalaxyCanvas.tsx | 39 +- dashboard/src/components/CustomSelect.tsx | 12 +- dashboard/src/components/ErrorBoundary.tsx | 12 +- dashboard/src/components/Logo.tsx | 12 +- dashboard/src/components/PaperCard.tsx | 33 +- .../src/components/agent/AgentInputArea.tsx | 30 +- .../src/components/agent/AgentMessageList.tsx | 355 +++-- .../components/agent/AgentMetricsPanel.tsx | 183 ++- .../components/agent/AgentSessionSidebar.tsx | 60 +- dashboard/src/components/agent/AnswerCard.tsx | 6 +- .../components/agent/AskUserQuestionCard.tsx | 28 +- .../src/components/agent/AuditLogViewer.tsx | 66 +- .../agent/PermissionRequestCard.tsx | 20 +- .../components/agent/SpecialToolRenderers.tsx | 315 ++-- .../components/agent/SubAgentContainer.tsx | 135 +- .../src/components/agent/ThoughtCard.tsx | 62 +- .../src/components/agent/ToolCallCard.tsx | 192 ++- dashboard/src/components/agent/constants.ts | 12 +- dashboard/src/components/agent/index.ts | 3 +- .../src/components/agent/subagentRouting.ts | 58 +- .../src/components/agent/toolDisplayNames.ts | 118 +- dashboard/src/components/agent/types.ts | 10 +- dashboard/src/components/agent/useAgentSSE.ts | 8 +- .../src/components/dialogs/BaseModal.tsx | 6 +- .../components/dialogs/PaperDetailModal.tsx | 44 +- .../components/dialogs/UncachedPaperModal.tsx | 2 +- dashboard/src/components/layout/Sidebar.tsx | 67 +- .../src/components/layout/ThemeToggle.tsx | 47 + .../src/components/layout/ToastContainer.tsx | 71 + .../ObservationPreviewRenderer.tsx | 238 ++- .../observation/ObservationResultCard.tsx | 57 +- .../components/observation/SpectrumPlot.tsx | 70 +- .../observation/UnifiedSearchPanel.tsx | 1314 ++++++++++++----- .../src/components/observation/constants.ts | 43 +- .../src/components/reader/BilingualViewer.tsx | 253 ++-- .../components/reader/ReaderNotesSidebar.tsx | 58 +- .../src/components/reader/ReaderToolbar.tsx | 90 +- .../src/components/sync/BatchPipelineCard.tsx | 52 +- .../components/sync/BookmarkletToolCard.tsx | 28 +- .../src/components/sync/MetadataSyncCard.tsx | 58 +- dashboard/src/hooks/useObservation.ts | 49 +- dashboard/src/hooks/useResearchAgent.ts | 44 +- dashboard/src/hooks/useTheme.ts | 69 + dashboard/src/index.css | 411 ++++-- dashboard/src/main.tsx | 15 + dashboard/src/pages/CitationPanel.tsx | 76 +- dashboard/src/pages/LibraryPanel.tsx | 144 +- dashboard/src/pages/ObservationPanel.tsx | 221 ++- dashboard/src/pages/ReaderPanel.tsx | 1 + dashboard/src/pages/ResearchAgentPanel.tsx | 12 +- dashboard/src/pages/SearchPanel.tsx | 141 +- dashboard/src/pages/SyncPanel.tsx | 38 +- dashboard/src/utils/paper.tsx | 63 +- deploy.sh | 22 +- src/agent/compact.rs | 2 +- src/agent/memory/extraction.rs | 2 +- src/agent/runtime/events.rs | 8 + src/agent/runtime/executor/helpers.rs | 9 + src/agent/runtime/executor/mod.rs | 65 +- src/agent/runtime/mod.rs | 52 +- src/agent/runtime/streaming_executor.rs | 90 +- src/agent/subagent.rs | 20 +- src/agent/team/teammate.rs | 2 +- src/agent/tools/ask_user.rs | 10 +- src/agent/tools/astro/analyze_image.rs | 26 +- src/agent/tools/astro/research/library.rs | 10 +- src/agent/tools/astro/research/metadata.rs | 6 +- src/agent/tools/astro/research/note.rs | 12 +- src/agent/tools/astro/research/observation.rs | 8 +- src/agent/tools/astro/research/paper.rs | 12 +- src/agent/tools/astro/research/rag.rs | 13 +- src/agent/tools/astro/research/target.rs | 4 + src/agent/tools/astro/research/vizier.rs | 42 +- src/agent/tools/astro/system/process.rs | 4 + src/agent/tools/astro/system/search.rs | 4 + src/agent/tools/background.rs | 12 + src/agent/tools/compress.rs | 8 + src/agent/tools/filesystem/bash.rs | 4 + src/agent/tools/filesystem/edit.rs | 4 + src/agent/tools/filesystem/glob.rs | 4 + src/agent/tools/filesystem/grep.rs | 4 + src/agent/tools/filesystem/read.rs | 4 + src/agent/tools/filesystem/security.rs | 4 +- src/agent/tools/filesystem/write.rs | 4 + src/agent/tools/memory.rs | 8 + src/agent/tools/mod.rs | 19 + src/agent/tools/search_history.rs | 8 + src/agent/tools/skill.rs | 8 + src/agent/tools/subagent.rs | 4 + src/agent/tools/team.rs | 16 + src/agent/tools/todo.rs | 98 +- src/api/agent.rs | 74 +- src/api/auth.rs | 117 +- src/api/catalog.rs | 29 +- src/api/error.rs | 28 + src/api/mod.rs | 148 +- src/api/observation.rs | 71 +- src/api/papers.rs | 136 +- src/api/permissions.rs | 19 +- src/api/sync.rs | 8 +- src/api/targets.rs | 15 +- src/bin/cli.rs | 178 +-- src/bin/health_check.rs | 2 +- src/clients/cds/vizier.rs | 63 +- src/clients/gaia/mod.rs | 16 +- src/clients/irsa/mod.rs | 34 +- src/clients/lamost/mod.rs | 19 +- src/clients/llm/chat.rs | 20 +- src/clients/mast/mod.rs | 129 +- src/lib.rs | 379 ++--- src/main.rs | 312 ++-- src/services/batch/asset/helpers.rs | 20 +- src/services/batch/asset/mod.rs | 16 +- src/services/batch/asset/process.rs | 19 +- src/services/batch/meta.rs | 6 +- src/services/citation.rs | 22 +- src/services/download/mod.rs | 15 +- src/services/error.rs | 65 + src/services/mod.rs | 1 + src/services/observation/desi.rs | 11 +- src/services/observation/dispatch.rs | 60 +- src/services/observation/gaia.rs | 18 +- src/services/observation/lamost.rs | 7 +- src/services/observation/photometry.rs | 61 +- src/services/observation/preview.rs | 168 ++- src/services/observation/sdss.rs | 17 +- src/services/observation/tess.rs | 17 +- src/services/observation/unified.rs | 142 +- src/services/observation/ztf.rs | 18 +- src/services/paper/db.rs | 11 +- src/services/paper/ingest.rs | 86 +- src/services/paper/reader.rs | 29 +- src/services/parser/mod.rs | 28 +- src/services/parser/pdf.rs | 23 +- src/services/pipeline.rs | 15 +- src/services/rag.rs | 106 +- src/services/search.rs | 25 +- src/services/session.rs | 1 + src/services/translation.rs | 14 +- 142 files changed, 6349 insertions(+), 3470 deletions(-) create mode 100644 dashboard/src/components/layout/ThemeToggle.tsx create mode 100644 dashboard/src/components/layout/ToastContainer.tsx create mode 100644 dashboard/src/hooks/useTheme.ts create mode 100644 src/services/error.rs diff --git a/.gitignore b/.gitignore index 15342e7..4e79c7e 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ library/MinerU/ libs/ .claude .checkpoints +.mimocode/ +.zcode/ diff --git a/dashboard/src/App.tsx b/dashboard/src/App.tsx index 38f2ef9..a610865 100644 --- a/dashboard/src/App.tsx +++ b/dashboard/src/App.tsx @@ -16,6 +16,9 @@ import { UncachedPaperModal } from './components/dialogs/UncachedPaperModal'; import { PaperDetailModal } from './components/dialogs/PaperDetailModal'; import { Logo } from './components/Logo'; import { ErrorBoundary } from './components/ErrorBoundary'; +import { motion, AnimatePresence } from 'framer-motion'; +import { ToastContainer } from './components/layout/ToastContainer'; +import type { ToastItem } from './components/layout/ToastContainer'; // 引入拆分出的业务逻辑 Hooks import { useAuth } from './hooks/useAuth'; @@ -29,7 +32,7 @@ export default function App() { // 移动端菜单显示状态 const [isMobileSidebarOpen, setIsMobileSidebarOpen] = useState(false); - // 1. 全局自定义 Dialog 弹窗管理 (Alert / Confirm) + // 1. 全局自定义 Dialog 弹窗与 Toast 通知管理 const [dialog, setDialog] = useState<{ type: 'alert' | 'confirm'; title: string; @@ -38,14 +41,53 @@ export default function App() { onCancel?: () => void; } | null>(null); - const showAlert = useCallback((message: string, title = '系统提示') => { - setDialog({ - type: 'alert', - title, - message, - onConfirm: () => {}, - }); - }, []); + const [toasts, setToasts] = useState([]); + + const showToast = useCallback( + (message: string, type: 'success' | 'error' | 'info' = 'success') => { + const id = Date.now() + Math.random(); + setToasts((prev) => [...prev, { id, message, type }]); + setTimeout(() => { + setToasts((prev) => prev.filter((t) => t.id !== id)); + }, 3000); + }, + [] + ); + + const showAlert = useCallback( + (message: string, title = '系统提示') => { + const toastTriggers = [ + '成功', + '完成', + '复制', + '导入', + '保存', + '通知', + '已存', + '提示', + ]; + const isToast = toastTriggers.some( + (t) => + title.includes(t) || + message.includes('成功') || + message.includes('复制') || + message.includes('完成') || + message.includes('已存') + ); + + if (isToast) { + showToast(message, 'success'); + } else { + setDialog({ + type: 'alert', + title, + message, + onConfirm: () => {}, + }); + } + }, + [showToast] + ); const showConfirm = useCallback( (message: string, onConfirm: () => void, title = '确认操作') => { @@ -344,10 +386,10 @@ export default function App() { // 4. 渲染顶层登录页面 if (auth.isAuthenticated === null) { return ( -
+
- - + + 正在校验系统安全凭证...
@@ -357,26 +399,32 @@ export default function App() { if (auth.isAuthenticated === false) { return ( -
-
-
+
+
+
-
+
-
+
-

+

AstroResearch

-

+

天文学科研辅助系统 · 安全登录

-