eb331f9b29
feat(app): add IngestEvent + ingest_with_config_progress (p9-fb-01)
...
Streaming progress channel for ingest. Facade emits one IngestEvent per
step boundary into an optional `mpsc::Sender<IngestEvent>` injected by
the caller. CLI (p9-fb-02), TUI (p9-fb-03), and future desktop UI all
consume the same stream.
신규:
- crates/kebab-app/src/ingest_progress.rs: `IngestEvent` enum (`#[serde(tag
= "kind", rename_all = "snake_case")]` matching wire schema
ingest_progress.v1) + `AggregateCounts` struct + `media_label` helper
+ best-effort `emit` helper.
- ingest_with_config_progress(cfg, scope, summary_only, progress) —
존재 시 `mpsc::Sender<IngestEvent>` 로 ScanStarted → ScanCompleted →
(AssetStarted < AssetFinished)* → Completed 발신. dropped receiver
는 silent absorb (hot path stall 금지).
- 기존 ingest_with_config 가 `progress=None` forwarding wrapper.
미적용 (계약 상 향후 task 가 채움):
- IngestEvent::Aborted: cancel token wiring 은 p9-fb-04.
- embed_batch_started / embed_batch_finished: spec 의 \"asset 이벤트 사이
임의 위치\" 에 해당. v1 단순화 — asset 단위 해상도면 CLI / TUI 충분.
Test:
- 6 lib unit (media_label / serde discriminator / emit corner cases).
- 3 integration (이벤트 sequence 가 §2.4a invariant 준수 / forwarding
wrapper / dropped receiver tolerance).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-02 19:44:34 +00:00