Commit Graph
87 Commits
Author SHA1 Message Date
16c3f841b5 chore(release): prepare 2.0.0-Beta.2 build 20260924
Integrate the reviewed 2.0 PRs and local fixes from 03136853.
Preserve the verified subtitle behavior and model/runtime corrections.
Keep the numeric Beta tag compatible with released clients while exposing
the date as application build metadata.

Co-authored-by: DepengWang <2818245+DepengWang@users.noreply.github.com>
Co-authored-by: HKLHaoBin <we3q@qq.com>
Co-authored-by: Nahida <1139500183@qq.com>
Co-authored-by: TRIP <1933142963@qq.com>
Co-authored-by: chyuwei <weichangyuwcy@gmail.com>
Co-authored-by: leonoxo <leonoxo@gmail.com>
Co-authored-by: tayir <arnoldincredible@126.com>
2026-09-24 17:28:24 +08:00
Chris233 c8bd7aa295 fix(foundry): keep local ASR warm and stream transcripts (#1052)
* fix(foundry): keep local ASR warm and stream transcripts

* fix(foundry): cancel stale release schedules
2026-09-13 12:28:41 +08:00
c4e8e88782 fix(providers): 支持火山 Agent Plan / Coding Plan,并修正 temperature 参数序列化 (#1069)
* fix(llm): 保留温度参数的简短十进制表示

* feat(asr): 接入火山 Agent Plan 语音识别

* feat(providers): 添加火山套餐服务与模型控制台入口

* docs(volcengine): 保留原有结构并补充套餐配置

* chore(asr): 明确套餐鉴权注释并清理未用导入

* fix(core): require API keys for Ark plan endpoints

Apply the official-endpoint API key requirement to Agent Plan and
Coding Plan across configured state, validation, and LLM construction.
Reuse the Core policy in both credential adapters and preserve optional
keys for custom endpoints and the dedicated plan request addresses.

Add regression coverage for missing, empty, whitespace-only and nonempty
keys, endpoint normalization, and all three LLM builder protocols.

This fix addresses a finding from a user-initiated AI red/blue review
of PR #1069. Implementation assistance: Codex.

Validation on macOS:
- Core: 962 tests passed, 1 ignored; new regressions failed before the fix.
- Linux Host: 57 tests passed (run on macOS, not native Linux validation).
- Tauri: cargo check --locked passed.
- git diff --check passed. Workspace and Tauri format checks report only
  unchanged baseline differences, verified against the parent commit.
- GUI/manual platform acceptance and live plan API calls were not run.

Co-authored-by: Codex <noreply@openai.com>

* test(core): consolidate provider regression coverage

Share the HTTP test setup for omitted custom-provider temperature and
Ark's default 0.3 representation. Keep both request assertions and the
polished response check.

Reduce the Ark builder matrix from 48 to 24 cases: exercise every key
state once per endpoint and keep successful construction for all three
protocols. Production behavior is unchanged.

Validation: focused regressions and the full Core suite pass (961 passed,
1 ignored). Changed files pass rustfmt; workspace formatting still reports
only existing differences outside this change. git diff --check passes.
Matt Standards and Spec reviews reported no findings for this increment.

Implementation assistance: Codex.

Co-authored-by: Codex <noreply@openai.com>

* fix(core): require keys for Ark Messages endpoints

---------

Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-13 02:49:42 +08:00
sim 110f1f631f feat(sync): 云同步指向专用端口 apic.openless.top:9443 并补充服务端交接文档
- MarketplaceConfig 新增 cloud_sync_base_url:production 用同一市场主机的独立端口 9443,new() 默认同源以兼容本机假服务合同测试
- cloud_sync 改用 cloud_sync_url 生成 /me/sync 请求地址
- 新增生产同步地址合同测试(主机一致、端口 9443、HTTPS)
- docs:cloud-sync.md 更新地址说明;新增 cloud-sync-server-handoff.md 交接文档(请求行为、状态码映射、验收清单)
2026-09-10 21:17:47 +08:00
sim 4ec44b2b0b merge: 汇入 origin/beta 第二轮(#1048 根证书指纹核验、#1049 录音保亮屏)
- 五语 PC/手机页文案取云端指纹核验版;de/es/fr 全套补译(指纹 6 键、保亮屏 4 键、恢复 4 键、中断/离线 2 键)
- index.html:帮助块改为指纹核验流程 + 录音屏新增保亮屏开关(默认开)
- RemoteInputStatus 补 caFingerprintSha256;Linux egui 面板移植指纹显示与复制
- remote-input-audio-queue 测试取云端(#1049 音频队列改造),我方仅格式差异
2026-09-10 17:16:58 +08:00
sim 0ac0fbd391 merge: 汇入 origin/beta(#1037 远程输入持久 CA、#1040 F13-F20/Mac 听写键、#1020 腾讯云实时语音、#1044 统一模型字段与异步保存隔离)并完成 2.0 UI 适配
冲突解决原则:2.0 重写的界面以本地为准,云端功能语义全部移植——
- ProviderForm 离开收敛接入 SettingsModal / ChannelList / LlmProtocolFields / CredentialField(关闭、切节、换供应商前冲掉防抖写入并等待在途写完成)
- 腾讯云三段式密钥 + 固定模型档分支移植进 2.0 ChannelCredentialFields;OAuth 静态模型走描述符
- Mac 听写键进入 ShortcutRecorder(allowMacDictationKey)并改用 refresh 拉新偏好
- 远程输入手机页新证书信任流程(持久本地 CA + 描述文件/CA 下载 + 复制链接),de/es/fr 补齐全套新文案
- 纯格式分歧文件取云端后 prettier 归一;双方新增内容(i18n、测试)两侧保留
2026-09-10 16:47:30 +08:00
zhou zhichao f39a68a795 修复远程录音息屏丢失并默认保持亮屏 (#1049) 2026-09-10 16:01:55 +08:00
zhou zhichao b72ec9671a 远程输入:补充首次信任前的根证书指纹核验 (#1048) 2026-09-10 16:01:29 +08:00
zhou zhichaoandChris233 882fac63f0 fix(remote-input): preserve phone trust across restarts and IP changes (#1037)
* fix(remote-input): preserve phone trust with a persistent local CA

* fix(remote-input): disclose LAN certificate MITM risk

---------

Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-10 06:36:12 +08:00
sim cd18fe7174 Merge fix/settings-experimental-consistency into codex/ui-2.0-details(偏好写入门控 + 语言区域同步与 2.0 布局偏好并存) 2026-09-09 13:22:00 +08:00
sim 1d29f8a6cd feat(app): finalize 2.0 channel settings UI, 8-language alignment and cloud-sync groundwork
- 渠道设置界面:ChannelList/LlmProtocolFields/ProvidersSection 渠道级协议与模型配置
- 8 种界面语言 1711 项文案对齐(de/en/es/fr/ja/ko/zh-CN/zh-TW)
- Core 协议层 llm_protocol 与 provider_service 配套、云同步准备
- linux-egui 后端与 Android updater 配套调整
2026-09-09 13:04:10 +08:00
sim 9a88bee5c6 feat(app): polish desktop UI, expand languages and prepare cloud sync 2026-09-09 01:13:16 +08:00
sim 4519f19c92 style(app): 统一前端与平台源码格式 2026-09-08 14:35:28 +08:00
sim a6ed77c0d0 feat(ui): 完善设置子页与自定义风格图标 2026-09-08 14:16:24 +08:00
sim 69f454bd68 feat(ui): integrate 2.0 interface and agent work
Consolidate the current 2.0 sidebar, overview, settings, vocabulary editing, correction rules page, and first-launch splash with their Core and Tauri adapters. Include the accompanying source and architecture documentation updates.

Validation: npm test (build and 73 discovered test files); cargo test -p openless-core --locked; Core/Linux and Tauri rustfmt checks.
2026-09-08 11:12:05 +08:00
sim b1370b5d40 chore(docs): 删除已无引用的火山控制台截图
volcengine-setup.md 重写为以 descriptor 为锚后,旧指南的 4 张控制台
截图不再被任何文档引用。
2026-09-07 14:24:16 +08:00
sim 34cab16fce docs: 以源码为准重写 1-app 文档系统(19 篇)
保留目录骨架与文件名,内容全部以当前源码为依据重写:范围与版本锚点
(2.0.0-Beta.1 / crate 0.1.0 / com.openless.app)、架构分层与 Core 模块地图、
桌面验收清单(功能域→源码入口→证据)、Linux 交接 8 篇(沿用 L01-L12 登记体系,
锚点落到 settings.rs/audio.rs/ports.rs 等)、后端接口契约、Android 计划、
运营指南 5 篇(以 provider descriptor 与实际 CSP/.gitmodules 为锚)。
原过程中的计划叙述、截图与历史收口记录不再保留。
2026-09-07 13:48:29 +08:00
sim 92da4fbf9b docs: 清理已了结的规划过程文档并同步引用
删除已完成/已收口任务的规划与过程记录(2.0 UX 收口、Core 2.0 计划、
PR#1019 复核与桌面复审、平台边界审计、Linux 引导知识快照、
Linux 共享后端阶段计划、供应商渠道计划、Windows sherpa 规划、
PR#711 评审截图、应用内测试计划),保留规范性文档、验收清单、
Linux 交接目录与运营指南,并修复全部引用链接。
2026-09-07 13:29:55 +08:00
sim be1118bc2a style(src-tauri): 应用 rustfmt 默认风格统一格式 2026-09-07 13:29:55 +08:00
sim 30e580fc37 feat(ui): Core 2.0 入口、设置与布局整理,Linux 引导与视觉改进
- 主页前置下一步与真实服务状态,服务卡直达对应设置;概览与热力图排布调整
- 设置按任务分类并支持搜索、焦点返回与 Escape 语义;旧 section ID 保持稳定
- AI 分区拆分语言模型/语音识别/本地模型/连接;渠道列表与表单重构,设置实底
- 本地模型管理与下载目录重排,补空态、主操作与窄屏布局
- Core 生成 provider descriptor 公开目录供浏览器预览懒加载,原生 IPC 合同不变
- Linux egui 按开始/听写/AI 服务/模型/工具/手机输入/历史/设置组织页面并加环境引导
- 五语言文案与文档(体验梳理、架构、计划收口)同步
2026-09-07 12:51:24 +08:00
Chris233 fc38edd1a3 refactor: consolidate Core 2.0 and restore cross-platform behavior (#1019)
* refactor: split Linux egui host from shared backend

* fix: keep CI contracts portable across runners

* fix(ci): preserve CRLF while removing qwen dependency

* fix(ci): regenerate target lockfile and install ripgrep

* fix(ci): gate desktop-only selection voice module

* ci: limit native build parallelism on cross-platform runners

* fix(host): expose blocking task seam to coordinator

* fix(settings): avoid macOS default hotkey collision

* docs: record cross-platform CI evidence

* ci: expose Linux validation package artifact

* ci: grant reusable Linux package permissions

* refactor: remove legacy coordinator dictation facade

* ci: skip unsupported MSI prerelease builds

* ci: install minisign only for signed Linux releases

* fix: keep test-only coordinator session helper

* refactor: move style preview diagnostics into core

* fix: import shared preferences type from core

* refactor: centralize enabled vocabulary projection

* ci: install ripgrep for Linux package gates

* test: make source contract line-ending agnostic

* fix: keep Linux desktop entry standards compliant

* docs: expose core style diagnostics contract

* ci: resolve Linux package version in app directory

* refactor: centralize ASR vocabulary priority

* fix: use shared vocabulary note constant

* refactor: keep vocabulary priority inside core

* test: retain starting-stop queue coverage

* ci: scope Linux updater URL to the current repository

* docs: close implementation and artifact evidence

* docs: record final CI artifact evidence

* fix(android): align updater plugin versions

* fix(android): pin updater crate exactly

* refactor(core): remove unused type anchor

* docs: record final artifact runs

* fix(remote-input): preserve beta status fields

* fix(tauri): finish beta host merge

* fix(asr): pass scoped operation to native qwen adapter

* fix(macos): bundle mlx metallib as a resource

* test(remote-input): update status wire contract

* feat: share Less Computer voice flow with Linux

* refactor(core): centralize host-independent runtime policy

* refactor(core): complete 2.0 backend consolidation

* fix(ci): prepare Sherpa after cache restore

* fix(macos): route native model paths through Core store

* fix(macos): use ModelStore catalog API

* fix(ci): serialize macOS native test build

* test(ci): preserve macOS cargo diagnostics

* fix(macos): release input source lock before await

* test(core): replace legacy hotkey injection gate

* test(core): move Codex sandbox contract into Core

* fix(core): close final runtime policy gaps

* fix(windows): terminate coding agent process trees

* fix(core): complete local model migration

* fix(credentials): align Core LLM model account

* fix(core): restore 1.x parity across shared backend

* fix(android): complete shared backend stubs

* fix: close cross-platform migration review gaps

* fix: complete migration lifecycles and platform compatibility

* docs: define desktop 2.0 acceptance and Linux handoff

* fix: close desktop parity and session lifecycle gaps

* fix: finish voice lifecycle and desktop feedback parity

* fix: close desktop cancellation and feedback race gaps

* fix: honor proxy settings and reject stale session effects

* fix: dispatch native cleanup on host runtimes and order events

* fix: keep optional recording effects best effort

* fix: close desktop agent model and QA lifecycle gaps

* fix: preserve desktop raw voice and QA turn ownership

* fix: finalize desktop dictation and QA feedback
2026-09-06 18:39:46 +08:00
Jimmy LeeandChris233 42c1b31754 本地模型增加whisper相关模型的支持; 增加qwen3-asr的rust版本, 相比C版本速度更快 (#940)
* feat: add selectable local ASR backends

* fix(build): 修复本地 ASR 多平台构建与旧渠道兼容

* fix(asr): 修复 MLX 权重跨线程 stream 错误

* fix(ci): exclude MLX Qwen3 from non-macOS jobs

* fix(ci): use app-relative ASR submodule path

* fix(android): skip qwen-asr C backend

* fix(android): guard qwen-asr by target triple

* fix(ci): 修正语法错误

* fix(ci): remove invalid checkout step options

* fix(asr): harden local backend integration

* fix(asr): 处理 PR #940 审查发现(9 项)

- strip: 全局保留 symbols,macOS release profile 单独退回 debuginfo(Homebrew rustc 的 LINKEDIT 问题仅限 macOS)
- 转录超时改为驱逐引擎而非无效 cancel():spawn_blocking 解码任务无法被中止,驱逐后下次会话加载新引擎而非排队
- Turbo/Q5 共享目录模型在 is_downloaded/downloaded_bytes/delete_model 上互相认账
- MLX 临时 WAV 用 RAII guard 兜底清理;HF tree API 改 Link rel=next 游标分页(offset 被服务器静默忽略),带防御上限与 5 个单测
- Intel Mac 渠道下拉不再闪现 MLX 预设;MetalToolchainGuide 默认折叠并标注仅源码构建期要求
- qwen3-asr-rs 子模块 URL 与 gitlink 指向 Open-Less org 镜像,嵌套 mlx-c 同步改指 org(供应链 N-6)
- README/注释补充:所有平台源码构建均需递归初始化子模块(path 依赖跨 target 解析)

* fix: harden local whisper model lifecycle and downloads

* fix(asr): address PR 940 review findings

* fix(ci): add local ASR model stub to backend tests

* fix(linux): bundle and sync fcitx5 selection plugin

* fix(macos): avoid duplicate whisper test module

* fix(history): make detail sibling keys unique

* fix(ci): stub macos whisper model constant

* test(ci): avoid macOS streaming timeout race

---------

Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-08-20 20:22:02 +08:00
sim 1b4c4b8140 fix(settings): keep experimental state consistent 2026-08-16 17:09:19 +08:00
Chris233 d961248210 fix(asr): 火山 ApiKey 模式改用官方端点,修复 45000010 (#931) (#936)
* fix(asr): 火山 ApiKey 模式改用官方端点,修复 45000010 (#931)

ApiKey 鉴权模式此前使用 wss://openspeech.bytedance.com/api/v3/plan/sauc/bigmodel_async,官方文档(docs/6561/1354869)中不存在 /plan/ 路径,导致服务端鉴权层返回 45000010 AuthenticationError(The API key or AK/SK in the request is missing or invalid)。

- 端点改为与 AppIdToken 模式一致的官方双向流式优化版端点 wss://openspeech.bytedance.com/api/v3/sauc/bigmodel_async
- 按官方鉴权表补充 X-Api-Request-Id(复用会话 connect_id)与 X-Api-Sequence(固定 -1)头
- 测试断言两模式端点一致并覆盖新增请求头

* docs(asr): 补充新版控制台 API Key 配置说明,澄清 Key 来源

- docs/volcengine-setup.md 新增「新版控制台(API Key 方式)」章节(官方链接 console.volcengine.com/speech/new/setting/apikeys)
- 设置页文案不再称「方舟 API Key」,改为「新版控制台 API Key」并在提示中给出官方创建入口(en/ja/ko/zh-CN/zh-TW 同步)

* fix(asr): use fresh request IDs for connection retries
2026-08-09 17:58:26 +08:00
b4d1317e77 feat(providers): LLM/ASR 供应商改成渠道卡片——同一家可存多把 key,排序即优先级 (#918)
* feat(providers): LLM/ASR 供应商改成渠道卡片——同一家可存多把 key,排序即优先级

原来一个供应商只能存一份配置,换 key 只能把旧的覆盖掉;想在主号/备号之间来回切,
每次都要重新粘贴。这个 PR 把「服务 → AI 提供商」从「下拉选厂商 + 一组字段」改成
一张张可命名、可排序、可开关的渠道卡片。

心智只有一条:**排序即优先级,列表里第一个启用的就是当前生效的渠道**。关掉的渠道
自动沉到末尾;后端不另存「当前选中」,避免「列表第一张是 A、实际请求打的是 B」
这种两处真相。

本 PR 只做多渠道的存储、编辑与切换,**不含失败重试与故障转移**(那是下一个 PR,
需要先把听写/润色链路里几十处隐式读 active 凭据的地方显式化)。

存储与迁移
- ChannelMeta(providerType / order / enabled / lastTest)以 serde(flatten) 嵌进
  ASR、LLM 两个 entry;v1 老 payload 照常反序列化。
- providerType 与渠道 id 解耦:同一家厂商的多张卡片各有自己的 id,但 providerType
  都指向同一个厂商实现。coordinator::resolve_effective_asr_provider 和 commands 里
  几十处 `== PROVIDER_ID` 的比较依赖它,拿成 id 会让整个 ASR 路由失效。
- v1→v2 迁移幂等:迁移出的渠道 **id 沿用原 preset id**,不生成 uuid,老用户的 map key
  一个字节都不变,重复执行结果一致。
- 迁移只在内存里做、不主动落盘:启动时写 keyring 会在 macOS 触发钥匙串 ACL 弹窗,
  留给下一次真实写入顺带固化。
- clean_credentials 原本会 retain(!is_empty) 删掉空 entry —— 刚点「添加渠道」、名字
  取好了还没填 key 的卡片会被静默删掉,改为「渠道卡片只能由用户显式删除」。
- ChannelMeta 手写 Default(derive 会让 enabled=false,而 write_account 用
  entry().or_default() 建 entry,新写入的渠道会一出生就被禁用)。
- Windows 全新安装预置一张 Foundry 本地 ASR 卡片,保住开箱即用。

IPC
- 新增 list/create/rename/delete/set_enabled/reorder/record_test 七个命令。
- set_credential/read_credential 的 provider 作用域原本硬性拒绝 LLM 账户,补上
  get/set_for_llm_provider —— 编辑列表里第 3 张 LLM 卡片必须能按 id 定位。
- validate_provider_credentials / list_provider_models 新增可选 channel_id:
  卡片上的「测试连通」要测用户点的那一张,而不是当前生效的那张。

前端
- ChannelList:卡片列表、拖拽排序、开关沉底、生效中/失败标红/延迟展示。
- 添加与编辑弹窗;本地引擎与 Codex OAuth 不做预置固定卡片,和云端厂商一样从
  「添加渠道」里选,只是编辑时没有 key/地址字段。
- 新手引导(Onboarding)列表为空时直接摊开添加表单,不让新用户对着空列表发呆。
- 五种语言文案齐备。

验证:cargo test --lib persistence::credentials(31 passed)、commands::(104 passed)、
npm test(含 tsc + vite build,退出码 0)、浏览器 mock 预览逐项走查四种卡片状态与两个弹窗。

设计与分期见 docs/provider-channels-plan.md。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(channels): 添加改成一步、拖拽在真机能用、卡片状态不再假装"健康"

三处都是装机自用后暴露的问题。

**添加渠道少一步。** 原来是「先建卡片、再填凭据」两步 —— 那只是实现上需要先有渠道 id
才能写凭据(凭据按 id 作用域存),不该变成用户多点一次。改成点+ 直接开一个完整弹窗,
供应商、名字、密钥、地址、模型、连接检查都在一屏里;草稿卡片在后台先建出来,用户什么
都没填就关掉时由 delete_channel_if_blank 回收,不会在列表里留空卡片。换供应商也不再
需要重建卡片,走新增的 set_channel_provider_type。

**拖拽在打包后的 app 里根本不动。** Tauri 的 webview 默认开着 dragDropEnabled,会把
HTML5 的 dragstart/drop 当成文件拖放吞掉 —— 浏览器预览里是好的,真机里是坏的,只验
前者就会漏。改用 pointer 事件手写,顺带让 Windows / Android 行为一致。

改的过程中炸出第二个:最初用 setPointerCapture,它把后续事件重定向到手柄,浏览器补发
的 click 于是落到设置弹窗的遮罩上(遮罩挂着 onClick={onClose}),**拖一下卡片整个设置
面板就关了**。改成 window 级监听不动事件目标,并在捕获阶段吞掉拖拽后紧跟的那一次 click。

**卡片状态不再假装"健康"。** 原来当前那张有绿点 + 「生效中」文字,两者都被读成"这张
能用",可它只代表排在最前面 —— 一张 key 已经失效的卡片照样排第一。优先级和健康度是两
个正交的维度,被压成了一个视觉。现在:
- 绿点与「生效中」全部去掉,当前那张只用左侧一条竖条表达位置,不带健康暗示;
- 验证按钮移到卡片上(开关左侧),**按钮自己就是结果容器**:未验过显示「验证」、
  通过显示延迟数字(`284ms`,数字本身既说明通了又能比快慢)、失败显示能指导行动的短
  标签(`✗ 401` 改 key / `✗ 429` 等会儿 / `✗ 超时` 查网络);
- 副行显示上次验证是多久以前,超过一天的结果褪色 —— 让"这条结论会过期"可见;
- 按钮宽度固定,避免文字变化把开关和箭头挤来挤去;
- **不做自动验证**:验证是真实 API 调用(LLM 走一次真润色、ASR 传一段静音音频),
  打开设置就全部验一遍等于按卡片数烧额度,还容易撞进限流。

顺带把 mock 的 reorderChannels 改成真重排:原来是空操作,浏览器预览里松手后顺序被
listChannels 拉回原样,看着像"拖拽坏了",会误导下一个人。

另:补上此前遗漏的 rustfmt(自己编辑范围内的行)。

验证:cargo test --lib persistence::credentials(31 passed)、commands::(101 passed)、
tsc 0;浏览器侧用精确的 pointer 事件序列验了拖动跟手、松手持久化、设置面板不被误关。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(channels): 迁移时优先把「填过凭据」的渠道排第一,别让空卡片顶到最前

`active` 指向一个已不存在的 entry 是真实会发生的:前端 prefs 里的 activeAsrProvider
与凭据库里的 active.asr 是两份数据,历史上可能不同步。原来遇到这种情况纯按字母序挑一张
排第一,完全不看那张有没有填过 key —— 结果很容易把一张空卡排到最前,用户升级后打开就
看到「未配置」,而他真正配好的那张其实还在列表下面躺着。

排序优先级改为:原 active → 填过凭据的 → 字母序(兜底,保证幂等)。

同时补一个边界测试钉死底线:即使 active 指向缺失 entry,迁移也**绝不碰任何凭据** ——
所有 key 原样留在各自 entry 里,用户把想用的那张拖回第一位就能恢复。

验证:cargo test --lib persistence::credentials(33 passed,跑前已备份 preferences.json
且跑后 md5 未变)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(channels): 写明重试尚未实现,并区分代码里已有的连接层重连与渠道故障转移

排查时在代码里搜到 retry 容易误以为渠道重试做了。补两条既有行为的说明:
net.rs::send_with_retry 只对连接层失败重连同一个 endpoint(拿到任何 HTTP 响应即返回、
超时不重试),永远不会换卡片;润色失败已经会回落插入 ASR 原文,所以「全渠道失败 →
出原文」这条决策天然满足,P2 要做的是在回落前多试几张卡片。

同时写明 P0 的定位:多渠道现在的价值是存档与手动切换,排第二的卡片不会被自动用上。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(channels): 修复渠道化 Spec 缺陷——禁用语义/order 冲突/默认值回填/LocalAsr 激活

- sync_active_channels 全部禁用时清空 active,运行时不再使用已禁用渠道凭据
- create_channel 落盘前 compact_orders,消除新卡与禁用项 order 冲突
- 换供应商时仅空槽写入 preset 默认 endpoint/model(不覆盖用户已填值)
- LocalAsr 激活前确保本地引擎渠道卡存在、启用并置顶
- 更新 provider-channels-plan 状态与待确认项

* fix(channels): 修复 Omni 路由与草稿生命周期

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-08-07 23:09:41 +08:00
Chris233 5be28b1dbd feat(asr): 支持讯飞实时语音转写(RTASR)提供商(#842) (#894)
- 新增 asr/xfyun.rs RTASR 流式客户端:signa = Base64(HmacSHA1(MD5(appid+ts), apiKey))
  鉴权,1280B/40ms 分块发送,{"end": true} 收尾,seg_id 去重拼接,断连 partial 兜底,
  鉴权/限流/超时错误分类可读。
- 全链路接入:dictation 主流程、QA 面板、重新转录、取消、设置页凭据预检与
  "验证"探活;凭据 xfyun.app_id / xfyun.api_key 存系统凭据库,不落日志。
- 设置页新增「讯飞实时语音转写」选项(AppID + API Key),5 种语言 i18n。
- 文档:docs/xfyun-asr.md + README/README.zh/USAGE 同步。

已知限制:标准版 RTASR 无请求级热词参数(在讯飞控制台配置),语种默认中文普通话。
2026-08-03 21:37:10 +08:00
8f49971874 feat(asr): support additional Bailian speech models (#866)
* feat(asr): support more Bailian speech models

* test(asr): cover final 8k downsample phase

* fix(asr): address review findings on Bailian model routing (#866)

- route paraformer-8k-realtime / sensevoice-8k-realtime to classic WebSocket,
  matching the 8k downsample naming space in bailian.rs
- downsample 16k->8k with pairwise averaging (first-order low-pass) instead of
  pure decimation to reduce aliasing; drop the lone tail sample on flush
- cap async provider validation at 120s (60s poll) instead of 660s so the
  validate button cannot block for nearly 11 minutes
- join async transcript segments with a space so latin-script words do not
  get glued together

* fix(asr): drop qwen3-asr-flash-filetrans and harden async polling (#866)

- qwen3-asr-flash-filetrans only accepts public URLs per DashScope docs; it
  is incompatible with the local-recording temporary OSS + oss:// path, so
  reject it in protocol_for_model / routing / picker / docs instead of
  shipping a model that would silently fail on real recordings
- simplify async_transcription_body / extract_async_result_url to the
  single fun-asr results shape
- add bounded retry (exponential backoff, deadline-capped) to async task
  polling and result download so one transient network blip does not
  discard an entire recording

* docs(asr): list qwen-audio-3.0-asr-flash as a synchronous model (#866)

Merge with beta #876 brought qwen-audio-3.0-asr-flash into the model
picker and protocol routing; keep the model reference doc in sync and
note that -streaming variants are not supported.

---------

Co-authored-by: LauraGPT <lauragpt@users.noreply.github.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-08-02 18:55:03 +08:00
NarwhalChen 346942e1bb style(ui): improve dark theme polish
Rework dark theme tokens, replace hardcoded dark-mode colors with theme variables, and remove the redundant overview metrics wrapper border.
2026-06-25 13:41:06 +08:00
TRIP fbe40ab583 feat(android): 集成 #704 安卓自动更新 + 同步 PC updater 修复(#705/#708)到安卓 (#712)
合并 #704(安卓应用内自动更新 + JNI 修复)并把 PC updater 修复同步到安卓:①安卓公钥回退 6F4B5994→1DEAA803(同步#705)②installError 安装失败兜底+去 throw(同步#708)③还原被自动合并误删的桌面 logClientError。桌面机制零变更。CI 全绿 + @claude 审核通过。取代 #704 及 #694 安卓部分。
2026-06-19 13:55:53 +08:00
TRIP 0eb69fc0f4 chore: codebase cleanup + behavior-preserving refactor (#693)
Audit-driven cleanup: 6 issue fixes (#689/#686/#680/#691/#678/#612), Aura skin removal (visually-neutral), dead-code cleanup (98→87 warnings), behavior-preserving modularization (coordinator.rs 6961→3083 + LocalAsr/ + polish/ submodules), and RELEASING.md (admin-only release policy). Gates: cargo test --lib 446 passed, tsc, all-platform build + contract checks green. Supersedes #685/#687/#690/#692/#682/#681.
2026-06-16 23:22:21 +08:00
HKLHaoBinandCursor 0fe5fbfdcf feat(android): align release pipeline with desktop updater rules
Add signed release APK builds on v*-tauri tags, minisign manifests per ABI, custom Android in-app updater, and CI cargo check for aarch64-linux-android.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-13 19:48:07 +08:00
HKLHaoBin 1ea467a001 feat(android): port Android APK runtime onto beta 2026-06-12 18:13:12 +08:00
Ltdaaa 6402fb8b1f docs: add aura skin implementation plan 2026-06-05 20:37:50 +08:00
Ltdaaa 09bcf6129f docs: add aura skin redesign spec 2026-06-05 20:33:44 +08:00
weikeyi 3bfd61cf1c feat(windows): add sherpa-onnx local ASR 2026-05-21 09:46:18 +08:00
baiqing d1aff0f97c Merge remote-tracking branch 'origin/main' into beta
# Conflicts:
#	openless-all/app/package-lock.json
#	openless-all/app/package.json
#	openless-all/app/src-tauri/Cargo.lock
#	openless-all/app/src-tauri/Cargo.toml
#	openless-all/app/src-tauri/tauri.conf.json
2026-05-17 18:18:23 +08:00
baiqing d6d1fee77e chore(repo): 移除内部 AI 协作 / 规划 / 审计文档,仅本地保留
公共仓库不再发布 CLAUDE.md / AGENTS.md / 内部 audit + roadmap +
github-tracking + superpowers + windows-*-tracking 等共 45 个文件。

- 全部用 `git rm --cached`,本地仍保留以供日常协作;
- `.gitignore` 加规则防止再次被 `git add` 拉回;
- 用户 docs(volcengine-setup / tauri-csp / references / 图片素材)
  以及 ISSUE_TEMPLATE / workflows / pull_request_template 仍保留发布。

密钥层面审计同步完成:未发现 API key / token / 私钥泄露,
tauri pubkey 与 GitHub OAuth client_id 均为设计上公开值。
2026-05-16 22:07:30 +08:00
TRIP e33fc0047b Merge pull request #450 from Open-Less/beta
release: 1.3.2 stable — marketplace UI gated, ASR correction upgraded
2026-05-15 23:03:04 +08:00
baiqing 883ff74cf4 docs(marketplace): add style pack marketplace planning doc
预留风格包市场的 HTTP API + IPC 契约 + DTO + 鉴权/缓存/安全策略。
IPC stub 未实装;后端 endpoint 选型 + 服务端工程化待定。
2026-05-14 14:59:36 +08:00
baiqing f89fd2ed22 chore(release): merge beta for Stable 1.3.1 2026-05-14 12:58:48 +08:00
baiqing effa12e5f1 fix(hotkey): Wayland 下用 CLI 触发录音,修复 #420
Wayland 协议禁止应用监听非聚焦窗口键盘事件,原 rdev 路径必然失效。
保留 X11 rdev 不动;Wayland 下走 stub HotkeyAdapter(不监听键盘),
通过 tauri-plugin-single-instance 把 `openless --toggle-dictation`
等 CLI 命令的 argv 转给主实例 coordinator,由桌面环境快捷键设置
绑定该命令实现全局触发。Settings → 录音 mount 时 invoke
is_wayland_cli_mode 拉状态,显示绑命令引导 callout
(GNOME / KDE / Hyprland / sway 四段步骤)。

新增:
- src-tauri/src/cli.rs — CLI intent 解析 + 10 个单测
- docs/issue-420-wayland-hotkey-research.md — 方案调研文档

改动:
- hotkey.rs Linux 分支:Wayland 检测命中走 WaylandCliAdapter stub
  (不再硬拒绝 wayland_unsupported)
- lib.rs:single-instance 回调路由 argv → dispatch_cli_intent
- commands.rs:新增 is_wayland_cli_mode IPC command
- coordinator.rs:dictation_phase_for_cli + cli_toggle_qa_panel
  暴露 CLI 入口,复用现有状态机
- Settings.tsx:WaylandHotkeyCallout 组件 + invoke pull 模型
- i18n × 5 locale:settings.recording.wayland.* 共 14 个键

macOS CGEventTap 和 Windows RegisterHotKey 路径零触碰。
2026-05-13 12:34:52 +08:00
H-Chris233 4d9b63aab3 Route qwen-asr through the organization fork
Keep the submodule pinned to the reviewed commit while moving the fetch URL to Open-Less/qwen-asr, then document the review checklist future upgrades must follow.\n\nConstraint: #301 identified the personal upstream submodule URL as a supply-chain risk.\nRejected: Updating the submodule commit together with the URL change | would mix provenance hardening with unreviewed upstream code changes.\nConfidence: high\nScope-risk: narrow\nDirective: Do not point .gitmodules back to antirez/qwen-asr; sync upstream into the organization fork and review the diff first.\nTested: gh repo view Open-Less/qwen-asr; git submodule update --init --recursive openless-all/app/src-tauri/vendor/qwen-asr; git diff --check; npm run build; cargo check --manifest-path src-tauri/Cargo.toml\nNot-tested: macOS INSTALL=0 ./scripts/build-mac.sh C-link verification.
2026-05-12 18:48:03 +08:00
baiqing a74a5472b0 docs: 2026-05-10 audit + beta logic review snapshots
Snapshot two audit artifacts produced 2026-05-10:

- docs/audit-2026-05-10-validated.md — 21 audit items run against
  the live source tree at openless-all/app/src-tauri/src/ with a
  CONFIRMED / FALSE_POSITIVE / PARTIAL verdict per item plus the
  exact file:line range that supports each verdict.

- docs/logic-review-2026-05-10.md — 5-path logic review of
  origin/beta @ 400097ad covering startup, press/release, end-of-
  session, capsule emit, and shutdown. Notable: at 400097ad the
  emit_capsule fix from PR #389 was NOT yet an ancestor, so the
  cpal audio-callback → AppKit/Win32 SIGTRAP risk was still live
  on that snapshot (subsequent merges have addressed it; this doc
  remains the dated record).

Both files are pure snapshots — no code changes here.
2026-05-10 18:13:46 +08:00
H-Chris233 717e694370 Constrain WebView loading with a minimal CSP
The desktop WebView no longer runs with an unexplained disabled CSP. The policy keeps scripts self-hosted, permits Tauri IPC and local Vite development connections, keeps provider/update/model networking on the Rust side, and documents the only unsafe allowance for React inline styles used by the existing pixel-aligned UI.

Constraint: Issue #226 requires csp:null to be replaced or explicitly bounded

Constraint: Provider validation, updater checks, and model downloads are Rust-side paths, not frontend fetch allowlist entries

Rejected: Keep csp:null with documentation only | weaker defense-in-depth and leaves the WebView effectively unconstrained

Confidence: high

Scope-risk: narrow

Directive: Do not add external provider domains to WebView connect-src unless a frontend fetch path is introduced

Tested: npm run build

Tested: npm run tauri -- info

Tested: cargo check --manifest-path src-tauri/Cargo.toml
2026-05-08 12:00:09 +08:00
millionart f358260866 merge upstream main into windows local asr 2026-05-06 21:28:41 +08:00
baiqing 938c6a74b9 docs: 工程审计基线 (audit-2026-05-06.md)
完整工程审计报告(系统化逐项检查):
- 后端架构总评 + 5 个 P1/P2 优化点(coordinator/commands 拆分等)
- 前端 4 个 UI bug(tab 切换竞态、流式滚动打断 QA 等)
- 工程化水平评估 + 4 条改善(CI 门禁 / E2E / gitignore / 版本号)
  → 其中 3 条已在本 PR 实现(CI matrix + gitignore + bump-version 脚本)
- 多端逻辑与体验一致性表(macOS vs Windows 平台差异 vs 行为一致性)
- UI/后端 IPC 1:1 映射校验(全部命令前后端对齐 ✓)
- 改进建议汇总:P0 无;P1 5 项;P2 6 项
- 总结:项目整体健康,建议下迭代处理 coordinator 拆分 + 前端动画竞态

把这份基线纳入 git,让 main 留下 v1.2.20→v1.2.21 这一阶段的工程现状
锚点,后续审计有 baseline 对照。
2026-05-06 20:57:38 +08:00
millionart 2a03f15292 Merge remote-tracking branch 'upstream/main' into codex/windows-local-asr
# Conflicts:
#	openless-all/app/src-tauri/Cargo.lock
#	openless-all/app/src-tauri/src/commands.rs
#	openless-all/app/src-tauri/src/coordinator.rs
#	openless-all/app/src-tauri/src/lib.rs
2026-05-06 20:15:12 +08:00
millionart 9ebedebf7d docs: plan Windows local ASR 2026-05-06 14:14:58 +08:00
millionart 844c1da098 docs: design Windows local ASR 2026-05-06 13:59:39 +08:00
millionart f497cd4eb5 merge Windows TSF IME support 2026-05-03 19:24:21 +08:00