Draft
Conversation
- 新增顶栏(全宽) + 左侧边栏 + 右侧内容区的三段式布局 - 将 Data 大页面拆分为独立路由: FileSystem、Find、Add Memory - 将 Access 页面迁移为独立的 Settings 页面 - 侧边栏按 Data/Ops/Access 分组显示导航项 - 提取共享工具函数到 data-utils.ts - 修复 .gitignore 中 data/ 规则误匹配子目录的问题
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
PR Code Suggestions ✨No code suggestions found for the PR. |
This commit introduces a native `tags` parameter across the entire stack (Core, API, SDK, CLI) to
easily tag resources and filter them during semantic search.
Changes include:
- **Core & Storage**:
- Write `tags` to the resource root's `.meta.json` during `add_resource`.
- Read tags from `.meta.json` during async semantic processing and hoist them to the VectorDB context for indexing.
- Enrich directory stats/entries in `VikingFS` (`ls`, `stat`) with `tags`.
- **API & Service**: Add `tags` field to resource creation and search routes.
- **Python SDK**:
- Add `tags` parameter to `add_resource`.
- Add `tags` shortcut parameter to `find` and `search` methods, which automatically constructs the underlying `contains` metadata filters.
- **Rust CLI**: Add `--tags` flag to `ov add-resource`, `ov find`, and `ov search` commands.
- **Docs**: Update English and Chinese documentation for Resources, Retrieval, and Filesystem APIs to reflect the new `tags` parameters and structures.
- **Tests**: Add unit tests for resource processor meta merging, VikingFS tag reading, and HTTP client tag filtering logic.
feat: 三段式布局 + 功能页拆分
- Add i18next with browser language detection (zh-CN / en) - Add language switcher dropdown in header bar - Add dark/light theme toggle with animated Sun/Moon icons - Wire up next-themes ThemeProvider with class-based dark mode - Replace shadcn dark theme with default Zinc (neutral gray) - Connect sidebar labels to i18n translation keys - Fix dropdown menu forced dark styling
`openviking-server`'s /bot/v1/chat/stream proxy handler used `response.aiter_lines()` to relay SSE from the vikingbot gateway, which introduces two layers of hidden buffering: - Line buffering: aiter_lines() waits for a complete line ending in \n before yielding. The `if line:` filter also drops blank lines — which in SSE are the `\n\n` event separator, so the framing is lost. Downstream parsers that split on `\n\n` (including browser EventSource and the bot-test harness) never find a boundary and events pile up in the buffer until the stream closes, appearing as "empty response until completion". - Body-level buffering: httpx accumulates bytes before splitting into lines. For ~40-byte SSE deltas this batches events into bursts, also hurting real-time first-byte latency. Switch to response.aiter_bytes() and pass raw bytes through untouched. This preserves the upstream's \n\n event framing exactly and avoids any framing-aware buffering; downstream parsers receive chunks the moment they arrive from the gateway. Error-path yields are updated to emit bytes for signature consistency with the new AsyncGenerator[bytes, None] return type.
response.text on a streaming client fails with ResponseNotRead once the client context is exited (the connection is already closed by the time the except block runs). str(e) contains the status code and URL, which is sufficient for the error SSE payload. Pre-existing issue in the same code path, caught by Gemini review on the parent PR.
… clipboard error handling
- Chat interface with assistant-ui runtime (SSE streaming, message history) - Session title system: localStorage + AI-generated titles via sendChat - Session list with search/filter (Cmd+K), new session (Cmd+N) - Tool call collapsible cards with input/output display - Reasoning expandable blocks with running/complete states - Iteration badge for multi-step agent responses - User/Assistant avatars, active session highlight - Loading skeleton, error states, empty state with keyboard hints
…hat components ## Chat UI Architecture - Remove @assistant-ui/react and @assistant-ui/react-markdown dependencies - Remove adapter layer: use-assistant-runtime, use-thread-list-adapter, convert-message - Delete assistant-ui primitives: thread.tsx, thread-list.tsx - Components now consume useChat() directly without runtime conversion ## New Components (src/components/chat/) - message-parts.tsx: MarkdownContent (Streamdown), ReasoningBlock, ToolCallBlock - composer.tsx: floating frosted-glass input with backdrop-blur, file attachment support - message-list.tsx: message bubbles with frosted-glass backgrounds (bg-background/70) - thread.tsx: main chat area with PixelBlast background and auto-scroll ## Streaming Markdown - Add streamdown, @streamdown/code, @streamdown/cjk for flicker-free streaming - Incremental DOM updates instead of full re-parse on each token - Shiki syntax highlighting and CJK text support ## Session Navigation - Move session list into app-shell sidebar as collapsible sub-menu (NavSessionsItem) - Session switching via URL search params (?s=sessionId), supports browser back/forward - Remove embedded 260px thread-list panel from sessions page ## Visual Design - PixelBlast (Three.js) particle background at 40% opacity with edge fade - Frosted-glass message bubbles and composer (backdrop-blur-xl) - Message width increased to max-w-3xl - All user-facing text localized to Chinese ## Other - Add use-file-attachment hook for file upload in composer - Add pixel-blast.tsx (react-bits) as UI component - bot: minor changes to ov_file.py and ov_server.py
- PixelBlast: defer mount until browser idle via requestIdleCallback, avoids blocking chat UI interactivity with 538KB Three.js chunk - Auto-scroll: throttle via requestAnimationFrame, cancel pending scroll before scheduling new one (was firing per-token) - UserMessage/AssistantMessage: wrap with React.memo to skip re-renders when streaming state changes (only streaming message needs updates, history messages are stable) - NavSessionsItem: select only `s` param from router state instead of entire search object, prevents re-render on unrelated route changes
- Add hover-reveal copy button to both user and assistant messages (copies text content to clipboard, shows checkmark on success) - Cache session message history for 30s (staleTime) to avoid flash/refetch when switching between sessions quickly
## Message Cards - Same-role consecutive messages use compact spacing (mb-1.5 vs mb-5) - User bubble: solid primary bg, tighter rounded-br-sm corner - Assistant bubble: subtle ring-1 ring-border/30 for edge definition - Avatar hidden for consecutive same-role messages (spacer preserves alignment) ## Brand Avatar - Replace generic BotIcon with gradient ring avatar (from-primary/20 to-primary/5) - Ring-1 ring-primary/10 for subtle brand color presence ## Markdown Prose - Refined heading sizes: h1=lg, h2=base, h3=sm with proper spacing - Inline code: muted bg, rounded, no backtick pseudo-elements - Blockquote: primary left border + muted bg + rounded-r-lg - Links: primary color, no underline by default, underline on hover - Tables: uppercase tracking-wider th headers - Relaxed line-height for paragraphs and lists ## Typing Indicator - 3-dot bounce animation when streaming starts before content arrives - Shows only when no content/reasoning/toolCalls yet ## Timestamps - Hover-reveal relative time on each message (刚刚/分钟前/小时前) - 10px muted text, positioned beside copy button ## Iteration Badge - Changed from English "Iteration N" to "第 N 轮" - Pill style: rounded-full, primary/10 bg, primary text ## Empty State - Product name "OpenViking" with gradient icon container - Suggestion pills: 3 quick-start prompts as rounded buttons ## Tool/Reasoning Blocks - Softer borders (border/30), lighter backgrounds (muted/20) - Smaller label text (10px) with wider tracking
…ills - User bubble: rounded-tr-sm (top-right near avatar), was wrongly br - Remove quick-start suggestion pills from empty state
Replace generic BotIcon with ov-logo.png in chat message bubbles.
## PixelBlast background - Cap frame rate at 30fps (was uncapped 60fps) via frame budget throttle - Set pixelRatio to 1 (was 2x on Retina), reduces render pixels by 4x - Combined: ~8x less GPU work for the background animation ## Remove backdrop-blur from chat elements - Message bubbles: bg-background/70 backdrop-blur-xl → bg-background/95 - Composer: bg-background/50 backdrop-blur-xl → bg-background/95 - Title bar: bg-background/80 backdrop-blur-sm → bg-background/95 - Each backdrop-blur created a compositing layer that re-blurred the animated canvas every frame — this was the main source of jank ## Logo compression - Resize ov-logo.png from 1000x1000 (large) to 56x56 (2x render size) - File size reduced to 2.2KB ## Scroll optimization - Remove CSS scroll-smooth (conflicts with JS scrollIntoView smooth)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
相关飞书内讨论后续补
Related Issue
Type of Change
Changes Made
Testing
Checklist
Screenshots (if applicable)
Additional Notes