From 3e04e30b2460b46ba96e4df8117d126dda49a13d Mon Sep 17 00:00:00 2001 From: Melorise <0d00@0721.hk> Date: Wed, 7 Oct 2026 00:30:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=80=82=E9=85=8D=E6=96=B0=E7=89=88?= =?UTF-8?q?=E5=8D=83=E9=97=AE=E5=BD=95=E9=9F=B3=E7=8A=B6=E6=80=81=E5=B9=B6?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E8=87=B3=201.0.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AI-assisted-by: Codex AI-model: gpt-5.6-sol AI-reasoning-effort: medium Co-authored-by: Codex --- AGENTS.md | 2 +- CHANGELOG.md | 7 +++++ CLAUDE.md | 2 +- linux/fcitx5/CMakeLists.txt | 2 +- linux/fcitx5/tama-asr.conf.in | 2 +- package.json | 2 +- packaging/README.md | 6 ++--- packaging/arch/PKGBUILD | 2 +- packaging/arch/PKGBUILD-from-source | 2 +- packaging/arch/README.md | 4 +-- packaging/assets/tama-asr.metainfo.xml | 1 + packaging/deb/build-deb.sh | 2 +- packaging/rpm/build-rpm.sh | 2 +- packaging/rpm/tama-asr-binary.spec | 4 +++ src/backends/qianwen.ts | 1 + test/qianwen.test.ts | 37 ++++++++++++++++++++++++++ 16 files changed, 64 insertions(+), 14 deletions(-) create mode 100644 test/qianwen.test.ts diff --git a/AGENTS.md b/AGENTS.md index 135bfb7..ada90f2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,7 @@ ## 项目范围 -TamaASR 是仅面向 Linux 的 Fcitx5 桌面语音输入工具。项目名为 `TamaASR`,分发包名为 `tama-asr`,当前版本为 `1.0.2`。 +TamaASR 是仅面向 Linux 的 Fcitx5 桌面语音输入工具。项目名为 `TamaASR`,分发包名为 `tama-asr`,当前版本为 `1.0.3`。 不得恢复 Windows、PowerShell 或 Tauri 输出路径。发行版差异只能存在于依赖说明和打包配置,不能进入语音输入核心逻辑。 diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d8e3da..1893774 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ 本项目遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 的格式。 +## [1.0.3] - 2026-10-07 + +### 修复 + +- 适配新版千问网页的录音状态标记,修复松开快捷键后未点击停止按钮、悬浮球持续停留在黄色终止状态的问题。 +- Nix 包启动时显式使用 XWayland,与其他发行版的启动参数保持一致。 + ## [1.0.2] - 2026-09-04 ### 修复 diff --git a/CLAUDE.md b/CLAUDE.md index 135bfb7..ada90f2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,7 +2,7 @@ ## 项目范围 -TamaASR 是仅面向 Linux 的 Fcitx5 桌面语音输入工具。项目名为 `TamaASR`,分发包名为 `tama-asr`,当前版本为 `1.0.2`。 +TamaASR 是仅面向 Linux 的 Fcitx5 桌面语音输入工具。项目名为 `TamaASR`,分发包名为 `tama-asr`,当前版本为 `1.0.3`。 不得恢复 Windows、PowerShell 或 Tauri 输出路径。发行版差异只能存在于依赖说明和打包配置,不能进入语音输入核心逻辑。 diff --git a/linux/fcitx5/CMakeLists.txt b/linux/fcitx5/CMakeLists.txt index 641774f..bc05acc 100644 --- a/linux/fcitx5/CMakeLists.txt +++ b/linux/fcitx5/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(tama-asr-fcitx5 VERSION 1.0.2 LANGUAGES CXX) +project(tama-asr-fcitx5 VERSION 1.0.3 LANGUAGES CXX) include(GNUInstallDirs) include(CTest) diff --git a/linux/fcitx5/tama-asr.conf.in b/linux/fcitx5/tama-asr.conf.in index d4cb915..5cde4c2 100644 --- a/linux/fcitx5/tama-asr.conf.in +++ b/linux/fcitx5/tama-asr.conf.in @@ -6,7 +6,7 @@ Comment[zh_CN]=将 TamaASR 网页后端连接到当前输入上下文 Type=SharedLibrary Library=@TAMA_ASR_LIBRARY_PATH@ Category=Module -Version=1.0.2 +Version=1.0.3 OnDemand=False Configurable=False diff --git a/package.json b/package.json index c43cd1d..129c2f1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tama-asr", "productName": "TamaASR", - "version": "1.0.2", + "version": "1.0.3", "private": true, "packageManager": "pnpm@11.21.0", "author": "TamaASR contributors", diff --git a/packaging/README.md b/packaging/README.md index 8c3717d..722cd04 100644 --- a/packaging/README.md +++ b/packaging/README.md @@ -1,13 +1,13 @@ # Linux 分发打包 -TamaASR 1.0.2 的系统包由两部分组成: +TamaASR 1.0.3 的系统包由两部分组成: - Electron 应用安装到 `/opt/tama-asr`,命令入口为 `/usr/bin/tama-asr`; - Fcitx5 常驻 addon 由目标发行版中的 CMake/Fcitx5 开发包编译,并安装到该环境报告的 addon 目录。 安装包同时提供桌面入口、项目图标和 `/etc/xdg/autostart/tama-asr.desktop`,因此安装后的默认行为是随桌面会话启动。设置页关闭自启动时,应用需要在用户级 autostart 目录写入覆盖项,不能删除系统包所属文件。 -`tama-asr` 1.0.2 的 deb、RPM 和 Arch 元数据均声明替换旧 `meloasr` 包;通过对应发行版的包管理器安装新包时,旧应用、Fcitx5 addon 和桌面文件会一并卸载。 +`tama-asr` 1.0.3 的 deb、RPM 和 Arch 元数据均声明替换旧 `meloasr` 包;通过对应发行版的包管理器安装新包时,旧应用、Fcitx5 addon 和桌面文件会一并卸载。 ## 统一构建契约 @@ -42,7 +42,7 @@ pnpm run build:linux:dir packaging/deb/build-deb.sh ``` -产物位于 `packaging/out/tama-asr_1.0.2_.deb`。依赖名称按 Debian/Ubuntu 系列填写,但尚未在各发行版完成安装验证。 +产物位于 `packaging/out/tama-asr_1.0.3_.deb`。依赖名称按 Debian/Ubuntu 系列填写,但尚未在各发行版完成安装验证。 ## rpm diff --git a/packaging/arch/PKGBUILD b/packaging/arch/PKGBUILD index f1234bb..c2bc00c 100644 --- a/packaging/arch/PKGBUILD +++ b/packaging/arch/PKGBUILD @@ -1,5 +1,5 @@ pkgname=tama-asr -pkgver=1.0.2 +pkgver=1.0.3 pkgrel=1 pkgdesc='Web-backed voice input for Fcitx5' arch=('x86_64' 'aarch64') diff --git a/packaging/arch/PKGBUILD-from-source b/packaging/arch/PKGBUILD-from-source index 73f357c..b020e2c 100644 --- a/packaging/arch/PKGBUILD-from-source +++ b/packaging/arch/PKGBUILD-from-source @@ -1,5 +1,5 @@ pkgname=tama-asr -pkgver=1.0.2 +pkgver=1.0.3 pkgrel=1 pkgdesc='Web-backed voice input for Fcitx5' arch=('x86_64') diff --git a/packaging/arch/README.md b/packaging/arch/README.md index bbab619..0484ac3 100644 --- a/packaging/arch/README.md +++ b/packaging/arch/README.md @@ -8,7 +8,7 @@ ```bash curl --fail --location --remote-name \ - https://github.com/Melorise/TamaASR/releases/download/v1.0.2/PKGBUILD + https://github.com/Melorise/TamaASR/releases/download/v1.0.3/PKGBUILD makepkg --syncdeps --cleanbuild ``` @@ -20,7 +20,7 @@ makepkg --syncdeps --cleanbuild ```bash curl --fail --location --remote-name \ - https://github.com/Melorise/TamaASR/releases/download/v1.0.2/PKGBUILD-from-source + https://github.com/Melorise/TamaASR/releases/download/v1.0.3/PKGBUILD-from-source makepkg --syncdeps --cleanbuild -p PKGBUILD-from-source ``` diff --git a/packaging/assets/tama-asr.metainfo.xml b/packaging/assets/tama-asr.metainfo.xml index 5f99cc1..4af2c21 100644 --- a/packaging/assets/tama-asr.metainfo.xml +++ b/packaging/assets/tama-asr.metainfo.xml @@ -16,6 +16,7 @@ tama-asr + diff --git a/packaging/deb/build-deb.sh b/packaging/deb/build-deb.sh index 4954a64..3d6842b 100755 --- a/packaging/deb/build-deb.sh +++ b/packaging/deb/build-deb.sh @@ -2,7 +2,7 @@ set -euo pipefail project_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)" -version="${TAMA_ASR_VERSION:-1.0.2}" +version="${TAMA_ASR_VERSION:-1.0.3}" arch="${TAMA_ASR_DEB_ARCH:-$(dpkg --print-architecture)}" app_dir="${1:-${TAMA_ASR_ELECTRON_APP_DIR:-${project_dir}/release/linux-unpacked}}" work_dir="${project_dir}/packaging/out/deb-root" diff --git a/packaging/rpm/build-rpm.sh b/packaging/rpm/build-rpm.sh index 67e5cf9..19dbbb3 100755 --- a/packaging/rpm/build-rpm.sh +++ b/packaging/rpm/build-rpm.sh @@ -2,7 +2,7 @@ set -euo pipefail project_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)" -version="${TAMA_ASR_VERSION:-1.0.2}" +version="${TAMA_ASR_VERSION:-1.0.3}" app_dir="${1:-${TAMA_ASR_ELECTRON_APP_DIR:-${project_dir}/release/linux-unpacked}}" stage_dir="${project_dir}/packaging/out/rpm-root" top_dir="${project_dir}/packaging/out/rpmbuild" diff --git a/packaging/rpm/tama-asr-binary.spec b/packaging/rpm/tama-asr-binary.spec index a49ceb5..7121f7e 100644 --- a/packaging/rpm/tama-asr-binary.spec +++ b/packaging/rpm/tama-asr-binary.spec @@ -38,6 +38,10 @@ tar -C %{buildroot} -xzf %{SOURCE0} /etc/xdg/autostart/tama-asr.desktop %changelog +* Wed Oct 07 2026 TamaASR contributors - 1.0.3-1 +- 适配新版千问录音状态,修复松开快捷键后无法终止的问题。 +- Nix 启动参数与其他发行版保持一致,显式使用 XWayland。 + * Fri Sep 04 2026 TamaASR contributors - 1.0.2-1 - 修复快速停止可能使网页录音状态与外部会话不同步的问题。 diff --git a/src/backends/qianwen.ts b/src/backends/qianwen.ts index b0c4f66..d3fd510 100644 --- a/src/backends/qianwen.ts +++ b/src/backends/qianwen.ts @@ -21,6 +21,7 @@ export const qianwenAdapter: BackendWebAdapter = { isRecording(document) { const microphone = this.findMicrophone(document); return microphone?.getAttribute('aria-pressed') === 'true' || + microphone?.classList.contains('bg-tag') === true || /停止语音|stop\s*(voice|recording|input)/i.test(microphone ? controlDescription(microphone) : ''); }, diff --git a/test/qianwen.test.ts b/test/qianwen.test.ts new file mode 100644 index 0000000..4511b57 --- /dev/null +++ b/test/qianwen.test.ts @@ -0,0 +1,37 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { qianwenAdapter } from '../src/backends/qianwen'; +import { shouldClickMicrophoneOnStop } from '../src/preload/speech-session-state'; + +function microphone(className: string, attributes: Record = {}): HTMLElement { + return { + classList: { contains: (token: string) => className.split(/\s+/).includes(token) }, + getAttribute: (name: string) => name === 'class' ? className : attributes[name] ?? null, + querySelector: () => null, + textContent: '' + } as unknown as HTMLElement; +} + +test('千问新版录音样式允许点击停止,恢复空闲样式后不再判为录音', () => { + let control = microphone('cursor-pointer hover:bg-tag'); + const adapter = { ...qianwenAdapter, findMicrophone: () => control }; + const document = {} as Document; + assert.equal(adapter.isRecording(document), false); + + control = microphone('pointer-events-auto cursor-pointer bg-tag'); + assert.equal(adapter.isRecording(document), true); + assert.equal(shouldClickMicrophoneOnStop(adapter.isRecording(document), false), true); + assert.equal(shouldClickMicrophoneOnStop(adapter.isRecording(document), true), false); + + control = microphone('cursor-pointer hover:bg-tag'); + assert.equal(adapter.isRecording(document), false); +}); + +test('千问旧版 aria 和停止文案保持兼容', () => { + for (const attributes of [{ 'aria-pressed': 'true' }, { 'aria-label': '停止语音' }]) { + const adapter = { ...qianwenAdapter, findMicrophone: () => microphone('', attributes) }; + assert.equal(adapter.isRecording({} as Document), true); + } + const adapter = { ...qianwenAdapter, findMicrophone: () => null }; + assert.equal(adapter.isRecording({} as Document), false); +});