Commit Graph
5297 Commits
Author SHA1 Message Date
RuochenPan 860ceca22d fix: validate local permission support before saving config 2026-09-08 08:54:14 +08:00
Soulter a412146401 chore: bump version to 4.28.0 (#9975)
* chore: bump version to 4.28.0

* update
v4.28.0
2026-09-08 00:38:18 +08:00
dependabot[bot] d8d37f520f chore(deps): bump docker/setup-qemu-action in the github-actions group (#9974)
Bumps the github-actions group with 1 update: [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action).


Updates `docker/setup-qemu-action` from 4.2.0 to 4.3.0
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v4.2.0...v4.3.0)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: 4.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  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-08 00:38:10 +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
RuochenPan 05ac0ba3da feat: display runtime information in local permission controls 2026-09-07 17:08:48 +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
RuochenPan 3b049c8c4d feat: add disabled local access and platform-aware permission controls 2026-09-07 16:34:01 +08:00
RuochenPan 33d99ba20b feat: expose runtime and sandbox dependency information 2026-09-07 15:09:57 +08:00
RuochenPan bdc8ad1534 fix: initialize workspace for restricted file writes 2026-09-07 10:59:13 +08:00
RuochenPan a08c3dbfe0 fix: improve local permission settings layout 2026-09-07 10:47:40 +08:00
RuochenPan c5481fa7de test: align local sandbox tests with Windows support 2026-09-07 10:24:08 +08:00
RuochenPan 1510035eb6 chore: merge latest upstream master 2026-09-07 10:02:05 +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
RuochenPan 03c058aebd refactor: seal local sandbox abstractions 2026-09-04 15:13:16 +08:00
RuochenPan bc24cdd7a3 refactor: unify sandbox process lifecycle 2026-09-04 11:49:53 +08:00
KazusaUwU 6b84809052 fix(provider): serialize Gemini thinking levels correctly (#9899) 2026-09-04 10:28:39 +08:00
RuochenPan b29119e913 refactor: expose cross-platform sandbox limits 2026-09-04 10:27:30 +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
RuochenPan 5687129194 refactor: extract platform process sandboxes 2026-09-03 17:03:37 +08:00
RuochenPan 6c738a687b chore: merge upstream master into local sandbox branch 2026-09-03 15:28:21 +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