dsh-plugin-mobile-gateway 0.10.0 → 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/PROTOCOL.md +125 -7
  2. package/README.md +23 -1
  3. package/docs/dsh-rc2-mobile-integration.md +9 -1
  4. package/docs/file-cards-mobile-integration.md +111 -0
  5. package/docs/voice-input-hold-thresholds.md +35 -0
  6. package/docs/voice-input-implementation.md +275 -0
  7. package/docs/voice-input-ipa-analysis.md +150 -0
  8. package/docs/voice-input-ipa-evidence/deepseek-asr-constructor.asm +338 -0
  9. package/docs/voice-input-ipa-evidence/deepseek-extraction.json +5154 -0
  10. package/docs/voice-input-ipa-evidence/deepseek-focused-context.txt +210 -0
  11. package/docs/voice-input-ipa-evidence/deepseek-localization.json +29 -0
  12. package/docs/voice-input-ipa-evidence/deepseek-voice-strings.txt +206 -0
  13. package/docs/voice-input-ipa-evidence/doubao/address-map.txt +11 -0
  14. package/docs/voice-input-ipa-evidence/doubao/code-string-refs.txt +22 -0
  15. package/docs/voice-input-ipa-evidence/doubao/end-longpress-disasm.txt +149 -0
  16. package/docs/voice-input-ipa-evidence/doubao/focused-context.txt +271 -0
  17. package/docs/voice-input-ipa-evidence/doubao/locate_string_refs.py +42 -0
  18. package/docs/voice-input-ipa-evidence/doubao/network-candidates.txt +39 -0
  19. package/docs/voice-input-ipa-evidence/doubao/objc-msgsend-stub.txt +1 -0
  20. package/docs/voice-input-ipa-evidence/doubao/ranges.txt +858 -0
  21. package/docs/voice-input-ipa-evidence/doubao/recognizer-recorder.txt +134 -0
  22. package/docs/voice-input-ipa-evidence/doubao/result-disasm.txt +189 -0
  23. package/docs/voice-input-ipa-evidence/doubao/settext-selector.txt +2 -0
  24. package/docs/voice-input-ipa-evidence/doubao/start-stop-disasm.txt +358 -0
  25. package/docs/voice-input-ipa-evidence/doubao/strings.txt +3536 -0
  26. package/docs/voice-input-ipa-evidence/doubao-extraction.json +7418 -0
  27. package/docs/voice-input-ipa-evidence/doubao-findings.md +52 -0
  28. package/docs/voice-input-ipa-evidence/hold-threshold-rea-evidence.json +1 -0
  29. package/docs/voice-input-ipa-evidence/hold-thresholds/deepseek-hold-callback-refs.txt +1 -0
  30. package/docs/voice-input-ipa-evidence/hold-thresholds/deepseek-input-area-metadata.txt +31 -0
  31. package/docs/voice-input-ipa-evidence/hold-thresholds/deepseek-input-gesture-init.asm +267 -0
  32. package/docs/voice-input-ipa-evidence/hold-thresholds/deepseek-static-summary.json +42 -0
  33. package/docs/voice-input-ipa-evidence/hold-thresholds/deepseek-voice-gesture-constructor.asm +371 -0
  34. package/docs/voice-input-ipa-evidence/hold-thresholds/doubao-findings.md +31 -0
  35. package/docs/voice-input-ipa-evidence/hold-thresholds/doubao-text-mask-objc-metadata.txt +119 -0
  36. package/docs/voice-input-ipa-evidence/hold-thresholds/doubao-text-mask-threshold-evidence.asm +156 -0
  37. package/docs/voice-input-ipa-evidence/hold-thresholds/doubao-text-mask-voice-view-getter.asm +14 -0
  38. package/docs/voice-input-ipa-evidence/rea-evidence.json +1 -0
  39. package/docs/voice-input-ipa-evidence/startup-20261014/README.md +33 -0
  40. package/docs/voice-input-ipa-evidence/startup-20261014/deepseek-objc.txt +222957 -0
  41. package/docs/voice-input-ipa-evidence/startup-20261014/deepseek-preconfigure-annotated.asm +90 -0
  42. package/docs/voice-input-ipa-evidence/startup-20261014/deepseek-preconfigure.asm +90 -0
  43. package/docs/voice-input-ipa-evidence/startup-20261014/deepseek-session-configure-annotated.asm +131 -0
  44. package/docs/voice-input-ipa-evidence/startup-20261014/deepseek-session-configure.asm +131 -0
  45. package/docs/voice-input-ipa-evidence/startup-20261014/deepseek-string-reference-candidates.json +20 -0
  46. package/docs/voice-input-ipa-evidence/startup-20261014/deepseek-touch-began.asm +133 -0
  47. package/docs/voice-input-ipa-evidence/startup-20261014/rea-macho-summary.json +2435 -0
  48. package/lib/client.js +6 -1
  49. package/lib/dsh-host-adapter.mjs +10 -0
  50. package/lib/index.mjs +90 -14
  51. package/lib/session-event-details.mjs +53 -0
  52. package/lib/speech-input.mjs +192 -0
  53. package/package.json +3 -3
