feat(observabilidade): watcher chokidar incremental

This commit is contained in:
2026-04-23 01:19:21 +01:00
parent 8ca6b7e166
commit 80a5f3bf42
2 changed files with 46 additions and 10 deletions
+3 -4
View File
@@ -9,7 +9,7 @@
* Env: * Env:
* OBSERVABILIDADE_DB Override ao caminho da BD SQLite * OBSERVABILIDADE_DB Override ao caminho da BD SQLite
*/ */
import { indexAll, DEFAULT_DB_PATH } from '../services/sessions/indexer.js' import { indexAll, DEFAULT_DB_PATH, PROJECTS_ROOT } from '../services/sessions/indexer.js'
import { startWatcher } from '../services/sessions/watcher.js' import { startWatcher } from '../services/sessions/watcher.js'
async function main(): Promise<void> { async function main(): Promise<void> {
@@ -24,11 +24,10 @@ async function main(): Promise<void> {
console.log(`[indexer] modo=${mode} db=${dbPath}`) console.log(`[indexer] modo=${mode} db=${dbPath}`)
if (mode === '--watch') { if (mode === '--watch') {
console.log(`[indexer] watch mode em ${dbPath}`) console.log(`[indexer] watch mode em ${PROJECTS_ROOT} -> ${dbPath}`)
await indexAll({ dbPath }) await indexAll({ dbPath })
await startWatcher(dbPath) await startWatcher(dbPath)
console.log('[indexer] watcher ainda não implementado (ver Task 8) — saída limpa') return
process.exit(0)
} }
const start = Date.now() const start = Date.now()
+43 -6
View File
@@ -1,7 +1,44 @@
/** import chokidar from 'chokidar'
* Stub — implementação real chega em Task 8 (chokidar). import { openSessionsDb } from './db.js'
* Devolve imediatamente; o CLI imprime aviso e termina com exit 0. import { indexFile, PROJECTS_ROOT } from './indexer.js'
*/
export async function startWatcher(_dbPath: string): Promise<void> { export async function startWatcher(dbPath: string): Promise<void> {
return const db = openSessionsDb(dbPath)
const watcher = chokidar.watch(`${PROJECTS_ROOT}/**/*.jsonl`, {
persistent: true,
ignoreInitial: true,
awaitWriteFinish: { stabilityThreshold: 2000, pollInterval: 500 },
})
async function reindex(path: string): Promise<void> {
try {
await indexFile(db, path)
console.log(`[watcher] indexed ${path}`)
} catch (err) {
console.error(`[watcher] erro ${path}:`, err)
}
}
watcher
.on('add', reindex)
.on('change', reindex)
.on('unlink', (path) => {
db.deleteByJsonlPath(path)
console.log(`[watcher] removed ${path}`)
})
.on('error', (err) => console.error('[watcher] error:', err))
console.log('[watcher] pronto')
// Registar handler SIGTERM/SIGINT para fechar DB limpa (evita WAL corruption em Task 9 systemd restart)
const cleanup = async (): Promise<void> => {
console.log('[watcher] SIGTERM/SIGINT — a fechar watcher e DB')
await watcher.close()
db.close()
process.exit(0)
}
process.on('SIGTERM', () => { void cleanup() })
process.on('SIGINT', () => { void cleanup() })
return new Promise(() => {}) // nunca resolve — processo mantém-se vivo
} }