@coderule/mcp 1.5.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +71 -17
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +71 -17
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +66 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +66 -16
- package/dist/index.js.map +1 -1
- package/dist/mcp-cli.cjs +111 -31
- package/dist/mcp-cli.cjs.map +1 -1
- package/dist/mcp-cli.js +111 -31
- package/dist/mcp-cli.js.map +1 -1
- package/package.json +1 -1
package/dist/mcp-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/log/logger.ts","../src/config/Defaults.ts","../src/config/Configurator.ts","../src/db/Schema.ts","../src/db/Database.ts","../src/db/FilesRepo.ts","../src/db/SnapshotsRepo.ts","../src/queue/Outbox.ts","../src/clients/Clients.ts","../src/rules/RulesFetcher.ts","../src/rules/RulesCompiler.ts","../src/hash/Hasher.ts","../src/service/Bootstrap.ts","../src/fs/PathUtil.ts","../src/fs/Walker.ts","../src/sync/SnapshotProtocol.ts","../src/service/InitialSync.ts","../src/fs/Watcher.ts","../src/sync/HeartbeatProtocol.ts","../src/service/State.ts","../src/service/ServiceLoops.ts","../src/mcp/status.ts","../src/mcp/server.ts","../src/mcp-cli.ts"],"names":["fs","logger","path","createHash","fsSync","sleep","readSymlinkTarget","JobStatus"],"mappings":"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","file":"mcp-cli.js","sourcesContent":["import pino from 'pino';\n\nexport type Logger = pino.Logger;\n\nconst level = process.env.CODERULE_LOG_LEVEL ?? 'info';\n\nconst baseLogger = pino(\n {\n level,\n name: 'coderule-scanner',\n timestamp: pino.stdTimeFunctions.isoTime,\n },\n process.stderr,\n);\n\nexport const logger: Logger = baseLogger;\n\nexport function createLogger(scope: string): Logger {\n return baseLogger.child({ scope });\n}\n","export const DEFAULT_SNAPSHOT_DEBOUNCE_MS = 1000;\nexport const DEFAULT_HEARTBEAT_INTERVAL_MS = 60_000;\nexport const DEFAULT_HEARTBEAT_CHECK_INTERVAL_MS = 5_000;\nexport const DEFAULT_QUEUE_POLL_INTERVAL_MS = 500;\nexport const DEFAULT_HASH_BATCH_SIZE = 32;\nexport const DEFAULT_MAX_SNAPSHOT_ATTEMPTS = 5;\nexport const DEFAULT_HTTP_TIMEOUT_MS = 120_000;\n","import { createHash } from 'crypto';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nimport envPaths from 'env-paths';\n\nimport type { ResolvedConfig } from '../types';\nimport { logger } from '../log/logger';\n\nimport {\n DEFAULT_HASH_BATCH_SIZE,\n DEFAULT_HEARTBEAT_CHECK_INTERVAL_MS,\n DEFAULT_HEARTBEAT_INTERVAL_MS,\n DEFAULT_MAX_SNAPSHOT_ATTEMPTS,\n DEFAULT_QUEUE_POLL_INTERVAL_MS,\n DEFAULT_SNAPSHOT_DEBOUNCE_MS,\n DEFAULT_HTTP_TIMEOUT_MS,\n} from './Defaults';\n\nconst DEFAULT_RETRIEVAL_FORMATTER: 'standard' | 'compact' = 'standard';\n\nconst DEFAULTS: Pick<\n ResolvedConfig,\n | 'snapshotDebounceMs'\n | 'heartbeatIntervalMs'\n | 'heartbeatCheckIntervalMs'\n | 'queuePollIntervalMs'\n | 'hashBatchSize'\n | 'maxSnapshotAttempts'\n> = {\n snapshotDebounceMs: DEFAULT_SNAPSHOT_DEBOUNCE_MS,\n heartbeatIntervalMs: DEFAULT_HEARTBEAT_INTERVAL_MS,\n heartbeatCheckIntervalMs: DEFAULT_HEARTBEAT_CHECK_INTERVAL_MS,\n queuePollIntervalMs: DEFAULT_QUEUE_POLL_INTERVAL_MS,\n hashBatchSize: DEFAULT_HASH_BATCH_SIZE,\n maxSnapshotAttempts: DEFAULT_MAX_SNAPSHOT_ATTEMPTS,\n};\n\nfunction normalizeRoot(root: string): string {\n const resolved = path.resolve(root);\n const normalized = path.normalize(resolved);\n return normalized.split(path.sep).join('/');\n}\n\nfunction sha256(input: string): string {\n return createHash('sha256').update(input).digest('hex');\n}\n\nfunction parseInteger(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const parsed = Number.parseInt(value, 10);\n if (Number.isNaN(parsed) || parsed <= 0) {\n throw new Error(`Invalid integer value: ${value}`);\n }\n return parsed;\n}\n\nfunction parseFormatter(value: string | undefined): 'standard' | 'compact' {\n if (!value) return DEFAULT_RETRIEVAL_FORMATTER;\n const normalized = value.toLowerCase();\n if (normalized === 'standard' || normalized === 'compact') {\n return normalized;\n }\n throw new Error(\n `Invalid CODERULE_RETRIEVAL_FORMATTER: ${value}. Expected \"standard\" or \"compact\"`,\n );\n}\n\nexport interface ResolveConfigParams {\n token?: string;\n}\n\nexport async function resolveConfig({\n token,\n}: ResolveConfigParams): Promise<ResolvedConfig> {\n const resolvedToken = token ?? process.env.CODERULE_TOKEN;\n if (!resolvedToken) {\n throw new Error(\n 'Missing token: provide params.token or CODERULE_TOKEN env',\n );\n }\n\n const rootCandidate = process.env.CODERULE_ROOT || process.cwd();\n const rootPath = path.resolve(rootCandidate);\n\n const normalized = normalizeRoot(rootPath);\n const rootId = sha256(normalized);\n\n const dataDir = process.env.CODERULE_DATA_DIR || envPaths('coderule').data;\n const watchDir = path.join(dataDir, 'watch');\n await fs.mkdir(watchDir, { recursive: true });\n const dbPath = path.join(watchDir, `${rootId}.sqlite`);\n\n const baseConfig: ResolvedConfig = {\n token: resolvedToken,\n rootPath,\n rootId,\n dbPath,\n dataDir,\n authBaseUrl: process.env.CODERULE_AUTH_URL,\n astBaseUrl: process.env.CODERULE_AST_URL,\n syncBaseUrl: process.env.CODERULE_SYNC_URL,\n retrievalBaseUrl: process.env.CODERULE_RETRIEVAL_URL,\n httpTimeout: undefined,\n snapshotDebounceMs: DEFAULTS.snapshotDebounceMs,\n heartbeatIntervalMs: DEFAULTS.heartbeatIntervalMs,\n heartbeatCheckIntervalMs: DEFAULTS.heartbeatCheckIntervalMs,\n queuePollIntervalMs: DEFAULTS.queuePollIntervalMs,\n hashBatchSize: DEFAULTS.hashBatchSize,\n maxSnapshotAttempts: DEFAULTS.maxSnapshotAttempts,\n retrievalFormatter: parseFormatter(\n process.env.CODERULE_RETRIEVAL_FORMATTER,\n ),\n };\n\n if (process.env.CODERULE_SNAPSHOT_DEBOUNCE_MS) {\n baseConfig.snapshotDebounceMs = parseInteger(\n process.env.CODERULE_SNAPSHOT_DEBOUNCE_MS,\n baseConfig.snapshotDebounceMs,\n );\n }\n if (process.env.CODERULE_HEARTBEAT_INTERVAL_MS) {\n baseConfig.heartbeatIntervalMs = parseInteger(\n process.env.CODERULE_HEARTBEAT_INTERVAL_MS,\n baseConfig.heartbeatIntervalMs,\n );\n }\n if (process.env.CODERULE_HEARTBEAT_CHECK_INTERVAL_MS) {\n baseConfig.heartbeatCheckIntervalMs = parseInteger(\n process.env.CODERULE_HEARTBEAT_CHECK_INTERVAL_MS,\n baseConfig.heartbeatCheckIntervalMs,\n );\n }\n if (process.env.CODERULE_QUEUE_POLL_INTERVAL_MS) {\n baseConfig.queuePollIntervalMs = parseInteger(\n process.env.CODERULE_QUEUE_POLL_INTERVAL_MS,\n baseConfig.queuePollIntervalMs,\n );\n }\n if (process.env.CODERULE_HASH_BATCH_SIZE) {\n baseConfig.hashBatchSize = parseInteger(\n process.env.CODERULE_HASH_BATCH_SIZE,\n baseConfig.hashBatchSize,\n );\n }\n if (process.env.CODERULE_MAX_SNAPSHOT_ATTEMPTS) {\n baseConfig.maxSnapshotAttempts = parseInteger(\n process.env.CODERULE_MAX_SNAPSHOT_ATTEMPTS,\n baseConfig.maxSnapshotAttempts,\n );\n }\n\n baseConfig.httpTimeout = parseInteger(\n process.env.CODERULE_HTTP_TIMEOUT,\n DEFAULT_HTTP_TIMEOUT_MS,\n );\n\n logger.debug(\n {\n rootPath,\n dbPath,\n dataDir,\n authBaseUrl: baseConfig.authBaseUrl,\n astBaseUrl: baseConfig.astBaseUrl,\n syncBaseUrl: baseConfig.syncBaseUrl,\n },\n 'Resolved configuration',\n );\n\n return baseConfig;\n}\n","export const FILES_SCHEMA = `\nCREATE TABLE IF NOT EXISTS files (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n rel_path TEXT NOT NULL,\n display_path TEXT NOT NULL,\n size INTEGER NOT NULL,\n mtime_ns INTEGER NOT NULL,\n mode INTEGER,\n ino TEXT,\n dev TEXT,\n is_symlink INTEGER NOT NULL DEFAULT 0,\n target TEXT,\n content_sha256 TEXT,\n service_file_hash TEXT,\n last_seen_ts INTEGER NOT NULL,\n hash_state TEXT NOT NULL,\n hash_owner TEXT,\n hash_lease_expires_at INTEGER,\n hash_started_at INTEGER,\n UNIQUE(rel_path)\n);\nCREATE INDEX IF NOT EXISTS idx_files_hash_state ON files(hash_state);\nCREATE INDEX IF NOT EXISTS idx_files_content_sha ON files(content_sha256);\nCREATE INDEX IF NOT EXISTS idx_files_service_hash ON files(service_file_hash);\n`;\n\nexport const SNAPSHOTS_SCHEMA = `\nCREATE TABLE IF NOT EXISTS snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n snapshot_hash TEXT NOT NULL,\n files_count INTEGER NOT NULL,\n total_size INTEGER NOT NULL,\n created_at INTEGER NOT NULL\n);\n`;\n","import Database from 'better-sqlite3';\nimport type { Logger } from 'pino';\n\nimport { FILES_SCHEMA, SNAPSHOTS_SCHEMA } from './Schema';\n\nfunction safeAlter(db: Database.Database, sql: string): void {\n try {\n db.exec(sql);\n } catch (error: any) {\n if (\n typeof error?.message === 'string' &&\n error.message.includes('duplicate column name')\n ) {\n return;\n }\n throw error;\n }\n}\n\nfunction applyMigrations(db: Database.Database, logger: Logger): void {\n const alterations = [\n 'ALTER TABLE files ADD COLUMN hash_owner TEXT',\n 'ALTER TABLE files ADD COLUMN hash_lease_expires_at INTEGER',\n 'ALTER TABLE files ADD COLUMN hash_started_at INTEGER',\n ];\n for (const sql of alterations) {\n try {\n safeAlter(db, sql);\n } catch (error) {\n logger.error({ err: error, sql }, 'Database migration failed');\n throw error;\n }\n }\n\n db.exec(\n 'CREATE INDEX IF NOT EXISTS idx_files_hash_lease ON files(hash_state, hash_lease_expires_at)',\n );\n}\n\nexport function openDatabase(\n dbPath: string,\n logger: Logger,\n): Database.Database {\n const db = new Database(dbPath, { verbose: undefined });\n logger.info({ dbPath }, 'Opened SQLite database');\n\n db.pragma('journal_mode = WAL');\n db.pragma('synchronous = NORMAL');\n db.pragma('busy_timeout = 5000');\n db.pragma('foreign_keys = ON');\n\n db.exec('BEGIN');\n try {\n db.exec(FILES_SCHEMA);\n db.exec(SNAPSHOTS_SCHEMA);\n db.exec('COMMIT');\n } catch (error) {\n db.exec('ROLLBACK');\n db.close();\n throw error;\n }\n\n applyMigrations(db, logger);\n\n return db;\n}\n","import type { Stats } from 'fs';\n\nimport type Database from 'better-sqlite3';\n\nimport type { FileRecord, HashState } from '../types';\n\nexport interface UpsertFileParams {\n relPath: string;\n displayPath: string;\n stats: Stats;\n isSymlink: boolean;\n symlinkTarget: string | null;\n}\n\nexport interface HashResult {\n id: number;\n contentSha256: string;\n serviceFileHash: string;\n}\n\nexport class FilesRepo {\n private readonly selectByRelPath = this.db.prepare(\n 'SELECT * FROM files WHERE rel_path = ?',\n );\n\n private readonly insertStmt = this.db.prepare(\n `INSERT INTO files (\n rel_path,\n display_path,\n size,\n mtime_ns,\n mode,\n ino,\n dev,\n is_symlink,\n target,\n content_sha256,\n service_file_hash,\n last_seen_ts,\n hash_state,\n hash_owner,\n hash_lease_expires_at,\n hash_started_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, ?, ?, NULL, NULL, NULL)`,\n );\n\n private readonly updateStmt = this.db.prepare(\n `UPDATE files SET\n display_path = ?,\n size = ?,\n mtime_ns = ?,\n mode = ?,\n ino = ?,\n dev = ?,\n is_symlink = ?,\n target = ?,\n content_sha256 = ?,\n service_file_hash = ?,\n last_seen_ts = ?,\n hash_state = ?,\n hash_owner = CASE WHEN ? = 'hashing' THEN hash_owner ELSE NULL END,\n hash_lease_expires_at = CASE WHEN ? = 'hashing' THEN hash_lease_expires_at ELSE NULL END,\n hash_started_at = CASE WHEN ? = 'hashing' THEN hash_started_at ELSE NULL END\n WHERE id = ?`,\n );\n\n private readonly markMissingStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'missing', content_sha256 = NULL, service_file_hash = NULL, last_seen_ts = ?,\n hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE rel_path = ?`,\n );\n\n private readonly markMissingPrefixStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'missing', content_sha256 = NULL, service_file_hash = NULL,\n hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE (rel_path = ? OR rel_path LIKE (? || '/%')) AND hash_state != 'missing'`,\n );\n\n private readonly markDirtyStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'dirty', last_seen_ts = ?,\n hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE rel_path = ?`,\n );\n\n private readonly claimDirtyStmt = this.db.prepare(\n `WITH candidates AS (\n SELECT id\n FROM files\n WHERE hash_state = 'dirty'\n ORDER BY last_seen_ts ASC, id ASC\n LIMIT @limit\n )\n UPDATE files\n SET hash_state = 'hashing',\n hash_owner = @owner,\n hash_lease_expires_at = @lease_expires_at,\n hash_started_at = @now\n WHERE id IN candidates\n RETURNING *`,\n );\n\n private readonly markDirtyByIdStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'dirty', hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE id = ?`,\n );\n\n private readonly applyHashesStmt = this.db.prepare(\n `UPDATE files\n SET content_sha256 = ?, service_file_hash = ?, hash_state = 'clean',\n hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE id = ?`,\n );\n\n private readonly requeueExpiredHashingStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'dirty', hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE hash_state = 'hashing'\n AND hash_lease_expires_at IS NOT NULL\n AND hash_lease_expires_at <= ?`,\n );\n\n private readonly resetHashingStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'dirty', hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE hash_state = 'hashing'`,\n );\n\n private readonly selectCleanSnapshotStmt = this.db.prepare(\n `SELECT rel_path, service_file_hash, size\n FROM files\n WHERE hash_state = 'clean' AND service_file_hash IS NOT NULL\n ORDER BY rel_path ASC`,\n );\n\n private readonly totalsStmt = this.db.prepare(\n `SELECT COUNT(*) AS files_count, COALESCE(SUM(size), 0) AS total_size\n FROM files\n WHERE hash_state = 'clean' AND service_file_hash IS NOT NULL`,\n );\n\n private readonly markMissingBeforeStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'missing', content_sha256 = NULL, service_file_hash = NULL,\n hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE last_seen_ts < ? AND hash_state != 'missing'`,\n );\n\n private readonly countByStateStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM files WHERE hash_state = ?',\n );\n\n constructor(private readonly db: Database.Database) {}\n\n getByRelPath(relPath: string): FileRecord | undefined {\n return this.selectByRelPath.get(relPath) as FileRecord | undefined;\n }\n\n upsertFromStat(params: UpsertFileParams): HashState {\n const now = Date.now();\n const { relPath, displayPath, stats, isSymlink, symlinkTarget } = params;\n const existing = this.getByRelPath(relPath);\n const mtimeNs = Math.trunc(stats.mtimeMs * 1e6);\n const ino = typeof stats.ino === 'number' ? String(stats.ino) : null;\n const dev = typeof stats.dev === 'number' ? String(stats.dev) : null;\n const mode = typeof stats.mode === 'number' ? stats.mode : null;\n const isSymlinkInt = isSymlink ? 1 : 0;\n\n if (!existing) {\n this.insertStmt.run(\n relPath,\n displayPath,\n stats.size,\n mtimeNs,\n mode,\n ino,\n dev,\n isSymlinkInt,\n symlinkTarget,\n now,\n 'dirty',\n );\n return 'dirty';\n }\n\n let nextState: HashState = existing.hash_state as HashState;\n let nextContent: string | null = existing.content_sha256;\n let nextServiceHash: string | null = existing.service_file_hash;\n\n const changed =\n existing.size !== stats.size ||\n existing.mtime_ns !== mtimeNs ||\n existing.mode !== mode ||\n existing.ino !== ino ||\n existing.dev !== dev ||\n existing.is_symlink !== isSymlinkInt ||\n existing.target !== symlinkTarget;\n\n if (changed || existing.hash_state === 'missing') {\n nextState = 'dirty';\n nextContent = null;\n nextServiceHash = null;\n }\n\n this.updateStmt.run(\n displayPath,\n stats.size,\n mtimeNs,\n mode,\n ino,\n dev,\n isSymlinkInt,\n symlinkTarget,\n nextContent,\n nextServiceHash,\n now,\n nextState,\n nextState,\n nextState,\n nextState,\n existing.id,\n );\n\n return nextState;\n }\n\n markMissing(relPath: string): number {\n const now = Date.now();\n const result = this.markMissingStmt.run(now, relPath);\n return result.changes ?? 0;\n }\n\n markMissingByPrefix(prefix: string): number {\n const result = this.markMissingPrefixStmt.run(prefix, prefix);\n return result.changes ?? 0;\n }\n\n markDirty(relPath: string): void {\n const now = Date.now();\n this.markDirtyStmt.run(now, relPath);\n }\n\n markMissingBefore(timestamp: number): number {\n const result = this.markMissingBeforeStmt.run(timestamp);\n return result.changes ?? 0;\n }\n\n claimDirty(limit: number, owner: string, leaseMs: number): FileRecord[] {\n if (limit <= 0) {\n return [];\n }\n const now = Date.now();\n return this.claimDirtyStmt.all({\n limit,\n owner,\n lease_expires_at: now + leaseMs,\n now,\n }) as FileRecord[];\n }\n\n markDirtyByIds(ids: number[]): void {\n if (!ids.length) return;\n const tx = this.db.transaction((batch: number[]) => {\n for (const id of batch) {\n this.markDirtyByIdStmt.run(id);\n }\n });\n tx(ids);\n }\n\n applyHashResults(results: HashResult[]): void {\n if (!results.length) return;\n const tx = this.db.transaction((batch: HashResult[]) => {\n for (const { id, contentSha256, serviceFileHash } of batch) {\n this.applyHashesStmt.run(contentSha256, serviceFileHash, id);\n }\n });\n tx(results);\n }\n\n getCleanFilesForSnapshot(): Array<{\n rel_path: string;\n service_file_hash: string;\n size: number;\n }> {\n return this.selectCleanSnapshotStmt.all() as Array<{\n rel_path: string;\n service_file_hash: string;\n size: number;\n }>;\n }\n\n getTotalsForSnapshot(): { filesCount: number; totalSize: number } {\n const row = this.totalsStmt.get() as\n | { files_count: number; total_size: number }\n | undefined;\n return {\n filesCount: row?.files_count ?? 0,\n totalSize: row?.total_size ?? 0,\n };\n }\n\n countByState(state: HashState): number {\n const row = this.countByStateStmt.get(state) as\n | { count: number }\n | undefined;\n return row?.count ?? 0;\n }\n\n requeueExpiredHashing(now: number): number {\n const result = this.requeueExpiredHashingStmt.run(now);\n return result.changes ?? 0;\n }\n\n resetHashingStates(): number {\n const result = this.resetHashingStmt.run();\n return result.changes ?? 0;\n }\n}\n","import type Database from 'better-sqlite3';\n\nexport interface SnapshotRecord {\n id: number;\n snapshot_hash: string;\n files_count: number;\n total_size: number;\n created_at: number;\n}\n\nexport class SnapshotsRepo {\n private readonly insertStmt = this.db.prepare(\n `INSERT INTO snapshots (snapshot_hash, files_count, total_size, created_at)\n VALUES (?, ?, ?, ?)`,\n );\n\n private readonly selectLatestStmt = this.db.prepare(\n `SELECT * FROM snapshots ORDER BY created_at DESC LIMIT 1`,\n );\n\n constructor(private readonly db: Database.Database) {}\n\n insert(\n snapshotHash: string,\n filesCount: number,\n totalSize: number,\n createdAt: number,\n ): void {\n this.insertStmt.run(snapshotHash, filesCount, totalSize, createdAt);\n }\n\n getLatest(): SnapshotRecord | undefined {\n return this.selectLatestStmt.get() as SnapshotRecord | undefined;\n }\n}\n","import {\n Qulite,\n enqueueFsEvent,\n type PersistedJob,\n JobStatus,\n} from '@coderule/qulite';\nimport type Database from 'better-sqlite3';\nimport type { Logger } from 'pino';\n\nexport class Outbox {\n private readonly queue: Qulite;\n private readonly log: Logger;\n private readonly markKindStmt: Database.Statement;\n private readonly purgeLegacyStmt: Database.Statement;\n\n constructor(db: Database.Database, logger: Logger) {\n this.log = logger.child({ scope: 'outbox' });\n this.queue = new Qulite(db, {\n logger: this.log,\n defaultLeaseMs: 30_000,\n defaultMaxAttempts: 10,\n });\n this.markKindStmt = db.prepare(\n `UPDATE qulite_jobs SET kind = @kind WHERE dedupe_key = @dedupe_key`,\n );\n this.purgeLegacyStmt = db.prepare(\n `DELETE FROM qulite_jobs WHERE type = 'fs_control' AND (kind IS NULL OR kind = '')`,\n );\n const purged = this.purgeLegacyStmt.run().changes ?? 0;\n if (purged > 0) {\n this.log.warn({ purged }, 'Purged legacy fs_control jobs without kind');\n }\n\n // Log current queue counts to aid debugging when queue appears empty\n try {\n const counts = {\n pending: this.queue.countByStatus(JobStatus.Pending),\n processing: this.queue.countByStatus(JobStatus.Processing),\n done: this.queue.countByStatus(JobStatus.Done),\n failed: this.queue.countByStatus(JobStatus.Failed),\n };\n this.log.debug({ counts }, 'Outbox initialized');\n } catch {}\n }\n\n getQueue(): Qulite {\n return this.queue;\n }\n\n private markKind(dedupeKey: string, kind: string): void {\n this.markKindStmt.run({ dedupe_key: dedupeKey, kind });\n }\n\n enqueueSnapshot(rootId: string, delayMs = 0): void {\n const result = enqueueFsEvent(this.queue, {\n root_id: rootId,\n rel_path: '',\n kind: 'snapshot',\n delayMs,\n maxAttempts: 20,\n data: { root_id: rootId, kind: 'snapshot' },\n });\n this.markKind(`snapshot:${rootId}`, 'snapshot');\n if (result.changes > 0) {\n this.log.debug({ rootId }, 'Enqueued snapshot job');\n }\n }\n\n enqueueHeartbeat(rootId: string, delayMs = 0): void {\n const result = enqueueFsEvent(this.queue, {\n root_id: rootId,\n rel_path: '',\n kind: 'heartbeat',\n delayMs,\n maxAttempts: 5,\n data: { root_id: rootId, kind: 'heartbeat' },\n });\n this.markKind(`heartbeat:${rootId}`, 'heartbeat');\n if (result.changes > 0) {\n this.log.debug({ rootId }, 'Enqueued heartbeat job');\n }\n }\n\n claimFsControlJob(\n leaseOwner: string,\n leaseMs = 30_000,\n ): PersistedJob | undefined {\n return this.queue.claimNext({ type: 'fs_control', leaseOwner, leaseMs });\n }\n\n ack(jobId: number, leaseOwner: string): boolean {\n return this.queue.ack(jobId, leaseOwner);\n }\n\n retry(jobId: number, leaseOwner: string, delayMs?: number): boolean {\n return this.queue.retry(jobId, leaseOwner, delayMs);\n }\n\n fail(jobId: number, leaseOwner: string, error?: string): boolean {\n return this.queue.fail(jobId, leaseOwner, error);\n }\n\n requeueTimedOut(): number {\n return this.queue.requeueTimedOut();\n }\n}\n","import { CoderuleClients } from '@coderule/clients';\nimport type { Logger } from 'pino';\n\nimport type { ResolvedConfig } from '../types';\n\nfunction serviceConfig(\n baseUrl: string | undefined,\n timeout: number | undefined,\n): { baseUrl?: string; timeout?: number } | undefined {\n if (baseUrl === undefined && timeout === undefined) {\n return undefined;\n }\n const config: { baseUrl?: string; timeout?: number } = {};\n if (baseUrl !== undefined) {\n config.baseUrl = baseUrl;\n }\n if (timeout !== undefined) {\n config.timeout = timeout;\n }\n return config;\n}\n\nexport function createClients(\n config: ResolvedConfig,\n logger: Logger,\n): CoderuleClients {\n const clientLogger = logger.child({ scope: 'clients' });\n const httpTimeout = config.httpTimeout;\n\n const clients = new CoderuleClients({\n token: config.token,\n auth: serviceConfig(config.authBaseUrl, httpTimeout),\n ast: serviceConfig(config.astBaseUrl, httpTimeout),\n sync: serviceConfig(config.syncBaseUrl, httpTimeout),\n retrieval: serviceConfig(config.retrievalBaseUrl, httpTimeout),\n jwtFactory: {\n onTokenRefreshed: (info) => {\n clientLogger.debug(\n {\n expiresAt: new Date(info.expiresAt).toISOString(),\n serverUrl: info.serverUrl,\n },\n 'JWT refreshed',\n );\n },\n },\n });\n\n return clients;\n}\n","import type { CoderuleClients, VisitorRulesV2 } from '@coderule/clients';\nimport type { Logger } from 'pino';\n\nexport async function fetchVisitorRules(\n clients: CoderuleClients,\n logger: Logger,\n): Promise<VisitorRulesV2> {\n const fetchLogger = logger.child({ scope: 'rules' });\n fetchLogger.info('Fetching visitor rules v2 from AST service');\n const rules = await clients.ast.getVisitorRulesV2();\n fetchLogger.info(\n {\n include_extensions: rules.include_extensions.length,\n include_filenames: rules.include_filenames.length,\n exclude_dirnames: rules.exclude_dirnames.length,\n },\n 'Fetched visitor rules',\n );\n return rules;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport type { Stats } from 'fs';\n\nimport { ASTHttpClient, type VisitorRulesV2 } from '@coderule/clients';\n\nimport type { CompiledRulesBundle } from '../types';\nimport { logger } from '../log/logger';\n\nfunction toPosix(input: string): string {\n return input.split(path.sep).join('/');\n}\n\nfunction getLowerBasename(input: string): string {\n const base = input.split('/').pop();\n return (base ?? '').toLowerCase();\n}\n\nfunction getLowerExt(basename: string): string {\n const idx = basename.lastIndexOf('.');\n if (idx < 0) return '';\n return basename.slice(idx).toLowerCase();\n}\n\nexport function compileRulesBundle(rules: VisitorRulesV2): CompiledRulesBundle {\n const compiled = ASTHttpClient.compileRulesV2(rules);\n const basePredicate = ASTHttpClient.buildIgnoredPredicate(compiled);\n const predicate = (fullPath: string, stats?: Stats) => {\n let info = stats;\n if (!info) {\n logger.debug({ path: fullPath }, 'Predicate fallback lstat');\n try {\n info = fs.lstatSync(fullPath);\n } catch (error) {\n logger.warn(\n { err: error, path: fullPath },\n 'Failed to lstat path for rules predicate',\n );\n return false;\n }\n }\n return basePredicate(fullPath, info);\n };\n return {\n rules,\n compiled,\n predicate,\n };\n}\n\nexport function shouldIncludeFile(\n relPath: string,\n stats: Stats,\n bundle: CompiledRulesBundle,\n): boolean {\n if (stats.isDirectory()) return false;\n const posixRel = toPosix(relPath);\n if (bundle.compiled.dirRe.test(posixRel)) {\n return false;\n }\n const basename = getLowerBasename(posixRel);\n if (bundle.compiled.names.has(basename)) {\n return true;\n }\n const ext = getLowerExt(basename);\n return bundle.compiled.exts.has(ext);\n}\n\nexport function shouldPruneDirectory(\n relPath: string,\n bundle: CompiledRulesBundle,\n): boolean {\n const posixRel = toPosix(relPath);\n return bundle.compiled.dirRe.test(posixRel);\n}\n\nexport function buildWatcherIgnored(bundle: CompiledRulesBundle) {\n return (fullPath: string, stats?: Stats) => bundle.predicate(fullPath, stats);\n}\n","import fs from 'fs/promises';\nimport fsSync from 'fs';\nimport path from 'path';\nimport { Worker } from 'worker_threads';\nimport type { WorkerOptions } from 'worker_threads';\nimport { createHash } from 'crypto';\n\nimport type { Logger } from 'pino';\n\nimport type { FileRecord } from '../types';\nimport type { FilesRepo, HashResult } from '../db/FilesRepo';\n\ninterface HashMessage {\n type: 'hash';\n taskId: number;\n absPath: string;\n relPath: string;\n}\n\ninterface HashResultMessage {\n type: 'hash-result';\n taskId: number;\n contentSha256: string;\n serviceFileHash: string;\n}\n\ninterface HashErrorMessage {\n type: 'hash-error';\n taskId: number;\n error: string;\n code?: string;\n}\n\ntype WorkerMessage = HashResultMessage | HashErrorMessage;\n\ntype PendingTask = {\n resolve(value: { contentSha256: string; serviceFileHash: string }): void;\n reject(reason: Error): void;\n};\n\nclass HashWorker {\n private readonly worker: Worker;\n private readonly pending = new Map<number, PendingTask>();\n private nextTaskId = 1;\n private readonly log: Logger;\n private terminating = false;\n\n constructor(logger: Logger) {\n this.log = logger.child({ scope: 'hash-worker' });\n const workerUrl = new URL('./hash/WorkerThread.js', import.meta.url);\n const execArgv = process.execArgv.filter(\n (arg) => !arg.startsWith('--input-type'),\n );\n const workerOptions: WorkerOptions & { type?: 'module' | 'commonjs' } = {\n name: 'coderule-hasher',\n execArgv,\n };\n if (workerUrl.pathname.endsWith('.js')) {\n workerOptions.type = 'module';\n }\n this.worker = new Worker(workerUrl, workerOptions);\n this.worker.on('message', (message: WorkerMessage) =>\n this.onMessage(message),\n );\n this.worker.on('error', (error) => this.handleWorkerError(error));\n this.worker.on('exit', (code) => {\n if (code !== 0 && !this.terminating) {\n this.handleWorkerError(\n new Error(`Hasher worker exited with code ${code}`),\n );\n }\n });\n }\n\n async terminate(): Promise<void> {\n this.terminating = true;\n for (const [, pending] of this.pending) {\n pending.reject(new Error('Hasher worker terminated'));\n }\n this.pending.clear();\n await this.worker.terminate();\n }\n\n private onMessage(message: WorkerMessage) {\n const pending = this.pending.get(message.taskId);\n if (!pending) {\n this.log.warn(\n { taskId: message.taskId },\n 'Received message for unknown task',\n );\n return;\n }\n this.pending.delete(message.taskId);\n if (message.type === 'hash-result') {\n pending.resolve({\n contentSha256: message.contentSha256,\n serviceFileHash: message.serviceFileHash,\n });\n } else {\n const error = new Error(message.error);\n (error as any).code = message.code;\n pending.reject(error);\n }\n }\n\n private handleWorkerError(error: Error) {\n this.log.error({ err: error }, 'Hasher worker error');\n for (const [, pending] of this.pending) {\n pending.reject(error);\n }\n this.pending.clear();\n }\n\n compute(\n absPath: string,\n relPath: string,\n ): Promise<{ contentSha256: string; serviceFileHash: string }> {\n const taskId = this.nextTaskId++;\n const payload: HashMessage = {\n type: 'hash',\n taskId,\n absPath,\n relPath,\n };\n return new Promise((resolve, reject) => {\n this.pending.set(taskId, { resolve, reject });\n this.worker.postMessage(payload);\n });\n }\n}\n\nexport interface HasherOptions {\n rootPath: string;\n filesRepo: FilesRepo;\n logger: Logger;\n}\n\nexport class Hasher {\n private worker: HashWorker | null = null;\n private readonly log: Logger;\n private inlineMode: boolean;\n private readonly ownerId: string;\n private readonly leaseDurationMs: number;\n\n constructor(private readonly options: HasherOptions) {\n this.log = options.logger.child({ scope: 'hasher' });\n this.inlineMode = process.env.CODERULE_HASHER_INLINE === '1';\n this.ownerId = `hasher-${process.pid}-${Date.now()}`;\n const leaseFromEnv = process.env.CODERULE_HASH_LEASE_MS\n ? Number.parseInt(process.env.CODERULE_HASH_LEASE_MS, 10)\n : Number.NaN;\n this.leaseDurationMs =\n Number.isFinite(leaseFromEnv) && leaseFromEnv > 0 ? leaseFromEnv : 30_000;\n if (!this.inlineMode) {\n try {\n this.worker = new HashWorker(this.log);\n } catch (error) {\n this.log.warn(\n { err: error },\n 'Failed to start hasher worker, falling back to inline hashing',\n );\n this.worker = null;\n this.inlineMode = true;\n }\n }\n }\n\n async close(): Promise<void> {\n if (this.worker) {\n await this.worker.terminate();\n }\n }\n\n private resolveAbsolutePath(record: FileRecord): string {\n if (path.isAbsolute(record.display_path)) {\n return record.display_path;\n }\n return path.join(this.options.rootPath, record.rel_path);\n }\n\n private async ensureExists(\n absPath: string,\n record: FileRecord,\n ): Promise<boolean> {\n try {\n await fs.access(absPath);\n return true;\n } catch (error: any) {\n this.log.warn(\n { err: error, relPath: record.rel_path },\n 'File missing before hashing',\n );\n this.options.filesRepo.markMissing(record.rel_path);\n return false;\n }\n }\n\n private async computeHash(\n absPath: string,\n relPath: string,\n ): Promise<{ contentSha256: string; serviceFileHash: string }> {\n if (this.inlineMode || !this.worker) {\n return this.hashInline(absPath, relPath);\n }\n\n return this.worker.compute(absPath, relPath);\n }\n\n private async hashInline(\n absPath: string,\n relPath: string,\n ): Promise<{ contentSha256: string; serviceFileHash: string }> {\n return new Promise((resolve, reject) => {\n const content = createHash('sha256');\n const service = createHash('sha256');\n service.update(relPath);\n service.update('\\n');\n\n const stream = fsSync.createReadStream(absPath);\n stream.on('data', (chunk) => {\n content.update(chunk);\n service.update(chunk);\n });\n stream.on('error', (error) => {\n reject(error);\n });\n stream.on('end', () => {\n resolve({\n contentSha256: content.digest('hex'),\n serviceFileHash: service.digest('hex'),\n });\n });\n });\n }\n\n async processBatch(limit: number): Promise<boolean> {\n const now = Date.now();\n const requeued = this.options.filesRepo.requeueExpiredHashing(now);\n if (requeued > 0) {\n this.log.debug({ requeued }, 'Requeued expired hashing leases');\n }\n\n const dirty = this.options.filesRepo.claimDirty(\n limit,\n this.ownerId,\n this.leaseDurationMs,\n );\n if (dirty.length > 0) {\n this.log.debug({ count: dirty.length }, 'Hashing claimed files');\n }\n if (dirty.length === 0) {\n return false;\n }\n const successes: HashResult[] = [];\n const failures: number[] = [];\n\n for (const record of dirty) {\n const absPath = this.resolveAbsolutePath(record);\n const exists = await this.ensureExists(absPath, record);\n if (!exists) {\n continue;\n }\n\n try {\n const result = await this.computeHash(absPath, record.rel_path);\n successes.push({\n id: record.id,\n contentSha256: result.contentSha256,\n serviceFileHash: result.serviceFileHash,\n });\n } catch (error: any) {\n if (error?.code === 'ENOENT') {\n this.log.debug(\n { relPath: record.rel_path },\n 'File disappeared during hashing',\n );\n this.options.filesRepo.markMissing(record.rel_path);\n } else {\n this.log.warn(\n { err: error, relPath: record.rel_path },\n 'Failed to hash file',\n );\n failures.push(record.id);\n }\n }\n }\n\n if (successes.length) {\n this.log.debug({ count: successes.length }, 'Hashing succeeded');\n this.options.filesRepo.applyHashResults(successes);\n }\n if (failures.length) {\n this.log.warn({ count: failures.length }, 'Hashing failed for files');\n this.options.filesRepo.markDirtyByIds(failures);\n }\n\n return true;\n }\n}\n","import type { Logger } from 'pino';\n\nimport { logger as baseLogger } from '../log/logger';\nimport { resolveConfig } from '../config/Configurator';\nimport { openDatabase } from '../db/Database';\nimport { FilesRepo } from '../db/FilesRepo';\nimport { SnapshotsRepo } from '../db/SnapshotsRepo';\nimport { Outbox } from '../queue/Outbox';\nimport { createClients } from '../clients/Clients';\nimport { fetchVisitorRules } from '../rules/RulesFetcher';\nimport { compileRulesBundle } from '../rules/RulesCompiler';\nimport { Hasher } from '../hash/Hasher';\nimport type {\n CompiledRulesBundle,\n ResolvedConfig,\n RuntimeContext,\n} from '../types';\n\nexport interface BootstrapResult extends RuntimeContext {\n filesRepo: FilesRepo;\n snapshotsRepo: SnapshotsRepo;\n hasher: Hasher;\n}\n\nfunction createServiceLogger(): Logger {\n return baseLogger.child({ scope: 'service' });\n}\n\nexport async function bootstrap(params: {\n token?: string;\n}): Promise<BootstrapResult> {\n const config: ResolvedConfig = await resolveConfig(params);\n const logger = createServiceLogger();\n\n const db = openDatabase(config.dbPath, logger.child({ scope: 'db' }));\n const filesRepo = new FilesRepo(db);\n const recovered = filesRepo.resetHashingStates();\n if (recovered > 0) {\n logger.info({ recovered }, 'Recovered lingering hashing leases');\n }\n const snapshotsRepo = new SnapshotsRepo(db);\n const outbox = new Outbox(db, logger);\n const clients = createClients(config, logger);\n\n const rules = await fetchVisitorRules(clients, logger);\n const compiled: CompiledRulesBundle = compileRulesBundle(rules);\n\n const hasher = new Hasher({ rootPath: config.rootPath, filesRepo, logger });\n\n const runtime: BootstrapResult = {\n config,\n logger,\n db,\n outbox,\n clients,\n rules: compiled,\n filesRepo,\n snapshotsRepo,\n hasher,\n };\n\n return runtime;\n}\n","import path from 'path';\n\nexport function toPosixRelative(root: string, target: string): string {\n const rel = path.relative(root, target);\n if (!rel || rel === '') return '';\n return rel.split(path.sep).join('/');\n}\n\nexport function resolveDisplayPath(target: string): string {\n return path.resolve(target);\n}\n\nexport function isInsideRoot(root: string, target: string): boolean {\n const rel = path.relative(root, target);\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n}\n","import fs from 'fs/promises';\nimport path from 'path';\n\nimport type { Logger } from 'pino';\n\nimport type { CompiledRulesBundle, WalkerStats } from '../types';\nimport {\n shouldIncludeFile,\n shouldPruneDirectory,\n} from '../rules/RulesCompiler';\nimport type { FilesRepo } from '../db/FilesRepo';\n\nimport { toPosixRelative } from './PathUtil';\n\nconst EMPTY_STATS: WalkerStats = {\n processed: 0,\n skipped: 0,\n dirtied: 0,\n missing: 0,\n};\n\nfunction cloneStats(stats: WalkerStats): WalkerStats {\n return { ...stats };\n}\n\nexport interface InventoryOptions {\n rootPath: string;\n bundle: CompiledRulesBundle;\n filesRepo: FilesRepo;\n logger: Logger;\n}\n\nasync function readSymlinkTarget(\n absPath: string,\n log: Logger,\n): Promise<string | null> {\n try {\n return await fs.readlink(absPath);\n } catch (error: any) {\n log.warn({ err: error, path: absPath }, 'Failed to read symlink target');\n return null;\n }\n}\n\nasync function walkDirectory(\n current: string,\n opts: InventoryOptions,\n stats: WalkerStats,\n): Promise<void> {\n const dirLogger = opts.logger;\n let dirents;\n try {\n dirents = await fs.readdir(current, { withFileTypes: true });\n } catch (error: any) {\n dirLogger.warn({ err: error, path: current }, 'Failed to read directory');\n return;\n }\n\n for (const dirent of dirents) {\n const absPath = path.join(current, dirent.name);\n const relPath = toPosixRelative(opts.rootPath, absPath);\n\n if (dirent.isDirectory()) {\n if (shouldPruneDirectory(relPath, opts.bundle)) {\n stats.skipped += 1;\n continue;\n }\n await walkDirectory(absPath, opts, stats);\n continue;\n }\n\n if (dirent.isSymbolicLink() || dirent.isFile()) {\n let stat;\n try {\n stat = await fs.lstat(absPath);\n } catch (error: any) {\n dirLogger.warn({ err: error, path: absPath }, 'Failed to stat file');\n continue;\n }\n\n stats.processed += 1;\n if (!shouldIncludeFile(relPath, stat, opts.bundle)) {\n stats.skipped += 1;\n continue;\n }\n\n const target = dirent.isSymbolicLink()\n ? await readSymlinkTarget(absPath, dirLogger)\n : null;\n const state = opts.filesRepo.upsertFromStat({\n relPath,\n displayPath: absPath,\n stats: stat,\n isSymlink: dirent.isSymbolicLink(),\n symlinkTarget: target,\n });\n if (state === 'dirty') {\n stats.dirtied += 1;\n }\n continue;\n }\n\n // Non-regular file types (sockets, FIFOs, etc.)\n stats.skipped += 1;\n }\n}\n\nexport async function runInventory(\n opts: InventoryOptions,\n): Promise<WalkerStats> {\n const stats = cloneStats(EMPTY_STATS);\n const startedAt = Date.now();\n await walkDirectory(opts.rootPath, opts, stats);\n const missing = opts.filesRepo.markMissingBefore(startedAt);\n stats.missing = missing;\n opts.logger.info({ ...stats }, 'Completed initial inventory');\n return stats;\n}\n","import fs from 'fs/promises';\nimport path from 'path';\n\nimport { SyncHttpClient } from '@coderule/clients';\nimport type { Logger } from 'pino';\n\nimport type { FilesRepo } from '../db/FilesRepo';\nimport type { SnapshotsRepo } from '../db/SnapshotsRepo';\nimport type { InitialSyncResult, SnapshotComputation } from '../types';\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function computeSnapshot(filesRepo: FilesRepo): SnapshotComputation {\n const files = filesRepo.getCleanFilesForSnapshot();\n const hashes = files\n .map((file) => file.service_file_hash)\n .filter((hash): hash is string => typeof hash === 'string');\n const snapshotHash = SyncHttpClient.calculateSnapshotHash([...hashes].sort());\n const { filesCount, totalSize } = filesRepo.getTotalsForSnapshot();\n return {\n snapshotHash,\n files: files.map((file) => ({\n file_path: file.rel_path,\n file_hash: file.service_file_hash,\n })),\n filesCount,\n totalSize,\n };\n}\n\nasync function withRetries<T>(\n op: () => Promise<T>,\n logger: Logger,\n context: Record<string, unknown>,\n maxAttempts: number,\n): Promise<T> {\n let attempt = 0;\n // First attempt + (maxAttempts - 1) retries\n while (true) {\n try {\n return await op();\n } catch (err: any) {\n attempt += 1;\n if (attempt >= maxAttempts) {\n logger.error(\n { err, ...context, attempt },\n 'Operation failed after retries',\n );\n throw err;\n }\n const delay = Math.min(15_000, 1_000 * 2 ** (attempt - 1));\n logger.warn(\n { err, ...context, attempt, delay },\n 'Operation failed; retrying',\n );\n await sleep(delay);\n }\n }\n}\n\nasync function uploadMissing(\n rootPath: string,\n missing: Array<{ file_path: string; file_hash: string }> | undefined,\n syncClient: SyncHttpClient,\n logger: Logger,\n maxAttempts: number,\n chunkSize = 64,\n): Promise<void> {\n if (!missing || missing.length === 0) return;\n\n const total = missing.length;\n const chunks: Array<Array<{ file_path: string; file_hash: string }>> = [];\n for (let i = 0; i < total; i += chunkSize) {\n chunks.push(missing.slice(i, i + chunkSize));\n }\n\n for (let idx = 0; idx < chunks.length; idx++) {\n const list = chunks[idx]!;\n const map = new Map<string, { path: string; content: Buffer }>();\n for (const missingFile of list) {\n const absPath = path.join(rootPath, missingFile.file_path);\n try {\n const buffer = await fs.readFile(absPath);\n map.set(missingFile.file_hash, {\n path: missingFile.file_path,\n content: buffer,\n });\n } catch (error: any) {\n logger.warn(\n { err: error, relPath: missingFile.file_path },\n 'Failed to read missing file content',\n );\n }\n }\n if (map.size === 0) continue;\n\n await withRetries(\n () => syncClient.uploadFileContent(map),\n logger,\n {\n op: 'uploadFileContent',\n chunkIndex: idx + 1,\n chunks: chunks.length,\n files: map.size,\n },\n maxAttempts,\n );\n }\n}\n\nasync function ensureSnapshotCreated(\n rootPath: string,\n computation: SnapshotComputation,\n syncClient: SyncHttpClient,\n logger: Logger,\n options?: { maxAttempts?: number; uploadChunkSize?: number },\n): Promise<void> {\n const { snapshotHash, files } = computation;\n const maxAttempts = options?.maxAttempts ?? 5;\n const uploadChunkSize = options?.uploadChunkSize ?? 64;\n\n let status = await withRetries(\n () => syncClient.checkSnapshotStatus(snapshotHash),\n logger,\n { op: 'checkSnapshotStatus', snapshotHash },\n maxAttempts,\n );\n if (status.status === 'READY') {\n logger.info({ snapshotHash }, 'Snapshot already READY');\n return;\n }\n\n if (status.status === 'NOT_FOUND' || status.status === 'MISSING_CONTENT') {\n status = await withRetries(\n () => syncClient.createSnapshot(snapshotHash, files),\n logger,\n { op: 'createSnapshot', snapshotHash },\n maxAttempts,\n );\n }\n\n if (status.status === 'MISSING_CONTENT' && status.missing_files?.length) {\n logger.info(\n { missing: status.missing_files.length },\n 'Uploading missing file content',\n );\n await uploadMissing(\n rootPath,\n status.missing_files,\n syncClient,\n logger,\n maxAttempts,\n uploadChunkSize,\n );\n status = await withRetries(\n () => syncClient.createSnapshot(snapshotHash, files),\n logger,\n { op: 'createSnapshot', snapshotHash },\n maxAttempts,\n );\n }\n\n let attempt = 0;\n while (status.status !== 'READY') {\n if (status.status === 'FAILED') {\n throw new Error(`Snapshot failed processing: ${JSON.stringify(status)}`);\n }\n const delay = Math.min(5_000, 1_000 * Math.max(1, 2 ** attempt));\n await sleep(delay);\n attempt += 1;\n status = await withRetries(\n () => syncClient.checkSnapshotStatus(snapshotHash),\n logger,\n { op: 'checkSnapshotStatus', snapshotHash },\n maxAttempts,\n );\n }\n\n logger.info({ snapshotHash }, 'Snapshot READY');\n}\n\nexport async function publishSnapshot(\n rootPath: string,\n filesRepo: FilesRepo,\n snapshotsRepo: SnapshotsRepo,\n syncClient: SyncHttpClient,\n logger: Logger,\n options?: { maxAttempts?: number; uploadChunkSize?: number },\n): Promise<InitialSyncResult> {\n const computation = computeSnapshot(filesRepo);\n await ensureSnapshotCreated(\n rootPath,\n computation,\n syncClient,\n logger,\n options,\n );\n const createdAt = Date.now();\n snapshotsRepo.insert(\n computation.snapshotHash,\n computation.filesCount,\n computation.totalSize,\n createdAt,\n );\n return {\n snapshotHash: computation.snapshotHash,\n filesCount: computation.filesCount,\n totalSize: computation.totalSize,\n status: 'READY',\n createdAt,\n };\n}\n","import { runInventory } from '../fs/Walker';\nimport { publishSnapshot } from '../sync/SnapshotProtocol';\nimport type { InitialSyncResult } from '../types';\n\nimport type { BootstrapResult } from './Bootstrap';\n\nexport async function runInitialSyncPipeline(\n runtime: BootstrapResult,\n): Promise<InitialSyncResult> {\n const inventoryLogger = runtime.logger.child({ scope: 'inventory' });\n await runInventory({\n rootPath: runtime.config.rootPath,\n bundle: runtime.rules,\n filesRepo: runtime.filesRepo,\n logger: inventoryLogger,\n });\n\n const hashLogger = runtime.logger.child({ scope: 'hash' });\n let hadWork = true;\n while (hadWork) {\n hadWork = await runtime.hasher.processBatch(runtime.config.hashBatchSize);\n if (hadWork) {\n hashLogger.debug('Hasher processed batch');\n }\n }\n\n const syncLogger = runtime.logger.child({ scope: 'snapshot' });\n const result = await publishSnapshot(\n runtime.config.rootPath,\n runtime.filesRepo,\n runtime.snapshotsRepo,\n runtime.clients.sync,\n syncLogger,\n { maxAttempts: runtime.config.maxSnapshotAttempts },\n );\n\n return result;\n}\n","import type { Stats } from 'fs';\n\nimport chokidar, { type FSWatcher } from 'chokidar';\nimport type { Logger } from 'pino';\n\nexport type WatchEvent = 'add' | 'change' | 'unlink' | 'unlinkDir' | 'addDir';\n\nexport interface WatcherHandlers {\n onEvent(\n event: WatchEvent,\n absPath: string,\n stats?: Stats,\n ): Promise<void> | void;\n onReady?(): void;\n}\n\nexport interface WatcherOptions {\n rootPath: string;\n ignored: (path: string, stats?: Stats) => boolean;\n logger: Logger;\n handlers: WatcherHandlers;\n}\n\nasync function createChokidarWatcher(\n options: WatcherOptions,\n usePolling: boolean,\n): Promise<{ watcher: FSWatcher; mode: 'native' | 'polling' }> {\n const log = options.logger.child({\n scope: 'watcher',\n mode: usePolling ? 'polling' : 'native',\n });\n const watcher = chokidar.watch(options.rootPath, {\n ignored: options.ignored,\n ignoreInitial: true,\n persistent: true,\n awaitWriteFinish: {\n stabilityThreshold: 1_500,\n pollInterval: 100,\n },\n atomic: true,\n usePolling,\n interval: usePolling ? 200 : undefined,\n binaryInterval: usePolling ? 200 : undefined,\n alwaysStat: true,\n cwd: undefined,\n depth: undefined,\n });\n\n await new Promise<void>((resolve, reject) => {\n const onReady = () => {\n watcher.off('error', onError);\n log.info('Watcher ready');\n resolve();\n };\n const onError = (err: unknown) => {\n watcher.off('ready', onReady);\n reject(err);\n };\n watcher.once('ready', onReady);\n watcher.once('error', onError);\n });\n\n return { watcher, mode: usePolling ? 'polling' : 'native' };\n}\n\nfunction attachHandlers(watcher: FSWatcher, options: WatcherOptions): void {\n const { handlers, logger } = options;\n\n const handle = (event: WatchEvent, filePath: string, stats?: Stats) => {\n logger.debug({ event, filePath }, 'Watcher raw event');\n Promise.resolve(handlers.onEvent(event, filePath, stats)).catch((error) => {\n logger.error(\n { err: error, event, path: filePath },\n 'Watcher handler failed',\n );\n });\n };\n\n watcher.on('add', (filePath, stats) => handle('add', filePath, stats));\n watcher.on('change', (filePath, stats) => handle('change', filePath, stats));\n watcher.on('unlink', (filePath) => handle('unlink', filePath));\n watcher.on('addDir', (dirPath) => handle('addDir', dirPath));\n watcher.on('unlinkDir', (dirPath) => handle('unlinkDir', dirPath));\n watcher.on('error', (error) => {\n logger.error({ err: error }, 'Watcher error');\n });\n if (handlers.onReady) {\n handlers.onReady();\n logger.debug('Watcher ready callback executed');\n }\n}\n\nexport async function startWatcher(options: WatcherOptions): Promise<{\n watcher: FSWatcher;\n mode: 'native' | 'polling';\n}> {\n try {\n const result = await createChokidarWatcher(options, false);\n attachHandlers(result.watcher, options);\n return result;\n } catch (error) {\n options.logger.warn(\n { err: error },\n 'Native watcher failed, falling back to polling',\n );\n const result = await createChokidarWatcher(options, true);\n attachHandlers(result.watcher, options);\n return result;\n }\n}\n","import type { Logger } from 'pino';\nimport type { SyncHttpClient } from '@coderule/clients';\n\nimport type { SnapshotsRepo } from '../db/SnapshotsRepo';\n\nexport async function sendHeartbeat(\n rootId: string,\n snapshotsRepo: SnapshotsRepo,\n syncClient: SyncHttpClient,\n logger: Logger,\n): Promise<void> {\n const latest = snapshotsRepo.getLatest();\n if (latest) {\n await syncClient.checkSnapshotStatus(latest.snapshot_hash);\n }\n logger.debug({ rootId }, 'Heartbeat sent');\n}\n","export class ServiceState {\n lastChangeAt = Date.now();\n lastSnapshotReadyAt = Date.now();\n lastHeartbeatEnqueuedAt = 0;\n\n updateChange(timestamp = Date.now()) {\n this.lastChangeAt = timestamp;\n }\n\n updateSnapshotReady(timestamp = Date.now()) {\n this.lastSnapshotReadyAt = timestamp;\n }\n\n updateHeartbeat(timestamp = Date.now()) {\n this.lastHeartbeatEnqueuedAt = timestamp;\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport type { Stats } from 'fs';\n\nimport type pino from 'pino';\nimport type { FSWatcher } from 'chokidar';\nimport type { PersistedJob } from '@coderule/qulite';\n\nimport { startWatcher, type WatchEvent } from '../fs/Watcher';\nimport { buildWatcherIgnored, shouldIncludeFile } from '../rules/RulesCompiler';\nimport { toPosixRelative, isInsideRoot } from '../fs/PathUtil';\nimport { publishSnapshot } from '../sync/SnapshotProtocol';\nimport { sendHeartbeat } from '../sync/HeartbeatProtocol';\n\nimport { ServiceState } from './State';\nimport type { BootstrapResult } from './Bootstrap';\n\nfunction safeParse<T = unknown>(input: string): T | undefined {\n try {\n return JSON.parse(input) as T;\n } catch {\n return undefined;\n }\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction computeBackoff(attempts: number | undefined): number {\n const base = attempts ?? 0;\n const delay = 1_000 * 2 ** base;\n return Math.min(delay, 60_000);\n}\n\nasync function readSymlinkTarget(absPath: string): Promise<string | null> {\n try {\n return await fs.readlink(absPath);\n } catch {\n return null;\n }\n}\n\nclass SnapshotScheduler {\n private timer: NodeJS.Timeout | null = null;\n\n constructor(\n private readonly rootId: string,\n private readonly debounceMs: number,\n private readonly outbox: BootstrapResult['outbox'],\n private readonly state: ServiceState,\n ) {}\n\n trigger(): void {\n this.state.updateChange();\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n this.outbox.enqueueSnapshot(this.rootId);\n this.timer = null;\n }, this.debounceMs);\n }\n\n cancel(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n}\n\nexport class ServiceRunner {\n private readonly state = new ServiceState();\n private watcher: FSWatcher | null = null;\n private running = false;\n private readonly fsControlLeaseOwner = `fs-control-${process.pid}-${Date.now()}`;\n private readonly scheduler: SnapshotScheduler;\n private readonly ignoredPredicate: (path: string, stats?: Stats) => boolean;\n private readonly tasks = new Set<Promise<void>>();\n private buffering = false;\n private bufferedEvents: Array<{\n event: WatchEvent;\n absPath: string;\n stats?: Stats;\n }> = [];\n\n constructor(private readonly runtime: BootstrapResult) {\n this.scheduler = new SnapshotScheduler(\n runtime.config.rootId,\n runtime.config.snapshotDebounceMs,\n runtime.outbox,\n this.state,\n );\n this.ignoredPredicate = buildWatcherIgnored(runtime.rules);\n }\n\n recordInitialSnapshot(timestamp: number): void {\n this.state.updateSnapshotReady(timestamp);\n this.state.updateChange(timestamp);\n this.state.updateHeartbeat(timestamp);\n }\n\n async start(): Promise<void> {\n if (this.running) return;\n await this.prepareWatcher(false);\n await this.startLoops();\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n this.running = false;\n this.scheduler.cancel();\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = null;\n }\n await Promise.all([...this.tasks]);\n await this.runtime.hasher.close();\n this.runtime.clients.close();\n this.runtime.db.close();\n }\n\n getServiceStateSnapshot(): {\n lastChangeAt: number;\n lastSnapshotReadyAt: number;\n lastHeartbeatEnqueuedAt: number;\n watcherReady: boolean;\n buffering: boolean;\n } {\n return {\n lastChangeAt: this.state.lastChangeAt,\n lastSnapshotReadyAt: this.state.lastSnapshotReadyAt,\n lastHeartbeatEnqueuedAt: this.state.lastHeartbeatEnqueuedAt,\n watcherReady: this.watcher !== null,\n buffering: this.buffering,\n };\n }\n\n private runBackground(fn: () => Promise<void>): void {\n const task = fn();\n this.tasks.add(task);\n task\n .catch((error) => {\n if (this.running) {\n this.runtime.logger.error({ err: error }, 'Background task failed');\n }\n })\n .finally(() => {\n this.tasks.delete(task);\n });\n }\n\n async prepareWatcher(bufferOnly: boolean): Promise<void> {\n const { rootPath } = this.runtime.config;\n const logger = this.runtime.logger.child({ scope: 'watcher' });\n this.buffering = bufferOnly;\n const { watcher, mode } = await startWatcher({\n rootPath,\n ignored: this.ignoredPredicate,\n logger,\n handlers: {\n onEvent: (event, absPath, stats) => {\n logger.debug({ event, absPath }, 'Watcher event received');\n if (this.buffering) {\n this.bufferedEvents.push({ event, absPath, stats });\n return Promise.resolve();\n }\n return this.handleEvent(event, absPath, stats);\n },\n },\n });\n this.watcher = watcher;\n logger.debug({ watched: watcher.getWatched() }, 'Watcher targets');\n logger.info({ mode, buffering: bufferOnly }, 'File watcher started');\n }\n\n async enableWatcherProcessing(): Promise<void> {\n if (!this.buffering) {\n return;\n }\n this.buffering = false;\n this.runtime.logger.debug(\n { buffered: this.bufferedEvents.length },\n 'Watcher buffering disabled',\n );\n if (this.bufferedEvents.length === 0) return;\n for (const buffered of this.bufferedEvents) {\n await this.handleEvent(buffered.event, buffered.absPath, buffered.stats);\n }\n this.bufferedEvents = [];\n }\n\n async startLoops(): Promise<void> {\n if (this.running) return;\n this.running = true;\n this.runBackground(() => this.hashLoop());\n this.runBackground(() => this.fsControlLoop());\n this.runBackground(() => this.heartbeatLoop());\n this.runBackground(() => this.requeueLoop());\n this.runtime.logger.debug('Background loops started');\n }\n\n private async handleEvent(\n event: WatchEvent,\n absPath: string,\n stats?: Stats,\n ): Promise<void> {\n if (!this.running) return;\n const root = this.runtime.config.rootPath;\n const absolute = path.isAbsolute(absPath)\n ? absPath\n : path.join(root, absPath);\n if (!isInsideRoot(root, absolute)) {\n return;\n }\n\n switch (event) {\n case 'add':\n case 'change':\n await this.handleAddChange(absolute, stats);\n break;\n case 'unlink':\n await this.handleUnlink(absolute);\n break;\n case 'unlinkDir':\n await this.handleUnlinkDir(absolute);\n break;\n case 'addDir':\n default:\n break;\n }\n }\n\n private async handleAddChange(\n absPath: string,\n _stats?: Stats,\n ): Promise<void> {\n let fileStats: Stats;\n try {\n // Always re-stat on change to avoid stale metadata from chokidar callbacks.\n fileStats = await fs.lstat(absPath);\n } catch (error) {\n this.runtime.logger.warn(\n { err: error, path: absPath },\n 'Failed to lstat path',\n );\n return;\n }\n const relPath = toPosixRelative(this.runtime.config.rootPath, absPath);\n if (!shouldIncludeFile(relPath, fileStats, this.runtime.rules)) {\n this.runtime.logger.debug({ relPath }, 'Watcher event ignored by rules');\n return;\n }\n const isSymlink = fileStats.isSymbolicLink();\n const target = isSymlink ? await readSymlinkTarget(absPath) : null;\n const state = this.runtime.filesRepo.upsertFromStat({\n relPath,\n displayPath: absPath,\n stats: fileStats,\n isSymlink,\n symlinkTarget: target,\n });\n if (state === 'dirty') {\n this.scheduler.trigger();\n }\n }\n\n private async handleUnlink(absPath: string): Promise<void> {\n const relPath = toPosixRelative(this.runtime.config.rootPath, absPath);\n const changed = this.runtime.filesRepo.markMissing(relPath);\n if (changed > 0) {\n this.scheduler.trigger();\n }\n }\n\n private async handleUnlinkDir(absPath: string): Promise<void> {\n const relPath = toPosixRelative(this.runtime.config.rootPath, absPath);\n const changed = this.runtime.filesRepo.markMissingByPrefix(relPath);\n if (changed > 0) {\n this.scheduler.trigger();\n }\n }\n\n private async hashLoop(): Promise<void> {\n while (this.running) {\n const processed = await this.runtime.hasher.processBatch(\n this.runtime.config.hashBatchSize,\n );\n if (!processed) {\n await sleep(500);\n }\n }\n }\n\n private async fsControlLoop(): Promise<void> {\n const log = this.runtime.logger.child({ scope: 'fs-control-worker' });\n while (this.running) {\n const job = this.runtime.outbox.claimFsControlJob(\n this.fsControlLeaseOwner,\n );\n if (!job) {\n await sleep(this.runtime.config.queuePollIntervalMs);\n continue;\n }\n\n const payload = job.data\n ? (safeParse<Record<string, unknown>>(job.data) ?? {})\n : {};\n const jobKind =\n job.kind ??\n (typeof payload.kind === 'string' ? payload.kind : undefined);\n\n if (!jobKind) {\n log.warn(\n { jobId: job.id },\n 'fs_control job missing kind, acknowledging',\n );\n this.runtime.outbox.ack(job.id, this.fsControlLeaseOwner);\n continue;\n }\n\n if (jobKind === 'snapshot') {\n await this.handleSnapshotJob(job, log);\n } else if (jobKind === 'heartbeat') {\n await this.handleHeartbeatJob(job, log);\n } else {\n log.warn({ jobId: job.id, kind: jobKind }, 'Unknown fs_control job');\n this.runtime.outbox.ack(job.id, this.fsControlLeaseOwner);\n }\n }\n }\n\n private async heartbeatLoop(): Promise<void> {\n const log = this.runtime.logger.child({ scope: 'heartbeat-loop' });\n while (this.running) {\n const now = Date.now();\n const sinceChange = now - this.state.lastChangeAt;\n const sinceHeartbeat = now - this.state.lastHeartbeatEnqueuedAt;\n if (\n sinceChange >= this.runtime.config.heartbeatIntervalMs &&\n sinceHeartbeat >= this.runtime.config.heartbeatIntervalMs\n ) {\n this.runtime.outbox.enqueueHeartbeat(this.runtime.config.rootId);\n this.state.updateHeartbeat(now);\n log.debug('Heartbeat enqueued');\n }\n await sleep(this.runtime.config.heartbeatCheckIntervalMs);\n }\n log.info('Heartbeat loop stopped');\n }\n\n private async requeueLoop(): Promise<void> {\n while (this.running) {\n const count = this.runtime.outbox.requeueTimedOut();\n if (count > 0) {\n this.runtime.logger.info({ count }, 'Requeued timed-out jobs');\n }\n await sleep(this.runtime.config.heartbeatCheckIntervalMs);\n }\n }\n\n private async handleSnapshotJob(\n job: PersistedJob,\n log: pino.Logger,\n ): Promise<void> {\n if (\n this.runtime.filesRepo.countByState('dirty') > 0 ||\n this.runtime.filesRepo.countByState('hashing') > 0\n ) {\n const delay = computeBackoff(job.attempts);\n this.runtime.outbox.retry(job.id, this.fsControlLeaseOwner, delay);\n await sleep(200);\n return;\n }\n\n try {\n const result = await publishSnapshot(\n this.runtime.config.rootPath,\n this.runtime.filesRepo,\n this.runtime.snapshotsRepo,\n this.runtime.clients.sync,\n log,\n { maxAttempts: this.runtime.config.maxSnapshotAttempts },\n );\n this.runtime.outbox.ack(job.id, this.fsControlLeaseOwner);\n this.state.updateSnapshotReady(result.createdAt);\n log.info({ snapshotHash: result.snapshotHash }, 'Snapshot job completed');\n } catch (error: any) {\n log.warn({ err: error }, 'Snapshot job failed');\n const delay = computeBackoff(job.attempts);\n this.runtime.outbox.retry(job.id, this.fsControlLeaseOwner, delay);\n await sleep(delay);\n }\n }\n\n private async handleHeartbeatJob(\n job: PersistedJob,\n log: pino.Logger,\n ): Promise<void> {\n try {\n await sendHeartbeat(\n this.runtime.config.rootId,\n this.runtime.snapshotsRepo,\n this.runtime.clients.sync,\n log,\n );\n this.runtime.outbox.ack(job.id, this.fsControlLeaseOwner);\n this.state.updateHeartbeat(Date.now());\n } catch (error: any) {\n const delay = computeBackoff(job.attempts);\n this.runtime.outbox.retry(job.id, this.fsControlLeaseOwner, delay);\n log.warn({ err: error }, 'Heartbeat failed; retry scheduled');\n }\n }\n}\n","import { JobStatus } from '@coderule/qulite';\n\nimport type { ServiceRunner } from '../service/ServiceLoops';\nimport type { BootstrapResult } from '../service/Bootstrap';\nimport type { HashState } from '../types';\n\nconst HASH_STATES: HashState[] = ['clean', 'dirty', 'hashing', 'missing'];\n\ntype StateCounts = Record<HashState, number>;\n\ntype QueueCounts = {\n pending: number;\n processing: number;\n done: number;\n failed: number;\n};\n\nexport interface IndexingStatus {\n timestamp: number;\n root: {\n id: string;\n path: string;\n };\n files: {\n total: number;\n byState: StateCounts;\n };\n latestSnapshot: ReturnType<\n BootstrapResult['snapshotsRepo']['getLatest']\n > | null;\n queue: QueueCounts;\n service: ReturnType<ServiceRunner['getServiceStateSnapshot']>;\n}\n\nexport function collectIndexingStatus(\n runtime: BootstrapResult,\n runner: ServiceRunner,\n): IndexingStatus {\n const byState = {} as StateCounts;\n for (const state of HASH_STATES) {\n byState[state] = runtime.filesRepo.countByState(state);\n }\n\n const total = HASH_STATES.reduce((acc, state) => acc + byState[state], 0);\n\n const queue = runtime.outbox.getQueue();\n const queueCounts: QueueCounts = {\n pending: queue.countByStatus(JobStatus.Pending),\n processing: queue.countByStatus(JobStatus.Processing),\n done: queue.countByStatus(JobStatus.Done),\n failed: queue.countByStatus(JobStatus.Failed),\n };\n\n return {\n timestamp: Date.now(),\n root: {\n id: runtime.config.rootId,\n path: runtime.config.rootPath,\n },\n files: {\n total,\n byState,\n },\n latestSnapshot: runtime.snapshotsRepo.getLatest() ?? null,\n queue: queueCounts,\n service: runner.getServiceStateSnapshot(),\n };\n}\n\nexport function formatStatus(status: IndexingStatus): string {\n const lines: string[] = [];\n\n lines.push('=== Coderule Indexing Status ===');\n lines.push('');\n\n lines.push(`Timestamp: ${new Date(status.timestamp).toISOString()}`);\n lines.push('');\n\n lines.push('Repository:');\n lines.push(` ID: ${status.root.id}`);\n lines.push(` Path: ${status.root.path}`);\n lines.push('');\n\n lines.push('Files:');\n lines.push(` Total: ${status.files.total}`);\n lines.push(' States:');\n lines.push(` Clean: ${status.files.byState.clean}`);\n lines.push(` Dirty: ${status.files.byState.dirty}`);\n lines.push(` Hashing: ${status.files.byState.hashing}`);\n lines.push(` Missing: ${status.files.byState.missing}`);\n lines.push('');\n\n lines.push('Queue:');\n lines.push(` Pending: ${status.queue.pending}`);\n lines.push(` Processing: ${status.queue.processing}`);\n lines.push(` Done: ${status.queue.done}`);\n lines.push(` Failed: ${status.queue.failed}`);\n lines.push('');\n\n if (status.latestSnapshot) {\n lines.push('Latest Snapshot:');\n lines.push(` Hash: ${status.latestSnapshot.snapshot_hash}`);\n lines.push(` Files: ${status.latestSnapshot.files_count}`);\n lines.push(` Size: ${formatBytes(status.latestSnapshot.total_size)}`);\n lines.push(\n ` Created: ${new Date(status.latestSnapshot.created_at).toISOString()}`,\n );\n } else {\n lines.push('Latest Snapshot: None');\n }\n lines.push('');\n\n lines.push('Service State:');\n lines.push(\n ` Last Change: ${new Date(status.service.lastChangeAt).toISOString()}`,\n );\n lines.push(\n ` Last Snapshot Ready: ${new Date(status.service.lastSnapshotReadyAt).toISOString()}`,\n );\n lines.push(\n ` Last Heartbeat: ${status.service.lastHeartbeatEnqueuedAt > 0 ? new Date(status.service.lastHeartbeatEnqueuedAt).toISOString() : 'Never'}`,\n );\n lines.push(` Watcher Ready: ${status.service.watcherReady ? 'Yes' : 'No'}`);\n lines.push(` Buffering: ${status.service.buffering ? 'Yes' : 'No'}`);\n\n return lines.join('\\n');\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${units[i]}`;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport type { BootstrapResult } from '../service/Bootstrap';\nimport type { ServiceRunner } from '../service/ServiceLoops';\n\nimport { collectIndexingStatus, formatStatus } from './status';\n\nconst SERVER_NAME = 'coderule-scanner-mcp';\nconst SERVER_VERSION = process.env.npm_package_version ?? '0.0.0';\n\nexport interface CreateMcpServerOptions {\n runtime: BootstrapResult;\n runner: ServiceRunner;\n}\n\nexport function createMcpServer({\n runtime,\n runner,\n}: CreateMcpServerOptions): McpServer {\n const server = new McpServer({\n name: SERVER_NAME,\n version: SERVER_VERSION,\n description: 'Coderule file indexing MCP server',\n });\n\n server.registerTool(\n 'check',\n {\n title: 'Indexer status',\n description:\n 'Inspect the current indexing state, snapshot, and queue metrics',\n inputSchema: {},\n },\n async () => {\n const status = collectIndexingStatus(runtime, runner);\n const text = formatStatus(status);\n return {\n content: [{ type: 'text', text }],\n };\n },\n );\n\n const queryInputSchema = {\n query: z.string().min(1, 'Query text is required'),\n budgetTokens: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Token budget for retrieval (default 3000)'),\n } as const;\n\n server.registerTool(\n 'query',\n {\n title: 'Snapshot retrieval query',\n description:\n 'Execute a retrieval query against the most recent indexed snapshot',\n inputSchema: queryInputSchema,\n },\n async ({\n query,\n budgetTokens,\n }: {\n query: string;\n budgetTokens?: number;\n }) => {\n const latest = runtime.snapshotsRepo.getLatest();\n if (!latest) {\n const message = 'No snapshots available yet. Run indexing first.';\n return {\n content: [{ type: 'text', text: message }],\n isError: true,\n };\n }\n\n const effectiveBudget = Math.max(100, budgetTokens ?? 3000);\n try {\n const result = await runtime.clients.retrieval.query(\n latest.snapshot_hash,\n query,\n effectiveBudget,\n {\n formatter: runtime.config.retrievalFormatter,\n },\n );\n\n return {\n content: [\n {\n type: 'text',\n text: result.formatted_output ?? '(no formatted output)',\n },\n ],\n };\n } catch (error: any) {\n const message =\n error instanceof Error ? error.message : 'Unknown retrieval error';\n runtime.logger.error({ err: error }, 'Retrieval query failed');\n return {\n content: [{ type: 'text', text: `Retrieval error: ${message}` }],\n isError: true,\n };\n }\n },\n );\n\n return server;\n}\n","#!/usr/bin/env node\n\nimport fs from 'fs/promises';\nimport path from 'path';\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { resolveConfig } from './config/Configurator';\nimport { bootstrap } from './service/Bootstrap';\nimport { runInitialSyncPipeline } from './service/InitialSync';\nimport { ServiceRunner } from './service/ServiceLoops';\nimport { createMcpServer } from './mcp/server';\n\nconst ENV_FLAG_MAP: Record<string, string> = {\n root: 'CODERULE_ROOT',\n 'data-dir': 'CODERULE_DATA_DIR',\n 'auth-url': 'CODERULE_AUTH_URL',\n 'sync-url': 'CODERULE_SYNC_URL',\n 'ast-url': 'CODERULE_AST_URL',\n 'retrieval-url': 'CODERULE_RETRIEVAL_URL',\n 'retrieval-formatter': 'CODERULE_RETRIEVAL_FORMATTER',\n 'http-timeout': 'CODERULE_HTTP_TIMEOUT',\n 'snapshot-debounce': 'CODERULE_SNAPSHOT_DEBOUNCE_MS',\n 'heartbeat-interval': 'CODERULE_HEARTBEAT_INTERVAL_MS',\n 'heartbeat-check': 'CODERULE_HEARTBEAT_CHECK_INTERVAL_MS',\n 'queue-poll': 'CODERULE_QUEUE_POLL_INTERVAL_MS',\n 'hash-batch': 'CODERULE_HASH_BATCH_SIZE',\n 'hash-lease': 'CODERULE_HASH_LEASE_MS',\n 'max-snapshot-attempts': 'CODERULE_MAX_SNAPSHOT_ATTEMPTS',\n};\n\ninterface CliOptions {\n token: string;\n clean: boolean;\n inlineHasher: boolean;\n env: Record<string, string>;\n}\n\nfunction printUsage(): void {\n console.log(`Usage: coderule-mcp-server [token] [options]\\n`);\n console.log('Options:');\n console.log(' --token <token> Override CODERULE_TOKEN');\n console.log(\n ' --clean, --reindex Remove existing local state before running',\n );\n console.log(\n ' --inline-hasher Force inline hashing (debug only)',\n );\n console.log(' --root <path> Override CODERULE_ROOT');\n console.log(' --data-dir <path> Override CODERULE_DATA_DIR');\n console.log(' --auth-url <url> Override CODERULE_AUTH_URL');\n console.log(' --sync-url <url> Override CODERULE_SYNC_URL');\n console.log(' --ast-url <url> Override CODERULE_AST_URL');\n console.log(' --retrieval-url <url> Override CODERULE_RETRIEVAL_URL');\n console.log(\n ' --retrieval-formatter <val> Override CODERULE_RETRIEVAL_FORMATTER (standard | compact)',\n );\n console.log(' --http-timeout <ms> Override CODERULE_HTTP_TIMEOUT');\n console.log(\n ' --snapshot-debounce <ms> Override CODERULE_SNAPSHOT_DEBOUNCE_MS',\n );\n console.log(\n ' --heartbeat-interval <ms> Override CODERULE_HEARTBEAT_INTERVAL_MS',\n );\n console.log(\n ' --heartbeat-check <ms> Override CODERULE_HEARTBEAT_CHECK_INTERVAL_MS',\n );\n console.log(\n ' --queue-poll <ms> Override CODERULE_QUEUE_POLL_INTERVAL_MS',\n );\n console.log(\n ' --hash-batch <n> Override CODERULE_HASH_BATCH_SIZE',\n );\n console.log(' --hash-lease <ms> Override CODERULE_HASH_LEASE_MS');\n console.log(\n ' --max-snapshot-attempts <n> Override CODERULE_MAX_SNAPSHOT_ATTEMPTS',\n );\n console.log(\n ' KEY=value Set arbitrary environment variable',\n );\n console.log(' -h, --help Show this help message');\n}\n\nfunction parseArgs(argv: string[]): CliOptions | null {\n let token = process.env.CODERULE_TOKEN;\n let clean = false;\n let inlineHasher = false;\n const env: Record<string, string> = {};\n\n const args = [...argv];\n while (args.length > 0) {\n const arg = args.shift()!;\n if (arg === '--help' || arg === '-h') {\n printUsage();\n return null;\n }\n\n if (arg === '--clean' || arg === '--reindex') {\n clean = true;\n continue;\n }\n if (arg === '--inline-hasher') {\n inlineHasher = true;\n continue;\n }\n\n if (arg === '--token') {\n const value = args.shift();\n if (!value) {\n throw new Error('Missing value for --token');\n }\n token = value;\n continue;\n }\n if (arg.startsWith('--token=')) {\n token = arg.slice('--token='.length);\n continue;\n }\n\n if (arg.startsWith('--')) {\n const flag = arg.slice(2);\n const envKey = ENV_FLAG_MAP[flag];\n if (!envKey) {\n throw new Error(`Unknown option: ${arg}`);\n }\n const value = args.shift();\n if (!value) {\n throw new Error(`Option ${arg} requires a value`);\n }\n env[envKey] = value;\n continue;\n }\n\n if (arg.includes('=')) {\n const [key, value] = arg.split('=', 2);\n if (!key || value === undefined) {\n throw new Error(`Invalid KEY=value argument: ${arg}`);\n }\n env[key] = value;\n continue;\n }\n\n if (!token) {\n token = arg;\n continue;\n }\n\n throw new Error(`Unexpected argument: ${arg}`);\n }\n\n if (!token) {\n throw new Error(\n 'Missing token. Provide via argument or CODERULE_TOKEN environment variable.',\n );\n }\n\n return { token, clean, inlineHasher, env };\n}\n\nasync function ensureClean(configToken: string): Promise<void> {\n const config = await resolveConfig({ token: configToken });\n const targets = [\n config.dbPath,\n `${config.dbPath}-shm`,\n `${config.dbPath}-wal`,\n ];\n await Promise.all(targets.map((target) => fs.rm(target, { force: true })));\n await fs\n .rm(path.join(config.dataDir, 'watch', `${config.rootId}.sqlite-shm`), {\n force: true,\n })\n .catch(() => {});\n const dir = path.dirname(config.dbPath);\n await fs.mkdir(dir, { recursive: true });\n console.log(`Removed scanner database at ${config.dbPath}`);\n}\n\nfunction awaitShutdownSignals(): Promise<NodeJS.Signals> {\n return new Promise((resolve) => {\n const signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM'];\n const handler = (signal: NodeJS.Signals) => {\n for (const sig of signals) {\n process.off(sig, handler);\n }\n resolve(signal);\n };\n for (const sig of signals) {\n process.on(sig, handler);\n }\n });\n}\n\nasync function main(): Promise<void> {\n try {\n const options = parseArgs(process.argv.slice(2));\n if (!options) {\n return;\n }\n\n process.env.CODERULE_TOKEN = options.token;\n if (options.inlineHasher) {\n process.env.CODERULE_HASHER_INLINE = '1';\n }\n for (const [key, value] of Object.entries(options.env)) {\n process.env[key] = value;\n }\n\n if (options.clean) {\n await ensureClean(options.token);\n }\n\n const runtime = await bootstrap({ token: options.token });\n const runner = new ServiceRunner(runtime);\n\n try {\n await runner.prepareWatcher(true);\n\n let initialCreatedAt: number | undefined;\n try {\n const initial = await runInitialSyncPipeline(runtime);\n runtime.logger.info(\n {\n snapshotHash: initial.snapshotHash,\n filesCount: initial.filesCount,\n },\n 'Initial sync completed; starting MCP server',\n );\n initialCreatedAt = initial.createdAt;\n } catch (error: any) {\n runtime.logger.warn(\n { err: error },\n 'Initial sync failed; enqueuing snapshot job and continuing',\n );\n runtime.outbox.enqueueSnapshot(runtime.config.rootId, 0);\n }\n\n if (initialCreatedAt) {\n runner.recordInitialSnapshot(initialCreatedAt);\n }\n await runner.startLoops();\n await runner.enableWatcherProcessing();\n\n const server = createMcpServer({ runtime, runner });\n const transport = new StdioServerTransport();\n await server.connect(transport);\n runtime.logger.info('MCP server connected via stdio');\n\n const signal = await awaitShutdownSignals();\n runtime.logger.info({ signal }, 'Shutdown signal received');\n if (typeof transport.close === 'function') {\n await transport.close();\n }\n } finally {\n await runner.stop();\n }\n } catch (error) {\n console.error('MCP server failed:', error);\n process.exitCode = 1;\n }\n}\n\nvoid main();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/log/logger.ts","../src/config/Defaults.ts","../src/config/Configurator.ts","../src/db/Schema.ts","../src/db/Database.ts","../src/db/FilesRepo.ts","../src/db/SnapshotsRepo.ts","../src/queue/Outbox.ts","../src/clients/Clients.ts","../src/rules/RulesFetcher.ts","../src/rules/RulesCompiler.ts","../src/hash/Hasher.ts","../src/service/Bootstrap.ts","../src/fs/PathUtil.ts","../src/fs/Walker.ts","../src/sync/SnapshotProtocol.ts","../src/service/InitialSync.ts","../src/fs/Watcher.ts","../src/sync/HeartbeatProtocol.ts","../src/service/State.ts","../src/service/ServiceLoops.ts","../src/mcp/status.ts","../src/mcp/server.ts","../src/mcp-cli.ts"],"names":["fs","logger","path","createHash","fsSync","sleep","readSymlinkTarget","JobStatus"],"mappings":"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","file":"mcp-cli.js","sourcesContent":["import pino from 'pino';\n\nexport type Logger = pino.Logger;\n\nconst level = process.env.CODERULE_LOG_LEVEL ?? 'info';\n\nconst baseLogger = pino(\n {\n level,\n name: 'coderule-scanner',\n timestamp: pino.stdTimeFunctions.isoTime,\n },\n process.stderr,\n);\n\nexport const logger: Logger = baseLogger;\n\nexport function createLogger(scope: string): Logger {\n return baseLogger.child({ scope });\n}\n","export const DEFAULT_SNAPSHOT_DEBOUNCE_MS = 1000;\nexport const DEFAULT_HEARTBEAT_INTERVAL_MS = 60_000;\nexport const DEFAULT_HEARTBEAT_CHECK_INTERVAL_MS = 5_000;\nexport const DEFAULT_QUEUE_POLL_INTERVAL_MS = 500;\nexport const DEFAULT_HASH_BATCH_SIZE = 32;\nexport const DEFAULT_MAX_SNAPSHOT_ATTEMPTS = 5;\nexport const DEFAULT_HTTP_TIMEOUT_MS = 120_000;\nexport const DEFAULT_UPLOAD_CHUNK_SIZE = 1;\nexport const DEFAULT_MAX_QUERY_WAIT_MS = 50_000;\n","import { createHash } from 'crypto';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nimport envPaths from 'env-paths';\n\nimport type { ResolvedConfig } from '../types';\nimport { logger } from '../log/logger';\n\nimport {\n DEFAULT_HASH_BATCH_SIZE,\n DEFAULT_HEARTBEAT_CHECK_INTERVAL_MS,\n DEFAULT_HEARTBEAT_INTERVAL_MS,\n DEFAULT_MAX_SNAPSHOT_ATTEMPTS,\n DEFAULT_QUEUE_POLL_INTERVAL_MS,\n DEFAULT_SNAPSHOT_DEBOUNCE_MS,\n DEFAULT_HTTP_TIMEOUT_MS,\n DEFAULT_UPLOAD_CHUNK_SIZE,\n DEFAULT_MAX_QUERY_WAIT_MS,\n} from './Defaults';\n\nconst DEFAULT_RETRIEVAL_FORMATTER: 'standard' | 'compact' = 'standard';\n\nconst DEFAULTS: Pick<\n ResolvedConfig,\n | 'snapshotDebounceMs'\n | 'heartbeatIntervalMs'\n | 'heartbeatCheckIntervalMs'\n | 'queuePollIntervalMs'\n | 'hashBatchSize'\n | 'maxSnapshotAttempts'\n> = {\n snapshotDebounceMs: DEFAULT_SNAPSHOT_DEBOUNCE_MS,\n heartbeatIntervalMs: DEFAULT_HEARTBEAT_INTERVAL_MS,\n heartbeatCheckIntervalMs: DEFAULT_HEARTBEAT_CHECK_INTERVAL_MS,\n queuePollIntervalMs: DEFAULT_QUEUE_POLL_INTERVAL_MS,\n hashBatchSize: DEFAULT_HASH_BATCH_SIZE,\n maxSnapshotAttempts: DEFAULT_MAX_SNAPSHOT_ATTEMPTS,\n};\n\nfunction normalizeRoot(root: string): string {\n const resolved = path.resolve(root);\n const normalized = path.normalize(resolved);\n return normalized.split(path.sep).join('/');\n}\n\nfunction sha256(input: string): string {\n return createHash('sha256').update(input).digest('hex');\n}\n\nfunction parseInteger(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const parsed = Number.parseInt(value, 10);\n if (Number.isNaN(parsed) || parsed <= 0) {\n throw new Error(`Invalid integer value: ${value}`);\n }\n return parsed;\n}\n\nfunction parseSecondsToMs(\n value: string | undefined,\n fallbackMs: number,\n): number {\n if (!value) return fallbackMs;\n const seconds = Number.parseInt(value, 10);\n if (Number.isNaN(seconds) || seconds <= 0) {\n throw new Error(`Invalid seconds value: ${value}`);\n }\n return seconds * 1000;\n}\n\nfunction parseFormatter(value: string | undefined): 'standard' | 'compact' {\n if (!value) return DEFAULT_RETRIEVAL_FORMATTER;\n const normalized = value.toLowerCase();\n if (normalized === 'standard' || normalized === 'compact') {\n return normalized;\n }\n throw new Error(\n `Invalid CODERULE_RETRIEVAL_FORMATTER: ${value}. Expected \"standard\" or \"compact\"`,\n );\n}\n\nexport interface ResolveConfigParams {\n token?: string;\n}\n\nexport async function resolveConfig({\n token,\n}: ResolveConfigParams): Promise<ResolvedConfig> {\n const resolvedToken = token ?? process.env.CODERULE_TOKEN;\n if (!resolvedToken) {\n throw new Error(\n 'Missing token: provide params.token or CODERULE_TOKEN env',\n );\n }\n\n const rootCandidate = process.env.CODERULE_ROOT || process.cwd();\n const rootPath = path.resolve(rootCandidate);\n\n const normalized = normalizeRoot(rootPath);\n const rootId = sha256(normalized);\n\n const dataDir = process.env.CODERULE_DATA_DIR || envPaths('coderule').data;\n const watchDir = path.join(dataDir, 'watch');\n await fs.mkdir(watchDir, { recursive: true });\n const dbPath = path.join(watchDir, `${rootId}.sqlite`);\n\n const baseConfig: ResolvedConfig = {\n token: resolvedToken,\n rootPath,\n rootId,\n dbPath,\n dataDir,\n authBaseUrl: process.env.CODERULE_AUTH_URL,\n astBaseUrl: process.env.CODERULE_AST_URL,\n syncBaseUrl: process.env.CODERULE_SYNC_URL,\n retrievalBaseUrl: process.env.CODERULE_RETRIEVAL_URL,\n httpTimeout: undefined,\n snapshotDebounceMs: DEFAULTS.snapshotDebounceMs,\n heartbeatIntervalMs: DEFAULTS.heartbeatIntervalMs,\n heartbeatCheckIntervalMs: DEFAULTS.heartbeatCheckIntervalMs,\n queuePollIntervalMs: DEFAULTS.queuePollIntervalMs,\n hashBatchSize: DEFAULTS.hashBatchSize,\n maxSnapshotAttempts: DEFAULTS.maxSnapshotAttempts,\n retrievalFormatter: parseFormatter(\n process.env.CODERULE_RETRIEVAL_FORMATTER,\n ),\n uploadChunkSize: DEFAULT_UPLOAD_CHUNK_SIZE,\n maxQueryWaitMs: DEFAULT_MAX_QUERY_WAIT_MS,\n };\n\n if (process.env.CODERULE_SNAPSHOT_DEBOUNCE_MS) {\n baseConfig.snapshotDebounceMs = parseInteger(\n process.env.CODERULE_SNAPSHOT_DEBOUNCE_MS,\n baseConfig.snapshotDebounceMs,\n );\n }\n if (process.env.CODERULE_HEARTBEAT_INTERVAL_MS) {\n baseConfig.heartbeatIntervalMs = parseInteger(\n process.env.CODERULE_HEARTBEAT_INTERVAL_MS,\n baseConfig.heartbeatIntervalMs,\n );\n }\n if (process.env.CODERULE_HEARTBEAT_CHECK_INTERVAL_MS) {\n baseConfig.heartbeatCheckIntervalMs = parseInteger(\n process.env.CODERULE_HEARTBEAT_CHECK_INTERVAL_MS,\n baseConfig.heartbeatCheckIntervalMs,\n );\n }\n if (process.env.CODERULE_QUEUE_POLL_INTERVAL_MS) {\n baseConfig.queuePollIntervalMs = parseInteger(\n process.env.CODERULE_QUEUE_POLL_INTERVAL_MS,\n baseConfig.queuePollIntervalMs,\n );\n }\n if (process.env.CODERULE_HASH_BATCH_SIZE) {\n baseConfig.hashBatchSize = parseInteger(\n process.env.CODERULE_HASH_BATCH_SIZE,\n baseConfig.hashBatchSize,\n );\n }\n if (process.env.CODERULE_MAX_SNAPSHOT_ATTEMPTS) {\n baseConfig.maxSnapshotAttempts = parseInteger(\n process.env.CODERULE_MAX_SNAPSHOT_ATTEMPTS,\n baseConfig.maxSnapshotAttempts,\n );\n }\n\n baseConfig.httpTimeout = parseInteger(\n process.env.CODERULE_HTTP_TIMEOUT,\n DEFAULT_HTTP_TIMEOUT_MS,\n );\n\n if (process.env.CODERULE_UPLOAD_CHUNK_SIZE) {\n baseConfig.uploadChunkSize = parseInteger(\n process.env.CODERULE_UPLOAD_CHUNK_SIZE,\n baseConfig.uploadChunkSize,\n );\n }\n\n baseConfig.maxQueryWaitMs = parseSecondsToMs(\n process.env.CODERULE_MAX_WAIT_TIME,\n baseConfig.maxQueryWaitMs,\n );\n\n logger.debug(\n {\n rootPath,\n dbPath,\n dataDir,\n authBaseUrl: baseConfig.authBaseUrl,\n astBaseUrl: baseConfig.astBaseUrl,\n syncBaseUrl: baseConfig.syncBaseUrl,\n },\n 'Resolved configuration',\n );\n\n return baseConfig;\n}\n","export const FILES_SCHEMA = `\nCREATE TABLE IF NOT EXISTS files (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n rel_path TEXT NOT NULL,\n display_path TEXT NOT NULL,\n size INTEGER NOT NULL,\n mtime_ns INTEGER NOT NULL,\n mode INTEGER,\n ino TEXT,\n dev TEXT,\n is_symlink INTEGER NOT NULL DEFAULT 0,\n target TEXT,\n content_sha256 TEXT,\n service_file_hash TEXT,\n last_seen_ts INTEGER NOT NULL,\n hash_state TEXT NOT NULL,\n hash_owner TEXT,\n hash_lease_expires_at INTEGER,\n hash_started_at INTEGER,\n UNIQUE(rel_path)\n);\nCREATE INDEX IF NOT EXISTS idx_files_hash_state ON files(hash_state);\nCREATE INDEX IF NOT EXISTS idx_files_content_sha ON files(content_sha256);\nCREATE INDEX IF NOT EXISTS idx_files_service_hash ON files(service_file_hash);\n`;\n\nexport const SNAPSHOTS_SCHEMA = `\nCREATE TABLE IF NOT EXISTS snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n snapshot_hash TEXT NOT NULL,\n files_count INTEGER NOT NULL,\n total_size INTEGER NOT NULL,\n created_at INTEGER NOT NULL\n);\n`;\n","import Database from 'better-sqlite3';\nimport type { Logger } from 'pino';\n\nimport { FILES_SCHEMA, SNAPSHOTS_SCHEMA } from './Schema';\n\nfunction safeAlter(db: Database.Database, sql: string): void {\n try {\n db.exec(sql);\n } catch (error: any) {\n if (\n typeof error?.message === 'string' &&\n error.message.includes('duplicate column name')\n ) {\n return;\n }\n throw error;\n }\n}\n\nfunction applyMigrations(db: Database.Database, logger: Logger): void {\n const alterations = [\n 'ALTER TABLE files ADD COLUMN hash_owner TEXT',\n 'ALTER TABLE files ADD COLUMN hash_lease_expires_at INTEGER',\n 'ALTER TABLE files ADD COLUMN hash_started_at INTEGER',\n ];\n for (const sql of alterations) {\n try {\n safeAlter(db, sql);\n } catch (error) {\n logger.error({ err: error, sql }, 'Database migration failed');\n throw error;\n }\n }\n\n db.exec(\n 'CREATE INDEX IF NOT EXISTS idx_files_hash_lease ON files(hash_state, hash_lease_expires_at)',\n );\n}\n\nexport function openDatabase(\n dbPath: string,\n logger: Logger,\n): Database.Database {\n const db = new Database(dbPath, { verbose: undefined });\n logger.info({ dbPath }, 'Opened SQLite database');\n\n db.pragma('journal_mode = WAL');\n db.pragma('synchronous = NORMAL');\n db.pragma('busy_timeout = 5000');\n db.pragma('foreign_keys = ON');\n\n db.exec('BEGIN');\n try {\n db.exec(FILES_SCHEMA);\n db.exec(SNAPSHOTS_SCHEMA);\n db.exec('COMMIT');\n } catch (error) {\n db.exec('ROLLBACK');\n db.close();\n throw error;\n }\n\n applyMigrations(db, logger);\n\n return db;\n}\n","import type { Stats } from 'fs';\n\nimport type Database from 'better-sqlite3';\n\nimport type { FileRecord, HashState } from '../types';\n\nexport interface UpsertFileParams {\n relPath: string;\n displayPath: string;\n stats: Stats;\n isSymlink: boolean;\n symlinkTarget: string | null;\n}\n\nexport interface HashResult {\n id: number;\n contentSha256: string;\n serviceFileHash: string;\n}\n\nexport class FilesRepo {\n private readonly selectByRelPath = this.db.prepare(\n 'SELECT * FROM files WHERE rel_path = ?',\n );\n\n private readonly insertStmt = this.db.prepare(\n `INSERT INTO files (\n rel_path,\n display_path,\n size,\n mtime_ns,\n mode,\n ino,\n dev,\n is_symlink,\n target,\n content_sha256,\n service_file_hash,\n last_seen_ts,\n hash_state,\n hash_owner,\n hash_lease_expires_at,\n hash_started_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, ?, ?, NULL, NULL, NULL)`,\n );\n\n private readonly updateStmt = this.db.prepare(\n `UPDATE files SET\n display_path = ?,\n size = ?,\n mtime_ns = ?,\n mode = ?,\n ino = ?,\n dev = ?,\n is_symlink = ?,\n target = ?,\n content_sha256 = ?,\n service_file_hash = ?,\n last_seen_ts = ?,\n hash_state = ?,\n hash_owner = CASE WHEN ? = 'hashing' THEN hash_owner ELSE NULL END,\n hash_lease_expires_at = CASE WHEN ? = 'hashing' THEN hash_lease_expires_at ELSE NULL END,\n hash_started_at = CASE WHEN ? = 'hashing' THEN hash_started_at ELSE NULL END\n WHERE id = ?`,\n );\n\n private readonly markMissingStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'missing', content_sha256 = NULL, service_file_hash = NULL, last_seen_ts = ?,\n hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE rel_path = ?`,\n );\n\n private readonly markMissingPrefixStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'missing', content_sha256 = NULL, service_file_hash = NULL,\n hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE (rel_path = ? OR rel_path LIKE (? || '/%')) AND hash_state != 'missing'`,\n );\n\n private readonly markDirtyStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'dirty', last_seen_ts = ?,\n hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE rel_path = ?`,\n );\n\n private readonly claimDirtyStmt = this.db.prepare(\n `WITH candidates AS (\n SELECT id\n FROM files\n WHERE hash_state = 'dirty'\n ORDER BY last_seen_ts ASC, id ASC\n LIMIT @limit\n )\n UPDATE files\n SET hash_state = 'hashing',\n hash_owner = @owner,\n hash_lease_expires_at = @lease_expires_at,\n hash_started_at = @now\n WHERE id IN candidates\n RETURNING *`,\n );\n\n private readonly markDirtyByIdStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'dirty', hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE id = ?`,\n );\n\n private readonly applyHashesStmt = this.db.prepare(\n `UPDATE files\n SET content_sha256 = ?, service_file_hash = ?, hash_state = 'clean',\n hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE id = ?`,\n );\n\n private readonly requeueExpiredHashingStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'dirty', hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE hash_state = 'hashing'\n AND hash_lease_expires_at IS NOT NULL\n AND hash_lease_expires_at <= ?`,\n );\n\n private readonly resetHashingStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'dirty', hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE hash_state = 'hashing'`,\n );\n\n private readonly selectCleanSnapshotStmt = this.db.prepare(\n `SELECT rel_path, service_file_hash, size\n FROM files\n WHERE hash_state = 'clean' AND service_file_hash IS NOT NULL\n ORDER BY rel_path ASC`,\n );\n\n private readonly totalsStmt = this.db.prepare(\n `SELECT COUNT(*) AS files_count, COALESCE(SUM(size), 0) AS total_size\n FROM files\n WHERE hash_state = 'clean' AND service_file_hash IS NOT NULL`,\n );\n\n private readonly markMissingBeforeStmt = this.db.prepare(\n `UPDATE files\n SET hash_state = 'missing', content_sha256 = NULL, service_file_hash = NULL,\n hash_owner = NULL, hash_lease_expires_at = NULL, hash_started_at = NULL\n WHERE last_seen_ts < ? AND hash_state != 'missing'`,\n );\n\n private readonly countByStateStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM files WHERE hash_state = ?',\n );\n\n constructor(private readonly db: Database.Database) {}\n\n getByRelPath(relPath: string): FileRecord | undefined {\n return this.selectByRelPath.get(relPath) as FileRecord | undefined;\n }\n\n upsertFromStat(params: UpsertFileParams): HashState {\n const now = Date.now();\n const { relPath, displayPath, stats, isSymlink, symlinkTarget } = params;\n const existing = this.getByRelPath(relPath);\n const mtimeNs = Math.trunc(stats.mtimeMs * 1e6);\n const ino = typeof stats.ino === 'number' ? String(stats.ino) : null;\n const dev = typeof stats.dev === 'number' ? String(stats.dev) : null;\n const mode = typeof stats.mode === 'number' ? stats.mode : null;\n const isSymlinkInt = isSymlink ? 1 : 0;\n\n if (!existing) {\n this.insertStmt.run(\n relPath,\n displayPath,\n stats.size,\n mtimeNs,\n mode,\n ino,\n dev,\n isSymlinkInt,\n symlinkTarget,\n now,\n 'dirty',\n );\n return 'dirty';\n }\n\n let nextState: HashState = existing.hash_state as HashState;\n let nextContent: string | null = existing.content_sha256;\n let nextServiceHash: string | null = existing.service_file_hash;\n\n const changed =\n existing.size !== stats.size ||\n existing.mtime_ns !== mtimeNs ||\n existing.mode !== mode ||\n existing.ino !== ino ||\n existing.dev !== dev ||\n existing.is_symlink !== isSymlinkInt ||\n existing.target !== symlinkTarget;\n\n if (changed || existing.hash_state === 'missing') {\n nextState = 'dirty';\n nextContent = null;\n nextServiceHash = null;\n }\n\n this.updateStmt.run(\n displayPath,\n stats.size,\n mtimeNs,\n mode,\n ino,\n dev,\n isSymlinkInt,\n symlinkTarget,\n nextContent,\n nextServiceHash,\n now,\n nextState,\n nextState,\n nextState,\n nextState,\n existing.id,\n );\n\n return nextState;\n }\n\n markMissing(relPath: string): number {\n const now = Date.now();\n const result = this.markMissingStmt.run(now, relPath);\n return result.changes ?? 0;\n }\n\n markMissingByPrefix(prefix: string): number {\n const result = this.markMissingPrefixStmt.run(prefix, prefix);\n return result.changes ?? 0;\n }\n\n markDirty(relPath: string): void {\n const now = Date.now();\n this.markDirtyStmt.run(now, relPath);\n }\n\n markMissingBefore(timestamp: number): number {\n const result = this.markMissingBeforeStmt.run(timestamp);\n return result.changes ?? 0;\n }\n\n claimDirty(limit: number, owner: string, leaseMs: number): FileRecord[] {\n if (limit <= 0) {\n return [];\n }\n const now = Date.now();\n return this.claimDirtyStmt.all({\n limit,\n owner,\n lease_expires_at: now + leaseMs,\n now,\n }) as FileRecord[];\n }\n\n markDirtyByIds(ids: number[]): void {\n if (!ids.length) return;\n const tx = this.db.transaction((batch: number[]) => {\n for (const id of batch) {\n this.markDirtyByIdStmt.run(id);\n }\n });\n tx(ids);\n }\n\n applyHashResults(results: HashResult[]): void {\n if (!results.length) return;\n const tx = this.db.transaction((batch: HashResult[]) => {\n for (const { id, contentSha256, serviceFileHash } of batch) {\n this.applyHashesStmt.run(contentSha256, serviceFileHash, id);\n }\n });\n tx(results);\n }\n\n getCleanFilesForSnapshot(): Array<{\n rel_path: string;\n service_file_hash: string;\n size: number;\n }> {\n return this.selectCleanSnapshotStmt.all() as Array<{\n rel_path: string;\n service_file_hash: string;\n size: number;\n }>;\n }\n\n getTotalsForSnapshot(): { filesCount: number; totalSize: number } {\n const row = this.totalsStmt.get() as\n | { files_count: number; total_size: number }\n | undefined;\n return {\n filesCount: row?.files_count ?? 0,\n totalSize: row?.total_size ?? 0,\n };\n }\n\n countByState(state: HashState): number {\n const row = this.countByStateStmt.get(state) as\n | { count: number }\n | undefined;\n return row?.count ?? 0;\n }\n\n requeueExpiredHashing(now: number): number {\n const result = this.requeueExpiredHashingStmt.run(now);\n return result.changes ?? 0;\n }\n\n resetHashingStates(): number {\n const result = this.resetHashingStmt.run();\n return result.changes ?? 0;\n }\n}\n","import type Database from 'better-sqlite3';\n\nexport interface SnapshotRecord {\n id: number;\n snapshot_hash: string;\n files_count: number;\n total_size: number;\n created_at: number;\n}\n\nexport class SnapshotsRepo {\n private readonly insertStmt = this.db.prepare(\n `INSERT INTO snapshots (snapshot_hash, files_count, total_size, created_at)\n VALUES (?, ?, ?, ?)`,\n );\n\n private readonly selectLatestStmt = this.db.prepare(\n `SELECT * FROM snapshots ORDER BY created_at DESC LIMIT 1`,\n );\n\n constructor(private readonly db: Database.Database) {}\n\n insert(\n snapshotHash: string,\n filesCount: number,\n totalSize: number,\n createdAt: number,\n ): void {\n this.insertStmt.run(snapshotHash, filesCount, totalSize, createdAt);\n }\n\n getLatest(): SnapshotRecord | undefined {\n return this.selectLatestStmt.get() as SnapshotRecord | undefined;\n }\n}\n","import {\n Qulite,\n enqueueFsEvent,\n type PersistedJob,\n JobStatus,\n} from '@coderule/qulite';\nimport type Database from 'better-sqlite3';\nimport type { Logger } from 'pino';\n\nexport class Outbox {\n private readonly queue: Qulite;\n private readonly log: Logger;\n private readonly markKindStmt: Database.Statement;\n private readonly purgeLegacyStmt: Database.Statement;\n\n constructor(db: Database.Database, logger: Logger) {\n this.log = logger.child({ scope: 'outbox' });\n this.queue = new Qulite(db, {\n logger: this.log,\n defaultLeaseMs: 30_000,\n defaultMaxAttempts: 10,\n });\n this.markKindStmt = db.prepare(\n `UPDATE qulite_jobs SET kind = @kind WHERE dedupe_key = @dedupe_key`,\n );\n this.purgeLegacyStmt = db.prepare(\n `DELETE FROM qulite_jobs WHERE type = 'fs_control' AND (kind IS NULL OR kind = '')`,\n );\n const purged = this.purgeLegacyStmt.run().changes ?? 0;\n if (purged > 0) {\n this.log.warn({ purged }, 'Purged legacy fs_control jobs without kind');\n }\n\n // Log current queue counts to aid debugging when queue appears empty\n try {\n const counts = {\n pending: this.queue.countByStatus(JobStatus.Pending),\n processing: this.queue.countByStatus(JobStatus.Processing),\n done: this.queue.countByStatus(JobStatus.Done),\n failed: this.queue.countByStatus(JobStatus.Failed),\n };\n this.log.debug({ counts }, 'Outbox initialized');\n } catch {}\n }\n\n getQueue(): Qulite {\n return this.queue;\n }\n\n private markKind(dedupeKey: string, kind: string): void {\n this.markKindStmt.run({ dedupe_key: dedupeKey, kind });\n }\n\n enqueueSnapshot(rootId: string, delayMs = 0): void {\n const result = enqueueFsEvent(this.queue, {\n root_id: rootId,\n rel_path: '',\n kind: 'snapshot',\n delayMs,\n maxAttempts: 20,\n data: { root_id: rootId, kind: 'snapshot' },\n });\n this.markKind(`snapshot:${rootId}`, 'snapshot');\n if (result.changes > 0) {\n this.log.debug({ rootId }, 'Enqueued snapshot job');\n }\n }\n\n enqueueHeartbeat(rootId: string, delayMs = 0): void {\n const result = enqueueFsEvent(this.queue, {\n root_id: rootId,\n rel_path: '',\n kind: 'heartbeat',\n delayMs,\n maxAttempts: 5,\n data: { root_id: rootId, kind: 'heartbeat' },\n });\n this.markKind(`heartbeat:${rootId}`, 'heartbeat');\n if (result.changes > 0) {\n this.log.debug({ rootId }, 'Enqueued heartbeat job');\n }\n }\n\n claimFsControlJob(\n leaseOwner: string,\n leaseMs = 30_000,\n ): PersistedJob | undefined {\n return this.queue.claimNext({ type: 'fs_control', leaseOwner, leaseMs });\n }\n\n ack(jobId: number, leaseOwner: string): boolean {\n return this.queue.ack(jobId, leaseOwner);\n }\n\n retry(jobId: number, leaseOwner: string, delayMs?: number): boolean {\n return this.queue.retry(jobId, leaseOwner, delayMs);\n }\n\n fail(jobId: number, leaseOwner: string, error?: string): boolean {\n return this.queue.fail(jobId, leaseOwner, error);\n }\n\n requeueTimedOut(): number {\n return this.queue.requeueTimedOut();\n }\n}\n","import { CoderuleClients } from '@coderule/clients';\nimport type { Logger } from 'pino';\n\nimport type { ResolvedConfig } from '../types';\n\nfunction serviceConfig(\n baseUrl: string | undefined,\n timeout: number | undefined,\n): { baseUrl?: string; timeout?: number } | undefined {\n if (baseUrl === undefined && timeout === undefined) {\n return undefined;\n }\n const config: { baseUrl?: string; timeout?: number } = {};\n if (baseUrl !== undefined) {\n config.baseUrl = baseUrl;\n }\n if (timeout !== undefined) {\n config.timeout = timeout;\n }\n return config;\n}\n\nexport function createClients(\n config: ResolvedConfig,\n logger: Logger,\n): CoderuleClients {\n const clientLogger = logger.child({ scope: 'clients' });\n const httpTimeout = config.httpTimeout;\n\n const clients = new CoderuleClients({\n token: config.token,\n auth: serviceConfig(config.authBaseUrl, httpTimeout),\n ast: serviceConfig(config.astBaseUrl, httpTimeout),\n sync: serviceConfig(config.syncBaseUrl, httpTimeout),\n retrieval: serviceConfig(config.retrievalBaseUrl, httpTimeout),\n jwtFactory: {\n onTokenRefreshed: (info) => {\n clientLogger.debug(\n {\n expiresAt: new Date(info.expiresAt).toISOString(),\n serverUrl: info.serverUrl,\n },\n 'JWT refreshed',\n );\n },\n },\n });\n\n return clients;\n}\n","import type { CoderuleClients, VisitorRulesV2 } from '@coderule/clients';\nimport type { Logger } from 'pino';\n\nexport async function fetchVisitorRules(\n clients: CoderuleClients,\n logger: Logger,\n): Promise<VisitorRulesV2> {\n const fetchLogger = logger.child({ scope: 'rules' });\n fetchLogger.info('Fetching visitor rules v2 from AST service');\n const rules = await clients.ast.getVisitorRulesV2();\n fetchLogger.info(\n {\n include_extensions: rules.include_extensions.length,\n include_filenames: rules.include_filenames.length,\n exclude_dirnames: rules.exclude_dirnames.length,\n },\n 'Fetched visitor rules',\n );\n return rules;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport type { Stats } from 'fs';\n\nimport { ASTHttpClient, type VisitorRulesV2 } from '@coderule/clients';\n\nimport type { CompiledRulesBundle } from '../types';\nimport { logger } from '../log/logger';\n\nfunction toPosix(input: string): string {\n return input.split(path.sep).join('/');\n}\n\nfunction getLowerBasename(input: string): string {\n const base = input.split('/').pop();\n return (base ?? '').toLowerCase();\n}\n\nfunction getLowerExt(basename: string): string {\n const idx = basename.lastIndexOf('.');\n if (idx < 0) return '';\n return basename.slice(idx).toLowerCase();\n}\n\nexport function compileRulesBundle(rules: VisitorRulesV2): CompiledRulesBundle {\n const compiled = ASTHttpClient.compileRulesV2(rules);\n const basePredicate = ASTHttpClient.buildIgnoredPredicate(compiled);\n const predicate = (fullPath: string, stats?: Stats) => {\n let info = stats;\n if (!info) {\n logger.debug({ path: fullPath }, 'Predicate fallback lstat');\n try {\n info = fs.lstatSync(fullPath);\n } catch (error) {\n logger.warn(\n { err: error, path: fullPath },\n 'Failed to lstat path for rules predicate',\n );\n return false;\n }\n }\n return basePredicate(fullPath, info);\n };\n return {\n rules,\n compiled,\n predicate,\n };\n}\n\nexport function shouldIncludeFile(\n relPath: string,\n stats: Stats,\n bundle: CompiledRulesBundle,\n): boolean {\n if (stats.isDirectory()) return false;\n const posixRel = toPosix(relPath);\n if (bundle.compiled.dirRe.test(posixRel)) {\n return false;\n }\n const basename = getLowerBasename(posixRel);\n if (bundle.compiled.names.has(basename)) {\n return true;\n }\n const ext = getLowerExt(basename);\n return bundle.compiled.exts.has(ext);\n}\n\nexport function shouldPruneDirectory(\n relPath: string,\n bundle: CompiledRulesBundle,\n): boolean {\n const posixRel = toPosix(relPath);\n return bundle.compiled.dirRe.test(posixRel);\n}\n\nexport function buildWatcherIgnored(bundle: CompiledRulesBundle) {\n return (fullPath: string, stats?: Stats) => bundle.predicate(fullPath, stats);\n}\n","import fs from 'fs/promises';\nimport fsSync from 'fs';\nimport path from 'path';\nimport { Worker } from 'worker_threads';\nimport type { WorkerOptions } from 'worker_threads';\nimport { createHash } from 'crypto';\n\nimport type { Logger } from 'pino';\n\nimport type { FileRecord } from '../types';\nimport type { FilesRepo, HashResult } from '../db/FilesRepo';\n\ninterface HashMessage {\n type: 'hash';\n taskId: number;\n absPath: string;\n relPath: string;\n}\n\ninterface HashResultMessage {\n type: 'hash-result';\n taskId: number;\n contentSha256: string;\n serviceFileHash: string;\n}\n\ninterface HashErrorMessage {\n type: 'hash-error';\n taskId: number;\n error: string;\n code?: string;\n}\n\ntype WorkerMessage = HashResultMessage | HashErrorMessage;\n\ntype PendingTask = {\n resolve(value: { contentSha256: string; serviceFileHash: string }): void;\n reject(reason: Error): void;\n};\n\nclass HashWorker {\n private readonly worker: Worker;\n private readonly pending = new Map<number, PendingTask>();\n private nextTaskId = 1;\n private readonly log: Logger;\n private terminating = false;\n\n constructor(logger: Logger) {\n this.log = logger.child({ scope: 'hash-worker' });\n const workerUrl = new URL('./hash/WorkerThread.js', import.meta.url);\n const execArgv = process.execArgv.filter(\n (arg) => !arg.startsWith('--input-type'),\n );\n const workerOptions: WorkerOptions & { type?: 'module' | 'commonjs' } = {\n name: 'coderule-hasher',\n execArgv,\n };\n if (workerUrl.pathname.endsWith('.js')) {\n workerOptions.type = 'module';\n }\n this.worker = new Worker(workerUrl, workerOptions);\n this.worker.on('message', (message: WorkerMessage) =>\n this.onMessage(message),\n );\n this.worker.on('error', (error) => this.handleWorkerError(error));\n this.worker.on('exit', (code) => {\n if (code !== 0 && !this.terminating) {\n this.handleWorkerError(\n new Error(`Hasher worker exited with code ${code}`),\n );\n }\n });\n }\n\n async terminate(): Promise<void> {\n this.terminating = true;\n for (const [, pending] of this.pending) {\n pending.reject(new Error('Hasher worker terminated'));\n }\n this.pending.clear();\n await this.worker.terminate();\n }\n\n private onMessage(message: WorkerMessage) {\n const pending = this.pending.get(message.taskId);\n if (!pending) {\n this.log.warn(\n { taskId: message.taskId },\n 'Received message for unknown task',\n );\n return;\n }\n this.pending.delete(message.taskId);\n if (message.type === 'hash-result') {\n pending.resolve({\n contentSha256: message.contentSha256,\n serviceFileHash: message.serviceFileHash,\n });\n } else {\n const error = new Error(message.error);\n (error as any).code = message.code;\n pending.reject(error);\n }\n }\n\n private handleWorkerError(error: Error) {\n this.log.error({ err: error }, 'Hasher worker error');\n for (const [, pending] of this.pending) {\n pending.reject(error);\n }\n this.pending.clear();\n }\n\n compute(\n absPath: string,\n relPath: string,\n ): Promise<{ contentSha256: string; serviceFileHash: string }> {\n const taskId = this.nextTaskId++;\n const payload: HashMessage = {\n type: 'hash',\n taskId,\n absPath,\n relPath,\n };\n return new Promise((resolve, reject) => {\n this.pending.set(taskId, { resolve, reject });\n this.worker.postMessage(payload);\n });\n }\n}\n\nexport interface HasherOptions {\n rootPath: string;\n filesRepo: FilesRepo;\n logger: Logger;\n}\n\nexport class Hasher {\n private worker: HashWorker | null = null;\n private readonly log: Logger;\n private inlineMode: boolean;\n private readonly ownerId: string;\n private readonly leaseDurationMs: number;\n\n constructor(private readonly options: HasherOptions) {\n this.log = options.logger.child({ scope: 'hasher' });\n this.inlineMode = process.env.CODERULE_HASHER_INLINE === '1';\n this.ownerId = `hasher-${process.pid}-${Date.now()}`;\n const leaseFromEnv = process.env.CODERULE_HASH_LEASE_MS\n ? Number.parseInt(process.env.CODERULE_HASH_LEASE_MS, 10)\n : Number.NaN;\n this.leaseDurationMs =\n Number.isFinite(leaseFromEnv) && leaseFromEnv > 0 ? leaseFromEnv : 30_000;\n if (!this.inlineMode) {\n try {\n this.worker = new HashWorker(this.log);\n } catch (error) {\n this.log.warn(\n { err: error },\n 'Failed to start hasher worker, falling back to inline hashing',\n );\n this.worker = null;\n this.inlineMode = true;\n }\n }\n }\n\n async close(): Promise<void> {\n if (this.worker) {\n await this.worker.terminate();\n }\n }\n\n private resolveAbsolutePath(record: FileRecord): string {\n if (path.isAbsolute(record.display_path)) {\n return record.display_path;\n }\n return path.join(this.options.rootPath, record.rel_path);\n }\n\n private async ensureExists(\n absPath: string,\n record: FileRecord,\n ): Promise<boolean> {\n try {\n await fs.access(absPath);\n return true;\n } catch (error: any) {\n this.log.warn(\n { err: error, relPath: record.rel_path },\n 'File missing before hashing',\n );\n this.options.filesRepo.markMissing(record.rel_path);\n return false;\n }\n }\n\n private async computeHash(\n absPath: string,\n relPath: string,\n ): Promise<{ contentSha256: string; serviceFileHash: string }> {\n if (this.inlineMode || !this.worker) {\n return this.hashInline(absPath, relPath);\n }\n\n return this.worker.compute(absPath, relPath);\n }\n\n private async hashInline(\n absPath: string,\n relPath: string,\n ): Promise<{ contentSha256: string; serviceFileHash: string }> {\n return new Promise((resolve, reject) => {\n const content = createHash('sha256');\n const service = createHash('sha256');\n service.update(relPath);\n service.update('\\n');\n\n const stream = fsSync.createReadStream(absPath);\n stream.on('data', (chunk) => {\n content.update(chunk);\n service.update(chunk);\n });\n stream.on('error', (error) => {\n reject(error);\n });\n stream.on('end', () => {\n resolve({\n contentSha256: content.digest('hex'),\n serviceFileHash: service.digest('hex'),\n });\n });\n });\n }\n\n async processBatch(limit: number): Promise<boolean> {\n const now = Date.now();\n const requeued = this.options.filesRepo.requeueExpiredHashing(now);\n if (requeued > 0) {\n this.log.debug({ requeued }, 'Requeued expired hashing leases');\n }\n\n const dirty = this.options.filesRepo.claimDirty(\n limit,\n this.ownerId,\n this.leaseDurationMs,\n );\n if (dirty.length > 0) {\n this.log.debug({ count: dirty.length }, 'Hashing claimed files');\n }\n if (dirty.length === 0) {\n return false;\n }\n const successes: HashResult[] = [];\n const failures: number[] = [];\n\n for (const record of dirty) {\n const absPath = this.resolveAbsolutePath(record);\n const exists = await this.ensureExists(absPath, record);\n if (!exists) {\n continue;\n }\n\n try {\n const result = await this.computeHash(absPath, record.rel_path);\n successes.push({\n id: record.id,\n contentSha256: result.contentSha256,\n serviceFileHash: result.serviceFileHash,\n });\n } catch (error: any) {\n if (error?.code === 'ENOENT') {\n this.log.debug(\n { relPath: record.rel_path },\n 'File disappeared during hashing',\n );\n this.options.filesRepo.markMissing(record.rel_path);\n } else {\n this.log.warn(\n { err: error, relPath: record.rel_path },\n 'Failed to hash file',\n );\n failures.push(record.id);\n }\n }\n }\n\n if (successes.length) {\n this.log.debug({ count: successes.length }, 'Hashing succeeded');\n this.options.filesRepo.applyHashResults(successes);\n }\n if (failures.length) {\n this.log.warn({ count: failures.length }, 'Hashing failed for files');\n this.options.filesRepo.markDirtyByIds(failures);\n }\n\n return true;\n }\n}\n","import type { Logger } from 'pino';\n\nimport { logger as baseLogger } from '../log/logger';\nimport { resolveConfig } from '../config/Configurator';\nimport { openDatabase } from '../db/Database';\nimport { FilesRepo } from '../db/FilesRepo';\nimport { SnapshotsRepo } from '../db/SnapshotsRepo';\nimport { Outbox } from '../queue/Outbox';\nimport { createClients } from '../clients/Clients';\nimport { fetchVisitorRules } from '../rules/RulesFetcher';\nimport { compileRulesBundle } from '../rules/RulesCompiler';\nimport { Hasher } from '../hash/Hasher';\nimport type {\n CompiledRulesBundle,\n ResolvedConfig,\n RuntimeContext,\n} from '../types';\n\nexport interface BootstrapResult extends RuntimeContext {\n filesRepo: FilesRepo;\n snapshotsRepo: SnapshotsRepo;\n hasher: Hasher;\n}\n\nfunction createServiceLogger(): Logger {\n return baseLogger.child({ scope: 'service' });\n}\n\nexport async function bootstrap(params: {\n token?: string;\n}): Promise<BootstrapResult> {\n const config: ResolvedConfig = await resolveConfig(params);\n const logger = createServiceLogger();\n\n const db = openDatabase(config.dbPath, logger.child({ scope: 'db' }));\n const filesRepo = new FilesRepo(db);\n const recovered = filesRepo.resetHashingStates();\n if (recovered > 0) {\n logger.info({ recovered }, 'Recovered lingering hashing leases');\n }\n const snapshotsRepo = new SnapshotsRepo(db);\n const outbox = new Outbox(db, logger);\n const clients = createClients(config, logger);\n\n const rules = await fetchVisitorRules(clients, logger);\n const compiled: CompiledRulesBundle = compileRulesBundle(rules);\n\n const hasher = new Hasher({ rootPath: config.rootPath, filesRepo, logger });\n\n const runtime: BootstrapResult = {\n config,\n logger,\n db,\n outbox,\n clients,\n rules: compiled,\n filesRepo,\n snapshotsRepo,\n hasher,\n };\n\n return runtime;\n}\n","import path from 'path';\n\nexport function toPosixRelative(root: string, target: string): string {\n const rel = path.relative(root, target);\n if (!rel || rel === '') return '';\n return rel.split(path.sep).join('/');\n}\n\nexport function resolveDisplayPath(target: string): string {\n return path.resolve(target);\n}\n\nexport function isInsideRoot(root: string, target: string): boolean {\n const rel = path.relative(root, target);\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n}\n","import fs from 'fs/promises';\nimport path from 'path';\n\nimport type { Logger } from 'pino';\n\nimport type { CompiledRulesBundle, WalkerStats } from '../types';\nimport {\n shouldIncludeFile,\n shouldPruneDirectory,\n} from '../rules/RulesCompiler';\nimport type { FilesRepo } from '../db/FilesRepo';\n\nimport { toPosixRelative } from './PathUtil';\n\nconst EMPTY_STATS: WalkerStats = {\n processed: 0,\n skipped: 0,\n dirtied: 0,\n missing: 0,\n};\n\nfunction cloneStats(stats: WalkerStats): WalkerStats {\n return { ...stats };\n}\n\nexport interface InventoryOptions {\n rootPath: string;\n bundle: CompiledRulesBundle;\n filesRepo: FilesRepo;\n logger: Logger;\n}\n\nasync function readSymlinkTarget(\n absPath: string,\n log: Logger,\n): Promise<string | null> {\n try {\n return await fs.readlink(absPath);\n } catch (error: any) {\n log.warn({ err: error, path: absPath }, 'Failed to read symlink target');\n return null;\n }\n}\n\nasync function walkDirectory(\n current: string,\n opts: InventoryOptions,\n stats: WalkerStats,\n): Promise<void> {\n const dirLogger = opts.logger;\n let dirents;\n try {\n dirents = await fs.readdir(current, { withFileTypes: true });\n } catch (error: any) {\n dirLogger.warn({ err: error, path: current }, 'Failed to read directory');\n return;\n }\n\n for (const dirent of dirents) {\n const absPath = path.join(current, dirent.name);\n const relPath = toPosixRelative(opts.rootPath, absPath);\n\n if (dirent.isDirectory()) {\n if (shouldPruneDirectory(relPath, opts.bundle)) {\n stats.skipped += 1;\n continue;\n }\n await walkDirectory(absPath, opts, stats);\n continue;\n }\n\n if (dirent.isSymbolicLink() || dirent.isFile()) {\n let stat;\n try {\n stat = await fs.lstat(absPath);\n } catch (error: any) {\n dirLogger.warn({ err: error, path: absPath }, 'Failed to stat file');\n continue;\n }\n\n stats.processed += 1;\n if (!shouldIncludeFile(relPath, stat, opts.bundle)) {\n stats.skipped += 1;\n continue;\n }\n\n const target = dirent.isSymbolicLink()\n ? await readSymlinkTarget(absPath, dirLogger)\n : null;\n const state = opts.filesRepo.upsertFromStat({\n relPath,\n displayPath: absPath,\n stats: stat,\n isSymlink: dirent.isSymbolicLink(),\n symlinkTarget: target,\n });\n if (state === 'dirty') {\n stats.dirtied += 1;\n }\n continue;\n }\n\n // Non-regular file types (sockets, FIFOs, etc.)\n stats.skipped += 1;\n }\n}\n\nexport async function runInventory(\n opts: InventoryOptions,\n): Promise<WalkerStats> {\n const stats = cloneStats(EMPTY_STATS);\n const startedAt = Date.now();\n await walkDirectory(opts.rootPath, opts, stats);\n const missing = opts.filesRepo.markMissingBefore(startedAt);\n stats.missing = missing;\n opts.logger.info({ ...stats }, 'Completed initial inventory');\n return stats;\n}\n","import fs from 'fs/promises';\nimport path from 'path';\n\nimport { SyncHttpClient } from '@coderule/clients';\nimport type { Logger } from 'pino';\n\nimport type { FilesRepo } from '../db/FilesRepo';\nimport type { SnapshotsRepo } from '../db/SnapshotsRepo';\nimport type { InitialSyncResult, SnapshotComputation } from '../types';\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function computeSnapshot(filesRepo: FilesRepo): SnapshotComputation {\n const files = filesRepo.getCleanFilesForSnapshot();\n const hashes = files\n .map((file) => file.service_file_hash)\n .filter((hash): hash is string => typeof hash === 'string');\n const snapshotHash = SyncHttpClient.calculateSnapshotHash([...hashes].sort());\n const { filesCount, totalSize } = filesRepo.getTotalsForSnapshot();\n return {\n snapshotHash,\n files: files.map((file) => ({\n file_path: file.rel_path,\n file_hash: file.service_file_hash,\n })),\n filesCount,\n totalSize,\n };\n}\n\nasync function withRetries<T>(\n op: () => Promise<T>,\n logger: Logger,\n context: Record<string, unknown>,\n maxAttempts: number,\n): Promise<T> {\n let attempt = 0;\n // First attempt + (maxAttempts - 1) retries\n while (true) {\n try {\n return await op();\n } catch (err: any) {\n attempt += 1;\n if (attempt >= maxAttempts) {\n logger.error(\n { err, ...context, attempt },\n 'Operation failed after retries',\n );\n throw err;\n }\n const delay = Math.min(15_000, 1_000 * 2 ** (attempt - 1));\n logger.warn(\n { err, ...context, attempt, delay },\n 'Operation failed; retrying',\n );\n await sleep(delay);\n }\n }\n}\n\nasync function uploadMissing(\n rootPath: string,\n missing: Array<{ file_path: string; file_hash: string }> | undefined,\n syncClient: SyncHttpClient,\n logger: Logger,\n maxAttempts: number,\n chunkSize = 1,\n): Promise<void> {\n if (!missing || missing.length === 0) return;\n\n const total = missing.length;\n const chunks: Array<Array<{ file_path: string; file_hash: string }>> = [];\n for (let i = 0; i < total; i += chunkSize) {\n chunks.push(missing.slice(i, i + chunkSize));\n }\n\n for (let idx = 0; idx < chunks.length; idx++) {\n const list = chunks[idx]!;\n const map = new Map<string, { path: string; content: Buffer }>();\n for (const missingFile of list) {\n const absPath = path.join(rootPath, missingFile.file_path);\n try {\n const buffer = await fs.readFile(absPath);\n map.set(missingFile.file_hash, {\n path: missingFile.file_path,\n content: buffer,\n });\n } catch (error: any) {\n logger.warn(\n { err: error, relPath: missingFile.file_path },\n 'Failed to read missing file content',\n );\n }\n }\n if (map.size === 0) continue;\n\n await withRetries(\n () => syncClient.uploadFileContent(map),\n logger,\n {\n op: 'uploadFileContent',\n chunkIndex: idx + 1,\n chunks: chunks.length,\n files: map.size,\n },\n maxAttempts,\n );\n }\n}\n\nasync function ensureSnapshotCreated(\n rootPath: string,\n computation: SnapshotComputation,\n syncClient: SyncHttpClient,\n logger: Logger,\n options?: { maxAttempts?: number; uploadChunkSize?: number },\n): Promise<void> {\n const { snapshotHash, files } = computation;\n const maxAttempts = options?.maxAttempts ?? 5;\n const uploadChunkSize = options?.uploadChunkSize ?? 1;\n\n let status = await withRetries(\n () => syncClient.checkSnapshotStatus(snapshotHash),\n logger,\n { op: 'checkSnapshotStatus', snapshotHash },\n maxAttempts,\n );\n if (status.status === 'READY') {\n logger.info({ snapshotHash }, 'Snapshot already READY');\n return;\n }\n\n if (status.status === 'NOT_FOUND' || status.status === 'MISSING_CONTENT') {\n status = await withRetries(\n () => syncClient.createSnapshot(snapshotHash, files),\n logger,\n { op: 'createSnapshot', snapshotHash },\n maxAttempts,\n );\n }\n\n if (status.status === 'MISSING_CONTENT' && status.missing_files?.length) {\n logger.info(\n { missing: status.missing_files.length },\n 'Uploading missing file content',\n );\n await uploadMissing(\n rootPath,\n status.missing_files,\n syncClient,\n logger,\n maxAttempts,\n uploadChunkSize,\n );\n status = await withRetries(\n () => syncClient.createSnapshot(snapshotHash, files),\n logger,\n { op: 'createSnapshot', snapshotHash },\n maxAttempts,\n );\n }\n\n let attempt = 0;\n while (status.status !== 'READY') {\n if (status.status === 'FAILED') {\n throw new Error(`Snapshot failed processing: ${JSON.stringify(status)}`);\n }\n const delay = Math.min(5_000, 1_000 * Math.max(1, 2 ** attempt));\n await sleep(delay);\n attempt += 1;\n status = await withRetries(\n () => syncClient.checkSnapshotStatus(snapshotHash),\n logger,\n { op: 'checkSnapshotStatus', snapshotHash },\n maxAttempts,\n );\n }\n\n logger.info({ snapshotHash }, 'Snapshot READY');\n}\n\nexport async function publishSnapshot(\n rootPath: string,\n filesRepo: FilesRepo,\n snapshotsRepo: SnapshotsRepo,\n syncClient: SyncHttpClient,\n logger: Logger,\n options?: { maxAttempts?: number; uploadChunkSize?: number },\n): Promise<InitialSyncResult> {\n const computation = computeSnapshot(filesRepo);\n await ensureSnapshotCreated(\n rootPath,\n computation,\n syncClient,\n logger,\n options,\n );\n const createdAt = Date.now();\n snapshotsRepo.insert(\n computation.snapshotHash,\n computation.filesCount,\n computation.totalSize,\n createdAt,\n );\n return {\n snapshotHash: computation.snapshotHash,\n filesCount: computation.filesCount,\n totalSize: computation.totalSize,\n status: 'READY',\n createdAt,\n };\n}\n","import { runInventory } from '../fs/Walker';\nimport { publishSnapshot, computeSnapshot } from '../sync/SnapshotProtocol';\nimport type { InitialSyncResult } from '../types';\n\nimport type { BootstrapResult } from './Bootstrap';\n\nexport async function runInitialSyncPipeline(\n runtime: BootstrapResult,\n options?: { blockUntilReady?: boolean },\n): Promise<InitialSyncResult> {\n const inventoryLogger = runtime.logger.child({ scope: 'inventory' });\n await runInventory({\n rootPath: runtime.config.rootPath,\n bundle: runtime.rules,\n filesRepo: runtime.filesRepo,\n logger: inventoryLogger,\n });\n\n const hashLogger = runtime.logger.child({ scope: 'hash' });\n let hadWork = true;\n while (hadWork) {\n hadWork = await runtime.hasher.processBatch(runtime.config.hashBatchSize);\n if (hadWork) {\n hashLogger.debug('Hasher processed batch');\n }\n }\n\n // In blocking mode (default), ensure remote snapshot is READY before returning\n if (options?.blockUntilReady !== false) {\n const syncLogger = runtime.logger.child({ scope: 'snapshot' });\n const result = await publishSnapshot(\n runtime.config.rootPath,\n runtime.filesRepo,\n runtime.snapshotsRepo,\n runtime.clients.sync,\n syncLogger,\n {\n maxAttempts: runtime.config.maxSnapshotAttempts,\n uploadChunkSize: runtime.config.uploadChunkSize,\n },\n );\n return result;\n }\n\n // Non-blocking mode for continuous service: record snapshot locally and\n // enqueue a job to finish remote processing in the background.\n const computation = computeSnapshot(runtime.filesRepo);\n const createdAt = Date.now();\n runtime.snapshotsRepo.insert(\n computation.snapshotHash,\n computation.filesCount,\n computation.totalSize,\n createdAt,\n );\n runtime.outbox.enqueueSnapshot(runtime.config.rootId, 0);\n return {\n snapshotHash: computation.snapshotHash,\n filesCount: computation.filesCount,\n totalSize: computation.totalSize,\n status: 'READY',\n createdAt,\n };\n}\n","import type { Stats } from 'fs';\n\nimport chokidar, { type FSWatcher } from 'chokidar';\nimport type { Logger } from 'pino';\n\nexport type WatchEvent = 'add' | 'change' | 'unlink' | 'unlinkDir' | 'addDir';\n\nexport interface WatcherHandlers {\n onEvent(\n event: WatchEvent,\n absPath: string,\n stats?: Stats,\n ): Promise<void> | void;\n onReady?(): void;\n}\n\nexport interface WatcherOptions {\n rootPath: string;\n ignored: (path: string, stats?: Stats) => boolean;\n logger: Logger;\n handlers: WatcherHandlers;\n}\n\nasync function createChokidarWatcher(\n options: WatcherOptions,\n usePolling: boolean,\n): Promise<{ watcher: FSWatcher; mode: 'native' | 'polling' }> {\n const log = options.logger.child({\n scope: 'watcher',\n mode: usePolling ? 'polling' : 'native',\n });\n const watcher = chokidar.watch(options.rootPath, {\n ignored: options.ignored,\n ignoreInitial: true,\n persistent: true,\n awaitWriteFinish: {\n stabilityThreshold: 1_500,\n pollInterval: 100,\n },\n atomic: true,\n usePolling,\n interval: usePolling ? 200 : undefined,\n binaryInterval: usePolling ? 200 : undefined,\n alwaysStat: true,\n cwd: undefined,\n depth: undefined,\n });\n\n await new Promise<void>((resolve, reject) => {\n const onReady = () => {\n watcher.off('error', onError);\n log.info('Watcher ready');\n resolve();\n };\n const onError = (err: unknown) => {\n watcher.off('ready', onReady);\n reject(err);\n };\n watcher.once('ready', onReady);\n watcher.once('error', onError);\n });\n\n return { watcher, mode: usePolling ? 'polling' : 'native' };\n}\n\nfunction attachHandlers(watcher: FSWatcher, options: WatcherOptions): void {\n const { handlers, logger } = options;\n\n const handle = (event: WatchEvent, filePath: string, stats?: Stats) => {\n logger.debug({ event, filePath }, 'Watcher raw event');\n Promise.resolve(handlers.onEvent(event, filePath, stats)).catch((error) => {\n logger.error(\n { err: error, event, path: filePath },\n 'Watcher handler failed',\n );\n });\n };\n\n watcher.on('add', (filePath, stats) => handle('add', filePath, stats));\n watcher.on('change', (filePath, stats) => handle('change', filePath, stats));\n watcher.on('unlink', (filePath) => handle('unlink', filePath));\n watcher.on('addDir', (dirPath) => handle('addDir', dirPath));\n watcher.on('unlinkDir', (dirPath) => handle('unlinkDir', dirPath));\n watcher.on('error', (error) => {\n logger.error({ err: error }, 'Watcher error');\n });\n if (handlers.onReady) {\n handlers.onReady();\n logger.debug('Watcher ready callback executed');\n }\n}\n\nexport async function startWatcher(options: WatcherOptions): Promise<{\n watcher: FSWatcher;\n mode: 'native' | 'polling';\n}> {\n try {\n const result = await createChokidarWatcher(options, false);\n attachHandlers(result.watcher, options);\n return result;\n } catch (error) {\n options.logger.warn(\n { err: error },\n 'Native watcher failed, falling back to polling',\n );\n const result = await createChokidarWatcher(options, true);\n attachHandlers(result.watcher, options);\n return result;\n }\n}\n","import type { Logger } from 'pino';\nimport type { SyncHttpClient } from '@coderule/clients';\n\nimport type { SnapshotsRepo } from '../db/SnapshotsRepo';\n\nexport async function sendHeartbeat(\n rootId: string,\n snapshotsRepo: SnapshotsRepo,\n syncClient: SyncHttpClient,\n logger: Logger,\n): Promise<void> {\n const latest = snapshotsRepo.getLatest();\n if (latest) {\n await syncClient.checkSnapshotStatus(latest.snapshot_hash);\n }\n logger.debug({ rootId }, 'Heartbeat sent');\n}\n","export class ServiceState {\n lastChangeAt = Date.now();\n lastSnapshotReadyAt = Date.now();\n lastHeartbeatEnqueuedAt = 0;\n\n updateChange(timestamp = Date.now()) {\n this.lastChangeAt = timestamp;\n }\n\n updateSnapshotReady(timestamp = Date.now()) {\n this.lastSnapshotReadyAt = timestamp;\n }\n\n updateHeartbeat(timestamp = Date.now()) {\n this.lastHeartbeatEnqueuedAt = timestamp;\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport type { Stats } from 'fs';\n\nimport type pino from 'pino';\nimport type { FSWatcher } from 'chokidar';\nimport type { PersistedJob } from '@coderule/qulite';\n\nimport { startWatcher, type WatchEvent } from '../fs/Watcher';\nimport { buildWatcherIgnored, shouldIncludeFile } from '../rules/RulesCompiler';\nimport { toPosixRelative, isInsideRoot } from '../fs/PathUtil';\nimport { publishSnapshot } from '../sync/SnapshotProtocol';\nimport { sendHeartbeat } from '../sync/HeartbeatProtocol';\n\nimport { ServiceState } from './State';\nimport type { BootstrapResult } from './Bootstrap';\n\nfunction safeParse<T = unknown>(input: string): T | undefined {\n try {\n return JSON.parse(input) as T;\n } catch {\n return undefined;\n }\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction computeBackoff(attempts: number | undefined): number {\n const base = attempts ?? 0;\n const delay = 1_000 * 2 ** base;\n return Math.min(delay, 60_000);\n}\n\nasync function readSymlinkTarget(absPath: string): Promise<string | null> {\n try {\n return await fs.readlink(absPath);\n } catch {\n return null;\n }\n}\n\nclass SnapshotScheduler {\n private timer: NodeJS.Timeout | null = null;\n\n constructor(\n private readonly rootId: string,\n private readonly debounceMs: number,\n private readonly outbox: BootstrapResult['outbox'],\n private readonly state: ServiceState,\n ) {}\n\n trigger(): void {\n this.state.updateChange();\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n this.outbox.enqueueSnapshot(this.rootId);\n this.timer = null;\n }, this.debounceMs);\n }\n\n cancel(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n}\n\nexport class ServiceRunner {\n private readonly state = new ServiceState();\n private watcher: FSWatcher | null = null;\n private running = false;\n private readonly fsControlLeaseOwner = `fs-control-${process.pid}-${Date.now()}`;\n private readonly scheduler: SnapshotScheduler;\n private readonly ignoredPredicate: (path: string, stats?: Stats) => boolean;\n private readonly tasks = new Set<Promise<void>>();\n private buffering = false;\n private bufferedEvents: Array<{\n event: WatchEvent;\n absPath: string;\n stats?: Stats;\n }> = [];\n\n constructor(private readonly runtime: BootstrapResult) {\n this.scheduler = new SnapshotScheduler(\n runtime.config.rootId,\n runtime.config.snapshotDebounceMs,\n runtime.outbox,\n this.state,\n );\n this.ignoredPredicate = buildWatcherIgnored(runtime.rules);\n }\n\n recordInitialSnapshot(timestamp: number): void {\n this.state.updateSnapshotReady(timestamp);\n this.state.updateChange(timestamp);\n this.state.updateHeartbeat(timestamp);\n }\n\n async start(): Promise<void> {\n if (this.running) return;\n await this.prepareWatcher(false);\n await this.startLoops();\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n this.running = false;\n this.scheduler.cancel();\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = null;\n }\n await Promise.all([...this.tasks]);\n await this.runtime.hasher.close();\n this.runtime.clients.close();\n this.runtime.db.close();\n }\n\n getServiceStateSnapshot(): {\n lastChangeAt: number;\n lastSnapshotReadyAt: number;\n lastHeartbeatEnqueuedAt: number;\n watcherReady: boolean;\n buffering: boolean;\n } {\n return {\n lastChangeAt: this.state.lastChangeAt,\n lastSnapshotReadyAt: this.state.lastSnapshotReadyAt,\n lastHeartbeatEnqueuedAt: this.state.lastHeartbeatEnqueuedAt,\n watcherReady: this.watcher !== null,\n buffering: this.buffering,\n };\n }\n\n private runBackground(fn: () => Promise<void>): void {\n const task = fn();\n this.tasks.add(task);\n task\n .catch((error) => {\n if (this.running) {\n this.runtime.logger.error({ err: error }, 'Background task failed');\n }\n })\n .finally(() => {\n this.tasks.delete(task);\n });\n }\n\n async prepareWatcher(bufferOnly: boolean): Promise<void> {\n const { rootPath } = this.runtime.config;\n const logger = this.runtime.logger.child({ scope: 'watcher' });\n this.buffering = bufferOnly;\n const { watcher, mode } = await startWatcher({\n rootPath,\n ignored: this.ignoredPredicate,\n logger,\n handlers: {\n onEvent: (event, absPath, stats) => {\n logger.debug({ event, absPath }, 'Watcher event received');\n if (this.buffering) {\n this.bufferedEvents.push({ event, absPath, stats });\n return Promise.resolve();\n }\n return this.handleEvent(event, absPath, stats);\n },\n },\n });\n this.watcher = watcher;\n logger.debug({ watched: watcher.getWatched() }, 'Watcher targets');\n logger.info({ mode, buffering: bufferOnly }, 'File watcher started');\n }\n\n async enableWatcherProcessing(): Promise<void> {\n if (!this.buffering) {\n return;\n }\n this.buffering = false;\n this.runtime.logger.debug(\n { buffered: this.bufferedEvents.length },\n 'Watcher buffering disabled',\n );\n if (this.bufferedEvents.length === 0) return;\n for (const buffered of this.bufferedEvents) {\n await this.handleEvent(buffered.event, buffered.absPath, buffered.stats);\n }\n this.bufferedEvents = [];\n }\n\n async startLoops(): Promise<void> {\n if (this.running) return;\n this.running = true;\n this.runBackground(() => this.hashLoop());\n this.runBackground(() => this.fsControlLoop());\n this.runBackground(() => this.heartbeatLoop());\n this.runBackground(() => this.requeueLoop());\n this.runtime.logger.debug('Background loops started');\n }\n\n private async handleEvent(\n event: WatchEvent,\n absPath: string,\n stats?: Stats,\n ): Promise<void> {\n if (!this.running) return;\n const root = this.runtime.config.rootPath;\n const absolute = path.isAbsolute(absPath)\n ? absPath\n : path.join(root, absPath);\n if (!isInsideRoot(root, absolute)) {\n return;\n }\n\n switch (event) {\n case 'add':\n case 'change':\n await this.handleAddChange(absolute, stats);\n break;\n case 'unlink':\n await this.handleUnlink(absolute);\n break;\n case 'unlinkDir':\n await this.handleUnlinkDir(absolute);\n break;\n case 'addDir':\n default:\n break;\n }\n }\n\n private async handleAddChange(\n absPath: string,\n _stats?: Stats,\n ): Promise<void> {\n let fileStats: Stats;\n try {\n // Always re-stat on change to avoid stale metadata from chokidar callbacks.\n fileStats = await fs.lstat(absPath);\n } catch (error) {\n this.runtime.logger.warn(\n { err: error, path: absPath },\n 'Failed to lstat path',\n );\n return;\n }\n const relPath = toPosixRelative(this.runtime.config.rootPath, absPath);\n if (!shouldIncludeFile(relPath, fileStats, this.runtime.rules)) {\n this.runtime.logger.debug({ relPath }, 'Watcher event ignored by rules');\n return;\n }\n const isSymlink = fileStats.isSymbolicLink();\n const target = isSymlink ? await readSymlinkTarget(absPath) : null;\n const state = this.runtime.filesRepo.upsertFromStat({\n relPath,\n displayPath: absPath,\n stats: fileStats,\n isSymlink,\n symlinkTarget: target,\n });\n if (state === 'dirty') {\n this.scheduler.trigger();\n }\n }\n\n private async handleUnlink(absPath: string): Promise<void> {\n const relPath = toPosixRelative(this.runtime.config.rootPath, absPath);\n const changed = this.runtime.filesRepo.markMissing(relPath);\n if (changed > 0) {\n this.scheduler.trigger();\n }\n }\n\n private async handleUnlinkDir(absPath: string): Promise<void> {\n const relPath = toPosixRelative(this.runtime.config.rootPath, absPath);\n const changed = this.runtime.filesRepo.markMissingByPrefix(relPath);\n if (changed > 0) {\n this.scheduler.trigger();\n }\n }\n\n private async hashLoop(): Promise<void> {\n while (this.running) {\n const processed = await this.runtime.hasher.processBatch(\n this.runtime.config.hashBatchSize,\n );\n if (!processed) {\n await sleep(500);\n }\n }\n }\n\n private async fsControlLoop(): Promise<void> {\n const log = this.runtime.logger.child({ scope: 'fs-control-worker' });\n while (this.running) {\n const job = this.runtime.outbox.claimFsControlJob(\n this.fsControlLeaseOwner,\n );\n if (!job) {\n await sleep(this.runtime.config.queuePollIntervalMs);\n continue;\n }\n\n const payload = job.data\n ? (safeParse<Record<string, unknown>>(job.data) ?? {})\n : {};\n const jobKind =\n job.kind ??\n (typeof payload.kind === 'string' ? payload.kind : undefined);\n\n if (!jobKind) {\n log.warn(\n { jobId: job.id },\n 'fs_control job missing kind, acknowledging',\n );\n this.runtime.outbox.ack(job.id, this.fsControlLeaseOwner);\n continue;\n }\n\n if (jobKind === 'snapshot') {\n await this.handleSnapshotJob(job, log);\n } else if (jobKind === 'heartbeat') {\n await this.handleHeartbeatJob(job, log);\n } else {\n log.warn({ jobId: job.id, kind: jobKind }, 'Unknown fs_control job');\n this.runtime.outbox.ack(job.id, this.fsControlLeaseOwner);\n }\n }\n }\n\n private async heartbeatLoop(): Promise<void> {\n const log = this.runtime.logger.child({ scope: 'heartbeat-loop' });\n while (this.running) {\n const now = Date.now();\n const sinceChange = now - this.state.lastChangeAt;\n const sinceHeartbeat = now - this.state.lastHeartbeatEnqueuedAt;\n if (\n sinceChange >= this.runtime.config.heartbeatIntervalMs &&\n sinceHeartbeat >= this.runtime.config.heartbeatIntervalMs\n ) {\n this.runtime.outbox.enqueueHeartbeat(this.runtime.config.rootId);\n this.state.updateHeartbeat(now);\n log.debug('Heartbeat enqueued');\n }\n await sleep(this.runtime.config.heartbeatCheckIntervalMs);\n }\n log.info('Heartbeat loop stopped');\n }\n\n private async requeueLoop(): Promise<void> {\n while (this.running) {\n const count = this.runtime.outbox.requeueTimedOut();\n if (count > 0) {\n this.runtime.logger.info({ count }, 'Requeued timed-out jobs');\n }\n await sleep(this.runtime.config.heartbeatCheckIntervalMs);\n }\n }\n\n private async handleSnapshotJob(\n job: PersistedJob,\n log: pino.Logger,\n ): Promise<void> {\n if (\n this.runtime.filesRepo.countByState('dirty') > 0 ||\n this.runtime.filesRepo.countByState('hashing') > 0\n ) {\n const delay = computeBackoff(job.attempts);\n this.runtime.outbox.retry(job.id, this.fsControlLeaseOwner, delay);\n await sleep(200);\n return;\n }\n\n try {\n const result = await publishSnapshot(\n this.runtime.config.rootPath,\n this.runtime.filesRepo,\n this.runtime.snapshotsRepo,\n this.runtime.clients.sync,\n log,\n {\n maxAttempts: this.runtime.config.maxSnapshotAttempts,\n uploadChunkSize: this.runtime.config.uploadChunkSize,\n },\n );\n this.runtime.outbox.ack(job.id, this.fsControlLeaseOwner);\n this.state.updateSnapshotReady(result.createdAt);\n log.info({ snapshotHash: result.snapshotHash }, 'Snapshot job completed');\n } catch (error: any) {\n log.warn({ err: error }, 'Snapshot job failed');\n const delay = computeBackoff(job.attempts);\n this.runtime.outbox.retry(job.id, this.fsControlLeaseOwner, delay);\n await sleep(delay);\n }\n }\n\n private async handleHeartbeatJob(\n job: PersistedJob,\n log: pino.Logger,\n ): Promise<void> {\n try {\n await sendHeartbeat(\n this.runtime.config.rootId,\n this.runtime.snapshotsRepo,\n this.runtime.clients.sync,\n log,\n );\n this.runtime.outbox.ack(job.id, this.fsControlLeaseOwner);\n this.state.updateHeartbeat(Date.now());\n } catch (error: any) {\n const delay = computeBackoff(job.attempts);\n this.runtime.outbox.retry(job.id, this.fsControlLeaseOwner, delay);\n log.warn({ err: error }, 'Heartbeat failed; retry scheduled');\n }\n }\n}\n","import { JobStatus } from '@coderule/qulite';\n\nimport type { ServiceRunner } from '../service/ServiceLoops';\nimport type { BootstrapResult } from '../service/Bootstrap';\nimport type { HashState } from '../types';\n\nconst HASH_STATES: HashState[] = ['clean', 'dirty', 'hashing', 'missing'];\n\ntype StateCounts = Record<HashState, number>;\n\ntype QueueCounts = {\n pending: number;\n processing: number;\n done: number;\n failed: number;\n};\n\nexport interface IndexingStatus {\n timestamp: number;\n root: {\n id: string;\n path: string;\n };\n files: {\n total: number;\n byState: StateCounts;\n };\n latestSnapshot: ReturnType<\n BootstrapResult['snapshotsRepo']['getLatest']\n > | null;\n queue: QueueCounts;\n service: ReturnType<ServiceRunner['getServiceStateSnapshot']>;\n}\n\nexport function collectIndexingStatus(\n runtime: BootstrapResult,\n runner: ServiceRunner,\n): IndexingStatus {\n const byState = {} as StateCounts;\n for (const state of HASH_STATES) {\n byState[state] = runtime.filesRepo.countByState(state);\n }\n\n const total = HASH_STATES.reduce((acc, state) => acc + byState[state], 0);\n\n const queue = runtime.outbox.getQueue();\n const queueCounts: QueueCounts = {\n pending: queue.countByStatus(JobStatus.Pending),\n processing: queue.countByStatus(JobStatus.Processing),\n done: queue.countByStatus(JobStatus.Done),\n failed: queue.countByStatus(JobStatus.Failed),\n };\n\n return {\n timestamp: Date.now(),\n root: {\n id: runtime.config.rootId,\n path: runtime.config.rootPath,\n },\n files: {\n total,\n byState,\n },\n latestSnapshot: runtime.snapshotsRepo.getLatest() ?? null,\n queue: queueCounts,\n service: runner.getServiceStateSnapshot(),\n };\n}\n\nexport function formatStatus(status: IndexingStatus): string {\n const lines: string[] = [];\n\n lines.push('=== Coderule Indexing Status ===');\n lines.push('');\n\n lines.push(`Timestamp: ${new Date(status.timestamp).toISOString()}`);\n lines.push('');\n\n lines.push('Repository:');\n lines.push(` ID: ${status.root.id}`);\n lines.push(` Path: ${status.root.path}`);\n lines.push('');\n\n lines.push('Files:');\n lines.push(` Total: ${status.files.total}`);\n lines.push(' States:');\n lines.push(` Clean: ${status.files.byState.clean}`);\n lines.push(` Dirty: ${status.files.byState.dirty}`);\n lines.push(` Hashing: ${status.files.byState.hashing}`);\n lines.push(` Missing: ${status.files.byState.missing}`);\n lines.push('');\n\n lines.push('Queue:');\n lines.push(` Pending: ${status.queue.pending}`);\n lines.push(` Processing: ${status.queue.processing}`);\n lines.push(` Done: ${status.queue.done}`);\n lines.push(` Failed: ${status.queue.failed}`);\n lines.push('');\n\n if (status.latestSnapshot) {\n lines.push('Latest Snapshot:');\n lines.push(` Hash: ${status.latestSnapshot.snapshot_hash}`);\n lines.push(` Files: ${status.latestSnapshot.files_count}`);\n lines.push(` Size: ${formatBytes(status.latestSnapshot.total_size)}`);\n lines.push(\n ` Created: ${new Date(status.latestSnapshot.created_at).toISOString()}`,\n );\n } else {\n lines.push('Latest Snapshot: None');\n }\n lines.push('');\n\n lines.push('Service State:');\n lines.push(\n ` Last Change: ${new Date(status.service.lastChangeAt).toISOString()}`,\n );\n lines.push(\n ` Last Snapshot Ready: ${new Date(status.service.lastSnapshotReadyAt).toISOString()}`,\n );\n lines.push(\n ` Last Heartbeat: ${status.service.lastHeartbeatEnqueuedAt > 0 ? new Date(status.service.lastHeartbeatEnqueuedAt).toISOString() : 'Never'}`,\n );\n lines.push(` Watcher Ready: ${status.service.watcherReady ? 'Yes' : 'No'}`);\n lines.push(` Buffering: ${status.service.buffering ? 'Yes' : 'No'}`);\n\n return lines.join('\\n');\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${units[i]}`;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport type { BootstrapResult } from '../service/Bootstrap';\nimport type { ServiceRunner } from '../service/ServiceLoops';\n\nimport { collectIndexingStatus, formatStatus } from './status';\n\nconst SERVER_NAME = 'coderule-scanner-mcp';\nconst SERVER_VERSION = process.env.npm_package_version ?? '0.0.0';\n\nexport interface CreateMcpServerOptions {\n runtime: BootstrapResult;\n runner: ServiceRunner;\n}\n\nexport function createMcpServer({\n runtime,\n runner,\n}: CreateMcpServerOptions): McpServer {\n async function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n async function waitForLocalSnapshot(deadlineMs: number) {\n let latest = runtime.snapshotsRepo.getLatest();\n while (!latest && Date.now() < deadlineMs) {\n await sleep(250);\n latest = runtime.snapshotsRepo.getLatest();\n }\n return latest;\n }\n\n async function waitForServerReady(\n initialHash: string,\n deadlineMs: number,\n ): Promise<string | undefined> {\n let currentHash = initialHash;\n while (Date.now() < deadlineMs) {\n try {\n const status =\n await runtime.clients.sync.checkSnapshotStatus(currentHash);\n if (status.status === 'READY') {\n return currentHash;\n }\n if (status.status === 'FAILED') {\n // Fallthrough to try a newer snapshot if it appears\n }\n } catch {\n // Ignore transient errors and continue until deadline\n }\n\n await sleep(500);\n const latest = runtime.snapshotsRepo.getLatest();\n if (latest && latest.snapshot_hash !== currentHash) {\n currentHash = latest.snapshot_hash;\n }\n }\n return undefined;\n }\n const server = new McpServer({\n name: SERVER_NAME,\n version: SERVER_VERSION,\n description: 'Coderule file indexing MCP server',\n });\n\n server.registerTool(\n 'check',\n {\n title: 'Indexer status',\n description:\n 'Inspect the current indexing state, snapshot, and queue metrics',\n inputSchema: {},\n },\n async () => {\n const status = collectIndexingStatus(runtime, runner);\n const text = formatStatus(status);\n return {\n content: [{ type: 'text', text }],\n };\n },\n );\n\n const queryInputSchema = {\n query: z.string().min(1, 'Query text is required'),\n budgetTokens: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Token budget for retrieval (default 3000)'),\n } as const;\n\n server.registerTool(\n 'query',\n {\n title: 'Snapshot retrieval query',\n description:\n 'Execute a retrieval query against the most recent indexed snapshot',\n inputSchema: queryInputSchema,\n },\n async ({\n query,\n budgetTokens,\n }: {\n query: string;\n budgetTokens?: number;\n }) => {\n const deadline = Date.now() + runtime.config.maxQueryWaitMs;\n\n // Wait for local snapshot\n const latest = await waitForLocalSnapshot(deadline);\n if (!latest) {\n const statusText = formatStatus(collectIndexingStatus(runtime, runner));\n const text = `We are not ready....\\n${statusText}`;\n return { content: [{ type: 'text', text }] };\n }\n\n // Ensure server readiness for the latest (or newer) snapshot\n const readyHash = await waitForServerReady(\n latest.snapshot_hash,\n deadline,\n );\n if (!readyHash) {\n const statusText = formatStatus(collectIndexingStatus(runtime, runner));\n const text = `We are not ready....\\n${statusText}`;\n return { content: [{ type: 'text', text }] };\n }\n\n const effectiveBudget = Math.max(100, budgetTokens ?? 3000);\n try {\n const result = await runtime.clients.retrieval.query(\n readyHash,\n query,\n effectiveBudget,\n { formatter: runtime.config.retrievalFormatter },\n );\n return {\n content: [\n {\n type: 'text',\n text: result.formatted_output ?? '(no formatted output)',\n },\n ],\n };\n } catch (error: any) {\n const message =\n error instanceof Error ? error.message : 'Unknown retrieval error';\n runtime.logger.error({ err: error }, 'Retrieval query failed');\n return {\n content: [{ type: 'text', text: `Retrieval error: ${message}` }],\n isError: true,\n };\n }\n },\n );\n\n return server;\n}\n","#!/usr/bin/env node\n\nimport fs from 'fs/promises';\nimport path from 'path';\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { resolveConfig } from './config/Configurator';\nimport { bootstrap } from './service/Bootstrap';\nimport { runInitialSyncPipeline } from './service/InitialSync';\nimport { ServiceRunner } from './service/ServiceLoops';\nimport { createMcpServer } from './mcp/server';\n\nconst ENV_FLAG_MAP: Record<string, string> = {\n root: 'CODERULE_ROOT',\n 'data-dir': 'CODERULE_DATA_DIR',\n 'auth-url': 'CODERULE_AUTH_URL',\n 'sync-url': 'CODERULE_SYNC_URL',\n 'ast-url': 'CODERULE_AST_URL',\n 'retrieval-url': 'CODERULE_RETRIEVAL_URL',\n 'retrieval-formatter': 'CODERULE_RETRIEVAL_FORMATTER',\n 'http-timeout': 'CODERULE_HTTP_TIMEOUT',\n 'snapshot-debounce': 'CODERULE_SNAPSHOT_DEBOUNCE_MS',\n 'heartbeat-interval': 'CODERULE_HEARTBEAT_INTERVAL_MS',\n 'heartbeat-check': 'CODERULE_HEARTBEAT_CHECK_INTERVAL_MS',\n 'queue-poll': 'CODERULE_QUEUE_POLL_INTERVAL_MS',\n 'hash-batch': 'CODERULE_HASH_BATCH_SIZE',\n 'hash-lease': 'CODERULE_HASH_LEASE_MS',\n 'max-snapshot-attempts': 'CODERULE_MAX_SNAPSHOT_ATTEMPTS',\n 'upload-chunk-size': 'CODERULE_UPLOAD_CHUNK_SIZE',\n 'max-wait-time': 'CODERULE_MAX_WAIT_TIME',\n};\n\ninterface CliOptions {\n token: string;\n clean: boolean;\n inlineHasher: boolean;\n env: Record<string, string>;\n}\n\nfunction printUsage(): void {\n console.log(`Usage: coderule-mcp-server [token] [options]\\n`);\n console.log('Options:');\n console.log(' --token <token> Override CODERULE_TOKEN');\n console.log(\n ' --clean, --reindex Remove existing local state before running',\n );\n console.log(\n ' --inline-hasher Force inline hashing (debug only)',\n );\n console.log(' --root <path> Override CODERULE_ROOT');\n console.log(' --data-dir <path> Override CODERULE_DATA_DIR');\n console.log(' --auth-url <url> Override CODERULE_AUTH_URL');\n console.log(' --sync-url <url> Override CODERULE_SYNC_URL');\n console.log(' --ast-url <url> Override CODERULE_AST_URL');\n console.log(' --retrieval-url <url> Override CODERULE_RETRIEVAL_URL');\n console.log(\n ' --retrieval-formatter <val> Override CODERULE_RETRIEVAL_FORMATTER (standard | compact)',\n );\n console.log(' --http-timeout <ms> Override CODERULE_HTTP_TIMEOUT');\n console.log(\n ' --snapshot-debounce <ms> Override CODERULE_SNAPSHOT_DEBOUNCE_MS',\n );\n console.log(\n ' --heartbeat-interval <ms> Override CODERULE_HEARTBEAT_INTERVAL_MS',\n );\n console.log(\n ' --heartbeat-check <ms> Override CODERULE_HEARTBEAT_CHECK_INTERVAL_MS',\n );\n console.log(\n ' --queue-poll <ms> Override CODERULE_QUEUE_POLL_INTERVAL_MS',\n );\n console.log(\n ' --hash-batch <n> Override CODERULE_HASH_BATCH_SIZE',\n );\n console.log(' --hash-lease <ms> Override CODERULE_HASH_LEASE_MS');\n console.log(\n ' --max-snapshot-attempts <n> Override CODERULE_MAX_SNAPSHOT_ATTEMPTS',\n );\n console.log(\n ' --upload-chunk-size <n> Override CODERULE_UPLOAD_CHUNK_SIZE (default 1)',\n );\n console.log(\n ' --max-wait-time <sec> Override CODERULE_MAX_WAIT_TIME (default 50s)',\n );\n console.log(\n ' KEY=value Set arbitrary environment variable',\n );\n console.log(' -h, --help Show this help message');\n}\n\nfunction parseArgs(argv: string[]): CliOptions | null {\n let token = process.env.CODERULE_TOKEN;\n let clean = false;\n let inlineHasher = false;\n const env: Record<string, string> = {};\n\n const args = [...argv];\n while (args.length > 0) {\n const arg = args.shift()!;\n if (arg === '--help' || arg === '-h') {\n printUsage();\n return null;\n }\n\n if (arg === '--clean' || arg === '--reindex') {\n clean = true;\n continue;\n }\n if (arg === '--inline-hasher') {\n inlineHasher = true;\n continue;\n }\n\n if (arg === '--token') {\n const value = args.shift();\n if (!value) {\n throw new Error('Missing value for --token');\n }\n token = value;\n continue;\n }\n if (arg.startsWith('--token=')) {\n token = arg.slice('--token='.length);\n continue;\n }\n\n if (arg.startsWith('--')) {\n const flag = arg.slice(2);\n const envKey = ENV_FLAG_MAP[flag];\n if (!envKey) {\n throw new Error(`Unknown option: ${arg}`);\n }\n const value = args.shift();\n if (!value) {\n throw new Error(`Option ${arg} requires a value`);\n }\n env[envKey] = value;\n continue;\n }\n\n if (arg.includes('=')) {\n const [key, value] = arg.split('=', 2);\n if (!key || value === undefined) {\n throw new Error(`Invalid KEY=value argument: ${arg}`);\n }\n env[key] = value;\n continue;\n }\n\n if (!token) {\n token = arg;\n continue;\n }\n\n throw new Error(`Unexpected argument: ${arg}`);\n }\n\n if (!token) {\n throw new Error(\n 'Missing token. Provide via argument or CODERULE_TOKEN environment variable.',\n );\n }\n\n return { token, clean, inlineHasher, env };\n}\n\nasync function ensureClean(configToken: string): Promise<void> {\n const config = await resolveConfig({ token: configToken });\n const targets = [\n config.dbPath,\n `${config.dbPath}-shm`,\n `${config.dbPath}-wal`,\n ];\n await Promise.all(targets.map((target) => fs.rm(target, { force: true })));\n await fs\n .rm(path.join(config.dataDir, 'watch', `${config.rootId}.sqlite-shm`), {\n force: true,\n })\n .catch(() => {});\n const dir = path.dirname(config.dbPath);\n await fs.mkdir(dir, { recursive: true });\n console.log(`Removed scanner database at ${config.dbPath}`);\n}\n\nfunction awaitShutdownSignals(): Promise<NodeJS.Signals> {\n return new Promise((resolve) => {\n const signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM'];\n const handler = (signal: NodeJS.Signals) => {\n for (const sig of signals) {\n process.off(sig, handler);\n }\n resolve(signal);\n };\n for (const sig of signals) {\n process.on(sig, handler);\n }\n });\n}\n\nasync function main(): Promise<void> {\n try {\n const options = parseArgs(process.argv.slice(2));\n if (!options) {\n return;\n }\n\n process.env.CODERULE_TOKEN = options.token;\n if (options.inlineHasher) {\n process.env.CODERULE_HASHER_INLINE = '1';\n }\n for (const [key, value] of Object.entries(options.env)) {\n process.env[key] = value;\n }\n\n if (options.clean) {\n await ensureClean(options.token);\n }\n\n const runtime = await bootstrap({ token: options.token });\n const runner = new ServiceRunner(runtime);\n\n try {\n await runner.prepareWatcher(true);\n\n // Start MCP server immediately so tools are available while syncing\n const server = createMcpServer({ runtime, runner });\n const transport = new StdioServerTransport();\n await server.connect(transport);\n runtime.logger.info('MCP server connected via stdio');\n\n let initialCreatedAt: number | undefined;\n try {\n const initial = await runInitialSyncPipeline(runtime, {\n blockUntilReady: false,\n });\n runtime.logger.info(\n {\n snapshotHash: initial.snapshotHash,\n filesCount: initial.filesCount,\n },\n 'Initial sync completed; entering continuous mode',\n );\n initialCreatedAt = initial.createdAt;\n } catch (error: any) {\n runtime.logger.warn(\n { err: error },\n 'Initial sync failed; enqueuing snapshot job and continuing',\n );\n runtime.outbox.enqueueSnapshot(runtime.config.rootId, 0);\n }\n\n if (initialCreatedAt) {\n runner.recordInitialSnapshot(initialCreatedAt);\n }\n await runner.startLoops();\n await runner.enableWatcherProcessing();\n\n const signal = await awaitShutdownSignals();\n runtime.logger.info({ signal }, 'Shutdown signal received');\n if (typeof transport.close === 'function') {\n await transport.close();\n }\n } finally {\n await runner.stop();\n }\n } catch (error) {\n console.error('MCP server failed:', error);\n process.exitCode = 1;\n }\n}\n\nvoid main();\n"]}
|