@fulmenhq/tsfulmen 0.3.1 → 0.3.2

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/appidentity/constants.ts","../src/schema/ajv-formats.ts","../src/schema/errors.ts","../src/schema/utils.ts","../src/schema/goneat-bridge.ts","../src/schema/normalizer.ts","../src/schema/registry.ts","../src/telemetry/counter.ts","../src/telemetry/gauge.ts","../src/telemetry/taxonomy.ts","../src/telemetry/histogram.ts","../src/telemetry/registry.ts","../src/telemetry/types.ts","../src/telemetry/validators.ts","../src/telemetry/index.ts","../src/schema/validator.ts","../src/schema/cli.ts","../src/schema/export.ts","../src/schema/index.ts","../src/errors/correlation.ts","../src/errors/severity.ts","../src/errors/serialization.ts","../src/errors/validators.ts","../src/errors/fulmen-error.ts","../src/errors/index.ts","../src/appidentity/errors.ts","../src/appidentity/embedded.ts","../src/appidentity/cache.ts","../src/appidentity/discovery.ts","../src/appidentity/loader.ts","../src/appidentity/runtime.ts","../src/appidentity/index.ts","../src/appidentity/helpers.ts","../src/docscribe/normalize.ts","../src/docscribe/types.ts","../src/docscribe/frontmatter.ts","../src/docscribe/headers.ts","../src/docscribe/format.ts","../src/docscribe/split.ts","../src/crucible/fulpack/types.ts","../src/fulpack/errors.ts","../src/fulpack/core.ts","../src/fulpack/index.ts","../src/index.ts"],"names":["__dirname","parseYAML","access","join","readFile","parseYaml","init_registry","fileURLToPath","dirname","init_validators","init_errors","deepFreeze","ArchiveFormat","EntryType","Operation","extract"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Application Identity Constants\n *\n * Centralized configuration for identity discovery and validation\n */\n\n/**\n * Filename for identity document\n */\nexport const APP_IDENTITY_FILENAME = \"app.yaml\";\n\n/**\n * Directory containing identity file\n */\nexport const APP_IDENTITY_DIR = \".fulmen\";\n\n/**\n * Environment variable for explicit path override\n */\nexport const APP_IDENTITY_ENV_VAR = \"FULMEN_APP_IDENTITY_PATH\";\n\n/**\n * Schema ID for validation\n */\nexport const APP_IDENTITY_SCHEMA_ID = \"config/repository/app-identity/v1.0.0/app-identity\";\n\n/**\n * Maximum depth for ancestor directory search\n * Prevents infinite loops and excessive filesystem traversal\n */\nexport const MAX_ANCESTOR_SEARCH_DEPTH = 20;\n","import type Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\nexport interface FulmenAjvFormatsOptions {\n mode?: \"fast\" | \"full\";\n formats?: string[];\n}\n\nconst DEFAULT_FORMATS = [\n \"date-time\",\n \"email\",\n \"hostname\",\n \"ipv4\",\n \"ipv6\",\n \"uri\",\n \"uri-reference\",\n \"uuid\",\n];\n\n/**\n * Apply Fulmen-standard AJV format support.\n *\n * Useful when configuring AJV in other frameworks (e.g. Fastify) so JSON Schema\n * `format` keywords are enforced consistently.\n */\nexport function applyFulmenAjvFormats(ajv: Ajv, options: FulmenAjvFormatsOptions = {}): Ajv {\n const mode = options.mode ?? \"fast\";\n const formats = options.formats ?? DEFAULT_FORMATS;\n\n // ajv-formats types use a string-literal union; allow callers to supply strings.\n // The `as never` on ajv works around ajv-formats bundling its own older ajv types\n // that diverge from ajv@8.18+ (CodeKeywordDefinition.code parameter incompatibility).\n addFormats(ajv as never, { mode, formats: formats as unknown as never[] });\n return ajv;\n}\n","/**\n * Schema validation errors - implements Fulmen Schema Validation Standard\n */\n\nimport type { SchemaSource, SchemaValidationDiagnostic } from \"./types.js\";\n\n/**\n * Export error reason enum for type-safe error categorization\n */\nexport enum ExportErrorReason {\n FILE_EXISTS = \"FILE_EXISTS\",\n WRITE_FAILED = \"WRITE_FAILED\",\n INVALID_FORMAT = \"INVALID_FORMAT\",\n PROVENANCE_FAILED = \"PROVENANCE_FAILED\",\n UNKNOWN = \"UNKNOWN\",\n}\n\n/**\n * Base error class for schema validation operations\n */\nexport class SchemaValidationError extends Error {\n constructor(\n message: string,\n public schemaId?: string,\n public diagnostics: SchemaValidationDiagnostic[] = [],\n public source?: SchemaSource,\n public cause?: Error,\n ) {\n super(message);\n this.name = \"SchemaValidationError\";\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SchemaValidationError);\n }\n }\n\n /**\n * Create error for schema not found\n */\n static schemaNotFound(schemaId: string): SchemaValidationError {\n return new SchemaValidationError(`Schema not found: ${schemaId}`, schemaId);\n }\n\n /**\n * Create error for invalid schema input\n */\n static invalidSchemaInput(source: SchemaSource, details: string): SchemaValidationError {\n return new SchemaValidationError(`Invalid schema input: ${details}`, undefined, [], source);\n }\n\n /**\n * Create error for validation failure\n */\n static validationFailed(\n schemaId: string,\n diagnostics: SchemaValidationDiagnostic[],\n source?: SchemaSource,\n ): SchemaValidationError {\n const errorCount = diagnostics.filter((d) => d.severity === \"ERROR\").length;\n const warningCount = diagnostics.filter((d) => d.severity === \"WARN\").length;\n\n const message = `Schema validation failed: ${errorCount} error(s), ${warningCount} warning(s)`;\n\n return new SchemaValidationError(message, schemaId, diagnostics, source);\n }\n\n /**\n * Create error for goneat binary not found\n */\n static goneatNotFound(goneatPath?: string): SchemaValidationError {\n const pathInfo = goneatPath ? ` at ${goneatPath}` : \"\";\n return new SchemaValidationError(\n `Goneat binary not found${pathInfo}. Falling back to AJV validation.`,\n );\n }\n\n /**\n * Create error for goneat execution failure\n */\n static goneatExecutionFailed(error: Error): SchemaValidationError {\n return new SchemaValidationError(\n \"Goneat execution failed. Falling back to AJV validation.\",\n undefined,\n [],\n undefined,\n error,\n );\n }\n\n /**\n * Create error for empty schema input\n */\n static emptySchemaInput(source?: SchemaSource): SchemaValidationError {\n return new SchemaValidationError(\"Schema content is empty\", undefined, [], source);\n }\n\n /**\n * Create error for parse failure\n */\n static parseFailed(source: SchemaSource, error: Error): SchemaValidationError {\n return new SchemaValidationError(\n `Failed to parse schema: ${error.message}`,\n undefined,\n [],\n source,\n error,\n );\n }\n\n /**\n * Create error for encoding failure\n */\n static encodingFailed(source: SchemaSource, error: Error): SchemaValidationError {\n return new SchemaValidationError(\n `Failed to encode schema: ${error.message}`,\n undefined,\n [],\n source,\n error,\n );\n }\n\n /**\n * Create error for registry operation failure\n */\n static registryError(operation: string, details: string): SchemaValidationError {\n return new SchemaValidationError(`Schema registry ${operation} failed: ${details}`);\n }\n\n /**\n * Format error for display\n */\n format(): string {\n let output = this.message;\n\n if (this.schemaId) {\n output += `\\nSchema ID: ${this.schemaId}`;\n }\n\n if (this.diagnostics.length > 0) {\n output += \"\\n\\nValidation Issues:\";\n this.diagnostics.forEach((diag, index) => {\n output += `\\n ${index + 1}. [${diag.severity}] ${diag.message}`;\n if (diag.pointer) {\n output += ` at ${diag.pointer}`;\n }\n if (diag.keyword) {\n output += ` (keyword: ${diag.keyword})`;\n }\n if (diag.source) {\n output += ` [${diag.source}]`;\n }\n });\n }\n\n if (this.source) {\n output += `\\n\\nSource: ${this.source.type}`;\n if (this.source.id) {\n output += ` (${this.source.id})`;\n }\n }\n\n return output;\n }\n\n /**\n * Convert to JSON representation\n */\n toJSON(): {\n name: string;\n message: string;\n schemaId?: string;\n diagnostics: SchemaValidationDiagnostic[];\n source?: SchemaSource;\n cause?: string;\n } {\n return {\n name: this.name,\n message: this.message,\n schemaId: this.schemaId,\n diagnostics: this.diagnostics,\n source: this.source,\n cause: this.cause?.message,\n };\n }\n}\n\n/**\n * Error class for schema export operations\n */\nexport class SchemaExportError extends SchemaValidationError {\n constructor(\n message: string,\n public reason: ExportErrorReason,\n public schemaId?: string,\n public outPath?: string,\n public cause?: Error,\n ) {\n super(message, schemaId, [], undefined, cause);\n this.name = \"SchemaExportError\";\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SchemaExportError);\n }\n }\n\n /**\n * Create error for file already exists\n */\n static fileExists(outPath: string): SchemaExportError {\n return new SchemaExportError(\n `Output file already exists: ${outPath}. Use overwrite option to replace.`,\n ExportErrorReason.FILE_EXISTS,\n undefined,\n outPath,\n );\n }\n\n /**\n * Create error for invalid export format\n */\n static invalidFormat(format: string, outPath: string): SchemaExportError {\n return new SchemaExportError(\n `Invalid export format: ${format}. Must be 'json' or 'yaml'.`,\n ExportErrorReason.INVALID_FORMAT,\n undefined,\n outPath,\n );\n }\n\n /**\n * Create error for write failure\n */\n static writeFailed(outPath: string, error: Error): SchemaExportError {\n return new SchemaExportError(\n `Failed to write schema to ${outPath}: ${error.message}`,\n ExportErrorReason.WRITE_FAILED,\n undefined,\n outPath,\n error,\n );\n }\n\n /**\n * Create error for provenance extraction failure\n */\n static provenanceFailed(details: string, error?: Error): SchemaExportError {\n return new SchemaExportError(\n `Failed to extract provenance metadata: ${details}`,\n ExportErrorReason.PROVENANCE_FAILED,\n undefined,\n undefined,\n error,\n );\n }\n}\n","/**\n * Schema validation utilities - helper functions for formatting and validation\n */\n\nimport { SchemaValidationError } from \"./errors.js\";\nimport type { SchemaValidationDiagnostic, SchemaValidationResult } from \"./types.js\";\n\n/**\n * Format validation diagnostics for display\n */\nexport function formatDiagnostics(diagnostics: SchemaValidationDiagnostic[]): string {\n if (diagnostics.length === 0) {\n return \"No validation issues found.\";\n }\n\n const lines: string[] = [];\n const errors = diagnostics.filter((d) => d.severity === \"ERROR\");\n const warnings = diagnostics.filter((d) => d.severity === \"WARN\");\n\n if (errors.length > 0) {\n lines.push(`❌ ${errors.length} error(s) found:`);\n errors.forEach((diag, index) => {\n lines.push(` ${index + 1}. ${diag.message}`);\n if (diag.pointer) {\n lines.push(` at ${diag.pointer}`);\n }\n if (diag.keyword) {\n lines.push(` keyword: ${diag.keyword}`);\n }\n });\n }\n\n if (warnings.length > 0) {\n lines.push(\"\");\n lines.push(`⚠️ ${warnings.length} warning(s) found:`);\n warnings.forEach((diag, index) => {\n lines.push(` ${index + 1}. ${diag.message}`);\n if (diag.pointer) {\n lines.push(` at ${diag.pointer}`);\n }\n });\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format validation result for display\n */\nexport function formatValidationResult(result: SchemaValidationResult): string {\n if (result.valid) {\n return \"✅ Validation passed\";\n }\n\n const output: string[] = [];\n output.push(\"❌ Validation failed\");\n output.push(formatDiagnostics(result.diagnostics));\n output.push(`\\nSource: ${result.source}`);\n\n return output.join(\"\\n\");\n}\n\n/**\n * Check if value is a SchemaValidationError\n */\nexport function isValidationError(error: unknown): error is SchemaValidationError {\n return error instanceof SchemaValidationError;\n}\n\n/**\n * Extract validation result from error or return success\n */\nexport function extractValidationResult(error: unknown): {\n valid: boolean;\n diagnostics: SchemaValidationDiagnostic[];\n source: \"ajv\" | \"goneat\";\n} {\n if (isValidationError(error)) {\n return {\n valid: false,\n diagnostics: error.diagnostics,\n source: error.diagnostics[0]?.source || \"ajv\",\n };\n }\n\n return {\n valid: true,\n diagnostics: [],\n source: \"ajv\",\n };\n}\n\n/**\n * Normalize JSON pointer path for display\n */\nexport function normalizePointer(pointer: string): string {\n if (pointer === \"\") {\n return \"root\";\n }\n return pointer.replace(/^\\//, \"\").replace(/\\//g, \".\");\n}\n\n/**\n * Create a validation diagnostic\n */\nexport function createDiagnostic(\n pointer: string,\n message: string,\n keyword: string,\n severity: \"ERROR\" | \"WARN\" = \"ERROR\",\n source: \"ajv\" | \"goneat\" = \"ajv\",\n data?: unknown,\n): SchemaValidationDiagnostic {\n return {\n pointer,\n message,\n keyword,\n severity,\n source,\n data,\n };\n}\n\n/**\n * Group diagnostics by severity\n */\nexport function groupDiagnosticsBySeverity(diagnostics: SchemaValidationDiagnostic[]): {\n errors: SchemaValidationDiagnostic[];\n warnings: SchemaValidationDiagnostic[];\n} {\n return {\n errors: diagnostics.filter((d) => d.severity === \"ERROR\"),\n warnings: diagnostics.filter((d) => d.severity === \"WARN\"),\n };\n}\n\n/**\n * Count diagnostics by severity\n */\nexport function countDiagnostics(diagnostics: SchemaValidationDiagnostic[]): {\n total: number;\n errors: number;\n warnings: number;\n} {\n const grouped = groupDiagnosticsBySeverity(diagnostics);\n return {\n total: diagnostics.length,\n errors: grouped.errors.length,\n warnings: grouped.warnings.length,\n };\n}\n","/**\n * Goneat bridge - Optional integration for CLI-only goneat validation\n *\n * Provides goneat validation as an opt-in alternative for CLI exploration.\n * NOT used by library consumers - AJV validation is the primary implementation.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { access } from \"node:fs/promises\";\nimport type { SchemaValidationDiagnostic, SchemaValidationResult } from \"./types.js\";\nimport { createDiagnostic } from \"./utils.js\";\n\n/**\n * Goneat validation output structure\n */\ninterface GoneatValidationOutput {\n valid: boolean;\n errors?: Array<{\n path: string;\n message: string;\n keyword?: string;\n }>;\n}\n\n/**\n * Detect goneat binary location\n */\nexport async function detectGoneat(customPath?: string): Promise<string | null> {\n // Try custom path first\n if (customPath) {\n try {\n await access(customPath);\n return customPath;\n } catch {\n return null;\n }\n }\n\n // Try GONEAT_PATH environment variable\n if (process.env.GONEAT_PATH) {\n try {\n await access(process.env.GONEAT_PATH);\n return process.env.GONEAT_PATH;\n } catch {\n // Continue to next option\n }\n }\n\n // Try local bin/goneat\n try {\n await access(\"./bin/goneat\");\n return \"./bin/goneat\";\n } catch {\n // Continue to next option\n }\n\n // Try system PATH (assume 'goneat' command available)\n return \"goneat\";\n}\n\n/**\n * Check if goneat is available\n *\n * If goneatPath is provided, use it directly to test availability.\n * Otherwise, detect goneat location first.\n */\nexport async function isGoneatAvailable(goneatPath?: string): Promise<boolean> {\n let pathToTest: string | null;\n\n if (goneatPath) {\n // Use provided path directly - don't re-detect\n // This allows testing 'goneat' command from PATH\n pathToTest = goneatPath;\n } else {\n // Detect goneat location\n pathToTest = await detectGoneat();\n if (!pathToTest) return false;\n }\n\n return new Promise((resolve) => {\n const proc = spawn(pathToTest as string, [\"version\"], { stdio: \"ignore\" });\n\n // Timeout after 5 seconds to prevent hanging in CI\n const timeout = setTimeout(() => {\n proc.kill();\n resolve(false);\n }, 5000);\n\n proc.on(\"close\", (code) => {\n clearTimeout(timeout);\n resolve(code === 0);\n });\n proc.on(\"error\", () => {\n clearTimeout(timeout);\n resolve(false);\n });\n });\n}\n\n/**\n * Run goneat schema validation (CLI-only, opt-in)\n *\n * This is NOT used by library validation - it's purely for CLI comparison.\n * Library users get full AJV validation without goneat dependency.\n */\nexport async function runGoneatValidation(\n schemaPath: string,\n dataPath: string,\n goneatPath?: string,\n): Promise<SchemaValidationResult> {\n const detected = await detectGoneat(goneatPath);\n\n if (!detected) {\n return {\n valid: false,\n diagnostics: [\n createDiagnostic(\n \"\",\n \"goneat binary not found. Install goneat or specify path with --goneat-path\",\n \"goneat-unavailable\",\n \"ERROR\",\n \"goneat\",\n ),\n ],\n source: \"goneat\",\n };\n }\n\n // Check availability using the detected path directly\n if (!(await isGoneatAvailable(detected))) {\n return {\n valid: false,\n diagnostics: [\n createDiagnostic(\n \"\",\n `goneat binary found at '${detected}' but not executable or version check failed`,\n \"goneat-not-executable\",\n \"ERROR\",\n \"goneat\",\n ),\n ],\n source: \"goneat\",\n };\n }\n\n return new Promise((resolve) => {\n const args = [\n \"schema\",\n \"validate\",\n \"--schema\",\n schemaPath,\n \"--data\",\n dataPath,\n \"--format\",\n \"json\",\n ];\n const proc = spawn(detected, args);\n\n let stdout = \"\";\n let stderr = \"\";\n\n proc.stdout.on(\"data\", (data) => {\n stdout += data.toString();\n });\n\n proc.stderr.on(\"data\", (data) => {\n stderr += data.toString();\n });\n\n proc.on(\"close\", (code: number | null) => {\n // Parse goneat output\n let output: GoneatValidationOutput;\n\n try {\n output = JSON.parse(stdout) as GoneatValidationOutput;\n } catch {\n // Failed to parse output, treat as error\n resolve({\n valid: false,\n diagnostics: [\n createDiagnostic(\n \"\",\n `goneat validation failed: ${stderr || \"unknown error\"}`,\n \"goneat-error\",\n \"ERROR\",\n \"goneat\",\n ),\n ],\n source: \"goneat\",\n });\n return;\n }\n\n // Convert goneat errors to our diagnostic format\n const diagnostics: SchemaValidationDiagnostic[] =\n output.errors?.map((error) =>\n createDiagnostic(\n error.path || \"\",\n error.message,\n error.keyword || \"validation\",\n \"ERROR\",\n \"goneat\",\n ),\n ) || [];\n\n resolve({\n valid: code === 0 && output.valid,\n diagnostics,\n source: \"goneat\",\n });\n });\n\n proc.on(\"error\", (error) => {\n resolve({\n valid: false,\n diagnostics: [\n createDiagnostic(\n \"\",\n `Failed to execute goneat: ${error.message}`,\n \"goneat-spawn-error\",\n \"ERROR\",\n \"goneat\",\n ),\n ],\n source: \"goneat\",\n });\n });\n });\n}\n","/**\n * Schema normalizer - implements schema normalization per Fulmen standard\n *\n * Provides utilities for canonicalizing and comparing schemas across\n * JSON and YAML formats with comment preservation and deterministic output.\n */\n\nimport { parse as parseYAML } from \"yaml\";\nimport { SchemaValidationError } from \"./errors.js\";\nimport type { SchemaInput, SchemaNormalizationOptions } from \"./types.js\";\n\n/**\n * Parse schema input to object\n */\nfunction parseSchemaInput(input: SchemaInput): Record<string, unknown> {\n if (!input) {\n throw SchemaValidationError.parseFailed(\n { type: \"string\", content: \"\" },\n new Error(\"schema content is empty\"),\n );\n }\n\n try {\n if (typeof input === \"string\") {\n // Try JSON first, fall back to YAML\n try {\n return JSON.parse(input) as Record<string, unknown>;\n } catch {\n return parseYAML(input) as Record<string, unknown>;\n }\n }\n\n if (Buffer.isBuffer(input)) {\n const content = input.toString(\"utf-8\");\n try {\n return JSON.parse(content) as Record<string, unknown>;\n } catch {\n return parseYAML(content) as Record<string, unknown>;\n }\n }\n\n // Already an object\n return input as Record<string, unknown>;\n } catch (error) {\n throw SchemaValidationError.parseFailed(\n {\n type: typeof input === \"string\" ? \"string\" : \"object\",\n content: typeof input === \"string\" ? input : JSON.stringify(input),\n },\n error as Error,\n );\n }\n}\n\n/**\n * Sort object keys recursively in lexicographical order\n */\nfunction sortObjectKeys(obj: unknown): unknown {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sortObjectKeys);\n }\n\n const sorted: Record<string, unknown> = {};\n const keys = Object.keys(obj).sort();\n\n for (const key of keys) {\n sorted[key] = sortObjectKeys((obj as Record<string, unknown>)[key]);\n }\n\n return sorted;\n}\n\n/**\n * Normalize schema to canonical JSON format\n *\n * Per Fulmen Schema Normalization Standard:\n * - Accepts YAML or JSON input\n * - Strips comments while preserving semantic structure\n * - Sorts keys lexicographically\n * - Produces deterministic, pretty-printed JSON (or compact if requested)\n */\nexport function normalizeSchema(\n input: SchemaInput,\n options: SchemaNormalizationOptions = {},\n): string {\n try {\n // Parse input to object\n const parsed = parseSchemaInput(input);\n\n // Sort keys recursively\n const sorted = sortObjectKeys(parsed);\n\n // Serialize to JSON with optional compact mode\n if (options.compact) {\n return JSON.stringify(sorted);\n }\n\n // Default: pretty-printed with 2-space indentation\n return JSON.stringify(sorted, null, 2);\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n throw SchemaValidationError.parseFailed(\n {\n type: typeof input === \"string\" ? \"string\" : \"object\",\n content: typeof input === \"string\" ? input : JSON.stringify(input),\n },\n error as Error,\n );\n }\n}\n\n/**\n * Compare two schemas for semantic equality\n *\n * Normalizes both schemas and compares the canonical JSON output.\n * Returns equality result along with normalized versions for debugging.\n */\nexport function compareSchemas(\n schemaA: SchemaInput,\n schemaB: SchemaInput,\n options: SchemaNormalizationOptions = {},\n): { equal: boolean; normalizedA: string; normalizedB: string } {\n const normalizedA = normalizeSchema(schemaA, options);\n const normalizedB = normalizeSchema(schemaB, options);\n\n return {\n equal: normalizedA === normalizedB,\n normalizedA,\n normalizedB,\n };\n}\n","/**\n * Schema registry - implements schema discovery and metadata extraction\n */\n\nimport { access, readFile } from \"node:fs/promises\";\nimport { dirname, extname, join, relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport glob from \"fast-glob\";\nimport { parse as parseYAML } from \"yaml\";\nimport { SchemaValidationError } from \"./errors.js\";\nimport type { SchemaFormat, SchemaMetadata, SchemaRegistryOptions } from \"./types.js\";\n\n/**\n * Default schema file patterns\n */\nconst DEFAULT_PATTERNS = [\"**/*.schema.json\", \"**/*.schema.yaml\", \"**/*.schema.yml\"];\n\n/**\n * Schema registry class for managing schema discovery and metadata\n */\nexport class SchemaRegistry {\n private schemas: Map<string, SchemaMetadata> = new Map();\n private options: SchemaRegistryOptions;\n\n constructor(options: SchemaRegistryOptions = {}) {\n this.options = {\n baseDir: options.baseDir || this.getDefaultSchemaDir(),\n patterns: options.patterns || DEFAULT_PATTERNS,\n followSymlinks: options.followSymlinks ?? false,\n maxDepth: options.maxDepth ?? 10,\n };\n }\n\n /**\n * Get default schema directory using import.meta.url\n */\n private getDefaultSchemaDir(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n // From src/schema/ we need to go up 2 levels to repo root, then into schemas/crucible-ts\n return join(__dirname, \"..\", \"..\", \"schemas\", \"crucible-ts\");\n }\n\n /**\n * Build logical schema ID from file path\n */\n private buildSchemaId(filePath: string, baseDir: string): string {\n const relativePath = relative(baseDir, filePath);\n const withoutExt = relativePath.replace(/\\.(schema\\.(json|yaml|yml))$/, \"\");\n return withoutExt.replace(/\\\\/g, \"/\"); // Normalize path separators\n }\n\n /**\n * Extract schema format from file extension\n */\n private getSchemaFormat(filePath: string): SchemaFormat {\n const ext = extname(filePath).toLowerCase();\n switch (ext) {\n case \".json\":\n return \"json\";\n case \".yaml\":\n case \".yml\":\n return \"yaml\";\n default:\n return \"json\"; // Default fallback\n }\n }\n\n /**\n * Extract metadata from schema file\n */\n private async extractMetadata(filePath: string): Promise<SchemaMetadata> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n const format = this.getSchemaFormat(filePath);\n\n let parsed: Record<string, unknown>;\n if (format === \"yaml\") {\n parsed = parseYAML(content) as Record<string, unknown>;\n } else {\n parsed = JSON.parse(content) as Record<string, unknown>;\n }\n\n const baseDir = this.options.baseDir ?? \"\";\n const relativePath = relative(baseDir, filePath);\n\n return {\n id: this.buildSchemaId(filePath, baseDir),\n path: filePath,\n relativePath: relativePath,\n format,\n version: (parsed.$schema as string) || (parsed.version as string),\n description: (parsed.title as string) || (parsed.description as string),\n schemaDraft: parsed.$schema as string,\n };\n } catch (error) {\n throw SchemaValidationError.registryError(\n \"metadata extraction\",\n `Failed to process ${filePath}: ${(error as Error).message}`,\n );\n }\n }\n\n /**\n * Discover and index all available schemas\n */\n async discoverSchemas(): Promise<void> {\n try {\n const baseDir = this.options.baseDir ?? \"\";\n const patterns = this.options.patterns ?? [];\n\n if (patterns.length === 0) {\n this.schemas.clear();\n return;\n }\n\n const pattern = patterns.map((p) => join(baseDir, p));\n\n // Check if base directory exists\n try {\n await access(baseDir);\n } catch {\n // Base directory doesn't exist, clear registry and return\n this.schemas.clear();\n return;\n }\n\n const files = await glob(pattern, {\n absolute: true,\n followSymbolicLinks: this.options.followSymlinks,\n deep: this.options.maxDepth,\n onlyFiles: true,\n suppressErrors: true, // Don't throw on permission errors\n });\n\n // Clear existing schemas\n this.schemas.clear();\n\n // Process each schema file\n for (const filePath of files) {\n try {\n const metadata = await this.extractMetadata(filePath);\n this.schemas.set(metadata.id, metadata);\n } catch (error) {\n // Log error but continue processing other schemas\n console.warn(`Warning: Failed to process schema ${filePath}:`, error);\n }\n }\n } catch (error) {\n throw SchemaValidationError.registryError(\"discovery\", (error as Error).message);\n }\n }\n\n /**\n * List available schemas with optional prefix filtering\n */\n async listSchemas(prefix?: string): Promise<SchemaMetadata[]> {\n if (this.schemas.size === 0) {\n await this.discoverSchemas();\n }\n\n const schemas = Array.from(this.schemas.values());\n\n if (prefix) {\n return schemas.filter((schema) => schema.id.startsWith(prefix));\n }\n\n return schemas;\n }\n\n /**\n * Get schema by logical ID\n */\n async getSchema(id: string): Promise<SchemaMetadata> {\n if (this.schemas.size === 0) {\n await this.discoverSchemas();\n }\n\n const schema = this.schemas.get(id);\n if (!schema) {\n throw SchemaValidationError.schemaNotFound(id);\n }\n\n return schema;\n }\n\n /**\n * Get schema by file path\n */\n async getSchemaByPath(filePath: string): Promise<SchemaMetadata> {\n if (this.schemas.size === 0) {\n await this.discoverSchemas();\n }\n\n const absolutePath = filePath.startsWith(\"/\") ? filePath : join(process.cwd(), filePath);\n\n for (const schema of this.schemas.values()) {\n if (schema.path === absolutePath) {\n return schema;\n }\n }\n\n throw SchemaValidationError.schemaNotFound(filePath);\n }\n\n /**\n * Check if schema exists\n */\n async hasSchema(id: string): Promise<boolean> {\n if (this.schemas.size === 0) {\n await this.discoverSchemas();\n }\n\n return this.schemas.has(id);\n }\n\n /**\n * Get registry size\n */\n get size(): number {\n return this.schemas.size;\n }\n\n /**\n * Clear registry cache\n */\n clear(): void {\n this.schemas.clear();\n }\n}\n\n/**\n * Global schema registry instance with cached options\n */\nlet globalRegistry: SchemaRegistry | undefined;\nlet globalRegistryOptions: SchemaRegistryOptions | undefined;\n\n/**\n * Check if registry options have changed\n */\nfunction optionsChanged(newOptions?: SchemaRegistryOptions): boolean {\n if (!newOptions && !globalRegistryOptions) return false;\n if (!newOptions || !globalRegistryOptions) return true;\n\n return (\n newOptions.baseDir !== globalRegistryOptions.baseDir ||\n JSON.stringify(newOptions.patterns) !== JSON.stringify(globalRegistryOptions.patterns) ||\n newOptions.followSymlinks !== globalRegistryOptions.followSymlinks ||\n newOptions.maxDepth !== globalRegistryOptions.maxDepth\n );\n}\n\n/**\n * Get or create global schema registry, rebuilding if options change\n */\nexport function getSchemaRegistry(options?: SchemaRegistryOptions): SchemaRegistry {\n if (!globalRegistry || optionsChanged(options)) {\n globalRegistry = new SchemaRegistry(options);\n globalRegistryOptions = options;\n }\n return globalRegistry;\n}\n\n/**\n * List available schemas with optional prefix filtering\n */\nexport async function listSchemas(\n prefix?: string,\n options?: SchemaRegistryOptions,\n): Promise<SchemaMetadata[]> {\n const registry = getSchemaRegistry(options);\n return registry.listSchemas(prefix);\n}\n\n/**\n * Get schema by logical ID\n */\nexport async function getSchema(\n id: string,\n options?: SchemaRegistryOptions,\n): Promise<SchemaMetadata> {\n const registry = getSchemaRegistry(options);\n return registry.getSchema(id);\n}\n\n/**\n * Get schema by file path\n */\nexport async function getSchemaByPath(\n filePath: string,\n options?: SchemaRegistryOptions,\n): Promise<SchemaMetadata> {\n const registry = getSchemaRegistry(options);\n return registry.getSchemaByPath(filePath);\n}\n\n/**\n * Check if schema exists\n */\nexport async function hasSchema(id: string, options?: SchemaRegistryOptions): Promise<boolean> {\n const registry = getSchemaRegistry(options);\n return registry.hasSchema(id);\n}\n","/**\n * Counter metric implementation\n *\n * Monotonically increasing counter for counting events\n */\n\nimport type { MetricName } from \"./types.js\";\n\n/**\n * Counter metric\n *\n * Monotonically increasing value for counting events.\n * Supports labeled metrics (Crucible v0.2.7+).\n * Use for metrics like request counts, error counts, etc.\n */\nexport class Counter {\n private value = 0;\n private labeledValues = new Map<string, number>();\n\n constructor(public readonly name: MetricName) {}\n\n /**\n * Increment counter by delta (default: 1)\n *\n * @param delta - Amount to increment (must be non-negative)\n * @param labels - Optional label dimensions for this observation\n * @throws {Error} If delta is negative\n *\n * @example\n * ```typescript\n * counter.inc(); // Increment unlabeled by 1\n * counter.inc(5); // Increment unlabeled by 5\n * counter.inc(1, { status: '200' }); // Increment labeled instance\n * counter.inc(1, { result: 'success' }); // Different label set\n * ```\n */\n inc(delta = 1, labels?: Record<string, string>): void {\n if (delta < 0) {\n throw new Error(`Counter delta must be non-negative, got: ${delta}`);\n }\n\n if (labels && Object.keys(labels).length > 0) {\n // Labeled metric - track per label combination\n const labelKey = this.serializeLabels(labels);\n const current = this.labeledValues.get(labelKey) || 0;\n this.labeledValues.set(labelKey, current + delta);\n } else {\n // Unlabeled metric\n this.value += delta;\n }\n }\n\n /**\n * Get current counter value (unlabeled)\n */\n getValue(): number {\n return this.value;\n }\n\n /**\n * Get all labeled values\n * @returns Map of serialized label keys to values\n */\n getLabeledValues(): Map<string, number> {\n return new Map(this.labeledValues);\n }\n\n /**\n * Get value for specific label combination\n */\n getValueForLabels(labels: Record<string, string>): number {\n const labelKey = this.serializeLabels(labels);\n return this.labeledValues.get(labelKey) || 0;\n }\n\n /**\n * Reset counter to zero (all label combinations)\n */\n reset(): void {\n this.value = 0;\n this.labeledValues.clear();\n }\n\n /**\n * Serialize labels to deterministic string key\n * Format: key1=value1,key2=value2 (sorted by key)\n */\n private serializeLabels(labels: Record<string, string>): string {\n return Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join(\",\");\n }\n}\n","/**\n * Gauge metric implementation\n *\n * Gauge for arbitrary values that can go up and down\n */\n\nimport type { MetricName } from \"./types.js\";\n\n/**\n * Gauge metric\n *\n * Arbitrary value that can increase or decrease.\n * Supports labeled metrics (Crucible v0.2.7+).\n * Use for metrics like current connections, memory usage, temperature, etc.\n */\nexport class Gauge {\n private value = 0;\n private labeledValues = new Map<string, number>();\n\n constructor(public readonly name: MetricName) {}\n\n /**\n * Set gauge to specific value\n *\n * @param value - New gauge value (can be any number, including negative)\n * @param labels - Optional label dimensions for this observation\n *\n * @example\n * ```typescript\n * gauge.set(42); // Set unlabeled to 42\n * gauge.set(-10); // Negative values allowed\n * gauge.set(1, { phase: 'collect' }); // Set labeled instance\n * ```\n */\n set(value: number, labels?: Record<string, string>): void {\n if (labels && Object.keys(labels).length > 0) {\n const labelKey = this.serializeLabels(labels);\n this.labeledValues.set(labelKey, value);\n } else {\n this.value = value;\n }\n }\n\n /**\n * Increment gauge by delta (default: 1)\n *\n * @param delta - Amount to increment (can be negative)\n * @param labels - Optional label dimensions for this observation\n */\n inc(delta = 1, labels?: Record<string, string>): void {\n if (labels && Object.keys(labels).length > 0) {\n const labelKey = this.serializeLabels(labels);\n const current = this.labeledValues.get(labelKey) || 0;\n this.labeledValues.set(labelKey, current + delta);\n } else {\n this.value += delta;\n }\n }\n\n /**\n * Decrement gauge by delta (default: 1)\n *\n * @param delta - Amount to decrement (can be negative)\n * @param labels - Optional label dimensions for this observation\n */\n dec(delta = 1, labels?: Record<string, string>): void {\n if (labels && Object.keys(labels).length > 0) {\n const labelKey = this.serializeLabels(labels);\n const current = this.labeledValues.get(labelKey) || 0;\n this.labeledValues.set(labelKey, current - delta);\n } else {\n this.value -= delta;\n }\n }\n\n /**\n * Get current gauge value (unlabeled)\n */\n getValue(): number {\n return this.value;\n }\n\n /**\n * Get all labeled values\n * @returns Map of serialized label keys to values\n */\n getLabeledValues(): Map<string, number> {\n return new Map(this.labeledValues);\n }\n\n /**\n * Get value for specific label combination\n */\n getValueForLabels(labels: Record<string, string>): number {\n const labelKey = this.serializeLabels(labels);\n return this.labeledValues.get(labelKey) || 0;\n }\n\n /**\n * Reset gauge to zero (all label combinations)\n */\n reset(): void {\n this.value = 0;\n this.labeledValues.clear();\n }\n\n /**\n * Serialize labels to deterministic string key\n * Format: key1=value1,key2=value2 (sorted by key)\n */\n private serializeLabels(labels: Record<string, string>): string {\n return Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join(\",\");\n }\n}\n","/**\n * Taxonomy loader for metrics definitions\n *\n * Loads and caches metrics taxonomy from config/crucible-ts/taxonomy/metrics.yaml\n * Provides default histogram buckets per ADR-0007\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { MetricName, MetricUnit } from \"./types.js\";\n\n/**\n * Metric definition from taxonomy\n */\nexport interface MetricDefinition {\n name: MetricName;\n unit: MetricUnit;\n description: string;\n}\n\n/**\n * Taxonomy structure\n */\nexport interface MetricsTaxonomy {\n version: string;\n defaults: {\n histogram_buckets: {\n ms_metrics: number[];\n };\n };\n metrics: MetricDefinition[];\n}\n\n/**\n * Default histogram buckets for _ms metrics (ADR-0007)\n * [1, 5, 10, 50, 100, 500, 1000, 5000, 10000] milliseconds\n */\nexport const DEFAULT_MS_BUCKETS = [1, 5, 10, 50, 100, 500, 1000, 5000, 10000];\n\n/**\n * Singleton taxonomy loader\n */\nclass TaxonomyLoader {\n private static instance: TaxonomyLoader;\n private taxonomy: MetricsTaxonomy | null = null;\n private loadPromise: Promise<MetricsTaxonomy> | null = null;\n private loadError: Error | null = null;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get singleton instance\n */\n static getInstance(): TaxonomyLoader {\n if (!TaxonomyLoader.instance) {\n TaxonomyLoader.instance = new TaxonomyLoader();\n }\n return TaxonomyLoader.instance;\n }\n\n /**\n * Load taxonomy from YAML file\n */\n private async load(): Promise<MetricsTaxonomy> {\n if (this.taxonomy !== null) {\n return this.taxonomy;\n }\n\n if (this.loadError !== null) {\n throw this.loadError;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n try {\n // Resolve path to taxonomy file\n // From src/telemetry/ → ../../config/crucible-ts/taxonomy/metrics.yaml\n const taxonomyPath = join(\n __dirname,\n \"..\",\n \"..\",\n \"config\",\n \"crucible-ts\",\n \"taxonomy\",\n \"metrics.yaml\",\n );\n\n const content = await readFile(taxonomyPath, \"utf-8\");\n this.taxonomy = parseYaml(content) as MetricsTaxonomy;\n\n return this.taxonomy;\n } catch (err) {\n this.loadError = err instanceof Error ? err : new Error(String(err));\n throw new Error(`Failed to load metrics taxonomy: ${this.loadError.message}`);\n }\n })();\n\n return this.loadPromise;\n }\n\n /**\n * Get taxonomy (async)\n */\n async getTaxonomy(): Promise<MetricsTaxonomy> {\n return this.load();\n }\n\n /**\n * Get metric definition by name\n */\n async getMetric(name: MetricName): Promise<MetricDefinition | undefined> {\n const taxonomy = await this.load();\n return taxonomy.metrics.find((m) => m.name === name);\n }\n\n /**\n * Get default unit for metric\n */\n async getDefaultUnit(name: MetricName): Promise<MetricUnit | undefined> {\n const metric = await this.getMetric(name);\n return metric?.unit;\n }\n\n /**\n * Get default histogram buckets for metric\n * Returns ADR-0007 buckets for _ms metrics, undefined for others\n */\n async getDefaultBuckets(name: MetricName): Promise<number[] | undefined> {\n // Check if metric name ends with _ms\n if (name.endsWith(\"_ms\")) {\n const taxonomy = await this.load();\n return taxonomy.defaults.histogram_buckets.ms_metrics;\n }\n return undefined;\n }\n\n /**\n * Check if metric name is valid (exists in taxonomy)\n */\n async isValidMetricName(name: string): Promise<boolean> {\n try {\n const taxonomy = await this.load();\n return taxonomy.metrics.some((m) => m.name === name);\n } catch {\n return false;\n }\n }\n\n /**\n * Reset loader state (for testing)\n * @internal\n */\n static _reset(): void {\n TaxonomyLoader.instance = new TaxonomyLoader();\n }\n}\n\n/**\n * Get metrics taxonomy\n *\n * @returns Promise resolving to taxonomy\n */\nexport async function getTaxonomy(): Promise<MetricsTaxonomy> {\n return TaxonomyLoader.getInstance().getTaxonomy();\n}\n\n/**\n * Get metric definition by name\n *\n * @param name - Metric name\n * @returns Promise resolving to metric definition or undefined\n */\nexport async function getMetric(name: MetricName): Promise<MetricDefinition | undefined> {\n return TaxonomyLoader.getInstance().getMetric(name);\n}\n\n/**\n * Get default unit for metric from taxonomy\n *\n * @param name - Metric name\n * @returns Promise resolving to unit or undefined\n */\nexport async function getDefaultUnit(name: MetricName): Promise<MetricUnit | undefined> {\n return TaxonomyLoader.getInstance().getDefaultUnit(name);\n}\n\n/**\n * Get default histogram buckets for metric\n *\n * Returns ADR-0007 buckets ([1, 5, 10, 50, 100, 500, 1000, 5000, 10000]) for\n * metrics ending with _ms, undefined for others.\n *\n * @param name - Metric name\n * @returns Promise resolving to bucket array or undefined\n *\n * @example\n * ```typescript\n * const buckets = await getDefaultBuckets('config_load_ms');\n * // Returns [1, 5, 10, 50, 100, 500, 1000, 5000, 10000]\n * ```\n */\nexport async function getDefaultBuckets(name: MetricName): Promise<number[] | undefined> {\n return TaxonomyLoader.getInstance().getDefaultBuckets(name);\n}\n\n/**\n * Check if metric name is valid (exists in taxonomy)\n *\n * @param name - Metric name to check\n * @returns Promise resolving to true if valid\n */\nexport async function isValidMetricName(name: string): Promise<boolean> {\n return TaxonomyLoader.getInstance().isValidMetricName(name);\n}\n\n// Export for testing\nexport { TaxonomyLoader };\n","/**\n * Histogram metric implementation\n *\n * Histogram with OTLP-compatible cumulative buckets, auto-applying ADR-0007\n * default buckets for _ms metrics.\n */\n\nimport { DEFAULT_MS_BUCKETS } from \"./taxonomy.js\";\nimport type { HistogramBucket, HistogramOptions, HistogramSummary, MetricName } from \"./types.js\";\n\n/**\n * Labeled histogram state\n */\ninterface LabeledHistogramState {\n count: number;\n sum: number;\n bucketCounts: Map<number, number>;\n}\n\n/**\n * Histogram metric\n *\n * Tracks distribution of values using cumulative buckets (OTLP-compatible).\n * Automatically applies ADR-0007 default buckets for _ms metrics.\n * Supports labeled metrics (Crucible v0.2.7+).\n */\nexport class Histogram {\n private count = 0;\n private sum = 0;\n private bucketCounts: Map<number, number> = new Map();\n private labeledStates = new Map<string, LabeledHistogramState>();\n private readonly buckets: number[];\n\n constructor(\n public readonly name: MetricName,\n options?: HistogramOptions,\n ) {\n // Determine buckets: custom > ADR-0007 defaults for _ms metrics > empty\n if (options?.buckets) {\n this.buckets = [...options.buckets].sort((a, b) => a - b);\n } else if (name.endsWith(\"_ms\") || name.endsWith(\"_seconds\")) {\n this.buckets = [...DEFAULT_MS_BUCKETS];\n } else {\n this.buckets = [];\n }\n\n // Initialize bucket counts\n for (const bucket of this.buckets) {\n this.bucketCounts.set(bucket, 0);\n }\n }\n\n /**\n * Record an observation\n *\n * @param value - Value to observe (typically a duration in ms or seconds)\n * @param labels - Optional label dimensions for this observation\n *\n * @example\n * ```typescript\n * const start = performance.now();\n * // ... operation ...\n * histogram.observe(performance.now() - start);\n * histogram.observe(duration, { phase: 'collect', result: 'success' });\n * ```\n */\n observe(value: number, labels?: Record<string, string>): void {\n if (labels && Object.keys(labels).length > 0) {\n // Labeled observation\n const labelKey = this.serializeLabels(labels);\n let state = this.labeledStates.get(labelKey);\n\n if (!state) {\n // Initialize new labeled state\n state = {\n count: 0,\n sum: 0,\n bucketCounts: new Map(),\n };\n for (const bucket of this.buckets) {\n state.bucketCounts.set(bucket, 0);\n }\n this.labeledStates.set(labelKey, state);\n }\n\n state.count++;\n state.sum += value;\n\n // Update cumulative bucket counts\n for (const bucket of this.buckets) {\n if (value <= bucket) {\n state.bucketCounts.set(bucket, (state.bucketCounts.get(bucket) || 0) + 1);\n }\n }\n } else {\n // Unlabeled observation\n this.count++;\n this.sum += value;\n\n // Update cumulative bucket counts\n for (const bucket of this.buckets) {\n if (value <= bucket) {\n this.bucketCounts.set(bucket, (this.bucketCounts.get(bucket) || 0) + 1);\n }\n }\n }\n }\n\n /**\n * Get histogram summary\n *\n * Returns OTLP-compatible histogram summary with cumulative bucket counts.\n */\n getSummary(): HistogramSummary {\n const buckets: HistogramBucket[] = this.buckets.map((le) => ({\n le,\n count: this.bucketCounts.get(le) || 0,\n }));\n\n return {\n count: this.count,\n sum: this.sum,\n buckets,\n };\n }\n\n /**\n * Get current observation count\n */\n getCount(): number {\n return this.count;\n }\n\n /**\n * Get sum of all observed values\n */\n getSum(): number {\n return this.sum;\n }\n\n /**\n * Get average of observed values\n */\n getAverage(): number {\n return this.count > 0 ? this.sum / this.count : 0;\n }\n\n /**\n * Get all labeled summaries\n * @returns Map of serialized label keys to histogram summaries\n */\n getLabeledSummaries(): Map<string, HistogramSummary> {\n const summaries = new Map<string, HistogramSummary>();\n\n for (const [labelKey, state] of this.labeledStates) {\n const buckets: HistogramBucket[] = this.buckets.map((le) => ({\n le,\n count: state.bucketCounts.get(le) || 0,\n }));\n\n summaries.set(labelKey, {\n count: state.count,\n sum: state.sum,\n buckets,\n });\n }\n\n return summaries;\n }\n\n /**\n * Get summary for specific label combination\n */\n getSummaryForLabels(labels: Record<string, string>): HistogramSummary | null {\n const labelKey = this.serializeLabels(labels);\n const state = this.labeledStates.get(labelKey);\n\n if (!state) {\n return null;\n }\n\n const buckets: HistogramBucket[] = this.buckets.map((le) => ({\n le,\n count: state.bucketCounts.get(le) || 0,\n }));\n\n return {\n count: state.count,\n sum: state.sum,\n buckets,\n };\n }\n\n /**\n * Reset histogram to initial state (all label combinations)\n */\n reset(): void {\n this.count = 0;\n this.sum = 0;\n for (const bucket of this.buckets) {\n this.bucketCounts.set(bucket, 0);\n }\n this.labeledStates.clear();\n }\n\n /**\n * Serialize labels to deterministic string key\n * Format: key1=value1,key2=value2 (sorted by key)\n */\n private serializeLabels(labels: Record<string, string>): string {\n return Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join(\",\");\n }\n}\n","/**\n * Metrics registry - central registry for all metrics\n *\n * Provides singleton registry for counters, gauges, and histograms.\n * Exports events in schema-compliant format.\n */\n\nimport { Counter } from \"./counter.js\";\nimport { Gauge } from \"./gauge.js\";\nimport { Histogram } from \"./histogram.js\";\nimport { getDefaultUnit } from \"./taxonomy.js\";\nimport type { FlushOptions, HistogramOptions, MetricName, MetricsEvent } from \"./types.js\";\n\n/**\n * Metrics registry\n *\n * Central registry for all metrics. Provides factory methods for counters,\n * gauges, and histograms. Exports metrics as schema-compliant events.\n */\nexport class MetricsRegistry {\n private counters: Map<MetricName, Counter> = new Map();\n private gauges: Map<MetricName, Gauge> = new Map();\n private histograms: Map<MetricName, Histogram> = new Map();\n\n /**\n * Get or create a counter\n *\n * @param name - Metric name from taxonomy\n * @returns Counter instance\n *\n * @example\n * ```typescript\n * const counter = registry.counter('schema_validations');\n * counter.inc();\n * ```\n */\n counter(name: MetricName): Counter {\n let counter = this.counters.get(name);\n if (!counter) {\n counter = new Counter(name);\n this.counters.set(name, counter);\n }\n return counter;\n }\n\n /**\n * Get or create a gauge\n *\n * @param name - Metric name from taxonomy\n * @returns Gauge instance\n *\n * @example\n * ```typescript\n * const gauge = registry.gauge('foundry_lookup_count');\n * gauge.set(42);\n * ```\n */\n gauge(name: MetricName): Gauge {\n let gauge = this.gauges.get(name);\n if (!gauge) {\n gauge = new Gauge(name);\n this.gauges.set(name, gauge);\n }\n return gauge;\n }\n\n /**\n * Get or create a histogram\n *\n * @param name - Metric name from taxonomy\n * @param options - Optional histogram options\n * @returns Histogram instance\n *\n * @example\n * ```typescript\n * // Auto-applies ADR-0007 buckets for _ms metrics\n * const histogram = registry.histogram('config_load_ms');\n * histogram.observe(42.5);\n *\n * // Custom buckets\n * const custom = registry.histogram('custom_metric', {\n * buckets: [10, 50, 100, 500, 1000]\n * });\n * ```\n */\n histogram(name: MetricName, options?: HistogramOptions): Histogram {\n let histogram = this.histograms.get(name);\n if (!histogram) {\n histogram = new Histogram(name, options);\n this.histograms.set(name, histogram);\n }\n return histogram;\n }\n\n /**\n * Export all metrics as events\n *\n * Returns array of schema-compliant MetricsEvent objects.\n * Does not clear metrics (use flush() to clear after export).\n *\n * @returns Promise resolving to array of metrics events\n *\n * @example\n * ```typescript\n * const events = await registry.export();\n * console.log(JSON.stringify(events, null, 2));\n * ```\n */\n async export(): Promise<MetricsEvent[]> {\n const events: MetricsEvent[] = [];\n const timestamp = new Date().toISOString();\n\n // Export counters (unlabeled + labeled) - Crucible v0.2.7+\n for (const [name, counter] of this.counters) {\n const unit = await getDefaultUnit(name);\n\n // Always export unlabeled value (for backwards compatibility)\n events.push({\n timestamp,\n name,\n value: counter.getValue(),\n unit,\n });\n\n // Export labeled values (only if > 0)\n for (const [labelKey, value] of counter.getLabeledValues()) {\n if (value > 0) {\n const tags = this.deserializeLabels(labelKey);\n events.push({\n timestamp,\n name,\n value,\n tags,\n unit,\n });\n }\n }\n }\n\n // Export gauges (unlabeled + labeled) - Crucible v0.2.7+\n for (const [name, gauge] of this.gauges) {\n const unit = await getDefaultUnit(name);\n\n // Export unlabeled value (always export gauges, even if zero)\n events.push({\n timestamp,\n name,\n value: gauge.getValue(),\n unit,\n });\n\n // Export labeled values\n for (const [labelKey, value] of gauge.getLabeledValues()) {\n const tags = this.deserializeLabels(labelKey);\n events.push({\n timestamp,\n name,\n value,\n tags,\n unit,\n });\n }\n }\n\n // Export histograms (unlabeled + labeled) - Crucible v0.2.7+\n for (const [name, histogram] of this.histograms) {\n const unit = await getDefaultUnit(name);\n\n // Always export unlabeled summary (for backwards compatibility)\n events.push({\n timestamp,\n name,\n value: histogram.getSummary(),\n unit,\n });\n\n // Export labeled summaries (only if count > 0)\n for (const [labelKey, summary] of histogram.getLabeledSummaries()) {\n if (summary.count > 0) {\n const tags = this.deserializeLabels(labelKey);\n events.push({\n timestamp,\n name,\n value: summary,\n tags,\n unit,\n });\n }\n }\n }\n\n return events;\n }\n\n /**\n * Deserialize label key back to tags object\n * Format: key1=value1,key2=value2 → {key1: \"value1\", key2: \"value2\"}\n */\n private deserializeLabels(labelKey: string): Record<string, string> {\n if (!labelKey) {\n return {};\n }\n\n const tags: Record<string, string> = {};\n for (const pair of labelKey.split(\",\")) {\n const [key, value] = pair.split(\"=\");\n if (key && value) {\n tags[key] = value;\n }\n }\n return tags;\n }\n\n /**\n * Export and clear all metrics\n *\n * Exports metrics as events, optionally emits them via logger,\n * then resets all metrics to zero.\n *\n * @param options - Flush options\n * @returns Promise resolving to array of exported events\n *\n * @example\n * ```typescript\n * // Export and clear\n * const events = await registry.flush();\n *\n * // Export, emit to logger, and clear\n * const events = await registry.flush({\n * emit: (events) => console.log(JSON.stringify(events))\n * });\n * ```\n */\n async flush(options?: FlushOptions): Promise<MetricsEvent[]> {\n const events = await this.export();\n\n try {\n // Emit if logger provided\n if (options?.emit) {\n options.emit(events);\n }\n } finally {\n // Always clear metrics, even if emit throws\n this.clear();\n }\n\n return events;\n }\n\n /**\n * Clear all metrics (reset to zero)\n *\n * Resets all counters, gauges, and histograms to their initial state.\n */\n clear(): void {\n for (const counter of this.counters.values()) {\n counter.reset();\n }\n for (const gauge of this.gauges.values()) {\n gauge.reset();\n }\n for (const histogram of this.histograms.values()) {\n histogram.reset();\n }\n }\n\n /**\n * Get all registered metric names\n *\n * Returns array of all metric names that have been accessed\n * (counters, gauges, or histograms).\n */\n getMetricNames(): MetricName[] {\n const names = new Set<MetricName>();\n for (const name of this.counters.keys()) {\n names.add(name);\n }\n for (const name of this.gauges.keys()) {\n names.add(name);\n }\n for (const name of this.histograms.keys()) {\n names.add(name);\n }\n return Array.from(names);\n }\n\n /**\n * Get total count of registered metrics\n */\n getMetricCount(): number {\n return this.counters.size + this.gauges.size + this.histograms.size;\n }\n}\n","/**\n * Telemetry types - TypeScript types for metrics events\n *\n * Based on schemas/crucible-ts/observability/metrics/v1.0.0/metrics-event.schema.json\n * and config/crucible-ts/taxonomy/metrics.yaml\n */\n\n/**\n * Metric name from taxonomy\n * Aligned with config/crucible-ts/taxonomy/metrics.yaml#/$defs/metricName\n * Updated for Crucible v0.2.18 (HTTP server metrics)\n */\nexport type MetricName =\n // Core module metrics\n | \"schema_validations\"\n | \"schema_validation_errors\"\n | \"config_load_ms\"\n | \"config_load_errors\"\n | \"pathfinder_find_ms\"\n | \"pathfinder_validation_errors\"\n | \"pathfinder_security_warnings\"\n | \"foundry_lookup_count\"\n | \"logging_emit_count\"\n | \"logging_emit_latency_ms\"\n | \"goneat_command_duration_ms\"\n // Prometheus exporter metrics\n | \"prometheus_exporter_refresh_duration_seconds\"\n | \"prometheus_exporter_refresh_total\"\n | \"prometheus_exporter_refresh_errors_total\"\n | \"prometheus_exporter_refresh_inflight\"\n | \"prometheus_exporter_http_requests_total\"\n | \"prometheus_exporter_http_errors_total\"\n | \"prometheus_exporter_restarts_total\"\n // Foundry MIME detection metrics\n | \"foundry_mime_detections_total_json\"\n | \"foundry_mime_detections_total_xml\"\n | \"foundry_mime_detections_total_yaml\"\n | \"foundry_mime_detections_total_csv\"\n | \"foundry_mime_detections_total_plain_text\"\n | \"foundry_mime_detections_total_unknown\"\n | \"foundry_mime_detection_ms_json\"\n | \"foundry_mime_detection_ms_xml\"\n | \"foundry_mime_detection_ms_yaml\"\n | \"foundry_mime_detection_ms_csv\"\n | \"foundry_mime_detection_ms_plain_text\"\n | \"foundry_mime_detection_ms_unknown\"\n // Error handling metrics\n | \"error_handling_wraps_total\"\n | \"error_handling_wrap_ms\"\n // FulHash metrics\n | \"fulhash_operations_total_xxh3_128\"\n | \"fulhash_operations_total_sha256\"\n | \"fulhash_hash_string_total\"\n | \"fulhash_bytes_hashed_total\"\n | \"fulhash_operation_ms\"\n // HTTP server metrics (v0.2.18)\n | \"http_requests_total\"\n | \"http_request_duration_seconds\"\n | \"http_request_size_bytes\"\n | \"http_response_size_bytes\"\n | \"http_active_requests\";\n\n/**\n * Metric unit from taxonomy\n * Aligned with config/crucible-ts/taxonomy/metrics.yaml#/$defs/metricUnit\n * Updated for Crucible v0.2.7 (adds 's' for seconds)\n */\nexport type MetricUnit = \"count\" | \"ms\" | \"bytes\" | \"percent\" | \"s\";\n\n/**\n * Histogram bucket for OTLP-compatible histograms\n */\nexport interface HistogramBucket {\n /** Upper bound (less-than-or-equal) for the bucket */\n le: number;\n /** Cumulative count up to and including this bucket */\n count: number;\n}\n\n/**\n * Histogram summary payload\n */\nexport interface HistogramSummary {\n /** Total count of observations */\n count: number;\n /** Sum of all observed values */\n sum: number;\n /** Ordered buckets with cumulative counts (OTLP-compatible) */\n buckets: HistogramBucket[];\n}\n\n/**\n * Metric value (scalar or histogram)\n */\nexport type MetricValue = number | HistogramSummary;\n\n/**\n * Metrics event structure\n * Aligned with schemas/crucible-ts/observability/metrics/v1.0.0/metrics-event.schema.json\n */\nexport interface MetricsEvent {\n /** RFC3339 timestamp of metric emission */\n timestamp: string;\n /** Metric identifier from taxonomy */\n name: MetricName;\n /** Measurement payload (scalar or histogram summary) */\n value: MetricValue;\n /** Optional key/value dimensions */\n tags?: Record<string, string>;\n /** Optional metric unit (defaults to taxonomy default) */\n unit?: MetricUnit;\n}\n\n/**\n * Histogram options for customization\n */\nexport interface HistogramOptions {\n /** Custom bucket boundaries (overrides default ADR-0007 buckets) */\n buckets?: number[];\n}\n\n/**\n * Flush options for metrics registry\n */\nexport interface FlushOptions {\n /** Optional logger function to emit metrics */\n emit?: (events: MetricsEvent[]) => void;\n}\n\n/**\n * Type guard to check if value is a histogram summary\n */\nexport function isHistogramSummary(value: unknown): value is HistogramSummary {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"count\" in value &&\n \"sum\" in value &&\n \"buckets\" in value\n );\n}\n\n/**\n * Type guard to check if metric name is valid\n * Aligned with Crucible v0.2.18 taxonomy\n */\nexport function isValidMetricName(name: string): name is MetricName {\n const validNames: MetricName[] = [\n // Core module metrics\n \"schema_validations\",\n \"schema_validation_errors\",\n \"config_load_ms\",\n \"config_load_errors\",\n \"pathfinder_find_ms\",\n \"pathfinder_validation_errors\",\n \"pathfinder_security_warnings\",\n \"foundry_lookup_count\",\n \"logging_emit_count\",\n \"logging_emit_latency_ms\",\n \"goneat_command_duration_ms\",\n // Prometheus exporter metrics\n \"prometheus_exporter_refresh_duration_seconds\",\n \"prometheus_exporter_refresh_total\",\n \"prometheus_exporter_refresh_errors_total\",\n \"prometheus_exporter_refresh_inflight\",\n \"prometheus_exporter_http_requests_total\",\n \"prometheus_exporter_http_errors_total\",\n \"prometheus_exporter_restarts_total\",\n // Foundry MIME detection metrics\n \"foundry_mime_detections_total_json\",\n \"foundry_mime_detections_total_xml\",\n \"foundry_mime_detections_total_yaml\",\n \"foundry_mime_detections_total_csv\",\n \"foundry_mime_detections_total_plain_text\",\n \"foundry_mime_detections_total_unknown\",\n \"foundry_mime_detection_ms_json\",\n \"foundry_mime_detection_ms_xml\",\n \"foundry_mime_detection_ms_yaml\",\n \"foundry_mime_detection_ms_csv\",\n \"foundry_mime_detection_ms_plain_text\",\n \"foundry_mime_detection_ms_unknown\",\n // Error handling metrics\n \"error_handling_wraps_total\",\n \"error_handling_wrap_ms\",\n // FulHash metrics\n \"fulhash_operations_total_xxh3_128\",\n \"fulhash_operations_total_sha256\",\n \"fulhash_hash_string_total\",\n \"fulhash_bytes_hashed_total\",\n \"fulhash_operation_ms\",\n // HTTP server metrics\n \"http_requests_total\",\n \"http_request_duration_seconds\",\n \"http_request_size_bytes\",\n \"http_response_size_bytes\",\n \"http_active_requests\",\n ];\n return validNames.includes(name as MetricName);\n}\n\n/**\n * Type guard to check if unit is valid\n */\nexport function isValidMetricUnit(unit: string): unit is MetricUnit {\n const validUnits: MetricUnit[] = [\"count\", \"ms\", \"bytes\", \"percent\", \"s\"];\n return validUnits.includes(unit as MetricUnit);\n}\n","/**\n * Metrics event validators\n *\n * Schema validation for metrics events using existing src/schema infrastructure\n */\n\nimport { compileSchemaById } from \"../schema/index.js\";\nimport type { CompiledValidator } from \"../schema/types.js\";\n\n/**\n * Singleton validator for metrics events\n *\n * Pre-compiles the metrics-event schema at first access for optimal performance.\n * Reuses existing AJV setup from src/schema module.\n */\nclass MetricsValidator {\n private static instance: MetricsValidator;\n private validateFn: CompiledValidator | null = null;\n private initPromise: Promise<void> | null = null;\n private initError: Error | null = null;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get singleton instance\n */\n static getInstance(): MetricsValidator {\n if (!MetricsValidator.instance) {\n MetricsValidator.instance = new MetricsValidator();\n }\n return MetricsValidator.instance;\n }\n\n /**\n * Initialize validator (lazy load, async)\n */\n private async init(): Promise<void> {\n if (this.validateFn !== null || this.initError !== null) {\n return; // Already initialized\n }\n\n if (this.initPromise) {\n return this.initPromise; // Already initializing\n }\n\n this.initPromise = (async () => {\n try {\n // Compile schema using existing schema infrastructure\n this.validateFn = await compileSchemaById(\"observability/metrics/v1.0.0/metrics-event\");\n } catch (err) {\n this.initError = err instanceof Error ? err : new Error(String(err));\n throw new Error(`Failed to initialize metrics validator: ${this.initError.message}`);\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Validate metrics event against schema\n *\n * @param event - Metrics event to validate\n * @returns Promise resolving to true if valid, false otherwise\n */\n async validate(event: unknown): Promise<boolean> {\n if (this.validateFn === null) {\n await this.init();\n }\n\n if (this.initError) {\n throw this.initError;\n }\n\n if (!this.validateFn) {\n throw new Error(\"Validator not initialized\");\n }\n\n return this.validateFn(event);\n }\n\n /**\n * Get validation errors from last validation\n */\n getErrors() {\n if (!this.validateFn) {\n return null;\n }\n return this.validateFn.errors;\n }\n\n /**\n * Reset validator state (for testing)\n * @internal\n */\n static _reset(): void {\n MetricsValidator.instance = new MetricsValidator();\n }\n}\n\n/**\n * Validate metrics event against schema\n *\n * Uses pre-compiled validator singleton for optimal performance.\n *\n * @param event - Metrics event to validate\n * @returns Promise resolving to true if valid\n *\n * @example\n * ```typescript\n * const event: MetricsEvent = {\n * timestamp: new Date().toISOString(),\n * name: 'schema_validations',\n * value: 42\n * };\n *\n * if (await validateMetricsEvent(event)) {\n * // Event is schema-compliant\n * } else {\n * const errors = getValidationErrors();\n * console.error('Validation failed:', errors);\n * }\n * ```\n */\nexport async function validateMetricsEvent(event: unknown): Promise<boolean> {\n return MetricsValidator.getInstance().validate(event);\n}\n\n/**\n * Validate array of metrics events\n *\n * @param events - Array of metrics events\n * @returns Promise resolving to true if all valid\n */\nexport async function validateMetricsEvents(events: unknown[]): Promise<boolean> {\n for (const event of events) {\n if (!(await validateMetricsEvent(event))) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Get validation errors from last validation\n */\nexport function getValidationErrors() {\n return MetricsValidator.getInstance().getErrors();\n}\n\n/**\n * Format validation errors as human-readable string\n */\nexport function formatValidationErrors(\n errors: Array<{ instancePath?: string; message?: string }>,\n): string {\n return errors\n .map((err) => {\n const path = err.instancePath || \"(root)\";\n const message = err.message || \"validation failed\";\n return `${path}: ${message}`;\n })\n .join(\"; \");\n}\n\n/**\n * Assert that metrics event is valid (throws if not)\n *\n * @param event - Metrics event to validate\n * @throws {Error} If validation fails\n */\nexport async function assertValidMetricsEvent(event: unknown): Promise<void> {\n if (!(await validateMetricsEvent(event))) {\n const errors = getValidationErrors();\n const message = errors ? formatValidationErrors(errors) : \"Metrics event validation failed\";\n throw new Error(`Invalid metrics event: ${message}`);\n }\n}\n\n// Export for testing\nexport { MetricsValidator };\n","/**\n * Telemetry module - metrics collection and export\n *\n * Provides counter, gauge, and histogram metrics with schema validation\n * and taxonomy-based defaults (ADR-0007).\n */\n\nexport const VERSION = \"1.0.0\";\n\n// Core registry and singleton\nexport { MetricsRegistry } from \"./registry.js\";\n\nimport { MetricsRegistry } from \"./registry.js\";\n\n/**\n * Default singleton metrics registry\n *\n * Use this for application-wide metrics collection.\n *\n * @example\n * ```typescript\n * import { metrics } from '@fulmenhq/tsfulmen/telemetry';\n *\n * // Increment counter\n * metrics.counter('schema_validations').inc();\n *\n * // Record histogram observation\n * metrics.histogram('config_load_ms').observe(42.5);\n *\n * // Export all metrics\n * const events = await metrics.export();\n * ```\n */\nexport const metrics = new MetricsRegistry();\n\n// Metric types\nexport { Counter } from \"./counter.js\";\nexport { Gauge } from \"./gauge.js\";\nexport { Histogram } from \"./histogram.js\";\n// Taxonomy\nexport type { MetricDefinition, MetricsTaxonomy } from \"./taxonomy.js\";\nexport {\n DEFAULT_MS_BUCKETS,\n getDefaultBuckets,\n getDefaultUnit,\n getMetric,\n getTaxonomy,\n isValidMetricName as isValidMetricNameTaxonomy,\n} from \"./taxonomy.js\";\n// Types\nexport type {\n FlushOptions,\n HistogramBucket,\n HistogramOptions,\n HistogramSummary,\n MetricName,\n MetricsEvent,\n MetricUnit,\n MetricValue,\n} from \"./types.js\";\nexport {\n isHistogramSummary,\n isValidMetricName,\n isValidMetricUnit,\n} from \"./types.js\";\n\n// Validators\nexport {\n assertValidMetricsEvent,\n formatValidationErrors,\n getValidationErrors,\n validateMetricsEvent,\n validateMetricsEvents,\n} from \"./validators.js\";\n","/**\n * Schema validator - implements AJV-based schema validation with goneat integration\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AnySchema } from \"ajv\";\nimport Ajv from \"ajv\";\nimport Ajv2019 from \"ajv/dist/2019.js\";\nimport Ajv2020 from \"ajv/dist/2020.js\";\nimport AjvDraft04 from \"ajv-draft-04\";\nimport { parse as parseYAML } from \"yaml\";\nimport { metrics } from \"../telemetry/index.js\";\nimport { applyFulmenAjvFormats } from \"./ajv-formats.js\";\nimport { SchemaValidationError } from \"./errors.js\";\nimport { getSchemaRegistry } from \"./registry.js\";\nimport type {\n CompiledValidator,\n SchemaInput,\n SchemaRegistryOptions,\n SchemaValidationResult,\n} from \"./types.js\";\nimport { createDiagnostic } from \"./utils.js\";\n\n/**\n * Supported JSON Schema dialects for meta validation + compilation.\n */\ntype JsonSchemaDialect = \"draft-04\" | \"draft-06\" | \"draft-07\" | \"draft-2019-09\" | \"draft-2020-12\";\n\n/**\n * AJV instances by dialect\n */\nconst ajvInstances = new Map<JsonSchemaDialect, Ajv>();\n\n/**\n * Metaschema initialization promises by dialect\n */\nconst metaschemaReady = new Map<JsonSchemaDialect, Promise<void>>();\n\n/**\n * Schema cache for compiled validators\n */\nconst schemaCache = new Map<string, CompiledValidator>();\n\n/**\n * Load metaschema from Crucible SSOT\n */\nasync function loadMetaSchema(draft: JsonSchemaDialect): Promise<Record<string, unknown>> {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const metaSchemaPath = join(\n __dirname,\n \"..\",\n \"..\",\n \"schemas\",\n \"crucible-ts\",\n \"meta\",\n draft,\n \"schema.json\",\n );\n\n const content = await readFile(metaSchemaPath, \"utf-8\");\n return JSON.parse(content) as Record<string, unknown>;\n}\n\n/**\n * Load vocabulary schemas (draft 2019-09 / 2020-12)\n */\nasync function loadVocabularySchemas(draft: JsonSchemaDialect): Promise<Record<string, unknown>[]> {\n if (draft !== \"draft-2019-09\" && draft !== \"draft-2020-12\") {\n return [];\n }\n\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const vocabDir = join(__dirname, \"..\", \"..\", \"schemas\", \"crucible-ts\", \"meta\", draft, \"meta\");\n\n const vocabFiles =\n draft === \"draft-2020-12\"\n ? [\n \"core.json\",\n \"applicator.json\",\n \"unevaluated.json\",\n \"validation.json\",\n \"meta-data.json\",\n \"format-annotation.json\",\n \"content.json\",\n ]\n : [\n \"core.json\",\n \"applicator.json\",\n \"validation.json\",\n \"meta-data.json\",\n \"format.json\",\n \"content.json\",\n ];\n\n const schemas: Record<string, unknown>[] = [];\n for (const file of vocabFiles) {\n try {\n const content = await readFile(join(vocabDir, file), \"utf-8\");\n schemas.push(JSON.parse(content) as Record<string, unknown>);\n } catch {\n // Vocabulary schema not found, skip\n }\n }\n\n return schemas;\n}\n\n/**\n * Load referenced schemas (including YAML files) for AJV\n *\n * Resolves relative paths from schemas/ and config/ directories.\n * Handles both relative paths and https://schemas.fulmenhq.dev URIs.\n *\n * Per Canonical URI Resolution Standard (v0.4.2+), crucible-hosted schemas use:\n * https://schemas.fulmenhq.dev/crucible/<topic>/<version>/<filename>\n *\n * We only embed crucible schemas locally. Other modules (goneat/, enact/, etc.)\n * are not embedded and cannot be resolved offline.\n */\nasync function loadReferencedSchema(uri: string): Promise<Record<string, unknown>> {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const repoRoot = join(__dirname, \"..\", \"..\");\n\n let resolvedPath: string;\n\n // Handle https://schemas.fulmenhq.dev/ URIs - map to local files\n if (uri.startsWith(\"https://schemas.fulmenhq.dev/\")) {\n let relativePath = uri.replace(\"https://schemas.fulmenhq.dev/\", \"\");\n\n // Strip crucible/ module prefix if present (v0.4.2+ canonical URIs)\n // We only embed crucible schemas - other modules cannot be resolved locally\n if (relativePath.startsWith(\"crucible/\")) {\n relativePath = relativePath.slice(\"crucible/\".length);\n }\n\n // Check if it's a config taxonomy reference\n if (relativePath.startsWith(\"config/taxonomy/\")) {\n resolvedPath = join(\n repoRoot,\n \"config\",\n \"crucible-ts\",\n \"taxonomy\",\n relativePath.split(\"/\").pop() || \"\",\n );\n } else {\n // Schema reference - map to schemas/crucible-ts/\n resolvedPath = join(repoRoot, \"schemas\", \"crucible-ts\", relativePath);\n }\n }\n // Handle relative paths (e.g., \"../../../../config/taxonomy/metrics.yaml\")\n else if (uri.startsWith(\"../../\") || uri.startsWith(\"../\")) {\n // Resolve relative to schemas/crucible-ts/observability/metrics/v1.0.0/\n // (where metrics-event.schema.json is located)\n const schemaBase = join(\n repoRoot,\n \"schemas\",\n \"crucible-ts\",\n \"observability\",\n \"metrics\",\n \"v1.0.0\",\n );\n resolvedPath = join(schemaBase, uri);\n }\n // Handle file:// URIs\n else if (uri.startsWith(\"file://\")) {\n resolvedPath = fileURLToPath(uri);\n }\n // Unhandled URI scheme\n else {\n throw new Error(`Cannot load remote schema: ${uri}`);\n }\n\n // Read and parse the file\n const content = await readFile(resolvedPath, \"utf-8\");\n const ext = resolvedPath.split(\".\").pop()?.toLowerCase();\n\n if (ext === \"yaml\" || ext === \"yml\") {\n return parseYAML(content) as Record<string, unknown>;\n }\n return JSON.parse(content) as Record<string, unknown>;\n}\n\n/**\n * Resolve JSON Schema dialect from schema content.\n */\nfunction detectDialect(schema: unknown): JsonSchemaDialect {\n if (schema && typeof schema === \"object\" && !Array.isArray(schema)) {\n const maybeSchema = schema as Record<string, unknown>;\n const declared = (maybeSchema as { $schema?: unknown }).$schema;\n\n if (typeof declared === \"string\") {\n if (declared.includes(\"draft-04\")) return \"draft-04\";\n if (declared.includes(\"draft-06\")) return \"draft-06\";\n if (declared.includes(\"draft-07\")) return \"draft-07\";\n if (declared.includes(\"draft/2019-09\")) return \"draft-2019-09\";\n if (declared.includes(\"draft/2020-12\")) return \"draft-2020-12\";\n }\n }\n\n // Default to 2020-12 in Fulmen ecosystem.\n return \"draft-2020-12\";\n}\n\n/**\n * Create AJV instance for a specific dialect\n */\nfunction createAjv(dialect: JsonSchemaDialect): Ajv {\n const AjvCtor =\n dialect === \"draft-2020-12\"\n ? Ajv2020\n : dialect === \"draft-2019-09\"\n ? Ajv2019\n : dialect === \"draft-04\"\n ? (AjvDraft04 as unknown as typeof Ajv)\n : Ajv;\n\n const ajv = new AjvCtor({\n strict: false,\n allErrors: true,\n verbose: true,\n // Allow schemas with $id to be added without replacing existing ones\n addUsedSchema: false,\n // draft-04 uses \"id\"; later drafts use \"$id\"\n schemaId: dialect === \"draft-04\" ? \"id\" : \"$id\",\n // Enable async schema loading for YAML references\n loadSchema: loadReferencedSchema,\n });\n\n applyFulmenAjvFormats(ajv);\n\n return ajv;\n}\n\n/**\n * Get or create AJV instance for a dialect, ensuring metaschemas are loaded.\n */\nasync function getAjv(dialect: JsonSchemaDialect): Promise<Ajv> {\n const existing = ajvInstances.get(dialect);\n if (existing) {\n const ready = metaschemaReady.get(dialect);\n if (ready) await ready;\n return existing;\n }\n\n const ajv = createAjv(dialect);\n ajvInstances.set(dialect, ajv);\n\n const readyPromise = Promise.all([loadVocabularySchemas(dialect), loadMetaSchema(dialect)])\n .then(([vocabSchemas, metaSchema]) => {\n // Add vocabulary schemas first (referenced by meta schema)\n for (const vocabSchema of vocabSchemas) {\n try {\n ajv.addMetaSchema(vocabSchema);\n } catch {\n // Already added or incompatible with Ajv's built-ins\n }\n }\n\n try {\n ajv.addMetaSchema(metaSchema);\n } catch {\n // Already added or incompatible with Ajv's built-ins\n }\n })\n .catch((error) => {\n throw new Error(`Failed to load metaschemas (${dialect}): ${error}`);\n });\n\n metaschemaReady.set(dialect, readyPromise);\n await readyPromise;\n\n return ajv;\n}\n\n/**\n * Compile a schema for validation\n */\nexport async function compileSchema(\n schema: SchemaInput,\n options: { aliases?: string[] } = {},\n): Promise<CompiledValidator> {\n const baseKey = typeof schema === \"string\" ? schema : JSON.stringify(schema);\n\n let parsedSchema: unknown;\n if (typeof schema === \"string\") {\n try {\n parsedSchema = JSON.parse(schema);\n } catch {\n // Try YAML if JSON parsing fails\n parsedSchema = parseYAML(schema);\n }\n } else if (Buffer.isBuffer(schema)) {\n const content = schema.toString(\"utf-8\");\n try {\n parsedSchema = JSON.parse(content);\n } catch {\n parsedSchema = parseYAML(content);\n }\n } else {\n parsedSchema = schema;\n }\n\n const dialect = detectDialect(parsedSchema);\n const ajv = await getAjv(dialect);\n\n const cacheKey = `${dialect}:${baseKey}`;\n const cached = schemaCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n try {\n // Register schema aliases (e.g., alternate $id values) before compile to support relative refs\n if (options.aliases && options.aliases.length > 0) {\n for (const alias of options.aliases) {\n if (alias && ajv.getSchema(alias) === undefined) {\n try {\n if (typeof parsedSchema === \"object\" && parsedSchema !== null) {\n ajv.addSchema(parsedSchema as Record<string, unknown>, alias);\n }\n } catch {\n // Ignore if alias already registered or invalid\n }\n }\n }\n }\n\n const validator =\n typeof parsedSchema === \"boolean\"\n ? ajv.compile(parsedSchema)\n : await ajv.compileAsync(parsedSchema as Record<string, unknown>);\n\n // Cache the compiled validator\n schemaCache.set(cacheKey, validator as CompiledValidator);\n\n return validator as CompiledValidator;\n } catch (error) {\n throw SchemaValidationError.parseFailed(\n {\n type: \"string\",\n content: typeof schema === \"string\" ? schema : JSON.stringify(schema),\n },\n error as Error,\n );\n }\n}\n\n/**\n * Validate data against a compiled schema\n */\nexport function validateData(data: unknown, validator: CompiledValidator): SchemaValidationResult {\n const valid = validator(data);\n\n const result: SchemaValidationResult = {\n valid,\n diagnostics: [],\n source: \"ajv\",\n };\n\n if (!valid && validator.errors) {\n const errors = validator.errors;\n if (Array.isArray(errors)) {\n result.diagnostics = errors.map((error) =>\n createDiagnostic(\n error.instancePath || \"\",\n error.message || \"Validation failed\",\n error.keyword || \"unknown\",\n \"ERROR\",\n \"ajv\",\n ),\n );\n }\n metrics.counter(\"schema_validation_errors\").inc();\n } else {\n metrics.counter(\"schema_validations\").inc();\n }\n\n return result;\n}\n\n/**\n * Validate file against a schema\n */\nexport async function validateFile(\n filePath: string,\n validator: CompiledValidator,\n): Promise<SchemaValidationResult> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n let data: unknown;\n\n try {\n data = JSON.parse(content);\n } catch {\n // Try YAML if JSON parsing fails\n data = parseYAML(content);\n }\n\n return validateData(data, validator);\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n throw SchemaValidationError.validationFailed(\n filePath,\n [\n createDiagnostic(\n \"\",\n `Failed to read or parse file: ${(error as Error).message}`,\n \"file-read\",\n \"ERROR\",\n \"ajv\",\n ),\n ],\n { type: \"file\", id: filePath },\n );\n }\n}\n\n/**\n * Validate a schema document itself\n */\nexport async function validateSchema(schema: SchemaInput): Promise<SchemaValidationResult> {\n try {\n // Parse schema so we can both meta-validate and compile with dialect-specific Ajv.\n let parsedSchema: unknown;\n if (typeof schema === \"string\") {\n try {\n parsedSchema = JSON.parse(schema);\n } catch {\n parsedSchema = parseYAML(schema);\n }\n } else if (Buffer.isBuffer(schema)) {\n const content = schema.toString(\"utf-8\");\n try {\n parsedSchema = JSON.parse(content);\n } catch {\n parsedSchema = parseYAML(content);\n }\n } else {\n parsedSchema = schema;\n }\n\n const dialect = detectDialect(parsedSchema);\n const ajv = await getAjv(dialect);\n\n // 1) Meta validation against declared dialect\n const metaValid = ajv.validateSchema(parsedSchema as AnySchema);\n if (!metaValid && ajv.errors) {\n const diagnostics = ajv.errors.map((error) =>\n createDiagnostic(\n error.instancePath || \"\",\n error.message || \"Schema meta-validation failed\",\n error.keyword || \"unknown\",\n \"ERROR\",\n \"ajv\",\n ),\n );\n\n return { valid: false, diagnostics, source: \"ajv\" };\n }\n\n // 2) Compilation check (refs resolvable, keywords supported)\n await compileSchema(parsedSchema as SchemaInput);\n\n return {\n valid: true,\n diagnostics: [],\n source: \"ajv\",\n };\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n return {\n valid: false,\n diagnostics: error.diagnostics,\n source: \"ajv\",\n };\n }\n\n return {\n valid: false,\n diagnostics: [\n createDiagnostic(\n \"\",\n `Schema validation failed: ${(error as Error).message}`,\n \"schema-validation\",\n \"ERROR\",\n \"ajv\",\n ),\n ],\n source: \"ajv\",\n };\n }\n}\n\n/**\n * Clear schema cache\n */\nexport function clearCache(): void {\n schemaCache.clear();\n // Keep Ajv instances cached; they hold metaschemas. Tests can still clear schema cache.\n}\n\n/**\n * Get schema cache size\n */\nexport function getCacheSize(): number {\n return schemaCache.size;\n}\n\n/**\n * Load schema by ID from registry and compile\n */\nexport async function compileSchemaById(\n schemaId: string,\n registryOptions?: SchemaRegistryOptions,\n): Promise<CompiledValidator> {\n try {\n const registry = getSchemaRegistry(registryOptions);\n const metadata = await registry.getSchema(schemaId);\n\n const content = await readFile(metadata.path, \"utf-8\");\n const aliases: string[] = [];\n\n const normalizedRelativePath = metadata.relativePath.replace(/\\\\/g, \"/\");\n if (normalizedRelativePath) {\n // Per Canonical URI Resolution Standard (v0.4.2+), include crucible/ module prefix\n aliases.push(\n new URL(`crucible/${normalizedRelativePath}`, \"https://schemas.fulmenhq.dev/\").toString(),\n );\n }\n\n return compileSchema(content, { aliases });\n } catch (error) {\n metrics.counter(\"schema_validation_errors\").inc();\n throw error;\n }\n}\n\n/**\n * Validate data against a schema ID from registry\n */\nexport async function validateDataBySchemaId(\n data: unknown,\n schemaId: string,\n registryOptions?: SchemaRegistryOptions,\n): Promise<SchemaValidationResult> {\n try {\n const validator = await compileSchemaById(schemaId, registryOptions);\n return validateData(data, validator);\n } catch (error) {\n metrics.counter(\"schema_validation_errors\").inc();\n throw error;\n }\n}\n\n/**\n * Validate file against a schema ID from registry\n */\nexport async function validateFileBySchemaId(\n filePath: string,\n schemaId: string,\n registryOptions?: SchemaRegistryOptions,\n): Promise<SchemaValidationResult> {\n try {\n const validator = await compileSchemaById(schemaId, registryOptions);\n return validateFile(filePath, validator);\n } catch (error) {\n metrics.counter(\"schema_validation_errors\").inc();\n throw error;\n }\n}\n","/**\n * Schema CLI - Commander-based CLI for schema operations\n *\n * Provides command-line interface for schema discovery, validation,\n * and normalization operations. This is a developer tool for exploration\n * and testing, not for production use.\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { Command } from \"commander\";\nimport { isGoneatAvailable, runGoneatValidation } from \"./goneat-bridge.js\";\nimport { compareSchemas, normalizeSchema } from \"./normalizer.js\";\nimport { getSchemaRegistry, listSchemas } from \"./registry.js\";\nimport type { CLIOptions, SchemaValidationResult } from \"./types.js\";\nimport { formatDiagnostics } from \"./utils.js\";\nimport { validateFileBySchemaId } from \"./validator.js\";\n\n/**\n * Create CLI command structure\n */\nexport function createCLI(options: CLIOptions = {}): Command {\n const program = new Command();\n\n program\n .name(\"tsfulmen-schema\")\n .description(\"Schema validation and discovery CLI for Fulmen (developer tool)\")\n .version(\"0.1.0\");\n\n // List schemas command\n program\n .command(\"list\")\n .description(\"List available schemas from registry\")\n .argument(\"[prefix]\", \"Filter schemas by prefix\")\n .option(\"--base-dir <path>\", \"Override schema base directory\")\n .action(async (prefix?: string, cmdOptions?: { baseDir?: string }) => {\n try {\n const schemas = await listSchemas(prefix, {\n baseDir: cmdOptions?.baseDir || options.baseDir,\n });\n\n if (schemas.length === 0) {\n console.log(\"No schemas found\");\n return;\n }\n\n console.log(`Found ${schemas.length} schema(s):\\n`);\n for (const schema of schemas) {\n console.log(` ${schema.id}`);\n console.log(` Format: ${schema.format}`);\n console.log(` Path: ${schema.relativePath}`);\n if (schema.description) {\n console.log(` Description: ${schema.description}`);\n }\n console.log();\n }\n } catch (error) {\n console.error(\"Error listing schemas:\", (error as Error).message);\n process.exit(1);\n }\n });\n\n // Show schema command\n program\n .command(\"show\")\n .description(\"Show schema details\")\n .requiredOption(\"--schema-id <id>\", \"Schema ID to show\")\n .option(\"--base-dir <path>\", \"Override schema base directory\")\n .action(async (cmdOptions: { schemaId: string; baseDir?: string }) => {\n try {\n const registry = getSchemaRegistry({\n baseDir: cmdOptions.baseDir || options.baseDir,\n });\n const schema = await registry.getSchema(cmdOptions.schemaId);\n\n console.log(\"Schema Details:\\n\");\n console.log(` ID: ${schema.id}`);\n console.log(` Format: ${schema.format}`);\n console.log(` Path: ${schema.path}`);\n console.log(` Relative Path: ${schema.relativePath}`);\n if (schema.version) {\n console.log(` Version: ${schema.version}`);\n }\n if (schema.description) {\n console.log(` Description: ${schema.description}`);\n }\n if (schema.schemaDraft) {\n console.log(` Schema Draft: ${schema.schemaDraft}`);\n }\n\n // Read and display schema content\n const content = await readFile(schema.path, \"utf-8\");\n console.log(\"\\nSchema Content:\");\n console.log(content);\n } catch (error) {\n console.error(\"Error showing schema:\", (error as Error).message);\n process.exit(1);\n }\n });\n\n // Validate data command\n program\n .command(\"validate\")\n .description(\"Validate data file against schema\")\n .requiredOption(\"--schema-id <id>\", \"Schema ID to validate against\")\n .argument(\"<file>\", \"Data file to validate\")\n .option(\"--use-goneat\", \"Use goneat for validation (requires goneat binary)\")\n .option(\"--goneat-path <path>\", \"Path to goneat binary\")\n .option(\"--base-dir <path>\", \"Override schema base directory\")\n .action(\n async (\n file: string,\n cmdOptions: {\n schemaId: string;\n useGoneat?: boolean;\n goneatPath?: string;\n baseDir?: string;\n },\n ) => {\n try {\n let result: SchemaValidationResult;\n\n if (cmdOptions.useGoneat) {\n // Check goneat availability\n const available = await isGoneatAvailable(cmdOptions.goneatPath);\n if (!available) {\n console.error(\"❌ goneat not available. Install goneat or remove --use-goneat flag.\");\n console.error(\" AJV validation (default) works without external dependencies.\");\n process.exit(1);\n }\n\n // Get schema path\n const registry = getSchemaRegistry({\n baseDir: cmdOptions.baseDir || options.baseDir,\n });\n const schema = await registry.getSchema(cmdOptions.schemaId);\n\n console.log(\"Using goneat validation...\");\n result = await runGoneatValidation(schema.path, file, cmdOptions.goneatPath);\n } else {\n // Use AJV validation (default, library implementation)\n console.log(\"Using AJV validation...\");\n result = await validateFileBySchemaId(file, cmdOptions.schemaId, {\n baseDir: cmdOptions.baseDir || options.baseDir,\n });\n }\n\n if (result.valid) {\n console.log(`✅ Validation passed (${result.source})`);\n process.exit(0);\n } else {\n console.log(`❌ Validation failed (${result.source})`);\n console.log(\"\\nDiagnostics:\");\n console.log(formatDiagnostics(result.diagnostics));\n process.exit(1);\n }\n } catch (error) {\n console.error(\"Error validating file:\", (error as Error).message);\n process.exit(1);\n }\n },\n );\n\n // Validate schema command\n program\n .command(\"validate-schema\")\n .description(\"Validate a schema file itself\")\n .argument(\"<file>\", \"Schema file to validate\")\n .action(async (file: string) => {\n try {\n const content = await readFile(file, \"utf-8\");\n const { validateSchema } = await import(\"./validator.js\");\n const result = await validateSchema(content);\n\n if (result.valid) {\n console.log(\"✅ Schema is valid\");\n process.exit(0);\n } else {\n console.log(\"❌ Schema is invalid\");\n console.log(\"\\nDiagnostics:\");\n console.log(formatDiagnostics(result.diagnostics));\n process.exit(1);\n }\n } catch (error) {\n console.error(\"Error validating schema:\", (error as Error).message);\n process.exit(1);\n }\n });\n\n // Normalize schema command\n program\n .command(\"normalize\")\n .description(\"Normalize schema to canonical JSON format\")\n .argument(\"<file>\", \"Schema file to normalize\")\n .option(\"--compact\", \"Output compact JSON (no formatting)\")\n .option(\"-o, --output <file>\", \"Write to output file instead of stdout\")\n .action(async (file: string, cmdOptions: { compact?: boolean; output?: string }) => {\n try {\n const content = await readFile(file, \"utf-8\");\n const normalized = normalizeSchema(content, {\n compact: cmdOptions.compact,\n });\n\n if (cmdOptions.output) {\n await writeFile(cmdOptions.output, normalized, \"utf-8\");\n console.log(`✅ Normalized schema written to ${cmdOptions.output}`);\n } else {\n console.log(normalized);\n }\n } catch (error) {\n console.error(\"Error normalizing schema:\", (error as Error).message);\n process.exit(1);\n }\n });\n\n // Compare schemas command\n program\n .command(\"compare\")\n .description(\"Compare two schemas for semantic equality\")\n .argument(\"<file1>\", \"First schema file\")\n .argument(\"<file2>\", \"Second schema file\")\n .option(\"--show-normalized\", \"Show normalized outputs\")\n .action(async (file1: string, file2: string, cmdOptions: { showNormalized?: boolean }) => {\n try {\n const content1 = await readFile(file1, \"utf-8\");\n const content2 = await readFile(file2, \"utf-8\");\n\n const result = compareSchemas(content1, content2);\n\n if (result.equal) {\n console.log(\"✅ Schemas are semantically equal\");\n } else {\n console.log(\"❌ Schemas differ\");\n }\n\n if (cmdOptions.showNormalized) {\n console.log(\"\\nNormalized Schema 1:\");\n console.log(result.normalizedA);\n console.log(\"\\nNormalized Schema 2:\");\n console.log(result.normalizedB);\n }\n\n process.exit(result.equal ? 0 : 1);\n } catch (error) {\n console.error(\"Error comparing schemas:\", (error as Error).message);\n process.exit(1);\n }\n });\n\n // Export schema command\n program\n .command(\"export\")\n .description(\"Export schema from registry to file with provenance\")\n .requiredOption(\"--schema-id <id>\", \"Schema ID to export\")\n .requiredOption(\"--out <path>\", \"Output file path\")\n .option(\"--force\", \"Overwrite existing file\", false)\n .option(\"--no-provenance\", \"Exclude provenance metadata\")\n .option(\"--no-validate\", \"Skip schema validation before export\")\n .option(\"--format <format>\", \"Export format (json|yaml|auto)\", \"auto\")\n .option(\"--base-dir <path>\", \"Override schema base directory\")\n .action(\n async (cmdOptions: {\n schemaId: string;\n out: string;\n force?: boolean;\n provenance?: boolean;\n validate?: boolean;\n format?: string;\n baseDir?: string;\n }) => {\n try {\n const { exportSchema } = await import(\"./export.js\");\n const { exitCodes } = await import(\"../foundry/index.js\");\n\n const result = await exportSchema({\n schemaId: cmdOptions.schemaId,\n outPath: cmdOptions.out,\n includeProvenance: cmdOptions.provenance ?? true,\n validate: cmdOptions.validate ?? true,\n overwrite: cmdOptions.force ?? false,\n format: (cmdOptions.format as \"json\" | \"yaml\" | \"auto\") ?? \"auto\",\n baseDir: cmdOptions.baseDir || options.baseDir,\n });\n\n console.log(\"✅ Schema exported successfully\");\n console.log(` Schema ID: ${result.schemaId}`);\n console.log(` Output: ${result.outPath}`);\n console.log(` Format: ${result.format}`);\n\n if (result.provenance) {\n console.log(\"\\nProvenance:\");\n console.log(` Crucible: ${result.provenance.crucible_version}`);\n console.log(` Library: ${result.provenance.library_version}`);\n if (result.provenance.revision) {\n console.log(` Revision: ${result.provenance.revision}`);\n }\n console.log(` Exported: ${result.provenance.exported_at}`);\n }\n\n process.exit(exitCodes.EXIT_SUCCESS);\n } catch (error) {\n const { exitCodes } = await import(\"../foundry/index.js\");\n const { SchemaExportError, SchemaValidationError, ExportErrorReason } = await import(\n \"./errors.js\"\n );\n\n console.error(\"❌ Schema export failed:\", (error as Error).message);\n\n // Map specific error types to appropriate exit codes\n if (error instanceof SchemaExportError) {\n if (error.outPath) {\n console.error(` Output path: ${error.outPath}`);\n }\n\n // Use error reason for type-safe exit code mapping\n switch (error.reason) {\n case ExportErrorReason.FILE_EXISTS:\n case ExportErrorReason.WRITE_FAILED:\n process.exit(exitCodes.EXIT_FILE_WRITE_ERROR);\n break;\n\n case ExportErrorReason.INVALID_FORMAT:\n process.exit(exitCodes.EXIT_INVALID_ARGUMENT);\n break;\n\n default:\n // PROVENANCE_FAILED, UNKNOWN, and any future reasons\n process.exit(exitCodes.EXIT_FAILURE);\n }\n }\n\n if (error instanceof SchemaValidationError) {\n // Schema not found or validation failed\n const errorMsg = error.message.toLowerCase();\n\n if (errorMsg.includes(\"not found\")) {\n process.exit(exitCodes.EXIT_FILE_NOT_FOUND);\n }\n\n // Validation failures\n process.exit(exitCodes.EXIT_DATA_INVALID);\n }\n\n process.exit(exitCodes.EXIT_FAILURE);\n }\n },\n );\n\n // Identity show command\n program\n .command(\"identity-show\")\n .description(\"Show application identity from .fulmen/app.yaml\")\n .option(\"--path <path>\", \"Explicit path to app.yaml\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (cmdOptions: { path?: string; json?: boolean }) => {\n try {\n const { loadIdentity } = await import(\"../appidentity/loader.js\");\n const { exitCodes } = await import(\"../foundry/index.js\");\n\n const identity = await loadIdentity({ path: cmdOptions.path });\n\n if (cmdOptions.json) {\n console.log(JSON.stringify(identity, null, 2));\n } else {\n console.log(\"Application Identity:\\n\");\n console.log(` Binary Name: ${identity.app.binary_name}`);\n console.log(` Vendor: ${identity.app.vendor}`);\n console.log(` Env Prefix: ${identity.app.env_prefix}`);\n console.log(` Config Name: ${identity.app.config_name}`);\n console.log(` Description: ${identity.app.description}`);\n\n if (identity.metadata) {\n console.log(\"\\nMetadata:\");\n if (identity.metadata.license) {\n console.log(` License: ${identity.metadata.license}`);\n }\n if (identity.metadata.repository_category) {\n console.log(` Category: ${identity.metadata.repository_category}`);\n }\n if (identity.metadata.telemetry_namespace) {\n console.log(` Telemetry: ${identity.metadata.telemetry_namespace}`);\n }\n if (identity.metadata.project_url) {\n console.log(` Project URL: ${identity.metadata.project_url}`);\n }\n }\n }\n\n process.exit(exitCodes.EXIT_SUCCESS);\n } catch (error) {\n const { exitCodes } = await import(\"../foundry/index.js\");\n const { AppIdentityError } = await import(\"../appidentity/errors.js\");\n\n console.error(\"❌ Failed to load identity:\", (error as Error).message);\n\n if (error instanceof AppIdentityError) {\n if (error.message.includes(\"not found\")) {\n process.exit(exitCodes.EXIT_FILE_NOT_FOUND);\n }\n if (error.message.includes(\"Invalid\") || error.message.includes(\"validation\")) {\n process.exit(exitCodes.EXIT_DATA_INVALID);\n }\n }\n\n process.exit(exitCodes.EXIT_FAILURE);\n }\n });\n\n // Identity validate command\n program\n .command(\"identity-validate\")\n .description(\"Validate application identity against schema\")\n .argument(\"[file]\", \"Path to app.yaml (defaults to discovery)\")\n .action(async (file?: string) => {\n try {\n const { loadIdentity } = await import(\"../appidentity/loader.js\");\n const { exitCodes } = await import(\"../foundry/index.js\");\n\n console.log(\"Validating application identity...\");\n\n const identity = await loadIdentity({ path: file });\n\n console.log(\"✅ Identity is valid\");\n console.log(` Binary: ${identity.app.binary_name}`);\n console.log(` Vendor: ${identity.app.vendor}`);\n\n process.exit(exitCodes.EXIT_SUCCESS);\n } catch (error) {\n const { exitCodes } = await import(\"../foundry/index.js\");\n const { AppIdentityError } = await import(\"../appidentity/errors.js\");\n\n console.error(\"❌ Identity validation failed:\", (error as Error).message);\n\n if (error instanceof AppIdentityError) {\n if (error.message.includes(\"not found\")) {\n process.exit(exitCodes.EXIT_FILE_NOT_FOUND);\n }\n if (error.message.includes(\"Invalid\") || error.message.includes(\"validation\")) {\n process.exit(exitCodes.EXIT_DATA_INVALID);\n }\n }\n\n process.exit(exitCodes.EXIT_FAILURE);\n }\n });\n\n return program;\n}\n","/**\n * Schema export utilities - implements schema export with provenance\n */\n\nimport { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, extname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parse as parseYAML, stringify as stringifyYAML } from \"yaml\";\nimport { SchemaExportError, SchemaValidationError } from \"./errors.js\";\nimport { getSchemaRegistry } from \"./registry.js\";\nimport type {\n ExportSchemaOptions,\n ExportSchemaResult,\n SchemaExportFormat,\n SchemaProvenanceMetadata,\n} from \"./types.js\";\nimport { validateSchema } from \"./validator.js\";\n\n/**\n * Extract provenance metadata from Crucible sync metadata\n */\nasync function extractProvenanceMetadata(schemaId: string): Promise<SchemaProvenanceMetadata> {\n try {\n // Read Crucible metadata using proper path resolution\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const metadataPath = join(__dirname, \"..\", \"..\", \".crucible\", \"metadata\", \"metadata.yaml\");\n const metadataContent = await readFile(metadataPath, \"utf-8\");\n\n // Parse YAML properly to avoid brittle regex matching\n const metadata = parseYAML(metadataContent) as {\n sources?: Array<{\n name?: string;\n version?: string;\n commit?: string;\n }>;\n };\n\n // Extract Crucible source metadata (first source is typically 'crucible')\n const crucibleSource = metadata.sources?.[0];\n const crucibleVersion = crucibleSource?.version || \"unknown\";\n const revision = crucibleSource?.commit;\n\n // Read library version from package.json\n const pkgPath = join(__dirname, \"..\", \"..\", \"package.json\");\n const pkgContent = await readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent) as { version: string };\n\n return {\n schema_id: schemaId,\n crucible_version: crucibleVersion,\n library_version: pkg.version,\n revision: revision,\n exported_at: new Date().toISOString(),\n export_source: \"tsfulmen\",\n };\n } catch (error) {\n throw SchemaExportError.provenanceFailed((error as Error).message, error as Error);\n }\n}\n\n/**\n * Embed provenance metadata in schema content\n */\nfunction embedProvenance(\n schemaContent: Record<string, unknown>,\n provenance: SchemaProvenanceMetadata,\n format: SchemaExportFormat,\n): string {\n if (format === \"json\") {\n // For JSON: embed under $comment[\"x-crucible-source\"]\n const withProvenance = {\n ...schemaContent,\n $comment: {\n ...(typeof schemaContent.$comment === \"object\" ? schemaContent.$comment : {}),\n \"x-crucible-source\": provenance,\n },\n };\n return JSON.stringify(withProvenance, null, 2);\n }\n\n // For YAML: prepend comment block\n const yamlContent = stringifyYAML(schemaContent, {\n indent: 2,\n lineWidth: 0,\n });\n\n const provenanceComment = [\n \"# x-crucible-source:\",\n `# schema_id: ${provenance.schema_id}`,\n `# crucible_version: ${provenance.crucible_version}`,\n `# library_version: ${provenance.library_version}`,\n ...(provenance.revision ? [`# revision: ${provenance.revision}`] : []),\n `# exported_at: ${provenance.exported_at}`,\n `# export_source: ${provenance.export_source}`,\n \"\",\n ].join(\"\\n\");\n\n return provenanceComment + yamlContent;\n}\n\n/**\n * Detect export format from file extension or explicit option\n */\nfunction detectFormat(outPath: string, formatOption?: SchemaExportFormat): SchemaExportFormat {\n if (formatOption && formatOption !== \"auto\") {\n return formatOption;\n }\n\n const ext = extname(outPath).toLowerCase();\n switch (ext) {\n case \".json\":\n return \"json\";\n case \".yaml\":\n case \".yml\":\n return \"yaml\";\n default:\n throw SchemaExportError.invalidFormat(ext, outPath);\n }\n}\n\n/**\n * Export schema from registry to file with provenance\n *\n * @param options - Export options\n * @returns Export result with metadata\n *\n * @throws {SchemaExportError} If export fails\n * @throws {SchemaValidationError} If schema not found or validation fails\n *\n * @example\n * ```typescript\n * import { exportSchema } from '@fulmenhq/tsfulmen/schema';\n *\n * await exportSchema({\n * schemaId: 'library/foundry/v1.0.0/exit-codes',\n * outPath: './schemas/exit-codes.schema.json',\n * includeProvenance: true,\n * validate: true,\n * });\n * ```\n */\nexport async function exportSchema(options: ExportSchemaOptions): Promise<ExportSchemaResult> {\n const {\n schemaId,\n outPath,\n includeProvenance = true,\n validate = true,\n overwrite = false,\n format: formatOption,\n baseDir,\n } = options;\n\n // Detect output format\n const format = detectFormat(outPath, formatOption);\n\n // Check if file exists\n if (!overwrite) {\n try {\n await access(outPath);\n throw SchemaExportError.fileExists(outPath);\n } catch (error) {\n // File doesn't exist - proceed\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n // Get schema from registry\n const registry = getSchemaRegistry({ baseDir });\n const schema = await registry.getSchema(schemaId);\n\n // Read schema content\n const schemaContent = await readFile(schema.path, \"utf-8\");\n\n // Validate if requested\n if (validate) {\n const validationResult = await validateSchema(schemaContent);\n if (!validationResult.valid) {\n throw SchemaValidationError.validationFailed(schemaId, validationResult.diagnostics, {\n type: \"file\",\n id: schema.path,\n });\n }\n }\n\n // Parse schema content\n let schemaObject: Record<string, unknown>;\n try {\n schemaObject = JSON.parse(schemaContent) as Record<string, unknown>;\n } catch {\n schemaObject = parseYAML(schemaContent) as Record<string, unknown>;\n }\n\n // Freeze schema object to prevent mutation\n Object.freeze(schemaObject);\n\n let provenance: SchemaProvenanceMetadata | undefined;\n let outputContent: string;\n\n if (includeProvenance) {\n // Extract provenance metadata\n provenance = await extractProvenanceMetadata(schemaId);\n\n // Embed provenance in output\n outputContent = embedProvenance(schemaObject, provenance, format);\n } else {\n // Export without provenance\n if (format === \"json\") {\n outputContent = JSON.stringify(schemaObject, null, 2);\n } else {\n outputContent = stringifyYAML(schemaObject, { indent: 2, lineWidth: 0 });\n }\n }\n\n // Ensure output directory exists\n await mkdir(dirname(outPath), { recursive: true });\n\n // Write to file\n try {\n await writeFile(outPath, outputContent, \"utf-8\");\n } catch (error) {\n throw SchemaExportError.writeFailed(outPath, error as Error);\n }\n\n return {\n success: true,\n schemaId,\n outPath,\n format,\n includeProvenance,\n provenance,\n };\n}\n\n/**\n * Strip provenance metadata from schema content\n *\n * This helper is useful for comparing exported schemas with runtime\n * schemas or validating that provenance doesn't affect schema semantics.\n *\n * @param content - Schema content (JSON or YAML string)\n * @returns Schema content without provenance metadata\n *\n * @example\n * ```typescript\n * import { stripProvenance } from '@fulmenhq/tsfulmen/schema';\n *\n * const exported = await readFile('./schema.json', 'utf-8');\n * const withoutProvenance = stripProvenance(exported);\n * ```\n */\nexport function stripProvenance(content: string): string {\n try {\n // Try parsing as JSON\n const parsed = JSON.parse(content) as Record<string, unknown>;\n\n // Remove provenance from $comment\n if (parsed.$comment && typeof parsed.$comment === \"object\") {\n const comment = { ...parsed.$comment } as Record<string, unknown>;\n delete comment[\"x-crucible-source\"];\n\n // Remove $comment entirely if it's now empty\n if (Object.keys(comment).length === 0) {\n delete parsed.$comment;\n } else {\n parsed.$comment = comment;\n }\n }\n\n return JSON.stringify(parsed, null, 2);\n } catch {\n // YAML format - strip comment lines\n const lines = content.split(\"\\n\");\n const filtered = lines.filter((line) => {\n const trimmed = line.trim();\n return !(\n trimmed.startsWith(\"# x-crucible-source:\") ||\n (trimmed.startsWith(\"# \") &&\n /^#\\s+(schema_id|crucible_version|library_version|revision|exported_at|export_source):/.test(\n trimmed,\n ))\n );\n });\n\n // Remove leading blank lines\n while (filtered.length > 0 && filtered[0]?.trim() === \"\") {\n filtered.shift();\n }\n\n return filtered.join(\"\\n\");\n }\n}\n","/**\n * Schema validation module - implements Fulmen Schema Validation Standard\n *\n * Provides schema discovery, validation, and normalization utilities for Crucible schemas\n * with JSON Schema 2020-12 support and optional goneat integration.\n */\n\nexport const VERSION = \"0.1.0\";\n\nexport {\n applyFulmenAjvFormats,\n type FulmenAjvFormatsOptions,\n} from \"./ajv-formats.js\";\n\n// CLI exports\nexport { createCLI } from \"./cli.js\";\n// Error exports\nexport * from \"./errors.js\";\n// Export exports\nexport { exportSchema, stripProvenance } from \"./export.js\";\n// Goneat bridge exports (CLI-only, optional)\nexport {\n detectGoneat,\n isGoneatAvailable,\n runGoneatValidation,\n} from \"./goneat-bridge.js\";\n// Normalizer exports\nexport { compareSchemas, normalizeSchema } from \"./normalizer.js\";\n// Registry exports\nexport {\n getSchema,\n getSchemaByPath,\n getSchemaRegistry,\n hasSchema,\n listSchemas,\n SchemaRegistry,\n} from \"./registry.js\";\n// Core exports\nexport type {\n AjvError,\n CLIOptions,\n CompiledValidator,\n ExportSchemaOptions,\n ExportSchemaResult,\n SchemaComparisonResult,\n SchemaExportFormat,\n SchemaFormat,\n SchemaInput,\n SchemaMetadata,\n SchemaNormalizationOptions,\n SchemaProvenanceMetadata,\n SchemaRegistryOptions,\n SchemaSource,\n SchemaValidationDiagnostic,\n SchemaValidationOptions,\n SchemaValidationResult,\n} from \"./types.js\";\n// Utility exports\nexport {\n countDiagnostics,\n createDiagnostic,\n formatDiagnostics,\n formatValidationResult,\n groupDiagnosticsBySeverity,\n isValidationError,\n normalizePointer,\n} from \"./utils.js\";\n// Validator exports\nexport {\n clearCache,\n compileSchema,\n compileSchemaById,\n getCacheSize,\n validateData,\n validateDataBySchemaId,\n validateFile,\n validateFileBySchemaId,\n validateSchema,\n} from \"./validator.js\";\n","/**\n * Correlation ID generation and validation for error tracking\n *\n * Provides UUID v4 generation for correlation IDs used in observability\n * and distributed tracing scenarios.\n */\n\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * UUID v4 regex pattern for validation\n */\nconst UUID_V4_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Generate a new correlation ID (UUID v4)\n *\n * Uses Node.js crypto.randomUUID() for cryptographically strong random values.\n *\n * @returns UUID v4 string (e.g., \"550e8400-e29b-41d4-a716-446655440000\")\n *\n * @example\n * ```typescript\n * const correlationId = generateCorrelationId();\n * // \"550e8400-e29b-41d4-a716-446655440000\"\n * ```\n */\nexport function generateCorrelationId(): string {\n return randomUUID();\n}\n\n/**\n * Validate if a string is a valid UUID v4 correlation ID\n *\n * Checks format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\n * where y is one of [8, 9, a, b]\n *\n * @param id - String to validate\n * @returns True if valid UUID v4 format\n *\n * @example\n * ```typescript\n * isValidCorrelationId('550e8400-e29b-41d4-a716-446655440000') // true\n * isValidCorrelationId('not-a-uuid') // false\n * isValidCorrelationId('550e8400-e29b-31d4-a716-446655440000') // false (version 3, not 4)\n * ```\n */\nexport function isValidCorrelationId(id: string): boolean {\n return UUID_V4_PATTERN.test(id);\n}\n\n/**\n * Normalize a correlation ID (lowercase, trim whitespace)\n *\n * @param id - Correlation ID to normalize\n * @returns Normalized correlation ID\n *\n * @example\n * ```typescript\n * normalizeCorrelationId(' 550E8400-E29B-41D4-A716-446655440000 ')\n * // \"550e8400-e29b-41d4-a716-446655440000\"\n * ```\n */\nexport function normalizeCorrelationId(id: string): string {\n return id.trim().toLowerCase();\n}\n\n/**\n * Type guard to check if a value is a valid correlation ID\n *\n * @param value - Value to check\n * @returns True if value is a string and valid UUID v4\n *\n * @example\n * ```typescript\n * if (isCorrelationId(value)) {\n * // TypeScript knows value is string here\n * const normalized = normalizeCorrelationId(value);\n * }\n * ```\n */\nexport function isCorrelationId(value: unknown): value is string {\n return typeof value === \"string\" && isValidCorrelationId(value);\n}\n","/**\n * Severity mappings for error handling\n *\n * Implements severity levels from assessment/v1.0.0/severity-definitions schema\n * Provides bidirectional mapping between severity names and numeric levels\n */\n\n/**\n * Severity names aligned with assessment taxonomy\n */\nexport const Severity = {\n INFO: \"info\",\n LOW: \"low\",\n MEDIUM: \"medium\",\n HIGH: \"high\",\n CRITICAL: \"critical\",\n} as const;\n\n/**\n * Severity name type (string literal union)\n */\nexport type SeverityName = (typeof Severity)[keyof typeof Severity];\n\n/**\n * Numeric severity level for sorting and comparison\n * info=0, low=1, medium=2, high=3, critical=4\n */\nexport type SeverityLevel = 0 | 1 | 2 | 3 | 4;\n\n/**\n * Canonical severity level mapping (name → level)\n * Aligned with schemas/crucible-ts/assessment/v1.0.0/severity-definitions.schema.json\n */\nexport const SEVERITY_LEVELS: Record<SeverityName, SeverityLevel> = {\n info: 0,\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\n\n/**\n * Reverse mapping (level → name)\n */\nexport const LEVEL_TO_SEVERITY: Record<SeverityLevel, SeverityName> = {\n 0: \"info\",\n 1: \"low\",\n 2: \"medium\",\n 3: \"high\",\n 4: \"critical\",\n};\n\n/**\n * Convert severity name to numeric level\n *\n * @param name - Severity name (info, low, medium, high, critical)\n * @returns Numeric severity level (0-4)\n * @throws {Error} If severity name is invalid\n *\n * @example\n * ```typescript\n * severityToLevel('high') // returns 3\n * severityToLevel('info') // returns 0\n * ```\n */\nexport function severityToLevel(name: string): SeverityLevel {\n if (!isSeverityName(name)) {\n throw new Error(\n `Invalid severity name: \"${name}\". Must be one of: ${Object.values(Severity).join(\", \")}`,\n );\n }\n return SEVERITY_LEVELS[name];\n}\n\n/**\n * Convert numeric level to severity name\n *\n * @param level - Numeric severity level (0-4)\n * @returns Severity name\n * @throws {Error} If level is invalid\n *\n * @example\n * ```typescript\n * levelToSeverity(3) // returns 'high'\n * levelToSeverity(0) // returns 'info'\n * ```\n */\nexport function levelToSeverity(level: number): SeverityName {\n if (!isSeverityLevel(level)) {\n throw new Error(`Invalid severity level: ${level}. Must be 0-4`);\n }\n return LEVEL_TO_SEVERITY[level];\n}\n\n/**\n * Type guard to check if a value is a valid severity name\n *\n * @param value - Value to check\n * @returns True if value is a valid SeverityName\n *\n * @example\n * ```typescript\n * if (isSeverityName(value)) {\n * const level = severityToLevel(value); // Type-safe\n * }\n * ```\n */\nexport function isSeverityName(value: unknown): value is SeverityName {\n return typeof value === \"string\" && Object.values(Severity).includes(value as SeverityName);\n}\n\n/**\n * Type guard to check if a value is a valid severity level\n *\n * @param value - Value to check\n * @returns True if value is a valid SeverityLevel\n *\n * @example\n * ```typescript\n * if (isSeverityLevel(value)) {\n * const name = levelToSeverity(value); // Type-safe\n * }\n * ```\n */\nexport function isSeverityLevel(value: unknown): value is SeverityLevel {\n return typeof value === \"number\" && value >= 0 && value <= 4 && Number.isInteger(value);\n}\n\n/**\n * Get default severity (medium/2) when not specified\n *\n * @returns Default severity name and level\n */\nexport function getDefaultSeverity(): {\n name: SeverityName;\n level: SeverityLevel;\n} {\n return {\n name: Severity.MEDIUM,\n level: 2,\n };\n}\n\n/**\n * Compare two severity levels\n *\n * @param a - First severity (name or level)\n * @param b - Second severity (name or level)\n * @returns Negative if a < b, positive if a > b, zero if equal\n *\n * @example\n * ```typescript\n * compareSeverity('high', 'low') // returns positive (high > low)\n * compareSeverity(2, 'critical') // returns negative (medium < critical)\n * ```\n */\nexport function compareSeverity(\n a: SeverityName | SeverityLevel,\n b: SeverityName | SeverityLevel,\n): number {\n const levelA = typeof a === \"string\" ? severityToLevel(a) : a;\n const levelB = typeof b === \"string\" ? severityToLevel(b) : b;\n return levelA - levelB;\n}\n","/**\n * Error serialization utilities\n *\n * Provides safe serialization of Error objects and unknown errors to structured data\n */\n\nimport { Severity, type SeverityLevel, type SeverityName } from \"./severity.js\";\n\n/**\n * FulmenError data structure (for serialization)\n * Defined here to avoid circular dependency\n */\nexport interface FulmenErrorData {\n readonly code: string;\n readonly message: string;\n readonly details?: Record<string, unknown>;\n readonly path?: string;\n readonly timestamp?: string;\n readonly severity?: SeverityName;\n readonly severity_level?: SeverityLevel;\n readonly correlation_id?: string;\n readonly trace_id?: string;\n readonly exit_code?: number;\n readonly context?: Record<string, unknown>;\n readonly original?: string | object;\n}\n\n/**\n * Safely serialize any error-like value to FulmenErrorData structure\n *\n * Handles native Error objects, plain objects, strings, and unknown types.\n *\n * @param error - Error value to serialize\n * @param code - Optional error code (defaults to 'UNKNOWN_ERROR')\n * @param severity - Optional severity (defaults to 'medium')\n * @returns Structured error data\n *\n * @example\n * ```typescript\n * try {\n * throw new Error('Something failed');\n * } catch (err) {\n * const data = serializeError(err, 'OPERATION_FAILED', 'high');\n * console.log(JSON.stringify(data));\n * }\n * ```\n */\nexport function serializeError(\n error: unknown,\n code = \"UNKNOWN_ERROR\",\n severity: SeverityName = Severity.MEDIUM,\n): FulmenErrorData {\n // Handle Error instances\n if (error instanceof Error) {\n return {\n code,\n message: error.message,\n severity,\n timestamp: new Date().toISOString(),\n context: {\n name: error.name,\n stack: error.stack,\n },\n original: error.stack || error.message,\n };\n }\n\n // Handle plain objects with message\n if (isErrorLike(error)) {\n return {\n code,\n message: error.message,\n severity,\n timestamp: new Date().toISOString(),\n details: error.details,\n context: error.context,\n original: JSON.stringify(error),\n };\n }\n\n // Handle strings\n if (typeof error === \"string\") {\n return {\n code,\n message: error,\n severity,\n timestamp: new Date().toISOString(),\n };\n }\n\n // Handle everything else\n return {\n code,\n message: String(error),\n severity,\n timestamp: new Date().toISOString(),\n original: typeof error === \"object\" ? JSON.stringify(error) : String(error),\n };\n}\n\n/**\n * Extract error message from unknown error value\n *\n * @param error - Error value\n * @returns Error message string\n */\nexport function extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (isErrorLike(error)) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return String(error);\n}\n\n/**\n * Extract stack trace from error if available\n *\n * @param error - Error value\n * @returns Stack trace string or undefined\n */\nexport function extractStackTrace(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.stack;\n }\n if (isErrorLike(error) && typeof error.stack === \"string\") {\n return error.stack;\n }\n return undefined;\n}\n\n/**\n * Type guard for error-like objects\n */\nfunction isErrorLike(value: unknown): value is {\n message: string;\n stack?: string;\n details?: Record<string, unknown>;\n context?: Record<string, unknown>;\n} {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"message\" in value &&\n typeof (value as { message: unknown }).message === \"string\"\n );\n}\n","/**\n * Schema validation for FulmenError data\n *\n * Provides singleton validator that pre-compiles error-response schema\n * using existing src/schema infrastructure. Performance target: <1ms per validation.\n */\n\nimport { compileSchemaById } from \"../schema/index.js\";\nimport type { CompiledValidator } from \"../schema/types.js\";\n\n/**\n * Singleton validator for FulmenError data\n *\n * Pre-compiles the error-response schema at first access for optimal performance.\n * Reuses existing AJV setup from src/schema module.\n */\nclass ErrorValidator {\n private static instance: ErrorValidator;\n private validateFn: CompiledValidator | null = null;\n private initPromise: Promise<void> | null = null;\n private initError: Error | null = null;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get singleton instance\n */\n static getInstance(): ErrorValidator {\n if (!ErrorValidator.instance) {\n ErrorValidator.instance = new ErrorValidator();\n }\n return ErrorValidator.instance;\n }\n\n /**\n * Initialize validator (lazy load, async)\n */\n private async init(): Promise<void> {\n if (this.validateFn !== null || this.initError !== null) {\n return; // Already initialized\n }\n\n if (this.initPromise) {\n return this.initPromise; // Already initializing\n }\n\n this.initPromise = (async () => {\n try {\n // Ensure dependency schemas are registered before compiling error-response\n // Error handling schema references pathfinder error-response relatively.\n await compileSchemaById(\"pathfinder/v1.0.0/error-response\");\n await compileSchemaById(\"assessment/v1.0.0/severity-definitions\");\n\n // Compile schema using existing schema infrastructure\n // Schema ID for error-response extends pathfinder error-response\n this.validateFn = await compileSchemaById(\"error-handling/v1.0.0/error-response\");\n } catch (err) {\n this.initError = err instanceof Error ? err : new Error(String(err));\n throw new Error(`Failed to initialize error validator: ${this.initError.message}`);\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Validate error data against schema\n *\n * @param data - Data to validate\n * @returns Promise resolving to true if valid, false otherwise\n * @throws {Error} If validator failed to initialize\n */\n async validate(data: unknown): Promise<boolean> {\n if (this.validateFn === null) {\n await this.init();\n }\n\n if (this.initError) {\n throw this.initError;\n }\n\n if (!this.validateFn) {\n throw new Error(\"Validator not initialized\");\n }\n\n return this.validateFn(data);\n }\n\n /**\n * Get validation errors from last validation\n *\n * @returns Validation errors or null\n */\n getErrors() {\n if (!this.validateFn) {\n return null;\n }\n return this.validateFn.errors;\n }\n\n /**\n * Reset validator state (for testing)\n * @internal\n */\n static _reset(): void {\n ErrorValidator.instance = new ErrorValidator();\n }\n}\n\n/**\n * Validate FulmenError data against error-response schema\n *\n * Uses pre-compiled validator singleton for optimal performance (<1ms target).\n *\n * @param data - Error data to validate\n * @returns Promise resolving to true if valid, false otherwise\n *\n * @example\n * ```typescript\n * const data = {\n * code: 'CONFIG_INVALID',\n * message: 'Configuration validation failed'\n * };\n *\n * if (await validateErrorData(data)) {\n * // Data is schema-compliant\n * } else {\n * const errors = await getValidationErrors();\n * console.error('Validation failed:', errors);\n * }\n * ```\n */\nexport async function validateErrorData(data: unknown): Promise<boolean> {\n return ErrorValidator.getInstance().validate(data);\n}\n\n/**\n * Get validation errors from last validation\n *\n * @returns Validation errors or null\n *\n * @example\n * ```typescript\n * if (!(await validateErrorData(data))) {\n * const errors = getValidationErrors();\n * errors?.forEach(err => {\n * console.error(`${err.instancePath}: ${err.message}`);\n * });\n * }\n * ```\n */\nexport function getValidationErrors() {\n return ErrorValidator.getInstance().getErrors();\n}\n\n/**\n * Format validation errors as human-readable string\n *\n * @param errors - Validation error objects\n * @returns Formatted error message\n *\n * @example\n * ```typescript\n * const errors = getValidationErrors();\n * if (errors) {\n * throw new Error(formatValidationErrors(errors));\n * }\n * ```\n */\nexport function formatValidationErrors(\n errors: Array<{ instancePath?: string; message?: string }>,\n): string {\n return errors\n .map((err) => {\n const path = err.instancePath || \"(root)\";\n const message = err.message || \"validation failed\";\n return `${path}: ${message}`;\n })\n .join(\"; \");\n}\n\n/**\n * Validate and throw if invalid\n *\n * @param data - Error data to validate\n * @throws {Error} If validation fails\n *\n * @example\n * ```typescript\n * await assertValidErrorData(data); // Throws if invalid\n * // Safe to use data here\n * ```\n */\nexport async function assertValidErrorData(data: unknown): Promise<void> {\n if (!(await validateErrorData(data))) {\n const errors = getValidationErrors();\n const message = errors ? formatValidationErrors(errors) : \"Error data validation failed\";\n throw new Error(`Invalid error data: ${message}`);\n }\n}\n\n// Export for testing\nexport { ErrorValidator };\n","/**\n * FulmenError - Structured error data model for observability\n *\n * Implements ADR-0006 error data model extending Pathfinder error-response\n * with optional telemetry metadata (severity, correlation_id, trace_id, etc.)\n */\n\nimport { extractErrorMessage, extractStackTrace, type FulmenErrorData } from \"./serialization.js\";\nimport type { SeverityLevel, SeverityName } from \"./severity.js\";\nimport { getDefaultSeverity, SEVERITY_LEVELS, Severity } from \"./severity.js\";\nimport { validateErrorData } from \"./validators.js\";\n\n// Re-export FulmenErrorData from serialization\nexport type { FulmenErrorData } from \"./serialization.js\";\n\n/**\n * Options for creating/wrapping FulmenError\n */\nexport interface FulmenErrorOptions {\n code?: string;\n severity?: SeverityName;\n correlation_id?: string;\n trace_id?: string;\n exit_code?: number;\n context?: Record<string, unknown>;\n details?: Record<string, unknown>;\n path?: string;\n}\n\n/**\n * FulmenError class - wraps structured error data with helper methods\n *\n * Implements ADR-0006 canonical data model pattern:\n * - Data stored in immutable FulmenErrorData interface\n * - Class provides ergonomic API and methods\n * - Extends native Error for stack traces and instanceof checks\n */\nexport class FulmenError extends Error {\n readonly data: FulmenErrorData;\n\n constructor(data: FulmenErrorData) {\n super(data.message);\n this.name = \"FulmenError\";\n\n // Freeze data for immutability\n this.data = Object.freeze({ ...data });\n\n // Capture stack trace\n Error.captureStackTrace(this, FulmenError);\n }\n\n /**\n * Serialize to JSON (schema-compliant)\n */\n toJSON(): FulmenErrorData {\n return this.data;\n }\n\n /**\n * Check equality with another FulmenError\n */\n equals(other: FulmenError): boolean {\n return JSON.stringify(this.data) === JSON.stringify(other.data);\n }\n\n /**\n * Get severity level for comparison\n */\n getSeverityLevel(): SeverityLevel {\n return this.data.severity_level ?? SEVERITY_LEVELS[this.data.severity ?? \"medium\"];\n }\n\n /**\n * Wrap an existing error with FulmenError structure\n *\n * @param error - Error to wrap (Error instance or FulmenErrorData)\n * @param options - Additional error options\n * @returns New FulmenError instance\n *\n * @example\n * ```typescript\n * try {\n * throw new Error('Config invalid');\n * } catch (err) {\n * const fulmenErr = FulmenError.wrap(err, {\n * code: 'CONFIG_INVALID',\n * severity: 'high',\n * exit_code: 2\n * });\n * throw fulmenErr;\n * }\n * ```\n */\n static wrap(error: Error | FulmenErrorData, options: FulmenErrorOptions = {}): FulmenError {\n // If already FulmenError, merge options with recomputed derived fields\n if (error instanceof FulmenError) {\n // Determine effective severity (prefer options, fallback to existing, default to medium)\n const effectiveSeverity = options.severity ?? error.data.severity ?? Severity.MEDIUM;\n // CRITICAL: Recompute severity_level from severity to maintain consistency (ADR-0006)\n const effectiveSeverityLevel = SEVERITY_LEVELS[effectiveSeverity];\n\n // Update timestamp when re-wrapping (indicates new error context)\n const timestamp = new Date().toISOString();\n\n return new FulmenError({\n ...error.data,\n ...options,\n code: options.code ?? error.data.code,\n message: error.data.message,\n severity: effectiveSeverity, // Consistent severity\n severity_level: effectiveSeverityLevel, // Recomputed level\n timestamp, // Updated timestamp\n });\n }\n\n // If FulmenErrorData, recompute derived fields\n if (isFulmenErrorData(error)) {\n const defaultSeverity = getDefaultSeverity();\n // Prefer options.severity, fall back to error.severity, default to medium\n const effectiveSeverity = options.severity ?? error.severity ?? defaultSeverity.name;\n // CRITICAL: Always recompute severity_level from severity (never trust provided level)\n const effectiveSeverityLevel = SEVERITY_LEVELS[effectiveSeverity];\n\n return new FulmenError({\n ...error,\n ...options,\n severity: effectiveSeverity,\n severity_level: effectiveSeverityLevel, // Recomputed, not from error.severity_level\n timestamp: error.timestamp ?? new Date().toISOString(),\n });\n }\n\n // Wrap native Error\n return FulmenError.fromError(error, options);\n }\n\n /**\n * Create FulmenError from native Error object\n *\n * @param err - Native Error instance\n * @param options - Error options\n * @returns New FulmenError instance\n *\n * @example\n * ```typescript\n * const err = new TypeError('Invalid type');\n * const fulmenErr = FulmenError.fromError(err, {\n * code: 'TYPE_ERROR',\n * severity: 'medium'\n * });\n * ```\n */\n static fromError(err: Error | unknown, options: FulmenErrorOptions = {}): FulmenError {\n const code = options.code ?? \"UNKNOWN_ERROR\";\n const severity = options.severity ?? Severity.MEDIUM;\n const severityLevel = SEVERITY_LEVELS[severity];\n\n const message = extractErrorMessage(err);\n const stack = extractStackTrace(err);\n\n const data: FulmenErrorData = {\n code,\n message,\n severity,\n severity_level: severityLevel,\n timestamp: new Date().toISOString(),\n ...options,\n context: {\n ...options.context,\n originalName: err instanceof Error ? err.name : typeof err,\n stack,\n },\n original: stack || message,\n };\n\n return new FulmenError(data);\n }\n\n /**\n * Validate error data against schema\n *\n * @param data - Error data to validate\n * @returns Promise resolving to true if valid\n *\n * @example\n * ```typescript\n * const data = { code: 'TEST', message: 'Test error' };\n * if (await FulmenError.validate(data)) {\n * const err = new FulmenError(data);\n * }\n * ```\n */\n static async validate(data: unknown): Promise<boolean> {\n return validateErrorData(data);\n }\n\n /**\n * Exit process with structured error\n *\n * Logs error as JSON and exits with specified exit code.\n * Mockable for testing (override process.exit).\n *\n * @param error - FulmenError instance\n * @param options - Exit options\n *\n * @example\n * ```typescript\n * const err = FulmenError.fromError(new Error('Fatal'), {\n * code: 'FATAL_ERROR',\n * exit_code: 1\n * });\n * FulmenError.exitWithError(err); // Exits with code 1\n * ```\n */\n static exitWithError(\n error: FulmenError,\n options: { logger?: (msg: string) => void } = {},\n ): never {\n const logger = options.logger ?? console.error;\n const exitCode = error.data.exit_code ?? 1;\n\n // Log structured error\n logger(JSON.stringify(error.toJSON(), null, 2));\n\n // Exit with code\n process.exit(exitCode);\n }\n}\n\n/**\n * Type guard to check if value is FulmenError instance\n *\n * @param value - Value to check\n * @returns True if value is FulmenError\n */\nexport function isFulmenError(value: unknown): value is FulmenError {\n return value instanceof FulmenError;\n}\n\n/**\n * Type guard to check if value is FulmenErrorData\n *\n * @param value - Value to check\n * @returns True if value is FulmenErrorData\n */\nexport function isFulmenErrorData(value: unknown): value is FulmenErrorData {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"code\" in value &&\n typeof (value as FulmenErrorData).code === \"string\" &&\n \"message\" in value &&\n typeof (value as FulmenErrorData).message === \"string\"\n );\n}\n","/**\n * Errors module - structured error handling with telemetry\n *\n * Provides FulmenError data model and utilities for schema-backed error responses\n * with optional telemetry metadata (severity, correlation IDs, exit codes).\n */\n\nexport const VERSION = \"0.2.0\";\n\n// Correlation ID utilities\nexport {\n generateCorrelationId,\n isCorrelationId,\n isValidCorrelationId,\n normalizeCorrelationId,\n} from \"./correlation.js\";\n// Core error class and types\nexport {\n FulmenError,\n type FulmenErrorData,\n type FulmenErrorOptions,\n isFulmenError,\n isFulmenErrorData,\n} from \"./fulmen-error.js\";\n// Serialization utilities\nexport {\n extractErrorMessage,\n extractStackTrace,\n serializeError,\n} from \"./serialization.js\";\n// Severity utilities\nexport {\n compareSeverity,\n getDefaultSeverity,\n isSeverityLevel,\n isSeverityName,\n LEVEL_TO_SEVERITY,\n levelToSeverity,\n SEVERITY_LEVELS,\n Severity,\n type SeverityLevel,\n type SeverityName,\n severityToLevel,\n} from \"./severity.js\";\n// Validation utilities\nexport {\n assertValidErrorData,\n formatValidationErrors,\n getValidationErrors,\n validateErrorData,\n} from \"./validators.js\";\n","/**\n * Application Identity Errors\n *\n * Module-specific error classes for identity operations\n */\n\nimport { FulmenError, type FulmenErrorData } from \"../errors/index.js\";\nimport type { SchemaValidationDiagnostic } from \"../schema/types.js\";\n\n/**\n * Base error class for app identity operations\n */\nexport class AppIdentityError extends FulmenError {\n public readonly identityPath?: string;\n\n constructor(message: string, identityPath?: string, cause?: Error) {\n // Build FulmenErrorData\n let errorData: FulmenErrorData;\n\n if (cause) {\n errorData = FulmenError.fromError(cause, {\n code: \"APP_IDENTITY_ERROR\",\n severity: \"high\",\n context: { identityPath },\n }).data;\n } else {\n errorData = {\n code: \"APP_IDENTITY_ERROR\",\n message,\n severity: \"high\",\n timestamp: new Date().toISOString(),\n context: { identityPath },\n };\n }\n\n super(errorData);\n this.name = \"AppIdentityError\";\n this.identityPath = identityPath;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AppIdentityError);\n }\n }\n\n /**\n * Create error for identity not found\n */\n static notFound(searchedPaths: string[]): AppIdentityError {\n const message = `App identity not found\\nSearched paths:\\n${searchedPaths.map((p) => ` - ${p}`).join(\"\\n\")}`;\n return new AppIdentityError(message);\n }\n\n /**\n * Create error for schema validation failure\n */\n static validationFailed(\n path: string,\n diagnostics: SchemaValidationDiagnostic[],\n ): AppIdentityError {\n const errorCount = diagnostics.filter((d) => d.severity === \"ERROR\").length;\n const warningCount = diagnostics.filter((d) => d.severity === \"WARN\").length;\n\n let message = `Invalid app identity: ${path}\\n`;\n message += `Validation errors: ${errorCount} error(s), ${warningCount} warning(s)\\n`;\n\n // Include first few diagnostics\n const displayDiagnostics = diagnostics.slice(0, 3);\n for (const diag of displayDiagnostics) {\n message += ` - ${diag.message}`;\n if (diag.pointer) {\n message += ` at ${diag.pointer}`;\n }\n message += \"\\n\";\n }\n\n if (diagnostics.length > 3) {\n message += ` ... and ${diagnostics.length - 3} more\\n`;\n }\n\n return new AppIdentityError(message, path);\n }\n\n /**\n * Create error for environment variable override pointing to missing file\n */\n static envOverrideMissing(envPath: string): AppIdentityError {\n const message = `FULMEN_APP_IDENTITY_PATH points to missing file: ${envPath}\\n`;\n return new AppIdentityError(message, envPath);\n }\n\n /**\n * Create error for YAML parsing failure\n */\n static parseFailed(path: string, cause: Error): AppIdentityError {\n const message = `Failed to parse identity file: ${path}\\n${cause.message}`;\n return new AppIdentityError(message, path, cause);\n }\n\n /**\n * Create error for file read failure\n */\n static readFailed(path: string, cause: Error): AppIdentityError {\n const message = `Failed to read identity file: ${path}\\n${cause.message}`;\n return new AppIdentityError(message, path, cause);\n }\n\n /**\n * Create error for embedded identity already registered\n *\n * Uses first-wins semantics - once registered, cannot be replaced\n */\n static alreadyRegistered(): AppIdentityError {\n const message =\n \"Embedded identity already registered. \" +\n \"Registration uses first-wins semantics and cannot be replaced.\";\n return new AppIdentityError(message);\n }\n\n /**\n * Create error for embedded identity YAML parsing failure\n */\n static embeddedParseFailed(cause: Error): AppIdentityError {\n const message = `Failed to parse embedded identity YAML: ${cause.message}`;\n return new AppIdentityError(message, undefined, cause);\n }\n\n /**\n * Create error for embedded identity schema validation failure\n */\n static embeddedValidationFailed(diagnostics: SchemaValidationDiagnostic[]): AppIdentityError {\n const errorCount = diagnostics.filter((d) => d.severity === \"ERROR\").length;\n const warningCount = diagnostics.filter((d) => d.severity === \"WARN\").length;\n\n let message = \"Invalid embedded identity\\n\";\n message += `Validation errors: ${errorCount} error(s), ${warningCount} warning(s)\\n`;\n\n const displayDiagnostics = diagnostics.slice(0, 3);\n for (const diag of displayDiagnostics) {\n message += ` - ${diag.message}`;\n if (diag.pointer) {\n message += ` at ${diag.pointer}`;\n }\n message += \"\\n\";\n }\n\n if (diagnostics.length > 3) {\n message += ` ... and ${diagnostics.length - 3} more\\n`;\n }\n\n return new AppIdentityError(message);\n }\n}\n","/**\n * Embedded Identity Registration\n *\n * Provides a mechanism to register embedded identity at application startup\n * for standalone binary/package support. This allows applications to work\n * without requiring .fulmen/app.yaml to be discoverable on the filesystem.\n *\n * Discovery precedence (with embedded fallback):\n * 1. Explicit path parameter\n * 2. FULMEN_APP_IDENTITY_PATH environment variable\n * 3. Ancestor search from CWD\n * 4. Embedded identity fallback (this module)\n */\n\nimport { parse as parseYAML } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/index.js\";\nimport { APP_IDENTITY_SCHEMA_ID } from \"./constants.js\";\nimport { AppIdentityError } from \"./errors.js\";\nimport type { Identity } from \"./types.js\";\n\n/**\n * Process-level storage for embedded identity\n * Uses first-wins semantics - once registered, cannot be replaced\n */\nlet embeddedIdentity: Identity | null = null;\nlet isRegistered = false;\n\n/**\n * Deep freeze an object and all its nested properties\n */\nfunction deepFreeze<T>(obj: T): T {\n Object.freeze(obj);\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n // biome-ignore lint/suspicious/noExplicitAny: Required for recursive property access\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreeze(value);\n }\n });\n return obj;\n}\n\n/**\n * Register embedded identity YAML that serves as fallback when\n * runtime discovery cannot find an external app.yaml.\n *\n * Semantics:\n * - First registration wins (subsequent calls throw error)\n * - Validates against schema on registration\n * - Stores as immutable process-level fallback\n *\n * @param data - YAML string or pre-parsed Identity object\n * @throws {AppIdentityError} If already registered or validation fails\n *\n * @example\n * ```typescript\n * // From npm package entry point\n * import { registerEmbeddedIdentity } from \"@fulmenhq/tsfulmen/appidentity\";\n * import { readFileSync } from \"node:fs\";\n * import { fileURLToPath } from \"node:url\";\n * import { dirname, join } from \"node:path\";\n *\n * const __filename = fileURLToPath(import.meta.url);\n * const __dirname = dirname(__filename);\n * const embeddedPath = join(__dirname, \"..\", \".fulmen\", \"app.yaml\");\n *\n * try {\n * const yaml = readFileSync(embeddedPath, \"utf-8\");\n * registerEmbeddedIdentity(yaml);\n * } catch {\n * // Embedded identity not available - discovery will use filesystem\n * }\n * ```\n */\nexport async function registerEmbeddedIdentity(data: string | Identity): Promise<void> {\n // First-wins semantics\n if (isRegistered) {\n throw AppIdentityError.alreadyRegistered();\n }\n\n let identity: Identity;\n\n if (typeof data === \"string\") {\n // Parse YAML\n let parsed: unknown;\n try {\n parsed = parseYAML(data);\n } catch (error) {\n throw AppIdentityError.embeddedParseFailed(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Validate against schema\n const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\n\n identity = parsed as Identity;\n } else {\n // Pre-parsed object - still validate\n const result = await validateDataBySchemaId(data, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\n identity = data;\n }\n\n // Deep freeze and store\n embeddedIdentity = deepFreeze(structuredClone(identity)) as Identity;\n isRegistered = true;\n}\n\n/**\n * Check if embedded identity has been registered\n *\n * @returns true if registerEmbeddedIdentity() has been called successfully\n */\nexport function hasEmbeddedIdentity(): boolean {\n return isRegistered;\n}\n\n/**\n * Get the registered embedded identity\n *\n * @returns Frozen identity object or null if not registered\n */\nexport function getEmbeddedIdentity(): Identity | null {\n return embeddedIdentity;\n}\n\n/**\n * Clear embedded identity registration\n *\n * WARNING: For testing only. In production, embedded identity should be\n * set once at startup and never cleared.\n */\nexport function clearEmbeddedIdentity(): void {\n embeddedIdentity = null;\n isRegistered = false;\n}\n","/**\n * Application Identity Cache\n *\n * Process-level caching for identity objects with immutability guarantees\n */\n\nimport type { Identity } from \"./types.js\";\n\n/**\n * Process-level cache storage\n * null = not cached, Identity = cached value\n */\nlet cachedIdentity: Identity | null = null;\n\n/**\n * Get cached identity if available\n *\n * @returns Cached identity or null if not cached\n */\nexport function getCachedIdentity(): Identity | null {\n return cachedIdentity;\n}\n\n/**\n * Set cached identity\n *\n * Identity object should already be frozen before caching\n *\n * @param identity - Identity to cache (must be frozen)\n */\nexport function setCachedIdentity(identity: Identity): void {\n cachedIdentity = identity;\n}\n\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport function clearIdentityCache(): void {\n cachedIdentity = null;\n}\n","/**\n * Application Identity Discovery\n *\n * Implements the Crucible discovery precedence algorithm:\n * 1. Explicit path parameter (highest priority)\n * 2. Environment variable override (FULMEN_APP_IDENTITY_PATH)\n * 3. Ancestor search from CWD upward\n */\n\nimport { access } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n APP_IDENTITY_DIR,\n APP_IDENTITY_ENV_VAR,\n APP_IDENTITY_FILENAME,\n MAX_ANCESTOR_SEARCH_DEPTH,\n} from \"./constants.js\";\nimport { AppIdentityError } from \"./errors.js\";\n\n/**\n * Discovery result with path and source\n */\nexport interface DiscoveryResult {\n readonly path: string;\n readonly source: \"explicit\" | \"env\" | \"ancestor\" | \"test\";\n}\n\n/**\n * Options for identity discovery\n */\nexport interface DiscoveryOptions {\n /**\n * Explicit path override (highest priority)\n */\n readonly path?: string;\n\n /**\n * Starting directory for ancestor search\n * Defaults to process.cwd()\n */\n readonly startDir?: string;\n}\n\n/**\n * Discover application identity file using Crucible precedence algorithm\n *\n * Discovery order:\n * 1. Explicit path parameter (throws if not found)\n * 2. FULMEN_APP_IDENTITY_PATH env var (throws if set but not found)\n * 3. Ancestor search from startDir (throws if not found after max depth)\n *\n * @param options - Discovery options\n * @returns Discovery result with path and source\n * @throws {AppIdentityError} If identity file not found or inaccessible\n */\nexport async function discoverIdentityPath(\n options?: DiscoveryOptions,\n): Promise<DiscoveryResult | null> {\n // 1. Explicit path parameter (highest priority)\n if (options?.path) {\n const exists = await fileExists(options.path);\n if (!exists) {\n throw AppIdentityError.notFound([options.path]);\n }\n return { path: options.path, source: \"explicit\" };\n }\n\n // 2. Environment variable override\n const envPath = process.env[APP_IDENTITY_ENV_VAR];\n if (envPath) {\n const exists = await fileExists(envPath);\n if (!exists) {\n throw AppIdentityError.envOverrideMissing(envPath);\n }\n return { path: envPath, source: \"env\" };\n }\n\n // 3. Ancestor search from startDir\n const startDir = options?.startDir || process.cwd();\n const result = await searchAncestors(startDir);\n if (result) {\n return { path: result, source: \"ancestor\" };\n }\n\n return null;\n}\n\n/**\n * Search ancestor directories for identity file\n *\n * Walks upward from startDir to filesystem root, looking for .fulmen/app.yaml\n * Stops at MAX_ANCESTOR_SEARCH_DEPTH or filesystem root\n *\n * @param startDir - Directory to start search from\n * @returns Path to identity file if found, null otherwise\n * @throws {AppIdentityError} If max depth reached or filesystem root reached without finding file\n */\nasync function searchAncestors(startDir: string): Promise<string | null> {\n let currentDir = startDir;\n const searchedPaths: string[] = [];\n\n for (let i = 0; i < MAX_ANCESTOR_SEARCH_DEPTH; i++) {\n const candidatePath = join(currentDir, APP_IDENTITY_DIR, APP_IDENTITY_FILENAME);\n searchedPaths.push(candidatePath);\n\n if (await fileExists(candidatePath)) {\n return candidatePath;\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n // Reached filesystem root\n throw AppIdentityError.notFound(searchedPaths);\n }\n currentDir = parentDir;\n }\n\n // Max depth reached\n throw AppIdentityError.notFound(searchedPaths);\n}\n\n/**\n * Check if a file exists and is accessible\n *\n * @param path - Path to check\n * @returns true if file exists and is readable, false otherwise\n */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Application Identity Loader\n *\n * Main loading logic with YAML parsing, schema validation, and caching\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { parse as parseYAML } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/index.js\";\nimport { clearIdentityCache, getCachedIdentity, setCachedIdentity } from \"./cache.js\";\nimport { APP_IDENTITY_ENV_VAR, APP_IDENTITY_SCHEMA_ID } from \"./constants.js\";\nimport { discoverIdentityPath } from \"./discovery.js\";\nimport { getEmbeddedIdentity } from \"./embedded.js\";\nimport { AppIdentityError } from \"./errors.js\";\nimport type { Identity, LoadIdentityOptions } from \"./types.js\";\n\n/**\n * Deep freeze an object and all its nested properties\n *\n * Recursively freezes an object and all nested objects/functions to ensure\n * complete immutability. This prevents accidental mutations of identity data.\n *\n * Note: Uses `any` type assertion (line 28) to access arbitrary properties\n * during recursive traversal. This is necessary because TypeScript's generic\n * constraint system cannot express \"any object with indexable properties\"\n * without losing the return type safety. The `any` is scoped to a single\n * line and protected by runtime guards.\n *\n * @param obj - Object to freeze\n * @returns Frozen object (same type as input)\n */\nfunction deepFreeze<T>(obj: T): T {\n // Freeze the object itself\n Object.freeze(obj);\n\n // Recursively freeze all properties\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n // biome-ignore lint/suspicious/noExplicitAny: Required for recursive property access - see function docs\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreeze(value);\n }\n });\n\n return obj;\n}\n\n/**\n * Load application identity from .fulmen/app.yaml\n *\n * Discovery order:\n * 1. Test injection (options.identity) - bypasses all discovery and caching\n * 2. Explicit path (options.path)\n * 3. Environment variable (FULMEN_APP_IDENTITY_PATH)\n * 4. Ancestor search from startDir or CWD\n * 5. Embedded identity fallback (if registered via registerEmbeddedIdentity)\n *\n * Results are cached after first successful load unless skipCache is true.\n * Test injections are never cached.\n *\n * @param options - Load options\n * @returns Frozen, immutable identity object\n * @throws {AppIdentityError} If identity not found, invalid, or unreadable\n */\nexport async function loadIdentity(options?: LoadIdentityOptions): Promise<Identity> {\n // Test injection (never caches)\n if (options?.identity) {\n return deepFreeze(structuredClone(options.identity)) as Identity;\n }\n\n // Check cache unless skipCache\n if (!options?.skipCache) {\n const cached = getCachedIdentity();\n if (cached) {\n return cached;\n }\n }\n\n // Discover file - may throw AppIdentityError.notFound or return null\n let discovery: Awaited<ReturnType<typeof discoverIdentityPath>>;\n try {\n discovery = await discoverIdentityPath({\n path: options?.path,\n startDir: options?.startDir,\n });\n } catch (error) {\n // Discovery failed (e.g., reached filesystem root without finding identity)\n // Embedded fallback MUST NOT override explicit path or env override semantics.\n const hasExplicitPath = Boolean(options?.path);\n const hasEnvOverride = Boolean(process.env[APP_IDENTITY_ENV_VAR]);\n\n if (!hasExplicitPath && !hasEnvOverride && error instanceof AppIdentityError) {\n const embedded = getEmbeddedIdentity();\n if (embedded) {\n // Cache the embedded identity for subsequent calls\n setCachedIdentity(embedded);\n return embedded;\n }\n }\n\n throw error;\n }\n\n // If discovery returned null (no env var, no explicit path, and ancestor search returned null)\n if (!discovery) {\n const embedded = getEmbeddedIdentity();\n if (embedded) {\n // Cache the embedded identity for subsequent calls\n setCachedIdentity(embedded);\n return embedded;\n }\n throw AppIdentityError.notFound([]);\n }\n\n // Read file\n let content: string;\n try {\n content = await readFile(discovery.path, \"utf-8\");\n } catch (error) {\n throw AppIdentityError.readFailed(\n discovery.path,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Parse YAML\n let parsed: unknown;\n try {\n parsed = parseYAML(content);\n } catch (error) {\n throw AppIdentityError.parseFailed(\n discovery.path,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Validate against schema (unless skipValidation)\n if (!options?.skipValidation) {\n const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);\n\n if (!result.valid) {\n throw AppIdentityError.validationFailed(discovery.path, result.diagnostics);\n }\n }\n\n // Deep freeze for immutability\n const identity = deepFreeze(structuredClone(parsed)) as Identity;\n\n // Cache result\n setCachedIdentity(identity);\n\n return identity;\n}\n\n/**\n * Get cached identity without triggering load\n *\n * @returns Cached identity or null if not cached\n */\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport { clearIdentityCache, getCachedIdentity };\n","import type { Identity } from \"./types.js\";\n\nexport type RuntimeName = \"bun\" | \"node\" | \"unknown\";\n\nexport interface RuntimeInfo {\n service: {\n name: string;\n vendor?: string;\n version?: string;\n };\n runtime: {\n name: RuntimeName;\n version?: string;\n };\n platform: {\n os: NodeJS.Platform;\n arch: string;\n };\n}\n\nexport interface BuildRuntimeInfoOptions {\n identity?: Identity;\n version?: string;\n serviceName?: string;\n vendor?: string;\n}\n\nfunction detectRuntime(): { name: RuntimeName; version?: string } {\n const versions = process.versions as unknown as Record<string, string | undefined>;\n\n if (typeof versions.bun === \"string\" && versions.bun.length > 0) {\n return { name: \"bun\", version: versions.bun };\n }\n\n if (typeof versions.node === \"string\" && versions.node.length > 0) {\n return { name: \"node\", version: versions.node };\n }\n\n return { name: \"unknown\" };\n}\n\n/**\n * Build a minimal runtime info payload suitable for discovery endpoints.\n */\nexport function buildRuntimeInfo(options: BuildRuntimeInfoOptions = {}): RuntimeInfo {\n const runtime = detectRuntime();\n\n const serviceName = options.serviceName ?? options.identity?.app.binary_name ?? \"unknown-service\";\n const vendor = options.vendor ?? options.identity?.app.vendor;\n\n return {\n service: {\n name: serviceName,\n vendor,\n version: options.version,\n },\n runtime,\n platform: {\n os: process.platform,\n arch: process.arch,\n },\n };\n}\n","/**\n * Application Identity Module\n *\n * Provides typed access to .fulmen/app.yaml identity metadata\n * Layer 0 module: zero Fulmen module dependencies\n */\n\n// Constants\nexport {\n APP_IDENTITY_DIR,\n APP_IDENTITY_ENV_VAR,\n APP_IDENTITY_FILENAME,\n APP_IDENTITY_SCHEMA_ID,\n MAX_ANCESTOR_SEARCH_DEPTH,\n} from \"./constants.js\";\n\n// Embedded identity (for standalone binary/package support)\nexport {\n clearEmbeddedIdentity,\n getEmbeddedIdentity,\n hasEmbeddedIdentity,\n registerEmbeddedIdentity,\n} from \"./embedded.js\";\n\n// Errors\nexport { AppIdentityError } from \"./errors.js\";\nexport type { ConfigIdentifiers } from \"./helpers.js\";\n// Helpers\nexport {\n buildEnvVar,\n getBinaryName,\n getConfigIdentifiers,\n getConfigName,\n getEnvPrefix,\n getEnvVar,\n getTelemetryNamespace,\n getVendor,\n} from \"./helpers.js\";\n// Functions\nexport {\n clearIdentityCache,\n getCachedIdentity,\n loadIdentity,\n} from \"./loader.js\";\n\nexport {\n type BuildRuntimeInfoOptions,\n buildRuntimeInfo,\n type RuntimeInfo,\n type RuntimeName,\n} from \"./runtime.js\";\n// Types\nexport type {\n AppIdentity,\n Identity,\n IdentityMetadata,\n LoadIdentityOptions,\n PythonMetadata,\n RepositoryCategory,\n} from \"./types.js\";\n","/**\n * Application Identity Helpers\n *\n * Convenience functions for accessing identity fields\n * All helpers use loadIdentity() under the hood for caching benefits\n */\n\nimport { loadIdentity } from \"./loader.js\";\nimport type { LoadIdentityOptions } from \"./types.js\";\n\n/**\n * Config identifiers for path construction\n */\nexport interface ConfigIdentifiers {\n readonly vendor: string;\n readonly configName: string;\n}\n\n/**\n * Get the binary name from app identity\n *\n * @param options - Load options (optional)\n * @returns Binary name (e.g., 'myapp')\n */\nexport async function getBinaryName(options?: LoadIdentityOptions): Promise<string> {\n const identity = await loadIdentity(options);\n return identity.app.binary_name;\n}\n\n/**\n * Get the vendor namespace from app identity\n *\n * @param options - Load options (optional)\n * @returns Vendor namespace (e.g., 'acmecorp')\n */\nexport async function getVendor(options?: LoadIdentityOptions): Promise<string> {\n const identity = await loadIdentity(options);\n return identity.app.vendor;\n}\n\n/**\n * Get the environment variable prefix from app identity\n *\n * @param options - Load options (optional)\n * @returns Env prefix (e.g., 'MYAPP_')\n */\nexport async function getEnvPrefix(options?: LoadIdentityOptions): Promise<string> {\n const identity = await loadIdentity(options);\n return identity.app.env_prefix;\n}\n\n/**\n * Get the config directory name from app identity\n *\n * @param options - Load options (optional)\n * @returns Config name (e.g., 'myapp')\n */\nexport async function getConfigName(options?: LoadIdentityOptions): Promise<string> {\n const identity = await loadIdentity(options);\n return identity.app.config_name;\n}\n\n/**\n * Get the telemetry namespace from app identity\n *\n * Falls back to binary_name if telemetry_namespace is not specified\n *\n * @param options - Load options (optional)\n * @returns Telemetry namespace (e.g., 'acmecorp_myapp' or 'myapp')\n */\nexport async function getTelemetryNamespace(options?: LoadIdentityOptions): Promise<string> {\n const identity = await loadIdentity(options);\n return identity.metadata?.telemetry_namespace ?? identity.app.binary_name;\n}\n\n/**\n * Get config identifiers for path construction\n *\n * Returns vendor and configName for building config paths like:\n * ~/.config/{vendor}/{configName}/config.yaml\n *\n * @param options - Load options (optional)\n * @returns Frozen config identifiers { vendor, configName }\n */\nexport async function getConfigIdentifiers(\n options?: LoadIdentityOptions,\n): Promise<ConfigIdentifiers> {\n const identity = await loadIdentity(options);\n return Object.freeze({\n vendor: identity.app.vendor,\n configName: identity.app.config_name,\n });\n}\n\n/**\n * Build environment variable name with app prefix\n *\n * Constructs env var names like: MYAPP_DATABASE_URL\n * Normalizes invalid characters (anything outside [A-Z0-9_]) to underscores\n * for conventional env var naming.\n *\n * Examples:\n * - 'database-url' → 'MYAPP_DATABASE_URL'\n * - 'my.config' → 'MYAPP_MY_CONFIG'\n * - 'log_level' → 'MYAPP_LOG_LEVEL'\n *\n * @param key - Environment variable key (will be uppercased and normalized)\n * @param options - Load options (optional)\n * @returns Full environment variable name (e.g., 'MYAPP_DATABASE_URL')\n */\nexport async function buildEnvVar(key: string, options?: LoadIdentityOptions): Promise<string> {\n const envPrefix = await getEnvPrefix(options);\n // Uppercase and replace any non-alphanumeric/underscore characters with underscores\n const normalizedKey = key.toUpperCase().replace(/[^A-Z0-9_]/g, \"_\");\n return `${envPrefix}${normalizedKey}`;\n}\n\n/**\n * Get environment variable value using app prefix\n *\n * Convenience wrapper around process.env using buildEnvVar\n *\n * @param key - Environment variable key (will be uppercased)\n * @param options - Load options (optional)\n * @returns Environment variable value or undefined\n */\nexport async function getEnvVar(\n key: string,\n options?: LoadIdentityOptions,\n): Promise<string | undefined> {\n const envVarName = await buildEnvVar(key, options);\n return process.env[envVarName];\n}\n","/**\n * Normalization utilities for DocScribe module inputs.\n */\n\nconst decoder = new TextDecoder(\"utf-8\", { fatal: false, ignoreBOM: true });\n\nexport type NormalizedInput = {\n readonly content: string;\n readonly original: string | Uint8Array | ArrayBufferLike;\n};\n\nfunction stripBom(value: string): string {\n return value.charCodeAt(0) === 0xfeff ? value.slice(1) : value;\n}\n\nfunction normalizeNewlines(value: string): string {\n return value.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\n/**\n * Normalize supported input types to a UTF-8 string with consistent newlines.\n */\nexport function normalizeInput(input: string | Uint8Array | ArrayBufferLike): NormalizedInput {\n let content: string;\n\n if (typeof input === \"string\") {\n content = input;\n } else if (input instanceof Uint8Array) {\n content = decoder.decode(input);\n } else {\n content = decoder.decode(new Uint8Array(input));\n }\n\n const normalized = normalizeNewlines(stripBom(content));\n return { content: normalized, original: input };\n}\n","/**\n * DocScribe module public types.\n */\n\nexport type DocScribePrimitiveValue = string | number | boolean | null;\n\nexport type DocScribeMetadataValue =\n | DocScribePrimitiveValue\n | ReadonlyArray<DocScribeMetadataValue>\n | { readonly [key: string]: DocScribeMetadataValue };\n\nexport interface DocScribeMetadata extends Record<string, DocScribeMetadataValue | undefined> {\n readonly title?: string;\n readonly description?: string;\n readonly author?: string;\n readonly date?: string;\n readonly lastUpdated?: string;\n readonly status?: string;\n readonly tags?: ReadonlyArray<string>;\n readonly version?: string;\n readonly relatedDocs?: ReadonlyArray<string>;\n readonly meta?: DocScribeMetadataValue;\n}\n\nexport interface DocScribeFrontmatterResult {\n readonly metadata: DocScribeMetadata | null;\n readonly body: string;\n readonly range: {\n readonly start: number;\n readonly end: number;\n } | null;\n readonly bodyStartLine: number;\n}\n\nexport interface DocScribeHeader {\n readonly level: number;\n readonly text: string;\n readonly slug: string;\n readonly line: number;\n}\n\nexport type DocScribeFormat = \"markdown\" | \"yaml\" | \"yaml-stream\" | \"json\" | \"toml\" | \"plain\";\n\nexport interface DocScribeInfo {\n readonly format: DocScribeFormat;\n readonly hasFrontmatter: boolean;\n readonly frontmatterRange: {\n readonly start: number;\n readonly end: number;\n } | null;\n readonly metadata: DocScribeMetadata | null;\n readonly headerCount: number;\n readonly estimatedSections: number;\n readonly bodyStartLine: number;\n readonly lineCount: number;\n readonly size: number;\n readonly headers: ReadonlyArray<DocScribeHeader>;\n}\n\nexport interface DocScribeSplit {\n readonly content: string;\n readonly format: DocScribeFormat;\n readonly hasFrontmatter: boolean;\n readonly metadata: DocScribeMetadata | null;\n readonly startLine: number;\n readonly endLine: number;\n readonly index: number;\n}\n\nexport interface DocScribeOptions {\n readonly maxDocuments?: number;\n readonly slugify?: (header: string) => string;\n readonly maxDepth?: number;\n}\n\nexport class DocScribeError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"DocScribeError\";\n }\n}\n\nexport class DocScribeParseError extends DocScribeError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"DocScribeParseError\";\n }\n}\n\nexport class DocScribeUnsupportedFormatError extends DocScribeError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"DocScribeUnsupportedFormatError\";\n }\n}\n","import { parseDocument } from \"yaml\";\n\nimport { normalizeInput } from \"./normalize.js\";\nimport {\n type DocScribeFrontmatterResult,\n type DocScribeMetadata,\n type DocScribeMetadataValue,\n DocScribeParseError,\n} from \"./types.js\";\n\nconst FRONTMATTER_DELIMITER = \"---\";\nconst STRING_KEYS = new Set<string>([\n \"title\",\n \"description\",\n \"author\",\n \"date\",\n \"lastUpdated\",\n \"status\",\n \"version\",\n]);\n\ninterface FrontmatterBounds {\n readonly start: number;\n readonly openEnd: number;\n readonly closingStart: number;\n readonly closingEnd: number;\n}\n\nexport function parseFrontmatter(\n input: string | Uint8Array | ArrayBufferLike,\n): DocScribeFrontmatterResult {\n const { content } = normalizeInput(input);\n const bounds = locateFrontmatter(content);\n\n if (!bounds) {\n return { metadata: null, body: content, range: null, bodyStartLine: 1 };\n }\n\n const yamlBlock = content.slice(bounds.openEnd, bounds.closingStart);\n const metadata =\n yamlBlock.trim().length === 0 ? ({} as DocScribeMetadata) : parseYamlMetadata(yamlBlock);\n\n const bodyRaw = content.slice(bounds.closingEnd);\n const leadingNewlinesMatch = bodyRaw.match(/^\\n+/);\n const leadingNewlinesLength = leadingNewlinesMatch ? leadingNewlinesMatch[0].length : 0;\n const bodyStartIndex = bounds.closingEnd + leadingNewlinesLength;\n const prefix = content.slice(0, bodyStartIndex);\n const bodyStartLine = prefix.length === 0 ? 1 : prefix.split(\"\\n\").length;\n const body = bodyRaw.slice(leadingNewlinesLength);\n\n return {\n metadata,\n body,\n range: { start: bounds.start, end: bounds.closingEnd },\n bodyStartLine,\n };\n}\n\nexport function stripFrontmatter(input: string | Uint8Array | ArrayBufferLike): string {\n return parseFrontmatter(input).body;\n}\n\nexport function extractMetadata(\n input: string | Uint8Array | ArrayBufferLike,\n): DocScribeMetadata | null {\n return parseFrontmatter(input).metadata;\n}\n\nfunction locateFrontmatter(content: string): FrontmatterBounds | null {\n let cursor = 0;\n\n while (cursor < content.length) {\n const newlineIndex = content.indexOf(\"\\n\", cursor);\n const lineEnd = newlineIndex === -1 ? content.length : newlineIndex;\n const line = content.slice(cursor, lineEnd);\n\n if (line.trim().length === 0) {\n if (newlineIndex === -1) {\n return null;\n }\n cursor = newlineIndex + 1;\n continue;\n }\n\n if (line.trim() !== FRONTMATTER_DELIMITER) {\n return null;\n }\n\n const openStart = cursor;\n const openEnd = newlineIndex === -1 ? content.length : newlineIndex + 1;\n\n let search = openEnd;\n while (search <= content.length) {\n const nextNewline = content.indexOf(\"\\n\", search);\n const segmentEnd = nextNewline === -1 ? content.length : nextNewline;\n const candidate = content.slice(search, segmentEnd).trim();\n\n if (candidate === FRONTMATTER_DELIMITER) {\n const closingStart = search;\n const closingEnd = nextNewline === -1 ? segmentEnd : nextNewline + 1;\n return {\n start: openStart,\n openEnd,\n closingStart,\n closingEnd,\n };\n }\n\n if (nextNewline === -1) {\n break;\n }\n\n search = nextNewline + 1;\n }\n\n return null;\n }\n\n return null;\n}\n\nfunction parseYamlMetadata(source: string): DocScribeMetadata {\n const document = parseDocument(source, { prettyErrors: true });\n\n if (document.errors.length > 0) {\n const error = document.errors[0];\n const location = error.linePos && error.linePos.length > 0 ? error.linePos[0] : null;\n const position = location ? ` (line ${location.line + 1}, column ${location.col + 1})` : \"\";\n throw new DocScribeParseError(`Invalid YAML frontmatter${position}: ${error.message}`, {\n cause: error,\n });\n }\n\n let raw: unknown;\n try {\n raw = document.toJS({ mapAsMap: false });\n } catch (error) {\n throw new DocScribeParseError(\"Failed to parse YAML frontmatter\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n if (raw == null) {\n return {} as DocScribeMetadata;\n }\n\n if (typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new DocScribeParseError(\"YAML frontmatter must be a mapping at the top level\");\n }\n\n return normalizeMetadata(raw as Record<string, unknown>);\n}\n\nfunction normalizeMetadata(raw: Record<string, unknown>): DocScribeMetadata {\n const normalized: Record<string, DocScribeMetadataValue | undefined> = {};\n\n for (const [key, value] of Object.entries(raw)) {\n normalized[key] = normalizeMetadataValue(value);\n }\n\n const base: Record<string, DocScribeMetadataValue | undefined> = {};\n for (const [key, value] of Object.entries(normalized)) {\n if (STRING_KEYS.has(key) || key === \"tags\" || key === \"relatedDocs\") {\n continue;\n }\n base[key] = value;\n }\n\n const metadata: DocScribeMetadata = {\n ...base,\n ...(normalized.title !== undefined ? { title: ensureStringValue(normalized.title) } : {}),\n ...(normalized.description !== undefined\n ? { description: ensureStringValue(normalized.description) }\n : {}),\n ...(normalized.author !== undefined ? { author: ensureStringValue(normalized.author) } : {}),\n ...(normalized.date !== undefined ? { date: ensureStringValue(normalized.date) } : {}),\n ...(normalized.lastUpdated !== undefined\n ? { lastUpdated: ensureStringValue(normalized.lastUpdated) }\n : {}),\n ...(normalized.status !== undefined ? { status: ensureStringValue(normalized.status) } : {}),\n ...(normalized.version !== undefined ? { version: ensureStringValue(normalized.version) } : {}),\n ...(normalized.tags !== undefined\n ? (() => {\n const tags = ensureStringArray(normalized.tags);\n return tags.length > 0 ? { tags } : {};\n })()\n : {}),\n ...(normalized.relatedDocs !== undefined\n ? (() => {\n const related = ensureStringArray(normalized.relatedDocs);\n return related.length > 0 ? { relatedDocs: related } : {};\n })()\n : {}),\n };\n\n return metadata;\n}\n\nfunction normalizeMetadataValue(value: unknown): DocScribeMetadataValue {\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (Array.isArray(value)) {\n return value.map((item) =>\n normalizeMetadataValue(item),\n ) as ReadonlyArray<DocScribeMetadataValue>;\n }\n\n if (typeof value === \"object\") {\n const result: Record<string, DocScribeMetadataValue> = {};\n for (const [key, nested] of Object.entries(value as Record<string, unknown>)) {\n result[key] = normalizeMetadataValue(nested);\n }\n return result as { readonly [key: string]: DocScribeMetadataValue };\n }\n\n return String(value);\n}\n\nfunction ensureStringValue(value: DocScribeMetadataValue): string {\n if (value === null) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => ensureStringArrayItem(item)).join(\", \");\n }\n\n return JSON.stringify(value);\n}\n\nfunction ensureStringArray(value: DocScribeMetadataValue): ReadonlyArray<string> {\n return ensureStringArrayItem(value);\n}\n\nfunction ensureStringArrayItem(value: DocScribeMetadataValue): string[] {\n if (value === null) {\n return [];\n }\n\n if (typeof value === \"string\") {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return [String(value)];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => ensureStringArrayItem(item));\n }\n\n return [JSON.stringify(value)];\n}\n","import { parseFrontmatter } from \"./frontmatter.js\";\nimport { normalizeInput } from \"./normalize.js\";\nimport type { DocScribeHeader, DocScribeOptions } from \"./types.js\";\n\nconst ATX_PATTERN = /^ {0,3}(#{1,6})(?:[ \\t]+|$)(.*)$/;\nconst SETEXT_PATTERN = /^ {0,3}(=+|-+)\\s*$/;\n\nexport function extractHeaders(\n input: string | Uint8Array | ArrayBufferLike,\n options?: DocScribeOptions,\n): DocScribeHeader[] {\n const { content } = normalizeInput(input);\n const parsed = parseFrontmatter(content);\n const body = parsed.body;\n const lineOffset = parsed.bodyStartLine;\n\n const slugify = options?.slugify ?? defaultSlugify;\n const maxDepth = options?.maxDepth ?? 6;\n\n const lines = body.split(\"\\n\");\n const headers: DocScribeHeader[] = [];\n\n let inFence = false;\n let fenceMarker: \"`\" | \"~\" | null = null;\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n const trimmed = line.trimEnd();\n const lineNumber = lineOffset + index;\n\n const fenceMatch = line.match(/^ {0,3}(```+|~~~+)/);\n if (fenceMatch) {\n const marker = fenceMatch[1][0] as \"`\" | \"~\";\n if (!inFence) {\n inFence = true;\n fenceMarker = marker;\n } else if (fenceMarker === marker) {\n inFence = false;\n fenceMarker = null;\n }\n continue;\n }\n\n if (inFence) {\n continue;\n }\n\n if (/^( {4}|\\t)/.test(line)) {\n continue;\n }\n\n const atxMatch = trimmed.match(ATX_PATTERN);\n if (atxMatch) {\n const level = atxMatch[1].length;\n if (level <= maxDepth) {\n const rawText = atxMatch[2].replace(/#+\\s*$/, \"\").trim();\n const text = rawText.length > 0 ? rawText : \"\";\n const slug = ensureSlug(slugify, text, lineNumber);\n headers.push({ level, text, slug, line: lineNumber });\n }\n continue;\n }\n\n if (trimmed.length === 0) {\n continue;\n }\n\n if (index + 1 >= lines.length) {\n continue;\n }\n\n const nextLine = lines[index + 1];\n const setextMatch = SETEXT_PATTERN.exec(nextLine.trimEnd());\n if (setextMatch) {\n const underline = setextMatch[1];\n const level = underline.startsWith(\"=\") ? 1 : 2;\n if (level <= maxDepth) {\n const text = trimmed.trim();\n if (text.length > 0 && !/^ {0,3}(```|~~~)/.test(text)) {\n const slug = ensureSlug(slugify, text, lineNumber);\n headers.push({ level, text, slug, line: lineNumber });\n }\n }\n index += 1;\n }\n }\n\n return headers;\n}\n\nfunction defaultSlugify(value: string): string {\n return value\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .trim()\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\");\n}\n\nfunction ensureSlug(slugify: (header: string) => string, text: string, lineNumber: number): string {\n const candidate = slugify(text);\n if (candidate && candidate.trim().length > 0) {\n return candidate;\n }\n return `section-${lineNumber}`;\n}\n","import { parseFrontmatter } from \"./frontmatter.js\";\nimport { extractHeaders } from \"./headers.js\";\nimport { normalizeInput } from \"./normalize.js\";\nimport type { DocScribeFormat, DocScribeInfo, DocScribeOptions } from \"./types.js\";\n\nconst JSON_PATTERN = /^[\\s\\t]*[[{]/;\nconst TOML_ASSIGNMENT = /^[A-Za-z0-9_\"'\\-.]+\\s*=\\s*.+$/;\nconst TOML_TABLE = /^\\s*\\[[^\\]]+\\]\\s*$/;\nconst YAML_KEY_PATTERN = /^\\s*[\\w\"'-]+\\s*:\\s*.+$/;\nconst MARKDOWN_HEADING = /(\\n|^)\\s{0,3}#{1,6}\\s+/;\nconst MARKDOWN_LIST = /(\\n|^)\\s{0,3}(?:-|\\*|\\+)\\s+/;\nconst MARKDOWN_SETEXT = /(\\n|^).+\\n\\s{0,3}(?:=+|-+)\\s*(\\n|$)/;\n\nexport function detectFormat(input: string | Uint8Array | ArrayBufferLike): DocScribeFormat {\n const { content } = normalizeInput(input);\n return detectFormatFromContent(content);\n}\n\nexport function inspectDocument(\n input: string | Uint8Array | ArrayBufferLike,\n options?: DocScribeOptions,\n): DocScribeInfo {\n const { content } = normalizeInput(input);\n const format = detectFormatFromContent(content);\n const frontmatter = parseFrontmatter(content);\n const headers = extractHeaders(content, options);\n const headerCount = headers.length;\n const estimatedSections =\n headerCount > 0 ? headerCount : frontmatter.body.trim().length > 0 ? 1 : 0;\n const lineCount = content.length === 0 ? 0 : content.split(\"\\n\").length;\n const size = content.length;\n\n return {\n format,\n hasFrontmatter: frontmatter.metadata !== null,\n frontmatterRange: frontmatter.range,\n metadata: frontmatter.metadata,\n headerCount,\n estimatedSections,\n bodyStartLine: frontmatter.bodyStartLine,\n lineCount,\n size,\n headers,\n };\n}\n\nfunction detectFormatFromContent(content: string): DocScribeFormat {\n const trimmed = content.trim();\n if (trimmed.length === 0) {\n return \"plain\";\n }\n\n if (looksLikeJson(trimmed)) {\n return \"json\";\n }\n\n if (looksLikeToml(trimmed)) {\n return \"toml\";\n }\n\n const yamlSeparatorCount = countYamlSeparators(content);\n if (yamlSeparatorCount >= 1 && isLikelyYamlStream(content)) {\n return \"yaml-stream\";\n }\n\n const markdownIndicators = hasMarkdownIndicators(content);\n\n if (looksLikeYaml(trimmed) && !markdownIndicators) {\n return \"yaml\";\n }\n\n const frontmatter = parseFrontmatter(content);\n if (frontmatter.metadata !== null) {\n const body = frontmatter.body.trim();\n if (markdownIndicators || MARKDOWN_HEADING.test(body) || MARKDOWN_LIST.test(body)) {\n return \"markdown\";\n }\n if (!body) {\n return \"markdown\";\n }\n }\n\n if (markdownIndicators) {\n return \"markdown\";\n }\n\n return \"plain\";\n}\n\nfunction looksLikeJson(trimmed: string): boolean {\n if (!JSON_PATTERN.test(trimmed)) {\n return false;\n }\n try {\n JSON.parse(trimmed);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nfunction looksLikeToml(content: string): boolean {\n const lines = content.split(\"\\n\");\n let tableCount = 0;\n let assignmentCount = 0;\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (line === \"\" || line.startsWith(\"#\")) {\n continue;\n }\n if (TOML_TABLE.test(line)) {\n tableCount += 1;\n continue;\n }\n if (TOML_ASSIGNMENT.test(line)) {\n assignmentCount += 1;\n }\n }\n return tableCount > 0 || assignmentCount >= 3;\n}\n\nfunction looksLikeYaml(trimmed: string): boolean {\n if (trimmed.startsWith(\"%YAML\")) {\n return true;\n }\n const lines = trimmed.split(\"\\n\");\n let signal = 0;\n for (const raw of lines.slice(0, 20)) {\n const line = raw.trim();\n if (line === \"\" || line.startsWith(\"#\")) {\n continue;\n }\n if (line === \"---\") {\n signal += 1;\n continue;\n }\n if (YAML_KEY_PATTERN.test(line) || /^-\\s/.test(line)) {\n signal += 1;\n }\n }\n return signal >= 2;\n}\n\nfunction countYamlSeparators(content: string): number {\n const matches = content.match(/(^|\\n)---\\s*(\\n|$)/g);\n return matches ? matches.length : 0;\n}\n\nfunction isLikelyYamlStream(content: string): boolean {\n const lines = content.split(\"\\n\");\n let yamlSignals = 0;\n let markdownSignals = 0;\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (line === \"\" || line === \"---\") {\n continue;\n }\n\n if (\n /^#/.test(line) ||\n /^\\s{0,3}(?:-|\\*|\\+)\\s+/.test(line) ||\n /(\\[[^\\]]+\\]\\([^)]+\\))/.test(line)\n ) {\n markdownSignals += 1;\n }\n\n if (/:\\s/.test(line) || /^-\\s/.test(line)) {\n yamlSignals += 1;\n }\n }\n\n return yamlSignals >= 2 && markdownSignals === 0;\n}\n\nfunction hasMarkdownIndicators(content: string): boolean {\n return (\n MARKDOWN_HEADING.test(content) ||\n MARKDOWN_LIST.test(content) ||\n MARKDOWN_SETEXT.test(content) ||\n /(\\n|^)\\s{0,3}>\\s+/.test(content) ||\n /(\\[[^\\]]+\\]\\([^)]+\\))/.test(content)\n );\n}\n\n// Internal helper exported for testing or reuse\nexport const __internal = {\n detectFormatFromContent,\n looksLikeJson,\n looksLikeToml,\n looksLikeYaml,\n isLikelyYamlStream,\n};\n","import { detectFormat } from \"./format.js\";\nimport { parseFrontmatter } from \"./frontmatter.js\";\nimport { normalizeInput } from \"./normalize.js\";\nimport type { DocScribeFormat, DocScribeOptions, DocScribeSplit } from \"./types.js\";\n\ntype RawSplit = Omit<DocScribeSplit, \"index\">;\n\ntype LineInfo = { line: string; lineNumber: number };\n\ntype AccumulatedDoc = { lines: string[]; startLine: number };\n\nexport function splitDocuments(\n input: string | Uint8Array | ArrayBufferLike,\n options?: DocScribeOptions,\n): DocScribeSplit[] {\n const { content } = normalizeInput(input);\n const trimmed = content.trim();\n\n if (trimmed.length === 0) {\n return [];\n }\n\n const maxDocuments = options?.maxDocuments ?? Number.POSITIVE_INFINITY;\n const format = detectFormat(content);\n\n let splits: DocScribeSplit[];\n if (format === \"yaml-stream\") {\n splits = withIndices(splitYamlStream(content));\n } else if (format === \"markdown\") {\n const markdownSplits = splitMarkdownDocuments(content);\n splits =\n markdownSplits.length > 0\n ? withIndices(markdownSplits)\n : [withIndex(buildSingleSplit(content, format, 1), 0)];\n } else {\n splits = [withIndex(buildSingleSplit(content, format, 1), 0)];\n }\n\n return applyDocumentLimit(splits, maxDocuments);\n}\n\nfunction splitYamlStream(content: string): RawSplit[] {\n const lines = content.split(\"\\n\");\n const docs: AccumulatedDoc[] = [];\n let current: AccumulatedDoc = { lines: [], startLine: 1 };\n let delimiterCount = 0;\n\n const flush = () => {\n if (current.lines.join(\"\\n\").trim().length === 0) {\n current = { lines: [], startLine: current.startLine };\n return;\n }\n docs.push({ ...current, lines: [...current.lines] });\n current = { lines: [], startLine: current.startLine };\n };\n\n for (let index = 0; index < lines.length; index += 1) {\n const lineNumber = index + 1;\n const line = lines[index];\n const trimmed = line.trim();\n\n if (trimmed === \"---\") {\n delimiterCount += 1;\n flush();\n current = { lines: [], startLine: lineNumber + 1 };\n continue;\n }\n\n if (delimiterCount === 0) {\n current.startLine = 1;\n }\n\n current.lines.push(line);\n }\n\n flush();\n\n if (docs.length === 0) {\n return [buildRawSplit(content, \"yaml\", null, 1, content.split(\"\\n\").length)];\n }\n\n return docs\n .map((doc) => {\n const joined = doc.lines.join(\"\\n\");\n const lineCount = doc.lines.length;\n return buildRawSplit(\n joined,\n \"yaml\",\n null,\n doc.startLine,\n doc.startLine + Math.max(lineCount - 1, 0),\n );\n })\n .filter((split) => split.content.trim().length > 0);\n}\n\nfunction splitMarkdownDocuments(content: string): RawSplit[] {\n const frontmatter = parseFrontmatter(content);\n const lines = content.split(\"\\n\");\n const docs: AccumulatedDoc[] = [];\n const frontmatterLimit = frontmatter.metadata ? Math.max(frontmatter.bodyStartLine - 1, 0) : 0;\n\n let current: AccumulatedDoc = { lines: [], startLine: 1 };\n let inFence = false;\n let fenceMarker: \"`\" | \"~\" | null = null;\n\n const flush = () => {\n if (current.lines.join(\"\\n\").trim().length === 0) {\n current = { lines: [], startLine: current.startLine };\n return;\n }\n docs.push({ ...current, lines: [...current.lines] });\n current = { lines: [], startLine: current.startLine };\n };\n\n for (let index = 0; index < lines.length; index += 1) {\n const lineNumber = index + 1;\n const line = lines[index];\n const trimmed = line.trimEnd();\n\n const fenceMatch = line.match(/^ {0,3}(```+|~~~+)/);\n if (fenceMatch) {\n const marker = fenceMatch[1][0] as \"`\" | \"~\";\n if (!inFence) {\n inFence = true;\n fenceMarker = marker;\n } else if (fenceMarker === marker) {\n inFence = false;\n fenceMarker = null;\n }\n }\n\n const isPrimaryFrontmatter = frontmatterLimit > 0 && lineNumber <= frontmatterLimit;\n\n if (!inFence && !isPrimaryFrontmatter && trimmed === \"---\") {\n const prev = findPrevNonEmpty(lines, index - 1);\n const next = findNextNonEmpty(lines, index + 1);\n const prevLooksLikeMetadata = prev ? /:\\s*/.test(prev.line) : false;\n const nextIsHeading = next ? next.line.trim().startsWith(\"#\") : false;\n\n if (next && !prevLooksLikeMetadata && nextIsHeading) {\n flush();\n current = { lines: [], startLine: next.lineNumber };\n continue;\n }\n }\n\n current.lines.push(line);\n }\n\n flush();\n\n return docs\n .map((doc) => {\n const contentValue = doc.lines.join(\"\\n\");\n const parsed = parseFrontmatter(contentValue);\n const lineCount = doc.lines.length;\n return buildRawSplit(\n contentValue,\n \"markdown\",\n parsed.metadata,\n doc.startLine,\n doc.startLine + Math.max(lineCount - 1, 0),\n parsed.metadata !== null,\n );\n })\n .filter((split) => split.content.trim().length > 0);\n}\n\nfunction buildSingleSplit(content: string, format: DocScribeFormat, startLine: number): RawSplit {\n const parsed = parseFrontmatter(content);\n const lineCount = content.length === 0 ? 0 : content.split(\"\\n\").length;\n return buildRawSplit(\n content,\n format,\n parsed.metadata,\n startLine,\n startLine + Math.max(lineCount - 1, 0),\n parsed.metadata !== null,\n );\n}\n\nfunction buildRawSplit(\n content: string,\n format: DocScribeFormat,\n metadata: ReturnType<typeof parseFrontmatter>[\"metadata\"],\n startLine: number,\n endLine: number,\n hasFrontmatter = false,\n): RawSplit {\n return {\n content,\n format,\n hasFrontmatter,\n metadata: metadata ?? null,\n startLine,\n endLine,\n };\n}\n\nfunction applyDocumentLimit(splits: DocScribeSplit[], maxDocuments: number): DocScribeSplit[] {\n if (maxDocuments <= 0) {\n return [];\n }\n\n if (splits.length <= maxDocuments) {\n return splits.map((split, idx) => ({ ...split, index: idx }));\n }\n\n const cutoff = Math.max(maxDocuments - 1, 0);\n const allowed = splits.slice(0, cutoff);\n const remaining = splits.slice(cutoff);\n const merged = mergeSplitGroup(remaining);\n const combined = cutoff === 0 ? [merged] : [...allowed, merged];\n return combined.map((split, idx) => ({ ...split, index: idx }));\n}\n\nfunction mergeSplitGroup(splits: DocScribeSplit[]): DocScribeSplit {\n const first = splits[0];\n const last = splits[splits.length - 1];\n const combinedContent = splits.map((split) => split.content).join(\"\\n---\\n\");\n return {\n content: combinedContent,\n format: first.format,\n hasFrontmatter: first.hasFrontmatter,\n metadata: first.metadata,\n startLine: first.startLine,\n endLine: last.endLine,\n index: 0,\n };\n}\n\nfunction withIndices(rawSplits: RawSplit[]): DocScribeSplit[] {\n return rawSplits.map((split, idx) => withIndex(split, idx));\n}\n\nfunction withIndex(split: RawSplit, index: number): DocScribeSplit {\n return { ...split, index };\n}\n\nfunction findNextNonEmpty(lines: readonly string[], startIndex: number): LineInfo | null {\n for (let index = startIndex; index < lines.length; index += 1) {\n const candidate = lines[index];\n if (candidate.trim().length === 0) {\n continue;\n }\n return { line: candidate, lineNumber: index + 1 };\n }\n return null;\n}\n\nfunction findPrevNonEmpty(lines: readonly string[], startIndex: number): LineInfo | null {\n for (let index = startIndex; index >= 0; index -= 1) {\n const candidate = lines[index];\n if (candidate.trim().length === 0) {\n continue;\n }\n return { line: candidate, lineNumber: index + 1 };\n }\n return null;\n}\n","/**\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","/**\n * TSFulmen - TypeScript Fulmen Helper Library\n *\n * Provides ergonomic access to Crucible SSOT assets and core utilities\n * for TypeScript/Node.js applications in the FulmenHQ ecosystem.\n */\n\nexport const VERSION = \"0.3.1\";\n\nexport * from \"./appidentity/index.js\";\nexport * from \"./docscribe/index.js\";\n\n// Core modules will be exported here as they are implemented\n// export * from './config/index.js';\n// export * from './crucible/index.js';\n// export * from './errors/index.js';\n// export * from './logging/index.js';\n// export * from './schema/index.js';\n// export * from './telemetry/index.js';\nexport * from \"./fulpack/index.js\";\n"]}
1
+ {"version":3,"sources":["../src/appidentity/constants.ts","../src/schema/ajv-formats.ts","../src/schema/errors.ts","../src/schema/utils.ts","../src/schema/goneat-bridge.ts","../src/schema/normalizer.ts","../src/schema/registry.ts","../src/telemetry/counter.ts","../src/telemetry/gauge.ts","../src/telemetry/taxonomy.ts","../src/telemetry/histogram.ts","../src/telemetry/registry.ts","../src/telemetry/types.ts","../src/telemetry/validators.ts","../src/telemetry/index.ts","../src/schema/validator.ts","../src/schema/cli.ts","../src/schema/export.ts","../src/schema/index.ts","../src/errors/correlation.ts","../src/errors/severity.ts","../src/errors/serialization.ts","../src/errors/validators.ts","../src/errors/fulmen-error.ts","../src/errors/index.ts","../src/appidentity/errors.ts","../src/appidentity/embedded.ts","../src/appidentity/cache.ts","../src/appidentity/discovery.ts","../src/appidentity/loader.ts","../src/appidentity/runtime.ts","../src/appidentity/index.ts","../src/appidentity/helpers.ts","../src/docscribe/normalize.ts","../src/docscribe/types.ts","../src/docscribe/frontmatter.ts","../src/docscribe/headers.ts","../src/docscribe/format.ts","../src/docscribe/split.ts","../src/crucible/fulpack/types.ts","../src/fulpack/errors.ts","../src/fulpack/core.ts","../src/fulpack/index.ts","../src/index.ts"],"names":["__dirname","parseYAML","access","join","readFile","parseYaml","init_registry","fileURLToPath","dirname","init_validators","init_errors","deepFreeze","ArchiveFormat","EntryType","Operation","extract"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Application Identity Constants\n *\n * Centralized configuration for identity discovery and validation\n */\n\n/**\n * Filename for identity document\n */\nexport const APP_IDENTITY_FILENAME = \"app.yaml\";\n\n/**\n * Directory containing identity file\n */\nexport const APP_IDENTITY_DIR = \".fulmen\";\n\n/**\n * Environment variable for explicit path override\n */\nexport const APP_IDENTITY_ENV_VAR = \"FULMEN_APP_IDENTITY_PATH\";\n\n/**\n * Schema ID for validation\n */\nexport const APP_IDENTITY_SCHEMA_ID = \"config/repository/app-identity/v1.0.0/app-identity\";\n\n/**\n * Maximum depth for ancestor directory search\n * Prevents infinite loops and excessive filesystem traversal\n */\nexport const MAX_ANCESTOR_SEARCH_DEPTH = 20;\n","import type Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\nexport interface FulmenAjvFormatsOptions {\n mode?: \"fast\" | \"full\";\n formats?: string[];\n}\n\nconst DEFAULT_FORMATS = [\n \"date-time\",\n \"email\",\n \"hostname\",\n \"ipv4\",\n \"ipv6\",\n \"uri\",\n \"uri-reference\",\n \"uuid\",\n];\n\n/**\n * Apply Fulmen-standard AJV format support.\n *\n * Useful when configuring AJV in other frameworks (e.g. Fastify) so JSON Schema\n * `format` keywords are enforced consistently.\n */\nexport function applyFulmenAjvFormats(ajv: Ajv, options: FulmenAjvFormatsOptions = {}): Ajv {\n const mode = options.mode ?? \"fast\";\n const formats = options.formats ?? DEFAULT_FORMATS;\n\n // ajv-formats types use a string-literal union; allow callers to supply strings.\n // The `as never` on ajv works around ajv-formats bundling its own older ajv types\n // that diverge from ajv@8.18+ (CodeKeywordDefinition.code parameter incompatibility).\n addFormats(ajv as never, { mode, formats: formats as unknown as never[] });\n return ajv;\n}\n","/**\n * Schema validation errors - implements Fulmen Schema Validation Standard\n */\n\nimport type { SchemaSource, SchemaValidationDiagnostic } from \"./types.js\";\n\n/**\n * Export error reason enum for type-safe error categorization\n */\nexport enum ExportErrorReason {\n FILE_EXISTS = \"FILE_EXISTS\",\n WRITE_FAILED = \"WRITE_FAILED\",\n INVALID_FORMAT = \"INVALID_FORMAT\",\n PROVENANCE_FAILED = \"PROVENANCE_FAILED\",\n UNKNOWN = \"UNKNOWN\",\n}\n\n/**\n * Base error class for schema validation operations\n */\nexport class SchemaValidationError extends Error {\n constructor(\n message: string,\n public schemaId?: string,\n public diagnostics: SchemaValidationDiagnostic[] = [],\n public source?: SchemaSource,\n public cause?: Error,\n ) {\n super(message);\n this.name = \"SchemaValidationError\";\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SchemaValidationError);\n }\n }\n\n /**\n * Create error for schema not found\n */\n static schemaNotFound(schemaId: string): SchemaValidationError {\n return new SchemaValidationError(`Schema not found: ${schemaId}`, schemaId);\n }\n\n /**\n * Create error for invalid schema input\n */\n static invalidSchemaInput(source: SchemaSource, details: string): SchemaValidationError {\n return new SchemaValidationError(`Invalid schema input: ${details}`, undefined, [], source);\n }\n\n /**\n * Create error for validation failure\n */\n static validationFailed(\n schemaId: string,\n diagnostics: SchemaValidationDiagnostic[],\n source?: SchemaSource,\n ): SchemaValidationError {\n const errorCount = diagnostics.filter((d) => d.severity === \"ERROR\").length;\n const warningCount = diagnostics.filter((d) => d.severity === \"WARN\").length;\n\n const message = `Schema validation failed: ${errorCount} error(s), ${warningCount} warning(s)`;\n\n return new SchemaValidationError(message, schemaId, diagnostics, source);\n }\n\n /**\n * Create error for goneat binary not found\n */\n static goneatNotFound(goneatPath?: string): SchemaValidationError {\n const pathInfo = goneatPath ? ` at ${goneatPath}` : \"\";\n return new SchemaValidationError(\n `Goneat binary not found${pathInfo}. Falling back to AJV validation.`,\n );\n }\n\n /**\n * Create error for goneat execution failure\n */\n static goneatExecutionFailed(error: Error): SchemaValidationError {\n return new SchemaValidationError(\n \"Goneat execution failed. Falling back to AJV validation.\",\n undefined,\n [],\n undefined,\n error,\n );\n }\n\n /**\n * Create error for empty schema input\n */\n static emptySchemaInput(source?: SchemaSource): SchemaValidationError {\n return new SchemaValidationError(\"Schema content is empty\", undefined, [], source);\n }\n\n /**\n * Create error for parse failure\n */\n static parseFailed(source: SchemaSource, error: Error): SchemaValidationError {\n return new SchemaValidationError(\n `Failed to parse schema: ${error.message}`,\n undefined,\n [],\n source,\n error,\n );\n }\n\n /**\n * Create error for encoding failure\n */\n static encodingFailed(source: SchemaSource, error: Error): SchemaValidationError {\n return new SchemaValidationError(\n `Failed to encode schema: ${error.message}`,\n undefined,\n [],\n source,\n error,\n );\n }\n\n /**\n * Create error for registry operation failure\n */\n static registryError(operation: string, details: string): SchemaValidationError {\n return new SchemaValidationError(`Schema registry ${operation} failed: ${details}`);\n }\n\n /**\n * Format error for display\n */\n format(): string {\n let output = this.message;\n\n if (this.schemaId) {\n output += `\\nSchema ID: ${this.schemaId}`;\n }\n\n if (this.diagnostics.length > 0) {\n output += \"\\n\\nValidation Issues:\";\n this.diagnostics.forEach((diag, index) => {\n output += `\\n ${index + 1}. [${diag.severity}] ${diag.message}`;\n if (diag.pointer) {\n output += ` at ${diag.pointer}`;\n }\n if (diag.keyword) {\n output += ` (keyword: ${diag.keyword})`;\n }\n if (diag.source) {\n output += ` [${diag.source}]`;\n }\n });\n }\n\n if (this.source) {\n output += `\\n\\nSource: ${this.source.type}`;\n if (this.source.id) {\n output += ` (${this.source.id})`;\n }\n }\n\n return output;\n }\n\n /**\n * Convert to JSON representation\n */\n toJSON(): {\n name: string;\n message: string;\n schemaId?: string;\n diagnostics: SchemaValidationDiagnostic[];\n source?: SchemaSource;\n cause?: string;\n } {\n return {\n name: this.name,\n message: this.message,\n schemaId: this.schemaId,\n diagnostics: this.diagnostics,\n source: this.source,\n cause: this.cause?.message,\n };\n }\n}\n\n/**\n * Error class for schema export operations\n */\nexport class SchemaExportError extends SchemaValidationError {\n constructor(\n message: string,\n public reason: ExportErrorReason,\n public schemaId?: string,\n public outPath?: string,\n public cause?: Error,\n ) {\n super(message, schemaId, [], undefined, cause);\n this.name = \"SchemaExportError\";\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SchemaExportError);\n }\n }\n\n /**\n * Create error for file already exists\n */\n static fileExists(outPath: string): SchemaExportError {\n return new SchemaExportError(\n `Output file already exists: ${outPath}. Use overwrite option to replace.`,\n ExportErrorReason.FILE_EXISTS,\n undefined,\n outPath,\n );\n }\n\n /**\n * Create error for invalid export format\n */\n static invalidFormat(format: string, outPath: string): SchemaExportError {\n return new SchemaExportError(\n `Invalid export format: ${format}. Must be 'json' or 'yaml'.`,\n ExportErrorReason.INVALID_FORMAT,\n undefined,\n outPath,\n );\n }\n\n /**\n * Create error for write failure\n */\n static writeFailed(outPath: string, error: Error): SchemaExportError {\n return new SchemaExportError(\n `Failed to write schema to ${outPath}: ${error.message}`,\n ExportErrorReason.WRITE_FAILED,\n undefined,\n outPath,\n error,\n );\n }\n\n /**\n * Create error for provenance extraction failure\n */\n static provenanceFailed(details: string, error?: Error): SchemaExportError {\n return new SchemaExportError(\n `Failed to extract provenance metadata: ${details}`,\n ExportErrorReason.PROVENANCE_FAILED,\n undefined,\n undefined,\n error,\n );\n }\n}\n","/**\n * Schema validation utilities - helper functions for formatting and validation\n */\n\nimport { SchemaValidationError } from \"./errors.js\";\nimport type { SchemaValidationDiagnostic, SchemaValidationResult } from \"./types.js\";\n\n/**\n * Format validation diagnostics for display\n */\nexport function formatDiagnostics(diagnostics: SchemaValidationDiagnostic[]): string {\n if (diagnostics.length === 0) {\n return \"No validation issues found.\";\n }\n\n const lines: string[] = [];\n const errors = diagnostics.filter((d) => d.severity === \"ERROR\");\n const warnings = diagnostics.filter((d) => d.severity === \"WARN\");\n\n if (errors.length > 0) {\n lines.push(`❌ ${errors.length} error(s) found:`);\n errors.forEach((diag, index) => {\n lines.push(` ${index + 1}. ${diag.message}`);\n if (diag.pointer) {\n lines.push(` at ${diag.pointer}`);\n }\n if (diag.keyword) {\n lines.push(` keyword: ${diag.keyword}`);\n }\n });\n }\n\n if (warnings.length > 0) {\n lines.push(\"\");\n lines.push(`⚠️ ${warnings.length} warning(s) found:`);\n warnings.forEach((diag, index) => {\n lines.push(` ${index + 1}. ${diag.message}`);\n if (diag.pointer) {\n lines.push(` at ${diag.pointer}`);\n }\n });\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format validation result for display\n */\nexport function formatValidationResult(result: SchemaValidationResult): string {\n if (result.valid) {\n return \"✅ Validation passed\";\n }\n\n const output: string[] = [];\n output.push(\"❌ Validation failed\");\n output.push(formatDiagnostics(result.diagnostics));\n output.push(`\\nSource: ${result.source}`);\n\n return output.join(\"\\n\");\n}\n\n/**\n * Check if value is a SchemaValidationError\n */\nexport function isValidationError(error: unknown): error is SchemaValidationError {\n return error instanceof SchemaValidationError;\n}\n\n/**\n * Extract validation result from error or return success\n */\nexport function extractValidationResult(error: unknown): {\n valid: boolean;\n diagnostics: SchemaValidationDiagnostic[];\n source: \"ajv\" | \"goneat\";\n} {\n if (isValidationError(error)) {\n return {\n valid: false,\n diagnostics: error.diagnostics,\n source: error.diagnostics[0]?.source || \"ajv\",\n };\n }\n\n return {\n valid: true,\n diagnostics: [],\n source: \"ajv\",\n };\n}\n\n/**\n * Normalize JSON pointer path for display\n */\nexport function normalizePointer(pointer: string): string {\n if (pointer === \"\") {\n return \"root\";\n }\n return pointer.replace(/^\\//, \"\").replace(/\\//g, \".\");\n}\n\n/**\n * Create a validation diagnostic\n */\nexport function createDiagnostic(\n pointer: string,\n message: string,\n keyword: string,\n severity: \"ERROR\" | \"WARN\" = \"ERROR\",\n source: \"ajv\" | \"goneat\" = \"ajv\",\n data?: unknown,\n): SchemaValidationDiagnostic {\n return {\n pointer,\n message,\n keyword,\n severity,\n source,\n data,\n };\n}\n\n/**\n * Group diagnostics by severity\n */\nexport function groupDiagnosticsBySeverity(diagnostics: SchemaValidationDiagnostic[]): {\n errors: SchemaValidationDiagnostic[];\n warnings: SchemaValidationDiagnostic[];\n} {\n return {\n errors: diagnostics.filter((d) => d.severity === \"ERROR\"),\n warnings: diagnostics.filter((d) => d.severity === \"WARN\"),\n };\n}\n\n/**\n * Count diagnostics by severity\n */\nexport function countDiagnostics(diagnostics: SchemaValidationDiagnostic[]): {\n total: number;\n errors: number;\n warnings: number;\n} {\n const grouped = groupDiagnosticsBySeverity(diagnostics);\n return {\n total: diagnostics.length,\n errors: grouped.errors.length,\n warnings: grouped.warnings.length,\n };\n}\n","/**\n * Goneat bridge - Optional integration for CLI-only goneat validation\n *\n * Provides goneat validation as an opt-in alternative for CLI exploration.\n * NOT used by library consumers - AJV validation is the primary implementation.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { access } from \"node:fs/promises\";\nimport type { SchemaValidationDiagnostic, SchemaValidationResult } from \"./types.js\";\nimport { createDiagnostic } from \"./utils.js\";\n\n/**\n * Goneat validation output structure\n */\ninterface GoneatValidationOutput {\n valid: boolean;\n errors?: Array<{\n path: string;\n message: string;\n keyword?: string;\n }>;\n}\n\n/**\n * Detect goneat binary location\n */\nexport async function detectGoneat(customPath?: string): Promise<string | null> {\n // Try custom path first\n if (customPath) {\n try {\n await access(customPath);\n return customPath;\n } catch {\n return null;\n }\n }\n\n // Try GONEAT_PATH environment variable\n if (process.env.GONEAT_PATH) {\n try {\n await access(process.env.GONEAT_PATH);\n return process.env.GONEAT_PATH;\n } catch {\n // Continue to next option\n }\n }\n\n // Try local bin/goneat\n try {\n await access(\"./bin/goneat\");\n return \"./bin/goneat\";\n } catch {\n // Continue to next option\n }\n\n // Try system PATH (assume 'goneat' command available)\n return \"goneat\";\n}\n\n/**\n * Check if goneat is available\n *\n * If goneatPath is provided, use it directly to test availability.\n * Otherwise, detect goneat location first.\n */\nexport async function isGoneatAvailable(goneatPath?: string): Promise<boolean> {\n let pathToTest: string | null;\n\n if (goneatPath) {\n // Use provided path directly - don't re-detect\n // This allows testing 'goneat' command from PATH\n pathToTest = goneatPath;\n } else {\n // Detect goneat location\n pathToTest = await detectGoneat();\n if (!pathToTest) return false;\n }\n\n return new Promise((resolve) => {\n const proc = spawn(pathToTest as string, [\"version\"], { stdio: \"ignore\" });\n\n // Timeout after 5 seconds to prevent hanging in CI\n const timeout = setTimeout(() => {\n proc.kill();\n resolve(false);\n }, 5000);\n\n proc.on(\"close\", (code) => {\n clearTimeout(timeout);\n resolve(code === 0);\n });\n proc.on(\"error\", () => {\n clearTimeout(timeout);\n resolve(false);\n });\n });\n}\n\n/**\n * Run goneat schema validation (CLI-only, opt-in)\n *\n * This is NOT used by library validation - it's purely for CLI comparison.\n * Library users get full AJV validation without goneat dependency.\n */\nexport async function runGoneatValidation(\n schemaPath: string,\n dataPath: string,\n goneatPath?: string,\n): Promise<SchemaValidationResult> {\n const detected = await detectGoneat(goneatPath);\n\n if (!detected) {\n return {\n valid: false,\n diagnostics: [\n createDiagnostic(\n \"\",\n \"goneat binary not found. Install goneat or specify path with --goneat-path\",\n \"goneat-unavailable\",\n \"ERROR\",\n \"goneat\",\n ),\n ],\n source: \"goneat\",\n };\n }\n\n // Check availability using the detected path directly\n if (!(await isGoneatAvailable(detected))) {\n return {\n valid: false,\n diagnostics: [\n createDiagnostic(\n \"\",\n `goneat binary found at '${detected}' but not executable or version check failed`,\n \"goneat-not-executable\",\n \"ERROR\",\n \"goneat\",\n ),\n ],\n source: \"goneat\",\n };\n }\n\n return new Promise((resolve) => {\n const args = [\n \"schema\",\n \"validate\",\n \"--schema\",\n schemaPath,\n \"--data\",\n dataPath,\n \"--format\",\n \"json\",\n ];\n const proc = spawn(detected, args);\n\n let stdout = \"\";\n let stderr = \"\";\n\n proc.stdout.on(\"data\", (data) => {\n stdout += data.toString();\n });\n\n proc.stderr.on(\"data\", (data) => {\n stderr += data.toString();\n });\n\n proc.on(\"close\", (code: number | null) => {\n // Parse goneat output\n let output: GoneatValidationOutput;\n\n try {\n output = JSON.parse(stdout) as GoneatValidationOutput;\n } catch {\n // Failed to parse output, treat as error\n resolve({\n valid: false,\n diagnostics: [\n createDiagnostic(\n \"\",\n `goneat validation failed: ${stderr || \"unknown error\"}`,\n \"goneat-error\",\n \"ERROR\",\n \"goneat\",\n ),\n ],\n source: \"goneat\",\n });\n return;\n }\n\n // Convert goneat errors to our diagnostic format\n const diagnostics: SchemaValidationDiagnostic[] =\n output.errors?.map((error) =>\n createDiagnostic(\n error.path || \"\",\n error.message,\n error.keyword || \"validation\",\n \"ERROR\",\n \"goneat\",\n ),\n ) || [];\n\n resolve({\n valid: code === 0 && output.valid,\n diagnostics,\n source: \"goneat\",\n });\n });\n\n proc.on(\"error\", (error) => {\n resolve({\n valid: false,\n diagnostics: [\n createDiagnostic(\n \"\",\n `Failed to execute goneat: ${error.message}`,\n \"goneat-spawn-error\",\n \"ERROR\",\n \"goneat\",\n ),\n ],\n source: \"goneat\",\n });\n });\n });\n}\n","/**\n * Schema normalizer - implements schema normalization per Fulmen standard\n *\n * Provides utilities for canonicalizing and comparing schemas across\n * JSON and YAML formats with comment preservation and deterministic output.\n */\n\nimport { parse as parseYAML } from \"yaml\";\nimport { SchemaValidationError } from \"./errors.js\";\nimport type { SchemaInput, SchemaNormalizationOptions } from \"./types.js\";\n\n/**\n * Parse schema input to object\n */\nfunction parseSchemaInput(input: SchemaInput): Record<string, unknown> {\n if (!input) {\n throw SchemaValidationError.parseFailed(\n { type: \"string\", content: \"\" },\n new Error(\"schema content is empty\"),\n );\n }\n\n try {\n if (typeof input === \"string\") {\n // Try JSON first, fall back to YAML\n try {\n return JSON.parse(input) as Record<string, unknown>;\n } catch {\n return parseYAML(input) as Record<string, unknown>;\n }\n }\n\n if (Buffer.isBuffer(input)) {\n const content = input.toString(\"utf-8\");\n try {\n return JSON.parse(content) as Record<string, unknown>;\n } catch {\n return parseYAML(content) as Record<string, unknown>;\n }\n }\n\n // Already an object\n return input as Record<string, unknown>;\n } catch (error) {\n throw SchemaValidationError.parseFailed(\n {\n type: typeof input === \"string\" ? \"string\" : \"object\",\n content: typeof input === \"string\" ? input : JSON.stringify(input),\n },\n error as Error,\n );\n }\n}\n\n/**\n * Sort object keys recursively in lexicographical order\n */\nfunction sortObjectKeys(obj: unknown): unknown {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sortObjectKeys);\n }\n\n const sorted: Record<string, unknown> = {};\n const keys = Object.keys(obj).sort();\n\n for (const key of keys) {\n sorted[key] = sortObjectKeys((obj as Record<string, unknown>)[key]);\n }\n\n return sorted;\n}\n\n/**\n * Normalize schema to canonical JSON format\n *\n * Per Fulmen Schema Normalization Standard:\n * - Accepts YAML or JSON input\n * - Strips comments while preserving semantic structure\n * - Sorts keys lexicographically\n * - Produces deterministic, pretty-printed JSON (or compact if requested)\n */\nexport function normalizeSchema(\n input: SchemaInput,\n options: SchemaNormalizationOptions = {},\n): string {\n try {\n // Parse input to object\n const parsed = parseSchemaInput(input);\n\n // Sort keys recursively\n const sorted = sortObjectKeys(parsed);\n\n // Serialize to JSON with optional compact mode\n if (options.compact) {\n return JSON.stringify(sorted);\n }\n\n // Default: pretty-printed with 2-space indentation\n return JSON.stringify(sorted, null, 2);\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n throw SchemaValidationError.parseFailed(\n {\n type: typeof input === \"string\" ? \"string\" : \"object\",\n content: typeof input === \"string\" ? input : JSON.stringify(input),\n },\n error as Error,\n );\n }\n}\n\n/**\n * Compare two schemas for semantic equality\n *\n * Normalizes both schemas and compares the canonical JSON output.\n * Returns equality result along with normalized versions for debugging.\n */\nexport function compareSchemas(\n schemaA: SchemaInput,\n schemaB: SchemaInput,\n options: SchemaNormalizationOptions = {},\n): { equal: boolean; normalizedA: string; normalizedB: string } {\n const normalizedA = normalizeSchema(schemaA, options);\n const normalizedB = normalizeSchema(schemaB, options);\n\n return {\n equal: normalizedA === normalizedB,\n normalizedA,\n normalizedB,\n };\n}\n","/**\n * Schema registry - implements schema discovery and metadata extraction\n */\n\nimport { access, readFile } from \"node:fs/promises\";\nimport { dirname, extname, join, relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport glob from \"fast-glob\";\nimport { parse as parseYAML } from \"yaml\";\nimport { SchemaValidationError } from \"./errors.js\";\nimport type { SchemaFormat, SchemaMetadata, SchemaRegistryOptions } from \"./types.js\";\n\n/**\n * Default schema file patterns\n */\nconst DEFAULT_PATTERNS = [\"**/*.schema.json\", \"**/*.schema.yaml\", \"**/*.schema.yml\"];\n\n/**\n * Schema registry class for managing schema discovery and metadata\n */\nexport class SchemaRegistry {\n private schemas: Map<string, SchemaMetadata> = new Map();\n private options: SchemaRegistryOptions;\n\n constructor(options: SchemaRegistryOptions = {}) {\n this.options = {\n baseDir: options.baseDir || this.getDefaultSchemaDir(),\n patterns: options.patterns || DEFAULT_PATTERNS,\n followSymlinks: options.followSymlinks ?? false,\n maxDepth: options.maxDepth ?? 10,\n };\n }\n\n /**\n * Get default schema directory using import.meta.url\n */\n private getDefaultSchemaDir(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n // From src/schema/ we need to go up 2 levels to repo root, then into schemas/crucible-ts\n return join(__dirname, \"..\", \"..\", \"schemas\", \"crucible-ts\");\n }\n\n /**\n * Build logical schema ID from file path\n */\n private buildSchemaId(filePath: string, baseDir: string): string {\n const relativePath = relative(baseDir, filePath);\n const withoutExt = relativePath.replace(/\\.(schema\\.(json|yaml|yml))$/, \"\");\n return withoutExt.replace(/\\\\/g, \"/\"); // Normalize path separators\n }\n\n /**\n * Extract schema format from file extension\n */\n private getSchemaFormat(filePath: string): SchemaFormat {\n const ext = extname(filePath).toLowerCase();\n switch (ext) {\n case \".json\":\n return \"json\";\n case \".yaml\":\n case \".yml\":\n return \"yaml\";\n default:\n return \"json\"; // Default fallback\n }\n }\n\n /**\n * Extract metadata from schema file\n */\n private async extractMetadata(filePath: string): Promise<SchemaMetadata> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n const format = this.getSchemaFormat(filePath);\n\n let parsed: Record<string, unknown>;\n if (format === \"yaml\") {\n parsed = parseYAML(content) as Record<string, unknown>;\n } else {\n parsed = JSON.parse(content) as Record<string, unknown>;\n }\n\n const baseDir = this.options.baseDir ?? \"\";\n const relativePath = relative(baseDir, filePath);\n\n return {\n id: this.buildSchemaId(filePath, baseDir),\n path: filePath,\n relativePath: relativePath,\n format,\n version: (parsed.$schema as string) || (parsed.version as string),\n description: (parsed.title as string) || (parsed.description as string),\n schemaDraft: parsed.$schema as string,\n };\n } catch (error) {\n throw SchemaValidationError.registryError(\n \"metadata extraction\",\n `Failed to process ${filePath}: ${(error as Error).message}`,\n );\n }\n }\n\n /**\n * Discover and index all available schemas\n */\n async discoverSchemas(): Promise<void> {\n try {\n const baseDir = this.options.baseDir ?? \"\";\n const patterns = this.options.patterns ?? [];\n\n if (patterns.length === 0) {\n this.schemas.clear();\n return;\n }\n\n const pattern = patterns.map((p) => join(baseDir, p));\n\n // Check if base directory exists\n try {\n await access(baseDir);\n } catch {\n // Base directory doesn't exist, clear registry and return\n this.schemas.clear();\n return;\n }\n\n const files = await glob(pattern, {\n absolute: true,\n followSymbolicLinks: this.options.followSymlinks,\n deep: this.options.maxDepth,\n onlyFiles: true,\n suppressErrors: true, // Don't throw on permission errors\n });\n\n // Clear existing schemas\n this.schemas.clear();\n\n // Process each schema file\n for (const filePath of files) {\n try {\n const metadata = await this.extractMetadata(filePath);\n this.schemas.set(metadata.id, metadata);\n } catch (error) {\n // Log error but continue processing other schemas\n console.warn(`Warning: Failed to process schema ${filePath}:`, error);\n }\n }\n } catch (error) {\n throw SchemaValidationError.registryError(\"discovery\", (error as Error).message);\n }\n }\n\n /**\n * List available schemas with optional prefix filtering\n */\n async listSchemas(prefix?: string): Promise<SchemaMetadata[]> {\n if (this.schemas.size === 0) {\n await this.discoverSchemas();\n }\n\n const schemas = Array.from(this.schemas.values());\n\n if (prefix) {\n return schemas.filter((schema) => schema.id.startsWith(prefix));\n }\n\n return schemas;\n }\n\n /**\n * Get schema by logical ID\n */\n async getSchema(id: string): Promise<SchemaMetadata> {\n if (this.schemas.size === 0) {\n await this.discoverSchemas();\n }\n\n const schema = this.schemas.get(id);\n if (!schema) {\n throw SchemaValidationError.schemaNotFound(id);\n }\n\n return schema;\n }\n\n /**\n * Get schema by file path\n */\n async getSchemaByPath(filePath: string): Promise<SchemaMetadata> {\n if (this.schemas.size === 0) {\n await this.discoverSchemas();\n }\n\n const absolutePath = filePath.startsWith(\"/\") ? filePath : join(process.cwd(), filePath);\n\n for (const schema of this.schemas.values()) {\n if (schema.path === absolutePath) {\n return schema;\n }\n }\n\n throw SchemaValidationError.schemaNotFound(filePath);\n }\n\n /**\n * Check if schema exists\n */\n async hasSchema(id: string): Promise<boolean> {\n if (this.schemas.size === 0) {\n await this.discoverSchemas();\n }\n\n return this.schemas.has(id);\n }\n\n /**\n * Get registry size\n */\n get size(): number {\n return this.schemas.size;\n }\n\n /**\n * Clear registry cache\n */\n clear(): void {\n this.schemas.clear();\n }\n}\n\n/**\n * Global schema registry instance with cached options\n */\nlet globalRegistry: SchemaRegistry | undefined;\nlet globalRegistryOptions: SchemaRegistryOptions | undefined;\n\n/**\n * Check if registry options have changed\n */\nfunction optionsChanged(newOptions?: SchemaRegistryOptions): boolean {\n if (!newOptions && !globalRegistryOptions) return false;\n if (!newOptions || !globalRegistryOptions) return true;\n\n return (\n newOptions.baseDir !== globalRegistryOptions.baseDir ||\n JSON.stringify(newOptions.patterns) !== JSON.stringify(globalRegistryOptions.patterns) ||\n newOptions.followSymlinks !== globalRegistryOptions.followSymlinks ||\n newOptions.maxDepth !== globalRegistryOptions.maxDepth\n );\n}\n\n/**\n * Get or create global schema registry, rebuilding if options change\n */\nexport function getSchemaRegistry(options?: SchemaRegistryOptions): SchemaRegistry {\n if (!globalRegistry || optionsChanged(options)) {\n globalRegistry = new SchemaRegistry(options);\n globalRegistryOptions = options;\n }\n return globalRegistry;\n}\n\n/**\n * List available schemas with optional prefix filtering\n */\nexport async function listSchemas(\n prefix?: string,\n options?: SchemaRegistryOptions,\n): Promise<SchemaMetadata[]> {\n const registry = getSchemaRegistry(options);\n return registry.listSchemas(prefix);\n}\n\n/**\n * Get schema by logical ID\n */\nexport async function getSchema(\n id: string,\n options?: SchemaRegistryOptions,\n): Promise<SchemaMetadata> {\n const registry = getSchemaRegistry(options);\n return registry.getSchema(id);\n}\n\n/**\n * Get schema by file path\n */\nexport async function getSchemaByPath(\n filePath: string,\n options?: SchemaRegistryOptions,\n): Promise<SchemaMetadata> {\n const registry = getSchemaRegistry(options);\n return registry.getSchemaByPath(filePath);\n}\n\n/**\n * Check if schema exists\n */\nexport async function hasSchema(id: string, options?: SchemaRegistryOptions): Promise<boolean> {\n const registry = getSchemaRegistry(options);\n return registry.hasSchema(id);\n}\n","/**\n * Counter metric implementation\n *\n * Monotonically increasing counter for counting events\n */\n\nimport type { MetricName } from \"./types.js\";\n\n/**\n * Counter metric\n *\n * Monotonically increasing value for counting events.\n * Supports labeled metrics (Crucible v0.2.7+).\n * Use for metrics like request counts, error counts, etc.\n */\nexport class Counter {\n private value = 0;\n private labeledValues = new Map<string, number>();\n\n constructor(public readonly name: MetricName) {}\n\n /**\n * Increment counter by delta (default: 1)\n *\n * @param delta - Amount to increment (must be non-negative)\n * @param labels - Optional label dimensions for this observation\n * @throws {Error} If delta is negative\n *\n * @example\n * ```typescript\n * counter.inc(); // Increment unlabeled by 1\n * counter.inc(5); // Increment unlabeled by 5\n * counter.inc(1, { status: '200' }); // Increment labeled instance\n * counter.inc(1, { result: 'success' }); // Different label set\n * ```\n */\n inc(delta = 1, labels?: Record<string, string>): void {\n if (delta < 0) {\n throw new Error(`Counter delta must be non-negative, got: ${delta}`);\n }\n\n if (labels && Object.keys(labels).length > 0) {\n // Labeled metric - track per label combination\n const labelKey = this.serializeLabels(labels);\n const current = this.labeledValues.get(labelKey) || 0;\n this.labeledValues.set(labelKey, current + delta);\n } else {\n // Unlabeled metric\n this.value += delta;\n }\n }\n\n /**\n * Get current counter value (unlabeled)\n */\n getValue(): number {\n return this.value;\n }\n\n /**\n * Get all labeled values\n * @returns Map of serialized label keys to values\n */\n getLabeledValues(): Map<string, number> {\n return new Map(this.labeledValues);\n }\n\n /**\n * Get value for specific label combination\n */\n getValueForLabels(labels: Record<string, string>): number {\n const labelKey = this.serializeLabels(labels);\n return this.labeledValues.get(labelKey) || 0;\n }\n\n /**\n * Reset counter to zero (all label combinations)\n */\n reset(): void {\n this.value = 0;\n this.labeledValues.clear();\n }\n\n /**\n * Serialize labels to deterministic string key\n * Format: key1=value1,key2=value2 (sorted by key)\n */\n private serializeLabels(labels: Record<string, string>): string {\n return Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join(\",\");\n }\n}\n","/**\n * Gauge metric implementation\n *\n * Gauge for arbitrary values that can go up and down\n */\n\nimport type { MetricName } from \"./types.js\";\n\n/**\n * Gauge metric\n *\n * Arbitrary value that can increase or decrease.\n * Supports labeled metrics (Crucible v0.2.7+).\n * Use for metrics like current connections, memory usage, temperature, etc.\n */\nexport class Gauge {\n private value = 0;\n private labeledValues = new Map<string, number>();\n\n constructor(public readonly name: MetricName) {}\n\n /**\n * Set gauge to specific value\n *\n * @param value - New gauge value (can be any number, including negative)\n * @param labels - Optional label dimensions for this observation\n *\n * @example\n * ```typescript\n * gauge.set(42); // Set unlabeled to 42\n * gauge.set(-10); // Negative values allowed\n * gauge.set(1, { phase: 'collect' }); // Set labeled instance\n * ```\n */\n set(value: number, labels?: Record<string, string>): void {\n if (labels && Object.keys(labels).length > 0) {\n const labelKey = this.serializeLabels(labels);\n this.labeledValues.set(labelKey, value);\n } else {\n this.value = value;\n }\n }\n\n /**\n * Increment gauge by delta (default: 1)\n *\n * @param delta - Amount to increment (can be negative)\n * @param labels - Optional label dimensions for this observation\n */\n inc(delta = 1, labels?: Record<string, string>): void {\n if (labels && Object.keys(labels).length > 0) {\n const labelKey = this.serializeLabels(labels);\n const current = this.labeledValues.get(labelKey) || 0;\n this.labeledValues.set(labelKey, current + delta);\n } else {\n this.value += delta;\n }\n }\n\n /**\n * Decrement gauge by delta (default: 1)\n *\n * @param delta - Amount to decrement (can be negative)\n * @param labels - Optional label dimensions for this observation\n */\n dec(delta = 1, labels?: Record<string, string>): void {\n if (labels && Object.keys(labels).length > 0) {\n const labelKey = this.serializeLabels(labels);\n const current = this.labeledValues.get(labelKey) || 0;\n this.labeledValues.set(labelKey, current - delta);\n } else {\n this.value -= delta;\n }\n }\n\n /**\n * Get current gauge value (unlabeled)\n */\n getValue(): number {\n return this.value;\n }\n\n /**\n * Get all labeled values\n * @returns Map of serialized label keys to values\n */\n getLabeledValues(): Map<string, number> {\n return new Map(this.labeledValues);\n }\n\n /**\n * Get value for specific label combination\n */\n getValueForLabels(labels: Record<string, string>): number {\n const labelKey = this.serializeLabels(labels);\n return this.labeledValues.get(labelKey) || 0;\n }\n\n /**\n * Reset gauge to zero (all label combinations)\n */\n reset(): void {\n this.value = 0;\n this.labeledValues.clear();\n }\n\n /**\n * Serialize labels to deterministic string key\n * Format: key1=value1,key2=value2 (sorted by key)\n */\n private serializeLabels(labels: Record<string, string>): string {\n return Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join(\",\");\n }\n}\n","/**\n * Taxonomy loader for metrics definitions\n *\n * Loads and caches metrics taxonomy from config/crucible-ts/taxonomy/metrics.yaml\n * Provides default histogram buckets per ADR-0007\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { MetricName, MetricUnit } from \"./types.js\";\n\n/**\n * Metric definition from taxonomy\n */\nexport interface MetricDefinition {\n name: MetricName;\n unit: MetricUnit;\n description: string;\n}\n\n/**\n * Taxonomy structure\n */\nexport interface MetricsTaxonomy {\n version: string;\n defaults: {\n histogram_buckets: {\n ms_metrics: number[];\n };\n };\n metrics: MetricDefinition[];\n}\n\n/**\n * Default histogram buckets for _ms metrics (ADR-0007)\n * [1, 5, 10, 50, 100, 500, 1000, 5000, 10000] milliseconds\n */\nexport const DEFAULT_MS_BUCKETS = [1, 5, 10, 50, 100, 500, 1000, 5000, 10000];\n\n/**\n * Singleton taxonomy loader\n */\nclass TaxonomyLoader {\n private static instance: TaxonomyLoader;\n private taxonomy: MetricsTaxonomy | null = null;\n private loadPromise: Promise<MetricsTaxonomy> | null = null;\n private loadError: Error | null = null;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get singleton instance\n */\n static getInstance(): TaxonomyLoader {\n if (!TaxonomyLoader.instance) {\n TaxonomyLoader.instance = new TaxonomyLoader();\n }\n return TaxonomyLoader.instance;\n }\n\n /**\n * Load taxonomy from YAML file\n */\n private async load(): Promise<MetricsTaxonomy> {\n if (this.taxonomy !== null) {\n return this.taxonomy;\n }\n\n if (this.loadError !== null) {\n throw this.loadError;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n try {\n // Resolve path to taxonomy file\n // From src/telemetry/ → ../../config/crucible-ts/taxonomy/metrics.yaml\n const taxonomyPath = join(\n __dirname,\n \"..\",\n \"..\",\n \"config\",\n \"crucible-ts\",\n \"taxonomy\",\n \"metrics.yaml\",\n );\n\n const content = await readFile(taxonomyPath, \"utf-8\");\n this.taxonomy = parseYaml(content) as MetricsTaxonomy;\n\n return this.taxonomy;\n } catch (err) {\n this.loadError = err instanceof Error ? err : new Error(String(err));\n throw new Error(`Failed to load metrics taxonomy: ${this.loadError.message}`);\n }\n })();\n\n return this.loadPromise;\n }\n\n /**\n * Get taxonomy (async)\n */\n async getTaxonomy(): Promise<MetricsTaxonomy> {\n return this.load();\n }\n\n /**\n * Get metric definition by name\n */\n async getMetric(name: MetricName): Promise<MetricDefinition | undefined> {\n const taxonomy = await this.load();\n return taxonomy.metrics.find((m) => m.name === name);\n }\n\n /**\n * Get default unit for metric\n */\n async getDefaultUnit(name: MetricName): Promise<MetricUnit | undefined> {\n const metric = await this.getMetric(name);\n return metric?.unit;\n }\n\n /**\n * Get default histogram buckets for metric\n * Returns ADR-0007 buckets for _ms metrics, undefined for others\n */\n async getDefaultBuckets(name: MetricName): Promise<number[] | undefined> {\n // Check if metric name ends with _ms\n if (name.endsWith(\"_ms\")) {\n const taxonomy = await this.load();\n return taxonomy.defaults.histogram_buckets.ms_metrics;\n }\n return undefined;\n }\n\n /**\n * Check if metric name is valid (exists in taxonomy)\n */\n async isValidMetricName(name: string): Promise<boolean> {\n try {\n const taxonomy = await this.load();\n return taxonomy.metrics.some((m) => m.name === name);\n } catch {\n return false;\n }\n }\n\n /**\n * Reset loader state (for testing)\n * @internal\n */\n static _reset(): void {\n TaxonomyLoader.instance = new TaxonomyLoader();\n }\n}\n\n/**\n * Get metrics taxonomy\n *\n * @returns Promise resolving to taxonomy\n */\nexport async function getTaxonomy(): Promise<MetricsTaxonomy> {\n return TaxonomyLoader.getInstance().getTaxonomy();\n}\n\n/**\n * Get metric definition by name\n *\n * @param name - Metric name\n * @returns Promise resolving to metric definition or undefined\n */\nexport async function getMetric(name: MetricName): Promise<MetricDefinition | undefined> {\n return TaxonomyLoader.getInstance().getMetric(name);\n}\n\n/**\n * Get default unit for metric from taxonomy\n *\n * @param name - Metric name\n * @returns Promise resolving to unit or undefined\n */\nexport async function getDefaultUnit(name: MetricName): Promise<MetricUnit | undefined> {\n return TaxonomyLoader.getInstance().getDefaultUnit(name);\n}\n\n/**\n * Get default histogram buckets for metric\n *\n * Returns ADR-0007 buckets ([1, 5, 10, 50, 100, 500, 1000, 5000, 10000]) for\n * metrics ending with _ms, undefined for others.\n *\n * @param name - Metric name\n * @returns Promise resolving to bucket array or undefined\n *\n * @example\n * ```typescript\n * const buckets = await getDefaultBuckets('config_load_ms');\n * // Returns [1, 5, 10, 50, 100, 500, 1000, 5000, 10000]\n * ```\n */\nexport async function getDefaultBuckets(name: MetricName): Promise<number[] | undefined> {\n return TaxonomyLoader.getInstance().getDefaultBuckets(name);\n}\n\n/**\n * Check if metric name is valid (exists in taxonomy)\n *\n * @param name - Metric name to check\n * @returns Promise resolving to true if valid\n */\nexport async function isValidMetricName(name: string): Promise<boolean> {\n return TaxonomyLoader.getInstance().isValidMetricName(name);\n}\n\n// Export for testing\nexport { TaxonomyLoader };\n","/**\n * Histogram metric implementation\n *\n * Histogram with OTLP-compatible cumulative buckets, auto-applying ADR-0007\n * default buckets for _ms metrics.\n */\n\nimport { DEFAULT_MS_BUCKETS } from \"./taxonomy.js\";\nimport type { HistogramBucket, HistogramOptions, HistogramSummary, MetricName } from \"./types.js\";\n\n/**\n * Labeled histogram state\n */\ninterface LabeledHistogramState {\n count: number;\n sum: number;\n bucketCounts: Map<number, number>;\n}\n\n/**\n * Histogram metric\n *\n * Tracks distribution of values using cumulative buckets (OTLP-compatible).\n * Automatically applies ADR-0007 default buckets for _ms metrics.\n * Supports labeled metrics (Crucible v0.2.7+).\n */\nexport class Histogram {\n private count = 0;\n private sum = 0;\n private bucketCounts: Map<number, number> = new Map();\n private labeledStates = new Map<string, LabeledHistogramState>();\n private readonly buckets: number[];\n\n constructor(\n public readonly name: MetricName,\n options?: HistogramOptions,\n ) {\n // Determine buckets: custom > ADR-0007 defaults for _ms metrics > empty\n if (options?.buckets) {\n this.buckets = [...options.buckets].sort((a, b) => a - b);\n } else if (name.endsWith(\"_ms\") || name.endsWith(\"_seconds\")) {\n this.buckets = [...DEFAULT_MS_BUCKETS];\n } else {\n this.buckets = [];\n }\n\n // Initialize bucket counts\n for (const bucket of this.buckets) {\n this.bucketCounts.set(bucket, 0);\n }\n }\n\n /**\n * Record an observation\n *\n * @param value - Value to observe (typically a duration in ms or seconds)\n * @param labels - Optional label dimensions for this observation\n *\n * @example\n * ```typescript\n * const start = performance.now();\n * // ... operation ...\n * histogram.observe(performance.now() - start);\n * histogram.observe(duration, { phase: 'collect', result: 'success' });\n * ```\n */\n observe(value: number, labels?: Record<string, string>): void {\n if (labels && Object.keys(labels).length > 0) {\n // Labeled observation\n const labelKey = this.serializeLabels(labels);\n let state = this.labeledStates.get(labelKey);\n\n if (!state) {\n // Initialize new labeled state\n state = {\n count: 0,\n sum: 0,\n bucketCounts: new Map(),\n };\n for (const bucket of this.buckets) {\n state.bucketCounts.set(bucket, 0);\n }\n this.labeledStates.set(labelKey, state);\n }\n\n state.count++;\n state.sum += value;\n\n // Update cumulative bucket counts\n for (const bucket of this.buckets) {\n if (value <= bucket) {\n state.bucketCounts.set(bucket, (state.bucketCounts.get(bucket) || 0) + 1);\n }\n }\n } else {\n // Unlabeled observation\n this.count++;\n this.sum += value;\n\n // Update cumulative bucket counts\n for (const bucket of this.buckets) {\n if (value <= bucket) {\n this.bucketCounts.set(bucket, (this.bucketCounts.get(bucket) || 0) + 1);\n }\n }\n }\n }\n\n /**\n * Get histogram summary\n *\n * Returns OTLP-compatible histogram summary with cumulative bucket counts.\n */\n getSummary(): HistogramSummary {\n const buckets: HistogramBucket[] = this.buckets.map((le) => ({\n le,\n count: this.bucketCounts.get(le) || 0,\n }));\n\n return {\n count: this.count,\n sum: this.sum,\n buckets,\n };\n }\n\n /**\n * Get current observation count\n */\n getCount(): number {\n return this.count;\n }\n\n /**\n * Get sum of all observed values\n */\n getSum(): number {\n return this.sum;\n }\n\n /**\n * Get average of observed values\n */\n getAverage(): number {\n return this.count > 0 ? this.sum / this.count : 0;\n }\n\n /**\n * Get all labeled summaries\n * @returns Map of serialized label keys to histogram summaries\n */\n getLabeledSummaries(): Map<string, HistogramSummary> {\n const summaries = new Map<string, HistogramSummary>();\n\n for (const [labelKey, state] of this.labeledStates) {\n const buckets: HistogramBucket[] = this.buckets.map((le) => ({\n le,\n count: state.bucketCounts.get(le) || 0,\n }));\n\n summaries.set(labelKey, {\n count: state.count,\n sum: state.sum,\n buckets,\n });\n }\n\n return summaries;\n }\n\n /**\n * Get summary for specific label combination\n */\n getSummaryForLabels(labels: Record<string, string>): HistogramSummary | null {\n const labelKey = this.serializeLabels(labels);\n const state = this.labeledStates.get(labelKey);\n\n if (!state) {\n return null;\n }\n\n const buckets: HistogramBucket[] = this.buckets.map((le) => ({\n le,\n count: state.bucketCounts.get(le) || 0,\n }));\n\n return {\n count: state.count,\n sum: state.sum,\n buckets,\n };\n }\n\n /**\n * Reset histogram to initial state (all label combinations)\n */\n reset(): void {\n this.count = 0;\n this.sum = 0;\n for (const bucket of this.buckets) {\n this.bucketCounts.set(bucket, 0);\n }\n this.labeledStates.clear();\n }\n\n /**\n * Serialize labels to deterministic string key\n * Format: key1=value1,key2=value2 (sorted by key)\n */\n private serializeLabels(labels: Record<string, string>): string {\n return Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join(\",\");\n }\n}\n","/**\n * Metrics registry - central registry for all metrics\n *\n * Provides singleton registry for counters, gauges, and histograms.\n * Exports events in schema-compliant format.\n */\n\nimport { Counter } from \"./counter.js\";\nimport { Gauge } from \"./gauge.js\";\nimport { Histogram } from \"./histogram.js\";\nimport { getDefaultUnit } from \"./taxonomy.js\";\nimport type { FlushOptions, HistogramOptions, MetricName, MetricsEvent } from \"./types.js\";\n\n/**\n * Metrics registry\n *\n * Central registry for all metrics. Provides factory methods for counters,\n * gauges, and histograms. Exports metrics as schema-compliant events.\n */\nexport class MetricsRegistry {\n private counters: Map<MetricName, Counter> = new Map();\n private gauges: Map<MetricName, Gauge> = new Map();\n private histograms: Map<MetricName, Histogram> = new Map();\n\n /**\n * Get or create a counter\n *\n * @param name - Metric name from taxonomy\n * @returns Counter instance\n *\n * @example\n * ```typescript\n * const counter = registry.counter('schema_validations');\n * counter.inc();\n * ```\n */\n counter(name: MetricName): Counter {\n let counter = this.counters.get(name);\n if (!counter) {\n counter = new Counter(name);\n this.counters.set(name, counter);\n }\n return counter;\n }\n\n /**\n * Get or create a gauge\n *\n * @param name - Metric name from taxonomy\n * @returns Gauge instance\n *\n * @example\n * ```typescript\n * const gauge = registry.gauge('foundry_lookup_count');\n * gauge.set(42);\n * ```\n */\n gauge(name: MetricName): Gauge {\n let gauge = this.gauges.get(name);\n if (!gauge) {\n gauge = new Gauge(name);\n this.gauges.set(name, gauge);\n }\n return gauge;\n }\n\n /**\n * Get or create a histogram\n *\n * @param name - Metric name from taxonomy\n * @param options - Optional histogram options\n * @returns Histogram instance\n *\n * @example\n * ```typescript\n * // Auto-applies ADR-0007 buckets for _ms metrics\n * const histogram = registry.histogram('config_load_ms');\n * histogram.observe(42.5);\n *\n * // Custom buckets\n * const custom = registry.histogram('custom_metric', {\n * buckets: [10, 50, 100, 500, 1000]\n * });\n * ```\n */\n histogram(name: MetricName, options?: HistogramOptions): Histogram {\n let histogram = this.histograms.get(name);\n if (!histogram) {\n histogram = new Histogram(name, options);\n this.histograms.set(name, histogram);\n }\n return histogram;\n }\n\n /**\n * Export all metrics as events\n *\n * Returns array of schema-compliant MetricsEvent objects.\n * Does not clear metrics (use flush() to clear after export).\n *\n * @returns Promise resolving to array of metrics events\n *\n * @example\n * ```typescript\n * const events = await registry.export();\n * console.log(JSON.stringify(events, null, 2));\n * ```\n */\n async export(): Promise<MetricsEvent[]> {\n const events: MetricsEvent[] = [];\n const timestamp = new Date().toISOString();\n\n // Export counters (unlabeled + labeled) - Crucible v0.2.7+\n for (const [name, counter] of this.counters) {\n const unit = await getDefaultUnit(name);\n\n // Always export unlabeled value (for backwards compatibility)\n events.push({\n timestamp,\n name,\n value: counter.getValue(),\n unit,\n });\n\n // Export labeled values (only if > 0)\n for (const [labelKey, value] of counter.getLabeledValues()) {\n if (value > 0) {\n const tags = this.deserializeLabels(labelKey);\n events.push({\n timestamp,\n name,\n value,\n tags,\n unit,\n });\n }\n }\n }\n\n // Export gauges (unlabeled + labeled) - Crucible v0.2.7+\n for (const [name, gauge] of this.gauges) {\n const unit = await getDefaultUnit(name);\n\n // Export unlabeled value (always export gauges, even if zero)\n events.push({\n timestamp,\n name,\n value: gauge.getValue(),\n unit,\n });\n\n // Export labeled values\n for (const [labelKey, value] of gauge.getLabeledValues()) {\n const tags = this.deserializeLabels(labelKey);\n events.push({\n timestamp,\n name,\n value,\n tags,\n unit,\n });\n }\n }\n\n // Export histograms (unlabeled + labeled) - Crucible v0.2.7+\n for (const [name, histogram] of this.histograms) {\n const unit = await getDefaultUnit(name);\n\n // Always export unlabeled summary (for backwards compatibility)\n events.push({\n timestamp,\n name,\n value: histogram.getSummary(),\n unit,\n });\n\n // Export labeled summaries (only if count > 0)\n for (const [labelKey, summary] of histogram.getLabeledSummaries()) {\n if (summary.count > 0) {\n const tags = this.deserializeLabels(labelKey);\n events.push({\n timestamp,\n name,\n value: summary,\n tags,\n unit,\n });\n }\n }\n }\n\n return events;\n }\n\n /**\n * Deserialize label key back to tags object\n * Format: key1=value1,key2=value2 → {key1: \"value1\", key2: \"value2\"}\n */\n private deserializeLabels(labelKey: string): Record<string, string> {\n if (!labelKey) {\n return {};\n }\n\n const tags: Record<string, string> = {};\n for (const pair of labelKey.split(\",\")) {\n const [key, value] = pair.split(\"=\");\n if (key && value) {\n tags[key] = value;\n }\n }\n return tags;\n }\n\n /**\n * Export and clear all metrics\n *\n * Exports metrics as events, optionally emits them via logger,\n * then resets all metrics to zero.\n *\n * @param options - Flush options\n * @returns Promise resolving to array of exported events\n *\n * @example\n * ```typescript\n * // Export and clear\n * const events = await registry.flush();\n *\n * // Export, emit to logger, and clear\n * const events = await registry.flush({\n * emit: (events) => console.log(JSON.stringify(events))\n * });\n * ```\n */\n async flush(options?: FlushOptions): Promise<MetricsEvent[]> {\n const events = await this.export();\n\n try {\n // Emit if logger provided\n if (options?.emit) {\n options.emit(events);\n }\n } finally {\n // Always clear metrics, even if emit throws\n this.clear();\n }\n\n return events;\n }\n\n /**\n * Clear all metrics (reset to zero)\n *\n * Resets all counters, gauges, and histograms to their initial state.\n */\n clear(): void {\n for (const counter of this.counters.values()) {\n counter.reset();\n }\n for (const gauge of this.gauges.values()) {\n gauge.reset();\n }\n for (const histogram of this.histograms.values()) {\n histogram.reset();\n }\n }\n\n /**\n * Get all registered metric names\n *\n * Returns array of all metric names that have been accessed\n * (counters, gauges, or histograms).\n */\n getMetricNames(): MetricName[] {\n const names = new Set<MetricName>();\n for (const name of this.counters.keys()) {\n names.add(name);\n }\n for (const name of this.gauges.keys()) {\n names.add(name);\n }\n for (const name of this.histograms.keys()) {\n names.add(name);\n }\n return Array.from(names);\n }\n\n /**\n * Get total count of registered metrics\n */\n getMetricCount(): number {\n return this.counters.size + this.gauges.size + this.histograms.size;\n }\n}\n","/**\n * Telemetry types - TypeScript types for metrics events\n *\n * Based on schemas/crucible-ts/observability/metrics/v1.0.0/metrics-event.schema.json\n * and config/crucible-ts/taxonomy/metrics.yaml\n */\n\n/**\n * Metric name from taxonomy\n * Aligned with config/crucible-ts/taxonomy/metrics.yaml#/$defs/metricName\n * Updated for Crucible v0.2.18 (HTTP server metrics)\n */\nexport type MetricName =\n // Core module metrics\n | \"schema_validations\"\n | \"schema_validation_errors\"\n | \"config_load_ms\"\n | \"config_load_errors\"\n | \"pathfinder_find_ms\"\n | \"pathfinder_validation_errors\"\n | \"pathfinder_security_warnings\"\n | \"foundry_lookup_count\"\n | \"logging_emit_count\"\n | \"logging_emit_latency_ms\"\n | \"goneat_command_duration_ms\"\n // Prometheus exporter metrics\n | \"prometheus_exporter_refresh_duration_seconds\"\n | \"prometheus_exporter_refresh_total\"\n | \"prometheus_exporter_refresh_errors_total\"\n | \"prometheus_exporter_refresh_inflight\"\n | \"prometheus_exporter_http_requests_total\"\n | \"prometheus_exporter_http_errors_total\"\n | \"prometheus_exporter_restarts_total\"\n // Foundry MIME detection metrics\n | \"foundry_mime_detections_total_json\"\n | \"foundry_mime_detections_total_xml\"\n | \"foundry_mime_detections_total_yaml\"\n | \"foundry_mime_detections_total_csv\"\n | \"foundry_mime_detections_total_plain_text\"\n | \"foundry_mime_detections_total_unknown\"\n | \"foundry_mime_detection_ms_json\"\n | \"foundry_mime_detection_ms_xml\"\n | \"foundry_mime_detection_ms_yaml\"\n | \"foundry_mime_detection_ms_csv\"\n | \"foundry_mime_detection_ms_plain_text\"\n | \"foundry_mime_detection_ms_unknown\"\n // Error handling metrics\n | \"error_handling_wraps_total\"\n | \"error_handling_wrap_ms\"\n // FulHash metrics\n | \"fulhash_operations_total_xxh3_128\"\n | \"fulhash_operations_total_sha256\"\n | \"fulhash_hash_string_total\"\n | \"fulhash_bytes_hashed_total\"\n | \"fulhash_operation_ms\"\n // HTTP server metrics (v0.2.18)\n | \"http_requests_total\"\n | \"http_request_duration_seconds\"\n | \"http_request_size_bytes\"\n | \"http_response_size_bytes\"\n | \"http_active_requests\";\n\n/**\n * Metric unit from taxonomy\n * Aligned with config/crucible-ts/taxonomy/metrics.yaml#/$defs/metricUnit\n * Updated for Crucible v0.2.7 (adds 's' for seconds)\n */\nexport type MetricUnit = \"count\" | \"ms\" | \"bytes\" | \"percent\" | \"s\";\n\n/**\n * Histogram bucket for OTLP-compatible histograms\n */\nexport interface HistogramBucket {\n /** Upper bound (less-than-or-equal) for the bucket */\n le: number;\n /** Cumulative count up to and including this bucket */\n count: number;\n}\n\n/**\n * Histogram summary payload\n */\nexport interface HistogramSummary {\n /** Total count of observations */\n count: number;\n /** Sum of all observed values */\n sum: number;\n /** Ordered buckets with cumulative counts (OTLP-compatible) */\n buckets: HistogramBucket[];\n}\n\n/**\n * Metric value (scalar or histogram)\n */\nexport type MetricValue = number | HistogramSummary;\n\n/**\n * Metrics event structure\n * Aligned with schemas/crucible-ts/observability/metrics/v1.0.0/metrics-event.schema.json\n */\nexport interface MetricsEvent {\n /** RFC3339 timestamp of metric emission */\n timestamp: string;\n /** Metric identifier from taxonomy */\n name: MetricName;\n /** Measurement payload (scalar or histogram summary) */\n value: MetricValue;\n /** Optional key/value dimensions */\n tags?: Record<string, string>;\n /** Optional metric unit (defaults to taxonomy default) */\n unit?: MetricUnit;\n}\n\n/**\n * Histogram options for customization\n */\nexport interface HistogramOptions {\n /** Custom bucket boundaries (overrides default ADR-0007 buckets) */\n buckets?: number[];\n}\n\n/**\n * Flush options for metrics registry\n */\nexport interface FlushOptions {\n /** Optional logger function to emit metrics */\n emit?: (events: MetricsEvent[]) => void;\n}\n\n/**\n * Type guard to check if value is a histogram summary\n */\nexport function isHistogramSummary(value: unknown): value is HistogramSummary {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"count\" in value &&\n \"sum\" in value &&\n \"buckets\" in value\n );\n}\n\n/**\n * Type guard to check if metric name is valid\n * Aligned with Crucible v0.2.18 taxonomy\n */\nexport function isValidMetricName(name: string): name is MetricName {\n const validNames: MetricName[] = [\n // Core module metrics\n \"schema_validations\",\n \"schema_validation_errors\",\n \"config_load_ms\",\n \"config_load_errors\",\n \"pathfinder_find_ms\",\n \"pathfinder_validation_errors\",\n \"pathfinder_security_warnings\",\n \"foundry_lookup_count\",\n \"logging_emit_count\",\n \"logging_emit_latency_ms\",\n \"goneat_command_duration_ms\",\n // Prometheus exporter metrics\n \"prometheus_exporter_refresh_duration_seconds\",\n \"prometheus_exporter_refresh_total\",\n \"prometheus_exporter_refresh_errors_total\",\n \"prometheus_exporter_refresh_inflight\",\n \"prometheus_exporter_http_requests_total\",\n \"prometheus_exporter_http_errors_total\",\n \"prometheus_exporter_restarts_total\",\n // Foundry MIME detection metrics\n \"foundry_mime_detections_total_json\",\n \"foundry_mime_detections_total_xml\",\n \"foundry_mime_detections_total_yaml\",\n \"foundry_mime_detections_total_csv\",\n \"foundry_mime_detections_total_plain_text\",\n \"foundry_mime_detections_total_unknown\",\n \"foundry_mime_detection_ms_json\",\n \"foundry_mime_detection_ms_xml\",\n \"foundry_mime_detection_ms_yaml\",\n \"foundry_mime_detection_ms_csv\",\n \"foundry_mime_detection_ms_plain_text\",\n \"foundry_mime_detection_ms_unknown\",\n // Error handling metrics\n \"error_handling_wraps_total\",\n \"error_handling_wrap_ms\",\n // FulHash metrics\n \"fulhash_operations_total_xxh3_128\",\n \"fulhash_operations_total_sha256\",\n \"fulhash_hash_string_total\",\n \"fulhash_bytes_hashed_total\",\n \"fulhash_operation_ms\",\n // HTTP server metrics\n \"http_requests_total\",\n \"http_request_duration_seconds\",\n \"http_request_size_bytes\",\n \"http_response_size_bytes\",\n \"http_active_requests\",\n ];\n return validNames.includes(name as MetricName);\n}\n\n/**\n * Type guard to check if unit is valid\n */\nexport function isValidMetricUnit(unit: string): unit is MetricUnit {\n const validUnits: MetricUnit[] = [\"count\", \"ms\", \"bytes\", \"percent\", \"s\"];\n return validUnits.includes(unit as MetricUnit);\n}\n","/**\n * Metrics event validators\n *\n * Schema validation for metrics events using existing src/schema infrastructure\n */\n\nimport { compileSchemaById } from \"../schema/index.js\";\nimport type { CompiledValidator } from \"../schema/types.js\";\n\n/**\n * Singleton validator for metrics events\n *\n * Pre-compiles the metrics-event schema at first access for optimal performance.\n * Reuses existing AJV setup from src/schema module.\n */\nclass MetricsValidator {\n private static instance: MetricsValidator;\n private validateFn: CompiledValidator | null = null;\n private initPromise: Promise<void> | null = null;\n private initError: Error | null = null;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get singleton instance\n */\n static getInstance(): MetricsValidator {\n if (!MetricsValidator.instance) {\n MetricsValidator.instance = new MetricsValidator();\n }\n return MetricsValidator.instance;\n }\n\n /**\n * Initialize validator (lazy load, async)\n */\n private async init(): Promise<void> {\n if (this.validateFn !== null || this.initError !== null) {\n return; // Already initialized\n }\n\n if (this.initPromise) {\n return this.initPromise; // Already initializing\n }\n\n this.initPromise = (async () => {\n try {\n // Compile schema using existing schema infrastructure\n this.validateFn = await compileSchemaById(\"observability/metrics/v1.0.0/metrics-event\");\n } catch (err) {\n this.initError = err instanceof Error ? err : new Error(String(err));\n throw new Error(`Failed to initialize metrics validator: ${this.initError.message}`);\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Validate metrics event against schema\n *\n * @param event - Metrics event to validate\n * @returns Promise resolving to true if valid, false otherwise\n */\n async validate(event: unknown): Promise<boolean> {\n if (this.validateFn === null) {\n await this.init();\n }\n\n if (this.initError) {\n throw this.initError;\n }\n\n if (!this.validateFn) {\n throw new Error(\"Validator not initialized\");\n }\n\n return this.validateFn(event);\n }\n\n /**\n * Get validation errors from last validation\n */\n getErrors() {\n if (!this.validateFn) {\n return null;\n }\n return this.validateFn.errors;\n }\n\n /**\n * Reset validator state (for testing)\n * @internal\n */\n static _reset(): void {\n MetricsValidator.instance = new MetricsValidator();\n }\n}\n\n/**\n * Validate metrics event against schema\n *\n * Uses pre-compiled validator singleton for optimal performance.\n *\n * @param event - Metrics event to validate\n * @returns Promise resolving to true if valid\n *\n * @example\n * ```typescript\n * const event: MetricsEvent = {\n * timestamp: new Date().toISOString(),\n * name: 'schema_validations',\n * value: 42\n * };\n *\n * if (await validateMetricsEvent(event)) {\n * // Event is schema-compliant\n * } else {\n * const errors = getValidationErrors();\n * console.error('Validation failed:', errors);\n * }\n * ```\n */\nexport async function validateMetricsEvent(event: unknown): Promise<boolean> {\n return MetricsValidator.getInstance().validate(event);\n}\n\n/**\n * Validate array of metrics events\n *\n * @param events - Array of metrics events\n * @returns Promise resolving to true if all valid\n */\nexport async function validateMetricsEvents(events: unknown[]): Promise<boolean> {\n for (const event of events) {\n if (!(await validateMetricsEvent(event))) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Get validation errors from last validation\n */\nexport function getValidationErrors() {\n return MetricsValidator.getInstance().getErrors();\n}\n\n/**\n * Format validation errors as human-readable string\n */\nexport function formatValidationErrors(\n errors: Array<{ instancePath?: string; message?: string }>,\n): string {\n return errors\n .map((err) => {\n const path = err.instancePath || \"(root)\";\n const message = err.message || \"validation failed\";\n return `${path}: ${message}`;\n })\n .join(\"; \");\n}\n\n/**\n * Assert that metrics event is valid (throws if not)\n *\n * @param event - Metrics event to validate\n * @throws {Error} If validation fails\n */\nexport async function assertValidMetricsEvent(event: unknown): Promise<void> {\n if (!(await validateMetricsEvent(event))) {\n const errors = getValidationErrors();\n const message = errors ? formatValidationErrors(errors) : \"Metrics event validation failed\";\n throw new Error(`Invalid metrics event: ${message}`);\n }\n}\n\n// Export for testing\nexport { MetricsValidator };\n","/**\n * Telemetry module - metrics collection and export\n *\n * Provides counter, gauge, and histogram metrics with schema validation\n * and taxonomy-based defaults (ADR-0007).\n */\n\nexport const VERSION = \"1.0.0\";\n\n// Core registry and singleton\nexport { MetricsRegistry } from \"./registry.js\";\n\nimport { MetricsRegistry } from \"./registry.js\";\n\n/**\n * Default singleton metrics registry\n *\n * Use this for application-wide metrics collection.\n *\n * @example\n * ```typescript\n * import { metrics } from '@fulmenhq/tsfulmen/telemetry';\n *\n * // Increment counter\n * metrics.counter('schema_validations').inc();\n *\n * // Record histogram observation\n * metrics.histogram('config_load_ms').observe(42.5);\n *\n * // Export all metrics\n * const events = await metrics.export();\n * ```\n */\nexport const metrics = new MetricsRegistry();\n\n// Metric types\nexport { Counter } from \"./counter.js\";\nexport { Gauge } from \"./gauge.js\";\nexport { Histogram } from \"./histogram.js\";\n// Taxonomy\nexport type { MetricDefinition, MetricsTaxonomy } from \"./taxonomy.js\";\nexport {\n DEFAULT_MS_BUCKETS,\n getDefaultBuckets,\n getDefaultUnit,\n getMetric,\n getTaxonomy,\n isValidMetricName as isValidMetricNameTaxonomy,\n} from \"./taxonomy.js\";\n// Types\nexport type {\n FlushOptions,\n HistogramBucket,\n HistogramOptions,\n HistogramSummary,\n MetricName,\n MetricsEvent,\n MetricUnit,\n MetricValue,\n} from \"./types.js\";\nexport {\n isHistogramSummary,\n isValidMetricName,\n isValidMetricUnit,\n} from \"./types.js\";\n\n// Validators\nexport {\n assertValidMetricsEvent,\n formatValidationErrors,\n getValidationErrors,\n validateMetricsEvent,\n validateMetricsEvents,\n} from \"./validators.js\";\n","/**\n * Schema validator - implements AJV-based schema validation with goneat integration\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AnySchema } from \"ajv\";\nimport Ajv from \"ajv\";\nimport Ajv2019 from \"ajv/dist/2019.js\";\nimport Ajv2020 from \"ajv/dist/2020.js\";\nimport AjvDraft04 from \"ajv-draft-04\";\nimport { parse as parseYAML } from \"yaml\";\nimport { metrics } from \"../telemetry/index.js\";\nimport { applyFulmenAjvFormats } from \"./ajv-formats.js\";\nimport { SchemaValidationError } from \"./errors.js\";\nimport { getSchemaRegistry } from \"./registry.js\";\nimport type {\n CompiledValidator,\n SchemaInput,\n SchemaRegistryOptions,\n SchemaValidationResult,\n} from \"./types.js\";\nimport { createDiagnostic } from \"./utils.js\";\n\n/**\n * Supported JSON Schema dialects for meta validation + compilation.\n */\ntype JsonSchemaDialect = \"draft-04\" | \"draft-06\" | \"draft-07\" | \"draft-2019-09\" | \"draft-2020-12\";\n\n/**\n * AJV instances by dialect\n */\nconst ajvInstances = new Map<JsonSchemaDialect, Ajv>();\n\n/**\n * Metaschema initialization promises by dialect\n */\nconst metaschemaReady = new Map<JsonSchemaDialect, Promise<void>>();\n\n/**\n * Schema cache for compiled validators\n */\nconst schemaCache = new Map<string, CompiledValidator>();\n\n/**\n * Load metaschema from Crucible SSOT\n */\nasync function loadMetaSchema(draft: JsonSchemaDialect): Promise<Record<string, unknown>> {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const metaSchemaPath = join(\n __dirname,\n \"..\",\n \"..\",\n \"schemas\",\n \"crucible-ts\",\n \"meta\",\n draft,\n \"schema.json\",\n );\n\n const content = await readFile(metaSchemaPath, \"utf-8\");\n return JSON.parse(content) as Record<string, unknown>;\n}\n\n/**\n * Load vocabulary schemas (draft 2019-09 / 2020-12)\n */\nasync function loadVocabularySchemas(draft: JsonSchemaDialect): Promise<Record<string, unknown>[]> {\n if (draft !== \"draft-2019-09\" && draft !== \"draft-2020-12\") {\n return [];\n }\n\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const vocabDir = join(__dirname, \"..\", \"..\", \"schemas\", \"crucible-ts\", \"meta\", draft, \"meta\");\n\n const vocabFiles =\n draft === \"draft-2020-12\"\n ? [\n \"core.json\",\n \"applicator.json\",\n \"unevaluated.json\",\n \"validation.json\",\n \"meta-data.json\",\n \"format-annotation.json\",\n \"content.json\",\n ]\n : [\n \"core.json\",\n \"applicator.json\",\n \"validation.json\",\n \"meta-data.json\",\n \"format.json\",\n \"content.json\",\n ];\n\n const schemas: Record<string, unknown>[] = [];\n for (const file of vocabFiles) {\n try {\n const content = await readFile(join(vocabDir, file), \"utf-8\");\n schemas.push(JSON.parse(content) as Record<string, unknown>);\n } catch {\n // Vocabulary schema not found, skip\n }\n }\n\n return schemas;\n}\n\n/**\n * Load referenced schemas (including YAML files) for AJV\n *\n * Resolves relative paths from schemas/ and config/ directories.\n * Handles both relative paths and https://schemas.fulmenhq.dev URIs.\n *\n * Per Canonical URI Resolution Standard (v0.4.2+), crucible-hosted schemas use:\n * https://schemas.fulmenhq.dev/crucible/<topic>/<version>/<filename>\n *\n * We only embed crucible schemas locally. Other modules (goneat/, enact/, etc.)\n * are not embedded and cannot be resolved offline.\n */\nasync function loadReferencedSchema(uri: string): Promise<Record<string, unknown>> {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const repoRoot = join(__dirname, \"..\", \"..\");\n\n let resolvedPath: string;\n\n // Handle https://schemas.fulmenhq.dev/ URIs - map to local files\n if (uri.startsWith(\"https://schemas.fulmenhq.dev/\")) {\n let relativePath = uri.replace(\"https://schemas.fulmenhq.dev/\", \"\");\n\n // Strip crucible/ module prefix if present (v0.4.2+ canonical URIs)\n // We only embed crucible schemas - other modules cannot be resolved locally\n if (relativePath.startsWith(\"crucible/\")) {\n relativePath = relativePath.slice(\"crucible/\".length);\n }\n\n // Check if it's a config taxonomy reference\n if (relativePath.startsWith(\"config/taxonomy/\")) {\n resolvedPath = join(\n repoRoot,\n \"config\",\n \"crucible-ts\",\n \"taxonomy\",\n relativePath.split(\"/\").pop() || \"\",\n );\n } else {\n // Schema reference - map to schemas/crucible-ts/\n resolvedPath = join(repoRoot, \"schemas\", \"crucible-ts\", relativePath);\n }\n }\n // Handle relative paths (e.g., \"../../../../config/taxonomy/metrics.yaml\")\n else if (uri.startsWith(\"../../\") || uri.startsWith(\"../\")) {\n // Resolve relative to schemas/crucible-ts/observability/metrics/v1.0.0/\n // (where metrics-event.schema.json is located)\n const schemaBase = join(\n repoRoot,\n \"schemas\",\n \"crucible-ts\",\n \"observability\",\n \"metrics\",\n \"v1.0.0\",\n );\n resolvedPath = join(schemaBase, uri);\n }\n // Handle file:// URIs\n else if (uri.startsWith(\"file://\")) {\n resolvedPath = fileURLToPath(uri);\n }\n // Unhandled URI scheme\n else {\n throw new Error(`Cannot load remote schema: ${uri}`);\n }\n\n // Read and parse the file\n const content = await readFile(resolvedPath, \"utf-8\");\n const ext = resolvedPath.split(\".\").pop()?.toLowerCase();\n\n if (ext === \"yaml\" || ext === \"yml\") {\n return parseYAML(content) as Record<string, unknown>;\n }\n return JSON.parse(content) as Record<string, unknown>;\n}\n\n/**\n * Resolve JSON Schema dialect from schema content.\n */\nfunction detectDialect(schema: unknown): JsonSchemaDialect {\n if (schema && typeof schema === \"object\" && !Array.isArray(schema)) {\n const maybeSchema = schema as Record<string, unknown>;\n const declared = (maybeSchema as { $schema?: unknown }).$schema;\n\n if (typeof declared === \"string\") {\n if (declared.includes(\"draft-04\")) return \"draft-04\";\n if (declared.includes(\"draft-06\")) return \"draft-06\";\n if (declared.includes(\"draft-07\")) return \"draft-07\";\n if (declared.includes(\"draft/2019-09\")) return \"draft-2019-09\";\n if (declared.includes(\"draft/2020-12\")) return \"draft-2020-12\";\n }\n }\n\n // Default to 2020-12 in Fulmen ecosystem.\n return \"draft-2020-12\";\n}\n\n/**\n * Create AJV instance for a specific dialect\n */\nfunction createAjv(dialect: JsonSchemaDialect): Ajv {\n const AjvCtor =\n dialect === \"draft-2020-12\"\n ? Ajv2020\n : dialect === \"draft-2019-09\"\n ? Ajv2019\n : dialect === \"draft-04\"\n ? (AjvDraft04 as unknown as typeof Ajv)\n : Ajv;\n\n const ajv = new AjvCtor({\n strict: false,\n allErrors: true,\n verbose: true,\n // Allow schemas with $id to be added without replacing existing ones\n addUsedSchema: false,\n // draft-04 uses \"id\"; later drafts use \"$id\"\n schemaId: dialect === \"draft-04\" ? \"id\" : \"$id\",\n // Enable async schema loading for YAML references\n loadSchema: loadReferencedSchema,\n });\n\n applyFulmenAjvFormats(ajv);\n\n return ajv;\n}\n\n/**\n * Get or create AJV instance for a dialect, ensuring metaschemas are loaded.\n */\nasync function getAjv(dialect: JsonSchemaDialect): Promise<Ajv> {\n const existing = ajvInstances.get(dialect);\n if (existing) {\n const ready = metaschemaReady.get(dialect);\n if (ready) await ready;\n return existing;\n }\n\n const ajv = createAjv(dialect);\n ajvInstances.set(dialect, ajv);\n\n const readyPromise = Promise.all([loadVocabularySchemas(dialect), loadMetaSchema(dialect)])\n .then(([vocabSchemas, metaSchema]) => {\n // Add vocabulary schemas first (referenced by meta schema)\n for (const vocabSchema of vocabSchemas) {\n try {\n ajv.addMetaSchema(vocabSchema);\n } catch {\n // Already added or incompatible with Ajv's built-ins\n }\n }\n\n try {\n ajv.addMetaSchema(metaSchema);\n } catch {\n // Already added or incompatible with Ajv's built-ins\n }\n })\n .catch((error) => {\n throw new Error(`Failed to load metaschemas (${dialect}): ${error}`);\n });\n\n metaschemaReady.set(dialect, readyPromise);\n await readyPromise;\n\n return ajv;\n}\n\n/**\n * Compile a schema for validation\n */\nexport async function compileSchema(\n schema: SchemaInput,\n options: { aliases?: string[] } = {},\n): Promise<CompiledValidator> {\n const baseKey = typeof schema === \"string\" ? schema : JSON.stringify(schema);\n\n let parsedSchema: unknown;\n if (typeof schema === \"string\") {\n try {\n parsedSchema = JSON.parse(schema);\n } catch {\n // Try YAML if JSON parsing fails\n parsedSchema = parseYAML(schema);\n }\n } else if (Buffer.isBuffer(schema)) {\n const content = schema.toString(\"utf-8\");\n try {\n parsedSchema = JSON.parse(content);\n } catch {\n parsedSchema = parseYAML(content);\n }\n } else {\n parsedSchema = schema;\n }\n\n const dialect = detectDialect(parsedSchema);\n const ajv = await getAjv(dialect);\n\n const cacheKey = `${dialect}:${baseKey}`;\n const cached = schemaCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n try {\n // Register schema aliases (e.g., alternate $id values) before compile to support relative refs\n if (options.aliases && options.aliases.length > 0) {\n for (const alias of options.aliases) {\n if (alias && ajv.getSchema(alias) === undefined) {\n try {\n if (typeof parsedSchema === \"object\" && parsedSchema !== null) {\n ajv.addSchema(parsedSchema as Record<string, unknown>, alias);\n }\n } catch {\n // Ignore if alias already registered or invalid\n }\n }\n }\n }\n\n const validator =\n typeof parsedSchema === \"boolean\"\n ? ajv.compile(parsedSchema)\n : await ajv.compileAsync(parsedSchema as Record<string, unknown>);\n\n // Cache the compiled validator\n schemaCache.set(cacheKey, validator as CompiledValidator);\n\n return validator as CompiledValidator;\n } catch (error) {\n throw SchemaValidationError.parseFailed(\n {\n type: \"string\",\n content: typeof schema === \"string\" ? schema : JSON.stringify(schema),\n },\n error as Error,\n );\n }\n}\n\n/**\n * Validate data against a compiled schema\n */\nexport function validateData(data: unknown, validator: CompiledValidator): SchemaValidationResult {\n const valid = validator(data);\n\n const result: SchemaValidationResult = {\n valid,\n diagnostics: [],\n source: \"ajv\",\n };\n\n if (!valid && validator.errors) {\n const errors = validator.errors;\n if (Array.isArray(errors)) {\n result.diagnostics = errors.map((error) =>\n createDiagnostic(\n error.instancePath || \"\",\n error.message || \"Validation failed\",\n error.keyword || \"unknown\",\n \"ERROR\",\n \"ajv\",\n ),\n );\n }\n metrics.counter(\"schema_validation_errors\").inc();\n } else {\n metrics.counter(\"schema_validations\").inc();\n }\n\n return result;\n}\n\n/**\n * Validate file against a schema\n */\nexport async function validateFile(\n filePath: string,\n validator: CompiledValidator,\n): Promise<SchemaValidationResult> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n let data: unknown;\n\n try {\n data = JSON.parse(content);\n } catch {\n // Try YAML if JSON parsing fails\n data = parseYAML(content);\n }\n\n return validateData(data, validator);\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n throw SchemaValidationError.validationFailed(\n filePath,\n [\n createDiagnostic(\n \"\",\n `Failed to read or parse file: ${(error as Error).message}`,\n \"file-read\",\n \"ERROR\",\n \"ajv\",\n ),\n ],\n { type: \"file\", id: filePath },\n );\n }\n}\n\n/**\n * Validate a schema document itself\n */\nexport async function validateSchema(schema: SchemaInput): Promise<SchemaValidationResult> {\n try {\n // Parse schema so we can both meta-validate and compile with dialect-specific Ajv.\n let parsedSchema: unknown;\n if (typeof schema === \"string\") {\n try {\n parsedSchema = JSON.parse(schema);\n } catch {\n parsedSchema = parseYAML(schema);\n }\n } else if (Buffer.isBuffer(schema)) {\n const content = schema.toString(\"utf-8\");\n try {\n parsedSchema = JSON.parse(content);\n } catch {\n parsedSchema = parseYAML(content);\n }\n } else {\n parsedSchema = schema;\n }\n\n const dialect = detectDialect(parsedSchema);\n const ajv = await getAjv(dialect);\n\n // 1) Meta validation against declared dialect\n const metaValid = ajv.validateSchema(parsedSchema as AnySchema);\n if (!metaValid && ajv.errors) {\n const diagnostics = ajv.errors.map((error) =>\n createDiagnostic(\n error.instancePath || \"\",\n error.message || \"Schema meta-validation failed\",\n error.keyword || \"unknown\",\n \"ERROR\",\n \"ajv\",\n ),\n );\n\n return { valid: false, diagnostics, source: \"ajv\" };\n }\n\n // 2) Compilation check (refs resolvable, keywords supported)\n await compileSchema(parsedSchema as SchemaInput);\n\n return {\n valid: true,\n diagnostics: [],\n source: \"ajv\",\n };\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n return {\n valid: false,\n diagnostics: error.diagnostics,\n source: \"ajv\",\n };\n }\n\n return {\n valid: false,\n diagnostics: [\n createDiagnostic(\n \"\",\n `Schema validation failed: ${(error as Error).message}`,\n \"schema-validation\",\n \"ERROR\",\n \"ajv\",\n ),\n ],\n source: \"ajv\",\n };\n }\n}\n\n/**\n * Clear schema cache\n */\nexport function clearCache(): void {\n schemaCache.clear();\n // Keep Ajv instances cached; they hold metaschemas. Tests can still clear schema cache.\n}\n\n/**\n * Get schema cache size\n */\nexport function getCacheSize(): number {\n return schemaCache.size;\n}\n\n/**\n * Load schema by ID from registry and compile\n */\nexport async function compileSchemaById(\n schemaId: string,\n registryOptions?: SchemaRegistryOptions,\n): Promise<CompiledValidator> {\n try {\n const registry = getSchemaRegistry(registryOptions);\n const metadata = await registry.getSchema(schemaId);\n\n const content = await readFile(metadata.path, \"utf-8\");\n const aliases: string[] = [];\n\n const normalizedRelativePath = metadata.relativePath.replace(/\\\\/g, \"/\");\n if (normalizedRelativePath) {\n // Per Canonical URI Resolution Standard (v0.4.2+), include crucible/ module prefix\n aliases.push(\n new URL(`crucible/${normalizedRelativePath}`, \"https://schemas.fulmenhq.dev/\").toString(),\n );\n }\n\n return compileSchema(content, { aliases });\n } catch (error) {\n metrics.counter(\"schema_validation_errors\").inc();\n throw error;\n }\n}\n\n/**\n * Validate data against a schema ID from registry\n */\nexport async function validateDataBySchemaId(\n data: unknown,\n schemaId: string,\n registryOptions?: SchemaRegistryOptions,\n): Promise<SchemaValidationResult> {\n try {\n const validator = await compileSchemaById(schemaId, registryOptions);\n return validateData(data, validator);\n } catch (error) {\n metrics.counter(\"schema_validation_errors\").inc();\n throw error;\n }\n}\n\n/**\n * Validate file against a schema ID from registry\n */\nexport async function validateFileBySchemaId(\n filePath: string,\n schemaId: string,\n registryOptions?: SchemaRegistryOptions,\n): Promise<SchemaValidationResult> {\n try {\n const validator = await compileSchemaById(schemaId, registryOptions);\n return validateFile(filePath, validator);\n } catch (error) {\n metrics.counter(\"schema_validation_errors\").inc();\n throw error;\n }\n}\n","/**\n * Schema CLI - Commander-based CLI for schema operations\n *\n * Provides command-line interface for schema discovery, validation,\n * and normalization operations. This is a developer tool for exploration\n * and testing, not for production use.\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { Command } from \"commander\";\nimport { isGoneatAvailable, runGoneatValidation } from \"./goneat-bridge.js\";\nimport { compareSchemas, normalizeSchema } from \"./normalizer.js\";\nimport { getSchemaRegistry, listSchemas } from \"./registry.js\";\nimport type { CLIOptions, SchemaValidationResult } from \"./types.js\";\nimport { formatDiagnostics } from \"./utils.js\";\nimport { validateFileBySchemaId } from \"./validator.js\";\n\n/**\n * Create CLI command structure\n */\nexport function createCLI(options: CLIOptions = {}): Command {\n const program = new Command();\n\n program\n .name(\"tsfulmen-schema\")\n .description(\"Schema validation and discovery CLI for Fulmen (developer tool)\")\n .version(\"0.1.0\");\n\n // List schemas command\n program\n .command(\"list\")\n .description(\"List available schemas from registry\")\n .argument(\"[prefix]\", \"Filter schemas by prefix\")\n .option(\"--base-dir <path>\", \"Override schema base directory\")\n .action(async (prefix?: string, cmdOptions?: { baseDir?: string }) => {\n try {\n const schemas = await listSchemas(prefix, {\n baseDir: cmdOptions?.baseDir || options.baseDir,\n });\n\n if (schemas.length === 0) {\n console.log(\"No schemas found\");\n return;\n }\n\n console.log(`Found ${schemas.length} schema(s):\\n`);\n for (const schema of schemas) {\n console.log(` ${schema.id}`);\n console.log(` Format: ${schema.format}`);\n console.log(` Path: ${schema.relativePath}`);\n if (schema.description) {\n console.log(` Description: ${schema.description}`);\n }\n console.log();\n }\n } catch (error) {\n console.error(\"Error listing schemas:\", (error as Error).message);\n process.exit(1);\n }\n });\n\n // Show schema command\n program\n .command(\"show\")\n .description(\"Show schema details\")\n .requiredOption(\"--schema-id <id>\", \"Schema ID to show\")\n .option(\"--base-dir <path>\", \"Override schema base directory\")\n .action(async (cmdOptions: { schemaId: string; baseDir?: string }) => {\n try {\n const registry = getSchemaRegistry({\n baseDir: cmdOptions.baseDir || options.baseDir,\n });\n const schema = await registry.getSchema(cmdOptions.schemaId);\n\n console.log(\"Schema Details:\\n\");\n console.log(` ID: ${schema.id}`);\n console.log(` Format: ${schema.format}`);\n console.log(` Path: ${schema.path}`);\n console.log(` Relative Path: ${schema.relativePath}`);\n if (schema.version) {\n console.log(` Version: ${schema.version}`);\n }\n if (schema.description) {\n console.log(` Description: ${schema.description}`);\n }\n if (schema.schemaDraft) {\n console.log(` Schema Draft: ${schema.schemaDraft}`);\n }\n\n // Read and display schema content\n const content = await readFile(schema.path, \"utf-8\");\n console.log(\"\\nSchema Content:\");\n console.log(content);\n } catch (error) {\n console.error(\"Error showing schema:\", (error as Error).message);\n process.exit(1);\n }\n });\n\n // Validate data command\n program\n .command(\"validate\")\n .description(\"Validate data file against schema\")\n .requiredOption(\"--schema-id <id>\", \"Schema ID to validate against\")\n .argument(\"<file>\", \"Data file to validate\")\n .option(\"--use-goneat\", \"Use goneat for validation (requires goneat binary)\")\n .option(\"--goneat-path <path>\", \"Path to goneat binary\")\n .option(\"--base-dir <path>\", \"Override schema base directory\")\n .action(\n async (\n file: string,\n cmdOptions: {\n schemaId: string;\n useGoneat?: boolean;\n goneatPath?: string;\n baseDir?: string;\n },\n ) => {\n try {\n let result: SchemaValidationResult;\n\n if (cmdOptions.useGoneat) {\n // Check goneat availability\n const available = await isGoneatAvailable(cmdOptions.goneatPath);\n if (!available) {\n console.error(\"❌ goneat not available. Install goneat or remove --use-goneat flag.\");\n console.error(\" AJV validation (default) works without external dependencies.\");\n process.exit(1);\n }\n\n // Get schema path\n const registry = getSchemaRegistry({\n baseDir: cmdOptions.baseDir || options.baseDir,\n });\n const schema = await registry.getSchema(cmdOptions.schemaId);\n\n console.log(\"Using goneat validation...\");\n result = await runGoneatValidation(schema.path, file, cmdOptions.goneatPath);\n } else {\n // Use AJV validation (default, library implementation)\n console.log(\"Using AJV validation...\");\n result = await validateFileBySchemaId(file, cmdOptions.schemaId, {\n baseDir: cmdOptions.baseDir || options.baseDir,\n });\n }\n\n if (result.valid) {\n console.log(`✅ Validation passed (${result.source})`);\n process.exit(0);\n } else {\n console.log(`❌ Validation failed (${result.source})`);\n console.log(\"\\nDiagnostics:\");\n console.log(formatDiagnostics(result.diagnostics));\n process.exit(1);\n }\n } catch (error) {\n console.error(\"Error validating file:\", (error as Error).message);\n process.exit(1);\n }\n },\n );\n\n // Validate schema command\n program\n .command(\"validate-schema\")\n .description(\"Validate a schema file itself\")\n .argument(\"<file>\", \"Schema file to validate\")\n .action(async (file: string) => {\n try {\n const content = await readFile(file, \"utf-8\");\n const { validateSchema } = await import(\"./validator.js\");\n const result = await validateSchema(content);\n\n if (result.valid) {\n console.log(\"✅ Schema is valid\");\n process.exit(0);\n } else {\n console.log(\"❌ Schema is invalid\");\n console.log(\"\\nDiagnostics:\");\n console.log(formatDiagnostics(result.diagnostics));\n process.exit(1);\n }\n } catch (error) {\n console.error(\"Error validating schema:\", (error as Error).message);\n process.exit(1);\n }\n });\n\n // Normalize schema command\n program\n .command(\"normalize\")\n .description(\"Normalize schema to canonical JSON format\")\n .argument(\"<file>\", \"Schema file to normalize\")\n .option(\"--compact\", \"Output compact JSON (no formatting)\")\n .option(\"-o, --output <file>\", \"Write to output file instead of stdout\")\n .action(async (file: string, cmdOptions: { compact?: boolean; output?: string }) => {\n try {\n const content = await readFile(file, \"utf-8\");\n const normalized = normalizeSchema(content, {\n compact: cmdOptions.compact,\n });\n\n if (cmdOptions.output) {\n await writeFile(cmdOptions.output, normalized, \"utf-8\");\n console.log(`✅ Normalized schema written to ${cmdOptions.output}`);\n } else {\n console.log(normalized);\n }\n } catch (error) {\n console.error(\"Error normalizing schema:\", (error as Error).message);\n process.exit(1);\n }\n });\n\n // Compare schemas command\n program\n .command(\"compare\")\n .description(\"Compare two schemas for semantic equality\")\n .argument(\"<file1>\", \"First schema file\")\n .argument(\"<file2>\", \"Second schema file\")\n .option(\"--show-normalized\", \"Show normalized outputs\")\n .action(async (file1: string, file2: string, cmdOptions: { showNormalized?: boolean }) => {\n try {\n const content1 = await readFile(file1, \"utf-8\");\n const content2 = await readFile(file2, \"utf-8\");\n\n const result = compareSchemas(content1, content2);\n\n if (result.equal) {\n console.log(\"✅ Schemas are semantically equal\");\n } else {\n console.log(\"❌ Schemas differ\");\n }\n\n if (cmdOptions.showNormalized) {\n console.log(\"\\nNormalized Schema 1:\");\n console.log(result.normalizedA);\n console.log(\"\\nNormalized Schema 2:\");\n console.log(result.normalizedB);\n }\n\n process.exit(result.equal ? 0 : 1);\n } catch (error) {\n console.error(\"Error comparing schemas:\", (error as Error).message);\n process.exit(1);\n }\n });\n\n // Export schema command\n program\n .command(\"export\")\n .description(\"Export schema from registry to file with provenance\")\n .requiredOption(\"--schema-id <id>\", \"Schema ID to export\")\n .requiredOption(\"--out <path>\", \"Output file path\")\n .option(\"--force\", \"Overwrite existing file\", false)\n .option(\"--no-provenance\", \"Exclude provenance metadata\")\n .option(\"--no-validate\", \"Skip schema validation before export\")\n .option(\"--format <format>\", \"Export format (json|yaml|auto)\", \"auto\")\n .option(\"--base-dir <path>\", \"Override schema base directory\")\n .action(\n async (cmdOptions: {\n schemaId: string;\n out: string;\n force?: boolean;\n provenance?: boolean;\n validate?: boolean;\n format?: string;\n baseDir?: string;\n }) => {\n try {\n const { exportSchema } = await import(\"./export.js\");\n const { exitCodes } = await import(\"../foundry/index.js\");\n\n const result = await exportSchema({\n schemaId: cmdOptions.schemaId,\n outPath: cmdOptions.out,\n includeProvenance: cmdOptions.provenance ?? true,\n validate: cmdOptions.validate ?? true,\n overwrite: cmdOptions.force ?? false,\n format: (cmdOptions.format as \"json\" | \"yaml\" | \"auto\") ?? \"auto\",\n baseDir: cmdOptions.baseDir || options.baseDir,\n });\n\n console.log(\"✅ Schema exported successfully\");\n console.log(` Schema ID: ${result.schemaId}`);\n console.log(` Output: ${result.outPath}`);\n console.log(` Format: ${result.format}`);\n\n if (result.provenance) {\n console.log(\"\\nProvenance:\");\n console.log(` Crucible: ${result.provenance.crucible_version}`);\n console.log(` Library: ${result.provenance.library_version}`);\n if (result.provenance.revision) {\n console.log(` Revision: ${result.provenance.revision}`);\n }\n console.log(` Exported: ${result.provenance.exported_at}`);\n }\n\n process.exit(exitCodes.EXIT_SUCCESS);\n } catch (error) {\n const { exitCodes } = await import(\"../foundry/index.js\");\n const { SchemaExportError, SchemaValidationError, ExportErrorReason } = await import(\n \"./errors.js\"\n );\n\n console.error(\"❌ Schema export failed:\", (error as Error).message);\n\n // Map specific error types to appropriate exit codes\n if (error instanceof SchemaExportError) {\n if (error.outPath) {\n console.error(` Output path: ${error.outPath}`);\n }\n\n // Use error reason for type-safe exit code mapping\n switch (error.reason) {\n case ExportErrorReason.FILE_EXISTS:\n case ExportErrorReason.WRITE_FAILED:\n process.exit(exitCodes.EXIT_FILE_WRITE_ERROR);\n break;\n\n case ExportErrorReason.INVALID_FORMAT:\n process.exit(exitCodes.EXIT_INVALID_ARGUMENT);\n break;\n\n default:\n // PROVENANCE_FAILED, UNKNOWN, and any future reasons\n process.exit(exitCodes.EXIT_FAILURE);\n }\n }\n\n if (error instanceof SchemaValidationError) {\n // Schema not found or validation failed\n const errorMsg = error.message.toLowerCase();\n\n if (errorMsg.includes(\"not found\")) {\n process.exit(exitCodes.EXIT_FILE_NOT_FOUND);\n }\n\n // Validation failures\n process.exit(exitCodes.EXIT_DATA_INVALID);\n }\n\n process.exit(exitCodes.EXIT_FAILURE);\n }\n },\n );\n\n // Identity show command\n program\n .command(\"identity-show\")\n .description(\"Show application identity from .fulmen/app.yaml\")\n .option(\"--path <path>\", \"Explicit path to app.yaml\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (cmdOptions: { path?: string; json?: boolean }) => {\n try {\n const { loadIdentity } = await import(\"../appidentity/loader.js\");\n const { exitCodes } = await import(\"../foundry/index.js\");\n\n const identity = await loadIdentity({ path: cmdOptions.path });\n\n if (cmdOptions.json) {\n console.log(JSON.stringify(identity, null, 2));\n } else {\n console.log(\"Application Identity:\\n\");\n console.log(` Binary Name: ${identity.app.binary_name}`);\n console.log(` Vendor: ${identity.app.vendor}`);\n console.log(` Env Prefix: ${identity.app.env_prefix}`);\n console.log(` Config Name: ${identity.app.config_name}`);\n console.log(` Description: ${identity.app.description}`);\n\n if (identity.metadata) {\n console.log(\"\\nMetadata:\");\n if (identity.metadata.license) {\n console.log(` License: ${identity.metadata.license}`);\n }\n if (identity.metadata.repository_category) {\n console.log(` Category: ${identity.metadata.repository_category}`);\n }\n if (identity.metadata.telemetry_namespace) {\n console.log(` Telemetry: ${identity.metadata.telemetry_namespace}`);\n }\n if (identity.metadata.project_url) {\n console.log(` Project URL: ${identity.metadata.project_url}`);\n }\n }\n }\n\n process.exit(exitCodes.EXIT_SUCCESS);\n } catch (error) {\n const { exitCodes } = await import(\"../foundry/index.js\");\n const { AppIdentityError } = await import(\"../appidentity/errors.js\");\n\n console.error(\"❌ Failed to load identity:\", (error as Error).message);\n\n if (error instanceof AppIdentityError) {\n if (error.message.includes(\"not found\")) {\n process.exit(exitCodes.EXIT_FILE_NOT_FOUND);\n }\n if (error.message.includes(\"Invalid\") || error.message.includes(\"validation\")) {\n process.exit(exitCodes.EXIT_DATA_INVALID);\n }\n }\n\n process.exit(exitCodes.EXIT_FAILURE);\n }\n });\n\n // Identity validate command\n program\n .command(\"identity-validate\")\n .description(\"Validate application identity against schema\")\n .argument(\"[file]\", \"Path to app.yaml (defaults to discovery)\")\n .action(async (file?: string) => {\n try {\n const { loadIdentity } = await import(\"../appidentity/loader.js\");\n const { exitCodes } = await import(\"../foundry/index.js\");\n\n console.log(\"Validating application identity...\");\n\n const identity = await loadIdentity({ path: file });\n\n console.log(\"✅ Identity is valid\");\n console.log(` Binary: ${identity.app.binary_name}`);\n console.log(` Vendor: ${identity.app.vendor}`);\n\n process.exit(exitCodes.EXIT_SUCCESS);\n } catch (error) {\n const { exitCodes } = await import(\"../foundry/index.js\");\n const { AppIdentityError } = await import(\"../appidentity/errors.js\");\n\n console.error(\"❌ Identity validation failed:\", (error as Error).message);\n\n if (error instanceof AppIdentityError) {\n if (error.message.includes(\"not found\")) {\n process.exit(exitCodes.EXIT_FILE_NOT_FOUND);\n }\n if (error.message.includes(\"Invalid\") || error.message.includes(\"validation\")) {\n process.exit(exitCodes.EXIT_DATA_INVALID);\n }\n }\n\n process.exit(exitCodes.EXIT_FAILURE);\n }\n });\n\n return program;\n}\n","/**\n * Schema export utilities - implements schema export with provenance\n */\n\nimport { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, extname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parse as parseYAML, stringify as stringifyYAML } from \"yaml\";\nimport { SchemaExportError, SchemaValidationError } from \"./errors.js\";\nimport { getSchemaRegistry } from \"./registry.js\";\nimport type {\n ExportSchemaOptions,\n ExportSchemaResult,\n SchemaExportFormat,\n SchemaProvenanceMetadata,\n} from \"./types.js\";\nimport { validateSchema } from \"./validator.js\";\n\n/**\n * Extract provenance metadata from Crucible sync metadata\n */\nasync function extractProvenanceMetadata(schemaId: string): Promise<SchemaProvenanceMetadata> {\n try {\n // Read Crucible metadata using proper path resolution\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const metadataPath = join(__dirname, \"..\", \"..\", \".crucible\", \"metadata\", \"metadata.yaml\");\n const metadataContent = await readFile(metadataPath, \"utf-8\");\n\n // Parse YAML properly to avoid brittle regex matching\n const metadata = parseYAML(metadataContent) as {\n sources?: Array<{\n name?: string;\n version?: string;\n commit?: string;\n }>;\n };\n\n // Extract Crucible source metadata (first source is typically 'crucible')\n const crucibleSource = metadata.sources?.[0];\n const crucibleVersion = crucibleSource?.version || \"unknown\";\n const revision = crucibleSource?.commit;\n\n // Read library version from package.json\n const pkgPath = join(__dirname, \"..\", \"..\", \"package.json\");\n const pkgContent = await readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent) as { version: string };\n\n return {\n schema_id: schemaId,\n crucible_version: crucibleVersion,\n library_version: pkg.version,\n revision: revision,\n exported_at: new Date().toISOString(),\n export_source: \"tsfulmen\",\n };\n } catch (error) {\n throw SchemaExportError.provenanceFailed((error as Error).message, error as Error);\n }\n}\n\n/**\n * Embed provenance metadata in schema content\n */\nfunction embedProvenance(\n schemaContent: Record<string, unknown>,\n provenance: SchemaProvenanceMetadata,\n format: SchemaExportFormat,\n): string {\n if (format === \"json\") {\n // For JSON: embed under $comment[\"x-crucible-source\"]\n const withProvenance = {\n ...schemaContent,\n $comment: {\n ...(typeof schemaContent.$comment === \"object\" ? schemaContent.$comment : {}),\n \"x-crucible-source\": provenance,\n },\n };\n return JSON.stringify(withProvenance, null, 2);\n }\n\n // For YAML: prepend comment block\n const yamlContent = stringifyYAML(schemaContent, {\n indent: 2,\n lineWidth: 0,\n });\n\n const provenanceComment = [\n \"# x-crucible-source:\",\n `# schema_id: ${provenance.schema_id}`,\n `# crucible_version: ${provenance.crucible_version}`,\n `# library_version: ${provenance.library_version}`,\n ...(provenance.revision ? [`# revision: ${provenance.revision}`] : []),\n `# exported_at: ${provenance.exported_at}`,\n `# export_source: ${provenance.export_source}`,\n \"\",\n ].join(\"\\n\");\n\n return provenanceComment + yamlContent;\n}\n\n/**\n * Detect export format from file extension or explicit option\n */\nfunction detectFormat(outPath: string, formatOption?: SchemaExportFormat): SchemaExportFormat {\n if (formatOption && formatOption !== \"auto\") {\n return formatOption;\n }\n\n const ext = extname(outPath).toLowerCase();\n switch (ext) {\n case \".json\":\n return \"json\";\n case \".yaml\":\n case \".yml\":\n return \"yaml\";\n default:\n throw SchemaExportError.invalidFormat(ext, outPath);\n }\n}\n\n/**\n * Export schema from registry to file with provenance\n *\n * @param options - Export options\n * @returns Export result with metadata\n *\n * @throws {SchemaExportError} If export fails\n * @throws {SchemaValidationError} If schema not found or validation fails\n *\n * @example\n * ```typescript\n * import { exportSchema } from '@fulmenhq/tsfulmen/schema';\n *\n * await exportSchema({\n * schemaId: 'library/foundry/v1.0.0/exit-codes',\n * outPath: './schemas/exit-codes.schema.json',\n * includeProvenance: true,\n * validate: true,\n * });\n * ```\n */\nexport async function exportSchema(options: ExportSchemaOptions): Promise<ExportSchemaResult> {\n const {\n schemaId,\n outPath,\n includeProvenance = true,\n validate = true,\n overwrite = false,\n format: formatOption,\n baseDir,\n } = options;\n\n // Detect output format\n const format = detectFormat(outPath, formatOption);\n\n // Check if file exists\n if (!overwrite) {\n try {\n await access(outPath);\n throw SchemaExportError.fileExists(outPath);\n } catch (error) {\n // File doesn't exist - proceed\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n // Get schema from registry\n const registry = getSchemaRegistry({ baseDir });\n const schema = await registry.getSchema(schemaId);\n\n // Read schema content\n const schemaContent = await readFile(schema.path, \"utf-8\");\n\n // Validate if requested\n if (validate) {\n const validationResult = await validateSchema(schemaContent);\n if (!validationResult.valid) {\n throw SchemaValidationError.validationFailed(schemaId, validationResult.diagnostics, {\n type: \"file\",\n id: schema.path,\n });\n }\n }\n\n // Parse schema content\n let schemaObject: Record<string, unknown>;\n try {\n schemaObject = JSON.parse(schemaContent) as Record<string, unknown>;\n } catch {\n schemaObject = parseYAML(schemaContent) as Record<string, unknown>;\n }\n\n // Freeze schema object to prevent mutation\n Object.freeze(schemaObject);\n\n let provenance: SchemaProvenanceMetadata | undefined;\n let outputContent: string;\n\n if (includeProvenance) {\n // Extract provenance metadata\n provenance = await extractProvenanceMetadata(schemaId);\n\n // Embed provenance in output\n outputContent = embedProvenance(schemaObject, provenance, format);\n } else {\n // Export without provenance\n if (format === \"json\") {\n outputContent = JSON.stringify(schemaObject, null, 2);\n } else {\n outputContent = stringifyYAML(schemaObject, { indent: 2, lineWidth: 0 });\n }\n }\n\n // Ensure output directory exists\n await mkdir(dirname(outPath), { recursive: true });\n\n // Write to file\n try {\n await writeFile(outPath, outputContent, \"utf-8\");\n } catch (error) {\n throw SchemaExportError.writeFailed(outPath, error as Error);\n }\n\n return {\n success: true,\n schemaId,\n outPath,\n format,\n includeProvenance,\n provenance,\n };\n}\n\n/**\n * Strip provenance metadata from schema content\n *\n * This helper is useful for comparing exported schemas with runtime\n * schemas or validating that provenance doesn't affect schema semantics.\n *\n * @param content - Schema content (JSON or YAML string)\n * @returns Schema content without provenance metadata\n *\n * @example\n * ```typescript\n * import { stripProvenance } from '@fulmenhq/tsfulmen/schema';\n *\n * const exported = await readFile('./schema.json', 'utf-8');\n * const withoutProvenance = stripProvenance(exported);\n * ```\n */\nexport function stripProvenance(content: string): string {\n try {\n // Try parsing as JSON\n const parsed = JSON.parse(content) as Record<string, unknown>;\n\n // Remove provenance from $comment\n if (parsed.$comment && typeof parsed.$comment === \"object\") {\n const comment = { ...parsed.$comment } as Record<string, unknown>;\n delete comment[\"x-crucible-source\"];\n\n // Remove $comment entirely if it's now empty\n if (Object.keys(comment).length === 0) {\n delete parsed.$comment;\n } else {\n parsed.$comment = comment;\n }\n }\n\n return JSON.stringify(parsed, null, 2);\n } catch {\n // YAML format - strip comment lines\n const lines = content.split(\"\\n\");\n const filtered = lines.filter((line) => {\n const trimmed = line.trim();\n return !(\n trimmed.startsWith(\"# x-crucible-source:\") ||\n (trimmed.startsWith(\"# \") &&\n /^#\\s+(schema_id|crucible_version|library_version|revision|exported_at|export_source):/.test(\n trimmed,\n ))\n );\n });\n\n // Remove leading blank lines\n while (filtered.length > 0 && filtered[0]?.trim() === \"\") {\n filtered.shift();\n }\n\n return filtered.join(\"\\n\");\n }\n}\n","/**\n * Schema validation module - implements Fulmen Schema Validation Standard\n *\n * Provides schema discovery, validation, and normalization utilities for Crucible schemas\n * with JSON Schema 2020-12 support and optional goneat integration.\n */\n\nexport const VERSION = \"0.1.0\";\n\nexport {\n applyFulmenAjvFormats,\n type FulmenAjvFormatsOptions,\n} from \"./ajv-formats.js\";\n\n// CLI exports\nexport { createCLI } from \"./cli.js\";\n// Error exports\nexport * from \"./errors.js\";\n// Export exports\nexport { exportSchema, stripProvenance } from \"./export.js\";\n// Goneat bridge exports (CLI-only, optional)\nexport {\n detectGoneat,\n isGoneatAvailable,\n runGoneatValidation,\n} from \"./goneat-bridge.js\";\n// Normalizer exports\nexport { compareSchemas, normalizeSchema } from \"./normalizer.js\";\n// Registry exports\nexport {\n getSchema,\n getSchemaByPath,\n getSchemaRegistry,\n hasSchema,\n listSchemas,\n SchemaRegistry,\n} from \"./registry.js\";\n// Core exports\nexport type {\n AjvError,\n CLIOptions,\n CompiledValidator,\n ExportSchemaOptions,\n ExportSchemaResult,\n SchemaComparisonResult,\n SchemaExportFormat,\n SchemaFormat,\n SchemaInput,\n SchemaMetadata,\n SchemaNormalizationOptions,\n SchemaProvenanceMetadata,\n SchemaRegistryOptions,\n SchemaSource,\n SchemaValidationDiagnostic,\n SchemaValidationOptions,\n SchemaValidationResult,\n} from \"./types.js\";\n// Utility exports\nexport {\n countDiagnostics,\n createDiagnostic,\n formatDiagnostics,\n formatValidationResult,\n groupDiagnosticsBySeverity,\n isValidationError,\n normalizePointer,\n} from \"./utils.js\";\n// Validator exports\nexport {\n clearCache,\n compileSchema,\n compileSchemaById,\n getCacheSize,\n validateData,\n validateDataBySchemaId,\n validateFile,\n validateFileBySchemaId,\n validateSchema,\n} from \"./validator.js\";\n","/**\n * Correlation ID generation and validation for error tracking\n *\n * Provides UUID v4 generation for correlation IDs used in observability\n * and distributed tracing scenarios.\n */\n\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * UUID v4 regex pattern for validation\n */\nconst UUID_V4_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Generate a new correlation ID (UUID v4)\n *\n * Uses Node.js crypto.randomUUID() for cryptographically strong random values.\n *\n * @returns UUID v4 string (e.g., \"550e8400-e29b-41d4-a716-446655440000\")\n *\n * @example\n * ```typescript\n * const correlationId = generateCorrelationId();\n * // \"550e8400-e29b-41d4-a716-446655440000\"\n * ```\n */\nexport function generateCorrelationId(): string {\n return randomUUID();\n}\n\n/**\n * Validate if a string is a valid UUID v4 correlation ID\n *\n * Checks format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\n * where y is one of [8, 9, a, b]\n *\n * @param id - String to validate\n * @returns True if valid UUID v4 format\n *\n * @example\n * ```typescript\n * isValidCorrelationId('550e8400-e29b-41d4-a716-446655440000') // true\n * isValidCorrelationId('not-a-uuid') // false\n * isValidCorrelationId('550e8400-e29b-31d4-a716-446655440000') // false (version 3, not 4)\n * ```\n */\nexport function isValidCorrelationId(id: string): boolean {\n return UUID_V4_PATTERN.test(id);\n}\n\n/**\n * Normalize a correlation ID (lowercase, trim whitespace)\n *\n * @param id - Correlation ID to normalize\n * @returns Normalized correlation ID\n *\n * @example\n * ```typescript\n * normalizeCorrelationId(' 550E8400-E29B-41D4-A716-446655440000 ')\n * // \"550e8400-e29b-41d4-a716-446655440000\"\n * ```\n */\nexport function normalizeCorrelationId(id: string): string {\n return id.trim().toLowerCase();\n}\n\n/**\n * Type guard to check if a value is a valid correlation ID\n *\n * @param value - Value to check\n * @returns True if value is a string and valid UUID v4\n *\n * @example\n * ```typescript\n * if (isCorrelationId(value)) {\n * // TypeScript knows value is string here\n * const normalized = normalizeCorrelationId(value);\n * }\n * ```\n */\nexport function isCorrelationId(value: unknown): value is string {\n return typeof value === \"string\" && isValidCorrelationId(value);\n}\n","/**\n * Severity mappings for error handling\n *\n * Implements severity levels from assessment/v1.0.0/severity-definitions schema\n * Provides bidirectional mapping between severity names and numeric levels\n */\n\n/**\n * Severity names aligned with assessment taxonomy\n */\nexport const Severity = {\n INFO: \"info\",\n LOW: \"low\",\n MEDIUM: \"medium\",\n HIGH: \"high\",\n CRITICAL: \"critical\",\n} as const;\n\n/**\n * Severity name type (string literal union)\n */\nexport type SeverityName = (typeof Severity)[keyof typeof Severity];\n\n/**\n * Numeric severity level for sorting and comparison\n * info=0, low=1, medium=2, high=3, critical=4\n */\nexport type SeverityLevel = 0 | 1 | 2 | 3 | 4;\n\n/**\n * Canonical severity level mapping (name → level)\n * Aligned with schemas/crucible-ts/assessment/v1.0.0/severity-definitions.schema.json\n */\nexport const SEVERITY_LEVELS: Record<SeverityName, SeverityLevel> = {\n info: 0,\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\n\n/**\n * Reverse mapping (level → name)\n */\nexport const LEVEL_TO_SEVERITY: Record<SeverityLevel, SeverityName> = {\n 0: \"info\",\n 1: \"low\",\n 2: \"medium\",\n 3: \"high\",\n 4: \"critical\",\n};\n\n/**\n * Convert severity name to numeric level\n *\n * @param name - Severity name (info, low, medium, high, critical)\n * @returns Numeric severity level (0-4)\n * @throws {Error} If severity name is invalid\n *\n * @example\n * ```typescript\n * severityToLevel('high') // returns 3\n * severityToLevel('info') // returns 0\n * ```\n */\nexport function severityToLevel(name: string): SeverityLevel {\n if (!isSeverityName(name)) {\n throw new Error(\n `Invalid severity name: \"${name}\". Must be one of: ${Object.values(Severity).join(\", \")}`,\n );\n }\n return SEVERITY_LEVELS[name];\n}\n\n/**\n * Convert numeric level to severity name\n *\n * @param level - Numeric severity level (0-4)\n * @returns Severity name\n * @throws {Error} If level is invalid\n *\n * @example\n * ```typescript\n * levelToSeverity(3) // returns 'high'\n * levelToSeverity(0) // returns 'info'\n * ```\n */\nexport function levelToSeverity(level: number): SeverityName {\n if (!isSeverityLevel(level)) {\n throw new Error(`Invalid severity level: ${level}. Must be 0-4`);\n }\n return LEVEL_TO_SEVERITY[level];\n}\n\n/**\n * Type guard to check if a value is a valid severity name\n *\n * @param value - Value to check\n * @returns True if value is a valid SeverityName\n *\n * @example\n * ```typescript\n * if (isSeverityName(value)) {\n * const level = severityToLevel(value); // Type-safe\n * }\n * ```\n */\nexport function isSeverityName(value: unknown): value is SeverityName {\n return typeof value === \"string\" && Object.values(Severity).includes(value as SeverityName);\n}\n\n/**\n * Type guard to check if a value is a valid severity level\n *\n * @param value - Value to check\n * @returns True if value is a valid SeverityLevel\n *\n * @example\n * ```typescript\n * if (isSeverityLevel(value)) {\n * const name = levelToSeverity(value); // Type-safe\n * }\n * ```\n */\nexport function isSeverityLevel(value: unknown): value is SeverityLevel {\n return typeof value === \"number\" && value >= 0 && value <= 4 && Number.isInteger(value);\n}\n\n/**\n * Get default severity (medium/2) when not specified\n *\n * @returns Default severity name and level\n */\nexport function getDefaultSeverity(): {\n name: SeverityName;\n level: SeverityLevel;\n} {\n return {\n name: Severity.MEDIUM,\n level: 2,\n };\n}\n\n/**\n * Compare two severity levels\n *\n * @param a - First severity (name or level)\n * @param b - Second severity (name or level)\n * @returns Negative if a < b, positive if a > b, zero if equal\n *\n * @example\n * ```typescript\n * compareSeverity('high', 'low') // returns positive (high > low)\n * compareSeverity(2, 'critical') // returns negative (medium < critical)\n * ```\n */\nexport function compareSeverity(\n a: SeverityName | SeverityLevel,\n b: SeverityName | SeverityLevel,\n): number {\n const levelA = typeof a === \"string\" ? severityToLevel(a) : a;\n const levelB = typeof b === \"string\" ? severityToLevel(b) : b;\n return levelA - levelB;\n}\n","/**\n * Error serialization utilities\n *\n * Provides safe serialization of Error objects and unknown errors to structured data\n */\n\nimport { Severity, type SeverityLevel, type SeverityName } from \"./severity.js\";\n\n/**\n * FulmenError data structure (for serialization)\n * Defined here to avoid circular dependency\n */\nexport interface FulmenErrorData {\n readonly code: string;\n readonly message: string;\n readonly details?: Record<string, unknown>;\n readonly path?: string;\n readonly timestamp?: string;\n readonly severity?: SeverityName;\n readonly severity_level?: SeverityLevel;\n readonly correlation_id?: string;\n readonly trace_id?: string;\n readonly exit_code?: number;\n readonly context?: Record<string, unknown>;\n readonly original?: string | object;\n}\n\n/**\n * Safely serialize any error-like value to FulmenErrorData structure\n *\n * Handles native Error objects, plain objects, strings, and unknown types.\n *\n * @param error - Error value to serialize\n * @param code - Optional error code (defaults to 'UNKNOWN_ERROR')\n * @param severity - Optional severity (defaults to 'medium')\n * @returns Structured error data\n *\n * @example\n * ```typescript\n * try {\n * throw new Error('Something failed');\n * } catch (err) {\n * const data = serializeError(err, 'OPERATION_FAILED', 'high');\n * console.log(JSON.stringify(data));\n * }\n * ```\n */\nexport function serializeError(\n error: unknown,\n code = \"UNKNOWN_ERROR\",\n severity: SeverityName = Severity.MEDIUM,\n): FulmenErrorData {\n // Handle Error instances\n if (error instanceof Error) {\n return {\n code,\n message: error.message,\n severity,\n timestamp: new Date().toISOString(),\n context: {\n name: error.name,\n stack: error.stack,\n },\n original: error.stack || error.message,\n };\n }\n\n // Handle plain objects with message\n if (isErrorLike(error)) {\n return {\n code,\n message: error.message,\n severity,\n timestamp: new Date().toISOString(),\n details: error.details,\n context: error.context,\n original: JSON.stringify(error),\n };\n }\n\n // Handle strings\n if (typeof error === \"string\") {\n return {\n code,\n message: error,\n severity,\n timestamp: new Date().toISOString(),\n };\n }\n\n // Handle everything else\n return {\n code,\n message: String(error),\n severity,\n timestamp: new Date().toISOString(),\n original: typeof error === \"object\" ? JSON.stringify(error) : String(error),\n };\n}\n\n/**\n * Extract error message from unknown error value\n *\n * @param error - Error value\n * @returns Error message string\n */\nexport function extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (isErrorLike(error)) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return String(error);\n}\n\n/**\n * Extract stack trace from error if available\n *\n * @param error - Error value\n * @returns Stack trace string or undefined\n */\nexport function extractStackTrace(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.stack;\n }\n if (isErrorLike(error) && typeof error.stack === \"string\") {\n return error.stack;\n }\n return undefined;\n}\n\n/**\n * Type guard for error-like objects\n */\nfunction isErrorLike(value: unknown): value is {\n message: string;\n stack?: string;\n details?: Record<string, unknown>;\n context?: Record<string, unknown>;\n} {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"message\" in value &&\n typeof (value as { message: unknown }).message === \"string\"\n );\n}\n","/**\n * Schema validation for FulmenError data\n *\n * Provides singleton validator that pre-compiles error-response schema\n * using existing src/schema infrastructure. Performance target: <1ms per validation.\n */\n\nimport { compileSchemaById } from \"../schema/index.js\";\nimport type { CompiledValidator } from \"../schema/types.js\";\n\n/**\n * Singleton validator for FulmenError data\n *\n * Pre-compiles the error-response schema at first access for optimal performance.\n * Reuses existing AJV setup from src/schema module.\n */\nclass ErrorValidator {\n private static instance: ErrorValidator;\n private validateFn: CompiledValidator | null = null;\n private initPromise: Promise<void> | null = null;\n private initError: Error | null = null;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get singleton instance\n */\n static getInstance(): ErrorValidator {\n if (!ErrorValidator.instance) {\n ErrorValidator.instance = new ErrorValidator();\n }\n return ErrorValidator.instance;\n }\n\n /**\n * Initialize validator (lazy load, async)\n */\n private async init(): Promise<void> {\n if (this.validateFn !== null || this.initError !== null) {\n return; // Already initialized\n }\n\n if (this.initPromise) {\n return this.initPromise; // Already initializing\n }\n\n this.initPromise = (async () => {\n try {\n // Ensure dependency schemas are registered before compiling error-response\n // Error handling schema references pathfinder error-response relatively.\n await compileSchemaById(\"pathfinder/v1.0.0/error-response\");\n await compileSchemaById(\"assessment/v1.0.0/severity-definitions\");\n\n // Compile schema using existing schema infrastructure\n // Schema ID for error-response extends pathfinder error-response\n this.validateFn = await compileSchemaById(\"error-handling/v1.0.0/error-response\");\n } catch (err) {\n this.initError = err instanceof Error ? err : new Error(String(err));\n throw new Error(`Failed to initialize error validator: ${this.initError.message}`);\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Validate error data against schema\n *\n * @param data - Data to validate\n * @returns Promise resolving to true if valid, false otherwise\n * @throws {Error} If validator failed to initialize\n */\n async validate(data: unknown): Promise<boolean> {\n if (this.validateFn === null) {\n await this.init();\n }\n\n if (this.initError) {\n throw this.initError;\n }\n\n if (!this.validateFn) {\n throw new Error(\"Validator not initialized\");\n }\n\n return this.validateFn(data);\n }\n\n /**\n * Get validation errors from last validation\n *\n * @returns Validation errors or null\n */\n getErrors() {\n if (!this.validateFn) {\n return null;\n }\n return this.validateFn.errors;\n }\n\n /**\n * Reset validator state (for testing)\n * @internal\n */\n static _reset(): void {\n ErrorValidator.instance = new ErrorValidator();\n }\n}\n\n/**\n * Validate FulmenError data against error-response schema\n *\n * Uses pre-compiled validator singleton for optimal performance (<1ms target).\n *\n * @param data - Error data to validate\n * @returns Promise resolving to true if valid, false otherwise\n *\n * @example\n * ```typescript\n * const data = {\n * code: 'CONFIG_INVALID',\n * message: 'Configuration validation failed'\n * };\n *\n * if (await validateErrorData(data)) {\n * // Data is schema-compliant\n * } else {\n * const errors = await getValidationErrors();\n * console.error('Validation failed:', errors);\n * }\n * ```\n */\nexport async function validateErrorData(data: unknown): Promise<boolean> {\n return ErrorValidator.getInstance().validate(data);\n}\n\n/**\n * Get validation errors from last validation\n *\n * @returns Validation errors or null\n *\n * @example\n * ```typescript\n * if (!(await validateErrorData(data))) {\n * const errors = getValidationErrors();\n * errors?.forEach(err => {\n * console.error(`${err.instancePath}: ${err.message}`);\n * });\n * }\n * ```\n */\nexport function getValidationErrors() {\n return ErrorValidator.getInstance().getErrors();\n}\n\n/**\n * Format validation errors as human-readable string\n *\n * @param errors - Validation error objects\n * @returns Formatted error message\n *\n * @example\n * ```typescript\n * const errors = getValidationErrors();\n * if (errors) {\n * throw new Error(formatValidationErrors(errors));\n * }\n * ```\n */\nexport function formatValidationErrors(\n errors: Array<{ instancePath?: string; message?: string }>,\n): string {\n return errors\n .map((err) => {\n const path = err.instancePath || \"(root)\";\n const message = err.message || \"validation failed\";\n return `${path}: ${message}`;\n })\n .join(\"; \");\n}\n\n/**\n * Validate and throw if invalid\n *\n * @param data - Error data to validate\n * @throws {Error} If validation fails\n *\n * @example\n * ```typescript\n * await assertValidErrorData(data); // Throws if invalid\n * // Safe to use data here\n * ```\n */\nexport async function assertValidErrorData(data: unknown): Promise<void> {\n if (!(await validateErrorData(data))) {\n const errors = getValidationErrors();\n const message = errors ? formatValidationErrors(errors) : \"Error data validation failed\";\n throw new Error(`Invalid error data: ${message}`);\n }\n}\n\n// Export for testing\nexport { ErrorValidator };\n","/**\n * FulmenError - Structured error data model for observability\n *\n * Implements ADR-0006 error data model extending Pathfinder error-response\n * with optional telemetry metadata (severity, correlation_id, trace_id, etc.)\n */\n\nimport { extractErrorMessage, extractStackTrace, type FulmenErrorData } from \"./serialization.js\";\nimport type { SeverityLevel, SeverityName } from \"./severity.js\";\nimport { getDefaultSeverity, SEVERITY_LEVELS, Severity } from \"./severity.js\";\nimport { validateErrorData } from \"./validators.js\";\n\n// Re-export FulmenErrorData from serialization\nexport type { FulmenErrorData } from \"./serialization.js\";\n\n/**\n * Options for creating/wrapping FulmenError\n */\nexport interface FulmenErrorOptions {\n code?: string;\n severity?: SeverityName;\n correlation_id?: string;\n trace_id?: string;\n exit_code?: number;\n context?: Record<string, unknown>;\n details?: Record<string, unknown>;\n path?: string;\n}\n\n/**\n * FulmenError class - wraps structured error data with helper methods\n *\n * Implements ADR-0006 canonical data model pattern:\n * - Data stored in immutable FulmenErrorData interface\n * - Class provides ergonomic API and methods\n * - Extends native Error for stack traces and instanceof checks\n */\nexport class FulmenError extends Error {\n readonly data: FulmenErrorData;\n\n constructor(data: FulmenErrorData) {\n super(data.message);\n this.name = \"FulmenError\";\n\n // Freeze data for immutability\n this.data = Object.freeze({ ...data });\n\n // Capture stack trace\n Error.captureStackTrace(this, FulmenError);\n }\n\n /**\n * Serialize to JSON (schema-compliant)\n */\n toJSON(): FulmenErrorData {\n return this.data;\n }\n\n /**\n * Check equality with another FulmenError\n */\n equals(other: FulmenError): boolean {\n return JSON.stringify(this.data) === JSON.stringify(other.data);\n }\n\n /**\n * Get severity level for comparison\n */\n getSeverityLevel(): SeverityLevel {\n return this.data.severity_level ?? SEVERITY_LEVELS[this.data.severity ?? \"medium\"];\n }\n\n /**\n * Wrap an existing error with FulmenError structure\n *\n * @param error - Error to wrap (Error instance or FulmenErrorData)\n * @param options - Additional error options\n * @returns New FulmenError instance\n *\n * @example\n * ```typescript\n * try {\n * throw new Error('Config invalid');\n * } catch (err) {\n * const fulmenErr = FulmenError.wrap(err, {\n * code: 'CONFIG_INVALID',\n * severity: 'high',\n * exit_code: 2\n * });\n * throw fulmenErr;\n * }\n * ```\n */\n static wrap(error: Error | FulmenErrorData, options: FulmenErrorOptions = {}): FulmenError {\n // If already FulmenError, merge options with recomputed derived fields\n if (error instanceof FulmenError) {\n // Determine effective severity (prefer options, fallback to existing, default to medium)\n const effectiveSeverity = options.severity ?? error.data.severity ?? Severity.MEDIUM;\n // CRITICAL: Recompute severity_level from severity to maintain consistency (ADR-0006)\n const effectiveSeverityLevel = SEVERITY_LEVELS[effectiveSeverity];\n\n // Update timestamp when re-wrapping (indicates new error context)\n const timestamp = new Date().toISOString();\n\n return new FulmenError({\n ...error.data,\n ...options,\n code: options.code ?? error.data.code,\n message: error.data.message,\n severity: effectiveSeverity, // Consistent severity\n severity_level: effectiveSeverityLevel, // Recomputed level\n timestamp, // Updated timestamp\n });\n }\n\n // If FulmenErrorData, recompute derived fields\n if (isFulmenErrorData(error)) {\n const defaultSeverity = getDefaultSeverity();\n // Prefer options.severity, fall back to error.severity, default to medium\n const effectiveSeverity = options.severity ?? error.severity ?? defaultSeverity.name;\n // CRITICAL: Always recompute severity_level from severity (never trust provided level)\n const effectiveSeverityLevel = SEVERITY_LEVELS[effectiveSeverity];\n\n return new FulmenError({\n ...error,\n ...options,\n severity: effectiveSeverity,\n severity_level: effectiveSeverityLevel, // Recomputed, not from error.severity_level\n timestamp: error.timestamp ?? new Date().toISOString(),\n });\n }\n\n // Wrap native Error\n return FulmenError.fromError(error, options);\n }\n\n /**\n * Create FulmenError from native Error object\n *\n * @param err - Native Error instance\n * @param options - Error options\n * @returns New FulmenError instance\n *\n * @example\n * ```typescript\n * const err = new TypeError('Invalid type');\n * const fulmenErr = FulmenError.fromError(err, {\n * code: 'TYPE_ERROR',\n * severity: 'medium'\n * });\n * ```\n */\n static fromError(err: Error | unknown, options: FulmenErrorOptions = {}): FulmenError {\n const code = options.code ?? \"UNKNOWN_ERROR\";\n const severity = options.severity ?? Severity.MEDIUM;\n const severityLevel = SEVERITY_LEVELS[severity];\n\n const message = extractErrorMessage(err);\n const stack = extractStackTrace(err);\n\n const data: FulmenErrorData = {\n code,\n message,\n severity,\n severity_level: severityLevel,\n timestamp: new Date().toISOString(),\n ...options,\n context: {\n ...options.context,\n originalName: err instanceof Error ? err.name : typeof err,\n stack,\n },\n original: stack || message,\n };\n\n return new FulmenError(data);\n }\n\n /**\n * Validate error data against schema\n *\n * @param data - Error data to validate\n * @returns Promise resolving to true if valid\n *\n * @example\n * ```typescript\n * const data = { code: 'TEST', message: 'Test error' };\n * if (await FulmenError.validate(data)) {\n * const err = new FulmenError(data);\n * }\n * ```\n */\n static async validate(data: unknown): Promise<boolean> {\n return validateErrorData(data);\n }\n\n /**\n * Exit process with structured error\n *\n * Logs error as JSON and exits with specified exit code.\n * Mockable for testing (override process.exit).\n *\n * @param error - FulmenError instance\n * @param options - Exit options\n *\n * @example\n * ```typescript\n * const err = FulmenError.fromError(new Error('Fatal'), {\n * code: 'FATAL_ERROR',\n * exit_code: 1\n * });\n * FulmenError.exitWithError(err); // Exits with code 1\n * ```\n */\n static exitWithError(\n error: FulmenError,\n options: { logger?: (msg: string) => void } = {},\n ): never {\n const logger = options.logger ?? console.error;\n const exitCode = error.data.exit_code ?? 1;\n\n // Log structured error\n logger(JSON.stringify(error.toJSON(), null, 2));\n\n // Exit with code\n process.exit(exitCode);\n }\n}\n\n/**\n * Type guard to check if value is FulmenError instance\n *\n * @param value - Value to check\n * @returns True if value is FulmenError\n */\nexport function isFulmenError(value: unknown): value is FulmenError {\n return value instanceof FulmenError;\n}\n\n/**\n * Type guard to check if value is FulmenErrorData\n *\n * @param value - Value to check\n * @returns True if value is FulmenErrorData\n */\nexport function isFulmenErrorData(value: unknown): value is FulmenErrorData {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"code\" in value &&\n typeof (value as FulmenErrorData).code === \"string\" &&\n \"message\" in value &&\n typeof (value as FulmenErrorData).message === \"string\"\n );\n}\n","/**\n * Errors module - structured error handling with telemetry\n *\n * Provides FulmenError data model and utilities for schema-backed error responses\n * with optional telemetry metadata (severity, correlation IDs, exit codes).\n */\n\nexport const VERSION = \"0.2.0\";\n\n// Correlation ID utilities\nexport {\n generateCorrelationId,\n isCorrelationId,\n isValidCorrelationId,\n normalizeCorrelationId,\n} from \"./correlation.js\";\n// Core error class and types\nexport {\n FulmenError,\n type FulmenErrorData,\n type FulmenErrorOptions,\n isFulmenError,\n isFulmenErrorData,\n} from \"./fulmen-error.js\";\n// Serialization utilities\nexport {\n extractErrorMessage,\n extractStackTrace,\n serializeError,\n} from \"./serialization.js\";\n// Severity utilities\nexport {\n compareSeverity,\n getDefaultSeverity,\n isSeverityLevel,\n isSeverityName,\n LEVEL_TO_SEVERITY,\n levelToSeverity,\n SEVERITY_LEVELS,\n Severity,\n type SeverityLevel,\n type SeverityName,\n severityToLevel,\n} from \"./severity.js\";\n// Validation utilities\nexport {\n assertValidErrorData,\n formatValidationErrors,\n getValidationErrors,\n validateErrorData,\n} from \"./validators.js\";\n","/**\n * Application Identity Errors\n *\n * Module-specific error classes for identity operations\n */\n\nimport { FulmenError, type FulmenErrorData } from \"../errors/index.js\";\nimport type { SchemaValidationDiagnostic } from \"../schema/types.js\";\n\n/**\n * Base error class for app identity operations\n */\nexport class AppIdentityError extends FulmenError {\n public readonly identityPath?: string;\n\n constructor(message: string, identityPath?: string, cause?: Error) {\n // Build FulmenErrorData\n let errorData: FulmenErrorData;\n\n if (cause) {\n errorData = FulmenError.fromError(cause, {\n code: \"APP_IDENTITY_ERROR\",\n severity: \"high\",\n context: { identityPath },\n }).data;\n } else {\n errorData = {\n code: \"APP_IDENTITY_ERROR\",\n message,\n severity: \"high\",\n timestamp: new Date().toISOString(),\n context: { identityPath },\n };\n }\n\n super(errorData);\n this.name = \"AppIdentityError\";\n this.identityPath = identityPath;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AppIdentityError);\n }\n }\n\n /**\n * Create error for identity not found\n */\n static notFound(searchedPaths: string[]): AppIdentityError {\n const message = `App identity not found\\nSearched paths:\\n${searchedPaths.map((p) => ` - ${p}`).join(\"\\n\")}`;\n return new AppIdentityError(message);\n }\n\n /**\n * Create error for schema validation failure\n */\n static validationFailed(\n path: string,\n diagnostics: SchemaValidationDiagnostic[],\n ): AppIdentityError {\n const errorCount = diagnostics.filter((d) => d.severity === \"ERROR\").length;\n const warningCount = diagnostics.filter((d) => d.severity === \"WARN\").length;\n\n let message = `Invalid app identity: ${path}\\n`;\n message += `Validation errors: ${errorCount} error(s), ${warningCount} warning(s)\\n`;\n\n // Include first few diagnostics\n const displayDiagnostics = diagnostics.slice(0, 3);\n for (const diag of displayDiagnostics) {\n message += ` - ${diag.message}`;\n if (diag.pointer) {\n message += ` at ${diag.pointer}`;\n }\n message += \"\\n\";\n }\n\n if (diagnostics.length > 3) {\n message += ` ... and ${diagnostics.length - 3} more\\n`;\n }\n\n return new AppIdentityError(message, path);\n }\n\n /**\n * Create error for environment variable override pointing to missing file\n */\n static envOverrideMissing(envPath: string): AppIdentityError {\n const message = `FULMEN_APP_IDENTITY_PATH points to missing file: ${envPath}\\n`;\n return new AppIdentityError(message, envPath);\n }\n\n /**\n * Create error for YAML parsing failure\n */\n static parseFailed(path: string, cause: Error): AppIdentityError {\n const message = `Failed to parse identity file: ${path}\\n${cause.message}`;\n return new AppIdentityError(message, path, cause);\n }\n\n /**\n * Create error for file read failure\n */\n static readFailed(path: string, cause: Error): AppIdentityError {\n const message = `Failed to read identity file: ${path}\\n${cause.message}`;\n return new AppIdentityError(message, path, cause);\n }\n\n /**\n * Create error for embedded identity already registered\n *\n * Uses first-wins semantics - once registered, cannot be replaced\n */\n static alreadyRegistered(): AppIdentityError {\n const message =\n \"Embedded identity already registered. \" +\n \"Registration uses first-wins semantics and cannot be replaced.\";\n return new AppIdentityError(message);\n }\n\n /**\n * Create error for embedded identity YAML parsing failure\n */\n static embeddedParseFailed(cause: Error): AppIdentityError {\n const message = `Failed to parse embedded identity YAML: ${cause.message}`;\n return new AppIdentityError(message, undefined, cause);\n }\n\n /**\n * Create error for embedded identity schema validation failure\n */\n static embeddedValidationFailed(diagnostics: SchemaValidationDiagnostic[]): AppIdentityError {\n const errorCount = diagnostics.filter((d) => d.severity === \"ERROR\").length;\n const warningCount = diagnostics.filter((d) => d.severity === \"WARN\").length;\n\n let message = \"Invalid embedded identity\\n\";\n message += `Validation errors: ${errorCount} error(s), ${warningCount} warning(s)\\n`;\n\n const displayDiagnostics = diagnostics.slice(0, 3);\n for (const diag of displayDiagnostics) {\n message += ` - ${diag.message}`;\n if (diag.pointer) {\n message += ` at ${diag.pointer}`;\n }\n message += \"\\n\";\n }\n\n if (diagnostics.length > 3) {\n message += ` ... and ${diagnostics.length - 3} more\\n`;\n }\n\n return new AppIdentityError(message);\n }\n}\n","/**\n * Embedded Identity Registration\n *\n * Provides a mechanism to register embedded identity at application startup\n * for standalone binary/package support. This allows applications to work\n * without requiring .fulmen/app.yaml to be discoverable on the filesystem.\n *\n * Discovery precedence (with embedded fallback):\n * 1. Explicit path parameter\n * 2. FULMEN_APP_IDENTITY_PATH environment variable\n * 3. Ancestor search from CWD\n * 4. Embedded identity fallback (this module)\n */\n\nimport { parse as parseYAML } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/index.js\";\nimport { APP_IDENTITY_SCHEMA_ID } from \"./constants.js\";\nimport { AppIdentityError } from \"./errors.js\";\nimport type { Identity } from \"./types.js\";\n\n/**\n * Process-level storage for embedded identity\n * Uses first-wins semantics - once registered, cannot be replaced\n */\nlet embeddedIdentity: Identity | null = null;\nlet isRegistered = false;\n\n/**\n * Deep freeze an object and all its nested properties\n */\nfunction deepFreeze<T>(obj: T): T {\n Object.freeze(obj);\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n // biome-ignore lint/suspicious/noExplicitAny: Required for recursive property access\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreeze(value);\n }\n });\n return obj;\n}\n\n/**\n * Register embedded identity YAML that serves as fallback when\n * runtime discovery cannot find an external app.yaml.\n *\n * Semantics:\n * - First registration wins (subsequent calls throw error)\n * - Validates against schema on registration\n * - Stores as immutable process-level fallback\n *\n * @param data - YAML string or pre-parsed Identity object\n * @throws {AppIdentityError} If already registered or validation fails\n *\n * @example\n * ```typescript\n * // From npm package entry point\n * import { registerEmbeddedIdentity } from \"@fulmenhq/tsfulmen/appidentity\";\n * import { readFileSync } from \"node:fs\";\n * import { fileURLToPath } from \"node:url\";\n * import { dirname, join } from \"node:path\";\n *\n * const __filename = fileURLToPath(import.meta.url);\n * const __dirname = dirname(__filename);\n * const embeddedPath = join(__dirname, \"..\", \".fulmen\", \"app.yaml\");\n *\n * try {\n * const yaml = readFileSync(embeddedPath, \"utf-8\");\n * registerEmbeddedIdentity(yaml);\n * } catch {\n * // Embedded identity not available - discovery will use filesystem\n * }\n * ```\n */\nexport async function registerEmbeddedIdentity(data: string | Identity): Promise<void> {\n // First-wins semantics\n if (isRegistered) {\n throw AppIdentityError.alreadyRegistered();\n }\n\n let identity: Identity;\n\n if (typeof data === \"string\") {\n // Parse YAML\n let parsed: unknown;\n try {\n parsed = parseYAML(data);\n } catch (error) {\n throw AppIdentityError.embeddedParseFailed(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Validate against schema\n const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\n\n identity = parsed as Identity;\n } else {\n // Pre-parsed object - still validate\n const result = await validateDataBySchemaId(data, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\n identity = data;\n }\n\n // Deep freeze and store\n embeddedIdentity = deepFreeze(structuredClone(identity)) as Identity;\n isRegistered = true;\n}\n\n/**\n * Check if embedded identity has been registered\n *\n * @returns true if registerEmbeddedIdentity() has been called successfully\n */\nexport function hasEmbeddedIdentity(): boolean {\n return isRegistered;\n}\n\n/**\n * Get the registered embedded identity\n *\n * @returns Frozen identity object or null if not registered\n */\nexport function getEmbeddedIdentity(): Identity | null {\n return embeddedIdentity;\n}\n\n/**\n * Clear embedded identity registration\n *\n * WARNING: For testing only. In production, embedded identity should be\n * set once at startup and never cleared.\n */\nexport function clearEmbeddedIdentity(): void {\n embeddedIdentity = null;\n isRegistered = false;\n}\n","/**\n * Application Identity Cache\n *\n * Process-level caching for identity objects with immutability guarantees\n */\n\nimport type { Identity } from \"./types.js\";\n\n/**\n * Process-level cache storage\n * null = not cached, Identity = cached value\n */\nlet cachedIdentity: Identity | null = null;\n\n/**\n * Get cached identity if available\n *\n * @returns Cached identity or null if not cached\n */\nexport function getCachedIdentity(): Identity | null {\n return cachedIdentity;\n}\n\n/**\n * Set cached identity\n *\n * Identity object should already be frozen before caching\n *\n * @param identity - Identity to cache (must be frozen)\n */\nexport function setCachedIdentity(identity: Identity): void {\n cachedIdentity = identity;\n}\n\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport function clearIdentityCache(): void {\n cachedIdentity = null;\n}\n","/**\n * Application Identity Discovery\n *\n * Implements the Crucible discovery precedence algorithm:\n * 1. Explicit path parameter (highest priority)\n * 2. Environment variable override (FULMEN_APP_IDENTITY_PATH)\n * 3. Ancestor search from CWD upward\n */\n\nimport { access } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n APP_IDENTITY_DIR,\n APP_IDENTITY_ENV_VAR,\n APP_IDENTITY_FILENAME,\n MAX_ANCESTOR_SEARCH_DEPTH,\n} from \"./constants.js\";\nimport { AppIdentityError } from \"./errors.js\";\n\n/**\n * Discovery result with path and source\n */\nexport interface DiscoveryResult {\n readonly path: string;\n readonly source: \"explicit\" | \"env\" | \"ancestor\" | \"test\";\n}\n\n/**\n * Options for identity discovery\n */\nexport interface DiscoveryOptions {\n /**\n * Explicit path override (highest priority)\n */\n readonly path?: string;\n\n /**\n * Starting directory for ancestor search\n * Defaults to process.cwd()\n */\n readonly startDir?: string;\n}\n\n/**\n * Discover application identity file using Crucible precedence algorithm\n *\n * Discovery order:\n * 1. Explicit path parameter (throws if not found)\n * 2. FULMEN_APP_IDENTITY_PATH env var (throws if set but not found)\n * 3. Ancestor search from startDir (throws if not found after max depth)\n *\n * @param options - Discovery options\n * @returns Discovery result with path and source\n * @throws {AppIdentityError} If identity file not found or inaccessible\n */\nexport async function discoverIdentityPath(\n options?: DiscoveryOptions,\n): Promise<DiscoveryResult | null> {\n // 1. Explicit path parameter (highest priority)\n if (options?.path) {\n const exists = await fileExists(options.path);\n if (!exists) {\n throw AppIdentityError.notFound([options.path]);\n }\n return { path: options.path, source: \"explicit\" };\n }\n\n // 2. Environment variable override\n const envPath = process.env[APP_IDENTITY_ENV_VAR];\n if (envPath) {\n const exists = await fileExists(envPath);\n if (!exists) {\n throw AppIdentityError.envOverrideMissing(envPath);\n }\n return { path: envPath, source: \"env\" };\n }\n\n // 3. Ancestor search from startDir\n const startDir = options?.startDir || process.cwd();\n const result = await searchAncestors(startDir);\n if (result) {\n return { path: result, source: \"ancestor\" };\n }\n\n return null;\n}\n\n/**\n * Search ancestor directories for identity file\n *\n * Walks upward from startDir to filesystem root, looking for .fulmen/app.yaml\n * Stops at MAX_ANCESTOR_SEARCH_DEPTH or filesystem root\n *\n * @param startDir - Directory to start search from\n * @returns Path to identity file if found, null otherwise\n * @throws {AppIdentityError} If max depth reached or filesystem root reached without finding file\n */\nasync function searchAncestors(startDir: string): Promise<string | null> {\n let currentDir = startDir;\n const searchedPaths: string[] = [];\n\n for (let i = 0; i < MAX_ANCESTOR_SEARCH_DEPTH; i++) {\n const candidatePath = join(currentDir, APP_IDENTITY_DIR, APP_IDENTITY_FILENAME);\n searchedPaths.push(candidatePath);\n\n if (await fileExists(candidatePath)) {\n return candidatePath;\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n // Reached filesystem root\n throw AppIdentityError.notFound(searchedPaths);\n }\n currentDir = parentDir;\n }\n\n // Max depth reached\n throw AppIdentityError.notFound(searchedPaths);\n}\n\n/**\n * Check if a file exists and is accessible\n *\n * @param path - Path to check\n * @returns true if file exists and is readable, false otherwise\n */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Application Identity Loader\n *\n * Main loading logic with YAML parsing, schema validation, and caching\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { parse as parseYAML } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/index.js\";\nimport { clearIdentityCache, getCachedIdentity, setCachedIdentity } from \"./cache.js\";\nimport { APP_IDENTITY_ENV_VAR, APP_IDENTITY_SCHEMA_ID } from \"./constants.js\";\nimport { discoverIdentityPath } from \"./discovery.js\";\nimport { getEmbeddedIdentity } from \"./embedded.js\";\nimport { AppIdentityError } from \"./errors.js\";\nimport type { Identity, LoadIdentityOptions } from \"./types.js\";\n\n/**\n * Deep freeze an object and all its nested properties\n *\n * Recursively freezes an object and all nested objects/functions to ensure\n * complete immutability. This prevents accidental mutations of identity data.\n *\n * Note: Uses `any` type assertion (line 28) to access arbitrary properties\n * during recursive traversal. This is necessary because TypeScript's generic\n * constraint system cannot express \"any object with indexable properties\"\n * without losing the return type safety. The `any` is scoped to a single\n * line and protected by runtime guards.\n *\n * @param obj - Object to freeze\n * @returns Frozen object (same type as input)\n */\nfunction deepFreeze<T>(obj: T): T {\n // Freeze the object itself\n Object.freeze(obj);\n\n // Recursively freeze all properties\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n // biome-ignore lint/suspicious/noExplicitAny: Required for recursive property access - see function docs\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreeze(value);\n }\n });\n\n return obj;\n}\n\n/**\n * Load application identity from .fulmen/app.yaml\n *\n * Discovery order:\n * 1. Test injection (options.identity) - bypasses all discovery and caching\n * 2. Explicit path (options.path)\n * 3. Environment variable (FULMEN_APP_IDENTITY_PATH)\n * 4. Ancestor search from startDir or CWD\n * 5. Embedded identity fallback (if registered via registerEmbeddedIdentity)\n *\n * Results are cached after first successful load unless skipCache is true.\n * Test injections are never cached.\n *\n * @param options - Load options\n * @returns Frozen, immutable identity object\n * @throws {AppIdentityError} If identity not found, invalid, or unreadable\n */\nexport async function loadIdentity(options?: LoadIdentityOptions): Promise<Identity> {\n // Test injection (never caches)\n if (options?.identity) {\n return deepFreeze(structuredClone(options.identity)) as Identity;\n }\n\n // Check cache unless skipCache\n if (!options?.skipCache) {\n const cached = getCachedIdentity();\n if (cached) {\n return cached;\n }\n }\n\n // Discover file - may throw AppIdentityError.notFound or return null\n let discovery: Awaited<ReturnType<typeof discoverIdentityPath>>;\n try {\n discovery = await discoverIdentityPath({\n path: options?.path,\n startDir: options?.startDir,\n });\n } catch (error) {\n // Discovery failed (e.g., reached filesystem root without finding identity)\n // Embedded fallback MUST NOT override explicit path or env override semantics.\n const hasExplicitPath = Boolean(options?.path);\n const hasEnvOverride = Boolean(process.env[APP_IDENTITY_ENV_VAR]);\n\n if (!hasExplicitPath && !hasEnvOverride && error instanceof AppIdentityError) {\n const embedded = getEmbeddedIdentity();\n if (embedded) {\n // Cache the embedded identity for subsequent calls\n setCachedIdentity(embedded);\n return embedded;\n }\n }\n\n throw error;\n }\n\n // If discovery returned null (no env var, no explicit path, and ancestor search returned null)\n if (!discovery) {\n const embedded = getEmbeddedIdentity();\n if (embedded) {\n // Cache the embedded identity for subsequent calls\n setCachedIdentity(embedded);\n return embedded;\n }\n throw AppIdentityError.notFound([]);\n }\n\n // Read file\n let content: string;\n try {\n content = await readFile(discovery.path, \"utf-8\");\n } catch (error) {\n throw AppIdentityError.readFailed(\n discovery.path,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Parse YAML\n let parsed: unknown;\n try {\n parsed = parseYAML(content);\n } catch (error) {\n throw AppIdentityError.parseFailed(\n discovery.path,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Validate against schema (unless skipValidation)\n if (!options?.skipValidation) {\n const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);\n\n if (!result.valid) {\n throw AppIdentityError.validationFailed(discovery.path, result.diagnostics);\n }\n }\n\n // Deep freeze for immutability\n const identity = deepFreeze(structuredClone(parsed)) as Identity;\n\n // Cache result\n setCachedIdentity(identity);\n\n return identity;\n}\n\n/**\n * Get cached identity without triggering load\n *\n * @returns Cached identity or null if not cached\n */\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport { clearIdentityCache, getCachedIdentity };\n","import type { Identity } from \"./types.js\";\n\nexport type RuntimeName = \"bun\" | \"node\" | \"unknown\";\n\nexport interface RuntimeInfo {\n service: {\n name: string;\n vendor?: string;\n version?: string;\n };\n runtime: {\n name: RuntimeName;\n version?: string;\n };\n platform: {\n os: NodeJS.Platform;\n arch: string;\n };\n}\n\nexport interface BuildRuntimeInfoOptions {\n identity?: Identity;\n version?: string;\n serviceName?: string;\n vendor?: string;\n}\n\nfunction detectRuntime(): { name: RuntimeName; version?: string } {\n const versions = process.versions as unknown as Record<string, string | undefined>;\n\n if (typeof versions.bun === \"string\" && versions.bun.length > 0) {\n return { name: \"bun\", version: versions.bun };\n }\n\n if (typeof versions.node === \"string\" && versions.node.length > 0) {\n return { name: \"node\", version: versions.node };\n }\n\n return { name: \"unknown\" };\n}\n\n/**\n * Build a minimal runtime info payload suitable for discovery endpoints.\n */\nexport function buildRuntimeInfo(options: BuildRuntimeInfoOptions = {}): RuntimeInfo {\n const runtime = detectRuntime();\n\n const serviceName = options.serviceName ?? options.identity?.app.binary_name ?? \"unknown-service\";\n const vendor = options.vendor ?? options.identity?.app.vendor;\n\n return {\n service: {\n name: serviceName,\n vendor,\n version: options.version,\n },\n runtime,\n platform: {\n os: process.platform,\n arch: process.arch,\n },\n };\n}\n","/**\n * Application Identity Module\n *\n * Provides typed access to .fulmen/app.yaml identity metadata\n * Layer 0 module: zero Fulmen module dependencies\n */\n\n// Constants\nexport {\n APP_IDENTITY_DIR,\n APP_IDENTITY_ENV_VAR,\n APP_IDENTITY_FILENAME,\n APP_IDENTITY_SCHEMA_ID,\n MAX_ANCESTOR_SEARCH_DEPTH,\n} from \"./constants.js\";\n\n// Embedded identity (for standalone binary/package support)\nexport {\n clearEmbeddedIdentity,\n getEmbeddedIdentity,\n hasEmbeddedIdentity,\n registerEmbeddedIdentity,\n} from \"./embedded.js\";\n\n// Errors\nexport { AppIdentityError } from \"./errors.js\";\nexport type { ConfigIdentifiers } from \"./helpers.js\";\n// Helpers\nexport {\n buildEnvVar,\n getBinaryName,\n getConfigIdentifiers,\n getConfigName,\n getEnvPrefix,\n getEnvVar,\n getTelemetryNamespace,\n getVendor,\n} from \"./helpers.js\";\n// Functions\nexport {\n clearIdentityCache,\n getCachedIdentity,\n loadIdentity,\n} from \"./loader.js\";\n\nexport {\n type BuildRuntimeInfoOptions,\n buildRuntimeInfo,\n type RuntimeInfo,\n type RuntimeName,\n} from \"./runtime.js\";\n// Types\nexport type {\n AppIdentity,\n Identity,\n IdentityMetadata,\n LoadIdentityOptions,\n PythonMetadata,\n RepositoryCategory,\n} from \"./types.js\";\n","/**\n * Application Identity Helpers\n *\n * Convenience functions for accessing identity fields\n * All helpers use loadIdentity() under the hood for caching benefits\n */\n\nimport { loadIdentity } from \"./loader.js\";\nimport type { LoadIdentityOptions } from \"./types.js\";\n\n/**\n * Config identifiers for path construction\n */\nexport interface ConfigIdentifiers {\n readonly vendor: string;\n readonly configName: string;\n}\n\n/**\n * Get the binary name from app identity\n *\n * @param options - Load options (optional)\n * @returns Binary name (e.g., 'myapp')\n */\nexport async function getBinaryName(options?: LoadIdentityOptions): Promise<string> {\n const identity = await loadIdentity(options);\n return identity.app.binary_name;\n}\n\n/**\n * Get the vendor namespace from app identity\n *\n * @param options - Load options (optional)\n * @returns Vendor namespace (e.g., 'acmecorp')\n */\nexport async function getVendor(options?: LoadIdentityOptions): Promise<string> {\n const identity = await loadIdentity(options);\n return identity.app.vendor;\n}\n\n/**\n * Get the environment variable prefix from app identity\n *\n * @param options - Load options (optional)\n * @returns Env prefix (e.g., 'MYAPP_')\n */\nexport async function getEnvPrefix(options?: LoadIdentityOptions): Promise<string> {\n const identity = await loadIdentity(options);\n return identity.app.env_prefix;\n}\n\n/**\n * Get the config directory name from app identity\n *\n * @param options - Load options (optional)\n * @returns Config name (e.g., 'myapp')\n */\nexport async function getConfigName(options?: LoadIdentityOptions): Promise<string> {\n const identity = await loadIdentity(options);\n return identity.app.config_name;\n}\n\n/**\n * Get the telemetry namespace from app identity\n *\n * Falls back to binary_name if telemetry_namespace is not specified\n *\n * @param options - Load options (optional)\n * @returns Telemetry namespace (e.g., 'acmecorp_myapp' or 'myapp')\n */\nexport async function getTelemetryNamespace(options?: LoadIdentityOptions): Promise<string> {\n const identity = await loadIdentity(options);\n return identity.metadata?.telemetry_namespace ?? identity.app.binary_name;\n}\n\n/**\n * Get config identifiers for path construction\n *\n * Returns vendor and configName for building config paths like:\n * ~/.config/{vendor}/{configName}/config.yaml\n *\n * @param options - Load options (optional)\n * @returns Frozen config identifiers { vendor, configName }\n */\nexport async function getConfigIdentifiers(\n options?: LoadIdentityOptions,\n): Promise<ConfigIdentifiers> {\n const identity = await loadIdentity(options);\n return Object.freeze({\n vendor: identity.app.vendor,\n configName: identity.app.config_name,\n });\n}\n\n/**\n * Build environment variable name with app prefix\n *\n * Constructs env var names like: MYAPP_DATABASE_URL\n * Normalizes invalid characters (anything outside [A-Z0-9_]) to underscores\n * for conventional env var naming.\n *\n * Examples:\n * - 'database-url' → 'MYAPP_DATABASE_URL'\n * - 'my.config' → 'MYAPP_MY_CONFIG'\n * - 'log_level' → 'MYAPP_LOG_LEVEL'\n *\n * @param key - Environment variable key (will be uppercased and normalized)\n * @param options - Load options (optional)\n * @returns Full environment variable name (e.g., 'MYAPP_DATABASE_URL')\n */\nexport async function buildEnvVar(key: string, options?: LoadIdentityOptions): Promise<string> {\n const envPrefix = await getEnvPrefix(options);\n // Uppercase and replace any non-alphanumeric/underscore characters with underscores\n const normalizedKey = key.toUpperCase().replace(/[^A-Z0-9_]/g, \"_\");\n return `${envPrefix}${normalizedKey}`;\n}\n\n/**\n * Get environment variable value using app prefix\n *\n * Convenience wrapper around process.env using buildEnvVar\n *\n * @param key - Environment variable key (will be uppercased)\n * @param options - Load options (optional)\n * @returns Environment variable value or undefined\n */\nexport async function getEnvVar(\n key: string,\n options?: LoadIdentityOptions,\n): Promise<string | undefined> {\n const envVarName = await buildEnvVar(key, options);\n return process.env[envVarName];\n}\n","/**\n * Normalization utilities for DocScribe module inputs.\n */\n\nconst decoder = new TextDecoder(\"utf-8\", { fatal: false, ignoreBOM: true });\n\nexport type NormalizedInput = {\n readonly content: string;\n readonly original: string | Uint8Array | ArrayBufferLike;\n};\n\nfunction stripBom(value: string): string {\n return value.charCodeAt(0) === 0xfeff ? value.slice(1) : value;\n}\n\nfunction normalizeNewlines(value: string): string {\n return value.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\n/**\n * Normalize supported input types to a UTF-8 string with consistent newlines.\n */\nexport function normalizeInput(input: string | Uint8Array | ArrayBufferLike): NormalizedInput {\n let content: string;\n\n if (typeof input === \"string\") {\n content = input;\n } else if (input instanceof Uint8Array) {\n content = decoder.decode(input);\n } else {\n content = decoder.decode(new Uint8Array(input));\n }\n\n const normalized = normalizeNewlines(stripBom(content));\n return { content: normalized, original: input };\n}\n","/**\n * DocScribe module public types.\n */\n\nexport type DocScribePrimitiveValue = string | number | boolean | null;\n\nexport type DocScribeMetadataValue =\n | DocScribePrimitiveValue\n | ReadonlyArray<DocScribeMetadataValue>\n | { readonly [key: string]: DocScribeMetadataValue };\n\nexport interface DocScribeMetadata extends Record<string, DocScribeMetadataValue | undefined> {\n readonly title?: string;\n readonly description?: string;\n readonly author?: string;\n readonly date?: string;\n readonly lastUpdated?: string;\n readonly status?: string;\n readonly tags?: ReadonlyArray<string>;\n readonly version?: string;\n readonly relatedDocs?: ReadonlyArray<string>;\n readonly meta?: DocScribeMetadataValue;\n}\n\nexport interface DocScribeFrontmatterResult {\n readonly metadata: DocScribeMetadata | null;\n readonly body: string;\n readonly range: {\n readonly start: number;\n readonly end: number;\n } | null;\n readonly bodyStartLine: number;\n}\n\nexport interface DocScribeHeader {\n readonly level: number;\n readonly text: string;\n readonly slug: string;\n readonly line: number;\n}\n\nexport type DocScribeFormat = \"markdown\" | \"yaml\" | \"yaml-stream\" | \"json\" | \"toml\" | \"plain\";\n\nexport interface DocScribeInfo {\n readonly format: DocScribeFormat;\n readonly hasFrontmatter: boolean;\n readonly frontmatterRange: {\n readonly start: number;\n readonly end: number;\n } | null;\n readonly metadata: DocScribeMetadata | null;\n readonly headerCount: number;\n readonly estimatedSections: number;\n readonly bodyStartLine: number;\n readonly lineCount: number;\n readonly size: number;\n readonly headers: ReadonlyArray<DocScribeHeader>;\n}\n\nexport interface DocScribeSplit {\n readonly content: string;\n readonly format: DocScribeFormat;\n readonly hasFrontmatter: boolean;\n readonly metadata: DocScribeMetadata | null;\n readonly startLine: number;\n readonly endLine: number;\n readonly index: number;\n}\n\nexport interface DocScribeOptions {\n readonly maxDocuments?: number;\n readonly slugify?: (header: string) => string;\n readonly maxDepth?: number;\n}\n\nexport class DocScribeError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"DocScribeError\";\n }\n}\n\nexport class DocScribeParseError extends DocScribeError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"DocScribeParseError\";\n }\n}\n\nexport class DocScribeUnsupportedFormatError extends DocScribeError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"DocScribeUnsupportedFormatError\";\n }\n}\n","import { parseDocument } from \"yaml\";\n\nimport { normalizeInput } from \"./normalize.js\";\nimport {\n type DocScribeFrontmatterResult,\n type DocScribeMetadata,\n type DocScribeMetadataValue,\n DocScribeParseError,\n} from \"./types.js\";\n\nconst FRONTMATTER_DELIMITER = \"---\";\nconst STRING_KEYS = new Set<string>([\n \"title\",\n \"description\",\n \"author\",\n \"date\",\n \"lastUpdated\",\n \"status\",\n \"version\",\n]);\n\ninterface FrontmatterBounds {\n readonly start: number;\n readonly openEnd: number;\n readonly closingStart: number;\n readonly closingEnd: number;\n}\n\nexport function parseFrontmatter(\n input: string | Uint8Array | ArrayBufferLike,\n): DocScribeFrontmatterResult {\n const { content } = normalizeInput(input);\n const bounds = locateFrontmatter(content);\n\n if (!bounds) {\n return { metadata: null, body: content, range: null, bodyStartLine: 1 };\n }\n\n const yamlBlock = content.slice(bounds.openEnd, bounds.closingStart);\n const metadata =\n yamlBlock.trim().length === 0 ? ({} as DocScribeMetadata) : parseYamlMetadata(yamlBlock);\n\n const bodyRaw = content.slice(bounds.closingEnd);\n const leadingNewlinesMatch = bodyRaw.match(/^\\n+/);\n const leadingNewlinesLength = leadingNewlinesMatch ? leadingNewlinesMatch[0].length : 0;\n const bodyStartIndex = bounds.closingEnd + leadingNewlinesLength;\n const prefix = content.slice(0, bodyStartIndex);\n const bodyStartLine = prefix.length === 0 ? 1 : prefix.split(\"\\n\").length;\n const body = bodyRaw.slice(leadingNewlinesLength);\n\n return {\n metadata,\n body,\n range: { start: bounds.start, end: bounds.closingEnd },\n bodyStartLine,\n };\n}\n\nexport function stripFrontmatter(input: string | Uint8Array | ArrayBufferLike): string {\n return parseFrontmatter(input).body;\n}\n\nexport function extractMetadata(\n input: string | Uint8Array | ArrayBufferLike,\n): DocScribeMetadata | null {\n return parseFrontmatter(input).metadata;\n}\n\nfunction locateFrontmatter(content: string): FrontmatterBounds | null {\n let cursor = 0;\n\n while (cursor < content.length) {\n const newlineIndex = content.indexOf(\"\\n\", cursor);\n const lineEnd = newlineIndex === -1 ? content.length : newlineIndex;\n const line = content.slice(cursor, lineEnd);\n\n if (line.trim().length === 0) {\n if (newlineIndex === -1) {\n return null;\n }\n cursor = newlineIndex + 1;\n continue;\n }\n\n if (line.trim() !== FRONTMATTER_DELIMITER) {\n return null;\n }\n\n const openStart = cursor;\n const openEnd = newlineIndex === -1 ? content.length : newlineIndex + 1;\n\n let search = openEnd;\n while (search <= content.length) {\n const nextNewline = content.indexOf(\"\\n\", search);\n const segmentEnd = nextNewline === -1 ? content.length : nextNewline;\n const candidate = content.slice(search, segmentEnd).trim();\n\n if (candidate === FRONTMATTER_DELIMITER) {\n const closingStart = search;\n const closingEnd = nextNewline === -1 ? segmentEnd : nextNewline + 1;\n return {\n start: openStart,\n openEnd,\n closingStart,\n closingEnd,\n };\n }\n\n if (nextNewline === -1) {\n break;\n }\n\n search = nextNewline + 1;\n }\n\n return null;\n }\n\n return null;\n}\n\nfunction parseYamlMetadata(source: string): DocScribeMetadata {\n const document = parseDocument(source, { prettyErrors: true });\n\n if (document.errors.length > 0) {\n const error = document.errors[0];\n const location = error.linePos && error.linePos.length > 0 ? error.linePos[0] : null;\n const position = location ? ` (line ${location.line + 1}, column ${location.col + 1})` : \"\";\n throw new DocScribeParseError(`Invalid YAML frontmatter${position}: ${error.message}`, {\n cause: error,\n });\n }\n\n let raw: unknown;\n try {\n raw = document.toJS({ mapAsMap: false });\n } catch (error) {\n throw new DocScribeParseError(\"Failed to parse YAML frontmatter\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n if (raw == null) {\n return {} as DocScribeMetadata;\n }\n\n if (typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new DocScribeParseError(\"YAML frontmatter must be a mapping at the top level\");\n }\n\n return normalizeMetadata(raw as Record<string, unknown>);\n}\n\nfunction normalizeMetadata(raw: Record<string, unknown>): DocScribeMetadata {\n const normalized: Record<string, DocScribeMetadataValue | undefined> = {};\n\n for (const [key, value] of Object.entries(raw)) {\n normalized[key] = normalizeMetadataValue(value);\n }\n\n const base: Record<string, DocScribeMetadataValue | undefined> = {};\n for (const [key, value] of Object.entries(normalized)) {\n if (STRING_KEYS.has(key) || key === \"tags\" || key === \"relatedDocs\") {\n continue;\n }\n base[key] = value;\n }\n\n const metadata: DocScribeMetadata = {\n ...base,\n ...(normalized.title !== undefined ? { title: ensureStringValue(normalized.title) } : {}),\n ...(normalized.description !== undefined\n ? { description: ensureStringValue(normalized.description) }\n : {}),\n ...(normalized.author !== undefined ? { author: ensureStringValue(normalized.author) } : {}),\n ...(normalized.date !== undefined ? { date: ensureStringValue(normalized.date) } : {}),\n ...(normalized.lastUpdated !== undefined\n ? { lastUpdated: ensureStringValue(normalized.lastUpdated) }\n : {}),\n ...(normalized.status !== undefined ? { status: ensureStringValue(normalized.status) } : {}),\n ...(normalized.version !== undefined ? { version: ensureStringValue(normalized.version) } : {}),\n ...(normalized.tags !== undefined\n ? (() => {\n const tags = ensureStringArray(normalized.tags);\n return tags.length > 0 ? { tags } : {};\n })()\n : {}),\n ...(normalized.relatedDocs !== undefined\n ? (() => {\n const related = ensureStringArray(normalized.relatedDocs);\n return related.length > 0 ? { relatedDocs: related } : {};\n })()\n : {}),\n };\n\n return metadata;\n}\n\nfunction normalizeMetadataValue(value: unknown): DocScribeMetadataValue {\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (Array.isArray(value)) {\n return value.map((item) =>\n normalizeMetadataValue(item),\n ) as ReadonlyArray<DocScribeMetadataValue>;\n }\n\n if (typeof value === \"object\") {\n const result: Record<string, DocScribeMetadataValue> = {};\n for (const [key, nested] of Object.entries(value as Record<string, unknown>)) {\n result[key] = normalizeMetadataValue(nested);\n }\n return result as { readonly [key: string]: DocScribeMetadataValue };\n }\n\n return String(value);\n}\n\nfunction ensureStringValue(value: DocScribeMetadataValue): string {\n if (value === null) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => ensureStringArrayItem(item)).join(\", \");\n }\n\n return JSON.stringify(value);\n}\n\nfunction ensureStringArray(value: DocScribeMetadataValue): ReadonlyArray<string> {\n return ensureStringArrayItem(value);\n}\n\nfunction ensureStringArrayItem(value: DocScribeMetadataValue): string[] {\n if (value === null) {\n return [];\n }\n\n if (typeof value === \"string\") {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return [String(value)];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => ensureStringArrayItem(item));\n }\n\n return [JSON.stringify(value)];\n}\n","import { parseFrontmatter } from \"./frontmatter.js\";\nimport { normalizeInput } from \"./normalize.js\";\nimport type { DocScribeHeader, DocScribeOptions } from \"./types.js\";\n\nconst ATX_PATTERN = /^ {0,3}(#{1,6})(?:[ \\t]+|$)(.*)$/;\nconst SETEXT_PATTERN = /^ {0,3}(=+|-+)\\s*$/;\n\nexport function extractHeaders(\n input: string | Uint8Array | ArrayBufferLike,\n options?: DocScribeOptions,\n): DocScribeHeader[] {\n const { content } = normalizeInput(input);\n const parsed = parseFrontmatter(content);\n const body = parsed.body;\n const lineOffset = parsed.bodyStartLine;\n\n const slugify = options?.slugify ?? defaultSlugify;\n const maxDepth = options?.maxDepth ?? 6;\n\n const lines = body.split(\"\\n\");\n const headers: DocScribeHeader[] = [];\n\n let inFence = false;\n let fenceMarker: \"`\" | \"~\" | null = null;\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n const trimmed = line.trimEnd();\n const lineNumber = lineOffset + index;\n\n const fenceMatch = line.match(/^ {0,3}(```+|~~~+)/);\n if (fenceMatch) {\n const marker = fenceMatch[1][0] as \"`\" | \"~\";\n if (!inFence) {\n inFence = true;\n fenceMarker = marker;\n } else if (fenceMarker === marker) {\n inFence = false;\n fenceMarker = null;\n }\n continue;\n }\n\n if (inFence) {\n continue;\n }\n\n if (/^( {4}|\\t)/.test(line)) {\n continue;\n }\n\n const atxMatch = trimmed.match(ATX_PATTERN);\n if (atxMatch) {\n const level = atxMatch[1].length;\n if (level <= maxDepth) {\n const rawText = atxMatch[2].replace(/#+\\s*$/, \"\").trim();\n const text = rawText.length > 0 ? rawText : \"\";\n const slug = ensureSlug(slugify, text, lineNumber);\n headers.push({ level, text, slug, line: lineNumber });\n }\n continue;\n }\n\n if (trimmed.length === 0) {\n continue;\n }\n\n if (index + 1 >= lines.length) {\n continue;\n }\n\n const nextLine = lines[index + 1];\n const setextMatch = SETEXT_PATTERN.exec(nextLine.trimEnd());\n if (setextMatch) {\n const underline = setextMatch[1];\n const level = underline.startsWith(\"=\") ? 1 : 2;\n if (level <= maxDepth) {\n const text = trimmed.trim();\n if (text.length > 0 && !/^ {0,3}(```|~~~)/.test(text)) {\n const slug = ensureSlug(slugify, text, lineNumber);\n headers.push({ level, text, slug, line: lineNumber });\n }\n }\n index += 1;\n }\n }\n\n return headers;\n}\n\nfunction defaultSlugify(value: string): string {\n return value\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .trim()\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\");\n}\n\nfunction ensureSlug(slugify: (header: string) => string, text: string, lineNumber: number): string {\n const candidate = slugify(text);\n if (candidate && candidate.trim().length > 0) {\n return candidate;\n }\n return `section-${lineNumber}`;\n}\n","import { parseFrontmatter } from \"./frontmatter.js\";\nimport { extractHeaders } from \"./headers.js\";\nimport { normalizeInput } from \"./normalize.js\";\nimport type { DocScribeFormat, DocScribeInfo, DocScribeOptions } from \"./types.js\";\n\nconst JSON_PATTERN = /^[\\s\\t]*[[{]/;\nconst TOML_ASSIGNMENT = /^[A-Za-z0-9_\"'\\-.]+\\s*=\\s*.+$/;\nconst TOML_TABLE = /^\\s*\\[[^\\]]+\\]\\s*$/;\nconst YAML_KEY_PATTERN = /^\\s*[\\w\"'-]+\\s*:\\s*.+$/;\nconst MARKDOWN_HEADING = /(\\n|^)\\s{0,3}#{1,6}\\s+/;\nconst MARKDOWN_LIST = /(\\n|^)\\s{0,3}(?:-|\\*|\\+)\\s+/;\nconst MARKDOWN_SETEXT = /(\\n|^).+\\n\\s{0,3}(?:=+|-+)\\s*(\\n|$)/;\n\nexport function detectFormat(input: string | Uint8Array | ArrayBufferLike): DocScribeFormat {\n const { content } = normalizeInput(input);\n return detectFormatFromContent(content);\n}\n\nexport function inspectDocument(\n input: string | Uint8Array | ArrayBufferLike,\n options?: DocScribeOptions,\n): DocScribeInfo {\n const { content } = normalizeInput(input);\n const format = detectFormatFromContent(content);\n const frontmatter = parseFrontmatter(content);\n const headers = extractHeaders(content, options);\n const headerCount = headers.length;\n const estimatedSections =\n headerCount > 0 ? headerCount : frontmatter.body.trim().length > 0 ? 1 : 0;\n const lineCount = content.length === 0 ? 0 : content.split(\"\\n\").length;\n const size = content.length;\n\n return {\n format,\n hasFrontmatter: frontmatter.metadata !== null,\n frontmatterRange: frontmatter.range,\n metadata: frontmatter.metadata,\n headerCount,\n estimatedSections,\n bodyStartLine: frontmatter.bodyStartLine,\n lineCount,\n size,\n headers,\n };\n}\n\nfunction detectFormatFromContent(content: string): DocScribeFormat {\n const trimmed = content.trim();\n if (trimmed.length === 0) {\n return \"plain\";\n }\n\n if (looksLikeJson(trimmed)) {\n return \"json\";\n }\n\n if (looksLikeToml(trimmed)) {\n return \"toml\";\n }\n\n const yamlSeparatorCount = countYamlSeparators(content);\n if (yamlSeparatorCount >= 1 && isLikelyYamlStream(content)) {\n return \"yaml-stream\";\n }\n\n const markdownIndicators = hasMarkdownIndicators(content);\n\n if (looksLikeYaml(trimmed) && !markdownIndicators) {\n return \"yaml\";\n }\n\n const frontmatter = parseFrontmatter(content);\n if (frontmatter.metadata !== null) {\n const body = frontmatter.body.trim();\n if (markdownIndicators || MARKDOWN_HEADING.test(body) || MARKDOWN_LIST.test(body)) {\n return \"markdown\";\n }\n if (!body) {\n return \"markdown\";\n }\n }\n\n if (markdownIndicators) {\n return \"markdown\";\n }\n\n return \"plain\";\n}\n\nfunction looksLikeJson(trimmed: string): boolean {\n if (!JSON_PATTERN.test(trimmed)) {\n return false;\n }\n try {\n JSON.parse(trimmed);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nfunction looksLikeToml(content: string): boolean {\n const lines = content.split(\"\\n\");\n let tableCount = 0;\n let assignmentCount = 0;\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (line === \"\" || line.startsWith(\"#\")) {\n continue;\n }\n if (TOML_TABLE.test(line)) {\n tableCount += 1;\n continue;\n }\n if (TOML_ASSIGNMENT.test(line)) {\n assignmentCount += 1;\n }\n }\n return tableCount > 0 || assignmentCount >= 3;\n}\n\nfunction looksLikeYaml(trimmed: string): boolean {\n if (trimmed.startsWith(\"%YAML\")) {\n return true;\n }\n const lines = trimmed.split(\"\\n\");\n let signal = 0;\n for (const raw of lines.slice(0, 20)) {\n const line = raw.trim();\n if (line === \"\" || line.startsWith(\"#\")) {\n continue;\n }\n if (line === \"---\") {\n signal += 1;\n continue;\n }\n if (YAML_KEY_PATTERN.test(line) || /^-\\s/.test(line)) {\n signal += 1;\n }\n }\n return signal >= 2;\n}\n\nfunction countYamlSeparators(content: string): number {\n const matches = content.match(/(^|\\n)---\\s*(\\n|$)/g);\n return matches ? matches.length : 0;\n}\n\nfunction isLikelyYamlStream(content: string): boolean {\n const lines = content.split(\"\\n\");\n let yamlSignals = 0;\n let markdownSignals = 0;\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (line === \"\" || line === \"---\") {\n continue;\n }\n\n if (\n /^#/.test(line) ||\n /^\\s{0,3}(?:-|\\*|\\+)\\s+/.test(line) ||\n /(\\[[^\\]]+\\]\\([^)]+\\))/.test(line)\n ) {\n markdownSignals += 1;\n }\n\n if (/:\\s/.test(line) || /^-\\s/.test(line)) {\n yamlSignals += 1;\n }\n }\n\n return yamlSignals >= 2 && markdownSignals === 0;\n}\n\nfunction hasMarkdownIndicators(content: string): boolean {\n return (\n MARKDOWN_HEADING.test(content) ||\n MARKDOWN_LIST.test(content) ||\n MARKDOWN_SETEXT.test(content) ||\n /(\\n|^)\\s{0,3}>\\s+/.test(content) ||\n /(\\[[^\\]]+\\]\\([^)]+\\))/.test(content)\n );\n}\n\n// Internal helper exported for testing or reuse\nexport const __internal = {\n detectFormatFromContent,\n looksLikeJson,\n looksLikeToml,\n looksLikeYaml,\n isLikelyYamlStream,\n};\n","import { detectFormat } from \"./format.js\";\nimport { parseFrontmatter } from \"./frontmatter.js\";\nimport { normalizeInput } from \"./normalize.js\";\nimport type { DocScribeFormat, DocScribeOptions, DocScribeSplit } from \"./types.js\";\n\ntype RawSplit = Omit<DocScribeSplit, \"index\">;\n\ntype LineInfo = { line: string; lineNumber: number };\n\ntype AccumulatedDoc = { lines: string[]; startLine: number };\n\nexport function splitDocuments(\n input: string | Uint8Array | ArrayBufferLike,\n options?: DocScribeOptions,\n): DocScribeSplit[] {\n const { content } = normalizeInput(input);\n const trimmed = content.trim();\n\n if (trimmed.length === 0) {\n return [];\n }\n\n const maxDocuments = options?.maxDocuments ?? Number.POSITIVE_INFINITY;\n const format = detectFormat(content);\n\n let splits: DocScribeSplit[];\n if (format === \"yaml-stream\") {\n splits = withIndices(splitYamlStream(content));\n } else if (format === \"markdown\") {\n const markdownSplits = splitMarkdownDocuments(content);\n splits =\n markdownSplits.length > 0\n ? withIndices(markdownSplits)\n : [withIndex(buildSingleSplit(content, format, 1), 0)];\n } else {\n splits = [withIndex(buildSingleSplit(content, format, 1), 0)];\n }\n\n return applyDocumentLimit(splits, maxDocuments);\n}\n\nfunction splitYamlStream(content: string): RawSplit[] {\n const lines = content.split(\"\\n\");\n const docs: AccumulatedDoc[] = [];\n let current: AccumulatedDoc = { lines: [], startLine: 1 };\n let delimiterCount = 0;\n\n const flush = () => {\n if (current.lines.join(\"\\n\").trim().length === 0) {\n current = { lines: [], startLine: current.startLine };\n return;\n }\n docs.push({ ...current, lines: [...current.lines] });\n current = { lines: [], startLine: current.startLine };\n };\n\n for (let index = 0; index < lines.length; index += 1) {\n const lineNumber = index + 1;\n const line = lines[index];\n const trimmed = line.trim();\n\n if (trimmed === \"---\") {\n delimiterCount += 1;\n flush();\n current = { lines: [], startLine: lineNumber + 1 };\n continue;\n }\n\n if (delimiterCount === 0) {\n current.startLine = 1;\n }\n\n current.lines.push(line);\n }\n\n flush();\n\n if (docs.length === 0) {\n return [buildRawSplit(content, \"yaml\", null, 1, content.split(\"\\n\").length)];\n }\n\n return docs\n .map((doc) => {\n const joined = doc.lines.join(\"\\n\");\n const lineCount = doc.lines.length;\n return buildRawSplit(\n joined,\n \"yaml\",\n null,\n doc.startLine,\n doc.startLine + Math.max(lineCount - 1, 0),\n );\n })\n .filter((split) => split.content.trim().length > 0);\n}\n\nfunction splitMarkdownDocuments(content: string): RawSplit[] {\n const frontmatter = parseFrontmatter(content);\n const lines = content.split(\"\\n\");\n const docs: AccumulatedDoc[] = [];\n const frontmatterLimit = frontmatter.metadata ? Math.max(frontmatter.bodyStartLine - 1, 0) : 0;\n\n let current: AccumulatedDoc = { lines: [], startLine: 1 };\n let inFence = false;\n let fenceMarker: \"`\" | \"~\" | null = null;\n\n const flush = () => {\n if (current.lines.join(\"\\n\").trim().length === 0) {\n current = { lines: [], startLine: current.startLine };\n return;\n }\n docs.push({ ...current, lines: [...current.lines] });\n current = { lines: [], startLine: current.startLine };\n };\n\n for (let index = 0; index < lines.length; index += 1) {\n const lineNumber = index + 1;\n const line = lines[index];\n const trimmed = line.trimEnd();\n\n const fenceMatch = line.match(/^ {0,3}(```+|~~~+)/);\n if (fenceMatch) {\n const marker = fenceMatch[1][0] as \"`\" | \"~\";\n if (!inFence) {\n inFence = true;\n fenceMarker = marker;\n } else if (fenceMarker === marker) {\n inFence = false;\n fenceMarker = null;\n }\n }\n\n const isPrimaryFrontmatter = frontmatterLimit > 0 && lineNumber <= frontmatterLimit;\n\n if (!inFence && !isPrimaryFrontmatter && trimmed === \"---\") {\n const prev = findPrevNonEmpty(lines, index - 1);\n const next = findNextNonEmpty(lines, index + 1);\n const prevLooksLikeMetadata = prev ? /:\\s*/.test(prev.line) : false;\n const nextIsHeading = next ? next.line.trim().startsWith(\"#\") : false;\n\n if (next && !prevLooksLikeMetadata && nextIsHeading) {\n flush();\n current = { lines: [], startLine: next.lineNumber };\n continue;\n }\n }\n\n current.lines.push(line);\n }\n\n flush();\n\n return docs\n .map((doc) => {\n const contentValue = doc.lines.join(\"\\n\");\n const parsed = parseFrontmatter(contentValue);\n const lineCount = doc.lines.length;\n return buildRawSplit(\n contentValue,\n \"markdown\",\n parsed.metadata,\n doc.startLine,\n doc.startLine + Math.max(lineCount - 1, 0),\n parsed.metadata !== null,\n );\n })\n .filter((split) => split.content.trim().length > 0);\n}\n\nfunction buildSingleSplit(content: string, format: DocScribeFormat, startLine: number): RawSplit {\n const parsed = parseFrontmatter(content);\n const lineCount = content.length === 0 ? 0 : content.split(\"\\n\").length;\n return buildRawSplit(\n content,\n format,\n parsed.metadata,\n startLine,\n startLine + Math.max(lineCount - 1, 0),\n parsed.metadata !== null,\n );\n}\n\nfunction buildRawSplit(\n content: string,\n format: DocScribeFormat,\n metadata: ReturnType<typeof parseFrontmatter>[\"metadata\"],\n startLine: number,\n endLine: number,\n hasFrontmatter = false,\n): RawSplit {\n return {\n content,\n format,\n hasFrontmatter,\n metadata: metadata ?? null,\n startLine,\n endLine,\n };\n}\n\nfunction applyDocumentLimit(splits: DocScribeSplit[], maxDocuments: number): DocScribeSplit[] {\n if (maxDocuments <= 0) {\n return [];\n }\n\n if (splits.length <= maxDocuments) {\n return splits.map((split, idx) => ({ ...split, index: idx }));\n }\n\n const cutoff = Math.max(maxDocuments - 1, 0);\n const allowed = splits.slice(0, cutoff);\n const remaining = splits.slice(cutoff);\n const merged = mergeSplitGroup(remaining);\n const combined = cutoff === 0 ? [merged] : [...allowed, merged];\n return combined.map((split, idx) => ({ ...split, index: idx }));\n}\n\nfunction mergeSplitGroup(splits: DocScribeSplit[]): DocScribeSplit {\n const first = splits[0];\n const last = splits[splits.length - 1];\n const combinedContent = splits.map((split) => split.content).join(\"\\n---\\n\");\n return {\n content: combinedContent,\n format: first.format,\n hasFrontmatter: first.hasFrontmatter,\n metadata: first.metadata,\n startLine: first.startLine,\n endLine: last.endLine,\n index: 0,\n };\n}\n\nfunction withIndices(rawSplits: RawSplit[]): DocScribeSplit[] {\n return rawSplits.map((split, idx) => withIndex(split, idx));\n}\n\nfunction withIndex(split: RawSplit, index: number): DocScribeSplit {\n return { ...split, index };\n}\n\nfunction findNextNonEmpty(lines: readonly string[], startIndex: number): LineInfo | null {\n for (let index = startIndex; index < lines.length; index += 1) {\n const candidate = lines[index];\n if (candidate.trim().length === 0) {\n continue;\n }\n return { line: candidate, lineNumber: index + 1 };\n }\n return null;\n}\n\nfunction findPrevNonEmpty(lines: readonly string[], startIndex: number): LineInfo | null {\n for (let index = startIndex; index >= 0; index -= 1) {\n const candidate = lines[index];\n if (candidate.trim().length === 0) {\n continue;\n }\n return { line: candidate, lineNumber: index + 1 };\n }\n return null;\n}\n","/**\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","/**\n * TSFulmen - TypeScript Fulmen Helper Library\n *\n * Provides ergonomic access to Crucible SSOT assets and core utilities\n * for TypeScript/Node.js applications in the FulmenHQ ecosystem.\n */\n\nexport const VERSION = \"0.3.2\";\n\nexport * from \"./appidentity/index.js\";\nexport * from \"./docscribe/index.js\";\n\n// Core modules will be exported here as they are implemented\n// export * from './config/index.js';\n// export * from './crucible/index.js';\n// export * from './errors/index.js';\n// export * from './logging/index.js';\n// export * from './schema/index.js';\n// export * from './telemetry/index.js';\nexport * from \"./fulpack/index.js\";\n"]}