/** 소유자만 읽고 쓴다 */ export declare const PRIVATE_FILE_MODE = 384; /** 소유자만 들어가고 읽는다 — 안의 파일 권한과 무관하게 다른 uid 의 **도달성**을 끊는다 */ export declare const PRIVATE_DIR_MODE = 448; /** DB 와 같은 자리에 런타임으로 생기는 파생 파일. WAL·SHM 은 생성 시점 DB 권한을 상속하지만(실측), * 다른 연결이 **이미 열어 둔** 것은 안 바뀌므로 따로 좁힌다. */ export declare const DB_SIDECAR_SUFFIXES: readonly ["-wal", "-shm", "-journal"]; export type NarrowResult = 'narrowed' | 'already' | 'missing' | 'skipped' | 'failed'; /** * 권한을 **좁히기만** 한다 — 넓히지 않는다(0400 은 0400 그대로). * 심링크 판정축은 「심링크인가」가 아니라 **「부모가 쓰기 가능한가」**다(선점 공격은 그때만 성립). */ export declare function narrowMode(path: string, mode: number): NarrowResult; /** * 디렉토리를 0700 으로 확보한다. * 🔴 `create: false` 가 기본이다 — 없는 디렉토리를 만들면 `#143` 의 「삭제한 디렉토리가 되살아난다」가 재발한다. */ export declare function ensurePrivateDir(dir: string, opts?: { create?: boolean; }): NarrowResult; /** 기본 A2A 홈. `HOME` 끝 슬래시 같은 표기 차이로 비교가 어긋나지 않게 **정규화**한다. */ export declare function defaultA2aHome(): string; /** * 기본 A2A 홈을 0700 으로. `db.path` 가 어디를 가리키든 로그·스풀·백업은 여기 쌓이므로 **독립**이다. * 🔴 테스트가 실 사용자 홈을 만지는 것을 막는 가드가 먼저 온다 — 기존 가드들은 `dbPath` 문자열과 * `new Database(` 사용처만 봐서 **디렉토리 chmod 축을 못 본다**. */ export declare function restrictDefaultA2aHome(): NarrowResult; /** 이 경로가 기본 A2A 홈 안인가. 밖이면 **좁히지 않는다** — 사용자 지정 위치는 공유 디렉토리일 수 있다. */ export declare function isInsideDefaultA2aHome(p: string): boolean; /** 기본 홈 안일 때만 0700 으로. 밖이면 `skipped`(호출자가 보고만 한다). */ export declare function restrictIfInsideA2aHome(dir: string, action: string): NarrowResult; /** DB 본체와 사이드카(-wal/-shm/-journal)를 0600 으로. */ export declare function narrowDbFiles(dbPath: string): Record; export interface PrivacyEntry { path: string; /** 8진 권한 비트 */ mode: number; /** group 또는 other 에게 권한 비트가 열려 있는가 (비트 축) */ bitsOpen: boolean; /** 스캔 루트부터 이 경로까지 **다른 uid 가 통과할 수 있는가** (도달성 축) */ reachable: boolean; /** 실제 노출 = 비트가 열렸고 **도달도 가능하다** */ exposed: boolean; } /** * 권한 상태를 **목록이 아니라 트리 스캔**으로 센다. * 🔴 고정 목록으로 만들면 이 사이클이 기각한 대안(「쓰는 사이트 9곳 열거」)과 같은 구조가 되어 * 미래 산출물이 영구 미표시가 된다. */ export declare function inspectPrivacy(roots: string[], maxDepth?: number): PrivacyEntry[]; //# sourceMappingURL=file-mode.d.ts.map