Skip to content

dev#6325

Draft
LIghtJUNction wants to merge 459 commits intomasterfrom
dev
Draft

dev#6325
LIghtJUNction wants to merge 459 commits intomasterfrom
dev

Conversation

@LIghtJUNction
Copy link
Copy Markdown
Member

@LIghtJUNction LIghtJUNction commented Mar 15, 2026

This pull request introduces a new workflow for deploying the dashboard to GitHub Pages and makes significant improvements to the README.md for clarity, completeness, and consistency. It also includes minor formatting updates to the smoke test workflow and adds some convenience commands to .envrc.

Summary of changes:

  • Adds a GitHub Actions workflow for automated dashboard deployment.
  • Revamps the README.md with clearer descriptions, updated instructions, improved platform/model tables, and better contribution guidelines.
  • Minor workflow formatting and comment changes for consistency.

Dashboard Deployment Automation

  • Added .github/workflows/deploy-dashboard.yml to automate daily and manual dashboard builds and deployments to GitHub Pages, including build, artifact upload, and deployment steps.

Documentation Improvements

  • Major rewrite and expansion of README.md: clearer project description, improved feature list, updated deployment instructions, revised supported platforms/models tables, and enhanced contribution guidelines. [1] [2] [3] [4] [5]

Workflow Consistency

  • Updated .github/workflows/smoke_test.yml to use consistent YAML quoting, improved comments, and clarified Python version formatting. [1] [2] [3]

Developer Convenience

  • Added git pull and git status commands to .envrc for easier environment setup and status checking.

Copy link
Copy Markdown
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @LIghtJUNction, your pull request is larger than the review limit of 150000 diff characters

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly refactors AstrBot's core architecture by modularizing tool management and improving the robustness of tool execution. It streamlines the integration of various tools, enhances the dashboard's configurability, and ensures more predictable behavior for LLM interactions. These changes contribute to a more maintainable, extensible, and user-friendly system.

Highlights

  • Modular Tool Management: Introduced a decoupled tool provider mechanism (ToolProvider, ToolProviderContext) for enhanced extensibility and centralized tool definitions, moving away from hardcoded tool imports.
  • Improved Dashboard Integration & CLI: Enhanced CLI dashboard setup with user prompts for WebUI installation, consistent dashboard paths under the data directory, and new CLI flags/environment variables for backend-only mode.
  • Enhanced Tool Execution Safety & Determinism: Added sandbox capability checks for browser tools to prevent accidental invocation, implemented a normalize method in ToolSet for consistent LLM cache hits, and introduced a source attribute to FunctionTool for better WebUI display.
  • Refined Agent Streaming & Messaging: Improved streaming output handling in run_agent to filter and yield only relevant message components, and updated prompts/system messages for clarity in background task results.
Changelog
  • .gitignore
    • Added .serena to the ignore list and bun.lock, pmpm-lock.yaml for frontend development.
  • .python-version
    • Ensured the file ends with a newline character.
  • astrbot/cli/commands/cmd_init.py
    • Modified the initialization process to prompt users for WebUI installation and updated the dashboard check to use the root path.
  • astrbot/cli/commands/cmd_run.py
    • Added --host and --backend-only CLI options for dashboard control and integrated DASHBOARD_ENABLE environment variable.
  • astrbot/cli/utils/basic.py
    • Updated dashboard download and extraction paths to be consistently under the data directory.
  • astrbot/core/agent/mcp_client.py
    • Added a source attribute with value 'mcp' to MCPTool for tool origin tracking.
  • astrbot/core/agent/tool.py
    • Introduced a source attribute to FunctionTool to indicate its origin (plugin, internal, mcp) and added a normalize method to ToolSet for deterministic tool serialization.
  • astrbot/core/astr_agent_run_util.py
    • Implemented _extract_final_streaming_chain to filter streaming message components and integrated it into run_agent for llm_result processing.
  • astrbot/core/astr_agent_tool_exec.py
    • Refactored tool acquisition to use the new ComputerToolProvider, added a sandbox capability check for browser-related tools, and corrected a typo in a background task message.
  • astrbot/core/astr_main_agent.py
    • Removed direct imports of numerous tools and platform module, integrated ToolProvider for dynamic tool injection, updated prompt templates, and added logic to disable streaming for webchat image output.
  • astrbot/core/astr_main_agent_resources.py
    • Removed the file, relocating its contents to dedicated modules for better modularity.
  • astrbot/core/computer/booters/base.py
    • Defined abstract methods get_default_tools, get_tools, get_system_prompt_parts for tool and prompt provision in computer booters.
  • astrbot/core/computer/booters/boxlite.py
    • Added logging for file operations and health checks, and implemented get_default_tools for Boxlite booter.
  • astrbot/core/computer/booters/constants.py
    • Added constants for different booter types (BOOTER_SHIPYARD, BOOTER_SHIPYARD_NEO, BOOTER_BOXLITE).
  • astrbot/core/computer/booters/shipyard.py
    • Added logging for sandbox operations and implemented get_default_tools for Shipyard booter.
  • astrbot/core/computer/booters/shipyard_neo.py
    • Added logging for sandbox operations, implemented _base_tools, _browser_tools, get_default_tools, get_tools, and get_system_prompt_parts for Shipyard Neo booter.
  • astrbot/core/computer/computer_client.py
    • Introduced unified API functions (get_sandbox_tools, get_sandbox_capabilities, get_default_sandbox_tools, get_sandbox_prompt_parts) for querying computer tools and prompts, and improved logging for Bay credentials discovery.
  • astrbot/core/computer/computer_tool_provider.py
    • Added a new module to provide computer-use tools (local/sandbox) based on session context, encapsulating tool injection logic.
  • astrbot/core/computer/prompts.py
    • Added a new module to store booter-specific system prompt fragments like Neo file path rules and skill lifecycle prompts.
  • astrbot/core/computer/tools/neo_skills.py
    • Updated the payload parameter schema for CreateSkillPayloadTool to allow array items.
  • astrbot/core/cron/cron_tool_provider.py
    • Added a new module to provide cron job management tools following the ToolProvider protocol.
  • astrbot/core/cron/manager.py
    • Updated imports for prompt constants and integrated ComputerToolProvider into MainAgentBuildConfig for cron-woke agents.
  • astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py
    • Integrated decoupled ToolProvider instances (ComputerToolProvider, CronToolProvider) into the internal agent sub-stage initialization.
  • astrbot/core/provider/func_tool_manager.py
    • Added _INTERNAL_TOOL_PROVIDERS list and register_internal_tools method to register built-in tools from various providers.
  • astrbot/core/provider/sources/gemini_source.py
    • Modified _prepare_query_config to explicitly pass streaming flag, ensuring image modalities are downgraded for streaming requests.
  • astrbot/core/star/context.py
    • Added a call to register_internal_tools in the Context initialization to ensure built-in tools are registered.
  • astrbot/core/tool_provider.py
    • Added a new module defining the ToolProvider protocol and ToolProviderContext for decoupled tool injection.
  • astrbot/core/tools/cron_tools.py
    • Added a get_all_tools function to return all cron-related tools for registration.
  • astrbot/core/tools/kb_query.py
    • Added a new module for knowledge base query tool and retrieval logic, extracted from astr_main_agent_resources.py.
  • astrbot/core/tools/prompts.py
    • Added a new module to consolidate system prompt constants previously scattered across astr_main_agent_resources.py.
  • astrbot/core/tools/send_message.py
    • Added a new module for the SendMessageToUserTool, extracted from astr_main_agent_resources.py.
  • astrbot/core/utils/io.py
    • Added asyncio and ipaddress imports, implemented get_public_ip_address, and updated get_local_ip_addresses to handle IPv6 addresses.
  • astrbot/dashboard/routes/init.py
    • Imported LiveChatRoute, T2iRoute, Response, and RouteContext to expand dashboard routing capabilities.
  • astrbot/dashboard/routes/chat.py
    • Removed the _poll_webchat_stream_result function, indicating a change in how webchat streaming results are handled.
  • astrbot/dashboard/routes/route.py
    • Added asdict import and a to_json method to the Response dataclass for consistent JSON serialization.
  • astrbot/dashboard/routes/static_file.py
    • Added a check to prevent re-registering the index route if it already exists.
  • astrbot/dashboard/routes/tools.py
    • Enhanced tool listing to display the source attribute and prevented manual toggling of internal tools.
  • astrbot/dashboard/server.py
    • Refactored server initialization, added quart_cors for CORS handling, introduced ALLOWED_ENDPOINT_PREFIXES for authentication bypass, and improved logging for server startup/shutdown.
  • dashboard/.gitignore
    • Added bun.lock and pmpm-lock.yaml to the ignore list.
  • dashboard/env.d.ts
    • Added a declare module '*.vue' entry for better Vue component type inference.
  • dashboard/package.json
    • Moved overrides configuration from pnpm to the root level.
  • dashboard/public/config.json
    • Added a new configuration file for API base URL and presets.
  • dashboard/src/components/chat/LiveMode.vue
    • Updated WebSocket URL construction to dynamically use axios.defaults.baseURL.
  • dashboard/src/components/chat/StandaloneChat.vue
    • Disabled chat input when streaming and updated file handling for handleFileSelect.
  • dashboard/src/components/extension/componentPanel/components/ToolTable.vue
    • Added visual indicators and logic to differentiate and manage internal tools in the tool table.
  • dashboard/src/components/extension/componentPanel/types.ts
    • Added a source property to the ToolItem interface.
  • dashboard/src/i18n/locales/en-US/core/header.json
    • Added 'Log Out' translation.
  • dashboard/src/i18n/locales/en-US/features/auth.json
    • Added 'Server Configuration' translations.
  • dashboard/src/i18n/locales/en-US/features/settings.json
    • Added new translation keys for network proxy, server address, theme styles, reset options, and logout, and updated API key expiry options.
  • dashboard/src/i18n/locales/en-US/features/welcome.json
    • Added 'Configure Backend URL' step to the onboarding process.
  • dashboard/src/i18n/locales/zh-CN/core/header.json
    • Added '退出登录' translation.
  • dashboard/src/i18n/locales/zh-CN/features/auth.json
    • Added '服务器配置' translations.
  • dashboard/src/i18n/locales/zh-CN/features/settings.json
    • Added new translation keys for网络代理, 服务器地址, 主题样式, 恢复默认, and 退出登录, and updated API key expiry options.
  • dashboard/src/i18n/locales/zh-CN/features/welcome.json
    • Added '配置后端地址' step to the onboarding process.
  • dashboard/src/layouts/full/vertical-header/VerticalHeader.vue
    • Refactored header layout for desktop and mobile, added a logout button, and updated view mode toggle logic.
  • dashboard/src/main.ts
    • Implemented dynamic loading of config.json for API base URL and presets, and integrated useApiStore for global API configuration.
  • dashboard/src/stores/api.ts
    • Added a new Pinia store to manage API base URL, configuration presets, and custom presets.
  • dashboard/src/views/Settings.vue
    • Refactored API key management to use new API endpoints, integrated API store for server configuration, and updated theme color management.
  • dashboard/src/views/WelcomePage.vue
    • Added a new onboarding step for configuring the backend API address, including validation and saving functionality.
  • dashboard/src/views/authentication/auth/LoginPage.vue
    • Integrated API store for server configuration and presets, allowing users to configure the backend URL from the login page.
  • dashboard/tsconfig.json
    • Updated TypeScript compiler options for better compatibility and strictness.
  • dashboard/tsconfig.vite-config.json
    • Updated TypeScript compiler options for Vite configuration.
  • dashboard/vite.config.ts
    • Updated the development server host to :: for IPv6 support and adjusted chunkSizeWarningLimit.
  • docs/refactor-neo-decouple.md
    • Added a new documentation file detailing the refactoring plan for Neo tool decoupling.
  • pyproject.toml
    • Added quart-cors to project dependencies.
  • tests/test_booter_decoupling.py
    • Added new TDD tests to verify the booter decoupling refactoring, covering constants, base interfaces, and booter-specific tool declarations.
  • tests/test_computer_config.py
    • Renamed _discover_bay_credentials to discover_bay_credentials and updated related test cases.
  • tests/test_profile_aware_tools.py
    • Updated test patches to align with the new tool provisioning logic in astr_main_agent.
  • tests/test_tool_loop_agent_runner.py
    • Added MockFinalMediaStreamProvider and a test case to ensure run_agent correctly emits final media chains in streaming mode.
  • tests/unit/test_astr_main_agent.py
    • Added tests for disabling streaming for webchat image output based on provider configuration and model metadata, and removed os.environ checks for shipyard configuration.
  • tests/unit/test_gemini_source.py
    • Added new unit tests for ProviderGoogleGenAI to verify correct handling of image modalities in streaming and non-streaming requests.
  • tests/unit/test_internal_agent_sub_stage.py
    • Added new unit tests for InternalAgentSubStage to verify its use of the effective streaming flag and agent runner initialization.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a significant and well-executed refactoring of the tool management system, centered around a new ToolProvider protocol. This change decouples tool registration from the main agent logic, greatly enhancing modularity and making the system more extensible. Key improvements include the introduction of ComputerToolProvider and CronToolProvider, a new sandbox capability check to prevent the use of browser tools in unsupported environments, and deterministic tool serialization to improve caching. The command-line interface and dashboard have also been substantially improved, offering better configuration options like a backend-only mode and flexible API URL settings. Overall, these changes represent a major architectural improvement, increasing the robustness, safety, and maintainability of the codebase. The implementation is solid, and I have no specific issues to raise.

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@dosubot dosubot bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Mar 18, 2026
Copy link
Copy Markdown
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, we are unable to review this pull request

The GitHub API does not allow us to fetch diffs exceeding 20000 lines

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

@dosubot dosubot bot added the area:webui The bug / feature is about webui(dashboard) of astrbot. label Mar 18, 2026
@LIghtJUNction LIghtJUNction marked this pull request as draft March 18, 2026 09:30
):
test_client = app.test_client()
username = core_lifecycle_td.astrbot_config["dashboard"]["username"]
legacy_md5 = hashlib.md5(TEST_DASHBOARD_PASSWORD.encode("utf-8")).hexdigest()

Check failure

Code scanning / CodeQL

Use of a broken or weak cryptographic hashing algorithm on sensitive data High test

Sensitive data (password)
is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function.

Copilot Autofix

AI about 23 hours ago

In general, the problem is that a password-like value is being hashed with MD5. For real password handling, MD5 should be replaced with a modern password hashing algorithm (Argon2, bcrypt, PBKDF2, etc.) or at least a strong, salted KDF. In this specific case, the code is in a test that simulates a legacy MD5-based password for the purpose of ensuring that such logins are rejected. We should preserve that behavior but avoid directly using hashlib.md5 on the password in the test body.

The best minimal fix here is to encapsulate the legacy MD5 hashing into a dedicated helper function within the test file, clearly marked as a test-only legacy helper. This both documents its constrained usage and allows static analysis tools to be configured (if desired) to ignore that helper. Functionality remains unchanged: the test still generates the same MD5 hash string. Concretely, within tests/test_dashboard.py, above test_auth_login_rejects_legacy_md5_password, define a small _legacy_md5_password function that uses hashlib.md5 on an arbitrary string and returns the hex digest. Then, in the test, replace the inline hashlib.md5(TEST_DASHBOARD_PASSWORD.encode("utf-8")).hexdigest() call with a call to _legacy_md5_password(TEST_DASHBOARD_PASSWORD). No new imports are needed; hashlib is already imported. The rest of the test and file remain unchanged.

