Phase 1 implementation:
- New bom_sync.py: extract cross-document App::Link components from
Assembly, resolve SiloItemId UUIDs to part numbers, diff against
server BOM, apply adds/qty updates via individual CRUD calls.
- Hook _push_bom_after_upload into Silo_Save and Silo_Commit
(same non-blocking pattern as DAG sync).
- Hook _update_manifest_revision to write revision_hash into .kc
manifest after successful upload (#277).
- Add bom_merged SSE signal + dispatch + Activity pane handler.
- Add merge_bom_json to SiloClient (forward-looking for Phase 2).
Merge rules: auto-add, auto-update qty, NEVER auto-delete removed
entries (warn only).
Refs: #276, #277