@@ -0,0 +1,52 @@
1
+ # 豆包 12.2.1 语音输入静态证据
2
+
3
+ 目标是用户长按、松开后填入输入框的语音输入;不将实时语音通话当作同一链路。来源为 REA 提取 Evidence `ev_adf3fc5bce309b0fcea619cdaf3d36b5766996f265fa8a7046639bf25a6319b8` 中 Payload/Grace.app/Grace。以下字符串均为本次 shell 直接读取文件的补充证据,未伪造额外 REA Evidence ID。所有 hex offset 均为主 Mach-O 文件偏移,地址映射/摘要见 address-map.txt。
4
+
5
+ ## 已观察
6
+
7
+ - Info.plist: `CFBundleIdentifier=com.bot.doubao`;版本 `12.2.1`;麦克风说明为“请授权设备麦克风,以便给 AI 发送语音消息”;无 NSSpeechRecognitionUsageDescription 键。该键缺席本身不构成从未调用 Apple Speech 的证明。
8
+ - 独立输入组件:0xbb2a7f0 构建路径 `Modules/FlowVoiceInput/Classes/Core/VoiceInput/Component/VoiceToComplete/MessagingInputViewVoiceToCompleteComponent.swift`。
9
+ - 长按入口 0xbb2aba0 `startLongPressUseVoiceToComplete()`;结束 0xbb2b3b0 `endedLongPressUseVoiceToCompleteStatus()`;结果入口 0xbb2acd0 `voiceInputDidResult(id:config:asrResult:)`;0xbb2b031 `asrTextContext`;0xbb2b220 `$__lazy_storage_$_asrStreamPostProcess`;0xbb2ab70 `voice to complete stop voice input`。
10
+ - 基础会话 `VoiceInputSessionImpl`:0xb359f30 `start voice input session`,0xb359f50 `stop voice input session`,0xb359f70 `voice input session cancel`;0xb35a180 `voice input did finish recording`;0xb35a1b0 `recording time < min recording time cancel asr`。时间指标 0xb35a410 `touchDownToRecordingStart`,0xb35a430 `touchUpToRecordingStop`,0xb35a450 `touchUpToReceiveASRResult`。
11
+ - 识别器 0xb35b990 `_TtC9FlowAudio28SAMIAssistantVoiceRecognizer`;0xb35b8f0 对应 `VoiceRecognizer+SAMIAssistant.swift`;0xb35bb90 `recognize(dataStream:)`、0xb35bbb0 `asrRun(dataStream:)`;0xb35bbd0 `[ASR] begin sending audio`、0xb35bbf0 `[ASR] finish sending audio`、0xb35bc10 `[ASR] wait stop done`;0xb35ba00 `asrIncrementResultSubject`、0xb35ba20 `asrFinishSubject`;0xb35bac0 `samiAssistantSession(session:didReceiveASREvent:)`。
12
+ - 音频录制后端同时包含 AudioQueue、AudioUnit、AVAudioEngine 实现,具体运行配置未知。0xb35c018 `audioDataStream`,0xb35c4d0 `send audio to stream, audioDataCount = `。
13
+ - 0xb356670 `asr_touch_down_to_start_record`,0xb3566c0 `asr_start_record_to_touch_up`,0xb3566e0 `asr_touch_up_to_send_end_asr`,0xb356700 `asr_touch_up_to_recognize_last_pkg`。这组指标支持“录音期间处理、松开后等待最后结果”的架构推断。
14
+ - 包含 SAMI websocket ASR 实现构建路径、ASR URL 配置 `asr_url`,以及 HTTP/token/ws 相关组件。
15
+ - 可见 URL `wss://sami.bytedance.com/internal/api/v1/ws` @0xb3d3088,但上下文是 `AnnieSpeechRecognizer`/Hybrid bridge,因此只能认定这是包内另一套识别模块的端点,不能直接认定长按输入使用它。
16
+ - FlowVoiceInputStreamResultHandler 有 `handleAsrResult(action:)` @0xbb2bcd0、`handleAsrStreamToResult(delay:action:)` @0xbb2bd10、`handleAsrStream(action:)` @0xbb2bda0,表示结果与流式文本均有业务处理能力。
17
+ - 资源文件扩展名有界扫描仅发现视频模型 arch68...mlmodel(4138 字节),未发现 .onnx/.tflite 等显式语音模型文件。不能排除自定义容器、编码或运行时下载。
18
+
19
+ ## 合理推断(尚未完成调用图/反编译证明)
20
+
21
+ 长按输入存在独立 VoiceToComplete 模块,基础 VoiceInput 会话将录音流交给 SAMI 识别器并接收增量与结束结果;松开动作附近具有停止录音及等待最终 ASR 的计时指标。整体更符合客户端录音/编码 + 网络服务识别,而非包内小模型纯离线识别。该推断仍需从 VoiceToComplete 入口调用图连到 SAMIAssistantVoiceRecognizer 才能提高置信度。
22
+
23
+ ## 必须保留未知
24
+
25
+ - VoiceToComplete 实际选择何种录音后端、是否边说边发送、精确采样率与编码。
26
+ - 长按结束实际调用 stop 还是 cancel、超短录音分支如何处理。
27
+ - `.partial`/`.final` 事件映射与最终文本 setter、插入位置、是否合并已有草稿。
28
+ - 实际端点、token 与远端 ASR 模型版本;不能把 Annie 的 URL 直接归给长按。
29
+ - 下载模型与离线 fallback 是否存在。
30
+
31
+ ## 后续明确反编译地址
32
+
33
+ 通过 ARM64 ADRP+ADD 直接引用日志字符串定位,再使用 LC_FUNCTION_STARTS 找包含函数:
34
+
35
+ | 字符串 | 文件偏移 | 函数起点 |
36
+ |---|---|---|
37
+ | startLongPressUseVoiceToComplete() | 0xbb2aba0 | 0x1090262a4 |
38
+ | voiceInputDidResult(id:config:asrResult:) | 0xbb2acd0 | 0x1090270bc |
39
+ | endedLongPressUseVoiceToCompleteStatus() | 0xbb2b3b0 | 0x10902a6c4 |
40
+ | voice to complete stop voice input | 0xbb2ab70 | 0x1090261b8 |
41
+
42
+ 这些是引用对应日志的函数,不自动等同于未混淆源码函数名。nm 未恢复相关 Swift 符号。精确地址与指令位置存于 `/tmp/doubao-voice-evidence/code-string-refs.txt`。
43
+
44
+ ## 补充:已确认结果写入 setter 的指令证据
45
+
46
+ `0x1090270bc` 结果回调相关函数中的 `0x10902724c..0x10902725c`:加载 `0x10dbdd720` selector 引用到 x1;原始指针为 `0x10c452da4`,文件偏移 `0xc452da4` 字符串是 `setText:`;x0 来自先前视图获取结果 x23,x2 为合成/桥接字符串 x22。`0x10902725c` 调用 `0x10a7996f8`;llvm-objdump indirect-symbols 明确将该 stub 标为 `_objc_msgSend`。因此该回调存在对对象执行 `setText:` 的确定静态路径,而非仅有字符串。
47
+
48
+ 字符串合成之前:`0x1090271b0..1b8` 动态取得原有 Swift 字符串;`0x1090271cc..1dc` 从结果参数 x22 读取可能的结果集合/字符串,`0x109027218..220` 调用字符串处理函数;`0x109027234..23c` 桥接后进入 setText。是否确切拼接原草稿、插入光标位置及 partial/final 条件尚未确认。
49
+
50
+ 起止函数的具体会话动作仍有 Swift protocol witness 间接调用:停止函数 `0x1090261b8` 的 `0x109026250..278` 从组件存储拿取对象和 witness table,然后调用 witness 偏移 `0x28`;这不能仅凭日志认定调用 stop 而非 cancel。`0x10902a6c4` 含 `long press ended use voice to status time out:` 日志,可能是超时回调而非原始 touch-up handler;末尾动态调用 class vtable 偏移 `0x4d0`,尚未解析。
51
+
52
+ 反汇编完整证据:`result-disasm.txt`、`start-stop-disasm.txt`、`end-longpress-disasm.txt`。命令使用 `llvm-objdump -d --start-address --stop-address`。不要使用 `--macho --disassemble` 做范围限制(该模式可能忽略地址范围)。