@fulmenhq/tsfulmen 0.2.10 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -0
- package/README.md +1 -1
- package/dist/appidentity/index.js +156 -4150
- package/dist/appidentity/index.js.map +1 -1
- package/dist/bin/prometheus-cli.d.ts +1 -0
- package/dist/bin/prometheus-cli.js +9331 -0
- package/dist/bin/prometheus-cli.js.map +1 -0
- package/dist/bin/schema-cli.d.ts +1 -0
- package/dist/bin/schema-cli.js +6104 -0
- package/dist/bin/schema-cli.js.map +1 -0
- package/dist/bin/signals-cli.d.ts +1 -0
- package/dist/bin/signals-cli.js +2104 -0
- package/dist/bin/signals-cli.js.map +1 -0
- package/dist/config/index.js +29 -4915
- package/dist/config/index.js.map +1 -1
- package/dist/crucible/index.js +120 -5336
- package/dist/crucible/index.js.map +1 -1
- package/dist/errors/index.js +52 -4434
- package/dist/errors/index.js.map +1 -1
- package/dist/foundry/index.js +197 -1874
- package/dist/foundry/index.js.map +1 -1
- package/dist/fulpack/index.js +43 -31
- package/dist/fulpack/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +204 -4185
- package/dist/index.js.map +1 -1
- package/dist/pathfinder/index.js +47 -4378
- package/dist/pathfinder/index.js.map +1 -1
- package/dist/reports/license-inventory.csv +17 -17
- package/dist/schema/index.js +0 -4
- package/dist/schema/index.js.map +1 -1
- package/dist/signals/index.js +231 -3570
- package/dist/signals/index.js.map +1 -1
- package/dist/telemetry/http/index.js +94 -5280
- package/dist/telemetry/http/index.js.map +1 -1
- package/dist/telemetry/index.js +70 -4786
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/prometheus/index.js +461 -4450
- package/dist/telemetry/prometheus/index.js.map +1 -1
- package/package.json +13 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/crucible/fulpack/types.ts","../../src/fulpack/errors.ts","../../src/fulpack/core.ts","../../src/fulpack/index.ts"],"names":["ArchiveFormat","EntryType","Operation","extract"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Fulpack Types - Generated from Crucible schemas.\n *\n * This file is AUTO-GENERATED from the Fulpack module specification.\n * DO NOT EDIT MANUALLY - changes will be overwritten.\n *\n * Schema Version: v1.0.0\n * Last Reviewed: 2025-11-12\n * Source: schemas/library/fulpack/v1.0.0/\n *\n * See: https://github.com/fulmenhq/crucible/blob/main/docs/standards/library/modules/fulpack.md\n */\n\n// ============================================================================\n// Enums (TypeScript Enums)\n// ============================================================================\n\n/**\n * ArchiveFormat enum\n * @see schemas/taxonomy/library/fulpack/archive-formats/v1.0.0/formats.yaml\n */\nexport enum ArchiveFormat {\n /** POSIX tar archive (uncompressed) */\n TAR = \"tar\",\n /** POSIX tar archive with gzip compression */\n TAR_GZ = \"tar.gz\",\n /** ZIP archive with deflate compression */\n ZIP = \"zip\",\n /** GZIP compressed single file */\n GZIP = \"gzip\",\n}\n\n/**\n * EntryType enum\n * @see schemas/taxonomy/library/fulpack/entry-types/v1.0.0/types.yaml\n */\nexport enum EntryType {\n /** Normal file with data */\n FILE = \"file\",\n /** Directory/folder entry */\n DIRECTORY = \"directory\",\n /** Symbolic link to another entry */\n SYMLINK = \"symlink\",\n}\n\n/**\n * Operation enum\n * @see schemas/taxonomy/library/fulpack/operations/v1.0.0/operations.yaml\n */\nexport enum Operation {\n /** Create new archive from source files/directories */\n CREATE = \"create\",\n /** Extract archive contents to destination */\n EXTRACT = \"extract\",\n /** List archive entries (for Pathfinder integration) */\n SCAN = \"scan\",\n /** Validate archive integrity and checksums */\n VERIFY = \"verify\",\n /** Get archive metadata without extraction */\n INFO = \"info\",\n}\n\n// ============================================================================\n// Structured Error Types\n// ============================================================================\n\n/**\n * Structured error context for fulpack operations.\n * Enables programmatic error handling and observability.\n *\n * @see docs/standards/library/modules/fulpack.md\n */\nexport interface FulpackError {\n /**\n * Canonical error code for programmatic handling.\n * Examples: \"PATH_TRAVERSAL\", \"DECOMPRESSION_BOMB\", \"ABSOLUTE_PATH\", \"SYMLINK_ESCAPE\"\n */\n readonly code: string;\n\n /**\n * Human-readable error message describing what went wrong.\n */\n readonly message: string;\n\n /**\n * Operation that generated this error.\n */\n readonly operation: Operation;\n\n /**\n * Entry path that caused the error (if applicable).\n * Example: \"../../../etc/passwd\"\n */\n readonly path?: string;\n\n /**\n * Archive file path being processed.\n */\n readonly archive?: string;\n\n /**\n * Source file path for create operations.\n */\n readonly source?: string;\n\n /**\n * Additional structured context for debugging and telemetry.\n */\n readonly details?: {\n /** Entry index in archive (0-based) */\n readonly entry_index?: number;\n /** Compression ratio that triggered bomb detection */\n readonly compression_ratio?: number;\n /** Actual decompressed size in bytes */\n readonly actual_size?: number;\n /** Maximum allowed size in bytes */\n readonly max_size?: number;\n /** Maximum allowed entries */\n readonly max_entries?: number;\n /** Actual entry count */\n readonly entry_count?: number;\n /** Additional context (extensible) */\n readonly [key: string]: unknown;\n };\n}\n\n// ============================================================================\n// Data Structures (Interfaces)\n// ============================================================================\n\n/**\n * Metadata about an archive file\n * @see schemas/library/fulpack/v1.0.0/archive-info.schema.json\n */\nexport interface ArchiveInfo {\n readonly format: \"tar\" | \"tar.gz\" | \"zip\" | \"gzip\"; // Archive format from archive-formats taxonomy\n readonly entry_count: number; // Total number of entries in the archive\n readonly total_size: number; // Total uncompressed size in bytes\n readonly compressed_size: number; // Compressed archive file size in bytes\n readonly compression?: \"gzip\" | \"deflate\" | \"none\"; // Compression algorithm used\n readonly compression_ratio?: number; // Compression ratio (total_size / compressed_size)\n readonly has_checksums?: boolean; // Whether the archive contains checksums\n readonly checksum_algorithm?: \"xxh3-128\" | \"sha256\" | \"sha512\" | \"sha1\" | \"md5\"; // Checksum algorithm used from fulhash module (xxh3-128 and sha256 are standard, others may require optional extensions)\n readonly created?: string; // Archive creation timestamp (ISO 8601 format)\n}\n\n/**\n * Metadata for a single archive entry (returned by scan operation)\n * @see schemas/library/fulpack/v1.0.0/archive-entry.schema.json\n */\nexport interface ArchiveEntry {\n readonly path: string; // Normalized entry path within archive\n readonly type: \"file\" | \"directory\" | \"symlink\"; // Entry type from entry-types taxonomy\n readonly size: number; // Uncompressed size in bytes\n readonly compressed_size?: number; // Compressed size in bytes (if available)\n readonly modified?: string; // Modification timestamp (ISO 8601 format)\n readonly checksum?: string; // SHA-256 checksum (64 hex characters)\n readonly mode?: string; // Unix file permissions (octal string, e.g., '0644')\n readonly symlink_target?: string | null; // Target path if type is symlink, null otherwise\n}\n\n/**\n * Complete archive table of contents (for large archives and caching)\n * @see schemas/library/fulpack/v1.0.0/archive-manifest.schema.json\n */\nexport interface ArchiveManifest {\n readonly format: \"tar\" | \"tar.gz\" | \"zip\" | \"gzip\"; // Archive format from archive-formats taxonomy\n readonly version: string; // Manifest schema version (semantic versioning)\n readonly generated: string; // Manifest generation timestamp (ISO 8601 format)\n readonly entry_count: number; // Total number of entries in manifest\n readonly entries: unknown[]; // Array of archive entries\n readonly total_size?: number; // Total uncompressed size in bytes\n readonly compressed_size?: number; // Compressed archive file size in bytes\n readonly index?: Record<string, unknown>; // Optional searchable index for fast lookups\n}\n\n/**\n * Result of archive integrity verification (from verify operation)\n * @see schemas/library/fulpack/v1.0.0/validation-result.schema.json\n */\nexport interface ValidationResult {\n readonly valid: boolean; // Whether the archive is valid and intact\n readonly errors: FulpackError[]; // Array of validation errors (empty if valid)\n readonly warnings: string[]; // Array of non-critical warnings (e.g., missing checksums)\n readonly entry_count: number; // Number of entries validated\n readonly checksums_verified?: number; // Number of checksums successfully verified\n readonly checks_performed?: (\n | \"structure_valid\"\n | \"checksums_verified\"\n | \"no_path_traversal\"\n | \"no_decompression_bomb\"\n | \"symlinks_safe\"\n )[]; // List of security and integrity checks performed\n}\n\n/**\n * Result of archive extraction operation\n * @see schemas/library/fulpack/v1.0.0/extract-result.schema.json\n */\nexport interface ExtractResult {\n readonly extracted_count: number; // Number of entries successfully extracted\n readonly skipped_count: number; // Number of entries skipped (e.g., already exists)\n readonly error_count: number; // Number of entries that failed to extract\n readonly errors?: FulpackError[]; // Array of error messages for failed extractions\n readonly warnings?: string[]; // Array of warning messages (e.g., skipped files)\n readonly checksums_verified?: number; // Number of checksums successfully verified during extraction\n readonly total_bytes?: number; // Total bytes extracted\n}\n\n// ============================================================================\n// Options (Partial Interfaces)\n// ============================================================================\n\n/**\n * Options for archive creation operation\n * @see schemas/library/fulpack/v1.0.0/create-options.schema.json\n *\n * All fields are optional. Use when calling functions.\n */\nexport interface CreateOptions {\n compression_level?: number; // Compression level (1=fastest, 9=best compression, format-dependent)\n include_patterns?: string[]; // Glob patterns for files to include (e.g., ['**/*.py', '**/*.md'])\n exclude_patterns?: string[]; // Glob patterns for files to exclude (e.g., ['**/__pycache__', '**/.git'])\n checksum_algorithm?: \"xxh3-128\" | \"sha256\" | \"sha512\" | \"sha1\" | \"md5\"; // Checksum algorithm for entry verification (xxh3-128 and sha256 are standard via fulhash module, others may require optional extensions)\n preserve_permissions?: boolean; // Preserve Unix file permissions in archive\n follow_symlinks?: boolean; // Follow symbolic links and archive their targets\n}\n\n/**\n * Options for archive extraction operation\n * @see schemas/library/fulpack/v1.0.0/extract-options.schema.json\n *\n * All fields are optional. Use when calling functions.\n */\nexport interface ExtractOptions {\n overwrite?: \"error\" | \"skip\" | \"overwrite\"; // How to handle existing files (error=fail, skip=keep existing, overwrite=replace)\n verify_checksums?: boolean; // Verify checksums during extraction if available\n preserve_permissions?: boolean; // Preserve Unix file permissions from archive\n include_patterns?: string[]; // Glob patterns for entries to extract (e.g., ['**/*.csv'])\n max_size?: number; // Maximum total decompressed size in bytes (decompression bomb protection)\n max_entries?: number; // Maximum number of entries to extract (decompression bomb protection)\n}\n\n/**\n * Options for archive scanning operation (for Pathfinder integration)\n * @see schemas/library/fulpack/v1.0.0/scan-options.schema.json\n *\n * All fields are optional. Use when calling functions.\n */\nexport interface ScanOptions {\n include_metadata?: boolean; // Include metadata (size, checksum, modified timestamp) in results\n entry_types?: (\"file\" | \"directory\" | \"symlink\")[]; // Filter entries by type (from entry-types taxonomy)\n max_depth?: number | null; // Maximum depth for directory traversal (null = unlimited)\n max_entries?: number; // Safety limit for maximum entries to return\n}\n\n// ============================================================================\n// Module Metadata\n// ============================================================================\n\n/**\n * Module version for compatibility checks.\n */\nexport const FULPACK_VERSION = \"v1.0.0\";\n","/**\n * Fulpack Error Handling\n *\n * Canonical error creation and management for fulpack operations.\n * Follows Foundry error schema patterns.\n */\n\nimport type { FulpackError } from \"../crucible/fulpack/types.js\";\nimport { Operation } from \"../crucible/fulpack/types.js\";\n\n/**\n * Create a canonical fulpack error\n */\nexport function createFulpackError(\n code: string,\n message: string,\n operation: Operation,\n context?: {\n path?: string;\n archive?: string;\n details?: Record<string, unknown>;\n },\n): FulpackError {\n return {\n code,\n message,\n operation,\n ...(context?.path && { path: context.path }),\n ...(context?.archive && { archive: context.archive }),\n ...(context?.details && { details: context.details }),\n };\n}\n\n/**\n * Canonical error codes for fulpack operations\n */\nexport const ERROR_CODES = {\n // Validation Errors\n INVALID_ARCHIVE_FORMAT: \"INVALID_ARCHIVE_FORMAT\",\n INVALID_PATH: \"INVALID_PATH\",\n INVALID_OPTIONS: \"INVALID_OPTIONS\",\n\n // Security Errors\n PATH_TRAVERSAL: \"PATH_TRAVERSAL\",\n ABSOLUTE_PATH: \"ABSOLUTE_PATH\",\n SYMLINK_ESCAPE: \"SYMLINK_ESCAPE\",\n DECOMPRESSION_BOMB: \"DECOMPRESSION_BOMB\",\n CHECKSUM_MISMATCH: \"CHECKSUM_MISMATCH\",\n\n // Runtime Errors\n ARCHIVE_NOT_FOUND: \"ARCHIVE_NOT_FOUND\",\n ARCHIVE_CORRUPT: \"ARCHIVE_CORRUPT\",\n EXTRACTION_FAILED: \"EXTRACTION_FAILED\",\n PERMISSION_DENIED: \"PERMISSION_DENIED\",\n DISK_FULL: \"DISK_FULL\",\n SOURCE_NOT_FOUND: \"SOURCE_NOT_FOUND\",\n} as const;\n\n/**\n * Error class for fulpack operations\n */\nexport class FulpackOperationError extends Error {\n public readonly code: string;\n public readonly operation: Operation;\n public readonly path?: string;\n public readonly archive?: string;\n public readonly details?: Record<string, unknown>;\n\n constructor(error: FulpackError) {\n super(error.message);\n this.name = \"FulpackOperationError\";\n this.code = error.code;\n this.operation = error.operation;\n this.path = error.path;\n this.archive = error.archive;\n this.details = error.details;\n }\n\n /**\n * Convert back to canonical error format\n */\n toCanonical(): FulpackError {\n return {\n code: this.code,\n message: this.message,\n operation: this.operation,\n ...(this.path && { path: this.path }),\n ...(this.archive && { archive: this.archive }),\n ...(this.details && { details: this.details }),\n };\n }\n}\n\n/**\n * Security validation utilities\n */\n\n/**\n * Check for path traversal attempts\n */\nexport function hasPathTraversal(path: string): boolean {\n return path.includes(\"..\") || path.includes(\"\\\\..\");\n}\n\n/**\n * Check for absolute paths\n */\nexport function isAbsolutePath(path: string): boolean {\n return path.startsWith(\"/\") || /^[a-zA-Z]:/.test(path);\n}\n\n/**\n * Normalize path and check for security issues\n */\nexport function validatePath(\n path: string,\n operation: Operation,\n allowAbsolute = false,\n): FulpackError | null {\n if (!allowAbsolute && isAbsolutePath(path)) {\n return createFulpackError(\n ERROR_CODES.ABSOLUTE_PATH,\n `Absolute path not allowed: ${path}`,\n operation,\n { path },\n );\n }\n\n if (hasPathTraversal(path)) {\n return createFulpackError(\n ERROR_CODES.PATH_TRAVERSAL,\n `Path traversal detected: ${path}`,\n operation,\n { path },\n );\n }\n\n return null;\n}\n\n/**\n * Check for decompression bomb characteristics\n */\nexport function checkDecompressionBomb(\n uncompressedSize: number,\n compressedSize: number,\n maxSize: number,\n maxEntries: number,\n currentEntries: number,\n): FulpackError | null {\n if (uncompressedSize > maxSize) {\n return createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Archive exceeds maximum size limit`,\n Operation.EXTRACT,\n {\n details: {\n actual_size: uncompressedSize,\n max_size: maxSize,\n },\n },\n );\n }\n\n if (currentEntries > maxEntries) {\n return createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Archive exceeds maximum entry limit`,\n Operation.EXTRACT,\n {\n details: {\n actual_size: currentEntries,\n max_size: maxEntries,\n },\n },\n );\n }\n\n // Check compression ratio (warn if >100:1)\n if (compressedSize > 0 && uncompressedSize / compressedSize > 100) {\n return createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Suspicious compression ratio detected`,\n Operation.EXTRACT,\n {\n details: {\n compression_ratio: uncompressedSize / compressedSize,\n },\n },\n );\n }\n\n return null;\n}\n","/**\n * Fulpack Core Implementation\n *\n * Main archive operations implementation for TypeScript.\n * Currently supports tar.gz format with security protections.\n */\n\nimport {\n createReadStream,\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { pipeline } from \"node:stream\";\nimport { createGunzip, createGzip } from \"node:zlib\";\nimport archiver from \"archiver\";\n// Import interfaces/types as TYPE-ONLY\nimport type {\n ArchiveEntry,\n ArchiveInfo,\n CreateOptions,\n ExtractOptions,\n ExtractResult,\n FulpackError,\n ScanOptions,\n ValidationResult,\n} from \"../crucible/fulpack/types.js\";\n// Import enums as VALUES (runtime objects)\nimport { ArchiveFormat, EntryType, Operation } from \"../crucible/fulpack/types.js\";\n\nimport { createFulpackError, ERROR_CODES, FulpackOperationError, validatePath } from \"./errors.js\";\n\n/**\n * Default options for operations\n */\nconst DEFAULTS = {\n CREATE: {\n compression_level: 6,\n checksum_algorithm: \"sha256\" as const,\n preserve_permissions: true,\n follow_symlinks: false,\n },\n EXTRACT: {\n overwrite: \"error\" as const,\n verify_checksums: true,\n preserve_permissions: true,\n max_size: 1024 * 1024 * 1024, // 1GB\n max_entries: 100000,\n },\n SCAN: {\n include_metadata: true,\n max_entries: 100000,\n },\n} as const;\n\n/**\n * Create an archive from source files/directories\n */\nexport async function create(\n source: string | string[],\n output: string,\n format: ArchiveFormat,\n options?: CreateOptions,\n): Promise<ArchiveInfo> {\n const opts = { ...DEFAULTS.CREATE, ...options };\n const sources = Array.isArray(source) ? source : [source];\n\n // Validate inputs\n if (\n format !== ArchiveFormat.TAR &&\n format !== ArchiveFormat.TAR_GZ &&\n format !== ArchiveFormat.ZIP &&\n format !== ArchiveFormat.GZIP\n ) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_ARCHIVE_FORMAT,\n `Format ${format} not yet supported`,\n Operation.CREATE,\n ),\n );\n }\n\n // Ensure output directory exists\n const outputDir = dirname(output);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n if (format === ArchiveFormat.ZIP) {\n return await createZipArchive(sources, output, opts);\n } else if (format === ArchiveFormat.TAR_GZ) {\n return await createTarGzArchive(sources, output, opts);\n } else if (format === ArchiveFormat.TAR) {\n return await createTarArchive(sources, output, opts);\n } else if (format === ArchiveFormat.GZIP) {\n return await createGzipFile(sources, output, opts);\n } else {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_ARCHIVE_FORMAT,\n `Unsupported format for creation: ${format}`,\n Operation.CREATE,\n ),\n );\n }\n}\n\n/**\n * Extract archive contents to destination\n */\nexport async function extract(\n archive: string,\n destination: string,\n options?: ExtractOptions,\n): Promise<ExtractResult> {\n const opts = { ...DEFAULTS.EXTRACT, ...options };\n\n // Validate inputs\n if (!existsSync(archive)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_NOT_FOUND,\n `Archive not found: ${archive}`,\n Operation.EXTRACT,\n { archive },\n ),\n );\n }\n\n // Ensure destination exists\n if (!existsSync(destination)) {\n mkdirSync(destination, { recursive: true });\n }\n\n // Detect format by extension and route to appropriate extractor\n if (archive.endsWith(\".tar.gz\") || archive.endsWith(\".tgz\")) {\n return await extractTarGz(archive, destination, opts);\n } else if (archive.endsWith(\".tar\")) {\n return await extractTar(archive, destination, opts);\n } else if (archive.endsWith(\".zip\")) {\n return await extractZip(archive, destination, opts);\n } else if (archive.endsWith(\".gz\")) {\n // Single file gzip\n return await extractGzipFile(archive, destination, opts);\n } else {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_ARCHIVE_FORMAT,\n `Unsupported archive format for extraction: ${archive}`,\n Operation.EXTRACT,\n { archive },\n ),\n );\n }\n}\n\n/**\n * Scan archive entries without extraction\n */\nexport async function scan(archive: string, options?: ScanOptions): Promise<ArchiveEntry[]> {\n const opts = { ...DEFAULTS.SCAN, ...options };\n\n // Validate inputs\n if (!existsSync(archive)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_NOT_FOUND,\n `Archive not found: ${archive}`,\n Operation.SCAN,\n { archive },\n ),\n );\n }\n\n const filename = basename(archive);\n\n // Route to appropriate format scanner\n if (filename.endsWith(\".tar.gz\") || filename.endsWith(\".tgz\")) {\n return await scanTarGz(archive, opts);\n } else if (filename.endsWith(\".tar\")) {\n return await scanTar(archive, opts);\n } else if (filename.endsWith(\".zip\")) {\n return await scanZip(archive, opts);\n } else if (filename.endsWith(\".gz\")) {\n // Single file gzip (not tar.gz)\n return await scanGzipFile(archive, opts);\n } else {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_ARCHIVE_FORMAT,\n `Unsupported archive format: ${filename}`,\n Operation.SCAN,\n { archive },\n ),\n );\n }\n}\n\n/**\n * Verify archive integrity and checksums\n */\nexport async function verify(\n archive: string,\n _options?: Record<string, unknown>,\n): Promise<ValidationResult> {\n // Validate inputs\n if (!existsSync(archive)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_NOT_FOUND,\n `Archive not found: ${archive}`,\n Operation.VERIFY,\n { archive },\n ),\n );\n }\n\n const stats = statSync(archive);\n const errors: FulpackError[] = [];\n const warnings: string[] = [];\n const checks_performed: (\n | \"structure_valid\"\n | \"checksums_verified\"\n | \"no_path_traversal\"\n | \"no_decompression_bomb\"\n | \"symlinks_safe\"\n )[] = [];\n let entry_count = 0;\n let checksums_verified = 0;\n\n // Basic structure validation\n checks_performed.push(\"structure_valid\");\n if (stats.size === 0) {\n errors.push(\n createFulpackError(ERROR_CODES.ARCHIVE_CORRUPT, \"Archive file is empty\", Operation.VERIFY, {\n archive,\n }),\n );\n return {\n valid: false,\n errors,\n warnings,\n entry_count: 0,\n checksums_verified: 0,\n checks_performed,\n };\n }\n\n // Scan archive to get entries and perform security checks\n let entries: ArchiveEntry[];\n try {\n entries = await scan(archive, { include_metadata: true });\n entry_count = entries.length;\n } catch (error) {\n errors.push(\n createFulpackError(\n ERROR_CODES.ARCHIVE_CORRUPT,\n `Failed to scan archive: ${error instanceof Error ? error.message : String(error)}`,\n Operation.VERIFY,\n { archive, details: { original_error: error } },\n ),\n );\n return {\n valid: false,\n errors,\n warnings,\n entry_count: 0,\n checksums_verified: 0,\n checks_performed,\n };\n }\n\n // Security check: Path traversal detection\n checks_performed.push(\"no_path_traversal\");\n for (const entry of entries) {\n const pathError = validatePath(entry.path, Operation.VERIFY, true);\n if (pathError) {\n errors.push({ ...pathError, archive });\n }\n }\n\n // Security check: Symlink safety (if symlinks present)\n const symlinks = entries.filter((e) => e.type === \"symlink\");\n if (symlinks.length > 0) {\n checks_performed.push(\"symlinks_safe\");\n for (const symlink of symlinks) {\n if (symlink.symlink_target) {\n // Check if symlink target attempts to escape (../ or absolute path)\n const targetError = validatePath(symlink.symlink_target, Operation.VERIFY, true);\n if (targetError) {\n errors.push(\n createFulpackError(\n ERROR_CODES.ARCHIVE_CORRUPT,\n `Symlink '${symlink.path}' targets unsafe location: ${symlink.symlink_target}`,\n Operation.VERIFY,\n { archive, path: symlink.path, details: { symlink_target: symlink.symlink_target } },\n ),\n );\n }\n }\n }\n }\n\n // Security check: Decompression bomb detection\n checks_performed.push(\"no_decompression_bomb\");\n const total_size = entries.reduce((sum, entry) => sum + (entry.size || 0), 0);\n const compressed_size = stats.size;\n const compression_ratio =\n total_size > 0 && compressed_size > 0 ? total_size / compressed_size : 1.0;\n\n // Warn if compression ratio exceeds 100:1 (per Crucible standard)\n if (compression_ratio > 100) {\n warnings.push(\n `High compression ratio detected: ${compression_ratio.toFixed(1)}:1 (threshold: 100:1)`,\n );\n }\n\n // Warn if total size exceeds 1GB (default max_size)\n const MAX_SIZE = 1024 * 1024 * 1024; // 1GB\n if (total_size > MAX_SIZE) {\n warnings.push(\n `Total uncompressed size (${(total_size / (1024 * 1024)).toFixed(1)}MB) exceeds recommended limit (1GB)`,\n );\n }\n\n // Warn if entry count exceeds 100k (default max_entries)\n const MAX_ENTRIES = 100000;\n if (entry_count > MAX_ENTRIES) {\n warnings.push(`Entry count (${entry_count}) exceeds recommended limit (${MAX_ENTRIES})`);\n }\n\n // Check for checksums\n const entriesWithChecksums = entries.filter((e) => e.checksum !== undefined);\n if (entriesWithChecksums.length > 0) {\n checks_performed.push(\"checksums_verified\");\n checksums_verified = entriesWithChecksums.length;\n // Note: Actual checksum verification would require extracting and re-hashing\n // For Phase 2, we just report how many checksums are present\n } else if (entry_count > 0) {\n warnings.push(\"Archive does not contain checksums for integrity verification\");\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n entry_count,\n checksums_verified,\n checks_performed,\n };\n}\n\n/**\n * Get archive metadata without extraction\n */\nexport async function info(archive: string): Promise<ArchiveInfo> {\n // Validate inputs\n if (!existsSync(archive)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_NOT_FOUND,\n `Archive not found: ${archive}`,\n Operation.INFO,\n { archive },\n ),\n );\n }\n\n const stats = statSync(archive);\n const filename = basename(archive);\n\n // Detect format from extension\n let format: string;\n let compression: string = \"none\";\n\n if (filename.endsWith(\".tar.gz\") || filename.endsWith(\".tgz\")) {\n format = ArchiveFormat.TAR_GZ;\n compression = \"gzip\";\n } else if (filename.endsWith(\".zip\")) {\n format = ArchiveFormat.ZIP;\n compression = \"deflate\";\n } else if (filename.endsWith(\".gz\")) {\n format = ArchiveFormat.GZIP;\n compression = \"gzip\";\n } else if (filename.endsWith(\".tar\")) {\n format = ArchiveFormat.TAR;\n compression = \"none\";\n } else {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_ARCHIVE_FORMAT,\n `Unsupported archive format: ${filename}`,\n Operation.INFO,\n { archive },\n ),\n );\n }\n\n // Use scan() to get real entry metadata\n const entries = await scan(archive, { include_metadata: true });\n const entry_count = entries.length;\n const total_size = entries.reduce((sum, entry) => sum + (entry.size || 0), 0);\n const compressed_size = stats.size;\n const compression_ratio = total_size > 0 ? compressed_size / total_size : 1.0;\n\n // Check if any entries have checksums\n const has_checksums = entries.some((entry) => entry.checksum !== undefined);\n\n return {\n format: format as \"tar\" | \"tar.gz\" | \"zip\" | \"gzip\",\n compression: compression as \"gzip\" | \"deflate\" | \"none\",\n entry_count,\n total_size,\n compressed_size,\n compression_ratio,\n has_checksums,\n created: stats.mtime.toISOString(),\n };\n}\n\n/**\n * Helper: Extract a single gzip file\n */\nasync function extractGzipFile(\n archive: string,\n destination: string,\n options: ExtractOptions,\n): Promise<ExtractResult> {\n const filename = basename(archive, \".gz\");\n const outputPath = join(destination, filename);\n\n // Check if output file exists\n if (existsSync(outputPath)) {\n if (options.overwrite === \"error\") {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Output file already exists: ${outputPath}`,\n Operation.EXTRACT,\n { path: outputPath, archive },\n ),\n );\n } else if (options.overwrite === \"skip\") {\n return {\n extracted_count: 0,\n skipped_count: 1,\n error_count: 0,\n errors: [],\n warnings: [`Skipped existing file: ${outputPath}`],\n };\n }\n }\n\n try {\n const readStream = createReadStream(archive);\n const writeStream = createWriteStream(outputPath);\n const gunzip = createGunzip();\n\n await new Promise((resolve, reject) => {\n pipeline(readStream, gunzip, writeStream, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve(undefined);\n }\n });\n });\n\n return {\n extracted_count: 1,\n skipped_count: 0,\n error_count: 0,\n errors: [],\n warnings: [],\n };\n } catch (error) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Failed to extract gzip file: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n Operation.EXTRACT,\n { archive, details: { original_error: error } },\n ),\n );\n }\n}\n\n/**\n * Helper: Scan a single gzip file\n */\nasync function scanGzipFile(archive: string, options: ScanOptions): Promise<ArchiveEntry[]> {\n const filename = basename(archive, \".gz\");\n const stats = statSync(archive);\n\n const entry: ArchiveEntry = {\n path: filename,\n type: EntryType.FILE as \"file\",\n size: 0, // Would need to decompress to get actual size\n compressed_size: stats.size,\n modified: stats.mtime.toISOString(),\n ...(options.include_metadata && { mode: \"0644\" }), // Default for gzip files\n };\n\n return [entry];\n}\n\n/**\n * Helper: Create tar.gz archive\n */\nasync function createTarGzArchive(\n sources: string[],\n output: string,\n options: CreateOptions,\n): Promise<ArchiveInfo> {\n const writeStream = createWriteStream(output);\n const archive = archiver(\"tar\", {\n gzip: true,\n gzipOptions: {\n level: options.compression_level,\n },\n });\n\n let entryCount = 0;\n let totalSize = 0;\n\n // Promise that resolves when stream is fully written and closed\n const writePromise = new Promise<void>((resolve, reject) => {\n writeStream.on(\"close\", () => resolve());\n writeStream.on(\"error\", reject);\n });\n\n archive.on(\"error\", (error) => {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `TAR.GZ creation failed: ${error.message}`,\n Operation.CREATE,\n { details: { original_error: error } },\n ),\n );\n });\n\n archive.pipe(writeStream);\n\n // Add files to archive\n for (const sourcePath of sources) {\n if (!existsSync(sourcePath)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.SOURCE_NOT_FOUND,\n `Source not found: ${sourcePath}`,\n Operation.CREATE,\n { details: { source: sourcePath } },\n ),\n );\n }\n\n const stats = statSync(sourcePath);\n if (stats.isDirectory()) {\n // Add directory contents recursively\n await addDirectoryToTarGzArchive(archive, sourcePath, \"\", options);\n } else {\n // Add single file\n const entryName = basename(sourcePath);\n archive.file(sourcePath, {\n name: entryName,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n entryCount++;\n totalSize += stats.size;\n }\n }\n\n await archive.finalize();\n await writePromise; // Wait for stream to flush and close\n\n const outputStats = statSync(output);\n\n return {\n format: ArchiveFormat.TAR_GZ as \"tar.gz\",\n compression: \"gzip\",\n entry_count: entryCount,\n total_size: totalSize,\n compressed_size: outputStats.size,\n compression_ratio: totalSize > 0 ? outputStats.size / totalSize : 0,\n has_checksums: false, // TODO: Add fulhash checksum integration\n created: outputStats.mtime.toISOString(),\n };\n}\n\n/**\n * Helper: Create ZIP archive\n */\nasync function createZipArchive(\n sources: string[],\n output: string,\n options: CreateOptions,\n): Promise<ArchiveInfo> {\n const writeStream = createWriteStream(output);\n const archive = archiver(\"zip\", {\n zlib: { level: options.compression_level },\n });\n\n let entryCount = 0;\n let totalSize = 0;\n\n // Promise that resolves when stream is fully written and closed\n const writePromise = new Promise<void>((resolve, reject) => {\n writeStream.on(\"close\", () => resolve());\n writeStream.on(\"error\", reject);\n });\n\n archive.on(\"error\", (error) => {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `ZIP creation failed: ${error.message}`,\n Operation.CREATE,\n { details: { original_error: error } },\n ),\n );\n });\n\n archive.pipe(writeStream);\n\n // Add files to archive\n for (const sourcePath of sources) {\n if (!existsSync(sourcePath)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.SOURCE_NOT_FOUND,\n `Source not found: ${sourcePath}`,\n Operation.CREATE,\n { details: { source: sourcePath } },\n ),\n );\n }\n\n const stats = statSync(sourcePath);\n if (stats.isDirectory()) {\n // Add directory contents recursively\n await addDirectoryToZipArchive(archive, sourcePath, \"\", options);\n } else {\n // Add single file\n const entryName = basename(sourcePath);\n archive.file(sourcePath, {\n name: entryName,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n entryCount++;\n totalSize += stats.size;\n }\n }\n\n await archive.finalize();\n await writePromise; // Wait for stream to flush and close\n\n const outputStats = statSync(output);\n\n return {\n format: ArchiveFormat.ZIP as \"zip\",\n compression: \"deflate\",\n entry_count: entryCount,\n total_size: totalSize,\n compressed_size: outputStats.size,\n compression_ratio: totalSize > 0 ? outputStats.size / totalSize : 0,\n has_checksums: false,\n created: outputStats.mtime.toISOString(),\n };\n}\n\n/**\n * Helper: Add directory contents to tar.gz archive recursively\n */\nasync function addDirectoryToTarGzArchive(\n archive: archiver.Archiver,\n dirPath: string,\n archivePrefix: string,\n options: CreateOptions,\n): Promise<void> {\n const entries = readdirSync(dirPath);\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n const archivePath = join(archivePrefix, entry);\n\n // Use lstat to detect symlinks without following them\n const stats = lstatSync(fullPath);\n\n if (stats.isSymbolicLink()) {\n // Handle symlinks based on follow_symlinks option\n if (!options.follow_symlinks) {\n // Skip symlinks when follow_symlinks is false (default, secure)\n continue;\n }\n // If follow_symlinks is true, get stats of the target\n const targetStats = statSync(fullPath); // Follows the symlink\n if (targetStats.isDirectory()) {\n await addDirectoryToTarGzArchive(archive, fullPath, archivePath, options);\n } else {\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? targetStats.mode : 0o644,\n });\n }\n } else if (stats.isDirectory()) {\n // Recursively add directory contents\n await addDirectoryToTarGzArchive(archive, fullPath, archivePath, options);\n } else {\n // Add file entry\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n }\n }\n}\n\n/**\n * Helper: Create tar archive (uncompressed)\n */\nasync function createTarArchive(\n sources: string[],\n output: string,\n options: CreateOptions,\n): Promise<ArchiveInfo> {\n const writeStream = createWriteStream(output);\n const archive = archiver(\"tar\", {\n gzip: false, // Uncompressed\n });\n\n let entryCount = 0;\n let totalSize = 0;\n\n // Promise that resolves when stream is fully written and closed\n const writePromise = new Promise<void>((resolve, reject) => {\n writeStream.on(\"close\", () => resolve());\n writeStream.on(\"error\", reject);\n });\n\n archive.on(\"error\", (error) => {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `TAR creation failed: ${error.message}`,\n Operation.CREATE,\n { details: { original_error: error } },\n ),\n );\n });\n\n archive.pipe(writeStream);\n\n // Add files to archive\n for (const sourcePath of sources) {\n if (!existsSync(sourcePath)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.SOURCE_NOT_FOUND,\n `Source not found: ${sourcePath}`,\n Operation.CREATE,\n { details: { source: sourcePath } },\n ),\n );\n }\n\n const stats = statSync(sourcePath);\n if (stats.isDirectory()) {\n await addDirectoryToTarArchive(archive, sourcePath, \"\", options);\n } else {\n const entryName = basename(sourcePath);\n archive.file(sourcePath, {\n name: entryName,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n entryCount++;\n totalSize += stats.size;\n }\n }\n\n await archive.finalize();\n await writePromise; // Wait for stream to flush and close\n\n const outputStats = statSync(output);\n\n return {\n format: ArchiveFormat.TAR as \"tar\",\n compression: \"none\",\n entry_count: entryCount,\n total_size: totalSize,\n compressed_size: outputStats.size,\n compression_ratio: 1.0, // Uncompressed\n has_checksums: false, // TODO: Add fulhash checksum integration\n created: outputStats.mtime.toISOString(),\n };\n}\n\n/**\n * Helper: Add directory contents to tar archive recursively\n */\nasync function addDirectoryToTarArchive(\n archive: archiver.Archiver,\n dirPath: string,\n archivePrefix: string,\n options: CreateOptions,\n): Promise<void> {\n const entries = readdirSync(dirPath);\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n const archivePath = join(archivePrefix, entry);\n\n // Use lstat to detect symlinks without following them\n const stats = lstatSync(fullPath);\n\n if (stats.isSymbolicLink()) {\n // Handle symlinks based on follow_symlinks option\n if (!options.follow_symlinks) {\n // Skip symlinks when follow_symlinks is false (default, secure)\n continue;\n }\n // If follow_symlinks is true, get stats of the target\n const targetStats = statSync(fullPath); // Follows the symlink\n if (targetStats.isDirectory()) {\n await addDirectoryToTarArchive(archive, fullPath, archivePath, options);\n } else {\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? targetStats.mode : 0o644,\n });\n }\n } else if (stats.isDirectory()) {\n await addDirectoryToTarArchive(archive, fullPath, archivePath, options);\n } else {\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n }\n }\n}\n\n/**\n * Helper: Create gzip file (single file compression)\n */\nasync function createGzipFile(\n sources: string[],\n output: string,\n options: CreateOptions,\n): Promise<ArchiveInfo> {\n // Validate single file input\n if (sources.length !== 1) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_OPTIONS,\n `GZIP format requires exactly one source file, got ${sources.length}`,\n Operation.CREATE,\n ),\n );\n }\n\n const sourcePath = sources[0];\n if (!existsSync(sourcePath)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.SOURCE_NOT_FOUND,\n `Source not found: ${sourcePath}`,\n Operation.CREATE,\n { details: { source: sourcePath } },\n ),\n );\n }\n\n const stats = statSync(sourcePath);\n if (stats.isDirectory()) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_OPTIONS,\n \"GZIP format does not support directories\",\n Operation.CREATE,\n { details: { source: sourcePath } },\n ),\n );\n }\n\n // Compress the file\n const readStream = createReadStream(sourcePath);\n const writeStream = createWriteStream(output);\n const gzip = createGzip({ level: options.compression_level });\n\n await new Promise((resolve, reject) => {\n pipeline(readStream, gzip, writeStream, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve(undefined);\n }\n });\n });\n\n const outputStats = statSync(output);\n\n return {\n format: ArchiveFormat.GZIP as \"gzip\",\n compression: \"gzip\",\n entry_count: 1,\n total_size: stats.size,\n compressed_size: outputStats.size,\n compression_ratio: stats.size > 0 ? outputStats.size / stats.size : 0,\n has_checksums: false,\n created: outputStats.mtime.toISOString(),\n };\n}\n\n/**\n * Helper: Add directory contents to ZIP archive recursively\n */\nasync function addDirectoryToZipArchive(\n archive: archiver.Archiver,\n dirPath: string,\n archivePrefix: string,\n options: CreateOptions,\n): Promise<void> {\n const entries = readdirSync(dirPath);\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n const archivePath = join(archivePrefix, entry);\n\n // Use lstat to detect symlinks without following them\n const stats = lstatSync(fullPath);\n\n if (stats.isSymbolicLink()) {\n // Handle symlinks based on follow_symlinks option\n if (!options.follow_symlinks) {\n // Skip symlinks when follow_symlinks is false (default, secure)\n continue;\n }\n // If follow_symlinks is true, get stats of the target\n const targetStats = statSync(fullPath); // Follows the symlink\n if (targetStats.isDirectory()) {\n await addDirectoryToZipArchive(archive, fullPath, archivePath, options);\n } else {\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? targetStats.mode : 0o644,\n });\n }\n } else if (stats.isDirectory()) {\n // Recursively add directory contents\n await addDirectoryToZipArchive(archive, fullPath, archivePath, options);\n } else {\n // Add file entry\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n }\n }\n}\n\n/**\n * Helper: Extract tar.gz archive\n */\nasync function extractTarGz(\n archive: string,\n destination: string,\n options: ExtractOptions,\n): Promise<ExtractResult> {\n const tarStream = await import(\"tar-stream\");\n const extract = tarStream.extract();\n\n let extractedCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n const errors: FulpackError[] = [];\n const warnings: string[] = [];\n\n let totalExtractedSize = 0;\n let entryCount = 0;\n\n extract.on(\"entry\", async (header, stream, next) => {\n entryCount++;\n\n try {\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.EXTRACT,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n );\n stream.resume();\n next();\n return;\n }\n\n // Security: Path traversal and absolute path validation\n const pathError = validatePath(header.name, Operation.EXTRACT, false);\n if (pathError) {\n errors.push({ ...pathError, archive });\n errorCount++;\n stream.resume();\n next();\n return;\n }\n\n const outputPath = join(destination, header.name);\n\n if (header.type === \"directory\") {\n // Create directory\n if (!existsSync(outputPath)) {\n mkdirSync(outputPath, { recursive: true });\n }\n extractedCount++;\n stream.resume();\n next();\n } else if (header.type === \"file\") {\n // Check if file exists\n if (existsSync(outputPath)) {\n if (options.overwrite === \"error\") {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Output file already exists: ${outputPath}`,\n Operation.EXTRACT,\n { path: header.name, archive },\n ),\n );\n errorCount++;\n stream.resume();\n next();\n return;\n } else if (options.overwrite === \"skip\") {\n warnings.push(`Skipped existing file: ${outputPath}`);\n skippedCount++;\n stream.resume();\n next();\n return;\n }\n // overwrite === \"overwrite\" - proceed with extraction\n }\n\n // Ensure parent directory exists\n const parentDir = dirname(outputPath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n\n // Extract file with byte counting for decompression bomb detection\n const writeStream = createWriteStream(outputPath);\n\n // Count actual bytes written (not header size)\n stream.on(\"data\", (chunk: Buffer) => {\n totalExtractedSize += chunk.length;\n\n // Check against max_size based on actual bytes\n if (options.max_size && totalExtractedSize > options.max_size) {\n stream.destroy();\n writeStream.destroy();\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Total extracted size exceeds maximum (${options.max_size} bytes)`,\n Operation.EXTRACT,\n {\n archive,\n path: header.name,\n details: { actual_size: totalExtractedSize, max_size: options.max_size },\n },\n ),\n );\n errorCount++;\n next();\n return;\n }\n });\n\n stream.pipe(writeStream);\n\n writeStream.on(\"finish\", () => {\n // Set permissions if requested\n if (options.preserve_permissions && header.mode) {\n try {\n const { chmodSync } = require(\"node:fs\");\n chmodSync(outputPath, header.mode);\n } catch {\n // Ignore permission errors\n }\n }\n extractedCount++;\n next();\n });\n\n writeStream.on(\"error\", (error) => {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Failed to write file: ${error.message}`,\n Operation.EXTRACT,\n { path: header.name, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n next();\n });\n } else {\n // Skip other types (symlinks, etc.) for security\n warnings.push(`Skipped entry type ${header.type}: ${header.name}`);\n stream.resume();\n next();\n }\n } catch (error) {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Error processing entry: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n Operation.EXTRACT,\n { path: header.name, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n stream.resume();\n next();\n }\n });\n\n // Pipe archive through gunzip and tar-stream\n const readStream = createReadStream(archive);\n const gunzip = createGunzip();\n\n return new Promise((resolve, reject) => {\n extract.on(\"finish\", () => {\n resolve({\n extracted_count: extractedCount,\n skipped_count: skippedCount,\n error_count: errorCount,\n errors: errors.length > 0 ? errors : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n total_bytes: totalExtractedSize,\n });\n });\n\n extract.on(\"error\", (error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `TAR.GZ extraction failed: ${error.message}`,\n Operation.EXTRACT,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n });\n\n // biome-ignore lint/suspicious/noExplicitAny: tar-stream type incompatibility with pipe\n readStream.pipe(gunzip).pipe(extract as any);\n });\n}\n\n/**\n * Helper: Extract tar archive (uncompressed)\n */\nasync function extractTar(\n archive: string,\n destination: string,\n options: ExtractOptions,\n): Promise<ExtractResult> {\n const tarStream = await import(\"tar-stream\");\n const extract = tarStream.extract();\n\n let extractedCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n const errors: FulpackError[] = [];\n const warnings: string[] = [];\n\n let totalExtractedSize = 0;\n let entryCount = 0;\n\n extract.on(\"entry\", async (header, stream, next) => {\n entryCount++;\n\n try {\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.EXTRACT,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n );\n stream.resume();\n next();\n return;\n }\n\n // Security: Path traversal and absolute path validation\n const pathError = validatePath(header.name, Operation.EXTRACT, false);\n if (pathError) {\n errors.push({ ...pathError, archive });\n errorCount++;\n stream.resume();\n next();\n return;\n }\n\n const outputPath = join(destination, header.name);\n\n if (header.type === \"directory\") {\n if (!existsSync(outputPath)) {\n mkdirSync(outputPath, { recursive: true });\n }\n extractedCount++;\n stream.resume();\n next();\n } else if (header.type === \"file\") {\n if (existsSync(outputPath)) {\n if (options.overwrite === \"error\") {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Output file already exists: ${outputPath}`,\n Operation.EXTRACT,\n { path: header.name, archive },\n ),\n );\n errorCount++;\n stream.resume();\n next();\n return;\n } else if (options.overwrite === \"skip\") {\n warnings.push(`Skipped existing file: ${outputPath}`);\n skippedCount++;\n stream.resume();\n next();\n return;\n }\n }\n\n const parentDir = dirname(outputPath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n\n // Extract file with byte counting for decompression bomb detection\n const writeStream = createWriteStream(outputPath);\n\n // Count actual bytes written (not header size)\n stream.on(\"data\", (chunk: Buffer) => {\n totalExtractedSize += chunk.length;\n\n // Check against max_size based on actual bytes\n if (options.max_size && totalExtractedSize > options.max_size) {\n stream.destroy();\n writeStream.destroy();\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Total extracted size exceeds maximum (${options.max_size} bytes)`,\n Operation.EXTRACT,\n {\n archive,\n path: header.name,\n details: { actual_size: totalExtractedSize, max_size: options.max_size },\n },\n ),\n );\n errorCount++;\n next();\n return;\n }\n });\n\n stream.pipe(writeStream);\n\n writeStream.on(\"finish\", () => {\n if (options.preserve_permissions && header.mode) {\n try {\n const { chmodSync } = require(\"node:fs\");\n chmodSync(outputPath, header.mode);\n } catch {\n // Ignore permission errors\n }\n }\n extractedCount++;\n next();\n });\n\n writeStream.on(\"error\", (error) => {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Failed to write file: ${error.message}`,\n Operation.EXTRACT,\n { path: header.name, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n next();\n });\n } else {\n warnings.push(`Skipped entry type ${header.type}: ${header.name}`);\n stream.resume();\n next();\n }\n } catch (error) {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Error processing entry: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n Operation.EXTRACT,\n { path: header.name, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n stream.resume();\n next();\n }\n });\n\n const readStream = createReadStream(archive);\n\n return new Promise((resolve, reject) => {\n extract.on(\"finish\", () => {\n resolve({\n extracted_count: extractedCount,\n skipped_count: skippedCount,\n error_count: errorCount,\n errors: errors.length > 0 ? errors : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n total_bytes: totalExtractedSize,\n });\n });\n\n extract.on(\"error\", (error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `TAR extraction failed: ${error.message}`,\n Operation.EXTRACT,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n });\n\n // biome-ignore lint/suspicious/noExplicitAny: tar-stream type incompatibility with pipe\n readStream.pipe(extract as any);\n });\n}\n\n/**\n * Helper: Extract ZIP archive\n */\nasync function extractZip(\n archive: string,\n destination: string,\n options: ExtractOptions,\n): Promise<ExtractResult> {\n const unzipper = await import(\"unzipper\");\n\n let extractedCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n const errors: FulpackError[] = [];\n const warnings: string[] = [];\n\n let totalExtractedSize = 0;\n let entryCount = 0;\n\n return new Promise((resolve, reject) => {\n const readStream = createReadStream(archive);\n\n readStream\n .pipe(unzipper.Parse())\n // biome-ignore lint/suspicious/noExplicitAny: unzipper entry type not exported\n .on(\"entry\", async (entry: any) => {\n entryCount++;\n\n try {\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.EXTRACT,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n );\n entry.autodrain();\n return;\n }\n\n // Security: Path traversal and absolute path validation\n const pathError = validatePath(entry.path, Operation.EXTRACT, false);\n if (pathError) {\n errors.push({ ...pathError, archive });\n errorCount++;\n entry.autodrain();\n return;\n }\n\n const outputPath = join(destination, entry.path);\n\n if (entry.type === \"Directory\") {\n // Create directory\n if (!existsSync(outputPath)) {\n mkdirSync(outputPath, { recursive: true });\n }\n extractedCount++;\n entry.autodrain();\n } else if (entry.type === \"File\") {\n // Check if file exists\n if (existsSync(outputPath)) {\n if (options.overwrite === \"error\") {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Output file already exists: ${outputPath}`,\n Operation.EXTRACT,\n { path: entry.path, archive },\n ),\n );\n errorCount++;\n entry.autodrain();\n return;\n } else if (options.overwrite === \"skip\") {\n warnings.push(`Skipped existing file: ${outputPath}`);\n skippedCount++;\n entry.autodrain();\n return;\n }\n // overwrite === \"overwrite\" - proceed\n }\n\n // Ensure parent directory exists\n const parentDir = dirname(outputPath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n\n // Extract file with byte counting for decompression bomb detection\n const writeStream = createWriteStream(outputPath);\n\n // Count actual bytes written (not header size)\n entry.on(\"data\", (chunk: Buffer) => {\n totalExtractedSize += chunk.length;\n\n // Check against max_size based on actual bytes\n if (options.max_size && totalExtractedSize > options.max_size) {\n entry.destroy();\n writeStream.destroy();\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Total extracted size exceeds maximum (${options.max_size} bytes)`,\n Operation.EXTRACT,\n {\n archive,\n path: entry.path,\n details: { actual_size: totalExtractedSize, max_size: options.max_size },\n },\n ),\n );\n errorCount++;\n return;\n }\n });\n\n entry.pipe(writeStream);\n\n writeStream.on(\"finish\", () => {\n extractedCount++;\n });\n\n writeStream.on(\"error\", (error: Error) => {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Failed to write file: ${error.message}`,\n Operation.EXTRACT,\n { path: entry.path, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n });\n } else {\n // Skip other types (symlinks, etc.) for security\n warnings.push(`Skipped entry type ${entry.type}: ${entry.path}`);\n entry.autodrain();\n }\n } catch (error) {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Error processing entry: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n Operation.EXTRACT,\n { path: entry.path, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n entry.autodrain();\n }\n })\n .on(\"close\", () => {\n resolve({\n extracted_count: extractedCount,\n skipped_count: skippedCount,\n error_count: errorCount,\n errors: errors.length > 0 ? errors : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n total_bytes: totalExtractedSize,\n });\n })\n .on(\"error\", (error: Error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `ZIP extraction failed: ${error.message}`,\n Operation.EXTRACT,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n });\n });\n}\n\n/**\n * Helper: Scan tar.gz archive\n */\nasync function scanTar(archive: string, options: ScanOptions): Promise<ArchiveEntry[]> {\n const tarStream = await import(\"tar-stream\");\n const extract = tarStream.extract();\n\n const entries: ArchiveEntry[] = [];\n let entryCount = 0;\n\n return new Promise((resolve, reject) => {\n extract.on(\"entry\", async (header, stream, next) => {\n entryCount++;\n\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n stream.resume();\n next();\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.SCAN,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n ),\n );\n return;\n }\n\n // Build entry object with optional metadata\n const entry: ArchiveEntry = {\n path: header.name,\n type:\n header.type === \"directory\"\n ? (EntryType.DIRECTORY as \"directory\")\n : header.type === \"symlink\"\n ? (EntryType.SYMLINK as \"symlink\")\n : (EntryType.FILE as \"file\"),\n size: header.size || 0,\n modified: header.mtime ? header.mtime.toISOString() : new Date().toISOString(),\n ...(options.include_metadata && header.mode !== undefined && header.mode !== null\n ? { mode: `0${(header.mode & 0o777).toString(8)}` }\n : {}),\n ...(options.include_metadata &&\n header.type === \"symlink\" &&\n (header as { linkname?: string }).linkname\n ? { symlink_target: (header as { linkname?: string }).linkname }\n : {}),\n };\n\n entries.push(entry);\n\n // Drain the stream without writing anywhere\n stream.resume();\n next();\n });\n\n extract.on(\"finish\", () => {\n resolve(entries);\n });\n\n extract.on(\"error\", (error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_CORRUPT,\n `TAR scanning failed: ${error.message}`,\n Operation.SCAN,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n });\n\n // Pipe tar file to extractor\n const readStream = createReadStream(archive);\n readStream.pipe(extract as unknown as NodeJS.WritableStream);\n });\n}\n\nasync function scanTarGz(archive: string, options: ScanOptions): Promise<ArchiveEntry[]> {\n const tarStream = await import(\"tar-stream\");\n const extract = tarStream.extract();\n\n const entries: ArchiveEntry[] = [];\n let entryCount = 0;\n\n return new Promise((resolve, reject) => {\n extract.on(\"entry\", async (header, stream, next) => {\n entryCount++;\n\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n stream.resume();\n next();\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.SCAN,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n ),\n );\n return;\n }\n\n // Build entry object with optional metadata\n const entry: ArchiveEntry = {\n path: header.name,\n type:\n header.type === \"directory\"\n ? (EntryType.DIRECTORY as \"directory\")\n : header.type === \"symlink\"\n ? (EntryType.SYMLINK as \"symlink\")\n : (EntryType.FILE as \"file\"),\n size: header.size || 0,\n modified: header.mtime ? header.mtime.toISOString() : new Date().toISOString(),\n ...(options.include_metadata && header.mode !== undefined && header.mode !== null\n ? { mode: `0${(header.mode & 0o777).toString(8)}` }\n : {}),\n ...(options.include_metadata &&\n header.type === \"symlink\" &&\n (header as { linkname?: string }).linkname\n ? { symlink_target: (header as { linkname?: string }).linkname }\n : {}),\n };\n\n entries.push(entry);\n\n // Drain the stream without writing anywhere\n stream.resume();\n next();\n });\n\n extract.on(\"finish\", () => {\n resolve(entries);\n });\n\n extract.on(\"error\", (error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_CORRUPT,\n `TAR.GZ scanning failed: ${error.message}`,\n Operation.SCAN,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n });\n\n // Pipe tar.gz file through gunzip to extractor\n const readStream = createReadStream(archive);\n const gunzip = createGunzip();\n readStream.pipe(gunzip).pipe(extract as unknown as NodeJS.WritableStream);\n });\n}\n\nasync function scanZip(archive: string, options: ScanOptions): Promise<ArchiveEntry[]> {\n const unzipper = await import(\"unzipper\");\n const entries: ArchiveEntry[] = [];\n let entryCount = 0;\n\n return new Promise((resolve, reject) => {\n createReadStream(archive)\n .pipe(unzipper.Parse())\n .on(\"entry\", (entry: unknown) => {\n const typedEntry = entry as {\n path: string;\n type: string;\n vars: {\n uncompressedSize?: number;\n compressedSize?: number;\n lastModifiedTime?: number;\n };\n props?: {\n size?: number;\n compressedSize?: number;\n };\n autodrain: () => void;\n };\n\n entryCount++;\n\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n typedEntry.autodrain();\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.SCAN,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n ),\n );\n return;\n }\n\n // Try multiple sources for size (unzipper library variations)\n const uncompressedSize = typedEntry.vars?.uncompressedSize || typedEntry.props?.size || 0;\n const compressedSize =\n typedEntry.vars?.compressedSize || typedEntry.props?.compressedSize || 0;\n\n // Build entry object with optional metadata\n const archiveEntry: ArchiveEntry = {\n path: typedEntry.path,\n type:\n typedEntry.type === \"Directory\"\n ? (EntryType.DIRECTORY as \"directory\")\n : (EntryType.FILE as \"file\"),\n size: uncompressedSize,\n modified: typedEntry.vars?.lastModifiedTime\n ? new Date(typedEntry.vars.lastModifiedTime).toISOString()\n : new Date().toISOString(),\n ...(options.include_metadata\n ? {\n compressed_size: compressedSize,\n mode: \"0644\", // ZIP format doesn't preserve Unix permissions consistently\n }\n : {}),\n };\n\n entries.push(archiveEntry);\n\n // Drain the entry stream without writing anywhere\n typedEntry.autodrain();\n })\n .on(\"error\", (error: Error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_CORRUPT,\n `ZIP scanning failed: ${error.message}`,\n Operation.SCAN,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n })\n .on(\"finish\", () => {\n resolve(entries);\n });\n });\n}\n","/**\n * Fulpack Module\n *\n * Canonical archive operations with Pathfinder integration.\n * Provides create, extract, scan, verify, and info operations for\n * tar, tar.gz, zip, and gzip formats with security protections.\n */\n\n// Export Crucible-generated types (canonical source)\nexport * from \"../crucible/fulpack/types.js\";\n\n// Export core operations (tsfulmen implementation)\nexport { create, extract, info, scan, verify } from \"./core.js\";\n\n// Export error handling\nexport * from \"./errors.js\";\n\n// Version information\nexport const FULPACK_VERSION = \"1.0.0\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/crucible/fulpack/types.ts","../../src/fulpack/errors.ts","../../src/fulpack/core.ts","../../src/fulpack/index.ts"],"names":["ArchiveFormat","EntryType","Operation","extract"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Fulpack Types - Generated from Crucible schemas.\n *\n * This file is AUTO-GENERATED from the Fulpack module specification.\n * DO NOT EDIT MANUALLY - changes will be overwritten.\n *\n * Schema Version: v1.0.0\n * Last Reviewed: 2025-11-12\n * Source: schemas/library/fulpack/v1.0.0/\n *\n * See: https://github.com/fulmenhq/crucible/blob/main/docs/standards/library/modules/fulpack.md\n */\n\n// ============================================================================\n// Enums (TypeScript Enums)\n// ============================================================================\n\n/**\n * ArchiveFormat enum\n * @see schemas/taxonomy/library/fulpack/archive-formats/v1.0.0/formats.yaml\n */\nexport enum ArchiveFormat {\n /** POSIX tar archive (uncompressed) */\n TAR = \"tar\",\n /** POSIX tar archive with gzip compression */\n TAR_GZ = \"tar.gz\",\n /** ZIP archive with deflate compression */\n ZIP = \"zip\",\n /** GZIP compressed single file */\n GZIP = \"gzip\",\n}\n\n/**\n * EntryType enum\n * @see schemas/taxonomy/library/fulpack/entry-types/v1.0.0/types.yaml\n */\nexport enum EntryType {\n /** Normal file with data */\n FILE = \"file\",\n /** Directory/folder entry */\n DIRECTORY = \"directory\",\n /** Symbolic link to another entry */\n SYMLINK = \"symlink\",\n}\n\n/**\n * Operation enum\n * @see schemas/taxonomy/library/fulpack/operations/v1.0.0/operations.yaml\n */\nexport enum Operation {\n /** Create new archive from source files/directories */\n CREATE = \"create\",\n /** Extract archive contents to destination */\n EXTRACT = \"extract\",\n /** List archive entries (for Pathfinder integration) */\n SCAN = \"scan\",\n /** Validate archive integrity and checksums */\n VERIFY = \"verify\",\n /** Get archive metadata without extraction */\n INFO = \"info\",\n}\n\n// ============================================================================\n// Structured Error Types\n// ============================================================================\n\n/**\n * Structured error context for fulpack operations.\n * Enables programmatic error handling and observability.\n *\n * @see docs/standards/library/modules/fulpack.md\n */\nexport interface FulpackError {\n /**\n * Canonical error code for programmatic handling.\n * Examples: \"PATH_TRAVERSAL\", \"DECOMPRESSION_BOMB\", \"ABSOLUTE_PATH\", \"SYMLINK_ESCAPE\"\n */\n readonly code: string;\n\n /**\n * Human-readable error message describing what went wrong.\n */\n readonly message: string;\n\n /**\n * Operation that generated this error.\n */\n readonly operation: Operation;\n\n /**\n * Entry path that caused the error (if applicable).\n * Example: \"../../../etc/passwd\"\n */\n readonly path?: string;\n\n /**\n * Archive file path being processed.\n */\n readonly archive?: string;\n\n /**\n * Source file path for create operations.\n */\n readonly source?: string;\n\n /**\n * Additional structured context for debugging and telemetry.\n */\n readonly details?: {\n /** Entry index in archive (0-based) */\n readonly entry_index?: number;\n /** Compression ratio that triggered bomb detection */\n readonly compression_ratio?: number;\n /** Actual decompressed size in bytes */\n readonly actual_size?: number;\n /** Maximum allowed size in bytes */\n readonly max_size?: number;\n /** Maximum allowed entries */\n readonly max_entries?: number;\n /** Actual entry count */\n readonly entry_count?: number;\n /** Additional context (extensible) */\n readonly [key: string]: unknown;\n };\n}\n\n// ============================================================================\n// Data Structures (Interfaces)\n// ============================================================================\n\n/**\n * Metadata about an archive file\n * @see schemas/library/fulpack/v1.0.0/archive-info.schema.json\n */\nexport interface ArchiveInfo {\n readonly format: \"tar\" | \"tar.gz\" | \"zip\" | \"gzip\"; // Archive format from archive-formats taxonomy\n readonly entry_count: number; // Total number of entries in the archive\n readonly total_size: number; // Total uncompressed size in bytes\n readonly compressed_size: number; // Compressed archive file size in bytes\n readonly compression?: \"gzip\" | \"deflate\" | \"none\"; // Compression algorithm used\n readonly compression_ratio?: number; // Compression ratio (total_size / compressed_size)\n readonly has_checksums?: boolean; // Whether the archive contains checksums\n readonly checksum_algorithm?: \"xxh3-128\" | \"sha256\" | \"sha512\" | \"sha1\" | \"md5\"; // Checksum algorithm used from fulhash module (xxh3-128 and sha256 are standard, others may require optional extensions)\n readonly created?: string; // Archive creation timestamp (ISO 8601 format)\n}\n\n/**\n * Metadata for a single archive entry (returned by scan operation)\n * @see schemas/library/fulpack/v1.0.0/archive-entry.schema.json\n */\nexport interface ArchiveEntry {\n readonly path: string; // Normalized entry path within archive\n readonly type: \"file\" | \"directory\" | \"symlink\"; // Entry type from entry-types taxonomy\n readonly size: number; // Uncompressed size in bytes\n readonly compressed_size?: number; // Compressed size in bytes (if available)\n readonly modified?: string; // Modification timestamp (ISO 8601 format)\n readonly checksum?: string; // SHA-256 checksum (64 hex characters)\n readonly mode?: string; // Unix file permissions (octal string, e.g., '0644')\n readonly symlink_target?: string | null; // Target path if type is symlink, null otherwise\n}\n\n/**\n * Complete archive table of contents (for large archives and caching)\n * @see schemas/library/fulpack/v1.0.0/archive-manifest.schema.json\n */\nexport interface ArchiveManifest {\n readonly format: \"tar\" | \"tar.gz\" | \"zip\" | \"gzip\"; // Archive format from archive-formats taxonomy\n readonly version: string; // Manifest schema version (semantic versioning)\n readonly generated: string; // Manifest generation timestamp (ISO 8601 format)\n readonly entry_count: number; // Total number of entries in manifest\n readonly entries: unknown[]; // Array of archive entries\n readonly total_size?: number; // Total uncompressed size in bytes\n readonly compressed_size?: number; // Compressed archive file size in bytes\n readonly index?: Record<string, unknown>; // Optional searchable index for fast lookups\n}\n\n/**\n * Result of archive integrity verification (from verify operation)\n * @see schemas/library/fulpack/v1.0.0/validation-result.schema.json\n */\nexport interface ValidationResult {\n readonly valid: boolean; // Whether the archive is valid and intact\n readonly errors: FulpackError[]; // Array of validation errors (empty if valid)\n readonly warnings: string[]; // Array of non-critical warnings (e.g., missing checksums)\n readonly entry_count: number; // Number of entries validated\n readonly checksums_verified?: number; // Number of checksums successfully verified\n readonly checks_performed?: (\n | \"structure_valid\"\n | \"checksums_verified\"\n | \"no_path_traversal\"\n | \"no_decompression_bomb\"\n | \"symlinks_safe\"\n )[]; // List of security and integrity checks performed\n}\n\n/**\n * Result of archive extraction operation\n * @see schemas/library/fulpack/v1.0.0/extract-result.schema.json\n */\nexport interface ExtractResult {\n readonly extracted_count: number; // Number of entries successfully extracted\n readonly skipped_count: number; // Number of entries skipped (e.g., already exists)\n readonly error_count: number; // Number of entries that failed to extract\n readonly errors?: FulpackError[]; // Array of error messages for failed extractions\n readonly warnings?: string[]; // Array of warning messages (e.g., skipped files)\n readonly checksums_verified?: number; // Number of checksums successfully verified during extraction\n readonly total_bytes?: number; // Total bytes extracted\n}\n\n// ============================================================================\n// Options (Partial Interfaces)\n// ============================================================================\n\n/**\n * Options for archive creation operation\n * @see schemas/library/fulpack/v1.0.0/create-options.schema.json\n *\n * All fields are optional. Use when calling functions.\n */\nexport interface CreateOptions {\n compression_level?: number; // Compression level (1=fastest, 9=best compression, format-dependent)\n include_patterns?: string[]; // Glob patterns for files to include (e.g., ['**/*.py', '**/*.md'])\n exclude_patterns?: string[]; // Glob patterns for files to exclude (e.g., ['**/__pycache__', '**/.git'])\n checksum_algorithm?: \"xxh3-128\" | \"sha256\" | \"sha512\" | \"sha1\" | \"md5\"; // Checksum algorithm for entry verification (xxh3-128 and sha256 are standard via fulhash module, others may require optional extensions)\n preserve_permissions?: boolean; // Preserve Unix file permissions in archive\n follow_symlinks?: boolean; // Follow symbolic links and archive their targets\n}\n\n/**\n * Options for archive extraction operation\n * @see schemas/library/fulpack/v1.0.0/extract-options.schema.json\n *\n * All fields are optional. Use when calling functions.\n */\nexport interface ExtractOptions {\n overwrite?: \"error\" | \"skip\" | \"overwrite\"; // How to handle existing files (error=fail, skip=keep existing, overwrite=replace)\n verify_checksums?: boolean; // Verify checksums during extraction if available\n preserve_permissions?: boolean; // Preserve Unix file permissions from archive\n include_patterns?: string[]; // Glob patterns for entries to extract (e.g., ['**/*.csv'])\n max_size?: number; // Maximum total decompressed size in bytes (decompression bomb protection)\n max_entries?: number; // Maximum number of entries to extract (decompression bomb protection)\n}\n\n/**\n * Options for archive scanning operation (for Pathfinder integration)\n * @see schemas/library/fulpack/v1.0.0/scan-options.schema.json\n *\n * All fields are optional. Use when calling functions.\n */\nexport interface ScanOptions {\n include_metadata?: boolean; // Include metadata (size, checksum, modified timestamp) in results\n entry_types?: (\"file\" | \"directory\" | \"symlink\")[]; // Filter entries by type (from entry-types taxonomy)\n max_depth?: number | null; // Maximum depth for directory traversal (null = unlimited)\n max_entries?: number; // Safety limit for maximum entries to return\n}\n\n// ============================================================================\n// Module Metadata\n// ============================================================================\n\n/**\n * Module version for compatibility checks.\n */\nexport const FULPACK_VERSION = \"v1.0.0\";\n","/**\n * Fulpack Error Handling\n *\n * Canonical error creation and management for fulpack operations.\n * Follows Foundry error schema patterns.\n */\n\nimport type { FulpackError } from \"../crucible/fulpack/types.js\";\nimport { Operation } from \"../crucible/fulpack/types.js\";\n\n/**\n * Create a canonical fulpack error\n */\nexport function createFulpackError(\n code: string,\n message: string,\n operation: Operation,\n context?: {\n path?: string;\n archive?: string;\n details?: Record<string, unknown>;\n },\n): FulpackError {\n return {\n code,\n message,\n operation,\n ...(context?.path && { path: context.path }),\n ...(context?.archive && { archive: context.archive }),\n ...(context?.details && { details: context.details }),\n };\n}\n\n/**\n * Canonical error codes for fulpack operations\n */\nexport const ERROR_CODES = {\n // Validation Errors\n INVALID_ARCHIVE_FORMAT: \"INVALID_ARCHIVE_FORMAT\",\n INVALID_PATH: \"INVALID_PATH\",\n INVALID_OPTIONS: \"INVALID_OPTIONS\",\n\n // Security Errors\n PATH_TRAVERSAL: \"PATH_TRAVERSAL\",\n ABSOLUTE_PATH: \"ABSOLUTE_PATH\",\n SYMLINK_ESCAPE: \"SYMLINK_ESCAPE\",\n DECOMPRESSION_BOMB: \"DECOMPRESSION_BOMB\",\n CHECKSUM_MISMATCH: \"CHECKSUM_MISMATCH\",\n\n // Runtime Errors\n ARCHIVE_NOT_FOUND: \"ARCHIVE_NOT_FOUND\",\n ARCHIVE_CORRUPT: \"ARCHIVE_CORRUPT\",\n EXTRACTION_FAILED: \"EXTRACTION_FAILED\",\n PERMISSION_DENIED: \"PERMISSION_DENIED\",\n DISK_FULL: \"DISK_FULL\",\n SOURCE_NOT_FOUND: \"SOURCE_NOT_FOUND\",\n} as const;\n\n/**\n * Error class for fulpack operations\n */\nexport class FulpackOperationError extends Error {\n public readonly code: string;\n public readonly operation: Operation;\n public readonly path?: string;\n public readonly archive?: string;\n public readonly details?: Record<string, unknown>;\n\n constructor(error: FulpackError) {\n super(error.message);\n this.name = \"FulpackOperationError\";\n this.code = error.code;\n this.operation = error.operation;\n this.path = error.path;\n this.archive = error.archive;\n this.details = error.details;\n }\n\n /**\n * Convert back to canonical error format\n */\n toCanonical(): FulpackError {\n return {\n code: this.code,\n message: this.message,\n operation: this.operation,\n ...(this.path && { path: this.path }),\n ...(this.archive && { archive: this.archive }),\n ...(this.details && { details: this.details }),\n };\n }\n}\n\n/**\n * Security validation utilities\n */\n\n/**\n * Check for path traversal attempts\n */\nexport function hasPathTraversal(path: string): boolean {\n return path.includes(\"..\") || path.includes(\"\\\\..\");\n}\n\n/**\n * Check for absolute paths\n */\nexport function isAbsolutePath(path: string): boolean {\n return path.startsWith(\"/\") || /^[a-zA-Z]:/.test(path);\n}\n\n/**\n * Normalize path and check for security issues\n */\nexport function validatePath(\n path: string,\n operation: Operation,\n allowAbsolute = false,\n): FulpackError | null {\n if (!allowAbsolute && isAbsolutePath(path)) {\n return createFulpackError(\n ERROR_CODES.ABSOLUTE_PATH,\n `Absolute path not allowed: ${path}`,\n operation,\n { path },\n );\n }\n\n if (hasPathTraversal(path)) {\n return createFulpackError(\n ERROR_CODES.PATH_TRAVERSAL,\n `Path traversal detected: ${path}`,\n operation,\n { path },\n );\n }\n\n return null;\n}\n\n/**\n * Check for decompression bomb characteristics\n */\nexport function checkDecompressionBomb(\n uncompressedSize: number,\n compressedSize: number,\n maxSize: number,\n maxEntries: number,\n currentEntries: number,\n): FulpackError | null {\n if (uncompressedSize > maxSize) {\n return createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Archive exceeds maximum size limit`,\n Operation.EXTRACT,\n {\n details: {\n actual_size: uncompressedSize,\n max_size: maxSize,\n },\n },\n );\n }\n\n if (currentEntries > maxEntries) {\n return createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Archive exceeds maximum entry limit`,\n Operation.EXTRACT,\n {\n details: {\n actual_size: currentEntries,\n max_size: maxEntries,\n },\n },\n );\n }\n\n // Check compression ratio (warn if >100:1)\n if (compressedSize > 0 && uncompressedSize / compressedSize > 100) {\n return createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Suspicious compression ratio detected`,\n Operation.EXTRACT,\n {\n details: {\n compression_ratio: uncompressedSize / compressedSize,\n },\n },\n );\n }\n\n return null;\n}\n","/**\n * Fulpack Core Implementation\n *\n * Main archive operations implementation for TypeScript.\n * Currently supports tar.gz format with security protections.\n */\n\nimport {\n createReadStream,\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { pipeline } from \"node:stream\";\nimport { createGunzip, createGzip } from \"node:zlib\";\nimport { type Archiver, TarArchive, ZipArchive } from \"archiver\";\n// Import interfaces/types as TYPE-ONLY\nimport type {\n ArchiveEntry,\n ArchiveInfo,\n CreateOptions,\n ExtractOptions,\n ExtractResult,\n FulpackError,\n ScanOptions,\n ValidationResult,\n} from \"../crucible/fulpack/types.js\";\n// Import enums as VALUES (runtime objects)\nimport { ArchiveFormat, EntryType, Operation } from \"../crucible/fulpack/types.js\";\n\nimport { createFulpackError, ERROR_CODES, FulpackOperationError, validatePath } from \"./errors.js\";\n\n/**\n * Default options for operations\n */\nconst DEFAULTS = {\n CREATE: {\n compression_level: 6,\n checksum_algorithm: \"sha256\" as const,\n preserve_permissions: true,\n follow_symlinks: false,\n },\n EXTRACT: {\n overwrite: \"error\" as const,\n verify_checksums: true,\n preserve_permissions: true,\n max_size: 1024 * 1024 * 1024, // 1GB\n max_entries: 100000,\n },\n SCAN: {\n include_metadata: true,\n max_entries: 100000,\n },\n} as const;\n\n/**\n * Create an archive from source files/directories\n */\nexport async function create(\n source: string | string[],\n output: string,\n format: ArchiveFormat,\n options?: CreateOptions,\n): Promise<ArchiveInfo> {\n const opts = { ...DEFAULTS.CREATE, ...options };\n const sources = Array.isArray(source) ? source : [source];\n\n // Validate inputs\n if (\n format !== ArchiveFormat.TAR &&\n format !== ArchiveFormat.TAR_GZ &&\n format !== ArchiveFormat.ZIP &&\n format !== ArchiveFormat.GZIP\n ) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_ARCHIVE_FORMAT,\n `Format ${format} not yet supported`,\n Operation.CREATE,\n ),\n );\n }\n\n // Ensure output directory exists\n const outputDir = dirname(output);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n if (format === ArchiveFormat.ZIP) {\n return await createZipArchive(sources, output, opts);\n } else if (format === ArchiveFormat.TAR_GZ) {\n return await createTarGzArchive(sources, output, opts);\n } else if (format === ArchiveFormat.TAR) {\n return await createTarArchive(sources, output, opts);\n } else if (format === ArchiveFormat.GZIP) {\n return await createGzipFile(sources, output, opts);\n } else {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_ARCHIVE_FORMAT,\n `Unsupported format for creation: ${format}`,\n Operation.CREATE,\n ),\n );\n }\n}\n\n/**\n * Extract archive contents to destination\n */\nexport async function extract(\n archive: string,\n destination: string,\n options?: ExtractOptions,\n): Promise<ExtractResult> {\n const opts = { ...DEFAULTS.EXTRACT, ...options };\n\n // Validate inputs\n if (!existsSync(archive)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_NOT_FOUND,\n `Archive not found: ${archive}`,\n Operation.EXTRACT,\n { archive },\n ),\n );\n }\n\n // Ensure destination exists\n if (!existsSync(destination)) {\n mkdirSync(destination, { recursive: true });\n }\n\n // Detect format by extension and route to appropriate extractor\n if (archive.endsWith(\".tar.gz\") || archive.endsWith(\".tgz\")) {\n return await extractTarGz(archive, destination, opts);\n } else if (archive.endsWith(\".tar\")) {\n return await extractTar(archive, destination, opts);\n } else if (archive.endsWith(\".zip\")) {\n return await extractZip(archive, destination, opts);\n } else if (archive.endsWith(\".gz\")) {\n // Single file gzip\n return await extractGzipFile(archive, destination, opts);\n } else {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_ARCHIVE_FORMAT,\n `Unsupported archive format for extraction: ${archive}`,\n Operation.EXTRACT,\n { archive },\n ),\n );\n }\n}\n\n/**\n * Scan archive entries without extraction\n */\nexport async function scan(archive: string, options?: ScanOptions): Promise<ArchiveEntry[]> {\n const opts = { ...DEFAULTS.SCAN, ...options };\n\n // Validate inputs\n if (!existsSync(archive)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_NOT_FOUND,\n `Archive not found: ${archive}`,\n Operation.SCAN,\n { archive },\n ),\n );\n }\n\n const filename = basename(archive);\n\n // Route to appropriate format scanner\n if (filename.endsWith(\".tar.gz\") || filename.endsWith(\".tgz\")) {\n return await scanTarGz(archive, opts);\n } else if (filename.endsWith(\".tar\")) {\n return await scanTar(archive, opts);\n } else if (filename.endsWith(\".zip\")) {\n return await scanZip(archive, opts);\n } else if (filename.endsWith(\".gz\")) {\n // Single file gzip (not tar.gz)\n return await scanGzipFile(archive, opts);\n } else {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_ARCHIVE_FORMAT,\n `Unsupported archive format: ${filename}`,\n Operation.SCAN,\n { archive },\n ),\n );\n }\n}\n\n/**\n * Verify archive integrity and checksums\n */\nexport async function verify(\n archive: string,\n _options?: Record<string, unknown>,\n): Promise<ValidationResult> {\n // Validate inputs\n if (!existsSync(archive)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_NOT_FOUND,\n `Archive not found: ${archive}`,\n Operation.VERIFY,\n { archive },\n ),\n );\n }\n\n const stats = statSync(archive);\n const errors: FulpackError[] = [];\n const warnings: string[] = [];\n const checks_performed: (\n | \"structure_valid\"\n | \"checksums_verified\"\n | \"no_path_traversal\"\n | \"no_decompression_bomb\"\n | \"symlinks_safe\"\n )[] = [];\n let entry_count = 0;\n let checksums_verified = 0;\n\n // Basic structure validation\n checks_performed.push(\"structure_valid\");\n if (stats.size === 0) {\n errors.push(\n createFulpackError(ERROR_CODES.ARCHIVE_CORRUPT, \"Archive file is empty\", Operation.VERIFY, {\n archive,\n }),\n );\n return {\n valid: false,\n errors,\n warnings,\n entry_count: 0,\n checksums_verified: 0,\n checks_performed,\n };\n }\n\n // Scan archive to get entries and perform security checks\n let entries: ArchiveEntry[];\n try {\n entries = await scan(archive, { include_metadata: true });\n entry_count = entries.length;\n } catch (error) {\n errors.push(\n createFulpackError(\n ERROR_CODES.ARCHIVE_CORRUPT,\n `Failed to scan archive: ${error instanceof Error ? error.message : String(error)}`,\n Operation.VERIFY,\n { archive, details: { original_error: error } },\n ),\n );\n return {\n valid: false,\n errors,\n warnings,\n entry_count: 0,\n checksums_verified: 0,\n checks_performed,\n };\n }\n\n // Security check: Path traversal detection\n checks_performed.push(\"no_path_traversal\");\n for (const entry of entries) {\n const pathError = validatePath(entry.path, Operation.VERIFY, true);\n if (pathError) {\n errors.push({ ...pathError, archive });\n }\n }\n\n // Security check: Symlink safety (if symlinks present)\n const symlinks = entries.filter((e) => e.type === \"symlink\");\n if (symlinks.length > 0) {\n checks_performed.push(\"symlinks_safe\");\n for (const symlink of symlinks) {\n if (symlink.symlink_target) {\n // Check if symlink target attempts to escape (../ or absolute path)\n const targetError = validatePath(symlink.symlink_target, Operation.VERIFY, true);\n if (targetError) {\n errors.push(\n createFulpackError(\n ERROR_CODES.ARCHIVE_CORRUPT,\n `Symlink '${symlink.path}' targets unsafe location: ${symlink.symlink_target}`,\n Operation.VERIFY,\n { archive, path: symlink.path, details: { symlink_target: symlink.symlink_target } },\n ),\n );\n }\n }\n }\n }\n\n // Security check: Decompression bomb detection\n checks_performed.push(\"no_decompression_bomb\");\n const total_size = entries.reduce((sum, entry) => sum + (entry.size || 0), 0);\n const compressed_size = stats.size;\n const compression_ratio =\n total_size > 0 && compressed_size > 0 ? total_size / compressed_size : 1.0;\n\n // Warn if compression ratio exceeds 100:1 (per Crucible standard)\n if (compression_ratio > 100) {\n warnings.push(\n `High compression ratio detected: ${compression_ratio.toFixed(1)}:1 (threshold: 100:1)`,\n );\n }\n\n // Warn if total size exceeds 1GB (default max_size)\n const MAX_SIZE = 1024 * 1024 * 1024; // 1GB\n if (total_size > MAX_SIZE) {\n warnings.push(\n `Total uncompressed size (${(total_size / (1024 * 1024)).toFixed(1)}MB) exceeds recommended limit (1GB)`,\n );\n }\n\n // Warn if entry count exceeds 100k (default max_entries)\n const MAX_ENTRIES = 100000;\n if (entry_count > MAX_ENTRIES) {\n warnings.push(`Entry count (${entry_count}) exceeds recommended limit (${MAX_ENTRIES})`);\n }\n\n // Check for checksums\n const entriesWithChecksums = entries.filter((e) => e.checksum !== undefined);\n if (entriesWithChecksums.length > 0) {\n checks_performed.push(\"checksums_verified\");\n checksums_verified = entriesWithChecksums.length;\n // Note: Actual checksum verification would require extracting and re-hashing\n // For Phase 2, we just report how many checksums are present\n } else if (entry_count > 0) {\n warnings.push(\"Archive does not contain checksums for integrity verification\");\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n entry_count,\n checksums_verified,\n checks_performed,\n };\n}\n\n/**\n * Get archive metadata without extraction\n */\nexport async function info(archive: string): Promise<ArchiveInfo> {\n // Validate inputs\n if (!existsSync(archive)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_NOT_FOUND,\n `Archive not found: ${archive}`,\n Operation.INFO,\n { archive },\n ),\n );\n }\n\n const stats = statSync(archive);\n const filename = basename(archive);\n\n // Detect format from extension\n let format: string;\n let compression: string = \"none\";\n\n if (filename.endsWith(\".tar.gz\") || filename.endsWith(\".tgz\")) {\n format = ArchiveFormat.TAR_GZ;\n compression = \"gzip\";\n } else if (filename.endsWith(\".zip\")) {\n format = ArchiveFormat.ZIP;\n compression = \"deflate\";\n } else if (filename.endsWith(\".gz\")) {\n format = ArchiveFormat.GZIP;\n compression = \"gzip\";\n } else if (filename.endsWith(\".tar\")) {\n format = ArchiveFormat.TAR;\n compression = \"none\";\n } else {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_ARCHIVE_FORMAT,\n `Unsupported archive format: ${filename}`,\n Operation.INFO,\n { archive },\n ),\n );\n }\n\n // Use scan() to get real entry metadata\n const entries = await scan(archive, { include_metadata: true });\n const entry_count = entries.length;\n const total_size = entries.reduce((sum, entry) => sum + (entry.size || 0), 0);\n const compressed_size = stats.size;\n const compression_ratio = total_size > 0 ? compressed_size / total_size : 1.0;\n\n // Check if any entries have checksums\n const has_checksums = entries.some((entry) => entry.checksum !== undefined);\n\n return {\n format: format as \"tar\" | \"tar.gz\" | \"zip\" | \"gzip\",\n compression: compression as \"gzip\" | \"deflate\" | \"none\",\n entry_count,\n total_size,\n compressed_size,\n compression_ratio,\n has_checksums,\n created: stats.mtime.toISOString(),\n };\n}\n\n/**\n * Helper: Extract a single gzip file\n */\nasync function extractGzipFile(\n archive: string,\n destination: string,\n options: ExtractOptions,\n): Promise<ExtractResult> {\n const filename = basename(archive, \".gz\");\n const outputPath = join(destination, filename);\n\n // Check if output file exists\n if (existsSync(outputPath)) {\n if (options.overwrite === \"error\") {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Output file already exists: ${outputPath}`,\n Operation.EXTRACT,\n { path: outputPath, archive },\n ),\n );\n } else if (options.overwrite === \"skip\") {\n return {\n extracted_count: 0,\n skipped_count: 1,\n error_count: 0,\n errors: [],\n warnings: [`Skipped existing file: ${outputPath}`],\n };\n }\n }\n\n try {\n const readStream = createReadStream(archive);\n const writeStream = createWriteStream(outputPath);\n const gunzip = createGunzip();\n\n await new Promise((resolve, reject) => {\n pipeline(readStream, gunzip, writeStream, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve(undefined);\n }\n });\n });\n\n return {\n extracted_count: 1,\n skipped_count: 0,\n error_count: 0,\n errors: [],\n warnings: [],\n };\n } catch (error) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Failed to extract gzip file: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n Operation.EXTRACT,\n { archive, details: { original_error: error } },\n ),\n );\n }\n}\n\n/**\n * Helper: Scan a single gzip file\n */\nasync function scanGzipFile(archive: string, options: ScanOptions): Promise<ArchiveEntry[]> {\n const filename = basename(archive, \".gz\");\n const stats = statSync(archive);\n\n const entry: ArchiveEntry = {\n path: filename,\n type: EntryType.FILE as \"file\",\n size: 0, // Would need to decompress to get actual size\n compressed_size: stats.size,\n modified: stats.mtime.toISOString(),\n ...(options.include_metadata && { mode: \"0644\" }), // Default for gzip files\n };\n\n return [entry];\n}\n\n/**\n * Helper: Create tar.gz archive\n */\nasync function createTarGzArchive(\n sources: string[],\n output: string,\n options: CreateOptions,\n): Promise<ArchiveInfo> {\n const writeStream = createWriteStream(output);\n const archive = new TarArchive({\n gzip: true,\n gzipOptions: {\n level: options.compression_level,\n },\n });\n\n let entryCount = 0;\n let totalSize = 0;\n\n // Resolves when the output stream flushes and closes; rejects on a stream or\n // archiver error. The archive \"error\" listener rejects this promise rather\n // than throwing inside the handler — a throw there escapes as an uncaught\n // exception instead of rejecting create().\n const writePromise = new Promise<void>((resolve, reject) => {\n writeStream.on(\"close\", () => resolve());\n writeStream.on(\"error\", reject);\n archive.on(\"error\", (error) =>\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `TAR.GZ creation failed: ${error.message}`,\n Operation.CREATE,\n { details: { original_error: error } },\n ),\n ),\n ),\n );\n });\n\n archive.pipe(writeStream);\n\n // Add files to archive\n for (const sourcePath of sources) {\n if (!existsSync(sourcePath)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.SOURCE_NOT_FOUND,\n `Source not found: ${sourcePath}`,\n Operation.CREATE,\n { details: { source: sourcePath } },\n ),\n );\n }\n\n const stats = statSync(sourcePath);\n if (stats.isDirectory()) {\n // Add directory contents recursively\n await addDirectoryToTarGzArchive(archive, sourcePath, \"\", options);\n } else {\n // Add single file\n const entryName = basename(sourcePath);\n archive.file(sourcePath, {\n name: entryName,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n entryCount++;\n totalSize += stats.size;\n }\n }\n\n // finalize() may also reject on a module-level error; that same error is\n // surfaced (wrapped) via the archive \"error\" handler above, so swallow the\n // raw rejection here and let writePromise own success/failure.\n archive.finalize().catch(() => {});\n await writePromise; // Wait for stream to flush and close (or reject on error)\n\n const outputStats = statSync(output);\n\n return {\n format: ArchiveFormat.TAR_GZ as \"tar.gz\",\n compression: \"gzip\",\n entry_count: entryCount,\n total_size: totalSize,\n compressed_size: outputStats.size,\n compression_ratio: totalSize > 0 ? outputStats.size / totalSize : 0,\n has_checksums: false, // TODO: Add fulhash checksum integration\n created: outputStats.mtime.toISOString(),\n };\n}\n\n/**\n * Helper: Create ZIP archive\n */\nasync function createZipArchive(\n sources: string[],\n output: string,\n options: CreateOptions,\n): Promise<ArchiveInfo> {\n const writeStream = createWriteStream(output);\n const archive = new ZipArchive({\n zlib: { level: options.compression_level },\n });\n\n let entryCount = 0;\n let totalSize = 0;\n\n // Resolves when the output stream flushes and closes; rejects on a stream or\n // archiver error. The archive \"error\" listener rejects this promise rather\n // than throwing inside the handler — a throw there escapes as an uncaught\n // exception instead of rejecting create().\n const writePromise = new Promise<void>((resolve, reject) => {\n writeStream.on(\"close\", () => resolve());\n writeStream.on(\"error\", reject);\n archive.on(\"error\", (error) =>\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `ZIP creation failed: ${error.message}`,\n Operation.CREATE,\n { details: { original_error: error } },\n ),\n ),\n ),\n );\n });\n\n archive.pipe(writeStream);\n\n // Add files to archive\n for (const sourcePath of sources) {\n if (!existsSync(sourcePath)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.SOURCE_NOT_FOUND,\n `Source not found: ${sourcePath}`,\n Operation.CREATE,\n { details: { source: sourcePath } },\n ),\n );\n }\n\n const stats = statSync(sourcePath);\n if (stats.isDirectory()) {\n // Add directory contents recursively\n await addDirectoryToZipArchive(archive, sourcePath, \"\", options);\n } else {\n // Add single file\n const entryName = basename(sourcePath);\n archive.file(sourcePath, {\n name: entryName,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n entryCount++;\n totalSize += stats.size;\n }\n }\n\n // finalize() may also reject on a module-level error; that same error is\n // surfaced (wrapped) via the archive \"error\" handler above, so swallow the\n // raw rejection here and let writePromise own success/failure.\n archive.finalize().catch(() => {});\n await writePromise; // Wait for stream to flush and close (or reject on error)\n\n const outputStats = statSync(output);\n\n return {\n format: ArchiveFormat.ZIP as \"zip\",\n compression: \"deflate\",\n entry_count: entryCount,\n total_size: totalSize,\n compressed_size: outputStats.size,\n compression_ratio: totalSize > 0 ? outputStats.size / totalSize : 0,\n has_checksums: false,\n created: outputStats.mtime.toISOString(),\n };\n}\n\n/**\n * Helper: Add directory contents to tar.gz archive recursively\n */\nasync function addDirectoryToTarGzArchive(\n archive: Archiver,\n dirPath: string,\n archivePrefix: string,\n options: CreateOptions,\n): Promise<void> {\n const entries = readdirSync(dirPath);\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n const archivePath = join(archivePrefix, entry);\n\n // Use lstat to detect symlinks without following them\n const stats = lstatSync(fullPath);\n\n if (stats.isSymbolicLink()) {\n // Handle symlinks based on follow_symlinks option\n if (!options.follow_symlinks) {\n // Skip symlinks when follow_symlinks is false (default, secure)\n continue;\n }\n // If follow_symlinks is true, get stats of the target\n const targetStats = statSync(fullPath); // Follows the symlink\n if (targetStats.isDirectory()) {\n await addDirectoryToTarGzArchive(archive, fullPath, archivePath, options);\n } else {\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? targetStats.mode : 0o644,\n });\n }\n } else if (stats.isDirectory()) {\n // Recursively add directory contents\n await addDirectoryToTarGzArchive(archive, fullPath, archivePath, options);\n } else {\n // Add file entry\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n }\n }\n}\n\n/**\n * Helper: Create tar archive (uncompressed)\n */\nasync function createTarArchive(\n sources: string[],\n output: string,\n options: CreateOptions,\n): Promise<ArchiveInfo> {\n const writeStream = createWriteStream(output);\n const archive = new TarArchive({\n gzip: false, // Uncompressed\n });\n\n let entryCount = 0;\n let totalSize = 0;\n\n // Resolves when the output stream flushes and closes; rejects on a stream or\n // archiver error. The archive \"error\" listener rejects this promise rather\n // than throwing inside the handler — a throw there escapes as an uncaught\n // exception instead of rejecting create().\n const writePromise = new Promise<void>((resolve, reject) => {\n writeStream.on(\"close\", () => resolve());\n writeStream.on(\"error\", reject);\n archive.on(\"error\", (error) =>\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `TAR creation failed: ${error.message}`,\n Operation.CREATE,\n { details: { original_error: error } },\n ),\n ),\n ),\n );\n });\n\n archive.pipe(writeStream);\n\n // Add files to archive\n for (const sourcePath of sources) {\n if (!existsSync(sourcePath)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.SOURCE_NOT_FOUND,\n `Source not found: ${sourcePath}`,\n Operation.CREATE,\n { details: { source: sourcePath } },\n ),\n );\n }\n\n const stats = statSync(sourcePath);\n if (stats.isDirectory()) {\n await addDirectoryToTarArchive(archive, sourcePath, \"\", options);\n } else {\n const entryName = basename(sourcePath);\n archive.file(sourcePath, {\n name: entryName,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n entryCount++;\n totalSize += stats.size;\n }\n }\n\n // finalize() may also reject on a module-level error; that same error is\n // surfaced (wrapped) via the archive \"error\" handler above, so swallow the\n // raw rejection here and let writePromise own success/failure.\n archive.finalize().catch(() => {});\n await writePromise; // Wait for stream to flush and close (or reject on error)\n\n const outputStats = statSync(output);\n\n return {\n format: ArchiveFormat.TAR as \"tar\",\n compression: \"none\",\n entry_count: entryCount,\n total_size: totalSize,\n compressed_size: outputStats.size,\n compression_ratio: 1.0, // Uncompressed\n has_checksums: false, // TODO: Add fulhash checksum integration\n created: outputStats.mtime.toISOString(),\n };\n}\n\n/**\n * Helper: Add directory contents to tar archive recursively\n */\nasync function addDirectoryToTarArchive(\n archive: Archiver,\n dirPath: string,\n archivePrefix: string,\n options: CreateOptions,\n): Promise<void> {\n const entries = readdirSync(dirPath);\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n const archivePath = join(archivePrefix, entry);\n\n // Use lstat to detect symlinks without following them\n const stats = lstatSync(fullPath);\n\n if (stats.isSymbolicLink()) {\n // Handle symlinks based on follow_symlinks option\n if (!options.follow_symlinks) {\n // Skip symlinks when follow_symlinks is false (default, secure)\n continue;\n }\n // If follow_symlinks is true, get stats of the target\n const targetStats = statSync(fullPath); // Follows the symlink\n if (targetStats.isDirectory()) {\n await addDirectoryToTarArchive(archive, fullPath, archivePath, options);\n } else {\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? targetStats.mode : 0o644,\n });\n }\n } else if (stats.isDirectory()) {\n await addDirectoryToTarArchive(archive, fullPath, archivePath, options);\n } else {\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n }\n }\n}\n\n/**\n * Helper: Create gzip file (single file compression)\n */\nasync function createGzipFile(\n sources: string[],\n output: string,\n options: CreateOptions,\n): Promise<ArchiveInfo> {\n // Validate single file input\n if (sources.length !== 1) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_OPTIONS,\n `GZIP format requires exactly one source file, got ${sources.length}`,\n Operation.CREATE,\n ),\n );\n }\n\n const sourcePath = sources[0];\n if (!existsSync(sourcePath)) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.SOURCE_NOT_FOUND,\n `Source not found: ${sourcePath}`,\n Operation.CREATE,\n { details: { source: sourcePath } },\n ),\n );\n }\n\n const stats = statSync(sourcePath);\n if (stats.isDirectory()) {\n throw new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.INVALID_OPTIONS,\n \"GZIP format does not support directories\",\n Operation.CREATE,\n { details: { source: sourcePath } },\n ),\n );\n }\n\n // Compress the file\n const readStream = createReadStream(sourcePath);\n const writeStream = createWriteStream(output);\n const gzip = createGzip({ level: options.compression_level });\n\n await new Promise((resolve, reject) => {\n pipeline(readStream, gzip, writeStream, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve(undefined);\n }\n });\n });\n\n const outputStats = statSync(output);\n\n return {\n format: ArchiveFormat.GZIP as \"gzip\",\n compression: \"gzip\",\n entry_count: 1,\n total_size: stats.size,\n compressed_size: outputStats.size,\n compression_ratio: stats.size > 0 ? outputStats.size / stats.size : 0,\n has_checksums: false,\n created: outputStats.mtime.toISOString(),\n };\n}\n\n/**\n * Helper: Add directory contents to ZIP archive recursively\n */\nasync function addDirectoryToZipArchive(\n archive: Archiver,\n dirPath: string,\n archivePrefix: string,\n options: CreateOptions,\n): Promise<void> {\n const entries = readdirSync(dirPath);\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n const archivePath = join(archivePrefix, entry);\n\n // Use lstat to detect symlinks without following them\n const stats = lstatSync(fullPath);\n\n if (stats.isSymbolicLink()) {\n // Handle symlinks based on follow_symlinks option\n if (!options.follow_symlinks) {\n // Skip symlinks when follow_symlinks is false (default, secure)\n continue;\n }\n // If follow_symlinks is true, get stats of the target\n const targetStats = statSync(fullPath); // Follows the symlink\n if (targetStats.isDirectory()) {\n await addDirectoryToZipArchive(archive, fullPath, archivePath, options);\n } else {\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? targetStats.mode : 0o644,\n });\n }\n } else if (stats.isDirectory()) {\n // Recursively add directory contents\n await addDirectoryToZipArchive(archive, fullPath, archivePath, options);\n } else {\n // Add file entry\n archive.file(fullPath, {\n name: archivePath,\n mode: options.preserve_permissions ? stats.mode : 0o644,\n });\n }\n }\n}\n\n/**\n * Helper: Extract tar.gz archive\n */\nasync function extractTarGz(\n archive: string,\n destination: string,\n options: ExtractOptions,\n): Promise<ExtractResult> {\n const tarStream = await import(\"tar-stream\");\n const extract = tarStream.extract();\n\n let extractedCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n const errors: FulpackError[] = [];\n const warnings: string[] = [];\n\n let totalExtractedSize = 0;\n let entryCount = 0;\n\n extract.on(\"entry\", async (header, stream, next) => {\n entryCount++;\n\n try {\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.EXTRACT,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n );\n stream.resume();\n next();\n return;\n }\n\n // Security: Path traversal and absolute path validation\n const pathError = validatePath(header.name, Operation.EXTRACT, false);\n if (pathError) {\n errors.push({ ...pathError, archive });\n errorCount++;\n stream.resume();\n next();\n return;\n }\n\n const outputPath = join(destination, header.name);\n\n if (header.type === \"directory\") {\n // Create directory\n if (!existsSync(outputPath)) {\n mkdirSync(outputPath, { recursive: true });\n }\n extractedCount++;\n stream.resume();\n next();\n } else if (header.type === \"file\") {\n // Check if file exists\n if (existsSync(outputPath)) {\n if (options.overwrite === \"error\") {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Output file already exists: ${outputPath}`,\n Operation.EXTRACT,\n { path: header.name, archive },\n ),\n );\n errorCount++;\n stream.resume();\n next();\n return;\n } else if (options.overwrite === \"skip\") {\n warnings.push(`Skipped existing file: ${outputPath}`);\n skippedCount++;\n stream.resume();\n next();\n return;\n }\n // overwrite === \"overwrite\" - proceed with extraction\n }\n\n // Ensure parent directory exists\n const parentDir = dirname(outputPath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n\n // Extract file with byte counting for decompression bomb detection\n const writeStream = createWriteStream(outputPath);\n\n // Count actual bytes written (not header size)\n stream.on(\"data\", (chunk: Buffer) => {\n totalExtractedSize += chunk.length;\n\n // Check against max_size based on actual bytes\n if (options.max_size && totalExtractedSize > options.max_size) {\n stream.destroy();\n writeStream.destroy();\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Total extracted size exceeds maximum (${options.max_size} bytes)`,\n Operation.EXTRACT,\n {\n archive,\n path: header.name,\n details: { actual_size: totalExtractedSize, max_size: options.max_size },\n },\n ),\n );\n errorCount++;\n next();\n return;\n }\n });\n\n stream.pipe(writeStream);\n\n writeStream.on(\"finish\", () => {\n // Set permissions if requested\n if (options.preserve_permissions && header.mode) {\n try {\n const { chmodSync } = require(\"node:fs\");\n chmodSync(outputPath, header.mode);\n } catch {\n // Ignore permission errors\n }\n }\n extractedCount++;\n next();\n });\n\n writeStream.on(\"error\", (error) => {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Failed to write file: ${error.message}`,\n Operation.EXTRACT,\n { path: header.name, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n next();\n });\n } else {\n // Skip other types (symlinks, etc.) for security\n warnings.push(`Skipped entry type ${header.type}: ${header.name}`);\n stream.resume();\n next();\n }\n } catch (error) {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Error processing entry: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n Operation.EXTRACT,\n { path: header.name, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n stream.resume();\n next();\n }\n });\n\n // Pipe archive through gunzip and tar-stream\n const readStream = createReadStream(archive);\n const gunzip = createGunzip();\n\n return new Promise((resolve, reject) => {\n extract.on(\"finish\", () => {\n resolve({\n extracted_count: extractedCount,\n skipped_count: skippedCount,\n error_count: errorCount,\n errors: errors.length > 0 ? errors : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n total_bytes: totalExtractedSize,\n });\n });\n\n extract.on(\"error\", (error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `TAR.GZ extraction failed: ${error.message}`,\n Operation.EXTRACT,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n });\n\n // biome-ignore lint/suspicious/noExplicitAny: tar-stream type incompatibility with pipe\n readStream.pipe(gunzip).pipe(extract as any);\n });\n}\n\n/**\n * Helper: Extract tar archive (uncompressed)\n */\nasync function extractTar(\n archive: string,\n destination: string,\n options: ExtractOptions,\n): Promise<ExtractResult> {\n const tarStream = await import(\"tar-stream\");\n const extract = tarStream.extract();\n\n let extractedCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n const errors: FulpackError[] = [];\n const warnings: string[] = [];\n\n let totalExtractedSize = 0;\n let entryCount = 0;\n\n extract.on(\"entry\", async (header, stream, next) => {\n entryCount++;\n\n try {\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.EXTRACT,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n );\n stream.resume();\n next();\n return;\n }\n\n // Security: Path traversal and absolute path validation\n const pathError = validatePath(header.name, Operation.EXTRACT, false);\n if (pathError) {\n errors.push({ ...pathError, archive });\n errorCount++;\n stream.resume();\n next();\n return;\n }\n\n const outputPath = join(destination, header.name);\n\n if (header.type === \"directory\") {\n if (!existsSync(outputPath)) {\n mkdirSync(outputPath, { recursive: true });\n }\n extractedCount++;\n stream.resume();\n next();\n } else if (header.type === \"file\") {\n if (existsSync(outputPath)) {\n if (options.overwrite === \"error\") {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Output file already exists: ${outputPath}`,\n Operation.EXTRACT,\n { path: header.name, archive },\n ),\n );\n errorCount++;\n stream.resume();\n next();\n return;\n } else if (options.overwrite === \"skip\") {\n warnings.push(`Skipped existing file: ${outputPath}`);\n skippedCount++;\n stream.resume();\n next();\n return;\n }\n }\n\n const parentDir = dirname(outputPath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n\n // Extract file with byte counting for decompression bomb detection\n const writeStream = createWriteStream(outputPath);\n\n // Count actual bytes written (not header size)\n stream.on(\"data\", (chunk: Buffer) => {\n totalExtractedSize += chunk.length;\n\n // Check against max_size based on actual bytes\n if (options.max_size && totalExtractedSize > options.max_size) {\n stream.destroy();\n writeStream.destroy();\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Total extracted size exceeds maximum (${options.max_size} bytes)`,\n Operation.EXTRACT,\n {\n archive,\n path: header.name,\n details: { actual_size: totalExtractedSize, max_size: options.max_size },\n },\n ),\n );\n errorCount++;\n next();\n return;\n }\n });\n\n stream.pipe(writeStream);\n\n writeStream.on(\"finish\", () => {\n if (options.preserve_permissions && header.mode) {\n try {\n const { chmodSync } = require(\"node:fs\");\n chmodSync(outputPath, header.mode);\n } catch {\n // Ignore permission errors\n }\n }\n extractedCount++;\n next();\n });\n\n writeStream.on(\"error\", (error) => {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Failed to write file: ${error.message}`,\n Operation.EXTRACT,\n { path: header.name, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n next();\n });\n } else {\n warnings.push(`Skipped entry type ${header.type}: ${header.name}`);\n stream.resume();\n next();\n }\n } catch (error) {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Error processing entry: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n Operation.EXTRACT,\n { path: header.name, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n stream.resume();\n next();\n }\n });\n\n const readStream = createReadStream(archive);\n\n return new Promise((resolve, reject) => {\n extract.on(\"finish\", () => {\n resolve({\n extracted_count: extractedCount,\n skipped_count: skippedCount,\n error_count: errorCount,\n errors: errors.length > 0 ? errors : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n total_bytes: totalExtractedSize,\n });\n });\n\n extract.on(\"error\", (error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `TAR extraction failed: ${error.message}`,\n Operation.EXTRACT,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n });\n\n // biome-ignore lint/suspicious/noExplicitAny: tar-stream type incompatibility with pipe\n readStream.pipe(extract as any);\n });\n}\n\n/**\n * Helper: Extract ZIP archive\n */\nasync function extractZip(\n archive: string,\n destination: string,\n options: ExtractOptions,\n): Promise<ExtractResult> {\n const unzipper = await import(\"unzipper\");\n\n let extractedCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n const errors: FulpackError[] = [];\n const warnings: string[] = [];\n\n let totalExtractedSize = 0;\n let entryCount = 0;\n\n return new Promise((resolve, reject) => {\n const readStream = createReadStream(archive);\n\n readStream\n .pipe(unzipper.Parse())\n // biome-ignore lint/suspicious/noExplicitAny: unzipper entry type not exported\n .on(\"entry\", async (entry: any) => {\n entryCount++;\n\n try {\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.EXTRACT,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n );\n entry.autodrain();\n return;\n }\n\n // Security: Path traversal and absolute path validation\n const pathError = validatePath(entry.path, Operation.EXTRACT, false);\n if (pathError) {\n errors.push({ ...pathError, archive });\n errorCount++;\n entry.autodrain();\n return;\n }\n\n const outputPath = join(destination, entry.path);\n\n if (entry.type === \"Directory\") {\n // Create directory\n if (!existsSync(outputPath)) {\n mkdirSync(outputPath, { recursive: true });\n }\n extractedCount++;\n entry.autodrain();\n } else if (entry.type === \"File\") {\n // Check if file exists\n if (existsSync(outputPath)) {\n if (options.overwrite === \"error\") {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Output file already exists: ${outputPath}`,\n Operation.EXTRACT,\n { path: entry.path, archive },\n ),\n );\n errorCount++;\n entry.autodrain();\n return;\n } else if (options.overwrite === \"skip\") {\n warnings.push(`Skipped existing file: ${outputPath}`);\n skippedCount++;\n entry.autodrain();\n return;\n }\n // overwrite === \"overwrite\" - proceed\n }\n\n // Ensure parent directory exists\n const parentDir = dirname(outputPath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n\n // Extract file with byte counting for decompression bomb detection\n const writeStream = createWriteStream(outputPath);\n\n // Count actual bytes written (not header size)\n entry.on(\"data\", (chunk: Buffer) => {\n totalExtractedSize += chunk.length;\n\n // Check against max_size based on actual bytes\n if (options.max_size && totalExtractedSize > options.max_size) {\n entry.destroy();\n writeStream.destroy();\n errors.push(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Total extracted size exceeds maximum (${options.max_size} bytes)`,\n Operation.EXTRACT,\n {\n archive,\n path: entry.path,\n details: { actual_size: totalExtractedSize, max_size: options.max_size },\n },\n ),\n );\n errorCount++;\n return;\n }\n });\n\n entry.pipe(writeStream);\n\n writeStream.on(\"finish\", () => {\n extractedCount++;\n });\n\n writeStream.on(\"error\", (error: Error) => {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Failed to write file: ${error.message}`,\n Operation.EXTRACT,\n { path: entry.path, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n });\n } else {\n // Skip other types (symlinks, etc.) for security\n warnings.push(`Skipped entry type ${entry.type}: ${entry.path}`);\n entry.autodrain();\n }\n } catch (error) {\n errors.push(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `Error processing entry: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n Operation.EXTRACT,\n { path: entry.path, archive, details: { original_error: error } },\n ),\n );\n errorCount++;\n entry.autodrain();\n }\n })\n .on(\"close\", () => {\n resolve({\n extracted_count: extractedCount,\n skipped_count: skippedCount,\n error_count: errorCount,\n errors: errors.length > 0 ? errors : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n total_bytes: totalExtractedSize,\n });\n })\n .on(\"error\", (error: Error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.EXTRACTION_FAILED,\n `ZIP extraction failed: ${error.message}`,\n Operation.EXTRACT,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n });\n });\n}\n\n/**\n * Helper: Scan tar.gz archive\n */\nasync function scanTar(archive: string, options: ScanOptions): Promise<ArchiveEntry[]> {\n const tarStream = await import(\"tar-stream\");\n const extract = tarStream.extract();\n\n const entries: ArchiveEntry[] = [];\n let entryCount = 0;\n\n return new Promise((resolve, reject) => {\n extract.on(\"entry\", async (header, stream, next) => {\n entryCount++;\n\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n stream.resume();\n next();\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.SCAN,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n ),\n );\n return;\n }\n\n // Build entry object with optional metadata\n const entry: ArchiveEntry = {\n path: header.name,\n type:\n header.type === \"directory\"\n ? (EntryType.DIRECTORY as \"directory\")\n : header.type === \"symlink\"\n ? (EntryType.SYMLINK as \"symlink\")\n : (EntryType.FILE as \"file\"),\n size: header.size || 0,\n modified: header.mtime ? header.mtime.toISOString() : new Date().toISOString(),\n ...(options.include_metadata && header.mode !== undefined && header.mode !== null\n ? { mode: `0${(header.mode & 0o777).toString(8)}` }\n : {}),\n ...(options.include_metadata &&\n header.type === \"symlink\" &&\n (header as { linkname?: string }).linkname\n ? { symlink_target: (header as { linkname?: string }).linkname }\n : {}),\n };\n\n entries.push(entry);\n\n // Drain the stream without writing anywhere\n stream.resume();\n next();\n });\n\n extract.on(\"finish\", () => {\n resolve(entries);\n });\n\n extract.on(\"error\", (error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_CORRUPT,\n `TAR scanning failed: ${error.message}`,\n Operation.SCAN,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n });\n\n // Pipe tar file to extractor\n const readStream = createReadStream(archive);\n readStream.pipe(extract as unknown as NodeJS.WritableStream);\n });\n}\n\nasync function scanTarGz(archive: string, options: ScanOptions): Promise<ArchiveEntry[]> {\n const tarStream = await import(\"tar-stream\");\n const extract = tarStream.extract();\n\n const entries: ArchiveEntry[] = [];\n let entryCount = 0;\n\n return new Promise((resolve, reject) => {\n extract.on(\"entry\", async (header, stream, next) => {\n entryCount++;\n\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n stream.resume();\n next();\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.SCAN,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n ),\n );\n return;\n }\n\n // Build entry object with optional metadata\n const entry: ArchiveEntry = {\n path: header.name,\n type:\n header.type === \"directory\"\n ? (EntryType.DIRECTORY as \"directory\")\n : header.type === \"symlink\"\n ? (EntryType.SYMLINK as \"symlink\")\n : (EntryType.FILE as \"file\"),\n size: header.size || 0,\n modified: header.mtime ? header.mtime.toISOString() : new Date().toISOString(),\n ...(options.include_metadata && header.mode !== undefined && header.mode !== null\n ? { mode: `0${(header.mode & 0o777).toString(8)}` }\n : {}),\n ...(options.include_metadata &&\n header.type === \"symlink\" &&\n (header as { linkname?: string }).linkname\n ? { symlink_target: (header as { linkname?: string }).linkname }\n : {}),\n };\n\n entries.push(entry);\n\n // Drain the stream without writing anywhere\n stream.resume();\n next();\n });\n\n extract.on(\"finish\", () => {\n resolve(entries);\n });\n\n extract.on(\"error\", (error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_CORRUPT,\n `TAR.GZ scanning failed: ${error.message}`,\n Operation.SCAN,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n });\n\n // Pipe tar.gz file through gunzip to extractor\n const readStream = createReadStream(archive);\n const gunzip = createGunzip();\n readStream.pipe(gunzip).pipe(extract as unknown as NodeJS.WritableStream);\n });\n}\n\nasync function scanZip(archive: string, options: ScanOptions): Promise<ArchiveEntry[]> {\n const unzipper = await import(\"unzipper\");\n const entries: ArchiveEntry[] = [];\n let entryCount = 0;\n\n return new Promise((resolve, reject) => {\n createReadStream(archive)\n .pipe(unzipper.Parse())\n .on(\"entry\", (entry: unknown) => {\n const typedEntry = entry as {\n path: string;\n type: string;\n vars: {\n uncompressedSize?: number;\n compressedSize?: number;\n lastModifiedTime?: number;\n };\n props?: {\n size?: number;\n compressedSize?: number;\n };\n autodrain: () => void;\n };\n\n entryCount++;\n\n // Security: Check entry count limit\n if (options.max_entries && entryCount > options.max_entries) {\n typedEntry.autodrain();\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.DECOMPRESSION_BOMB,\n `Entry count exceeds maximum (${options.max_entries})`,\n Operation.SCAN,\n {\n archive,\n details: { entry_count: entryCount, max_entries: options.max_entries },\n },\n ),\n ),\n );\n return;\n }\n\n // Try multiple sources for size (unzipper library variations)\n const uncompressedSize = typedEntry.vars?.uncompressedSize || typedEntry.props?.size || 0;\n const compressedSize =\n typedEntry.vars?.compressedSize || typedEntry.props?.compressedSize || 0;\n\n // Build entry object with optional metadata\n const archiveEntry: ArchiveEntry = {\n path: typedEntry.path,\n type:\n typedEntry.type === \"Directory\"\n ? (EntryType.DIRECTORY as \"directory\")\n : (EntryType.FILE as \"file\"),\n size: uncompressedSize,\n modified: typedEntry.vars?.lastModifiedTime\n ? new Date(typedEntry.vars.lastModifiedTime).toISOString()\n : new Date().toISOString(),\n ...(options.include_metadata\n ? {\n compressed_size: compressedSize,\n mode: \"0644\", // ZIP format doesn't preserve Unix permissions consistently\n }\n : {}),\n };\n\n entries.push(archiveEntry);\n\n // Drain the entry stream without writing anywhere\n typedEntry.autodrain();\n })\n .on(\"error\", (error: Error) => {\n reject(\n new FulpackOperationError(\n createFulpackError(\n ERROR_CODES.ARCHIVE_CORRUPT,\n `ZIP scanning failed: ${error.message}`,\n Operation.SCAN,\n { archive, details: { original_error: error } },\n ),\n ),\n );\n })\n .on(\"finish\", () => {\n resolve(entries);\n });\n });\n}\n","/**\n * Fulpack Module\n *\n * Canonical archive operations with Pathfinder integration.\n * Provides create, extract, scan, verify, and info operations for\n * tar, tar.gz, zip, and gzip formats with security protections.\n */\n\n// Export Crucible-generated types (canonical source)\nexport * from \"../crucible/fulpack/types.js\";\n\n// Export core operations (tsfulmen implementation)\nexport { create, extract, info, scan, verify } from \"./core.js\";\n\n// Export error handling\nexport * from \"./errors.js\";\n\n// Version information\nexport const FULPACK_VERSION = \"1.0.0\";\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,6 @@ import './types-DdoeE7F5.js';
|
|
|
12
12
|
* Provides ergonomic access to Crucible SSOT assets and core utilities
|
|
13
13
|
* for TypeScript/Node.js applications in the FulmenHQ ecosystem.
|
|
14
14
|
*/
|
|
15
|
-
declare const VERSION = "0.
|
|
15
|
+
declare const VERSION = "0.3.1";
|
|
16
16
|
|
|
17
17
|
export { VERSION };
|