* 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>
* 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>
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.
* 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>
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>
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.
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.
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