/** sweep 대상 후보의 최소 메타. */ export interface TranscriptMeta { sessionId: string; transcriptPath: string; cwd: string; mtimeMs: number; promptCount: number; } export interface SweepOpts { nowMs: number; /** 이 시간 내 수정된 transcript 만 대상 (기본 24h). */ windowMs: number; /** 세션이 이만큼 지나야 재-sweep (기본 2h). */ staleMs: number; /** 최소 user 프롬프트 수 (기본 10). */ minPrompts: number; /** 한 sweep 당 최대 세션 수 (비용 상한, 기본 5). */ maxPerRun: number; } export declare const DEFAULT_SWEEP_OPTS: Omit; type SweepState = Record; /** * 순수 선택: 최근·충분한 대화·stale(오래 안 쓸린) 세션을, oldest-swept 우선으로 maxPerRun 만큼. */ export declare function selectSweepCandidates(transcripts: TranscriptMeta[], sweepState: SweepState, opts: SweepOpts): TranscriptMeta[]; /** Claude projects 하위의 최근 transcript 를 열거해 메타 구성. */ export declare function enumerateTranscripts(windowMs: number, nowMs: number): TranscriptMeta[]; export interface SweepResult { scanned: number; eligible: number; swept: string[]; stateSaveFailed?: boolean; } /** * cron/CLI 진입점. dryRun 이면 실행 없이 후보만 보고. * 무인 실행 안전장치: (1) 동시 실행 lock, (2) 실제 spawn('spawned') 만 sweptAt 기록, * (3) state 저장 실패 시 경고 플래그. */ export declare function runCompoundSweep(opts?: { dryRun?: boolean; } & Partial>): SweepResult; /** crontab 라인 구성 (순수 — 테스트 가능). 경로는 shell-quote(리뷰 SEV-2). */ export declare function buildCronLine(nodePath: string, cliPath: string, logPath: string, schedule?: string): string; /** 기존 crontab 에서 forgen 라인을 upsert/제거 (순수 — 테스트 가능). */ export declare function upsertCronText(existing: string, line: string | null): string; export interface CronOpResult { ok: boolean; message: string; } export declare function installCron(): CronOpResult; export declare function uninstallCron(): CronOpResult; export declare function cronStatus(): CronOpResult; /** CLI: forgen compound sweep [--dry-run|--install-cron|--uninstall-cron|--cron-status] [--window-hours N] [--stale-hours M] */ export declare function compoundSweepCli(args: string[]): void; export {};