-
Notifications
You must be signed in to change notification settings - Fork 5
fix: resolve version mismatch causing refresh loops in test environment #207
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
The auto-update mechanism causes infinite refresh loops when frontend and backend versions mismatch in test environment. Remove the feature entirely until a more robust solution is implemented. - Delete useAutoUpdate hook and UpdateOverlay component - Remove AutoUpdateWrapper from App.tsx
审阅者指南(在小型 PR 上折叠)审阅者指南通过更新 beta 构建工作流以从 pyproject.toml 读取语义化版本,使后端和前端版本保持一致,移除导致刷新循环的自动更新浮层逻辑,并修复 AgentList 中的 JSX 注释语法以恢复有效 JSX。 前端加载且无自动更新刷新循环的时序图sequenceDiagram
participant Browser
participant XyzenApp
participant BackendVersionAPI
Browser->>XyzenApp: Load_application
activate XyzenApp
XyzenApp->>BackendVersionAPI: GET /xyzen/api/v1/system/version
activate BackendVersionAPI
BackendVersionAPI-->>XyzenApp: 200 { version: 1.0.16 }
deactivate BackendVersionAPI
XyzenApp-->>Browser: Render mainLayout without AutoUpdateWrapper
deactivate XyzenApp
更新后应用结构及移除自动更新逻辑的类图classDiagram
class Xyzen {
+Xyzen(props)
}
class AutoUpdateWrapper_removed {
+AutoUpdateWrapper_removed(children)
}
class useAutoUpdate_removed {
+useAutoUpdate_removed()
}
class UpdateOverlay_removed {
+UpdateOverlay_removed(targetVersion)
}
Xyzen ..> AutoUpdateWrapper_removed : previously_wrapped_children
AutoUpdateWrapper_removed ..> useAutoUpdate_removed : previously_called
AutoUpdateWrapper_removed ..> UpdateOverlay_removed : previously_rendered
文件级变更
技巧和命令与 Sourcery 交互
自定义你的体验访问你的 控制面板 以:
获取帮助Original review guide in EnglishReviewer's guide (collapsed on small PRs)Reviewer's GuideAligns backend and frontend versions by updating the beta build workflow to read the semantic version from pyproject.toml, removes the auto-update overlay logic that caused refresh loops, and fixes JSX comment syntax in AgentList to restore valid JSX. Sequence diagram for frontend load without auto-update refresh loopsequenceDiagram
participant Browser
participant XyzenApp
participant BackendVersionAPI
Browser->>XyzenApp: Load_application
activate XyzenApp
XyzenApp->>BackendVersionAPI: GET /xyzen/api/v1/system/version
activate BackendVersionAPI
BackendVersionAPI-->>XyzenApp: 200 { version: 1.0.16 }
deactivate BackendVersionAPI
XyzenApp-->>Browser: Render mainLayout without AutoUpdateWrapper
deactivate XyzenApp
Class diagram for updated app structure and removed auto-update logicclassDiagram
class Xyzen {
+Xyzen(props)
}
class AutoUpdateWrapper_removed {
+AutoUpdateWrapper_removed(children)
}
class useAutoUpdate_removed {
+useAutoUpdate_removed()
}
class UpdateOverlay_removed {
+UpdateOverlay_removed(targetVersion)
}
Xyzen ..> AutoUpdateWrapper_removed : previously_wrapped_children
AutoUpdateWrapper_removed ..> useAutoUpdate_removed : previously_called
AutoUpdateWrapper_removed ..> UpdateOverlay_removed : previously_rendered
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey - 我在这里给出了一些总体反馈:
.github/workflows/beta.yaml中对beta_version的提取依赖于service/pyproject.toml里非常特定的version = "..."格式;建议让 grep/sed 更健壮一些(例如去除空白、处理单引号),或者在找不到该行时快速失败并给出清晰的错误信息。- 与其在
App.tsx中完全移除自动更新流程,不如考虑用环境变量开关来控制,或者只在非生产环境中禁用它,这样以后就可以在不做结构性改动的前提下重新启用该功能。
给 AI Agent 的提示
Please address the comments from this code review:
## Overall Comments
- `.github/workflows/beta.yaml` 中对 `beta_version` 的提取依赖于 `service/pyproject.toml` 里非常特定的 `version = "..."` 格式;建议让 grep/sed 更健壮一些(例如去除空白、处理单引号),或者在找不到该行时快速失败并给出清晰的错误信息。
- 与其在 `App.tsx` 中完全移除自动更新流程,不如考虑用环境变量开关来控制,或者只在非生产环境中禁用它,这样以后就可以在不做结构性改动的前提下重新启用该功能。帮我变得更有用!请对每条评论点 👍 或 👎,我会根据你的反馈改进后续的代码审查。
Original comment in English
Hey - I've left some high level feedback:
- The
beta_versionextraction in.github/workflows/beta.yamlassumes a very specificversion = "..."format inservice/pyproject.toml; consider making the grep/sed more robust (e.g., trimming whitespace, handling single quotes) or failing fast with a clear error if the line is not found. - Instead of fully removing the auto-update flow in
App.tsx, you might want to gate it behind an environment flag or only disable it in non-production environments so the functionality can be re-enabled without a structural change later.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- The `beta_version` extraction in `.github/workflows/beta.yaml` assumes a very specific `version = "..."` format in `service/pyproject.toml`; consider making the grep/sed more robust (e.g., trimming whitespace, handling single quotes) or failing fast with a clear error if the line is not found.
- Instead of fully removing the auto-update flow in `App.tsx`, you might want to gate it behind an environment flag or only disable it in non-production environments so the functionality can be re-enabled without a structural change later.Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
* feat: add drag-and-drop agent reordering and auto-update on version mismatch (#206) * fix: resolve i18next missing key warnings in TierInfoModal Replace hardcoded Chinese strings with proper i18n translation keys in the tier selector component. This fixes console warnings about missing translation keys when using the zh locale. - Add speedLabels, reasoningLabels, and features keys to app.json - Add multiplier key to tierSelector in all locales - Add recommended key to common.json in all locales - Refactor TierInfoModal.tsx to use translation key references Co-Authored-By: Claude <[email protected]> * feat: add drag-and-drop agent reordering Integrate dnd-kit into existing AgentList and AgentListItem components to support drag-and-drop reordering in both the sidebar and spatial focused view. Backend: - Add sort_order field to Agent model - Add PATCH endpoint for bulk reordering agents - Add migration for sort_order column Frontend: - Add sortable prop to AgentList with DndContext/SortableContext - Add dragHandleProps to AgentListItem for drag behavior - Use plain div (not motion.div) when sortable to avoid animation conflicts - Use set-based comparison for state sync (only reset on add/remove) - Add reorderAgents action to agentSlice * feat: auto-refresh frontend on version mismatch with backend Add automatic update mechanism that detects when the frontend version doesn't match the backend version and refreshes the page to fetch the latest assets. This ensures users with cached frontends always get updated code without manually clearing their browser cache. - Add useAutoUpdate hook with retry logic (max 3 attempts) - Add UpdateOverlay component for update feedback - Clear service workers and caches before reload - Store retry state in localStorage to prevent infinite loops * fix: address PR review feedback for drag-and-drop agent reordering - Move AgentList state sync from render to useEffect to prevent render loops - Add isDraggingRef to prevent backend sync during active drag operations - Restore keyboard accessibility to CompactAgentListItem (role, tabIndex, aria-pressed, onKeyDown handler) - Guard localStorage writes with try/catch in useAutoUpdate to handle restricted environments --------- Co-authored-by: Claude <[email protected]> * fix: resolve version mismatch causing refresh loops in test environment (#207) * fix: move the comment to correct position * fix: fix the test environment version * fix: remove auto-update feature to prevent refresh loops The auto-update mechanism causes infinite refresh loops when frontend and backend versions mismatch in test environment. Remove the feature entirely until a more robust solution is implemented. - Delete useAutoUpdate hook and UpdateOverlay component - Remove AutoUpdateWrapper from App.tsx * Fix: Unify tool call UI (pills in agent timeline) for streaming + refresh (#208) * feat: add simple landing page and logout button * fix(web): unify tool call rendering in agent timeline after refresh; add landing page - Render tool calls as pills with a shared details modal (args/results/errors) - Attach historical tool_call tool messages into agentExecution phases instead of standalone messages - Remove legacy ToolCallCard-based rendering path * fix(web): address review feedback for tool call modal + typewriter - Move tool-call UI strings into i18n (app.chat.toolCall.*) for en/zh/ja - Memoize tool result parsing and image URL derivation in ToolCallDetails - Avoid duplicate argument headings in ToolCallDetailsModal for waiting_confirmation - Remove redundant typewriter cursor className conditional and fix unused state var * feat: message editing and deletion (#209) * feat: add message editing and deletion with truncate-regenerate flow - Add PATCH /messages/{id} endpoint for editing user messages - Add DELETE /messages/{id} endpoint for deleting any message - Add regenerate WebSocket handler for re-running agent after edit - Add edit/delete UI to ChatBubble with hover actions - Add i18n translations for en/zh/ja Includes fixes from code review: - Fix pre-deduction error handling to skip dispatch on any failure - Reset responding state before regeneration to prevent stuck UI - Add message ownership verification before edit/delete operations * fix: improve the code according to sourcery review * fix: use version+SHA for beta image tags to ensure unique deployments (#211) The previous approach used only the pyproject.toml version (e.g., 1.0.16) which caused Kubernetes to not pull new images when multiple commits used the same version tag. Now uses format: {version}-{short-sha} (e.g., 1.0.16-f13e3c0) Co-authored-by: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> * feat: conversation interrupt/abort functionality (#212) * feat: add conversation interrupt/abort functionality - Add stop button and Escape key shortcut to abort streaming generation - Implement Redis-based signaling between API server and Celery worker - Worker checks abort signal every 0.5s and gracefully stops streaming - Save partial content and perform partial billing on abort - Add visual indicator for cancelled/aborted messages - Add timeout fallback (10s) to reset UI if backend doesn't respond - Add i18n strings for stop/stopping/escToStop in en/zh/ja * fix: address abort feature edge cases from code review - Clear stale abort signals at task start to prevent race condition when user reconnects quickly after disconnect - Finalize AgentRun with 'failed' status on unhandled exceptions to ensure consistent DB state across all exit paths - Move time import to module level (was inline import) * fix: address Sourcery review feedback for abort feature - Reuse existing Redis client for abort checks instead of creating new connections on each tick (performance improvement) - Fix potential Redis connection leaks in ABORT and disconnect handlers by using try/finally pattern - Track and cleanup abort timeout in frontend to prevent stale timers from racing with subsequent abort requests * Preserve phase text when copying streamed output (#210) * Preserve phase text when copying streamed output * Extract agent phase content helper * fix: use existing PhaseExecution type and correct useMemo dependencies - Replace inline PhaseWithStreamedContent type with Pick<PhaseExecution, 'streamedContent'> for type consistency across the codebase - Fix useMemo dependency array to use agentExecution?.phases instead of agentExecution to ensure proper recalculation when phases array changes * Fix streaming agent messages and prevent deleting non-persisted messages (#213) * Fix message deletion for agent executions * Address Sourcery review: stricter UUID validation and safer id assignment - Add isValidUuid utility with canonical UUID pattern (8-4-4-4-12 format) to replace loose regex that accepted invalid strings like all-hyphens - Fix streaming_start handler to only set id when eventData.id is truthy, preventing accidental overwrites with undefined/null - Improve delete guard with contextual messages ("still streaming" vs "not saved yet") and change notification type to warning - Add comprehensive tests for isValidUuid covering valid UUIDs, client IDs, invalid formats, and edge cases Co-Authored-By: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> --------- Co-authored-by: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> * fix: emit message_saved event after stream abort (#215) * fix: emit message_saved event after stream abort When a user interrupts a streaming response, the message is saved to the database but the frontend never receives the message_saved event. This leaves the message with a temporary stream_ prefix ID, preventing deletion until page refresh. Now the MESSAGE_SAVED event is emitted after db.commit() in the abort handler, before STREAM_ABORTED, so the frontend updates the message ID to the real UUID and deletion works immediately. Co-Authored-By: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> * fix: always show latest topic when clicking an agent Unify sidebar and spatial workspace to use the same logic for selecting topics. Both now fetch from backend and always show the most recently updated topic (by updated_at) instead of remembering previously active topics. Co-Authored-By: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> * feat: improve message editing UX with edit-only option and assistant editing - Add "Edit" and "Edit & Regenerate" dropdown options for user messages - Allow editing assistant messages (content-only, no regeneration) - Add copy button to user messages - Move assistant message actions to top-right for better UX - Add auto-resizing textarea for editing long messages - Update backend to support truncate_and_regenerate flag Co-Authored-By: Claude Opus 4.5 <[email protected]> * refactor: extract message content resolution into dedicated module Extract scattered content resolution logic into core/chat/messageContent.ts with two main utilities: - resolveMessageContent(): Single source of truth for content priority - getMessageDisplayMode(): Explicit rendering mode determination This refactoring: - Reduces ChatBubble.tsx complexity (60+ line IIFE → 30 line switch) - Fixes inconsistency between copy/edit and display logic - Makes content source priority explicit and documented - Adds guard for empty content to avoid rendering empty divs - Improves maintainability with testable pure functions Co-Authored-By: Claude Opus 4.5 <[email protected]> --------- Co-authored-by: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> * fix: deep research structured output and recursion limit (#216) - Use function_calling method for structured output in clarify node. The default json_mode doesn't work with Claude models via GPUGEEK provider. Claude supports tool/function calling natively but not OpenAI's response_format JSON mode. - Increase recursion_limit from 25 to 50 in agent.astream() to handle complex research tasks with more iterations. Co-authored-by: Claude Opus 4.5 <[email protected]> --------- Co-authored-by: xinquiry(SII) <[email protected]> Co-authored-by: Claude <[email protected]>
* feat: add drag-and-drop agent reordering and auto-update on version mismatch (#206) * fix: resolve i18next missing key warnings in TierInfoModal Replace hardcoded Chinese strings with proper i18n translation keys in the tier selector component. This fixes console warnings about missing translation keys when using the zh locale. - Add speedLabels, reasoningLabels, and features keys to app.json - Add multiplier key to tierSelector in all locales - Add recommended key to common.json in all locales - Refactor TierInfoModal.tsx to use translation key references Co-Authored-By: Claude <[email protected]> * feat: add drag-and-drop agent reordering Integrate dnd-kit into existing AgentList and AgentListItem components to support drag-and-drop reordering in both the sidebar and spatial focused view. Backend: - Add sort_order field to Agent model - Add PATCH endpoint for bulk reordering agents - Add migration for sort_order column Frontend: - Add sortable prop to AgentList with DndContext/SortableContext - Add dragHandleProps to AgentListItem for drag behavior - Use plain div (not motion.div) when sortable to avoid animation conflicts - Use set-based comparison for state sync (only reset on add/remove) - Add reorderAgents action to agentSlice * feat: auto-refresh frontend on version mismatch with backend Add automatic update mechanism that detects when the frontend version doesn't match the backend version and refreshes the page to fetch the latest assets. This ensures users with cached frontends always get updated code without manually clearing their browser cache. - Add useAutoUpdate hook with retry logic (max 3 attempts) - Add UpdateOverlay component for update feedback - Clear service workers and caches before reload - Store retry state in localStorage to prevent infinite loops * fix: address PR review feedback for drag-and-drop agent reordering - Move AgentList state sync from render to useEffect to prevent render loops - Add isDraggingRef to prevent backend sync during active drag operations - Restore keyboard accessibility to CompactAgentListItem (role, tabIndex, aria-pressed, onKeyDown handler) - Guard localStorage writes with try/catch in useAutoUpdate to handle restricted environments --------- Co-authored-by: Claude <[email protected]> * fix: resolve version mismatch causing refresh loops in test environment (#207) * fix: move the comment to correct position * fix: fix the test environment version * fix: remove auto-update feature to prevent refresh loops The auto-update mechanism causes infinite refresh loops when frontend and backend versions mismatch in test environment. Remove the feature entirely until a more robust solution is implemented. - Delete useAutoUpdate hook and UpdateOverlay component - Remove AutoUpdateWrapper from App.tsx * Fix: Unify tool call UI (pills in agent timeline) for streaming + refresh (#208) * feat: add simple landing page and logout button * fix(web): unify tool call rendering in agent timeline after refresh; add landing page - Render tool calls as pills with a shared details modal (args/results/errors) - Attach historical tool_call tool messages into agentExecution phases instead of standalone messages - Remove legacy ToolCallCard-based rendering path * fix(web): address review feedback for tool call modal + typewriter - Move tool-call UI strings into i18n (app.chat.toolCall.*) for en/zh/ja - Memoize tool result parsing and image URL derivation in ToolCallDetails - Avoid duplicate argument headings in ToolCallDetailsModal for waiting_confirmation - Remove redundant typewriter cursor className conditional and fix unused state var * feat: message editing and deletion (#209) * feat: add message editing and deletion with truncate-regenerate flow - Add PATCH /messages/{id} endpoint for editing user messages - Add DELETE /messages/{id} endpoint for deleting any message - Add regenerate WebSocket handler for re-running agent after edit - Add edit/delete UI to ChatBubble with hover actions - Add i18n translations for en/zh/ja Includes fixes from code review: - Fix pre-deduction error handling to skip dispatch on any failure - Reset responding state before regeneration to prevent stuck UI - Add message ownership verification before edit/delete operations * fix: improve the code according to sourcery review * fix: use version+SHA for beta image tags to ensure unique deployments (#211) The previous approach used only the pyproject.toml version (e.g., 1.0.16) which caused Kubernetes to not pull new images when multiple commits used the same version tag. Now uses format: {version}-{short-sha} (e.g., 1.0.16-f13e3c0) Co-authored-by: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> * feat: conversation interrupt/abort functionality (#212) * feat: add conversation interrupt/abort functionality - Add stop button and Escape key shortcut to abort streaming generation - Implement Redis-based signaling between API server and Celery worker - Worker checks abort signal every 0.5s and gracefully stops streaming - Save partial content and perform partial billing on abort - Add visual indicator for cancelled/aborted messages - Add timeout fallback (10s) to reset UI if backend doesn't respond - Add i18n strings for stop/stopping/escToStop in en/zh/ja * fix: address abort feature edge cases from code review - Clear stale abort signals at task start to prevent race condition when user reconnects quickly after disconnect - Finalize AgentRun with 'failed' status on unhandled exceptions to ensure consistent DB state across all exit paths - Move time import to module level (was inline import) * fix: address Sourcery review feedback for abort feature - Reuse existing Redis client for abort checks instead of creating new connections on each tick (performance improvement) - Fix potential Redis connection leaks in ABORT and disconnect handlers by using try/finally pattern - Track and cleanup abort timeout in frontend to prevent stale timers from racing with subsequent abort requests * Preserve phase text when copying streamed output (#210) * Preserve phase text when copying streamed output * Extract agent phase content helper * fix: use existing PhaseExecution type and correct useMemo dependencies - Replace inline PhaseWithStreamedContent type with Pick<PhaseExecution, 'streamedContent'> for type consistency across the codebase - Fix useMemo dependency array to use agentExecution?.phases instead of agentExecution to ensure proper recalculation when phases array changes * Fix streaming agent messages and prevent deleting non-persisted messages (#213) * Fix message deletion for agent executions * Address Sourcery review: stricter UUID validation and safer id assignment - Add isValidUuid utility with canonical UUID pattern (8-4-4-4-12 format) to replace loose regex that accepted invalid strings like all-hyphens - Fix streaming_start handler to only set id when eventData.id is truthy, preventing accidental overwrites with undefined/null - Improve delete guard with contextual messages ("still streaming" vs "not saved yet") and change notification type to warning - Add comprehensive tests for isValidUuid covering valid UUIDs, client IDs, invalid formats, and edge cases Co-Authored-By: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> --------- Co-authored-by: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> * fix: emit message_saved event after stream abort (#215) * fix: emit message_saved event after stream abort When a user interrupts a streaming response, the message is saved to the database but the frontend never receives the message_saved event. This leaves the message with a temporary stream_ prefix ID, preventing deletion until page refresh. Now the MESSAGE_SAVED event is emitted after db.commit() in the abort handler, before STREAM_ABORTED, so the frontend updates the message ID to the real UUID and deletion works immediately. Co-Authored-By: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> * fix: always show latest topic when clicking an agent Unify sidebar and spatial workspace to use the same logic for selecting topics. Both now fetch from backend and always show the most recently updated topic (by updated_at) instead of remembering previously active topics. Co-Authored-By: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> * feat: improve message editing UX with edit-only option and assistant editing - Add "Edit" and "Edit & Regenerate" dropdown options for user messages - Allow editing assistant messages (content-only, no regeneration) - Add copy button to user messages - Move assistant message actions to top-right for better UX - Add auto-resizing textarea for editing long messages - Update backend to support truncate_and_regenerate flag Co-Authored-By: Claude Opus 4.5 <[email protected]> * refactor: extract message content resolution into dedicated module Extract scattered content resolution logic into core/chat/messageContent.ts with two main utilities: - resolveMessageContent(): Single source of truth for content priority - getMessageDisplayMode(): Explicit rendering mode determination This refactoring: - Reduces ChatBubble.tsx complexity (60+ line IIFE → 30 line switch) - Fixes inconsistency between copy/edit and display logic - Makes content source priority explicit and documented - Adds guard for empty content to avoid rendering empty divs - Improves maintainability with testable pure functions Co-Authored-By: Claude Opus 4.5 <[email protected]> --------- Co-authored-by: Claude (Vendor2/Claude-4.5-Opus) <[email protected]> * fix: deep research structured output and recursion limit (#216) - Use function_calling method for structured output in clarify node. The default json_mode doesn't work with Claude models via GPUGEEK provider. Claude supports tool/function calling natively but not OpenAI's response_format JSON mode. - Increase recursion_limit from 25 to 50 in agent.astream() to handle complex research tasks with more iterations. Co-authored-by: Claude Opus 4.5 <[email protected]> * fix: attach thinking content to agent execution message When agent_start event arrives before thinking_start, it consumes the loading message. The thinking_start handler then couldn't find a loading message and created a separate thinking message, causing the thinking content to appear as a separate bubble below the agent response. Fix the thinking event handlers to also check for running agent execution messages and attach thinking content to them instead of creating separate messages. Co-Authored-By: Claude Opus 4.5 <[email protected]> * fix: align thinking_end condition with thinking_chunk Use consistent condition `m.agentExecution?.status === "running"` in both thinking_chunk and thinking_end handlers for finding agent messages. Co-Authored-By: Claude Opus 4.5 <[email protected]> --------- Co-authored-by: Claude <[email protected]>
Summary
pyproject.tomlinstead of timestamp-based versionProblem
In the test environment, the backend was showing
beta-20260127111717-fed44e7while the frontend showed1.0.16. This version mismatch triggered theauto-update hook, which attempted to refresh the page repeatedly, causing an infinite loop.
Changes
.github/workflows/beta.yaml): Extract version fromservice/pyproject.tomlinstead of generating a timestamp-based beta versionuseAutoUpdatehook andUpdateOverlaycomponent to prevent refresh loops// NOTE:to{/* NOTE: */}in AgentList.tsxTest Plan
/xyzen/api/v1/system/versionreturns1.0.16由 Sourcery 提供的摘要
使 beta 部署的版本管理与后端保持一致,并移除前端的自动更新行为,以防止刷新循环。
错误修复:
pyproject.toml中定义的服务语义版本对齐,避免前端/后端版本不匹配。AgentList中无效的 JSX 注释语法,确保组件能够正确编译和渲染。CI:
service/pyproject.toml中读取版本号,而不是生成基于时间戳的 beta 版本。Original summary in English
Summary by Sourcery
Align beta deployment versioning with backend and remove frontend auto-update behavior to prevent refresh loops.
Bug Fixes:
CI: