Commit Graph
5222 Commits
Author SHA1 Message Date
Soulter e261ac5ca6 update 2026-09-08 00:37:45 +08:00
Soulter 45d4700607 chore: bump version to 4.28.0 2026-09-08 00:33:30 +08:00
Soulter 48d0da79ae feat: include Python version in metrics uploads (#9973) 2026-09-07 23:41:11 +08:00
Cui Yuxuan ec848fc2c3 feat(i18n): add Japanese localization (#9955) 2026-09-07 22:21:48 +08:00
Soulter 1651ef245e fix: isolate event loop watchdog stack dumps (#9941) 2026-09-07 21:56:42 +08:00
Sekken 47297fa4b1 fix(webui): show WebChat conversations in history lists (#9910) 2026-09-07 21:53:40 +08:00
Soulter ff86d3276c fix: honor computer runtime settings in proactive agents (#9971)
* fix: honor computer runtime settings in proactive agents

* fix: default missing computer runtimes to none
2026-09-07 21:33:57 +08:00
山海学社OMSocietyandOMSociety 2f504d3235 fix(qqofficial): render markdown for proactive send_by_session messages (#9914)
* fix(qqofficial): render markdown for proactive send_by_session messages

* fix(qqofficial): preserve use_markdown_ when splitting media chains

* fix(qqofficial): fall back to content when markdown payload is rejected

* feat(qqofficial): add use_markdown config to gate default markdown sending

* feat(dashboard): add i18n entries for qqofficial use_markdown config

* fix(qqofficial): expose use_markdown on webhook template and clarify label

Add use_markdown to the QQ Official (Webhook) config template so new
webhook platforms expose and save the setting in the WebUI, matching the
WebSocket template. Rename the field label from the ambiguous '主动消息发送模式'
to the clearer '主动消息使用 Markdown' (en/ru translations updated).

Add a regression test asserting both QQ Official templates expose use_markdown.

---------

Co-authored-by: OMSociety <OMSociety@users.noreply.github.com>
2026-09-07 17:05:54 +08:00
liwei zhengandzenfun 77da504998 fix: Enable unit test CI on three platforms (Windows, macOS, Linux). (#9954)
* ci: run unit tests on ubuntu, windows, and macos

* ci: promote macos lane to blocking now that it passes

* fix: make the unit test suite pass on Windows

* fix: address Windows CI encoding failures and review findings

- Force UTF-8 stdio for python children on Windows (exec, managed
  sessions, python tool) so non-ASCII output survives ANSI code pages
- Try cp936/gbk before mbcs in the decode fallback so Chinese output is
  not silently mojibake'd on non-Chinese Windows
- Use PowerShell call-operator quoting for space-containing executables
- Narrow the require_symlink skip to WinError 1314 and raise other OSErrors
- Raise managed-shell test yield budget to absorb CI cold starts

* fix: restore POSIX shell quoting in test_computer exec tests

The PowerShell call-operator form is a syntax error in POSIX shells;
generate the command per platform instead.

* fix: support mixed platform path mappings

* fix: preserve Windows shell output encoding

---------

Co-authored-by: zenfun <zenfun510@gmail.com>
2026-09-07 08:38:04 +08:00
xiaoxuan010 bd4b198a5f fix: limit knowledge base document page size options to drop invalid 'All' value (#9908)
The v-data-table-server in DocumentsTab inherits Vuetify's default
items-per-page-options [10, 25, 50, 100, -1], where -1 renders as 'All'.
Selecting it sends page_size=-1, which the backend clamps to 1, so the
document list shows only one item.

Explicitly set :items-per-page-options to [10, 25, 50, 100] so the 'All'
option is no longer offered, consistent with other pages such as
ConversationPage.

Closes #9907
2026-09-06 19:11:26 +08:00
wangyuxy9805-webandwangyuxy9805-web 1fc3d33455 fix: preserve context prefix during tool requery (#9957)
Co-authored-by: wangyuxy9805-web <319040411+wangyuxy9805-web@users.noreply.github.com>
2026-09-06 18:48:55 +08:00
Shxiao 610eab06c8 fix: preserve user content in dict-type config items (#9958) 2026-09-06 18:39:49 +08:00
KazusaUwU 6b84809052 fix(provider): serialize Gemini thinking levels correctly (#9899) 2026-09-04 10:28:39 +08:00
Hayston 9852285bda fix: resolve plugin market detail mix-up for same-named plugins (#9925)
Two market entries can share the same metadata `name` (different
authors), but the detail flow used `name` as the unique key:

- `openMarketPluginDetail` navigated with `plugin.name` as the route
  param, so both entries resolved to the same detail route;
- `selectedMarketPlugin` matched `item.name === pluginId`, always
  returning the first same-named entry (wrong version/author/repo/README);
- duplicate `v-for` keys (`plugin.name`) caused Vue to reuse wrong
  component instances in the market list;
- the random-plugins section keyed its sampling Map by `name`, collapsing
  same-named entries.

Introduce `getMarketPluginKey(plugin)` (`market_plugin_id || repo ||
name`) as the unique market identity, use it for navigation, list keys,
detail lookup (name kept as fallback for legacy deep links), and the
random-plugins sampling.

Fixes #9924
2026-09-04 00:49:28 +08:00
tjc66666666andgemini-code-assist[bot] 077d54baaf Fix path separator for remote_zip in computer_client.py (#8182)
* Fix path separator for remote_zip in computer_client.py

Ensure remote_zip uses forward slashes for compatibility.

* Update astrbot/core/computer/computer_client.py

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update computer_client.py

* Update computer_client.py

* Update computer_client.py

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-09-03 14:34:49 +08:00
liwei zheng db0affc982 fix(i18n): Relocate the zh-CN syncProvider subtree up to the namespace root (#9932)
* fix(i18n): 将 zh-CN 的 syncProvider 子树移至命名空间根级

* fix(i18n): 补全 ru-RU 缺失的翻译键(chat 8 / extension 5 / config-metadata 50)
2026-09-03 14:33:21 +08:00
AtQiYu 9115cc2945 Fix/expand chatui code highlighting 扩展 chatui 代码高亮 (#9892)
* fix: expand common language syntax highlighting

* fix: wire limited Shiki languages into ChatUI

* fix: register bundled aliases for chat code blocks

* fix: include Go grammar in T2I Shiki runtime
2026-09-02 22:32:47 +08:00
liwei zheng 6ee1ddd4fd fix(i18n): add missing en-US dashboard translations (#9896)
* fix(i18n): add missing en-US dashboard translations

Fill 26 keys present in zh-CN but missing from en-US locale files:
- tool-use: the whole dialogs.syncProvider subtree (MCP server sync
  dialog showed untranslated keys in English UI)
- config-metadata: section hints for knowledgebase and websearch
- provider: vllm_rerank description
- subagent: personaPreview label

Verified all en-US locale files now have full key parity with zh-CN.

* fix(i18n): move syncProvider keys to the tooluse namespace root

McpServersSection.vue resolves features.tooluse.syncProvider.* (the
subtree must sit at the file root); the previous commit had mirrored
zh-CN's placement under dialogs, which the namespace lookup never
reaches. Also drop form.personaPreview: the component consumes
cards.personaPreview (already present); form.personaPreview is an
unused key.
2026-09-02 09:50:10 +08:00
Soulterandsourcery-ai[bot] 41cd5d122d chore: bump version to 4.28.0-beta.1 (#9911)
* chore: bump version to 4.28.0-beta.1

* Update changelogs/v4.28.0-beta.1.md

Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>

---------

Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
v4.28.0-beta.1
2026-09-02 01:11:58 +08:00
Soulter c904fc5e23 chore: add a new sponsor 2026-09-02 01:09:34 +08:00
Soulter 7423420ccb chore: add a new sponsor 2026-09-02 00:58:38 +08:00
枭钰钰 5ad953611f fix(provider): exclude cached tokens from Gemini input usage accounting (#9880)
* fix(provider): exclude cached tokens from Gemini input usage accounting

Gemini's prompt_token_count already includes tokens served from cache.
_extract_usage was passing it straight to TokenUsage.input_other while also
setting input_cached to cached_content_token_count, so usage.input double
counted cached tokens and inflated context-occupancy stats. Subtract cached
tokens from input_other, matching the OpenAI provider's accounting.

* docs(provider): clarify _extract_usage reads response usage metadata

Address Sourcery review: the method receives GenerateContentResponseUsageMetadata,
not a candidate, so correct the docstring's opening line.
2026-09-01 23:48:12 +08:00
枭钰钰 9adf05abaf fix(provider): count Anthropic cache_creation tokens in input usage (#9881)
Anthropic's input_tokens only covers tokens after the last cache breakpoint;
cache_creation_input_tokens (tokens written into a new cache entry) were
dropped entirely from TokenUsage, so usage.input/total undercounted requests
that create a fresh cache entry. Fold cache_creation_input_tokens into
input_other in both _extract_usage and the streaming _update_usage, matching
the OpenAI provider's accounting where input_other holds all non-cache-read
input (including cache writes).

Official formula: total_input = cache_read + cache_creation + input_tokens.
2026-09-01 23:44:58 +08:00
26e215bcd6 feat(dashboard): add batch deletion for skills (#9906)
* feat: implement batch deletion functionality for skills with confirmation dialog

* fix(dashboard): refine skill batch deletion feedback

* fix(dashboard): preserve batch deletion feedback

* fix(dashboard): improve skill selection icon

* Delete dashboard/tests/skillsBatchDelete.test.mjs

---------

Co-authored-by: Soulter <905617992@qq.com>
Co-authored-by: Soulter <37870767+Soulter@users.noreply.github.com>
2026-09-01 23:37:46 +08:00
Soulter f996f3f122 feat: automatically record UMO names (#9909)
* feat: automatically record UMO names

* refactor: record UMO names only after wake

* refactor: record UMO names during wake checks

* refactor: extract UMO auto-name recorder
2026-09-01 23:29:38 +08:00
時壹andSoulter 385e4b6bfb fix: skip the respond stage on an empty message chain (#9653)
* fix: skip the respond stage on an empty message chain

* Delete tests/test_respond_stage.py

---------

Co-authored-by: Soulter <37870767+Soulter@users.noreply.github.com>
2026-09-01 11:23:11 +08:00
Soulter bff37193ad feat(platform): enrich group metadata across adapters (#9851)
* feat(platform): enrich group metadata across adapters

* perf(platform): make group member lookup opt-in

* Revert "perf(platform): make group member lookup opt-in"

This reverts commit 896b4b895b.
2026-09-01 11:19:30 +08:00
dependabot[bot] b096f75d8c chore(deps): bump github/codeql-action in the github-actions group (#9885)
Bumps the github-actions group with 1 update: [github/codeql-action](https://github.com/github/codeql-action).


Updates `github/codeql-action` from 4.37.8 to 4.37.9
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v4.37.8...v4.37.9)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.37.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-01 09:43:18 +08:00
枭钰钰 bc3b1c67aa fix(plugin): detect updates for plugins without persisted install sources (#9887)
Legacy plugins installed before install-source persistence (PR #9037) have
no plugin_install_sources record, so the backend falls back to an implicit
source record. The frontend update check skipped implicit sources entirely,
so these plugins never showed available updates until the user manually
re-bound or reinstalled the plugin.

Include implicit sources in the update check: they resolve to the default
registry, so match them against the default market by repo/name. Only
matched plugins surface an update; unmatched ones stay silent, so this
cannot introduce false positives. Also fix the misspelled online_vesion
field name so the backend payload matches what the frontend reads.
2026-09-01 09:42:51 +08:00
Soulter 34743f4adf refactor(dashboard): productize profile configuration (#9883)
* refactor(dashboard): productize AI configuration

* refactor(dashboard): hide safety mode strategy

* refactor(dashboard): clarify built-in AI heading

* refactor(dashboard): simplify AI enable control

* refactor(dashboard): simplify voice setting labels

* refactor(dashboard): clarify tool call output labels

* refactor(dashboard): streamline configuration toolbar

* style(dashboard): tighten configuration toolbar spacing

* style(dashboard): compact configuration toolbar

* style(dashboard): refine configuration workspace layout

* style(dashboard): refine built-in AI heading

* refactor(dashboard): refine AI configuration copy

* refactor(dashboard): remove redundant voice hints

* refactor(dashboard): refine multimedia setting guidance

* style(dashboard): align collapsed configuration controls

* refactor(dashboard): simplify wake prefix label

* refactor(dashboard): reuse provider selection menu

* style(dashboard): align configuration search control

* refactor(dashboard): clarify AI configuration labels

* refactor(dashboard): modernize profile plugin selection

* style(dashboard): refine provider menu elevation

* fix(dashboard): confirm execution mode changes

* style(dashboard): unify menu panel elevation

* fix(dashboard): enforce unified menu elevation
2026-09-01 00:13:45 +08:00
Soulter 2ea3bd7ec5 fix: defer dashboard setup until startup (#9879)
* fix: defer dashboard setup until startup

* refactor(migration): remove logging statements from webchat session migration
2026-08-31 10:35:33 +08:00
枭钰钰 0da69dd3f6 fix: ensure config directory exists before mkstemp in _write_config_snapshot (#9856)
AstrBotConfig._write_config_snapshot calls tempfile.mkstemp(dir=directory)
without verifying the directory exists. When a config profile is created
for the first time (e.g. create_conf instantiates AstrBotConfig with a
brand-new path), __init__ calls save_config before the directory is
guaranteed to exist, and mkstemp raises FileNotFoundError.

Add os.makedirs(directory, exist_ok=True) before mkstemp. This is the
standard defensive pattern for atomic-write helpers.

Fixes three intermittently-failing dashboard tests:
- test_t2i_set_active_template_syncs_all_configs
- test_t2i_reset_default_template_syncs_all_configs
- test_t2i_update_active_template_reloads_all_schedulers

Closes #9855.
2026-08-31 09:33:15 +08:00
WangPan59and王磐 f845a8d654 feat(websearch): add AnySearch as a web search provider (#9767)
Co-authored-by: 王磐 <wangpan.com>
2026-08-31 09:30:46 +08:00
AnegasakiNene 5aca0c9847 fix: resolve Gemini history image references (#9874) 2026-08-31 09:19:31 +08:00
Ruihan Liandliruihan e17f5688f4 fix: preserve text in Lark mixed messages (#9841)
Copy non-empty buffered text elements before clearing them when an image is inserted, and avoid emitting empty blocks for image-first messages.

Co-authored-by: liruihan <liruihan@example.com>
2026-08-31 09:16:49 +08:00
Ars1027andSoulter b0f2f90a83 fix(lark): recognize commands after leading bot mention (#9872)
* fix(lark): recognize commands after leading bot mention

* Delete tests/test_lark_adapter.py

---------

Co-authored-by: Soulter <37870767+Soulter@users.noreply.github.com>
2026-08-31 09:03:21 +08:00
一张白纸 0298ddd627 fix(dashboard): make skill editor dialog responsive on small screens (#9873)
* fix(dashboard): make skill editor dialog responsive on small screens

- Enable fullscreen mode for skill editor dialog on mdAndDown breakpoints
- Switch skill-editor grid to single-column stacked layout on mobile
- Constrain files panel height and enforce monaco editor min-height

* fix(dashboard): override skill editor dialog max-height on small screens

Address Sourcery-ai broader_impact finding on PR #9873: the base
`.skill-editor-dialog { max-height: min(88vh, 980px); overflow: hidden; }`
remains active in fullscreen mode on short mobile viewports (e.g.
landscape phones), where the stacked 20vh file tree + 40vh editor plus
title and action bar can exceed 88vh. Combined with `overflow: hidden`,
content gets clipped and the save/cancel buttons become unreachable.

Override `.skill-editor-dialog` within the existing
`@media (max-width: 860px)` block to lift the 88vh cap and allow
vertical scrolling when content overflows the viewport.

This is a minimal fix for the temporary solution; the 860-960px gap
between the media query and Vuetify's `mdAndDown` (960px) breakpoint is
accepted as a known limitation.
2026-08-31 08:48:52 +08:00
Soulter fe3d77568b refactor: embed agent runner configuration in profiles (#9821)
* refactor: embed agent runner configuration in profiles

* fix: limit personas to local agent runner

* style(dashboard): refine unsaved config notice

* refactor: refine embedded local runner configuration

* refactor: centralize agent runner migrations
2026-08-29 22:40:46 +08:00
Soulter d2d7e5aefd feat: add conversation shortcuts to statistics (#9847) 2026-08-27 19:04:56 +08:00
Soulter 69030851d4 feat: consolidate data dashboard and redesign conversations (#9846)
* feat: consolidate data dashboard

* feat: redesign conversation workspace

* docs: sync conversation OpenAPI artifacts

* docs: update data workspace navigation

* feat: group conversations by session

* fix: optimize mobile conversation workspace

* feat: refine log workspace

* fix: honor console auto-scroll setting

* feat: refine trace workspace
2026-08-27 18:53:02 +08:00
AnegasakiNene 8ea8ce613a fix(provider): preserve current user turn in Gemini history (#9738)
* fix: preserve current user turn in Gemini history

* test(provider): cover Gemini assistant-ending history
2026-08-27 00:57:35 +08:00
49caa6cb77 fix: preserve QQ Official group routing in unique sessions (#9833)
* fix: preserve QQ Official group routing in unique sessions

* Delete tests/test_qqofficial_unique_session.py

---------

Co-authored-by: liruihan <liruihan@example.com>
Co-authored-by: Soulter <37870767+Soulter@users.noreply.github.com>
2026-08-27 00:42:40 +08:00
Ruihan Liandliruihan c61fa088b7 fix: keep proactive agent history in contexts (#9818)
Preserve structured conversation history for cron and background-task wakeups so normal context truncation can process it.

Refs #9763

Co-authored-by: liruihan <liruihan@example.com>
2026-08-27 00:40:33 +08:00
Soulter 87a1917e80 refactor(dashboard): redesign bot management workspace (#9825)
* refactor(dashboard): redesign bot management workspace

* feat(dashboard): show workspace list loading progress
2026-08-26 16:38:33 +00:00
Soulter 5152c09a78 fix(dashboard): reset persona folder after deletion (#9832) 2026-08-26 22:43:09 +08:00
Soulter 1e88fbb3a3 feat(dashboard): improve authentication controls (#9830)
* feat(dashboard): improve authentication controls

* fix(dashboard): align logout menu icon
2026-08-26 21:34:43 +08:00
mrlonely a436456d42 fix: stop empty LLM requests before provider dispatch (#9815) 2026-08-26 20:50:07 +08:00
Soulter 4f5941eb05 fix: hide internal personal WeChat settings (#9827) 2026-08-26 20:49:52 +08:00
Ruihan Liandliruihan 690abefa5e fix: isolate rate limits by unified message origin (#9814)
* fix: isolate rate limits by unified message origin

* refactor: clarify rate-limit UMO key

---------

Co-authored-by: liruihan <liruihan@example.com>
2026-08-26 20:43:08 +08:00
Soulter e183dd285f feat(dashboard): support masked secret config fields (#9824)
* feat(dashboard): support masked secret config fields

* docs: document secret plugin configuration fields
2026-08-26 20:41:29 +08:00