Reorganize indexer-shaped modules under opake-core/src/indexer/
Move everything that depends on the hosted indexer service into a single
namespace. Pure code motion + import path updates; no API behavior change.
Module moves:
- crates/opake-core/src/client/indexer.rs → indexer/client.rs
- crates/opake-core/src/client/indexer_auth.rs → indexer/auth.rs
- crates/opake-core/src/client/indexer_types.rs → indexer/types.rs
- crates/opake-core/src/sse/ → indexer/sse/
- crates/opake-core/src/daemon.rs → indexer/daemon.rs
- crates/opake-core/src/tree_keeper/ → indexer/tree_keeper/
- crates/opake-core/src/workspace_keeper/ → indexer/workspace_keeper/
- crates/opake-core/src/inbox_keeper/ → indexer/inbox_keeper/
New indexer/mod.rs declares the submodules and re-exports common items
(fetch_inbox, sign_indexer_request, TreeDelta, etc.) so callers use short
paths like opake_core::indexer::fetch_inbox instead of
opake_core::indexer::client::fetch_inbox.
Rationale: opake-core had accumulated a second job — ~5,000 lines of the
~10,000 total were indexer-coupled (HTTP client, SSE consumer, live state
stores). Co-locating them under indexer/ makes the architectural split
legible without crate-level extraction. A future crate split becomes
mechanical; a third-party that only needs crypto + records + XRPC primitives
can opt out at that point.
Keepers (tree_keeper, workspace_keeper, inbox_keeper) moved with the indexer
because their only patch sources are SSE dispatch and indexer list-endpoint
bootstraps — the core FileManager has no Keeper references (it uses the
Storage trait for caching), and the CLI explicitly doesn't use Keepers
(daemon/mod.rs: "The CLI has no TreeKeeper").
Build verified: cargo check --workspace --all-targets clean; cargo test
556 pass; cargo check -p opake-wasm --target wasm32-unknown-unknown clean;
regenerated wasm; @opake/sdk + @opake/react builds + tests clean; apps/web
tsc clean.