feat(bins): multi-library populate_knowledge + progress UX
populate_knowledge now loads real libraries from the DB instead of fabricating a single library_id=1 row from BASE_PATH. Adds --library <id|name> to restrict the walk and validates --path against the selected library roots. The full library set is still passed to InsightGenerator so resolve_full_path can probe every root when an insight resolves to a different library than the one being walked. Adds indicatif progress bars across the long-running utility binaries via a shared src/bin_progress.rs helper (determinate bar + open-ended spinner with consistent styling). Per-batch info! noise is replaced by the bar's throughput/ETA; warnings and errors route through pb.println so they scroll above the bar instead of fighting with it. populate_knowledge spinner during scan, determinate bar over all libs backfill_hashes spinner with running hashed/missing/errors counts import_calendar determinate bar; embedding/store failures inline import_location_* determinate bar advancing by chunk size import_search_* determinate bar; pb cloned into the spawn task cleanup_files P1 determinate bar over DB paths cleanup_files P2 determinate bar; pb.suspend() around y/n/a/s prompt Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
34
src/bin_progress.rs
Normal file
34
src/bin_progress.rs
Normal file
@@ -0,0 +1,34 @@
|
||||
//! Shared progress-bar styling for the utility binaries. Centralised so every
|
||||
//! `cargo run --bin ...` tool gets the same look and feel.
|
||||
|
||||
use indicatif::{ProgressBar, ProgressStyle};
|
||||
|
||||
const DETERMINATE_TEMPLATE: &str = "{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] \
|
||||
{human_pos}/{human_len} ({percent}%) {per_sec} eta {eta} {msg}";
|
||||
|
||||
const SPINNER_TEMPLATE: &str = "{spinner:.green} [{elapsed_precise}] {human_pos} {per_sec} {msg}";
|
||||
|
||||
/// Determinate progress bar used when the total work is known up front.
|
||||
pub fn determinate(total: u64, message: impl Into<String>) -> ProgressBar {
|
||||
let pb = ProgressBar::new(total);
|
||||
pb.set_style(
|
||||
ProgressStyle::with_template(DETERMINATE_TEMPLATE)
|
||||
.expect("hard-coded template parses")
|
||||
.progress_chars("=> "),
|
||||
);
|
||||
pb.set_message(message.into());
|
||||
pb
|
||||
}
|
||||
|
||||
/// Spinner used for open-ended work (e.g. paginated DB scans that loop until
|
||||
/// empty). Throughput is shown via `{per_sec}`; tick at a steady cadence so
|
||||
/// it animates even when work is bursty.
|
||||
pub fn spinner(message: impl Into<String>) -> ProgressBar {
|
||||
let pb = ProgressBar::new_spinner();
|
||||
pb.set_style(
|
||||
ProgressStyle::with_template(SPINNER_TEMPLATE).expect("hard-coded template parses"),
|
||||
);
|
||||
pb.set_message(message.into());
|
||||
pb.enable_steady_tick(std::time::Duration::from_millis(120));
|
||||
pb
|
||||
}
|
||||
Reference in New Issue
Block a user