Commit Graph
823 Commits
Author SHA1 Message Date
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 477e6da93d feat(style-pack): rework UI + template-create path
UI:
- 「原文」改成标题旁的 pill 切换器,与 builtin 卡分离
- builtin 卡片按 light → structured → formal 排序,followed by imported 包
- 「+ 新建风格包」tile 固定在网格末位
- imported 卡片右上角换成红色 trash 删除按钮(builtin 显示装饰 sparkle 图标,无 delete)
- builtin 卡片背景做灰底处理;编辑按钮 disabled,"只读"
- 编辑按钮挪到底部,紧接「导出」右边

后端:
- 新增 IPC create_style_pack_from_template / persistence.create_from_template,「+」走这条路径直接落盘
- 编辑面板出场加 modal-backdrop-out / modal-drawer-out 两个 keyframe

清理:
- 删除 Settings.tsx 里 PR #429 留下的"润色 System Prompt 已迁移"死告示卡
- 删除 11 个相关 i18n key 跨 5 种语言
- 删除卡片上的「轮换 ON/OFF」按钮 + 编辑面板里同款 + metaStatus item
- BusyAction 移除 'toggling' 变体
- 删除 BUILTIN 选中态与 active 共用 highlight 的 bug
- SavedToast 统一替换 inline notice/error banner
2026-05-14 14:59:31 +08:00
baiqing eca6fae8c0 chore(release): bump version to 1.3.1 (Stable) 2026-05-14 12:58:30 +08:00
Chris233 4f644505f6 Merge pull request #429 from Cooper-X-Oak/cooper/style-pack-store-v1-beta
feat: add style pack store v1
2026-05-14 11:59:30 +08:00
H-Chris233 426bd8fe38 Preserve legacy style mode during migration
Constraint: legacy preferences may have defaultMode without activeStylePackId, and Raw style packs may still use the LLM path
Rejected: defaulting missing activeStylePackId to builtin.light | silently changes Raw, Structured, and Formal users during upgrade
Rejected: skipping script normalization for Raw LLM output | lets Simplified/Traditional preferences be bypassed by raw style packs
Confidence: high
Scope-risk: narrow
Directive: treat missing activeStylePackId as a migration case derived from defaultMode, not as the new-user default
Tested: cargo fmt --manifest-path src-tauri/Cargo.toml; git diff --check; cargo test --manifest-path src-tauri/Cargo.toml --lib types::tests::missing_active_style_pack_id_uses_legacy_default_mode; cargo test --manifest-path src-tauri/Cargo.toml --lib types::tests::explicit_active_style_pack_id_is_preserved; cargo test --manifest-path src-tauri/Cargo.toml --lib coordinator::dictation::tests::raw_llm_output_still_applies_script_preference; cargo test --manifest-path src-tauri/Cargo.toml --lib
Not-tested: full app build; desktop runtime smoke on macOS/Windows
2026-05-14 11:16:52 +08:00
H-Chris233 b3a2bc393d Make hotword misrecognition wording natural
Constraint: hotword wording appears in both effective system prompts and preview diagnostics
Rejected: keeping the slash form | less natural and leaves preview wording harder to read
Confidence: high
Scope-risk: narrow
Directive: keep hotword preview wording aligned with the system prompt wording
Tested: cargo fmt --manifest-path src-tauri/Cargo.toml; git diff --check; cargo test --manifest-path src-tauri/Cargo.toml --lib polish::tests::
Not-tested: full app build; desktop runtime smoke on macOS/Windows
2026-05-14 11:09:35 +08:00
H-Chris233 97e91ecdb6 Keep streaming history aligned with partial typing
Constraint: type_unicode_chunk returns the actual count of inserted characters, including partial failures
Rejected: appending the full delta after every successful call | hides short writes and makes typed_text diverge from the screen
Confidence: high
Scope-risk: narrow
Directive: preserve typed_text as the source of truth for what actually reached the focused field during streaming insertion
Tested: cargo fmt --manifest-path src-tauri/Cargo.toml; git diff --check; cargo check --manifest-path src-tauri/Cargo.toml; cargo test --manifest-path src-tauri/Cargo.toml --lib
Not-tested: desktop runtime smoke on macOS/Windows
2026-05-14 10:46:28 +08:00
H-Chris233 3563c8eb16 Keep style prompt defaults in the value layer
Constraint: types.rs must remain the shared value layer and must not depend on polish.rs
Rejected: keeping polish::prompts as the source of defaults | preserves the reverse dependency and backend test shim
Confidence: high
Scope-risk: narrow
Directive: keep built-in Style Pack defaults owned by types.rs unless the value-layer boundary changes explicitly
Tested: npm run build; npx tsx src/lib/stylePrefs.test.ts; cargo check --manifest-path src-tauri/Cargo.toml; cargo test --manifest-path src-tauri/Cargo.toml --lib
Not-tested: desktop runtime smoke on macOS/Windows
2026-05-14 10:24:34 +08:00
Chris233 180d9a70a0 更新 pr-agent.yml 2026-05-14 10:12:14 +08:00
baiqing d3f56c2926 chore(release): v1.3.1-20 — Wayland callout 三命令 + Qwen3-ASR 长语音修复
- PR #433:Wayland callout 补全 --toggle-qa / --cancel-dictation
  三命令并列 + 五语言同步翻译
