From 45e40ccd13ac4a08d9c8810ce9259118d47f633a Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Fri, 10 Jul 2026 12:18:22 +0800 Subject: [PATCH] =?UTF-8?q?desktop:=20=E8=81=94=E8=B0=83=E5=8F=91=E7=8E=B0?= =?UTF-8?q?=E7=9A=84=E9=80=8F=E6=98=8E=E7=AA=97=E5=8F=A3=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20+=20=E8=81=94=E8=B0=83=E9=AA=8C=E6=94=B6=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E4=B8=8E=E6=96=87=E6=A1=A3=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - tauri.conf.json 启用 macOSPrivateApi、Cargo.toml 加 macos-private-api feature: overlay/tray 为 transparent 窗口,macOS 上 WKWebView 透明必须开启该项, 否则浮层带不透明底色(tauri dev 启动日志明确告警) - doc/desktop-integration-acceptance.html:#12/#1C 联调验收报告 (mac 全链路通过、12B 延迟基线与短句问题、12C 四场景全过、商业链路通过、遗留项清单) - doc/index.html:项目文档索引(全局文档规范要求) Co-Authored-By: Claude Fable 5 --- desktop/src-tauri/Cargo.toml | 2 +- desktop/src-tauri/tauri.conf.json | 1 + doc/desktop-integration-acceptance.html | 220 ++++++++++++++++++++++++ doc/index.html | 77 +++++++++ 4 files changed, 299 insertions(+), 1 deletion(-) create mode 100644 doc/desktop-integration-acceptance.html create mode 100644 doc/index.html diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml index 31d08c9..b0c5371 100644 --- a/desktop/src-tauri/Cargo.toml +++ b/desktop/src-tauri/Cargo.toml @@ -12,7 +12,7 @@ crate-type = ["staticlib", "cdylib", "rlib"] tauri-build = { version = "2", features = [] } [dependencies] -tauri = { version = "2", features = ["tray-icon"] } +tauri = { version = "2", features = ["tray-icon", "macos-private-api"] } tauri-plugin-global-shortcut = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index 526593d..a30de81 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -10,6 +10,7 @@ "frontendDist": "../dist" }, "app": { + "macOSPrivateApi": true, "windows": [ { "label": "settings", diff --git a/doc/desktop-integration-acceptance.html b/doc/desktop-integration-acceptance.html new file mode 100644 index 0000000..a085636 --- /dev/null +++ b/doc/desktop-integration-acceptance.html @@ -0,0 +1,220 @@ + + + + + +dudu — 桌面端联调验收报告(#12 / #1C) + + + +
+

桌面端联调验收报告

+

TODO #12(联调与验收)+ #1C(macOS 注入与浮层)· 2026-07-10

+
+ macOS 实测 + gummy 真实 provider + 无头网关压测 +
+
+
+ +
+

一、结论速览

+ + + + + + + + + + + + +
验收项结果说明
12A mac 全链路(快捷键→采集→流式→浮层→注入)通过真实 App + 模拟快捷键,mock 文本成功注入 TextEdit,计费准确
12A Windows 全链路未执行Windows 机(ssh windows)缺 Rust/Node 工具链,需先装环境
12B release_to_commit < 300ms部分达标P50 261ms ✅ / P95 918ms ❌(受两轮 provider 异常拖累)
12B first_partial P95 < 500ms未达标P50 845ms / P95 3870ms——gummy partial 下发节奏本身 ~750-850ms,目标需重新校准
12C 断连重建通过服务端重启后桌面端数秒内自动重连(18E 生效)
12C SESSION_LIMIT(3 分钟截断)通过198s 推流在 180s 准时截断:先定稿下发全部 final,再发 SESSION_LIMIT
12C RATE_LIMITED(30 次/30 分钟)通过第 31 个会话被精确拒绝,前 30 个正常
12C QUOTA_EXCEEDED(试用/余额用尽)通过扣穿当句不掐断、final 不丢;再次 start 预检拒绝(帧序备注见 §五)
1C 浮层不抢焦点 + 注入TextEdit 通过会话期间焦点保持在目标 App,注入成功;微信/浏览器/IDE 三目标待人工点验
商业链路(登录/购买/入账)通过mock 扫码登录、下单、回调入账、回调重放幂等、订单状态全部正确
+
+ 联调中发现并已修复:overlay/tray 为 transparent: true 窗口,但未启用 + macOSPrivateApi——macOS 上 WKWebView 透明必须开启该项,否则浮层带不透明底色。 + 本次已在 tauri.conf.json"macOSPrivateApi": true、 + Cargo.tomlmacos-private-api feature(cargo check 通过), + 视觉效果需真机目测确认。 +
+
+ +
+

二、测试环境与方法

+ + + + + + + +
服务端本机 go run ./cmd/server(:8080)+ docker compose pg/redis;先 mock 后切 gummy 真实 provider(key 经 rbw 管道注入环境,未落盘)
桌面端npm run tauri dev 调试构建,settings.json 预置 mock 登录 token 指向 localhost
快捷键模拟osascript System Events 按住/松开 Cmd+Shift+Space(3s)
延迟/异常压测自制无头 WS 客户端 wslat(Go + gorilla),按协议 100ms/3200B 实时推流真实中文语音(macOS say 合成 8.6s / 1s / 198s 三种)走 /v1/asr/stream 真实网关路径
测试账号mock 微信登录建两个 trial 用户;用户一经 mock 支付购入 pack_100(6000s 余额)
+

延迟指标口径

+
    +
  • first_partial:首帧音频发出 → 收到首个 partial(客户端视角,含网关中继与 provider 全链路)
  • +
  • release_to_commit:发出 stop → 收到定稿 final(对应桌面端「松开→注入」的服务端部分)
  • +
+
+ +
+

三、12A 全链路(mac)

+
    +
  1. mock 扫码登录:POST /v1/auth/qr → 手动打回调(模拟扫码)→ 轮询 confirmed 拿 JWT ✅
  2. +
  3. App 启动即与服务端建立 WS 预连接 + REST 轮询(lsof 确认 4 条连接)✅
  4. +
  5. TextEdit 聚焦 → 模拟按住快捷键 3s → 松开 → mock provider 脚本文本「帮我把这份周报整理一下,重点突出本周的进展。」完整注入 TextEdit ✅
  6. +
  7. 会话期间前台应用保持为目标 App(浮层 focusable:false 生效,即 1C 验证点)✅
  8. +
  9. 计费:3s 会话后 /v1/me 的 trial_used_today 精确 +3 ✅
  10. +
+
Windows 侧同方法可复用:装好 rustup + Node + VS Build Tools 后 clone 仓库 npm i && npm run tauri dev,注入走 SendInput(10F)。
+
+ +
+

四、12B 延迟基线(gummy 真实 provider,10 轮 × 8.6s)

+ + + + +
指标P50P95目标判定
first_partial845ms3870msP95 < 500ms未达标
release_to_commit261ms918ms< 300msP50 达标 / P95 超
+
    +
  • 10 轮 final 文本完全一致且正确(含标点/数字 ITN:「今天下午3点,我们开个短会,…」),识别质量稳定
  • +
  • 8/10 轮 first_partial 集中在 840-944ms——与 gummy partial 下发节奏(约 0.75-0.85s/个)一致,首包时延已贴近 provider 下限,非网关开销
  • +
  • 2/10 轮异常(3302/3870ms,release 同步劣化到 592/918ms),服务端无任何告警日志——疑似 DashScope 会话建立耗时波动
  • +
+

超短句补充数据(RATE 测试顺带产出,1s 语音 × 30 轮)

+
    +
  • release_to_commit P50 = 2192ms / P95 = 3732ms——远高于长句的 261ms
  • +
  • 原因:短句常在 provider 尚未出 partial 时就 stop(30 轮中 16 轮 0 partial),定稿要等 provider 收尾 flush
  • +
  • 体验含义:说「好的」这类两三字短语,松开后约 2 秒才上屏,是当前链路最明显的体验短板
  • +
+

建议(已入 backlog)

+
    +
  • first_partial P95<500ms 目标与 gummy 实际下发节奏矛盾,建议重校准为「P50≤900ms / P95≤1500ms」或换更快首包的 provider 档位
  • +
  • 短句定稿慢(P50 2.2s):浮层在 stop 后无 final 期间应有「定稿中」状态;调研 gummy 快速定稿参数或 stop 时本地提交最后 partial 的策略
  • +
  • 网关为 provider 会话建立耗时与 partial 间隔加观测日志/metrics,否则线上无法定位此类波动
  • +
  • 排查慢会话(3 轮 3.2-3.9s 首包):确认是否 DashScope 冷启动,可考虑 provider 侧连接预热
  • +
+
+ +
+

