Conversation
WalkthroughThis PR updates documentation assets across README files, refactors ThinkContent component by removing shimmer styling and simplifying props declaration, reworks MessageList's scroll-to-bottom mechanism from anchor-based to container-based calculation, adds playground infrastructure for wider component display, and introduces a new MessageListDemo component with tick-based streaming simulation. Changes
Sequence DiagramsequenceDiagram
participant User
participant MessageListDemo
participant Scheduler
participant MessageList
participant Container
User->>MessageListDemo: Configure (speedMs, dimensions)
User->>MessageListDemo: Click Restart
MessageListDemo->>Scheduler: Initialize tick loop
loop Streaming Phases
Scheduler->>MessageListDemo: scheduleTick()
MessageListDemo->>MessageListDemo: Advance reasoningChars/responseChars
MessageListDemo->>MessageList: Update message content
MessageList->>Container: Render updated content
Container->>Container: Calculate scrollHeight/clientHeight
alt aboveThreshold
Container->>Container: scrollTo(targetTop)
end
end
User->>MessageListDemo: Click Finish
MessageListDemo->>MessageListDemo: Complete all phases instantly
MessageListDemo->>Container: Scroll to bottom
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes The PR spans multiple components with distinct change patterns: trivial README updates, straightforward component cleanup (ThinkContent), medium-complexity scroll refactoring (MessageList), and a substantial new demo component with state-management logic (MessageListDemo). The changes are moderately heterogeneous but self-contained within their respective modules, requiring focused review of scroll mechanics and the new streaming simulator logic. Possibly related PRs
Suggested labels
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (5)
src/renderer/src/components/message/MessageList.vue (1)
392-406: Container-based bottom scroll fix is solidCorrect targetTop calc and smooth/instant handling; guard for missing container is good. Optionally, defer updateScrollInfo for smooth case (post-scroll) to avoid brief stale state; scroll handler will update anyway.
- updateScrollInfo() + if (smooth) { + // rely on @scroll; optionally schedule a late update + requestAnimationFrame(() => updateScrollInfo()) + } else { + updateScrollInfo() + }src/renderer/src/views/playground/DemoSection.vue (1)
25-31: AvoidanyfordemopropType as a Vue Component to keep TS strict.
-defineProps<{ +import type { Component } from 'vue' +defineProps<{ title: string description?: string componentName?: string - demo: any + demo: Component fullWidth?: boolean }>()As per coding guidelines
src/renderer/src/views/PlaygroundTabView.vue (1)
150-157: Internationalize new UI stringsWrap title/description with vue‑i18n keys instead of literals.
+import { useI18n } from 'vue-i18n' ... -const sections = computed(() => [ +const { t } = useI18n() +const sections = computed(() => [ ... - { - title: 'Message List Simulator', - description: - 'Stream long reasoning output with adjustable typing speed and viewport to study auto-scroll.', + { + title: t('playground.messageListSimulator.title'), + description: t('playground.messageListSimulator.description'), componentName: '@/components/message/MessageList.vue', render: MessageListDemo, fullWidth: true },As per coding guidelines
src/renderer/src/views/playground/demos/MessageListDemo.vue (2)
5-21: Internationalize all visible stringsReplace hardcoded UI text with vue‑i18n keys (labels, buttons, status).
+import { useI18n } from 'vue-i18n' ... +const { t } = useI18n() ... -<Label ...>Typing Speed (ms / char)</Label> +<Label ...>{{ t('playground.messageListDemo.typingSpeed') }}</Label> ... -<Label ...>Width (px)</Label> +<Label ...>{{ t('playground.messageListDemo.widthPx') }}</Label> ... -<Label ...>Height (px)</Label> +<Label ...>{{ t('playground.messageListDemo.heightPx') }}</Label> ... -<Button ...>Restart</Button> +<Button ...>{{ t('common.restart') }}</Button> ... -{{ streamingPaused ? 'Resume' : 'Pause' }} +{{ streamingPaused ? t('common.resume') : t('common.pause') }} ... -<Button ...>Finish</Button> +<Button ...>{{ t('common.finish') }}</Button> ... -<Button ...>Scroll Bottom</Button> +<Button ...>{{ t('playground.messageListDemo.scrollBottom') }}</Button> ... -<div>Phase: {{ phaseLabel }}</div> +<div>{{ t('playground.messageListDemo.phase') }}: {{ phaseLabel }}</div>Also localize Yes/No strings and other labels accordingly. As per coding guidelines
Also applies to: 23-47, 49-64, 76-85
100-101: Remove// @ts-ignoreby typing the component exposeDefine a local instance type for MessageList’s exposed API.
-import { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue' +import { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue' +import type { Ref } from 'vue' ... -const messageListRef = ref<InstanceType<typeof MessageList>>() +type MessageListExpose = { + scrollToBottom: (smooth?: boolean) => void + scrollToMessage: (messageId: string) => void + aboveThreshold: Ref<boolean> +} +const messageListRef = ref<MessageListExpose>() ... -// @ts-ignore -const aboveThreshold = computed(() => messageListRef.value?.aboveThreshold?.value ?? false) +const aboveThreshold = computed(() => messageListRef.value?.aboveThreshold.value ?? false)Keeps TS strict and avoids ignores. As per coding guidelines
Also applies to: 182-184
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (8)
README.jp.md(1 hunks)README.md(1 hunks)README.zh.md(1 hunks)src/renderer/src/components/message/MessageList.vue(1 hunks)src/renderer/src/components/think-content/ThinkContent.vue(2 hunks)src/renderer/src/views/PlaygroundTabView.vue(3 hunks)src/renderer/src/views/playground/DemoSection.vue(2 hunks)src/renderer/src/views/playground/demos/MessageListDemo.vue(1 hunks)
🧰 Additional context used
📓 Path-based instructions (16)
src/renderer/src/**/*
📄 CodeRabbit inference engine (.cursor/rules/i18n.mdc)
src/renderer/src/**/*: All user-facing strings must use i18n keys (avoid hardcoded user-visible text in code)
Use the 'vue-i18n' framework for all internationalization in the renderer
Ensure all user-visible text in the renderer uses the translation system
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
src/renderer/**/*.{vue,ts,js,tsx,jsx}
📄 CodeRabbit inference engine (.cursor/rules/project-structure.mdc)
渲染进程代码放在
src/renderer
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
src/renderer/src/**/*.{vue,ts,tsx,js,jsx}
📄 CodeRabbit inference engine (.cursor/rules/vue-best-practices.mdc)
src/renderer/src/**/*.{vue,ts,tsx,js,jsx}: Use the Composition API for better code organization and reusability
Implement proper state management with Pinia
Utilize Vue Router for navigation and route management
Leverage Vue's built-in reactivity system for efficient data handling
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
src/renderer/src/**/*.vue
📄 CodeRabbit inference engine (.cursor/rules/vue-best-practices.mdc)
Use scoped styles to prevent CSS conflicts between components
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
src/renderer/**/*.{ts,tsx,vue}
📄 CodeRabbit inference engine (.cursor/rules/vue-shadcn.mdc)
src/renderer/**/*.{ts,tsx,vue}: Use descriptive variable names with auxiliary verbs (e.g., isLoading, hasError).
Use TypeScript for all code; prefer types over interfaces.
Avoid enums; use const objects instead.
Use arrow functions for methods and computed properties.
Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements.
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
src/renderer/**/*.{vue,ts}
📄 CodeRabbit inference engine (.cursor/rules/vue-shadcn.mdc)
Implement lazy loading for routes and components.
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
src/renderer/**/*.{ts,vue}
📄 CodeRabbit inference engine (.cursor/rules/vue-shadcn.mdc)
src/renderer/**/*.{ts,vue}: Use useFetch and useAsyncData for data fetching.
Implement SEO best practices using Nuxt's useHead and useSeoMeta.Use Pinia for frontend state management (do not introduce alternative state libraries)
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
**/*.{ts,tsx,js,vue}
📄 CodeRabbit inference engine (CLAUDE.md)
Use English for all logs and comments
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
**/*.{ts,tsx,vue}
📄 CodeRabbit inference engine (CLAUDE.md)
Enable and adhere to strict TypeScript typing (avoid implicit any, prefer precise types)
Use PascalCase for TypeScript types and classes
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
src/renderer/{src,shell,floating}/**/*.vue
📄 CodeRabbit inference engine (CLAUDE.md)
src/renderer/{src,shell,floating}/**/*.vue: Use Vue 3 Composition API for all components
All user-facing strings must use i18n keys via vue-i18n (no hard-coded UI strings)
Use Tailwind CSS utilities and ensure styles are scoped in Vue components
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
src/renderer/src/**
📄 CodeRabbit inference engine (AGENTS.md)
Place Vue 3 app source under src/renderer/src (components, stores, views, i18n, lib)
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
src/renderer/src/**/*.{vue,ts}
📄 CodeRabbit inference engine (AGENTS.md)
All user-facing strings must use vue-i18n ($t/keys) rather than hardcoded literals
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
**/*.{ts,tsx,js,jsx,vue,css,scss,md,json,yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
Prettier style: single quotes, no semicolons, print width 100; run pnpm run format
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vueREADME.zh.mdsrc/renderer/src/views/PlaygroundTabView.vueREADME.jp.mdREADME.mdsrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
**/*.{ts,tsx,js,jsx,vue}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx,js,jsx,vue}: Use OxLint for JS/TS code; keep lint clean
Use camelCase for variables and functions
Use SCREAMING_SNAKE_CASE for constants
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
src/renderer/**/*.vue
📄 CodeRabbit inference engine (AGENTS.md)
Name Vue component files in PascalCase (e.g., ChatInput.vue)
Files:
src/renderer/src/views/playground/DemoSection.vuesrc/renderer/src/components/message/MessageList.vuesrc/renderer/src/views/PlaygroundTabView.vuesrc/renderer/src/views/playground/demos/MessageListDemo.vuesrc/renderer/src/components/think-content/ThinkContent.vue
src/renderer/src/components/**/*
📄 CodeRabbit inference engine (CLAUDE.md)
Organize UI components by feature within src/renderer/src/
Files:
src/renderer/src/components/message/MessageList.vuesrc/renderer/src/components/think-content/ThinkContent.vue
🧠 Learnings (4)
📚 Learning: 2025-07-23T00:45:57.322Z
Learnt from: CR
PR: ThinkInAIXYZ/deepchat#0
File: .cursor/rules/vue-shadcn.mdc:0-0
Timestamp: 2025-07-23T00:45:57.322Z
Learning: Applies to src/renderer/**/*.{vue} : Use Iconify/Vue for icon implementation.
Applied to files:
src/renderer/src/components/think-content/ThinkContent.vue
📚 Learning: 2025-07-23T00:45:57.322Z
Learnt from: CR
PR: ThinkInAIXYZ/deepchat#0
File: .cursor/rules/vue-shadcn.mdc:0-0
Timestamp: 2025-07-23T00:45:57.322Z
Learning: Applies to src/renderer/**/*.{vue} : Import Icon component from Iconify/Vue.
Applied to files:
src/renderer/src/components/think-content/ThinkContent.vue
📚 Learning: 2025-07-23T00:45:57.322Z
Learnt from: CR
PR: ThinkInAIXYZ/deepchat#0
File: .cursor/rules/vue-shadcn.mdc:0-0
Timestamp: 2025-07-23T00:45:57.322Z
Learning: Applies to src/renderer/**/*.{vue} : Use <script setup> syntax for concise component definitions.
Applied to files:
src/renderer/src/components/think-content/ThinkContent.vue
📚 Learning: 2025-07-23T00:45:57.322Z
Learnt from: CR
PR: ThinkInAIXYZ/deepchat#0
File: .cursor/rules/vue-shadcn.mdc:0-0
Timestamp: 2025-07-23T00:45:57.322Z
Learning: Applies to src/renderer/**/*.{vue} : Use the Icon component with lucide icons.
Applied to files:
src/renderer/src/components/think-content/ThinkContent.vue
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build-check (x64)
🔇 Additional comments (8)
README.md (1)
53-58: Image asset swap LGTMAlt text remains descriptive; no issues.
README.zh.md (1)
53-58: Image updates look goodAlt text now in English; acceptable for cross‑locale consistency.
README.jp.md (1)
53-58: Banner assets updated correctlyAlt text consistent across READMEs. No concerns.
src/renderer/src/views/playground/DemoSection.vue (1)
2-5: Full-width layout toggle LGTMThe md:col-span-2 conditional is appropriate for 2‑column grids.
src/renderer/src/views/PlaygroundTabView.vue (2)
29-31: Prop plumb-through LGTMPassing
:full-width="demo.fullWidth ?? false"aligns with DemoSection prop.
56-56: Import of MessageListDemo LGTMNo side effects; scoped to playground.
src/renderer/src/components/think-content/ThinkContent.vue (2)
10-12: Removed shimmer styling from labelSimplifies DOM and reduces reflow risks; matches PR goal.
56-61: Direct defineProps usageCleaner, no behavior change. Good.
* style(settings): format about page link handler (#1016) * style(ollama): format model config handlers (#1018) * fix: think content scroll issue (#1023) * fix: remove shimmer for think content * chore: update screen shot and fix scroll issue * chore: update markdown renderer * fix: import button bug and prevent backup overwriting during import (#1024) * fix(sync): fix import button bug and prevent backup overwriting during import * fix(sync): fix import button bug and prevent backup overwriting during import * fix(sync): fix import button bug and prevent backup overwriting during import * refactor(messageList): refactor message list ui components (#1026) * feat: remove new thread button, add clean button. * refactor(messageList): refactor message list ui components * feat: add configurable fields for chat settings - Introduced ConfigFieldHeader component for consistent field headers. - Added ConfigInputField, ConfigSelectField, ConfigSliderField, and ConfigSwitchField components for various input types. - Created types for field configurations in types.ts to standardize field definitions. - Implemented useChatConfigFields composable to manage field configurations dynamically. - Added useModelCapabilities and useModelTypeDetection composables for handling model-specific capabilities and requirements. - Developed useSearchConfig and useThinkingBudget composables for managing search and budget configurations. * feat: implement input history management in prompt input - Added `useInputHistory` composable for managing input history and navigation. - Implemented methods for setting, clearing, and confirming history placeholders. - Integrated arrow key navigation for browsing through input history. feat: enhance mention data handling in prompt input - Created `useMentionData` composable to aggregate mention data from selected files and MCP resources. - Implemented watchers to update mention data based on selected files, MCP resources, tools, and prompts. feat: manage prompt input configuration with store synchronization - Developed `usePromptInputConfig` composable for managing model configuration. - Implemented bidirectional sync between local config and chat store. - Added debounced watcher to reduce updates and improve performance. feat: streamline TipTap editor operations in prompt input - Introduced `usePromptInputEditor` composable for managing TipTap editor lifecycle and content transformation. - Implemented methods for handling mentions, pasting content, and clearing editor content. feat: handle file operations in prompt input - Created `usePromptInputFiles` composable for managing file selection, paste, and drag-drop operations. - Implemented methods for processing files, handling dropped files, and clearing selected files. feat: manage rate limit status in prompt input - Developed `useRateLimitStatus` composable for displaying and polling rate limit status. - Implemented methods for handling rate limit events and computing status icons, classes, and tooltips. * refactor(artifacts): migrate component logic to composables and update documentation - Refactor ArtifactDialog.vue to use composables for view mode, viewport size, code editor, and export functionality - Simplify HTMLArtifact.vue by removing drag-resize logic and using fixed viewport dimensions - Clean up MermaidArtifact.vue styling and structure - Update component refactoring guide to reflect new patterns and best practices - Adjust prompt input composable to allow delayed editor initialization - Update internationalization files for new responsive label * fix(lint): unused variables * fix(format): format code * CodeRabbit Generated Unit Tests: Add renderer unit tests for components and composables * feat: implement input history management in chat input component - Added `useInputHistory` composable for managing input history and placeholder navigation. - Implemented methods for setting, clearing, and confirming history placeholders. - Integrated arrow key navigation for cycling through input history. feat: enhance mention data handling in chat input - Created `useMentionData` composable to manage mention data aggregation. - Implemented watchers for selected files and MCP resources/tools/prompts to update mention data. feat: manage prompt input configuration and synchronization - Developed `usePromptInputConfig` composable for managing model configuration. - Implemented bidirectional sync between local config refs and chat store. - Added debounced watcher to reduce updates to the store. feat: manage prompt input editor operations - Introduced `usePromptInputEditor` composable for handling TipTap editor operations. - Implemented content transformation, mention insertion, and paste handling. - Added methods for handling editor updates and restoring focus. feat: handle prompt input files management - Created `usePromptInputFiles` composable for managing file operations in prompt input. - Implemented file selection, paste, drag-drop, and prompt files integration. feat: implement rate limit status management - Developed `useRateLimitStatus` composable for managing rate limit status display and polling. - Added methods for retrieving rate limit status icon, class, tooltip, and wait time formatting. * feat: enhance chat input component with context length management and settings integration * feat: update model configuration and enhance error handling in providers * feat: add MCP tools list component and integrate with chat settings feat: enhance artifact dialog with improved error handling and localization fix: update Mermaid artifact rendering error handling and localization fix: improve input settings error handling and state management fix: update drag and drop composable to handle drag events correctly fix: update Vitest configuration for better project structure and alias resolution * fix(i18n): add unknownError translation --------- Co-authored-by: deepinsect <deepinsect@github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * feat: add Poe provider integration and icon support (#1028) * feat: add Poe provider integration and icon support * chore: format and lint --------- Co-authored-by: zerob13 <zerob13@gmail.com> * fix: make auto scroll works (#1030) * fix: allow settings window links to open externally (#1029) * fix(settings): allow target blank links * fix: harden settings window link handling * feat: enhance GitHub Copilot Device Flow with OAuth token management and API token retrieval (#1021) * feat: enhance GitHub Copilot Device Flow with OAuth token management and API token retrieval - Fixed request header for managing OAuth tokens and retrieving API tokens. - Enhanced model definitions and added new models for better compatibility. * fix: remove privacy related log * fix: OAuth 2.0 for slow_down response * fix: handle lint errors * fix: provider fetched from publicdb * fix(githubCopilotProvider): update request body logging format for clarity * fix(githubCopilotProvider): improve error handling and logging in device flow * feat(theme): fix message paragraph gap and toolcall block (#1031) Co-authored-by: deepinsect <deepinsect@github.com> * fix: scroll to bottom (#1034) * fix: add debounce for renderer * feat: add max wait for renderer * chore(deps): upgrade markdown renderer add worker support * chore: bump markdown version * fix(build): use es module worker format (#1037) * feat: remove function deleteOllamaModel (#1036) * feat: remove function deleteOllamaModel * fix(build): use es module worker format (#1037) --------- Co-authored-by: duskzhen <zerob13@gmail.com> * perf: update dependencies to use stream-monaco and bump vue-renderer-markdown version (#1038) * feat(theme): add markdown layout style and table style (#1039) * feat(theme): add markdown layout style and table style * fix(lint): remove props --------- Co-authored-by: deepinsect <deepinsect@github.com> * feat: support effort and verbosity (#1040) * chore: bump up version * feat: add jiekou.ai as LLM provider (#1041) * feat: add jiekou.ai as LLM provider * fix: change api type to jiekou --------- Co-authored-by: zerob13 <zerob13@gmail.com> * chore: update provider db --------- Co-authored-by: 韦伟 <xweimvp@gmail.com> Co-authored-by: Happer <ericted8810us@gmail.com> Co-authored-by: deepinsect <deepinsect@github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: cp90 <153345481+cp90-pixel@users.noreply.github.com> Co-authored-by: Cedric <14017092+douyixuan@users.noreply.github.com> Co-authored-by: Simon He <57086651+Simon-He95@users.noreply.github.com> Co-authored-by: yyhhyyyyyy <yyhhyyyyyy8@gmail.com> Co-authored-by: cnJasonZ <gbdzxalbb@qq.com>
Summary by CodeRabbit
New Features
Improvements
Documentation