feat(ownership): complete ownership intelligence module

Sprints 0-8: Types, schema, KSEI parser, entity resolution, DB CRUD,
Bing API client, import pipeline, query commands, graph traversal,
changes diff, entity resolution CLI, FTS5 search.

- KSEI PDF parser (mutool stext + quick-xml, 99.2% accuracy)
- 7 query commands: ticker, entity, search, cross-holders, concentration, flow, releases
- Ownership graph with recursive CTE (ASCII tree + Graphviz DOT)
- Release diff/changes between KSEI snapshots
- Entity resolution CLI: unresolved, map, merge
- FTS5 trigram search on entity names
- Feature-gated under 'ownership' (default-on)
- 82 tests passing
This commit is contained in:
Ciphercat 2026-03-07 17:31:04 +00:00
commit 6671e22976
23 changed files with 5351 additions and 47 deletions

View file

@ -26,6 +26,10 @@ pub enum IdxError {
Http(String),
#[error("auth error: {0}")]
AuthError(String),
#[error("database error: {0}")]
DatabaseError(String),
#[error("PDF parse error: {0}")]
PdfParseError(String),
}
#[derive(Debug, Clone, Copy, Serialize, PartialEq, Eq)]
@ -41,6 +45,8 @@ pub enum ErrorCode {
Io,
Http,
AuthError,
DatabaseError,
PdfParseError,
}
impl IdxError {
@ -57,6 +63,8 @@ impl IdxError {
Self::Io(_) => ErrorCode::Io,
Self::Http(_) => ErrorCode::Http,
Self::AuthError(_) => ErrorCode::AuthError,
Self::DatabaseError(_) => ErrorCode::DatabaseError,
Self::PdfParseError(_) => ErrorCode::PdfParseError,
}
}