五、12C 异常路径

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
场景做法观察判定
断连重建App 保持连接时重启服务端进程桌面端数秒内自动重连(lsof 确认新连接),无需用户操作通过
SESSION_LIMIT
3 分钟截断
余额账号推 198s 长音频180s 准时截断:219 个 partial、全部 final 先定稿下发,随后 SESSION_LIMIT:单次最长 3 分钟,松开后可继续,会话关闭通过
RATE_LIMITED
30 次/30 分钟
同设备连发 31 个 1s 短会话第 1-30 个会话全部正常识别并计费;第 31 个 start 被拒:RATE_LIMITED:操作过于频繁,稍后再试——滑动窗口精确在第 31 次生效通过
QUOTA_EXCEEDED
试用+余额用尽
Redis 置试用已用 177/180s 后推 8.6s 音频;再次 start剩 3s 时 start 预检放行 → 推流中扣穿 → 下发 QUOTA_EXCEEDED:今日试用已用完,去购买时长随后仍 flush 当句 final(已识别内容不丢,实测收到截至扣穿点的定稿文本);再次 start 在预检被直接拒绝通过
+
以上为协议/服务端行为验证;桌面端 overlay 对各错误码的文案呈现(19C 实现)需人工目测一遍。
+

QUOTA 帧序备注(跨端确认项)

+
    +
  • 实现顺序为「先发 QUOTA_EXCEEDED 错误帧 → 再 Close provider flush 当句 final」,与 16E 文案(「本句 final 后下发」)顺序相反,但内容不丢
  • +
  • 桌面端已核对无碍:on_server_msg 对 error 帧不丢弃会话,错误帧之后的 final 照常进 CommitBuffer,松键时注入
  • +
  • Android / iOS 键盘需各自确认:收到 error 帧后不立即关闭会话/连接,仍处理后续 final 并 commitText 上屏,否则移动端会「扣了费但字没上屏」
  • +
+
+ +
+

六、商业链路(登录 → 购买 → 入账)

+
    +
  1. GET /v1/packs:三档时长包(100/500/2000 分钟)正常返回 ✅
  2. +
  3. POST /v1/orders:下单返回 native code_url
  4. +
  5. POST /v1/pay/notify(mock 明文回调):SUCCESS,余额 +6000s,订单转 paid,账号 trial→ok ✅
  6. +
  7. 回调重放幂等:同 transaction_id 二次回调返回 SUCCESS 但余额不重复入账 ✅
  8. +
+
再次强调(17I 已标注):MockPay 不验签,/v1/pay/notify 现等于公开充值接口,上线前必须换 wechatpay-go 真实验签
+
+ +
+

七、遗留项(需人工 / 后续)

+ + + + + + + + +
负责说明
真人麦克风实说验证人工 · 2 分钟App 正在运行且已登录:任意输入框按住 Cmd+Shift+Space 说话即可(服务端 gummy)
1C 三目标注入点验人工 · 3 分钟微信 / 浏览器 / IDE 各注入一次;同时目测浮层深色玻璃是否透明(本次修复效果)
辅助功能/麦克风权限引导人工正式打包后首启流程(11F)在无权限干净环境走一遍
Windows 全链路装环境后复测ssh windows 可达但缺 rustup/Node/VS Build Tools
overlay 错误态文案目测人工断网/超限场景下浮层文案(19C)
first_partial 目标重校准 + provider 观测日志开发见 §四建议,建议并入 #22 backlog
+
+ +
dudu · 桌面端联调验收报告 · 2026-07-10 · 详细原始数据见本次联调分支提交说明
+
+ + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..131b939 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,77 @@ + + + + + +dudu — 文档索引 + + + +
+

dudu 文档索引

+

项目全部设计 / 计划 / 验收文档的单一入口

+
+
+ +
+

设计方案

+ + + + + +
文档说明形式
MVP 总体方案 v0.3产品定义、关键技术决策、总体架构、里程碑与风险HTML
前端实现设计 v1.1五端界面实现设计,100% 还原 design/ 设计系统HTML
后端与数据架构 v1.1API / WS 协议 / 计费账本 / 存储与 Redis Key 设计HTML
+
+ +
+

验收报告 / 排障 Runbook

+ + + +
文档说明形式
桌面端联调验收报告(#12 / #1C)mac 全链路联调、12B 延迟实测基线、12C 异常路径验证结论与遗留项HTML
+
+ + +
+ +