{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/log/logger.ts","../src/config/Defaults.ts","../src/config/RootResolver.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/index.ts","../src/cli.ts"],"names":["pino","fs","path","os","logger","createHash","envPaths","Database","Qulite","JobStatus","enqueueFsEvent","clients","CoderuleClients","ASTHttpClient","Worker","fsSync","SyncHttpClient","chokidar","sleep","readSymlinkTarget"],"mappings":"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","file":"cli.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n  typeof document === 'undefined'\n    ? new URL(`file:${__filename}`).href\n    : (document.currentScript && document.currentScript.src) ||\n      new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","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 fs from 'fs/promises';\nimport os from 'os';\nimport path from 'path';\n\nimport type { Logger } from 'pino';\n\nexport interface RootCandidate {\n  path: string;\n  source: 'cli-arg' | 'env-coderule-root' | 'env-workspace' | 'process-cwd';\n  baseConfidence: number;\n  modifiers: Array<{ reason: string; delta: number }>;\n  finalConfidence: number;\n  exists: boolean;\n  isDirectory: boolean;\n}\n\nexport interface RootResolverOptions {\n  cliRoot?: string;\n  logger?: Logger;\n}\n\ninterface CandidateSource {\n  value: string | undefined;\n  source: RootCandidate['source'];\n  baseConfidence: number;\n}\n\nfunction collectCandidateSources(\n  options?: RootResolverOptions,\n): CandidateSource[] {\n  const sources: CandidateSource[] = [];\n\n  // Priority 1: CLI argument\n  if (options?.cliRoot) {\n    sources.push({\n      value: options.cliRoot,\n      source: 'cli-arg',\n      baseConfidence: 1.0,\n    });\n  }\n\n  // Priority 2: CODERULE_ROOT env\n  if (process.env.CODERULE_ROOT) {\n    sources.push({\n      value: process.env.CODERULE_ROOT,\n      source: 'env-coderule-root',\n      baseConfidence: 0.9,\n    });\n  }\n\n  // Priority 3: WORKSPACE_FOLDER_PATHS env (treated as single path)\n  if (process.env.WORKSPACE_FOLDER_PATHS) {\n    sources.push({\n      value: process.env.WORKSPACE_FOLDER_PATHS,\n      source: 'env-workspace',\n      baseConfidence: 0.8,\n    });\n  }\n\n  // Priority 4: Current working directory\n  sources.push({\n    value: process.cwd(),\n    source: 'process-cwd',\n    baseConfidence: 0.6,\n  });\n\n  return sources;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n  try {\n    await fs.access(targetPath);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nasync function isDirectory(targetPath: string): Promise<boolean> {\n  try {\n    const stat = await fs.stat(targetPath);\n    return stat.isDirectory();\n  } catch {\n    return false;\n  }\n}\n\nasync function hasGitDirectory(rootPath: string): Promise<boolean> {\n  const gitPath = path.join(rootPath, '.git');\n  return pathExists(gitPath);\n}\n\nfunction isShallowPath(absolutePath: string): boolean {\n  // Count separators in the absolute path\n  // Windows: C:\\ has 1 separator (after C:)\n  // Unix: / has 0 separators after the root\n  const normalized = absolutePath.replace(/\\\\/g, '/');\n  const separatorCount = (normalized.match(/\\//g) || []).length;\n\n  // If path has only 1 or 0 separator, it's likely a root directory\n  return separatorCount <= 1;\n}\n\nfunction isHomeDirectory(candidatePath: string): boolean {\n  const home = os.homedir();\n  const normalizedCandidate = path.normalize(candidatePath);\n  const normalizedHome = path.normalize(home);\n  return normalizedCandidate === normalizedHome;\n}\n\nasync function applyModifiers(\n  candidate: RootCandidate,\n): Promise<RootCandidate> {\n  const modifiers: Array<{ reason: string; delta: number }> = [];\n\n  // Modifier A: .git directory exists → +0.1\n  if (await hasGitDirectory(candidate.path)) {\n    modifiers.push({ reason: 'has .git directory', delta: 0.1 });\n  }\n\n  // Modifier B: Shallow path (likely system root) → -0.2\n  if (isShallowPath(candidate.path)) {\n    modifiers.push({ reason: 'shallow path (likely root)', delta: -0.2 });\n  }\n\n  // Modifier C: Home directory → -0.3\n  if (isHomeDirectory(candidate.path)) {\n    modifiers.push({ reason: 'is home directory', delta: -0.3 });\n  }\n\n  const totalModifier = modifiers.reduce((sum, m) => sum + m.delta, 0);\n  const finalConfidence = candidate.baseConfidence + totalModifier;\n\n  return {\n    ...candidate,\n    modifiers,\n    finalConfidence,\n  };\n}\n\nasync function createCandidate(\n  source: CandidateSource,\n): Promise<RootCandidate> {\n  const absolutePath = path.resolve(source.value!);\n  const exists = await pathExists(absolutePath);\n  const isDir = exists ? await isDirectory(absolutePath) : false;\n\n  const candidate: RootCandidate = {\n    path: absolutePath,\n    source: source.source,\n    baseConfidence: source.baseConfidence,\n    modifiers: [],\n    finalConfidence: source.baseConfidence,\n    exists,\n    isDirectory: isDir,\n  };\n\n  // Only apply modifiers if the path exists and is a directory\n  if (exists && isDir) {\n    return applyModifiers(candidate);\n  }\n\n  return candidate;\n}\n\nexport async function resolveRootPath(\n  options?: RootResolverOptions,\n): Promise<RootCandidate> {\n  const logger = options?.logger;\n  const sources = collectCandidateSources(options);\n\n  // Create candidates from all sources\n  const candidates = await Promise.all(sources.map(createCandidate));\n\n  logger?.debug(\n    {\n      candidates: candidates.map((c) => ({\n        path: c.path,\n        source: c.source,\n        baseConfidence: c.baseConfidence,\n        finalConfidence: c.finalConfidence,\n        exists: c.exists,\n        isDirectory: c.isDirectory,\n        modifiers: c.modifiers,\n      })),\n    },\n    'Collected root path candidates',\n  );\n\n  // Filter to valid directories only\n  const validCandidates = candidates.filter((c) => c.exists && c.isDirectory);\n\n  if (validCandidates.length === 0) {\n    const attempted = candidates.map((c) => c.path).join(', ');\n    throw new Error(\n      `No valid root directory found. Attempted: ${attempted}. Ensure the directory exists and is accessible.`,\n    );\n  }\n\n  // Define source priority for tie-breaking\n  const sourcePriority: Record<RootCandidate['source'], number> = {\n    'cli-arg': 1,\n    'env-coderule-root': 2,\n    'env-workspace': 3,\n    'process-cwd': 4,\n  };\n\n  // Sort by confidence (highest first), then by source priority (lowest number wins)\n  validCandidates.sort((a, b) => {\n    const confidenceDiff = b.finalConfidence - a.finalConfidence;\n    if (confidenceDiff !== 0) {\n      return confidenceDiff;\n    }\n    // Tie-breaker: use source priority\n    return sourcePriority[a.source] - sourcePriority[b.source];\n  });\n\n  const best = validCandidates[0]!;\n\n  // Warn if confidence is low\n  if (best.finalConfidence < 0.7) {\n    logger?.warn(\n      {\n        path: best.path,\n        source: best.source,\n        confidence: best.finalConfidence,\n        modifiers: best.modifiers,\n      },\n      'Selected root path has low confidence',\n    );\n  } else {\n    logger?.info(\n      {\n        path: best.path,\n        source: best.source,\n        confidence: best.finalConfidence,\n        modifiers: best.modifiers,\n      },\n      'Resolved root path',\n    );\n  }\n\n  return best;\n}\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';\nimport { resolveRootPath } from './RootResolver';\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  rootPath?: string;\n}\n\nexport async function resolveConfig({\n  token,\n  rootPath: cliRoot,\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  // Resolve root path using confidence-based resolution\n  const rootCandidate = await resolveRootPath({\n    cliRoot,\n    logger: logger.child({ scope: 'root-resolver' }),\n  });\n  const rootPath = rootCandidate.path;\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      rootSource: rootCandidate.source,\n      rootConfidence: rootCandidate.finalConfidence,\n      rootModifiers: rootCandidate.modifiers,\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  hashOwner: string;\n  hashStartedAt: number;\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       AND hash_state = 'hashing'\n       AND hash_owner = ?\n       AND hash_started_at = ?`,\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[]): number {\n    if (!results.length) return 0;\n    let applied = 0;\n    const tx = this.db.transaction((batch: HashResult[]) => {\n      for (const {\n        id,\n        contentSha256,\n        serviceFileHash,\n        hashOwner,\n        hashStartedAt,\n      } of batch) {\n        const result = this.applyHashesStmt.run(\n          contentSha256,\n          serviceFileHash,\n          id,\n          hashOwner,\n          hashStartedAt,\n        );\n        if ((result.changes ?? 0) > 0) {\n          applied += 1;\n        }\n      }\n    });\n    tx(results);\n    return applied;\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: 600_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 = 600_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 async yieldToEventLoop(): Promise<void> {\n    await new Promise<void>((resolve) => setImmediate(resolve));\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        if (this.inlineMode) {\n          await this.yieldToEventLoop();\n        }\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          hashOwner: record.hash_owner ?? this.ownerId,\n          hashStartedAt: record.hash_started_at ?? 0,\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      // When hashing inline (fallback), yield after each file to ensure MCP stays responsive\n      if (this.inlineMode) {\n        await this.yieldToEventLoop();\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  rootPath?: 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      // Skip zero-length files (empty files cause server delays)\n      if (stat.size === 0) {\n        stats.skipped += 1;\n        dirLogger.debug({ relPath }, 'Skipping zero-length file');\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 { createHash } from 'crypto';\nimport 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 class SnapshotStaleError extends Error {\n  constructor(message = 'snapshot became stale') {\n    super(message);\n    this.name = 'SnapshotStaleError';\n  }\n}\n\nexport interface PublishOptions {\n  maxAttempts?: number;\n  uploadChunkSize?: number;\n  deadlineMs?: number;\n  isStale?: () => boolean;\n}\n\nfunction assertNotStale(opts?: PublishOptions): void {\n  if (opts?.isStale?.()) {\n    throw new SnapshotStaleError();\n  }\n}\n\nfunction assertBeforeDeadline(opts?: PublishOptions): void {\n  if (opts?.deadlineMs !== undefined && Date.now() >= opts.deadlineMs) {\n    throw new Error('snapshot publish deadline exceeded');\n  }\n}\n\nfunction assertValid(opts?: PublishOptions): void {\n  assertNotStale(opts);\n  assertBeforeDeadline(opts);\n}\n\nfunction withDeadline<T>(\n  promise: Promise<T>,\n  opts?: PublishOptions,\n): Promise<T> {\n  if (opts?.deadlineMs === undefined) return promise;\n  const remaining = opts.deadlineMs - Date.now();\n  if (remaining <= 0) {\n    return Promise.reject(new Error('snapshot publish deadline exceeded'));\n  }\n  return Promise.race([\n    promise,\n    new Promise<never>((_, reject) =>\n      setTimeout(\n        () => reject(new Error('snapshot publish deadline exceeded')),\n        remaining,\n      ),\n    ),\n  ]);\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  opts?: PublishOptions,\n): Promise<T> {\n  let attempt = 0;\n  // First attempt + (maxAttempts - 1) retries\n  while (true) {\n    assertValid(opts);\n    try {\n      return await withDeadline(op(), opts);\n    } catch (err: any) {\n      // Let staleness and deadline errors propagate immediately\n      if (err instanceof SnapshotStaleError) throw err;\n      if (\n        typeof err?.message === 'string' &&\n        err.message.includes('deadline exceeded')\n      ) {\n        throw err;\n      }\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\nfunction computeServiceFileHash(relPath: string, content: Buffer): string {\n  const hash = createHash('sha256');\n  hash.update(relPath);\n  hash.update('\\n');\n  hash.update(content);\n  return hash.digest('hex');\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  opts?: PublishOptions,\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    assertValid(opts);\n\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        const serviceHash = computeServiceFileHash(\n          missingFile.file_path,\n          buffer,\n        );\n        if (serviceHash !== missingFile.file_hash) {\n          logger.warn(\n            {\n              relPath: missingFile.file_path,\n              expected: missingFile.file_hash,\n              got: serviceHash,\n            },\n            'File content changed during upload; snapshot is stale',\n          );\n          throw new SnapshotStaleError(\n            `file hash mismatch for ${missingFile.file_path}`,\n          );\n        }\n        map.set(missingFile.file_hash, {\n          path: missingFile.file_path,\n          content: buffer,\n        });\n      } catch (error: any) {\n        if (error instanceof SnapshotStaleError) throw error;\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    assertValid(opts);\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      opts,\n    );\n  }\n}\n\nasync function ensureSnapshotCreated(\n  rootPath: string,\n  computation: SnapshotComputation,\n  syncClient: SyncHttpClient,\n  logger: Logger,\n  opts?: PublishOptions,\n): Promise<void> {\n  const { snapshotHash, files } = computation;\n  const maxAttempts = opts?.maxAttempts ?? 5;\n  const uploadChunkSize = opts?.uploadChunkSize ?? 1;\n\n  assertValid(opts);\n\n  let status = await withRetries(\n    () => syncClient.checkSnapshotStatus(snapshotHash),\n    logger,\n    { op: 'checkSnapshotStatus', snapshotHash },\n    maxAttempts,\n    opts,\n  );\n  if (status.status === 'READY') {\n    logger.info({ snapshotHash }, 'Snapshot already READY');\n    return;\n  }\n\n  let attempt = 0;\n  while (status.status !== 'READY') {\n    assertValid(opts);\n\n    if (status.status === 'FAILED') {\n      throw new Error(`Snapshot failed processing: ${JSON.stringify(status)}`);\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        opts,\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        opts,\n      );\n      status = await withRetries(\n        () => syncClient.createSnapshot(snapshotHash, files),\n        logger,\n        { op: 'createSnapshot', snapshotHash },\n        maxAttempts,\n        opts,\n      );\n      continue;\n    }\n\n    if (status.status === 'READY') break;\n\n    // PROCESSING or other non-terminal statuses: backoff and poll\n    const delay = Math.min(5_000, 1_000 * Math.max(1, 2 ** attempt));\n    await sleep(delay);\n    attempt += 1;\n\n    assertValid(opts);\n\n    status = await withRetries(\n      () => syncClient.checkSnapshotStatus(snapshotHash),\n      logger,\n      { op: 'checkSnapshotStatus', snapshotHash },\n      maxAttempts,\n      opts,\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?: PublishOptions,\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  changeSeq = 0;\n  lastChangeAt = Date.now();\n  lastSnapshotReadyAt = Date.now();\n  lastHeartbeatEnqueuedAt = 0;\n\n  updateChange(timestamp = Date.now()) {\n    this.lastChangeAt = timestamp;\n    this.changeSeq += 1;\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 {\n  publishSnapshot,\n  computeSnapshot,\n  SnapshotStaleError,\n} 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\nconst PUBLISH_MAX_MS = 5 * 60_000;\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    // Skip zero-length files (empty files cause server delays)\n    if (fileStats.size === 0) {\n      this.runtime.logger.debug(\n        { relPath },\n        'Watcher skipping zero-length file',\n      );\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      return;\n    }\n\n    const publishSeq = this.state.changeSeq;\n\n    const isStale = () =>\n      this.state.changeSeq !== publishSeq ||\n      this.runtime.filesRepo.countByState('dirty') > 0 ||\n      this.runtime.filesRepo.countByState('hashing') > 0;\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          deadlineMs: Date.now() + PUBLISH_MAX_MS,\n          isStale,\n        },\n      );\n\n      const acked = this.runtime.outbox.ack(job.id, this.fsControlLeaseOwner);\n      if (!acked) {\n        log.warn(\n          { jobId: job.id },\n          'Snapshot job ack failed (lease may have expired)',\n        );\n      }\n\n      this.state.updateSnapshotReady(result.createdAt);\n      log.info({ snapshotHash: result.snapshotHash }, 'Snapshot job completed');\n\n      // Post-publish dedupe check: ensure no changes were missed\n      if (\n        this.runtime.filesRepo.countByState('dirty') > 0 ||\n        this.runtime.filesRepo.countByState('hashing') > 0\n      ) {\n        this.runtime.outbox.enqueueSnapshot(this.runtime.config.rootId, 0);\n        return;\n      }\n      const nowHash = computeSnapshot(this.runtime.filesRepo).snapshotHash;\n      if (nowHash !== result.snapshotHash) {\n        this.runtime.outbox.enqueueSnapshot(this.runtime.config.rootId, 0);\n      }\n    } catch (error: any) {\n      if (error instanceof SnapshotStaleError) {\n        log.debug(\n          { err: error },\n          'Snapshot publish aborted (stale); quick retry',\n        );\n        this.runtime.outbox.retry(job.id, this.fsControlLeaseOwner, 250);\n        return;\n      }\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    }\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 type { InitialSyncResult } from './types';\nimport { bootstrap } from './service/Bootstrap';\nimport { runInitialSyncPipeline } from './service/InitialSync';\nimport { ServiceRunner } from './service/ServiceLoops';\nimport type { BootstrapResult } from './service/Bootstrap';\n\nasync function cleanupRuntime(\n  runner: ServiceRunner | undefined,\n  runtime?: BootstrapResult,\n): Promise<void> {\n  if (runner) {\n    await runner.stop();\n    return;\n  }\n  if (runtime) {\n    await runtime.hasher.close();\n    runtime.clients.close();\n    runtime.db.close();\n  }\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\nexport async function runInitialSync(params: {\n  token?: string;\n  rootPath?: string;\n}): Promise<InitialSyncResult> {\n  const runtime = await bootstrap(params);\n  try {\n    const result = await runInitialSyncPipeline(runtime, {\n      blockUntilReady: true,\n    });\n    runtime.logger.info(\n      {\n        snapshotHash: result.snapshotHash,\n        filesCount: result.filesCount,\n        totalSize: result.totalSize,\n      },\n      'Initial sync completed',\n    );\n    return result;\n  } finally {\n    await runtime.hasher.close();\n    runtime.clients.close();\n    runtime.db.close();\n  }\n}\n\nexport async function runService(params: {\n  token?: string;\n  rootPath?: string;\n}): Promise<void> {\n  const runtime = await bootstrap(params);\n  let runner: ServiceRunner | undefined;\n  try {\n    runner = new ServiceRunner(runtime);\n    await runner.prepareWatcher(true);\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    runtime.logger.info('Coderule scanner service is running');\n\n    const signal = await awaitShutdownSignals();\n    runtime.logger.info({ signal }, 'Shutdown signal received');\n  } finally {\n    await cleanupRuntime(runner, runtime);\n  }\n}\n\nexport type { InitialSyncResult } from './types';\n","#!/usr/bin/env node\n\nimport fs from 'fs/promises';\nimport path from 'path';\n\nimport { CoderuleClients } from '@coderule/clients';\n\nimport { resolveConfig } from './config/Configurator';\n\nimport { runInitialSync, runService } from './index';\n\ntype RunMode = 'service' | 'initial';\n\ninterface CliOptions {\n  token: string;\n  rootPath?: string;\n  mode: RunMode;\n  clean: boolean;\n  inlineHasher: boolean;\n  dumpBush?: string;\n  dumpSkill: boolean;\n  env: Record<string, string>;\n}\n\nconst ENV_FLAG_MAP: Record<string, string> = {\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  '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\nfunction printUsage(): void {\n  console.log(`Usage: coderule-scanner [token] [options]\n\nOptions:\n  --initial, --once          Run a single initial sync then exit\n  --service                  Run continuous service (default)\n  --clean, --reindex         Remove existing local state before running\n  --inline-hasher            Force inline hashing (debug only)\n  --root <path>              Override CODERULE_ROOT\n  --data-dir <path>          Override CODERULE_DATA_DIR\n  --auth-url <url>           Override CODERULE_AUTH_URL\n  --sync-url <url>           Override CODERULE_SYNC_URL\n  --ast-url <url>            Override CODERULE_AST_URL\n  --retrieval-url <url>      Override CODERULE_RETRIEVAL_URL\n  --http-timeout <ms>        Override CODERULE_HTTP_TIMEOUT\n  --snapshot-debounce <ms>   Override CODERULE_SNAPSHOT_DEBOUNCE_MS\n  --heartbeat-interval <ms>  Override CODERULE_HEARTBEAT_INTERVAL_MS\n  --heartbeat-check <ms>     Override CODERULE_HEARTBEAT_CHECK_INTERVAL_MS\n  --queue-poll <ms>          Override CODERULE_QUEUE_POLL_INTERVAL_MS\n  --hash-batch <n>           Override CODERULE_HASH_BATCH_SIZE\n  --hash-lease <ms>          Override CODERULE_HASH_LEASE_MS\n  --max-snapshot-attempts <n> Override CODERULE_MAX_SNAPSHOT_ATTEMPTS\n  --upload-chunk-size <n>    Override CODERULE_UPLOAD_CHUNK_SIZE (default 1)\n  --max-wait-time <sec>      Override CODERULE_MAX_WAIT_TIME (default 50s)\n  --dump-bush <path>         Download HDF5 bush file to <path> (must end with .h5)\n  --dump-skill               Print HDF5 bush reader skill (format docs + examples)\n  KEY=value                  Set arbitrary environment variable\n  --help                     Show this message\n`);\n}\n\nfunction parseArgs(argv: string[]): CliOptions | null {\n  let token = process.env.CODERULE_TOKEN;\n  let rootPath: string | undefined;\n  let mode: RunMode = 'service';\n  let clean = false;\n  let inlineHasher = false;\n  let dumpBush: string | undefined;\n  let dumpSkill = 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 === '--initial' || arg === '--once') {\n      mode = 'initial';\n      continue;\n    }\n    if (arg === '--service') {\n      mode = 'service';\n      continue;\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    if (arg === '--dump-bush') {\n      if (args.length === 0) {\n        throw new Error('Option --dump-bush requires a file path');\n      }\n      dumpBush = args.shift()!;\n      if (!dumpBush.endsWith('.h5')) {\n        throw new Error('--dump-bush path must end with .h5');\n      }\n      mode = 'initial';\n      continue;\n    }\n    if (arg === '--dump-skill') {\n      dumpSkill = true;\n      mode = 'initial';\n      continue;\n    }\n\n    // Handle --root separately (not as env var)\n    if (arg === '--root') {\n      if (args.length === 0) {\n        throw new Error('Option --root requires a value');\n      }\n      rootPath = args.shift()!;\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      if (args.length === 0) {\n        throw new Error(`Option ${arg} requires a value`);\n      }\n      const value = args.shift()!;\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 env.',\n    );\n  }\n\n  return {\n    token,\n    rootPath,\n    mode,\n    clean,\n    inlineHasher,\n    dumpBush,\n    dumpSkill,\n    env,\n  };\n}\n\nasync function ensureClean(\n  configToken: string,\n  rootPath?: string,\n): Promise<void> {\n  const config = await resolveConfig({ token: configToken, rootPath });\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\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, options.rootPath);\n    }\n\n    if (options.mode === 'initial') {\n      const result = await runInitialSync({\n        token: options.token,\n        rootPath: options.rootPath,\n      });\n      console.log('Initial sync result:', JSON.stringify(result, null, 2));\n\n      if (options.dumpBush || options.dumpSkill) {\n        const clients = new CoderuleClients({ token: options.token });\n        try {\n          // Trigger auth to discover sync server_url\n          await clients.sync.checkSnapshotStatus(result.snapshotHash);\n\n          if (options.dumpBush) {\n            const buf = await clients.sync.downloadSnapshotBush(\n              result.snapshotHash,\n            );\n            const dir = path.dirname(options.dumpBush);\n            await fs.mkdir(dir, { recursive: true });\n            await fs.writeFile(options.dumpBush, Buffer.from(buf));\n            console.log(\n              `HDF5 bush saved to ${options.dumpBush} (${buf.byteLength} bytes)`,\n            );\n          }\n          if (options.dumpSkill) {\n            const skill = await clients.sync.getHdf5BushReaderSkill();\n            console.log(skill);\n          }\n        } finally {\n          clients.close();\n        }\n      }\n    } else {\n      await runService({ token: options.token, rootPath: options.rootPath });\n    }\n  } catch (error) {\n    console.error('Scanner CLI failed:', error);\n    process.exitCode = 1;\n  }\n}\n\nvoid main();\n"]}