// Ingestion des cours : pnpm ingest (incrémental) / pnpm reindex (--force). import { writeFileSync } from "node:fs"; import { resolve } from "node:path"; import { ingestCourses } from "../lib/rag/ingest.ts"; const force = process.argv.includes("--force"); console.log(`Ingestion ${force ? "complète (--force)" : "incrémentale"} — embeddings locaux (premier lancement : téléchargement du modèle ~120 Mo)…`); const t0 = Date.now(); const result = await ingestCourses({ force, triggeredBy: "script" }); const dt = ((Date.now() - t0) / 1000).toFixed(1); console.log(result.report); console.log(`\n— Terminé en ${dt}s : ${result.scanned} fichiers scannés, ${result.ingested} ingérés, ${result.skipped} inchangés, ${result.chunks} fragments.`); if (result.errors.length) { console.error(`⚠ ${result.errors.length} erreur(s) :`); for (const e of result.errors) console.error(` - ${e.path} : ${e.error}`); } const report = `# Rapport d'ingestion — Immbot AI Exécution nº ${result.runId} — durée ${dt}s | Mesure | Valeur | |---|---| | Fichiers scannés | ${result.scanned} | | Fichiers ingérés | ${result.ingested} | | Fichiers inchangés (somme de contrôle) | ${result.skipped} | | Fragments créés | ${result.chunks} | | Erreurs | ${result.errors.length} | ## Détail \`\`\` ${result.report} \`\`\` ${result.errors.length ? `\n## Erreurs\n\n${result.errors.map((e) => `- \`${e.path}\` : ${e.error}`).join("\n")}\n` : ""} `; writeFileSync(resolve(process.cwd(), "docs/ingestion-report.md"), report); console.log("Rapport écrit : docs/ingestion-report.md"); process.exit(result.errors.length ? 1 : 0);