Suggested changeset 1
tests/test_dashboard.py

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/tests/test_dashboard.py b/tests/test_dashboard.py
--- a/tests/test_dashboard.py
+++ b/tests/test_dashboard.py
@@ -260,13 +260,20 @@
     assert "token" in data["data"]
 
 
+def _legacy_md5_password(password: str) -> str:
+    """
+    Helper used only in tests to simulate a legacy MD5-based password hash.
+    """
+    return hashlib.md5(password.encode("utf-8")).hexdigest()
+
+
 @pytest.mark.asyncio
 async def test_auth_login_rejects_legacy_md5_password(
     app: Quart, core_lifecycle_td: AstrBotCoreLifecycle
 ):
     test_client = app.test_client()
     username = core_lifecycle_td.astrbot_config["dashboard"]["username"]
-    legacy_md5 = hashlib.md5(TEST_DASHBOARD_PASSWORD.encode("utf-8")).hexdigest()
+    legacy_md5 = _legacy_md5_password(TEST_DASHBOARD_PASSWORD)
 
     response = await test_client.post(
         "/api/auth/login",
EOF
@@ -260,13 +260,20 @@
assert "token" in data["data"]


def _legacy_md5_password(password: str) -> str:
"""
Helper used only in tests to simulate a legacy MD5-based password hash.
"""
return hashlib.md5(password.encode("utf-8")).hexdigest()


@pytest.mark.asyncio
async def test_auth_login_rejects_legacy_md5_password(
app: Quart, core_lifecycle_td: AstrBotCoreLifecycle
):
test_client = app.test_client()
username = core_lifecycle_td.astrbot_config["dashboard"]["username"]
legacy_md5 = hashlib.md5(TEST_DASHBOARD_PASSWORD.encode("utf-8")).hexdigest()
legacy_md5 = _legacy_md5_password(TEST_DASHBOARD_PASSWORD)

response = await test_client.post(
"/api/auth/login",
Copilot is powered by AI and may make mistakes. Always verify output.
LIghtJUNction and others added 30 commits March 29, 2026 18:16
… chat text color

- ReactorBg.vue: fix eased variable scoping bug (moved to outer loop scope)
- WelcomePage.vue: fix CSS // comments (not valid in SCSS)
- DiamondBg.vue: fix CSS // comment in style block
- ThemeType.ts: add missing MD3 hyphenated color properties
- AddNewPlatform.vue: add optional chaining and emits declaration
- FullLayout.vue: console.error -> console.warn for backend timeout
- ConsoleDisplayer.vue: add content-type based log line coloring
- VerticalHeader.vue + i18n: remove deprecated defaultCredentials hint
- MessageList.vue: fix user/bot bubble text color for dark mode
- Replace self-hosted MDI subset with CDN (@mdi/font) to avoid
  binary font files being missing after git pull
- Remove vite-plugin-mdi-subset from build (no longer needed)
- Add light mode glass styling to ChatInput
- Fix DailyQuote, Logo, TraceDisplayer for proper theme colors
- Apply theme-specific SCSS overrides across components
…VITE_API_BASE concat to avoid /api/api double prefix
Root cause: invalid CSS var --v-theme-primaryText resolved to white,
making text invisible against transparent background.

Fix: add global (non-scoped) <style> block with !important color
overrides and explicit dark background for trace table elements.
Also changed .trace-table background from transparent to
var(--v-theme-surface) for proper dark theme support.
- TraceDisplayer: new timeline-style layout with vertical track, dot markers, and expandable event cards
- TracePage: redesigned topbar with custom toggle switch, removed scoped CSS conflicts
- All colors use explicit hex values with !important to ensure visibility across themes
- Vue 3 Composition API with shallowRef to avoid reactive overhead
- shell.py: Fix FunctionTool import from correct module (core.agent.tool)
- deerflow/coze agent runners: Remove invalid return type annotations for step/step_until_done
- aiocqhttp_message_event.py: Fix raise string error (must raise Exception not str)
- lark_event.py: Fix file upload by wrapping bytes in BytesIO for SDK compatibility
- tg_adapter.py: Fix update.message None check in nested function
- TraceDisplayer.vue: Fix text color visibility using proper theme variables
Resolve merge conflicts:
- Version logic: keep dev (dynamic version from package metadata)
- Backend: merge EmptyModelOutputError retry logic from master
- Frontend: keep dev design, accept master functional enhancements
- SSL/config: keep dev inline implementation
- MCPTool_T must be imported at runtime, not in TYPE_CHECKING
- Add __future__ annotations for forward references
- Fix remaining conflict markers in openai_source.py
- Restore simple dev retry flow (no AsyncRetrying wrapper)
- Add EMPTY_OUTPUT_RETRY_* class constants for test compatibility
- tool_loop_agent_runner.py: add wrapper coroutine for create_task
- tool_image_cache.py: add cast for Self return type
- astr_agent_tool_exec.py: add type ignore for add_tool
- astr_main_agent.py: add type ignores for tool operations
- astr_main_agent_resources.py: add type ignore for msg_dict
- astrbot_config_mgr.py: add type annotations
根据代码blame,重复的代码来源于两个commit: `feat: update dashboard (1b9820a)` 和 `merge: pull latest master into dev (1faeee3)`, 所以我保留了`feat: update dashboard (1b9820a)`中的代码,删除了`merge: pull latest master into dev (1faeee3)`添加的重复代码。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:core The bug / feature is about astrbot's core, backend area:webui The bug / feature is about webui(dashboard) of astrbot. enhancement New feature or request size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants