from pathlib import Path import typer from tht.cli._guards import require_vector_write_allowed from tht.cli.config_cmd import CONFIG_OPT from tht.cli.schema_cmd import _load_config_or_exit evidence_app = typer.Typer(help="Generazione e gestione delle evidence") def evidence_root(cfg) -> Path: return cfg.paths.artifacts / "evidence" def _require_evidence_cfg(cfg): if cfg.evidence is None: typer.secho( "ERRORE: sezione `evidence` mancante nel workspace yaml (serve `source_root`).", fg=typer.colors.RED, err=True, ) raise typer.Exit(code=1) return cfg.evidence @evidence_app.command("extract") def extract_cmd(config: Path = CONFIG_OPT) -> None: """Rispecchia la cartella curata dell'ETL in artifacts/evidence/. artifacts/evidence/ e' un artefatto derivato e rigenerabile: viene riallineato a ogni estrazione (le evidence rimosse a monte spariscono anche qui). La gerarchia per dominio della cartella sorgente viene preservata. """ import shutil from tht.evidence.extract import load_curated cfg = _load_config_or_exit(config) sources = _require_evidence_cfg(cfg) out_dir = evidence_root(cfg) if out_dir.exists(): shutil.rmtree(out_dir) written = 0 for rel, doc in load_curated(sources): doc.save(out_dir / rel) written += 1 if written == 0: typer.secho( f"ATTENZIONE: nessuna evidence trovata in " f"{sources.source_root / sources.evidence_dir}", fg=typer.colors.YELLOW, err=True, ) raise typer.Exit(code=1) typer.secho(f"OK: {written} evidence rispecchiate in {out_dir}", fg=typer.colors.GREEN) @evidence_app.command("index") def index_cmd(config: Path = CONFIG_OPT) -> None: """Embedda e sincronizza nel semantic store tutte le evidence presenti in artifacts/.""" from tht.adapters.factory import build_vector_store from tht.cli.vector_cmd import ( _print_stats, make_embedder, require_vector_cfg, sync_canonical_records, ) from tht.evidence.model import load_evidence_dir from tht.vectorstore.records import evidence_records cfg = _load_config_or_exit(config) require_vector_write_allowed(cfg, "evidence index") require_vector_cfg(cfg) docs = load_evidence_dir(evidence_root(cfg)) records = evidence_records(docs, cfg.vector.max_chunk_chars) stats = sync_canonical_records( "evidence", records, store=build_vector_store(cfg, require_write=True), embedder=make_embedder(cfg.embeddings), ) _print_stats(stats)