/** * Session Extract — 실행 채널 이관 (#90, ADR-053 T4) * * 세션 요약·메모리 추출은 원래 SessionEnd에서 돌았으나 그 채널의 **발화 빈도가 낮다**. * * 실측(2026-08-03, 전 로그 JSON 파싱): * SessionEnd started 82 / completed 61 (누적) * SessionStart completed 1,477 (누적) → 약 24배 * * 🔴 **근거 정정 (재검증)**: 초판은 *"하네스가 kill해서 완주하지 못한다"* 고 적었으나 * 로그가 이를 지지하지 않는다 — orphan(started−completed)은 **4~5월에 20건 집중**이고 * **6월 1 / 7월 0 / 8월 0**이다. 최근 2개월에는 미완주 관측이 없다. * 그리고 7/25 완주 2건의 로그는 `"No session files found"` — 즉 그때의 무산출은 * kill이 아니라 **#84 slug 결함**(2026-08-02 fix)이었다. * * ⇒ 이관의 근거는 「완주 실패」가 아니라 **「발화 빈도」**다. SessionEnd는 세션 종료라는 * 드문 이벤트에 묶여 있고, SessionStart는 그보다 24배 자주 돈다. * (단 본 모듈의 게이트가 새 transcript 탄생 시에만 통과하므로 실효 발화는 그보다 낮다 — ADR-053 Consequences) * * ADR-048 섹션 0.12(#81 rebuild)·0.13(#83 backfill)이 같은 진단으로 이관한 선례를 따른다. * 본 모듈은 SessionStart Step 1f의 게이트/lock/spawn만 담당하고, 실제 추출은 * CLI `session-extract`가 `extractSessionMemories`를 재사용해 수행한다. */ import type { MemoryDatabase } from '../db/database.js'; import type { createLogger } from '../utils/logger.js'; /** * in-flight lock TTL. 실측 소요 ~17초(LLM 추출 7.8s + sync 7.8s) 대비 35배 여유. * 초과 시 stale로 간주하여 회수(spawn 죽음/중단 대비). 정상 완료는 CLI finally가 회수한다. */ export declare const SESSION_EXTRACT_LOCK_TTL_MS: number; /** * lock/로그 경로 — db 파일과 같은 디렉토리. * * ⚠️ `resolvePath` 경유 강제 — config `db.path`의 `~`는 Node가 확장하지 않는다. * 단일 source를 안 거치면 `/~/...`가 되어 ENOENT로 **spawn이 영구 실패**한다(#68 실증). */ export declare function sessionExtractLockPath(dbPath: string): string; export declare function sessionExtractLogPath(dbPath: string): string; /** in-flight lock 활성 여부. TTL 초과 stale lock은 회수(unlink) 후 false. */ export declare function isSessionExtractLocked(lockPath: string, nowMs: number): boolean; export interface SessionExtractSpawnResult { spawned: boolean; reason: string; /** spawn 대상으로 선택된 세션 id (없으면 undefined) */ targetSessionId?: string; } /** * SessionStart Step 1f 진입점 — 게이트 판정 후 detached spawn. * * 🔴 **이어받기(resume) 세션에서는 spawn하지 않는다.** * 신규 세션은 hook 실행 시점에 자기 transcript 파일이 아직 없다(실측: hook 10:42:53~10:43:02 / * 파일 생성 10:43:10). 반면 resume은 **기존 파일에 append**하므로 hook 시점에 이미 존재한다. * 그 상태에서 현재 세션을 제외하면 **일주일 전 세션을 「직전 맥락」으로 요약**하게 된다 * (실측 반례: 직전 세션 파일이 birth 07-28 / mtime 08-03로 6일간 append됨). * 그리고 resume은 세션이 이어지는 것이라 애초에 인계 요약이 필요 없다. * * @param transcriptPath 현재 세션 transcript 경로. undefined면 판별 불가로 보고 spawn하지 않는다 * (오요약보다 미실행이 안전 — 다음 신규 세션이 처리한다). */ export declare function maybeSpawnSessionExtract(db: MemoryDatabase, dbPath: string, projectPath: string, currentSessionId: string, transcriptPath: string | undefined, logger: ReturnType, nowMs: number): SessionExtractSpawnResult; //# sourceMappingURL=session-extract.d.ts.map