- PR #434:本地 Qwen3-ASR 末段静默 padding 修末 chunk 丢内容;
  动态超时 max(15, ceil(audio_s × 0.6) + 10) 修长录音超时
2026-05-13 23:11:13 +08:00
TRIP 1ab0807ada Merge pull request #434 from Open-Less/fix/qwen-asr-long-audio-loss
fix(local-asr): Qwen3-ASR 长语音末段丢内容 + 长录音超时
2026-05-13 23:08:48 +08:00
TRIP 61325e3e03 Merge pull request #433 from Open-Less/feat/wayland-callout-three-commands
feat(wayland): callout 补全 --toggle-qa / --cancel-dictation
2026-05-13 23:08:21 +08:00
baiqing 41d2d9aa86 fix(local-asr): 修复 Qwen3-ASR 长语音末段丢内容 + 长录音超时
两个独立缺陷一并修:

缺陷 1(主要,丢内容):transcribe_stream 内部按 2s chunk 切片;
用户说完最后一个字立刻松键时录音缓冲没有任何静默尾巴,末 chunk
< 2s 拿不到静默帧 → C 引擎不收尾 → 该 chunk 转写结果被丢弃。等
5-10 秒静默再松键时由于尾部静默被录进缓冲反而正常。

修复:local_provider.rs transcribe() 把 PCM 转 f32 后追加 0.5 秒
(8000 个 f32 零值 @ 16kHz)静默,给 C 引擎收尾信号。duration_ms
仍按原始缓冲长度计算,padding 不计入。

缺陷 2(次要,长录音超时):COORDINATOR_GLOBAL_TIMEOUT_SECS = 15s
固定值;用户 RTF ≈ 0.3、慢机可达 0.5,60s 录音需 ~18s 转写就直接
超时。

修复:新增 local_qwen_transcribe_timeout(audio_secs) -> Duration,
公式 max(15, ceil(audio_s × 0.6) + 10);只在 Local Qwen 路径用
(Volcengine / Whisper / Bailian / Foundry / QA 路径不动)。配套
LocalQwenAsr::buffer_duration_ms() 不消费缓冲地读取音频时长。

加 4 条单测覆盖公式:短录音兜底 15s、长录音线性放大、ceil 部分秒、
0 秒边界。39 条 coordinator 测试全过。
2026-05-13 22:42:42 +08:00
baiqing 15c2ce560e feat(wayland): callout 补全 --toggle-qa / --cancel-dictation 命令
#420 评论里 aeoform 反馈 1.3.1-19 在 Wayland 下 callout 只展示 --toggle-dictation
一条,没有提及 QA 触发用 --toggle-qa、取消用 --cancel-dictation。

把单条命令展示改为三条命令并列,每条独立"复制"按钮 + 用途短标签
(开始/停止录音、打开/关闭 QA 面板、取消当前录音)。GNOME / KDE 步骤
改为"重复添加 1-3 组";Hyprland / sway 步骤给出三行示例 + 帮助区
启用 pre-line 渲染多行配置片段。

