#!/usr/bin/env tsx /** * CLI do indexer de sessões (Observabilidade/Espelho) — multi-agente. * * Modos: * --full Full scan de todas as fontes * --watch Modo incremental (Claude Code watcher) * --source Filtrar fonte: claude, hermes, opencode (repetível) * * Env: * OBSERVABILIDADE_DB Override ao caminho da BD SQLite */ import { indexAll, DEFAULT_DB_PATH, PROJECTS_ROOT } from '../services/sessions/indexer.js' import { startWatcher } from '../services/sessions/watcher.js' async function main(): Promise { const args = process.argv.slice(2) const mode = args.find((a) => a === '--full' || a === '--watch') if (!mode) { console.error('Uso: sessions-indexer.ts [--full|--watch] [--source claude|hermes|opencode]') process.exit(1) } const dbPath = process.env.OBSERVABILIDADE_DB ?? DEFAULT_DB_PATH const sourceFlags = args.filter((a) => !a.startsWith('--')) const sources: ('claude' | 'hermes' | 'opencode')[] = sourceFlags.length > 0 ? sourceFlags.filter((s): s is 'claude' | 'hermes' | 'opencode' => ['claude', 'hermes', 'opencode'].includes(s)) : ['claude', 'hermes', 'opencode'] console.log(`[indexer] modo=${mode} fontes=${sources.join(',')} db=${dbPath}`) if (mode === '--watch') { console.log(`[indexer] watch mode em ${PROJECTS_ROOT} -> ${dbPath}`) await indexAll({ dbPath, sources }) await startWatcher(dbPath) return } const start = Date.now() let lastLogged = 0 const { indexed, failed } = await indexAll({ dbPath, sources, onProgress: (done, total) => { if (done - lastLogged >= 50 || done === total) { console.log(`[indexer] ${done}/${total}`) lastLogged = done } }, }) const durationMs = Date.now() - start const durationSec = (durationMs / 1000).toFixed(1) console.log(`[indexer] concluído em ${durationSec}s · indexed=${indexed} failed=${failed}`) process.exit(failed > 0 ? 1 : 0) } main().catch((err) => { console.error('[indexer] falha fatal:', err) process.exit(2) })