Split core.rs into one file per concern
core.rs had grown into a 612-line grab-bag mixing six unrelated concerns:
CLI arg parsing, logging setup, top-level orchestration, the researcher
agent phase, chat-history reconstruction utilities, the summarizer agent
phase, and the writer agent phase — while review.rs, tools.rs, stream.rs,
and progress.rs already correctly isolated their own concerns. This
splits core.rs to match that existing pattern instead of being the one
file that doesn't follow it:
- cli.rs — Cli struct + DEFAULT_TOPIC
- observability.rs — initialize_observability
- models.rs — RESEARCHER_MODEL / WRITER_MODEL (previously duplicated
across call sites, now a single source of truth)
- history.rs — pure chat-history parsing/reconstruction helpers
(partial_findings_from_history, annotated_transcript_from_history, and
their private helpers), plus their unit tests. Also dedupes
MAX_TOOL_RESULT_CHARS, which was previously defined twice.
- researcher.rs — gather_findings + GatheredFindings (the tool-calling
research phase)
- summarizer.rs — summarize_partial_history (the max-turns recovery
agent)
- writer.rs — write_report
- research.rs — the top-level research() orchestration loop
main.rs now only does argument parsing, logging setup, and the top-level
call — no orchestration logic of its own. Unit tests stay co-located
with the code they test per Rust convention (not pulled into separate
files) rather than under "prefer new files" — that applies to
production code organization here.
No behavior changes; cargo test/clippy/fmt all clean.
2026-08-18 10:59:03 +00:00
|
|
|
/// The tool-calling research loop needs to reliably decide what to search
|
|
|
|
|
/// for, when a page is worth fetching, and when it has enough evidence —
|
|
|
|
|
/// that's a reasoning-heavy job best given to the largest local Gemma
|
|
|
|
|
/// variant. Turning gathered notes into prose (writing, summarizing) is
|
|
|
|
|
/// comparatively mechanical, so the smaller/faster variant handles those
|
|
|
|
|
/// passes instead.
|
|
|
|
|
pub(crate) const RESEARCHER_MODEL: &str = "gemma4:26b";
|
|
|
|
|
pub(crate) const WRITER_MODEL: &str = "gemma4-e4b:latest";
|