5 份 i18n 文件(zh-CN 源、en / zh-TW / ja / ko 同步翻译)同步新增三条
label key 并更新步骤文案。后端 CLI 三条命令早已实现(cli.rs:41-43),
本次只补前端提示。
2026-05-13 22:38:30 +08:00
cooper c77e235d96 fix style pack prefs sync consistency 2026-05-13 22:22:38 +08:00
cooper ae2c7e4e74 fix style pack export guard and switch-style sync 2026-05-13 21:45:13 +08:00
cooper a4c4cc224b fix tray style activation and streamed text consistency 2026-05-13 21:14:46 +08:00
cooper 16dd99cf67 refine style store runtime clarity and card layout 2026-05-13 19:18:58 +08:00
cooper 0c6cc8b292 refine style pack runtime semantics and editor clarity 2026-05-13 17:53:29 +08:00
cooper 0a19ad316e fix: surface style store editor action 2026-05-13 17:09:41 +08:00
cooper c77d9f42ed fix: restore backend test prompt stub 2026-05-13 16:42:37 +08:00
cooper 7616ef0422 fix: align polish streaming test signature 2026-05-13 16:11:18 +08:00
cooper b5001dc78f fix: streamline style store editor flow 2026-05-13 15:43:40 +08:00
baiqing 38f202a010 chore(release): v1.3.1-19 — SelectLite zoom 偏移 + 闪动修复(PR #428)
bump 1.3.1-18 → 1.3.1-19,6 处版本号手动同步(bump-version.sh regex 不收
Beta 版本号):package.json / package-lock.json (root+nested) / tauri.conf.json
/ Cargo.toml / Cargo.lock(openless)。

[变更]
- SelectLite 下拉位置在 html.zoom != 1 下不再右偏(fontScale 的 large 档影响
  最大);CSS zoom 在 WKWebView 下让 getBoundingClientRect 返回 post-zoom
  坐标但 position:fixed 用 pre-zoom 坐标,positionPopover 现在补偿 zoom 转回。
- 下拉打开瞬间的位置闪动消除(popoverMounted state 触发 useLayoutEffect 同步
  二次定位,替代 requestAnimationFrame 的 post-paint 校正)。
- 移除 macOS 走原生 <select> 的旁路分支,三平台统一自定义 popover。
2026-05-13 14:27:34 +08:00
TRIP 1f2b259909 Merge pull request #428 from Open-Less/fix/selectlite-zoom-offset
fix(SelectLite): zoom 补偿修位置偏移 + 同步二次定位消除闪动 + 三平台统一
2026-05-13 14:25:15 +08:00
cooper 4127fe6a28 fix: align style pack branch with beta settings 2026-05-13 14:12:19 +08:00
baiqing 424d9738d9 fix(SelectLite): zoom 补偿修位置偏移 + 同步二次定位消除闪动 + 三平台统一
[zoom 偏移 — 真凶]
fontScale.ts 通过 html.style.zoom 整体缩放页面(small=.9 / medium=1 / large=1.1)。
WKWebView 在 zoom 下双标:getBoundingClientRect 返回 post-zoom(视觉)坐标,
而 position:fixed 的 left/top/width 被当 pre-zoom(布局)坐标处理。直接
`left = rect.left` 让 popover 视觉位置 = rect.left × zoom,右偏
rect.left × (zoom-1) 像素。trigger 越靠右、zoom 越大,偏移越大。

修法:positionPopover 拿到 rect 后,把视觉坐标除以 zoom 转回布局坐标再
setAnchor,浏览器渲染时 ×zoom 后回到正确视觉位置。这是 v1.3.1-17 注释里
那句"WKWebView 里 portal+position:fixed 的自定义 popover 位置漂移反复修
不干净"的真正根因——前几位修过的人没意识到 zoom 是分母。

[闪动]
之前 setPopoverRef 用 requestAnimationFrame 在 popover mount 后再校正一次
位置,但 RAF 在 paint 之后触发,导致「兜底位置 paint → 校正位置 paint」
两帧闪动。短选项尤其明显(fallback popoverHeight=280 vs 真实 60~100px 让
flipUp 决策反转)。改用 popoverMounted state 翻 useLayoutEffect 的依赖,
两阶段定位都同步在 paint 前完成,用户只看到一帧最终位置。

[移除 mac native 分支]
v1.3.1-17 因为上述偏移修不干净,把 macOS 改走原生 <select>(NSPopUpButton)。
zoom 补偿到位后自定义 popover 在 mac 上对齐 trigger,删掉 mac 原生分支
(含 detectOS import),三平台统一走自定义实现,视觉/键盘交互一致。
2026-05-13 14:10:04 +08:00
cooper 8174cb4e8c feat: add style pack management UI 2026-05-13 14:08:10 +08:00
cooper 8baf160ea2 feat: add style pack runtime and persistence 2026-05-13 14:06:29 +08:00
baiqing 1d0f01a4b5 chore(release): 补齐 package-lock.json 到 1.3.1-18
上一次 bump 漏改了 package-lock.json 的 root + nested version,
导致 beta push CI 的 'Verify version sync across all 5 files' 步骤红。
release-tauri.yml 已基于 v1.3.1-18-beta-tauri 出包成功,本 patch 只
为修复 CI 元数据对齐,不影响已发布产物。
2026-05-13 13:55:00 +08:00
baiqing b4aa4972dd chore(release): v1.3.1-18 — Wayland CLI 触发修复 #420 2026-05-13 12:47:03 +08:00
TRIP b699384762 Merge pull request #427 from Open-Less/fix/issue-420-wayland-cli
fix(hotkey): Wayland 下用 CLI 触发录音,修复 #420
2026-05-13 12:45:58 +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
baiqing c5bdb02595 chore(release): v1.3.1-17 — Mac native select + 胶囊白底升 0.85 + ASR 行清理
[SelectLite]
- macOS 走原生 <select>(NSPopUpButton),不再用自定义 portal popover——
  WKWebView 里 portal+position:fixed 的位置漂移问题反复修不干净
- Win/Linux 仍用自定义 popover:popover 锁到 trigger 宽(width 不再用 minWidth),
  避免内容撑大跑出 trigger 范围
- positionPopover 横向 maxLeft 用 rect.width,两帧 left 一致

[Capsule]
- pill 白底 alpha 0.62 → 0.85(用户:"让白色更白一些")
- cancel/confirm 按钮保持 1.3.0 stable 取值;thinking 字号 17/weight 600/cap-shine
  动画保留
- 此前 v1.3.1-9 ~ v1.3.1-15 多轮 alpha 微调 / NSVisualEffectView 实验全部回退

[Settings ASR 行]
- 下拉只保留云端 provider,删 disabled 的本地引擎条目
- 本地引擎激活时下拉锁住 + 显示一行"ASR 提供商已被接管"提示
- i18n 五语言加 settings.providers.asrProviderTakenOver

[版本]
1.3.1-8 → 1.3.1-17,四处版本号同步
2026-05-12 21:58:51 +08:00
baiqing 40c39e11d3 chore(release): v1.3.1-8 hotfix — SelectLite 死锁 + 玻璃统一
[CRITICAL fix: SelectLite 所有下拉打不开]
v1.3.1-7 (PR #426) 我引入了 deadlock:
- anchor 初始 null + portal 条件 `open && anchor && createPortal(...)`
- 我删了 useLayoutEffect 在 open=true 时调 positionPopover
- 改成 popoverRef callback ref(只在 DOM mount 时 fire)
- 但 popover DOM 挂载条件依赖 anchor 非 null → anchor 永 null → 死锁

用户报"所有竖向切换横幅的界面全都打不开了"——LLM 供应商 / ASR 提供商 /
paste shortcut / mirror / language / polish mode 等 SelectLite 下拉全部
点击无反应。这是我的 review 失误,深表歉意。

修:加回 useLayoutEffect 在 open=true 时调 positionPopover 一次(用 trigger
宽 fallback 立即设 anchor),保留 callback ref RAF 在 popover mount 后用
真实宽精确重定位。两步合并:anchor 立即不为 null → portal 渲染 → callback
ref 触发 → 重新精确定位。

[玻璃统一处理]
用户:"现在完全没有磨砂玻璃的效果,应该把底下的细控组件、边栏以及盖栏
等设置的边栏采用同一种方式处理"。

之前 main content (`<main>`) 用 `var(--ol-surface)` 完全不透明白底,跟透明
sidebar 视觉割裂。改成 `rgba(255,255,255,0.62)` + `backdrop-filter blur(18px)
saturate(170%)`,跟 sidebar 一起坐在 WindowChrome 磨砂底板上,全应用一块
连续玻璃。

[版本]
1.3.1-7 → 1.3.1-8,6 处版本号同步。
2026-05-12 19:38:29 +08:00
baiqing 5aafc29ee5 chore(release): bump version to 1.3.1-7 (Beta) + Capsule 磨砂玻璃 + thinking 黑底
[bump] v1.3.1-6 → v1.3.1-7。本版本含 PR #426 merged(SelectLite 位置/动画/
滚外关)+ 本 commit 的两件用户实机 surface:

[Capsule 磨砂玻璃 Windows 路径打开]
之前 Capsule.tsx Windows 路径 useBackdrop = os !== 'win' 强制关掉 backdrop-filter,
让 Windows 胶囊看上去就是白色 pill 没玻璃感。WebView2 现在支持 backdrop-filter,
打开让 Windows 玻璃感对齐 macOS:
- Pill: backdrop-filter blur(28px) saturate(180%)
- CircleButton (cancel): blur(12px) saturate(160%)

[Thinking 字体重做]
- 字号 17 保持,字重 700 → 600 稍细
- 底字浅亮黄 #FCD34D → var(--ol-ink) 黑(用户:"亮黄太显眼,黑底更稳")
- 中段扫光 var(--ol-blue) 深蓝不变(继续作为高对比"滑动"标志)
2026-05-12 19:16:24 +08:00
TRIP db86a14169 Merge pull request #426 from Open-Less/fix/v1.3.1-7
fix(SelectLite): 下拉位置错位 + 关闭动画 + 滚外部自动收缩 (v1.3.1-7)
2026-05-12 19:14:51 +08:00
baiqing 167ceb297b fix(SelectLite): 位置错位 + 加关闭动画 + 滚外部自动收缩
用户在 macOS 上反馈 LLM provider 下拉 3 个问题:
1. 位置完全错位(popover 跟 trigger 不对齐)
2. 没有关闭动画
3. 在 popover 外滚动应自动收缩,但当前会跟着 trigger 重定位

[位置错位根因]
positionPopover useCallback deps [],useLayoutEffect 在 open=true 时 fire
一次 —— 此时 popoverRef.current 还没挂载,popoverWidth 用 trigger.width 兜底。
Popover mount 后真实宽度 ≠ trigger 宽(长选项撑大),但 effect 不再重算。

修法:popoverRef 改用 callback ref,每次 popover DOM mount 时 RAF 推到下一帧
重算 anchor,拿到真实 popover 宽。同时 positionPopover 用 max(trigger 宽,
popoverRect 宽) 保证 popoverWidth 不低估。

[滚动外部 → 关闭]
之前 useLayoutEffect 监听 scroll 事件做 reposition。改成监听 'scroll' + 'wheel'
capture phase,target 在 popover 内(popoverRef.contains)保留打开(长列表
内部 scroll 不关),target 在外部 → closeMenu。同时 window resize 也强制关闭。

[关闭动画]
加 leaving state 让 popover 在 unmount 前播 ol-select-pop-out 反向 keyframe
(opacity 1→0 + translateY 0→-4 + scale 1→.98,跟入场对偶)。140ms 后真正
unmount + 清 anchor / highlight。
2026-05-12 19:02:43 +08:00
baiqing ca5cb5277a chore(release): bump version to 1.3.1-6 (Beta)
PR #425 合并后 bump。本版本相对 v1.3.1-5-beta 累积:

[胶囊动画]
- 入场 .26s → .38s,cubic-bezier(.16,.86,.32,1.18) 更强 spring overshoot
- 出场 .24s → .36s(EXIT_ANIM_MS 同步加到 360),cubic-bezier(.55,.06,.68,.19)
  慢启动加速收尾的平滑曲线,让用户能看清"左右收缩 + 下移 + 淡出"
- thinking 字号 14 → 17,字重 500 → 700,浅亮黄底字 + 深蓝扫光

[LocalAsr Windows Qwen3]
- 删除顶部"白底显眼"提示 banner(已 inert + 灰显,banner 多余)
- Windows 列表为空时不再画 placeholder Card,简化为空白占位
- 千问3 ASR 标题加 amber 小 badge "实验性"
- 5 个 locale 新加 i18n key qwenExperimentalBadge

[polish prompt 反 AI 自述]
- OUTPUT_BLOCK 新加"# 反 AI 自述式表达(强约束)":禁词列表 +
  保持原句人称视角 + 直陈原意不扩写
- Light task 加"工程化直陈"段
- Formal task 加"工程化正式"段(不展开为商务铺垫)
- Structured task 加"判断事项的标准"4 种独立事项形态,事项 ≥3 强制双层
  即使输入听起来像顺着说下来的口播
2026-05-12 18:44:42 +08:00
TRIP 545c3312c3 Merge pull request #425 from Open-Less/fix/v1.3.1-6
fix(capsule): 入场出场动画加慢加曲线 + thinking 字号/颜色重做 (v1.3.1-6)
2026-05-12 18:44:04 +08:00
baiqing 960889da7c fix(polish): Structured prompt 加强"判断事项标准",提升结构化稳定性
用户报 Structured 模式不稳定 —— 同样输入有时双层 list 有时连贯段落。
失败示例:用户口述 4 个独立反馈(千问3 提示样式 + 让它消失 + 改实验性 +
其他没问题)输出成连贯段落,没归类成双层 list。

LLM 判断"事项数"时可能要求用户明说"第一""第二""另外"等连接词,
口语化输入没这些就误判为"一段连贯陈述"。

加强:Structured task block 顶部新加"默认行为:双层 list。判断事项的标准":
列出 4 种独立事项的形态(可独立成句的陈述、独立请求/建议、状态判断/结论、
针对模块的描述/要求),明确"事项数 ≥3 强制双层化,即使输入听起来像顺着
说下来的口播"。

跟前面 commit 35d53b8b 的"不可降级到轻度润色 + 多个组合需求处理规则"
形成三重 sticky:
- 规则 1:不可降级到轻度润色(事项 ≥3 必须双层)
- 规则 2:多组合需求按大类按口述顺序排
- 规则 3(本 commit):明确"事项"的判断标准,不依赖用户的连接词
2026-05-12 18:32:01 +08:00
baiqing cb5b544c0f fix: LocalAsr 灰显去 banner + 千问3 加实验性标签 + polish 反 AI 自述
[LocalAsr Windows 灰显简化(用户:"白底太显眼")]
- 删除顶部 qwenUnavailableOnWindows banner Card(白底浅橙 noise)
- 列表为空时的 placeholder Card 改成纯空 <div minHeight:60>,不再二次重复 banner 文案
- 灰显 + inert + opacity 已自我解释,不需要 banner 引导

[千问3 标记为「实验性」(用户拍板)]
- LocalAsr.tsx 在 qwenTitle 前加 amber-300 小 badge "实验性"
- 5 个 locale 新加 i18n key `qwenExperimentalBadge`:
  - zh-CN: 实验性
  - en: Experimental
  - ja: 実験的
  - ko: 실험적
  - zh-TW: 實驗性

[polish 反 AI 自述(用户:"直抒胸臆,不加多余话;不要 AI 输出式语言")]
- OUTPUT_BLOCK 新加 "# 反 AI 自述式表达(强约束)" 子段:
  - 禁词列表:"我们看了一下""我们发现""经过分析""综合来看""总体而言"
    "整体来说""依我所见""根据情况""从结果来看"等代入第三方/自述视角的语句
  - 保持原句的人称视角,原句没有"我们"就不引入
  - 直陈原意,不扩写
  - 不加修饰副词或铺垫句("值得一提的是""值得注意""值得考虑"等)

- Light task block 加 "**工程化直陈**" 段:
  - 开发协作 / 任务清单 / 技术沟通 / 工作汇报场景按主谓宾陈述
  - 不加修饰副词、铺垫句、AI 自述
  - 输出长度尽量贴近原句字数 ± 20%
  - 新增示例:用户原话"嗯我们目前看了一下没什么大问题就是缓存策略可能要改一下"
    → 输出"目前没什么大问题,缓存策略需要调整"(不引入"我们看了一下")

- Formal task block 加 "**工程化正式**" 段:
  - 正式 ≠ 扩张;不展开为商务铺垫
  - 不加"经过分析""综合来看""值得注意的是"等代入第三方视角的语句
  - 输出长度 ± 30% 以内,不让正式化扩张到两倍长度
  - 新增示例:用户原话"嗯这次发版前我们看了一下其实问题不大但还是建议把缓存改一改"
    → 输出"本次发版整体问题不大,建议调整缓存策略"(不写"我们看了一下""经过评估")
2026-05-12 18:27:33 +08:00
baiqing 80e840341b fix(capsule): 入场出场动画加慢加曲线 + thinking 字号/颜色重做
用户在 v1.3.1-5 装机后反馈:
1. 胶囊入场效果不错但希望"再慢一点 + 曲线感"
2. 出场动画"看不到" —— 240ms 太快感知不到
3. thinking 字体"不明显",希望字大 / 色亮 / 滑动清楚

改动:
- @keyframes capsule-in: .26s → .38s,cubic-bezier(.16,.86,.32,1.18)
  spring overshoot 更强,"从中心冒出向左右生长"更弹更曲线
- @keyframes capsule-out: .24s → .36s,cubic-bezier(.55,.06,.68,.19)
  慢启动 + 加速收尾的平滑曲线,让用户能看清"左右收缩 + 下移 + 淡出"
- EXIT_ANIM_MS: 240 → 360 同步加长,避免定时器先于动画结束 unmount

thinking 配色(用户拍板,参考 d 项):
- fontSize 14 → 17(更大)
- fontWeight 500 → 700(更粗)
- 两侧底字:浅亮黄 #FCD34D (amber-300)
- 中段扫光:深蓝 var(--ol-blue) (≈ #2563EB)
- 浅黄暖底 + 深蓝扫光对比强烈但不刺眼,扫光滑过感清晰
2026-05-12 18:18:05 +08:00
baiqing 1a810c1c67 chore(release): bump version to 1.3.1-5 (Beta)
PR #423 合并后 bump。本版本相对 v1.3.1-4-beta 累积:

[3 个 dev task] (worktree-isolated dev agents + 3 个 reviewer)
- 胶囊动画:进入从中心冒出向左右生长,退出左右收缩 + 淡化 + 下移
- Windows 千问3 ASR 灰显 disabled + 不可激活提示 banner
- 5 个 SVG 重画:translate / vocab / history / overview / selectionAsk

[review feedback fix]
- Capsule EXIT_ANIM_MS / INITIAL_VISIBLE_STATE 抽 const
- Qwen3 disabled 区加 inert 让键盘 Tab 跳过
- overview icon 加 sparkline 数据线区分 layout icon
- selectionAsk 气泡尾巴拉到 y=23 防 viewBox 24 底裁切

[用户实机 surface]
- Vocab 词条大椭圆真根因:父 flex minHeight 拉伸子 item,加
  alignSelf:flex-start 阻止
- Windows 原生顶栏 vs 玻璃色差:caption color 0xFFFFFF → 0x00F7F5F5
  跟 glass 起始色一致;glass alpha 0.78 → 0.92 压色差

[polish prompt 反降级]
- Structured task block 加"不可降级到轻度润色"和"多个组合需求归类规则"
2026-05-12 17:46:25 +08:00
TRIP 784f947cf3 Merge pull request #423 from Open-Less/fix/v1.3.1-5
fix(v1.3.1-5): 胶囊动画 + Qwen3 灰显 + 5 SVG 重画 + 6 项 Windows 视觉修复 + polish 反降级
2026-05-12 17:45:27 +08:00
baiqing 76e0723613 fix(polish): Structured prompt 加强反"降级到轻度润色" + 组合需求归类规则
用户报 DeepSeek V4 Flash 走 Structured 模式时仍只做轻度润色(标点 + 断句
+ 去口癖然后输出一段连贯段落),没有按双层 list 结构化输出。模型能力较
弱时容易把"清晰结构"理解成"清楚地表达"而非"双层归类"。

加两条新规则到 Structured task block:
1. **不可降级到轻度润色** —— 明确禁止只补标点然后输出连贯段落,最低
   输出形态是双层 list。即使原文听起来连贯,事项 ≥3 都必须双层化。
2. **多个组合需求处理规则** —— 用户原话:"当用户提出多个组合需求时,
   要分别归入不同大类,并且按照顺序把这些组合需求做结构化整理"。
   写进规则:按语义/领域分大类,按口述顺序排,每个大类用 (a)(b)(c)
   子项,不允许合并丢失或重排到错误大类。

加在原有 # 任务(清晰结构) 标题之后、"**重要前提**"之前。前后顺序与
其他段落兼容,不动 ROLE_BLOCK / COMMON_RULES / OUTPUT / 示例。
2026-05-12 17:32:54 +08:00
baiqing 35d53b8be2 polish: 集成 review 反馈 + 用户新 surface 的 Windows 视觉修复
review 阶段标的 4 个 High 全部处理,加上用户在 v1.3.1-4 装机后新报的 2 个
Windows 视觉问题,本 commit 一次性收:

[review-capsule High]
- Capsule.tsx 抽 EXIT_ANIM_MS / INITIAL_VISIBLE_STATE 两个 const,去掉
  `240` magic number + `isTauri ? 'idle' : 'recording'` 字面量重复
- 修正退出动画调度的 race 描述注释(cleanup clearTimeout 阻止 fire,
  不是"定时器仍会触发")

[review-qwen3 High]
- LocalAsr.tsx Windows Qwen3 disabled wrapper 加 `inert` HTML5 属性,
  让键盘 Tab 也跳过 disabled 区域(仅靠 pointerEvents:none 不挡键盘 +
  aria-disabled 不传给后代)。两个 wrapper 都加。@ts-expect-error
  注释解释为何这里需要绕过 TS lib.dom 旧版未收录 inert 属性。

[review-icons 2 High]
- Icon.tsx `overview`: 在三个 dashboard tile 顶部加 sparkline 数据线
  区分 layout icon(之前几乎一样,14px nav 视觉无法分辨)
- Icon.tsx `selectionAsk`: 气泡尾巴 y=24 → y≈23,避免 strokeLinecap
  round + strokeWidth 1.5 出 viewBox 底边被裁

[用户新 surface — Vocab 词条大椭圆]
- Vocab.tsx VocabChip 加 `alignSelf: 'flex-start'`。真根因(之前 PR
  #422 误判为 button user-agent appearance):父 flex 容器 minHeight: 80
  让 flex item 默认 align-self: stretch 把单个 chip 拉伸到 80px 高,
  borderRadius:999 渲染成超大椭圆。alignSelf:flex-start 阻止拉伸。

[用户新 surface — 顶栏 vs 玻璃色差]
- lib.rs DWMWA_CAPTION_COLOR 从纯白 0xFFFFFF → 0x00F7F5F5
  (rgb 245,245,247) 跟 WindowChrome glass linear-gradient 起始色一致
- WindowChrome.tsx glass alpha 0.78 → 0.92(PR #422 为加强玻璃感降的,
  现在为压缩色差升回去,玻璃感由 backdrop-filter blur+saturate 提供)

后续:用户希望调研"完全取消 Windows 原生顶栏(像微信那样自绘)"——
属于 v1.3.1-6 级别 large rewrite,单独追。
2026-05-12 17:31:41 +08:00
baiqing f44eb5958c feat(icons): redraw translation / vocab / history / selectionAsk SVGs 2026-05-12 17:26:52 +08:00
baiqing a981815b8b feat(localasr): Windows 端千问3 ASR 改为灰显 disabled + 提示 2026-05-12 17:26:52 +08:00
baiqing ad6cd93b10 feat(capsule): center-grow entry + contract-fade exit animation 2026-05-12 17:26:52 +08:00