import * as Effect from "effect/Effect"; declare const ArchiveGuardrailError_base: new = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & { readonly _tag: "ArchiveGuardrailError"; } & Readonly; export declare class ArchiveGuardrailError extends ArchiveGuardrailError_base<{ readonly code: "path_traversal" | "absolute_path" | "duplicate_entry" | "symlink_entry" | "unsupported_compression" | "malformed_archive" | "decompression_limit_exceeded" | "compression_ratio_exceeded" | "entry_count_exceeded" | "forbidden_entry"; readonly message: string; readonly entry?: string; }> { } export declare const ZIP_LOCAL_SIGNATURE = 67324752; export interface ZipEntry { readonly fileName: string; readonly compressedSize: number; readonly uncompressedSize: number; readonly compressionMethod: number; readonly externalAttributes: number; readonly localHeaderOffset: number; } export interface ArchiveGuardrailLimits { readonly maxEntries?: number; readonly maxDecompressedBytes?: number; readonly maxCompressionRatio?: number; } export declare const parseZipCentralDirectory: (buf: Uint8Array) => Effect.Effect; /** * Reject archives carrying build or secret leftovers: any `node_modules` or * `.git` path segment, and `.env` / `.env.*` files. Kept out of * {@link validateArchive} on purpose — that function is the registry ingest * contract, and archives accepted by earlier clients must keep ingesting. * * `.env*` matches the basename exactly (`.env`) or by dotted prefix * (`.env.local`, `.env.production`, and also `.env.example`), so sibling names * like `.envrc` and `environment.md` are unaffected. */ export declare const checkForbiddenSourceEntries: (entries: readonly ZipEntry[]) => Effect.Effect; export declare const validateArchive: (archiveBytes: Uint8Array, limits?: ArchiveGuardrailLimits) => Effect.Effect; export {}; //# sourceMappingURL=archive-guardrails.d.ts.map