/** * Memory Journal MCP Server - Scheduler * * Lightweight in-process scheduler for periodic maintenance jobs. * Only meaningful for HTTP/SSE transport (long-lived server processes). * Uses setInterval for simplicity — no external dependencies. */ import type { IDatabaseAdapter } from '../database/core/interfaces.js'; import type { VectorSearchManager } from '../vector/vector-search-manager/index.js'; import type { DigestSnapshot } from '../database/sqlite-adapter/entries/digest.js'; import type { ServerRuntime } from '../utils/maintenance-lock.js'; import { type ReportDeliveryOptions } from './digest-reporter.js'; /** Scheduler configuration options */ export interface SchedulerOptions { /** Automated backup interval in minutes (0 = disabled) */ backupIntervalMinutes: number; /** Max backups to retain during automated cleanup */ keepBackups: number; /** Database optimize interval in minutes (0 = disabled) */ vacuumIntervalMinutes: number; /** Vector index rebuild interval in minutes (0 = disabled) */ rebuildIndexIntervalMinutes: number; /** Analytics digest interval in minutes (0 = disabled; recommended: 1440 for daily) */ digestIntervalMinutes: number; /** Scheduled report generation interval in minutes (0 = disabled; recommended: 10080 for weekly) */ reportIntervalMinutes: number; /** Webhook options for report delivery */ reportDeliveryOptions?: ReportDeliveryOptions; /** Automated pruning interval in minutes (0 = disabled; recommended: 1440 for daily) */ pruneIntervalMinutes: number; archiveOlderThanDays?: number; pruneOlderThanDays?: number; hardDeleteOlderThanDays?: number; pruneImportanceThreshold?: number; pruneDryRun?: boolean; pruneExcludeTags?: string[]; } /** Status of a single scheduled job */ export interface JobStatus { name: string; enabled: boolean; intervalMinutes: number; lastRun: string | null; lastResult: 'success' | 'error' | null; lastError: string | null; nextRun: string | null; runCount: number; } /** Overall scheduler status */ export interface SchedulerStatus { active: boolean; jobs: JobStatus[]; } /** * Scheduler — runs periodic maintenance jobs for long-lived server processes. * * Jobs: * - **backup**: Exports database to timestamped file, then prunes old backups. * - **vacuum**: Runs `PRAGMA optimize` and flushes database to disk. * - **rebuild-index**: Rebuilds vector search index from all entries. * - **digest**: Computes and persists an analytics snapshot for proactive insights. * - **prune**: Cleans up old, low-importance entries based on configuration. */ export declare class Scheduler { private readonly options; private readonly db; private readonly vectorManager; private readonly timers; private started; private sigtermHandler; private readonly runtime?; constructor(options: SchedulerOptions, db: IDatabaseAdapter, vectorManager?: VectorSearchManager, runtime?: ServerRuntime); /** * Start all enabled scheduled jobs. * Each job runs on its own interval and failures are isolated. */ start(): void; /** * Stop all scheduled jobs and clear timers. * Safe to call multiple times. */ stop(): void; /** * Get the current status of all scheduled jobs. */ getStatus(): SchedulerStatus; /** * Schedule a recurring job. */ private scheduleJob; /** * Execute a job with error isolation and status tracking. */ private executeJob; /** * Backup job: export database to file, then cleanup old backups. */ private runBackup; /** * Vacuum/optimize job: run PRAGMA optimize and flush to disk. * * PRAGMA optimize updates internal query planner statistics based on * recent query patterns. For the native better-sqlite3 driver, disk * writes happen automatically via WAL mode. */ private runVacuumOptimize; /** * Rebuild index job: full vector index rebuild from database entries. */ private runRebuildIndex; /** * Prune job: auto-prune low-importance old entries. */ private runPrune; /** * Digest job: compute analytics snapshot and persist to database. */ private runDigest; /** * Report job: compute analytics snapshot, persist, and deliver via webhook. */ private runReport; /** * Get the latest digest snapshot from the database. * Returns null if no digest has been computed yet. */ getLatestDigest(): DigestSnapshot | null; } //# sourceMappingURL=scheduler.d.ts.map