Skip to content

在 Core 實作 RecordingCoordinator 及 seam protocol #10

Description

@Jian-Min-Huang

What to build

PhemeMurmurCore 中建立 RecordingCoordinator — 從 AppDelegate 抽取錄音→轉錄→貼上的狀態機邏輯,放到一個 deep module 中,擁有小 interface、大 implementation。

需要定義的型別和 protocol:

值型別(Core):

  • RecordingState enum:.idle.recording.transcribing
  • AudioStopResult enum:.success(URL).noAudio.tooShort(Double).tooQuiet(Double)
  • SkipReason enum:對應 noAudiotooShorttooQuiet 的原因

Seam protocol(Core):

  • AudioRecording: SendablestartRecording() throwsstopRecording() -> AudioStopResultvar isRecording: Bool { get }
  • TextPasting: SendablepasteText(_ text: String)
  • RecordingCoordinatorDelegate: AnyObjectcoordinatorDidChangeState(_:)coordinatorDidProduceText(_:)coordinatorDidFail(_: Error, context: String)coordinatorDidSkipSilence()coordinatorDidSkipRecording(_: SkipReason)

RecordingCoordinator class(Core):

  • init(recorder: AudioRecording, paster: TextPasting, delegate: RecordingCoordinatorDelegate?)
  • 可變屬性:provider: TranscriptionProvider?promptTemplate: PromptTemplate?voiceCommandsEnabled: Boolprefix: String?
  • 操作:toggle()cancel()
  • 唯讀:private(set) var state: RecordingState

Coordinator 擁有的邏輯(從 AppDelegate 移植):

  • toggle() 根據 state 分派 start / stop
  • cancel() 停止錄音、清理暫存檔、回到 idle
  • 停止後驅動 provider.transcribe()、VoiceCommandProcessor、prefix 拼接、TextPasting
  • __SILENCE__ 偵測
  • ErrorLog.append 記錄錯誤
  • 暫存檔清理

測試(用 mock):

  • MockAudioRecording、MockTextPasting、MockTranscriptionProvider、MockRecordingCoordinatorDelegate
  • 驗證完整狀態機:idle→recording→transcribing→idle
  • 驗證取消流程:recording→idle
  • 驗證跳過情境:tooShort、tooQuiet、noAudio
  • 驗證 silence 偵測(__SILENCE__
  • 驗證 VoiceCommandProcessor 整合
  • 驗證 prefix 拼接
  • 驗證 provider 失敗時的 delegate 通知
  • 驗證 transcribing 狀態下 toggle 被忽略

Acceptance criteria

  • RecordingCoordinator 和所有相關型別定義在 PhemeMurmurCore target
  • AudioRecordingTextPasting protocol 各有明確的 seam,為後續 adapter 做準備
  • RecordingCoordinatorDelegate 涵蓋所有 UI 需要回應的事件
  • 測試用 mock 驗證全部狀態轉換路徑,swift test 通過
  • 不修改 executable target(AppDelegate、AudioRecorder、PasteService 都不動)
  • 符合 Swift 6 strict concurrency(與 ADR 0002 一致)

Blocked by

None - can start immediately

Metadata

Metadata

Assignees

No one assigned

    Labels

    ready-for-agentFully specified, ready for an AFK agent

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions