@fulmenhq/tsfulmen 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +9 -8
- package/dist/appidentity/index.d.ts +30 -108
- package/dist/appidentity/index.js +251 -8
- package/dist/appidentity/index.js.map +1 -1
- package/dist/config/index.d.ts +46 -1
- package/dist/config/index.js +309 -10
- package/dist/config/index.js.map +1 -1
- package/dist/crucible/index.js +249 -7
- package/dist/crucible/index.js.map +1 -1
- package/dist/errors/index.js +249 -7
- package/dist/errors/index.js.map +1 -1
- package/dist/foundry/index.d.ts +2 -1
- package/dist/foundry/index.js +250 -8
- package/dist/foundry/index.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +252 -9
- package/dist/index.js.map +1 -1
- package/dist/pathfinder/index.js +249 -7
- package/dist/pathfinder/index.js.map +1 -1
- package/dist/reports/license-inventory.csv +29 -23
- package/dist/schema/index.d.ts +14 -1
- package/dist/schema/index.js +250 -8
- package/dist/schema/index.js.map +1 -1
- package/dist/signals/index.d.ts +483 -395
- package/dist/signals/index.js +250 -8
- package/dist/signals/index.js.map +1 -1
- package/dist/telemetry/http/index.js +250 -7
- package/dist/telemetry/http/index.js.map +1 -1
- package/dist/telemetry/index.js +249 -7
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/prometheus/index.js +251 -7
- package/dist/telemetry/prometheus/index.js.map +1 -1
- package/dist/types-Dv5TERCM.d.ts +108 -0
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/errors/correlation.ts","../../../src/errors/severity.ts","../../../src/errors/serialization.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/export.ts","../../../src/foundry/errors.ts","../../../src/foundry/loader.ts","../../../src/foundry/country-codes.ts","../../../src/crucible/foundry/exitCodes.ts","../../../src/foundry/exit-codes/capabilities.ts","../../../src/foundry/exit-codes/simplified.ts","../../../src/foundry/exit-codes/index.ts","../../../src/foundry/http-statuses.ts","../../../src/foundry/magic-numbers.ts","../../../src/foundry/detector.ts","../../../src/foundry/mime-types.ts","../../../src/foundry/patterns.ts","../../../src/foundry/signals/catalog.ts","../../../src/foundry/signals/capabilities.ts","../../../src/foundry/signals/convenience.ts","../../../src/foundry/signals/double-tap.ts","../../../src/foundry/signals/windows.ts","../../../src/foundry/signals/guards.ts","../../../src/foundry/signals/http-helper.ts","../../../src/foundry/signals/manager.ts","../../../src/foundry/signals/reload.ts","../../../src/foundry/signals/index.ts","../../../src/foundry/similarity/distance.ts","../../../src/foundry/similarity/errors.ts","../../../src/foundry/similarity/normalization.ts","../../../src/foundry/similarity/score.ts","../../../src/foundry/similarity/suggest.ts","../../../src/foundry/similarity/index.ts","../../../src/foundry/index.ts","../../../src/appidentity/cache.ts","../../../src/appidentity/constants.ts","../../../src/appidentity/errors.ts","../../../src/appidentity/discovery.ts","../../../src/appidentity/embedded.ts","../../../src/appidentity/loader.ts","../../../src/schema/cli.ts","../../../src/schema/index.ts","../../../src/errors/validators.ts","../../../src/errors/fulmen-error.ts","../../../src/errors/index.ts","../../../node_modules/prom-client/lib/util.js","../../../node_modules/prom-client/lib/registry.js","../../../node_modules/prom-client/lib/validation.js","../../../node_modules/prom-client/lib/metric.js","../../../node_modules/prom-client/lib/exemplar.js","../../../node_modules/prom-client/lib/counter.js","../../../node_modules/prom-client/lib/gauge.js","../../../node_modules/prom-client/lib/histogram.js","../../../node_modules/bintrees/lib/treebase.js","../../../node_modules/bintrees/lib/rbtree.js","../../../node_modules/bintrees/lib/bintree.js","../../../node_modules/bintrees/index.js","../../../node_modules/tdigest/tdigest.js","../../../node_modules/prom-client/lib/timeWindowQuantiles.js","../../../node_modules/prom-client/lib/summary.js","../../../node_modules/prom-client/lib/pushgateway.js","../../../node_modules/prom-client/lib/bucketGenerators.js","../../../node_modules/@opentelemetry/api/src/platform/node/globalThis.ts","../../../node_modules/@opentelemetry/api/src/platform/node/index.ts","../../../node_modules/@opentelemetry/api/src/platform/index.ts","../../../node_modules/@opentelemetry/api/src/version.ts","../../../node_modules/@opentelemetry/api/src/internal/semver.ts","../../../node_modules/@opentelemetry/api/src/internal/global-utils.ts","../../../node_modules/@opentelemetry/api/src/diag/ComponentLogger.ts","../../../node_modules/@opentelemetry/api/src/diag/types.ts","../../../node_modules/@opentelemetry/api/src/diag/internal/logLevelLogger.ts","../../../node_modules/@opentelemetry/api/src/api/diag.ts","../../../node_modules/@opentelemetry/api/src/baggage/internal/baggage-impl.ts","../../../node_modules/@opentelemetry/api/src/baggage/internal/symbol.ts","../../../node_modules/@opentelemetry/api/src/baggage/utils.ts","../../../node_modules/@opentelemetry/api/src/context/context.ts","../../../node_modules/@opentelemetry/api/src/diag/consoleLogger.ts","../../../node_modules/@opentelemetry/api/src/metrics/NoopMeter.ts","../../../node_modules/@opentelemetry/api/src/metrics/Metric.ts","../../../node_modules/@opentelemetry/api/src/propagation/TextMapPropagator.ts","../../../node_modules/@opentelemetry/api/src/context/NoopContextManager.ts","../../../node_modules/@opentelemetry/api/src/api/context.ts","../../../node_modules/@opentelemetry/api/src/trace/trace_flags.ts","../../../node_modules/@opentelemetry/api/src/trace/invalid-span-constants.ts","../../../node_modules/@opentelemetry/api/src/trace/NonRecordingSpan.ts","../../../node_modules/@opentelemetry/api/src/trace/context-utils.ts","../../../node_modules/@opentelemetry/api/src/trace/spancontext-utils.ts","../../../node_modules/@opentelemetry/api/src/trace/NoopTracer.ts","../../../node_modules/@opentelemetry/api/src/trace/ProxyTracer.ts","../../../node_modules/@opentelemetry/api/src/trace/NoopTracerProvider.ts","../../../node_modules/@opentelemetry/api/src/trace/ProxyTracerProvider.ts","../../../node_modules/@opentelemetry/api/src/trace/SamplingResult.ts","../../../node_modules/@opentelemetry/api/src/trace/span_kind.ts","../../../node_modules/@opentelemetry/api/src/trace/status.ts","../../../node_modules/@opentelemetry/api/src/trace/internal/tracestate-validators.ts","../../../node_modules/@opentelemetry/api/src/trace/internal/tracestate-impl.ts","../../../node_modules/@opentelemetry/api/src/trace/internal/utils.ts","../../../node_modules/@opentelemetry/api/src/context-api.ts","../../../node_modules/@opentelemetry/api/src/diag-api.ts","../../../node_modules/@opentelemetry/api/src/metrics/NoopMeterProvider.ts","../../../node_modules/@opentelemetry/api/src/api/metrics.ts","../../../node_modules/@opentelemetry/api/src/metrics-api.ts","../../../node_modules/@opentelemetry/api/src/propagation/NoopTextMapPropagator.ts","../../../node_modules/@opentelemetry/api/src/baggage/context-helpers.ts","../../../node_modules/@opentelemetry/api/src/api/propagation.ts","../../../node_modules/@opentelemetry/api/src/propagation-api.ts","../../../node_modules/@opentelemetry/api/src/api/trace.ts","../../../node_modules/@opentelemetry/api/src/trace-api.ts","../../../node_modules/@opentelemetry/api/src/index.ts","../../../node_modules/prom-client/lib/metrics/processCpuTotal.js","../../../node_modules/prom-client/lib/metrics/processStartTime.js","../../../node_modules/prom-client/lib/metrics/osMemoryHeapLinux.js","../../../node_modules/prom-client/lib/metrics/helpers/safeMemoryUsage.js","../../../node_modules/prom-client/lib/metrics/osMemoryHeap.js","../../../node_modules/prom-client/lib/metrics/processOpenFileDescriptors.js","../../../node_modules/prom-client/lib/metrics/processMaxFileDescriptors.js","../../../node_modules/prom-client/lib/metrics/eventLoopLag.js","../../../node_modules/prom-client/lib/metrics/helpers/processMetricsHelpers.js","../../../node_modules/prom-client/lib/metrics/processHandles.js","../../../node_modules/prom-client/lib/metrics/processRequests.js","../../../node_modules/prom-client/lib/metrics/processResources.js","../../../node_modules/prom-client/lib/metrics/heapSizeAndUsed.js","../../../node_modules/prom-client/lib/metrics/heapSpacesSizeAndUsed.js","../../../node_modules/prom-client/lib/metrics/version.js","../../../node_modules/prom-client/lib/metrics/gc.js","../../../node_modules/prom-client/lib/defaultMetrics.js","../../../node_modules/prom-client/lib/metricAggregators.js","../../../node_modules/prom-client/lib/cluster.js","../../../node_modules/prom-client/index.js","../../../src/appidentity/helpers.ts","../../../src/appidentity/index.ts","../../../src/telemetry/prometheus/constants.ts","../../../src/telemetry/prometheus/errors.ts","../../../src/telemetry/prometheus/exporter.ts","../../../src/telemetry/prometheus/lifecycle.ts","../../../src/logging/types.ts","../../../src/logging/policy.ts","../../../src/logging/sinks.ts","../../../src/logging/logger.ts","../../../src/logging/create-logger.ts","../../../src/telemetry/prometheus/server.ts"],"names":["ExportErrorReason","diag","parseYAML","__filename","__dirname","access","join","readFile","parseYaml","init_registry","fileURLToPath","dirname","stringifyYAML","extname","init_errors","SimplifiedMode","deepClone","deepFreeze","ensureCatalogLoaded","catalogCache","loadCatalog","SSOT_PATHS","getPlatform","isPOSIX","isWindows","supportsSignalExitCodes","getPlatformCapabilities","init_capabilities","wasmNormalize","substringSimilarity","wasmScore","wasmSuggest","errors_exports","init_loader","validateSchema","writeFile","exportSchema","exitCodes","SchemaExportError","SchemaValidationError","loadIdentity","AppIdentityError","init_validators","metrics","Counter","Gauge","Histogram","ret","globalRegistry","VERSION","isCompatible","DiagComponentLogger","init_types","DiagLogLevel","DiagAPI","__spreadArray","__read","BaggageImpl","init_utils","BaseContext","context","DiagConsoleLogger","NoopMeter","NoopMetric","NoopCounterMetric","NoopUpDownCounterMetric","NoopGaugeMetric","NoopHistogramMetric","NoopObservableMetric","NoopObservableCounterMetric","NoopObservableGaugeMetric","NoopObservableUpDownCounterMetric","ValueType","NoopContextManager","API_NAME","init_context","ContextAPI","TraceFlags","NonRecordingSpan","NoopTracer","ProxyTracer","NoopTracerProvider","ProxyTracerProvider","SamplingDecision","SpanKind","SpanStatusCode","TraceStateImpl","NoopMeterProvider","MetricsAPI","NoopTextMapPropagator","PropagationAPI","TraceAPI","value","process","LoggingProfile"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 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 proc.on(\"close\", (code) => resolve(code === 0));\n proc.on(\"error\", () => resolve(false));\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\";\nimport Ajv2020 from \"ajv/dist/2020\";\nimport AjvDraft04 from \"ajv-draft-04\";\nimport addFormats from \"ajv-formats\";\nimport { parse as parseYAML } from \"yaml\";\nimport { metrics } from \"../telemetry/index.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 addFormats(ajv, {\n mode: \"fast\",\n formats: [\"date-time\", \"email\", \"hostname\", \"ipv4\", \"ipv6\", \"uri\", \"uri-reference\"],\n });\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 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 * Foundry module - Error handling\n *\n * Custom error classes for Foundry catalog operations with fail-fast validation.\n */\n\nexport class FoundryCatalogError extends Error {\n constructor(\n message: string,\n public readonly catalog?: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = \"FoundryCatalogError\";\n\n // Maintain proper stack trace for V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FoundryCatalogError);\n }\n }\n\n static invalidSchema(catalog: string, details: string, cause?: Error): FoundryCatalogError {\n return new FoundryCatalogError(\n `Invalid schema in ${catalog} catalog: ${details}`,\n catalog,\n cause,\n );\n }\n\n static missingCatalog(catalog: string): FoundryCatalogError {\n return new FoundryCatalogError(`Catalog ${catalog} not found or could not be loaded`, catalog);\n }\n\n static invalidPattern(patternId: string, details: string): FoundryCatalogError {\n return new FoundryCatalogError(`Invalid pattern ${patternId}: ${details}`, \"patterns\");\n }\n\n static compilationError(patternId: string, details: string, cause?: Error): FoundryCatalogError {\n return new FoundryCatalogError(\n `Failed to compile pattern ${patternId}: ${details}`,\n \"patterns\",\n cause,\n );\n }\n}\n","/**\n * Foundry module - SSOT data loader\n *\n * Loads and validates Foundry catalog data from Crucible SSOT assets\n * with Bun-first approach and comprehensive schema validation.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parse as parseYaml } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/validator.js\";\nimport { FoundryCatalogError } from \"./errors.js\";\nimport type {\n CountryCatalog,\n HttpStatusCatalog,\n MimeTypeCatalog,\n PatternCatalog,\n} from \"./types.js\";\n\n// Get the directory of the current module file for proper path resolution\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// SSOT Asset Paths (relative to module file, resolved to absolute paths)\nconst SSOT_PATHS = {\n patterns: join(__dirname, \"../../config/crucible-ts/library/foundry/patterns.yaml\"),\n httpStatuses: join(__dirname, \"../../config/crucible-ts/library/foundry/http-statuses.yaml\"),\n mimeTypes: join(__dirname, \"../../config/crucible-ts/library/foundry/mime-types.yaml\"),\n countryCodes: join(__dirname, \"../../config/crucible-ts/library/foundry/country-codes.yaml\"),\n} as const;\n\n// Schema IDs for Foundry catalogs (from Crucible SSOT)\nconst SCHEMA_IDS = {\n patterns: \"library/foundry/v1.0.0/patterns\",\n httpStatuses: \"library/foundry/v1.0.0/http-status-groups\",\n mimeTypes: \"library/foundry/v1.0.0/mime-types\",\n countryCodes: \"library/foundry/v1.0.0/country-codes\",\n} as const;\n\n/**\n * Load and validate a Foundry catalog from YAML file\n * Bun-first approach with Node.js fallback\n */\nasync function loadCatalog<T>(filePath: string, catalogName: string, schemaId: string): Promise<T> {\n try {\n let content: string;\n\n // Bun-first approach\n if (typeof Bun !== \"undefined\") {\n try {\n const file = Bun.file(filePath);\n if (!(await file.exists())) {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n content = await file.text();\n } catch (error) {\n // Handle Bun-specific errors\n if (error instanceof Error && error.message.includes(\"No such file\")) {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n throw error;\n }\n } else {\n // Node.js fallback\n try {\n content = await readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n throw error;\n }\n }\n\n // Parse YAML content\n const data = parseYaml(content) as T;\n\n // Validate against JSON Schema from Crucible SSOT\n const result = await validateDataBySchemaId(data, schemaId);\n if (!result.valid) {\n const errorMessages = result.diagnostics.map((d) => `${d.pointer}: ${d.message}`).join(\"; \");\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n `Schema validation failed: ${errorMessages}`,\n );\n }\n\n return data;\n } catch (error) {\n if (error instanceof FoundryCatalogError) {\n throw error;\n }\n\n // Distinguish between different types of file access errors\n const err = error as NodeJS.ErrnoException;\n if (err.code === \"ENOENT\") {\n throw FoundryCatalogError.missingCatalog(catalogName);\n } else if (err.code === \"EACCES\") {\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n \"Permission denied accessing catalog file\",\n err,\n );\n } else if (err.code === \"EISDIR\") {\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n \"Expected file but found directory\",\n err,\n );\n } else if (err.code === \"EMFILE\" || err.code === \"ENFILE\") {\n throw FoundryCatalogError.invalidSchema(catalogName, \"Too many open files\", err);\n }\n\n throw FoundryCatalogError.invalidSchema(catalogName, \"Failed to load catalog\", err);\n }\n}\n\n/**\n * Load Pattern Catalog from SSOT\n */\nexport async function loadPatternCatalog(): Promise<PatternCatalog> {\n return loadCatalog<PatternCatalog>(SSOT_PATHS.patterns, \"patterns\", SCHEMA_IDS.patterns);\n}\n\n/**\n * Load HTTP Status Catalog from SSOT\n */\nexport async function loadHttpStatusCatalog(): Promise<HttpStatusCatalog> {\n return loadCatalog<HttpStatusCatalog>(\n SSOT_PATHS.httpStatuses,\n \"httpStatuses\",\n SCHEMA_IDS.httpStatuses,\n );\n}\n\n/**\n * Load MIME Type Catalog from SSOT\n */\nexport async function loadMimeTypeCatalog(): Promise<MimeTypeCatalog> {\n return loadCatalog<MimeTypeCatalog>(SSOT_PATHS.mimeTypes, \"mimeTypes\", SCHEMA_IDS.mimeTypes);\n}\n\n/**\n * Load Country Code Catalog from SSOT\n */\nexport async function loadCountryCodeCatalog(): Promise<CountryCatalog> {\n return loadCatalog<CountryCatalog>(\n SSOT_PATHS.countryCodes,\n \"countryCodes\",\n SCHEMA_IDS.countryCodes,\n );\n}\n\n/**\n * Load all Foundry catalogs\n */\nexport async function loadAllCatalogs(): Promise<{\n patterns: PatternCatalog;\n httpStatuses: HttpStatusCatalog;\n mimeTypes: MimeTypeCatalog;\n countryCodes: CountryCatalog;\n}> {\n const [patterns, httpStatuses, mimeTypes, countryCodes] = await Promise.all([\n loadPatternCatalog(),\n loadHttpStatusCatalog(),\n loadMimeTypeCatalog(),\n loadCountryCodeCatalog(),\n ]);\n\n return { patterns, httpStatuses, mimeTypes, countryCodes };\n}\n","/**\n * Foundry Country Code Catalog - implements ISO 3166 country code lookups\n *\n * Provides case-insensitive alpha-2/alpha-3 lookups and normalized numeric lookups\n * with proper padding (76 → \"076\", \"76\" → \"076\", \"076\" → \"076\")\n */\n\nimport { loadCountryCodeCatalog } from \"./loader.js\";\nimport type { Country, CountryCatalog } from \"./types.js\";\n\nlet catalogCache: CountryCatalog | null = null;\nconst alpha2Index = new Map<string, Country>();\nconst alpha3Index = new Map<string, Country>();\nconst numericIndex = new Map<string, Country>();\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as T;\n }\n\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return cloned as T;\n}\n\nfunction deepFreeze<T extends object>(obj: T): T {\n Object.freeze(obj);\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key];\n if (value !== null && typeof value === \"object\") {\n deepFreeze(value);\n }\n }\n }\n\n return obj;\n}\n\nfunction normalizeNumeric(code: string | number): string {\n const str = typeof code === \"number\" ? code.toString() : code;\n return str.padStart(3, \"0\");\n}\n\nasync function ensureCatalogLoaded(): Promise<void> {\n if (catalogCache !== null) {\n return;\n }\n\n catalogCache = await loadCountryCodeCatalog();\n\n for (const country of catalogCache.countries) {\n // Alpha-2 index (case-insensitive, uppercase keys)\n alpha2Index.set(country.alpha2.toUpperCase(), country);\n\n // Alpha-3 index (case-insensitive, uppercase keys)\n alpha3Index.set(country.alpha3.toUpperCase(), country);\n\n // Numeric index (normalized to 3 digits with leading zeros)\n const normalized = normalizeNumeric(country.numeric);\n numericIndex.set(normalized, country);\n }\n}\n\nexport async function getCountryByAlpha2(code: string): Promise<Readonly<Country> | null> {\n await ensureCatalogLoaded();\n const normalized = code.toUpperCase();\n const country = alpha2Index.get(normalized);\n return country ? deepFreeze(deepClone(country)) : null;\n}\n\nexport async function getCountryByAlpha3(code: string): Promise<Readonly<Country> | null> {\n await ensureCatalogLoaded();\n const normalized = code.toUpperCase();\n const country = alpha3Index.get(normalized);\n return country ? deepFreeze(deepClone(country)) : null;\n}\n\nexport async function getCountryByNumeric(\n code: string | number,\n): Promise<Readonly<Country> | null> {\n await ensureCatalogLoaded();\n const normalized = normalizeNumeric(code);\n const country = numericIndex.get(normalized);\n return country ? deepFreeze(deepClone(country)) : null;\n}\n\nexport async function listCountries(): Promise<ReadonlyArray<Readonly<Country>>> {\n await ensureCatalogLoaded();\n return Array.from(alpha2Index.values()).map((c) => deepFreeze(deepClone(c)));\n}\n\nexport function clearCountryCodeCache(): void {\n catalogCache = null;\n alpha2Index.clear();\n alpha3Index.clear();\n numericIndex.clear();\n}\n","/**\n * Exit Codes - Generated from Crucible catalog\n *\n * This file is AUTO-GENERATED from the Foundry exit codes catalog.\n * DO NOT EDIT MANUALLY - changes will be overwritten.\n *\n * Catalog Version: v1.0.0\n * Last Reviewed: 2025-10-31\n * Source: config/library/foundry/exit-codes.yaml\n */\n\n/**\n * Standardized process exit codes for Fulmen ecosystem\n *\n * @see https://github.com/fulmenhq/crucible/blob/main/docs/standards/library/foundry/README.md#exit-codes\n */\nexport const exitCodes = {\n // Standard Exit Codes (0-1)\n // POSIX standard success and generic failure codes\n EXIT_SUCCESS: 0,\n EXIT_FAILURE: 1,\n\n // Networking & Port Management (10-19)\n // Network-related failures (ports, connectivity, etc.)\n EXIT_PORT_IN_USE: 10,\n EXIT_PORT_RANGE_EXHAUSTED: 11,\n EXIT_INSTANCE_ALREADY_RUNNING: 12,\n EXIT_NETWORK_UNREACHABLE: 13,\n EXIT_CONNECTION_REFUSED: 14,\n EXIT_CONNECTION_TIMEOUT: 15,\n\n // Configuration & Validation (20-29)\n // Configuration errors, validation failures, version mismatches\n EXIT_CONFIG_INVALID: 20,\n EXIT_MISSING_DEPENDENCY: 21,\n EXIT_SSOT_VERSION_MISMATCH: 22,\n EXIT_CONFIG_FILE_NOT_FOUND: 23,\n EXIT_ENVIRONMENT_INVALID: 24,\n\n // Runtime Errors (30-39)\n // Errors during normal operation (health checks, database, etc.)\n EXIT_HEALTH_CHECK_FAILED: 30,\n EXIT_DATABASE_UNAVAILABLE: 31,\n EXIT_EXTERNAL_SERVICE_UNAVAILABLE: 32,\n EXIT_RESOURCE_EXHAUSTED: 33,\n EXIT_OPERATION_TIMEOUT: 34,\n\n // Command-Line Usage Errors (40-49)\n // Invalid arguments, missing required flags, usage errors\n EXIT_INVALID_ARGUMENT: 40,\n EXIT_MISSING_REQUIRED_ARGUMENT: 41,\n EXIT_USAGE: 64,\n\n // Permissions & File Access (50-59)\n // Permission denied, file not found, access errors\n EXIT_PERMISSION_DENIED: 50,\n EXIT_FILE_NOT_FOUND: 51,\n EXIT_DIRECTORY_NOT_FOUND: 52,\n EXIT_FILE_READ_ERROR: 53,\n EXIT_FILE_WRITE_ERROR: 54,\n\n // Data & Processing Errors (60-69)\n // Data validation, parsing, transformation failures\n EXIT_DATA_INVALID: 60,\n EXIT_PARSE_ERROR: 61,\n EXIT_TRANSFORMATION_FAILED: 62,\n EXIT_DATA_CORRUPT: 63,\n\n // Security & Authentication (70-79)\n // Authentication failures, authorization errors, security violations\n EXIT_AUTHENTICATION_FAILED: 70,\n EXIT_AUTHORIZATION_FAILED: 71,\n EXIT_SECURITY_VIOLATION: 72,\n EXIT_CERTIFICATE_INVALID: 73,\n\n // Observability & Monitoring (80-89)\n // Observability infrastructure failures. Use when observability is CRITICAL to operation (e.g., monitoring agents, telemetry exporters). For workhorses where observability is auxiliary: - Log warning and continue (don't exit) - Emit degraded health status - Only exit if explicitly configured (fail_on_observability_error: true)\n EXIT_METRICS_UNAVAILABLE: 80,\n EXIT_TRACING_FAILED: 81,\n EXIT_LOGGING_FAILED: 82,\n EXIT_ALERT_SYSTEM_FAILED: 83,\n EXIT_STRUCTURED_LOGGING_FAILED: 84,\n\n // Testing & Validation (91-99)\n // Test execution outcomes and validation failures. NOTE: Test harnesses MUST use EXIT_SUCCESS (0) for successful test runs per ecosystem conventions (pytest, Go testing, Jest all use 0 for success). Codes in this category are for FAILURES and exceptional conditions only.\n EXIT_TEST_FAILURE: 91,\n EXIT_TEST_ERROR: 92,\n EXIT_TEST_INTERRUPTED: 93,\n EXIT_TEST_USAGE_ERROR: 94,\n EXIT_TEST_NO_TESTS_COLLECTED: 95,\n EXIT_COVERAGE_THRESHOLD_NOT_MET: 96,\n\n // Shell & Process Control (124-127)\n // Exit codes from shell conventions and process control utilities (timeout, exec)\n EXIT_TIMEOUT: 124,\n EXIT_TIMEOUT_INTERNAL: 125,\n EXIT_CANNOT_EXECUTE: 126,\n EXIT_NOT_FOUND: 127,\n\n // Signal-Induced Exits (128-165)\n // Process terminated by Unix signals (128+N pattern per POSIX). Signal codes follow Linux numbering; macOS/FreeBSD differ for SIGUSR1/SIGUSR2. For full signal semantics, see config/library/foundry/signals.yaml. For signal handling patterns, see docs/standards/library/modules/signal-handling.md.\n EXIT_SIGNAL_HUP: 129,\n EXIT_SIGNAL_INT: 130,\n EXIT_SIGNAL_QUIT: 131,\n EXIT_SIGNAL_KILL: 137,\n EXIT_SIGNAL_PIPE: 141,\n EXIT_SIGNAL_ALRM: 142,\n EXIT_SIGNAL_TERM: 143,\n EXIT_SIGNAL_USR1: 138,\n EXIT_SIGNAL_USR2: 140,\n} as const;\n\n/**\n * Exit code value type - union of all valid exit code numbers\n */\nexport type ExitCode = (typeof exitCodes)[keyof typeof exitCodes];\n\n/**\n * Exit code name type - union of all valid exit code constant names\n */\nexport type ExitCodeName = keyof typeof exitCodes;\n\n/**\n * Exit code metadata information\n */\nexport interface ExitCodeInfo {\n code: number;\n name: string;\n description: string;\n context: string;\n category: string;\n retryHint?: \"retry\" | \"no_retry\" | \"investigate\";\n bsdEquivalent?: string;\n pythonNote?: string;\n}\n\n/**\n * Metadata for all exit codes\n */\nexport const exitCodeMetadata: Record<number, ExitCodeInfo> = {\n 0: {\n code: 0,\n name: \"EXIT_SUCCESS\",\n description: \"Successful execution\",\n context: \"Command completed without errors\",\n category: \"standard\",\n },\n 1: {\n code: 1,\n name: \"EXIT_FAILURE\",\n description: \"Generic failure (unspecified error)\",\n context: \"Use when no more specific exit code applies\",\n category: \"standard\",\n },\n 10: {\n code: 10,\n name: \"EXIT_PORT_IN_USE\",\n description: \"Specified port is already in use\",\n context: \"Server startup when port unavailable and fail_if_unavailable strategy\",\n category: \"networking\",\n },\n 11: {\n code: 11,\n name: \"EXIT_PORT_RANGE_EXHAUSTED\",\n description: \"No available ports in configured range\",\n context: \"Server startup when all ports in environment range occupied\",\n category: \"networking\",\n },\n 12: {\n code: 12,\n name: \"EXIT_INSTANCE_ALREADY_RUNNING\",\n description: \"Another instance already running on target port\",\n context: \"Server startup when PID registry shows active process on port\",\n category: \"networking\",\n },\n 13: {\n code: 13,\n name: \"EXIT_NETWORK_UNREACHABLE\",\n description: \"Network destination unreachable\",\n context: \"Client connections, health checks, external service validation\",\n category: \"networking\",\n },\n 14: {\n code: 14,\n name: \"EXIT_CONNECTION_REFUSED\",\n description: \"Connection refused by remote host\",\n context: \"Database connections, API endpoints, upstream services\",\n category: \"networking\",\n },\n 15: {\n code: 15,\n name: \"EXIT_CONNECTION_TIMEOUT\",\n description: \"Connection attempt timed out\",\n context: \"Slow networks, unresponsive services, firewall blocks\",\n category: \"networking\",\n },\n 20: {\n code: 20,\n name: \"EXIT_CONFIG_INVALID\",\n description: \"Configuration file failed validation\",\n context: \"Startup validation, schema mismatches, invalid YAML/JSON\",\n category: \"configuration\",\n retryHint: \"no_retry\",\n },\n 21: {\n code: 21,\n name: \"EXIT_MISSING_DEPENDENCY\",\n description: \"Required dependency not found\",\n context: \"Missing binaries, libraries, or runtime requirements\",\n category: \"configuration\",\n retryHint: \"investigate\",\n },\n 22: {\n code: 22,\n name: \"EXIT_SSOT_VERSION_MISMATCH\",\n description: \"SSOT (Crucible) version incompatible\",\n context: \"Helper library detects unsupported Crucible version\",\n category: \"configuration\",\n retryHint: \"no_retry\",\n },\n 23: {\n code: 23,\n name: \"EXIT_CONFIG_FILE_NOT_FOUND\",\n description: \"Required configuration file not found\",\n context: \"Explicitly specified config path doesn't exist\",\n category: \"configuration\",\n },\n 24: {\n code: 24,\n name: \"EXIT_ENVIRONMENT_INVALID\",\n description: \"Invalid or unsupported environment specification\",\n context: \"Unknown environment name, missing environment config\",\n category: \"configuration\",\n },\n 30: {\n code: 30,\n name: \"EXIT_HEALTH_CHECK_FAILED\",\n description: \"Health check endpoint returned non-healthy status\",\n context: \"Startup health validation, readiness probes\",\n category: \"runtime\",\n retryHint: \"retry\",\n },\n 31: {\n code: 31,\n name: \"EXIT_DATABASE_UNAVAILABLE\",\n description: \"Database connection failed or unavailable\",\n context: \"Startup connection checks, critical query failures\",\n category: \"runtime\",\n retryHint: \"retry\",\n },\n 32: {\n code: 32,\n name: \"EXIT_EXTERNAL_SERVICE_UNAVAILABLE\",\n description: \"Required external service unavailable\",\n context: \"API dependencies, message queues, cache servers\",\n category: \"runtime\",\n },\n 33: {\n code: 33,\n name: \"EXIT_RESOURCE_EXHAUSTED\",\n description: \"System resources exhausted (memory, disk, file descriptors)\",\n context: \"Out-of-memory, disk full, too many open files\",\n category: \"runtime\",\n retryHint: \"investigate\",\n },\n 34: {\n code: 34,\n name: \"EXIT_OPERATION_TIMEOUT\",\n description: \"Operation exceeded timeout threshold\",\n context: \"Long-running tasks, async operations, batch processing\",\n category: \"runtime\",\n retryHint: \"retry\",\n },\n 40: {\n code: 40,\n name: \"EXIT_INVALID_ARGUMENT\",\n description: \"Invalid command-line argument or flag value\",\n context: \"Type errors, out-of-range values, malformed input\",\n category: \"usage\",\n },\n 41: {\n code: 41,\n name: \"EXIT_MISSING_REQUIRED_ARGUMENT\",\n description: \"Required command-line argument not provided\",\n context: \"Missing --config, --port, or other required flags\",\n category: \"usage\",\n },\n 64: {\n code: 64,\n name: \"EXIT_USAGE\",\n description: \"Command-line usage error\",\n context: \"BSD sysexits.h EX_USAGE - wrong number of arguments, bad syntax\",\n category: \"usage\",\n bsdEquivalent: \"EX_USAGE\",\n },\n 50: {\n code: 50,\n name: \"EXIT_PERMISSION_DENIED\",\n description: \"Insufficient permissions for operation\",\n context: \"File access, port binding (<1024), privileged operations\",\n category: \"permissions\",\n },\n 51: {\n code: 51,\n name: \"EXIT_FILE_NOT_FOUND\",\n description: \"Required file not found\",\n context: \"Assets, templates, data files (not config - use 23)\",\n category: \"permissions\",\n },\n 52: {\n code: 52,\n name: \"EXIT_DIRECTORY_NOT_FOUND\",\n description: \"Required directory not found\",\n context: \"State directories, log paths, data directories\",\n category: \"permissions\",\n },\n 53: {\n code: 53,\n name: \"EXIT_FILE_READ_ERROR\",\n description: \"Error reading file\",\n context: \"Corrupt files, I/O errors, encoding issues\",\n category: \"permissions\",\n },\n 54: {\n code: 54,\n name: \"EXIT_FILE_WRITE_ERROR\",\n description: \"Error writing file\",\n context: \"Disk full, read-only filesystem, permission errors\",\n category: \"permissions\",\n },\n 60: {\n code: 60,\n name: \"EXIT_DATA_INVALID\",\n description: \"Input data failed validation\",\n context: \"Schema validation, business rule violations\",\n category: \"data\",\n },\n 61: {\n code: 61,\n name: \"EXIT_PARSE_ERROR\",\n description: \"Error parsing input data\",\n context: \"Malformed JSON/YAML/XML, syntax errors\",\n category: \"data\",\n },\n 62: {\n code: 62,\n name: \"EXIT_TRANSFORMATION_FAILED\",\n description: \"Data transformation or conversion failed\",\n context: \"Type conversions, format transformations, encoding changes\",\n category: \"data\",\n },\n 63: {\n code: 63,\n name: \"EXIT_DATA_CORRUPT\",\n description: \"Data corruption detected\",\n context: \"Checksum failures, integrity violations\",\n category: \"data\",\n },\n 70: {\n code: 70,\n name: \"EXIT_AUTHENTICATION_FAILED\",\n description: \"Authentication failed\",\n context: \"Invalid credentials, expired tokens, auth service unavailable\",\n category: \"security\",\n },\n 71: {\n code: 71,\n name: \"EXIT_AUTHORIZATION_FAILED\",\n description: \"Authorization failed (authenticated but insufficient permissions)\",\n context: \"RBAC failures, scope violations, resource access denied\",\n category: \"security\",\n },\n 72: {\n code: 72,\n name: \"EXIT_SECURITY_VIOLATION\",\n description: \"Security policy violation detected\",\n context: \"Suspicious activity, rate limit exceeded, IP blocklist\",\n category: \"security\",\n },\n 73: {\n code: 73,\n name: \"EXIT_CERTIFICATE_INVALID\",\n description: \"TLS/SSL certificate validation failed\",\n context: \"Expired certs, untrusted CAs, hostname mismatches\",\n category: \"security\",\n bsdEquivalent: \"EX_PROTOCOL\",\n },\n 80: {\n code: 80,\n name: \"EXIT_METRICS_UNAVAILABLE\",\n description: \"Metrics endpoint or collection system unavailable\",\n context:\n \"Use for observability-focused tools (Prometheus exporters, StatsD agents).\\nWorkhorses SHOULD log warning and continue unless configured to fail-fast.\\n\",\n category: \"observability\",\n },\n 81: {\n code: 81,\n name: \"EXIT_TRACING_FAILED\",\n description: \"Distributed tracing system unavailable\",\n context: \"OTLP exporter failed, Jaeger collector unreachable\",\n category: \"observability\",\n },\n 82: {\n code: 82,\n name: \"EXIT_LOGGING_FAILED\",\n description: \"Logging system unavailable or misconfigured\",\n context: \"Log aggregator unreachable, log file unwritable\",\n category: \"observability\",\n },\n 83: {\n code: 83,\n name: \"EXIT_ALERT_SYSTEM_FAILED\",\n description: \"Alerting system unavailable\",\n context: \"PagerDuty API failed, Slack webhook unreachable\",\n category: \"observability\",\n },\n 84: {\n code: 84,\n name: \"EXIT_STRUCTURED_LOGGING_FAILED\",\n description: \"Structured logging system unavailable\",\n context: \"JSON log aggregator unreachable, log schema validation failed\",\n category: \"observability\",\n },\n 91: {\n code: 91,\n name: \"EXIT_TEST_FAILURE\",\n description: \"One or more tests failed\",\n context:\n \"Test assertions failed, expected behavior not met.\\nMaps to pytest exit code 1, Go test failure, Jest failure.\\n\",\n category: \"testing\",\n },\n 92: {\n code: 92,\n name: \"EXIT_TEST_ERROR\",\n description: \"Test execution error (not test failure)\",\n context:\n \"Test setup failed, fixture unavailable, test harness error.\\nMaps to pytest exit code 3 (internal error).\\n\",\n category: \"testing\",\n },\n 93: {\n code: 93,\n name: \"EXIT_TEST_INTERRUPTED\",\n description: \"Test run interrupted by user or system\",\n context:\n \"Ctrl+C during tests, system signal, user cancellation.\\nMaps to pytest exit code 2.\\n\",\n category: \"testing\",\n },\n 94: {\n code: 94,\n name: \"EXIT_TEST_USAGE_ERROR\",\n description: \"Test command usage error\",\n context: \"Invalid test arguments, bad configuration.\\nMaps to pytest exit code 4.\\n\",\n category: \"testing\",\n },\n 95: {\n code: 95,\n name: \"EXIT_TEST_NO_TESTS_COLLECTED\",\n description: \"No tests found or all tests skipped\",\n context: \"Empty test suite, all tests deselected or skipped.\\nMaps to pytest exit code 5.\\n\",\n category: \"testing\",\n },\n 96: {\n code: 96,\n name: \"EXIT_COVERAGE_THRESHOLD_NOT_MET\",\n description: \"Test coverage below required threshold\",\n context: \"Code coverage validation, quality gate failure\",\n category: \"testing\",\n },\n 124: {\n code: 124,\n name: \"EXIT_TIMEOUT\",\n description: \"Command timed out before completion\",\n context: \"GNU timeout or similar utility terminated command after deadline\",\n category: \"shell\",\n },\n 125: {\n code: 125,\n name: \"EXIT_TIMEOUT_INTERNAL\",\n description: \"Timeout utility itself failed\",\n context: \"Error in timeout tool before or during command execution (not command failure)\",\n category: \"shell\",\n },\n 126: {\n code: 126,\n name: \"EXIT_CANNOT_EXECUTE\",\n description: \"Command found but could not be executed\",\n context: \"Permission denied, not executable, exec format error\",\n category: \"shell\",\n bsdEquivalent: \"EX_NOPERM (partial)\",\n },\n 127: {\n code: 127,\n name: \"EXIT_NOT_FOUND\",\n description: \"Command not found\",\n context: \"Executable not found in PATH or specified path does not exist\",\n category: \"shell\",\n bsdEquivalent: \"EX_UNAVAILABLE (partial)\",\n },\n 129: {\n code: 129,\n name: \"EXIT_SIGNAL_HUP\",\n description: \"Hangup signal (SIGHUP) - config reload via restart\",\n context:\n \"Config reload via restart-based pattern (mandatory schema validation).\\nProcess exits with 129, supervisor restarts with new config.\\nSee signals.yaml for reload behavior definition.\",\n category: \"signals\",\n bsdEquivalent: \"128 + 1\",\n },\n 130: {\n code: 130,\n name: \"EXIT_SIGNAL_INT\",\n description: \"Interrupt signal (SIGINT) - user interrupt with Ctrl+C double-tap\",\n context:\n \"Ctrl+C pressed. First tap initiates graceful shutdown, second within 2s forces immediate exit.\\nSame exit code (130) for both graceful and force modes.\\nSee signals.yaml for double-tap behavior definition.\",\n category: \"signals\",\n bsdEquivalent: \"128 + 2\",\n },\n 131: {\n code: 131,\n name: \"EXIT_SIGNAL_QUIT\",\n description: \"Quit signal (SIGQUIT) - immediate exit\",\n context:\n \"Ctrl+\\\\ on Unix, Ctrl+Break on Windows. Immediate termination without cleanup.\\nUse for emergency shutdown or debugging (core dumps).\",\n category: \"signals\",\n bsdEquivalent: \"128 + 3\",\n },\n 137: {\n code: 137,\n name: \"EXIT_SIGNAL_KILL\",\n description: \"Kill signal (SIGKILL)\",\n context: \"Forceful termination, non-graceful shutdown (not catchable)\",\n category: \"signals\",\n bsdEquivalent: \"128 + 9\",\n pythonNote: \"Cannot be caught in Python (OS-level)\",\n },\n 141: {\n code: 141,\n name: \"EXIT_SIGNAL_PIPE\",\n description: \"Broken pipe (SIGPIPE) - observe only\",\n context:\n \"Writing to closed pipe/socket. Fulmen default is observe_only (log + graceful exit).\\nApplications may override to ignore for network services.\\nSee signals.yaml for SIGPIPE handling guidance.\",\n category: \"signals\",\n bsdEquivalent: \"128 + 13\",\n pythonNote: \"Raised as BrokenPipeError exception\",\n },\n 142: {\n code: 142,\n name: \"EXIT_SIGNAL_ALRM\",\n description: \"Alarm signal (SIGALRM) - watchdog timeout\",\n context:\n \"Watchdog timer expired. Treat as timeout-induced exit.\\nWatchdog pattern out of scope for v1.0.0 module implementations.\",\n category: \"signals\",\n bsdEquivalent: \"128 + 14\",\n pythonNote: \"Supported by signal module, rarely used in practice\",\n },\n 143: {\n code: 143,\n name: \"EXIT_SIGNAL_TERM\",\n description: \"Termination signal (SIGTERM) - graceful shutdown\",\n context:\n \"Graceful shutdown requested by container orchestrator or process supervisor.\\nStandard 30-second timeout for cleanup. Applications run cleanup handlers before exit.\\nSee signals.yaml for graceful shutdown behavior definition.\",\n category: \"signals\",\n bsdEquivalent: \"128 + 15\",\n pythonNote: \"Default signal for graceful shutdown\",\n },\n 138: {\n code: 138,\n name: \"EXIT_SIGNAL_USR1\",\n description: \"User-defined signal 1 (SIGUSR1) - custom handler\",\n context:\n \"Application-specific signal (e.g., reopen logs, dump stats, trigger profiling).\\nApplications register custom handlers. Exit code 138 on Linux (128+10).\\nPlatform differences: macOS/FreeBSD use signal 30 (exit 158), not 10.\",\n category: \"signals\",\n },\n 140: {\n code: 140,\n name: \"EXIT_SIGNAL_USR2\",\n description: \"User-defined signal 2 (SIGUSR2) - custom handler\",\n context:\n \"Application-specific signal (e.g., toggle debug mode, rotate credentials).\\nApplications register custom handlers. Exit code 140 on Linux (128+12).\\nPlatform differences: macOS/FreeBSD use signal 31 (exit 159), not 12.\",\n category: \"signals\",\n },\n};\n\n/**\n * Get metadata for a specific exit code\n *\n * @param code - Exit code number\n * @returns Exit code metadata or undefined if not found\n */\nexport function getExitCodeInfo(code: number): ExitCodeInfo | undefined {\n return exitCodeMetadata[code];\n}\n\n/**\n * Catalog version for telemetry and compatibility checks\n */\nexport const EXIT_CODES_VERSION = \"v1.0.0\";\n","/**\n * Exit Code Capabilities Detection\n *\n * Detects platform capabilities for exit code support, particularly\n * for signal-based exit codes which are POSIX-specific.\n *\n * @module foundry/exit-codes/capabilities\n */\n\n/**\n * Check if the current platform supports signal-based exit codes\n *\n * Signal exit codes (128+N pattern) are POSIX-specific and not\n * meaningful on Windows. Applications should use this to decide\n * whether to use simplified mode.\n *\n * @returns true if platform supports signal exit codes (POSIX), false otherwise (Windows)\n *\n * @example\n * ```ts\n * import { supportsSignalExitCodes, SimplifiedMode } from '@fulmenhq/tsfulmen/foundry/exit-codes';\n *\n * const exitCodeMode = supportsSignalExitCodes()\n * ? 'full' // Use all 54 exit codes\n * : SimplifiedMode.SEVERITY; // Use simplified mode on Windows\n *\n * console.log(`Exit code mode: ${exitCodeMode}`);\n * ```\n *\n * @example\n * ```ts\n * // Guard signal exit code usage\n * import { exitCodes, supportsSignalExitCodes } from '@fulmenhq/tsfulmen/foundry/exit-codes';\n *\n * function handleTermination() {\n * if (supportsSignalExitCodes()) {\n * // POSIX: Use specific signal exit code\n * process.exit(exitCodes.EXIT_SIGNAL_TERM);\n * } else {\n * // Windows: Use generic failure\n * process.exit(exitCodes.EXIT_FAILURE);\n * }\n * }\n * ```\n */\nexport function supportsSignalExitCodes(): boolean {\n // Windows does not support POSIX signals in the same way\n // WSL reports as 'linux' so it will correctly return true\n return process.platform !== \"win32\";\n}\n\n/**\n * Get the current platform identifier\n *\n * Useful for logging and diagnostics.\n *\n * @returns Platform string (linux, darwin, win32, etc.)\n */\nexport function getPlatform(): NodeJS.Platform {\n return process.platform;\n}\n\n/**\n * Check if running on Windows (including WSL detection)\n *\n * Note: WSL reports as 'linux' not 'win32', so this only returns\n * true for native Windows processes.\n *\n * @returns true if running on native Windows\n */\nexport function isWindows(): boolean {\n return process.platform === \"win32\";\n}\n\n/**\n * Check if running on a POSIX-compliant platform\n *\n * @returns true if running on Linux, macOS, or other POSIX systems\n */\nexport function isPOSIX(): boolean {\n return !isWindows();\n}\n\n/**\n * Platform capabilities summary\n */\nexport interface PlatformCapabilities {\n platform: NodeJS.Platform;\n supportsSignalExitCodes: boolean;\n isPOSIX: boolean;\n isWindows: boolean;\n}\n\n/**\n * Get a summary of platform capabilities\n *\n * @returns Platform capabilities object\n *\n * @example\n * ```ts\n * import { getPlatformCapabilities } from '@fulmenhq/tsfulmen/foundry/exit-codes';\n *\n * const caps = getPlatformCapabilities();\n * console.log(`Platform: ${caps.platform}`);\n * console.log(`Supports signal exit codes: ${caps.supportsSignalExitCodes}`);\n * ```\n */\nexport function getPlatformCapabilities(): PlatformCapabilities {\n return {\n platform: getPlatform(),\n supportsSignalExitCodes: supportsSignalExitCodes(),\n isPOSIX: isPOSIX(),\n isWindows: isWindows(),\n };\n}\n","/**\n * Simplified Exit Code Mapping\n *\n * Provides simplified exit code modes for applications that don't need\n * the full granularity of 54 exit codes. Useful for:\n * - Windows environments where signal codes may not be relevant\n * - Simple scripts that only need basic success/failure indication\n * - Wrapper scripts that aggregate multiple failure types\n *\n * @module foundry/exit-codes/simplified\n */\n\nimport type { ExitCode } from \"../../crucible/foundry/exitCodes.js\";\nimport { exitCodeMetadata } from \"../../crucible/foundry/exitCodes.js\";\n\n/**\n * Simplified exit code modes\n */\nexport enum SimplifiedMode {\n /**\n * BASIC mode: Only success (0) and failure (1)\n * - 0 = EXIT_SUCCESS\n * - 1 = All failures\n */\n BASIC = \"basic\",\n\n /**\n * SEVERITY mode: Success, recoverable, config, fatal\n * - 0 = EXIT_SUCCESS\n * - 1 = Recoverable errors (retry possible)\n * - 2 = Configuration/usage errors (fix config, don't retry)\n * - 3 = Fatal errors (investigate required)\n */\n SEVERITY = \"severity\",\n}\n\n/**\n * Map a full exit code to a simplified code based on mode\n *\n * @param code - Full exit code from exitCodes\n * @param mode - Simplified mode to use\n * @returns Simplified exit code (0-3 depending on mode)\n *\n * @example\n * ```ts\n * import { exitCodes, mapExitCodeToSimplified, SimplifiedMode } from '@fulmenhq/tsfulmen/foundry/exit-codes';\n *\n * // Basic mode - only 0 or 1\n * const basicCode = mapExitCodeToSimplified(exitCodes.EXIT_CONFIG_INVALID, SimplifiedMode.BASIC);\n * console.log(basicCode); // 1 (any failure)\n *\n * // Severity mode - categorizes failures\n * const sevCode = mapExitCodeToSimplified(exitCodes.EXIT_CONFIG_INVALID, SimplifiedMode.SEVERITY);\n * console.log(sevCode); // 2 (config error - don't retry)\n *\n * const retryCode = mapExitCodeToSimplified(exitCodes.EXIT_DATABASE_UNAVAILABLE, SimplifiedMode.SEVERITY);\n * console.log(retryCode); // 1 (recoverable - retry possible)\n * ```\n */\nexport function mapExitCodeToSimplified(\n code: ExitCode,\n mode: SimplifiedMode = SimplifiedMode.BASIC,\n): number {\n // Success is always 0\n if (code === 0) {\n return 0;\n }\n\n // BASIC mode: everything else is 1\n if (mode === SimplifiedMode.BASIC) {\n return 1;\n }\n\n // SEVERITY mode: categorize based on metadata\n const info = exitCodeMetadata[code];\n if (!info) {\n // Unknown code - treat as fatal\n return 3;\n }\n\n // Check retry hint first\n if (info.retryHint === \"retry\") {\n // Recoverable - likely transient failure\n return 1;\n }\n\n if (info.retryHint === \"no_retry\") {\n // Configuration/permanent error - don't retry\n return 2;\n }\n\n if (info.retryHint === \"investigate\") {\n // Serious issue requiring investigation\n return 3;\n }\n\n // Category-based fallback\n switch (info.category) {\n case \"configuration\":\n case \"usage\":\n // Config and usage errors - fix config, don't retry\n return 2;\n\n case \"networking\":\n case \"runtime\":\n // Network and runtime issues - often recoverable\n return 1;\n\n case \"permissions\":\n case \"data\":\n // Permission and data errors - likely permanent\n return 2;\n\n case \"security\":\n // Security issues - investigate\n return 3;\n\n case \"observability\":\n // Observability failures - recoverable if non-critical\n return 1;\n\n case \"testing\":\n // Test failures - depends on context, default to failure\n return 1;\n\n case \"signals\":\n // Signal termination - not applicable on Windows\n // Treat as fatal since process was forcibly terminated\n return 3;\n\n default:\n // Unknown category - treat as generic failure\n return 1;\n }\n}\n\n/**\n * Get all simplified exit codes for a given mode\n *\n * @param mode - Simplified mode\n * @returns Array of simplified codes for this mode\n *\n * @example\n * ```ts\n * import { getSimplifiedCodes, SimplifiedMode } from '@fulmenhq/tsfulmen/foundry/exit-codes';\n *\n * console.log(getSimplifiedCodes(SimplifiedMode.BASIC));\n * // [0, 1]\n *\n * console.log(getSimplifiedCodes(SimplifiedMode.SEVERITY));\n * // [0, 1, 2, 3]\n * ```\n */\nexport function getSimplifiedCodes(mode: SimplifiedMode): number[] {\n switch (mode) {\n case SimplifiedMode.BASIC:\n return [0, 1];\n case SimplifiedMode.SEVERITY:\n return [0, 1, 2, 3];\n default:\n return [0, 1];\n }\n}\n\n/**\n * Get description for a simplified exit code\n *\n * @param code - Simplified exit code\n * @param mode - Simplified mode\n * @returns Human-readable description\n */\nexport function getSimplifiedCodeDescription(code: number, mode: SimplifiedMode): string {\n if (mode === SimplifiedMode.BASIC) {\n switch (code) {\n case 0:\n return \"Success\";\n case 1:\n return \"Failure\";\n default:\n return \"Unknown\";\n }\n }\n\n if (mode === SimplifiedMode.SEVERITY) {\n switch (code) {\n case 0:\n return \"Success\";\n case 1:\n return \"Recoverable error (retry possible)\";\n case 2:\n return \"Configuration error (fix config, don't retry)\";\n case 3:\n return \"Fatal error (investigate required)\";\n default:\n return \"Unknown\";\n }\n }\n\n return \"Unknown mode\";\n}\n","/**\n * Exit Codes Module\n *\n * Standardized process exit codes for the Fulmen ecosystem.\n * Generated from Crucible catalog and synced via make sync-ssot.\n *\n * @module foundry/exit-codes\n */\n\n// Re-export generated exit codes from crucible foundry\nexport {\n EXIT_CODES_VERSION,\n type ExitCode,\n type ExitCodeInfo,\n type ExitCodeName,\n exitCodeMetadata,\n exitCodes,\n getExitCodeInfo,\n} from \"../../crucible/foundry/exitCodes.js\";\n// Export capability detection helpers\nexport {\n getPlatform,\n getPlatformCapabilities,\n isPOSIX,\n isWindows,\n type PlatformCapabilities,\n supportsSignalExitCodes,\n} from \"./capabilities.js\";\n// Export simplified mode helpers\nexport {\n getSimplifiedCodeDescription,\n getSimplifiedCodes,\n mapExitCodeToSimplified,\n SimplifiedMode,\n} from \"./simplified.js\";\n","/**\n * Foundry HTTP Status Catalog - implements HTTP status code access and helpers\n */\n\nimport { loadHttpStatusCatalog } from \"./loader.js\";\nimport type { HttpStatusCatalog, HttpStatusCode, HttpStatusGroupId } from \"./types.js\";\n\nlet catalogCache: HttpStatusCatalog | null = null;\nconst statusCodeIndex = new Map<number, HttpStatusCode>();\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as T;\n }\n\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return cloned as T;\n}\n\nfunction deepFreeze<T extends object>(obj: T): T {\n Object.freeze(obj);\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key];\n if (value !== null && typeof value === \"object\") {\n deepFreeze(value);\n }\n }\n }\n\n return obj;\n}\n\nasync function ensureCatalogLoaded(): Promise<void> {\n if (catalogCache !== null) {\n return;\n }\n\n catalogCache = await loadHttpStatusCatalog();\n\n for (const group of catalogCache.groups) {\n const groupId = group.id as HttpStatusGroupId;\n for (const code of group.codes) {\n statusCodeIndex.set(code.value, {\n value: code.value,\n reason: code.reason,\n group: groupId,\n });\n }\n }\n}\n\nexport async function getHttpStatus(code: number): Promise<Readonly<HttpStatusCode> | null> {\n await ensureCatalogLoaded();\n const status = statusCodeIndex.get(code);\n return status ? deepFreeze(deepClone(status)) : null;\n}\n\nexport function isInformational(code: number): boolean {\n return code >= 100 && code < 200;\n}\n\nexport function isSuccess(code: number): boolean {\n return code >= 200 && code < 300;\n}\n\nexport function isRedirection(code: number): boolean {\n return code >= 300 && code < 400;\n}\n\nexport function isClientError(code: number): boolean {\n return code >= 400 && code < 500;\n}\n\nexport function isServerError(code: number): boolean {\n return code >= 500 && code < 600;\n}\n\nexport async function listHttpStatuses(): Promise<ReadonlyArray<Readonly<HttpStatusCode>>> {\n await ensureCatalogLoaded();\n return Array.from(statusCodeIndex.values()).map((s) => deepFreeze(deepClone(s)));\n}\n\nexport async function getStatusReason(code: number): Promise<string | null> {\n const status = await getHttpStatus(code);\n return status?.reason ?? null;\n}\n\nexport function clearHttpStatusCache(): void {\n catalogCache = null;\n statusCodeIndex.clear();\n}\n","/**\n * Foundry MIME Type Magic Number Database\n *\n * Defines byte patterns (magic numbers) for content-based MIME type detection.\n * Patterns are ordered by priority for accurate multi-format detection.\n */\n\nexport interface MagicNumberPattern {\n offset: number;\n bytes: number[];\n mask?: number[];\n description: string;\n}\n\nexport type MatchStrategy = \"exact\" | \"heuristic\";\n\nexport interface MagicNumberSignature {\n mimeType: string;\n patterns: MagicNumberPattern[];\n priority: number;\n matchStrategy: MatchStrategy;\n}\n\n// UTF-8 BOM (Byte Order Mark)\nexport const UTF8_BOM: number[] = [0xef, 0xbb, 0xbf];\n\n// XML Patterns (Priority 10 - Most specific)\nconst XML_PATTERNS: MagicNumberPattern[] = [\n {\n offset: 0,\n bytes: [0x3c, 0x3f, 0x78, 0x6d, 0x6c],\n description: \"XML declaration: <?xml\",\n },\n {\n offset: 0,\n bytes: [0xef, 0xbb, 0xbf, 0x3c, 0x3f, 0x78, 0x6d, 0x6c],\n description: \"XML with UTF-8 BOM: BOM + <?xml\",\n },\n];\n\n// JSON Patterns (Priority 9)\nconst JSON_PATTERNS: MagicNumberPattern[] = [\n {\n offset: 0,\n bytes: [0x7b],\n description: \"JSON object start: {\",\n },\n {\n offset: 0,\n bytes: [0x5b],\n description: \"JSON array start: [\",\n },\n {\n offset: 0,\n bytes: [0xef, 0xbb, 0xbf, 0x7b],\n description: \"JSON object with BOM: BOM + {\",\n },\n {\n offset: 0,\n bytes: [0xef, 0xbb, 0xbf, 0x5b],\n description: \"JSON array with BOM: BOM + [\",\n },\n];\n\n// YAML Patterns (Priority 8)\nconst YAML_PATTERNS: MagicNumberPattern[] = [\n {\n offset: 0,\n bytes: [0x2d, 0x2d, 0x2d],\n description: \"YAML document marker: ---\",\n },\n {\n offset: 0,\n bytes: [0x25, 0x59, 0x41, 0x4d, 0x4c],\n description: \"YAML directive: %YAML\",\n },\n];\n\n// NDJSON Patterns (Priority 7 - Heuristic only)\nconst NDJSON_PATTERNS: MagicNumberPattern[] = [];\n\n// CSV Patterns (Priority 6 - Heuristic only)\nconst CSV_PATTERNS: MagicNumberPattern[] = [];\n\n// Protobuf Patterns (Priority 5 - Heuristic only)\nconst PROTOBUF_PATTERNS: MagicNumberPattern[] = [];\n\n// Plain Text Patterns (Priority 1 - Fallback, heuristic)\nconst TEXT_PATTERNS: MagicNumberPattern[] = [];\n\n/**\n * Magic Number Database\n *\n * Ordered by detection priority (highest first).\n * Note: Heuristic detection runs BEFORE exact pattern matching\n * for formats that can be ambiguous (NDJSON vs JSON).\n */\nexport const MAGIC_NUMBER_DATABASE: MagicNumberSignature[] = [\n {\n mimeType: \"application/xml\",\n patterns: XML_PATTERNS,\n priority: 10,\n matchStrategy: \"exact\",\n },\n {\n mimeType: \"application/x-ndjson\",\n patterns: NDJSON_PATTERNS,\n priority: 9,\n matchStrategy: \"heuristic\",\n },\n {\n mimeType: \"application/json\",\n patterns: JSON_PATTERNS,\n priority: 8,\n matchStrategy: \"exact\",\n },\n {\n mimeType: \"application/yaml\",\n patterns: YAML_PATTERNS,\n priority: 7,\n matchStrategy: \"exact\",\n },\n {\n mimeType: \"application/yaml\",\n patterns: [],\n priority: 6.5,\n matchStrategy: \"heuristic\",\n },\n {\n mimeType: \"text/csv\",\n patterns: CSV_PATTERNS,\n priority: 6,\n matchStrategy: \"heuristic\",\n },\n {\n mimeType: \"application/x-protobuf\",\n patterns: PROTOBUF_PATTERNS,\n priority: 5,\n matchStrategy: \"heuristic\",\n },\n {\n mimeType: \"text/plain\",\n patterns: TEXT_PATTERNS,\n priority: 1,\n matchStrategy: \"heuristic\",\n },\n];\n\n/**\n * Check if buffer starts with UTF-8 BOM\n */\nexport function hasBOM(buffer: Buffer): boolean {\n if (buffer.length < 3) return false;\n return buffer[0] === UTF8_BOM[0] && buffer[1] === UTF8_BOM[1] && buffer[2] === UTF8_BOM[2];\n}\n\n/**\n * Get offset to skip BOM if present\n */\nexport function getBOMOffset(buffer: Buffer): number {\n return hasBOM(buffer) ? 3 : 0;\n}\n","/**\n * Foundry MIME Type Detector\n *\n * Pattern matching engine for content-based MIME type detection using\n * magic numbers and heuristic analysis.\n */\n\nimport {\n getBOMOffset,\n MAGIC_NUMBER_DATABASE,\n type MagicNumberPattern,\n type MagicNumberSignature,\n} from \"./magic-numbers.js\";\nimport type { MimeType } from \"./types.js\";\n\nexport interface DetectionOptions {\n /**\n * Fall back to extension-based detection if magic number detection fails.\n * Default: true\n */\n fallbackToExtension?: boolean;\n\n /**\n * Number of bytes to read for magic number detection.\n * Default: 512\n */\n bytesToRead?: number;\n\n /**\n * File extension hint for fallback detection.\n * Useful when input is a Buffer without path context.\n */\n extensionHint?: string;\n}\n\nexport class MimeTypeDetector {\n private patterns: MagicNumberSignature[];\n private catalog: Map<string, MimeType>;\n\n constructor(patterns: MagicNumberSignature[], catalog: Map<string, MimeType>) {\n this.patterns = [...patterns].sort((a, b) => b.priority - a.priority);\n this.catalog = catalog;\n }\n\n /**\n * Detect MIME type from buffer content\n */\n detect(buffer: Buffer, _options: DetectionOptions = {}): MimeType | null {\n // Skip BOM if present\n const offset = getBOMOffset(buffer);\n const workingBuffer = offset > 0 ? buffer.subarray(offset) : buffer;\n\n // Try patterns in priority order, regardless of strategy\n // This allows NDJSON heuristic to run before JSON exact match\n for (const pattern of this.patterns) {\n if (pattern.matchStrategy === \"exact\" && this.matchPattern(workingBuffer, pattern)) {\n return this.catalog.get(pattern.mimeType) || null;\n }\n if (pattern.matchStrategy === \"heuristic\" && this.matchHeuristic(workingBuffer, pattern)) {\n return this.catalog.get(pattern.mimeType) || null;\n }\n }\n\n return null;\n }\n\n /**\n * Match buffer against a pattern signature\n */\n private matchPattern(buffer: Buffer, signature: MagicNumberSignature): boolean {\n for (const pattern of signature.patterns) {\n if (this.matchBytes(buffer, pattern)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Match bytes at specified offset with optional masking\n */\n private matchBytes(buffer: Buffer, pattern: MagicNumberPattern): boolean {\n const { offset, bytes, mask } = pattern;\n\n if (buffer.length < offset + bytes.length) {\n return false;\n }\n\n for (let i = 0; i < bytes.length; i++) {\n const bufferByte = buffer[offset + i];\n const patternByte = bytes[i];\n const maskByte = mask ? mask[i] : 0xff;\n\n if ((bufferByte & maskByte) !== (patternByte & maskByte)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Heuristic detection for formats without magic numbers\n */\n private matchHeuristic(buffer: Buffer, signature: MagicNumberSignature): boolean {\n switch (signature.mimeType) {\n case \"application/x-ndjson\":\n return this.detectNDJSON(buffer);\n case \"application/yaml\":\n return this.detectYAML(buffer);\n case \"text/csv\":\n return this.detectCSV(buffer);\n case \"application/x-protobuf\":\n return this.detectProtobuf(buffer);\n case \"text/plain\":\n return this.detectPlainText(buffer);\n default:\n return false;\n }\n }\n\n /**\n * Detect NDJSON (newline-delimited JSON)\n */\n private detectNDJSON(buffer: Buffer): boolean {\n try {\n const text = buffer.toString(\"utf-8\", 0, Math.min(buffer.length, 512));\n const lines = text.split(\"\\n\").filter((line) => line.trim().length > 0);\n\n if (lines.length < 2) return false;\n\n // Check if at least first 2-3 lines are valid JSON\n const linesToCheck = Math.min(3, lines.length);\n let validJsonLines = 0;\n\n for (let i = 0; i < linesToCheck; i++) {\n try {\n JSON.parse(lines[i]);\n validJsonLines++;\n } catch {\n return false;\n }\n }\n\n return validJsonLines >= 2;\n } catch {\n return false;\n }\n }\n\n /**\n * Detect YAML format (heuristic for files without --- header)\n */\n private detectYAML(buffer: Buffer): boolean {\n try {\n const text = buffer.toString(\"utf-8\", 0, Math.min(buffer.length, 512));\n const lines = text.split(\"\\n\").filter((line) => line.trim().length > 0);\n\n if (lines.length === 0) return false;\n\n // Count YAML-like patterns\n let yamlIndicators = 0;\n let nonYamlIndicators = 0;\n\n for (const line of lines.slice(0, 10)) {\n const trimmed = line.trim();\n\n // Skip comments\n if (trimmed.startsWith(\"#\")) continue;\n\n // YAML key-value pattern: \"key: value\"\n if (/^[\\w\"'-]+\\s*:\\s*.+$/.test(trimmed)) {\n yamlIndicators++;\n continue;\n }\n\n // YAML list item: \"- item\"\n if (/^-\\s+/.test(trimmed)) {\n yamlIndicators++;\n continue;\n }\n\n // JSON-like patterns suggest not YAML\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\") || trimmed.endsWith(\",\")) {\n nonYamlIndicators++;\n }\n }\n\n // Require at least 2 YAML indicators and no JSON indicators\n return yamlIndicators >= 2 && nonYamlIndicators === 0;\n } catch {\n return false;\n }\n }\n\n /**\n * Detect CSV format\n */\n private detectCSV(buffer: Buffer): boolean {\n try {\n const text = buffer.toString(\"utf-8\", 0, Math.min(buffer.length, 512));\n const lines = text.split(\"\\n\").filter((line) => line.trim().length > 0);\n\n if (lines.length < 2) return false;\n\n // Try common delimiters\n const delimiters = [\",\", \";\", \"\\t\"];\n\n for (const delimiter of delimiters) {\n const counts = lines.map((line) => {\n const escaped = delimiter.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const matches = line.match(new RegExp(escaped, \"g\"));\n return matches ? matches.length : 0;\n });\n\n // Check for consistent delimiter count across lines (and at least 1 delimiter)\n const firstCount = counts[0];\n if (firstCount > 0 && counts.every((count) => count === firstCount)) {\n return true;\n }\n }\n\n return false;\n } catch {\n return false;\n }\n }\n\n /**\n * Detect protobuf binary format\n */\n private detectProtobuf(buffer: Buffer): boolean {\n if (buffer.length < 4) return false;\n\n // Protobuf messages typically start with field tags\n // Field tag = (field_number << 3) | wire_type\n // Wire types: 0 (varint), 1 (64-bit), 2 (length-delimited), 5 (32-bit)\n\n const firstByte = buffer[0];\n const wireType = firstByte & 0x07;\n const fieldNumber = firstByte >> 3;\n\n // Valid wire type (0-5, excluding 3 and 4 which are deprecated)\n const hasValidWireType = wireType === 0 || wireType === 1 || wireType === 2 || wireType === 5;\n\n // Reasonable field number (1-99)\n const hasValidFieldNumber = fieldNumber > 0 && fieldNumber < 100;\n\n // Check if content is binary (not text)\n const isBinary = this.isBinaryContent(buffer);\n\n // All three conditions must be met\n return hasValidWireType && hasValidFieldNumber && isBinary;\n }\n\n /**\n * Detect plain text format\n */\n private detectPlainText(buffer: Buffer): boolean {\n const sample = buffer.subarray(0, Math.min(buffer.length, 512));\n\n // Reject empty buffers\n if (sample.length === 0) return false;\n\n let binaryBytes = 0;\n\n for (const byte of sample) {\n // Count null bytes and non-printable characters (excluding common whitespace)\n if (byte === 0x00 || (byte < 0x20 && byte !== 0x09 && byte !== 0x0a && byte !== 0x0d)) {\n binaryBytes++;\n }\n }\n\n // If less than 5% binary bytes, likely text (stricter threshold)\n return binaryBytes / sample.length < 0.05;\n }\n\n /**\n * Check if buffer contains binary content\n */\n private isBinaryContent(buffer: Buffer): boolean {\n const sample = buffer.subarray(0, Math.min(buffer.length, 512));\n let binaryBytes = 0;\n\n for (const byte of sample) {\n if (byte === 0x00 || (byte < 0x20 && byte !== 0x09 && byte !== 0x0a && byte !== 0x0d)) {\n binaryBytes++;\n }\n }\n\n // More than 10% binary bytes indicates binary content\n return binaryBytes / sample.length > 0.1;\n }\n}\n\n/**\n * Create a detector instance with the global magic number database\n */\nexport function createDetector(catalog: Map<string, MimeType>): MimeTypeDetector {\n return new MimeTypeDetector(MAGIC_NUMBER_DATABASE, catalog);\n}\n","/**\n * Foundry MIME Type Catalog - implements MIME type detection and lookup\n *\n * v0.1.1: Extension-based detection\n * v0.1.2: Magic number detection with streaming support\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { Readable } from \"node:stream\";\nimport { createDetector, type DetectionOptions } from \"./detector.js\";\nimport { loadMimeTypeCatalog } from \"./loader.js\";\nimport type { MimeType, MimeTypeCatalog } from \"./types.js\";\n\nlet catalogCache: MimeTypeCatalog | null = null;\nconst mimeStringIndex = new Map<string, MimeType>();\nconst extensionIndex = new Map<string, MimeType>();\nlet detectorInstance: ReturnType<typeof createDetector> | null = null;\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as T;\n }\n\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return cloned as T;\n}\n\nfunction deepFreeze<T extends object>(obj: T): T {\n Object.freeze(obj);\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key];\n if (value !== null && typeof value === \"object\") {\n deepFreeze(value);\n }\n }\n }\n\n return obj;\n}\n\nasync function ensureCatalogLoaded(): Promise<void> {\n if (catalogCache !== null) {\n return;\n }\n\n catalogCache = await loadMimeTypeCatalog();\n\n for (const mimeType of catalogCache.types) {\n // Index by MIME string (case-insensitive)\n mimeStringIndex.set(mimeType.mime.toLowerCase(), mimeType);\n\n // Index by extensions (case-insensitive, with and without leading dot)\n for (const ext of mimeType.extensions) {\n const normalized = ext.toLowerCase().replace(/^\\./, \"\");\n extensionIndex.set(normalized, mimeType);\n }\n }\n\n // Initialize detector\n detectorInstance = createDetector(mimeStringIndex);\n}\n\nexport async function getMimeType(mimeString: string): Promise<Readonly<MimeType> | null> {\n await ensureCatalogLoaded();\n const normalized = mimeString.toLowerCase();\n const mimeType = mimeStringIndex.get(normalized);\n return mimeType ? deepFreeze(deepClone(mimeType)) : null;\n}\n\nexport async function getMimeTypeByExtension(\n extension: string,\n): Promise<Readonly<MimeType> | null> {\n await ensureCatalogLoaded();\n const normalized = extension.toLowerCase().replace(/^\\./, \"\");\n const mimeType = extensionIndex.get(normalized);\n return mimeType ? deepFreeze(deepClone(mimeType)) : null;\n}\n\n/**\n * Check if a MIME type is supported in the catalog\n *\n * Note: Must be async to ensure catalog is loaded on cold calls.\n * Without ensureCatalogLoaded(), mimeStringIndex would be empty\n * and return false even for valid types.\n */\nexport async function isSupportedMimeType(mime: string): Promise<boolean> {\n await ensureCatalogLoaded();\n return mimeStringIndex.has(mime.toLowerCase());\n}\n\n/**\n * Detect MIME type from content using magic number analysis.\n *\n * Supports multiple input types:\n * - Buffer: Direct content analysis\n * - string (file path): Read and analyze file\n * - ReadableStream: Stream first N bytes for analysis\n * - Readable: Node.js stream first N bytes for analysis\n *\n * @param input - Content to analyze\n * @param options - Detection options\n * @returns Detected MIME type or null if unknown\n */\nexport async function detectMimeType(\n input: Buffer | ReadableStream | Readable | string,\n options?: DetectionOptions,\n): Promise<Readonly<MimeType> | null> {\n await ensureCatalogLoaded();\n\n if (!detectorInstance) {\n throw new Error(\"Detector not initialized\");\n }\n\n // Handle different input types\n if (typeof input === \"string\") {\n return detectMimeTypeFromFile(input, options);\n }\n\n if (Buffer.isBuffer(input)) {\n return detectMimeTypeFromBuffer(input, options);\n }\n\n return detectMimeTypeFromStream(input, options);\n}\n\n/**\n * Detect MIME type from file path\n */\nexport async function detectMimeTypeFromFile(\n filePath: string,\n options: DetectionOptions = {},\n): Promise<Readonly<MimeType> | null> {\n await ensureCatalogLoaded();\n\n if (!detectorInstance) {\n throw new Error(\"Detector not initialized\");\n }\n\n const bytesToRead = options.bytesToRead || 512;\n\n // Use Bun.file() when available for better performance\n if (typeof Bun !== \"undefined\") {\n const file = Bun.file(filePath);\n if (!(await file.exists())) {\n return null;\n }\n const slice = file.slice(0, bytesToRead);\n const arrayBuffer = await slice.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n return detectMimeTypeFromBuffer(buffer, options);\n }\n\n // Node.js fallback\n try {\n const buffer = await readFile(filePath, { encoding: null });\n const sample = buffer.subarray(0, Math.min(buffer.length, bytesToRead));\n return detectMimeTypeFromBuffer(sample, options);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Detect MIME type from Buffer\n */\nexport function detectMimeTypeFromBuffer(\n buffer: Buffer,\n options: DetectionOptions = {},\n): Readonly<MimeType> | null {\n if (!detectorInstance) {\n throw new Error(\"Detector not initialized\");\n }\n\n const result = detectorInstance.detect(buffer, options);\n return result ? deepFreeze(deepClone(result)) : null;\n}\n\n/**\n * Detect MIME type from stream (ReadableStream or Node.js Readable)\n */\nexport async function detectMimeTypeFromStream(\n stream: ReadableStream | Readable,\n options: DetectionOptions = {},\n): Promise<Readonly<MimeType> | null> {\n await ensureCatalogLoaded();\n\n const bytesToRead = options.bytesToRead || 512;\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n\n // Convert Node.js Readable to Web ReadableStream if needed\n const webStream: ReadableStream =\n typeof (stream as ReadableStream).getReader === \"function\"\n ? (stream as ReadableStream)\n : Readable.toWeb(stream as Readable);\n\n const reader = webStream.getReader();\n\n try {\n while (totalBytes < bytesToRead) {\n const { value, done } = await reader.read();\n if (done) break;\n\n chunks.push(value);\n totalBytes += value.length;\n }\n\n const buffer = Buffer.concat(chunks.map((c) => Buffer.from(c)));\n const sample = buffer.subarray(0, Math.min(buffer.length, bytesToRead));\n\n return detectMimeTypeFromBuffer(sample, options);\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Check if buffer matches a known magic number pattern\n */\nexport function matchMagicNumber(buffer: Buffer, mimeType: string): boolean {\n if (!detectorInstance) {\n throw new Error(\"Detector not initialized\");\n }\n\n const result = detectorInstance.detect(buffer);\n return result?.mime === mimeType;\n}\n\nexport async function listMimeTypes(): Promise<ReadonlyArray<Readonly<MimeType>>> {\n await ensureCatalogLoaded();\n return Array.from(mimeStringIndex.values()).map((m) => deepFreeze(deepClone(m)));\n}\n\nexport function clearMimeTypeCache(): void {\n catalogCache = null;\n mimeStringIndex.clear();\n extensionIndex.clear();\n detectorInstance = null;\n}\n","/**\n * Foundry Pattern Catalog - implements pattern access and matching\n */\n\nimport picomatch from \"picomatch\";\nimport { FoundryCatalogError } from \"./errors.js\";\nimport { loadPatternCatalog } from \"./loader.js\";\nimport type { Pattern, PatternCatalog } from \"./types.js\";\n\nlet catalogCache: PatternCatalog | null = null;\nconst patternIndex = new Map<string, Pattern>();\nconst compiledRegexCache = new Map<string, RegExp>();\nconst compiledGlobCache = new Map<string, ReturnType<typeof picomatch>>();\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as T;\n }\n\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return cloned as T;\n}\n\nfunction deepFreeze<T extends object>(obj: T): T {\n Object.freeze(obj);\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key];\n if (value !== null && typeof value === \"object\") {\n deepFreeze(value);\n }\n }\n }\n\n return obj;\n}\n\nasync function ensureCatalogLoaded(): Promise<void> {\n if (catalogCache !== null) {\n return;\n }\n\n catalogCache = await loadPatternCatalog();\n\n for (const pattern of catalogCache.patterns) {\n patternIndex.set(pattern.id, pattern);\n }\n}\n\nexport async function getPattern(id: string): Promise<Readonly<Pattern> | null> {\n await ensureCatalogLoaded();\n const pattern = patternIndex.get(id);\n return pattern ? deepFreeze(deepClone(pattern)) : null;\n}\n\nexport async function getPatternRegex(id: string): Promise<RegExp | null> {\n await ensureCatalogLoaded();\n const pattern = patternIndex.get(id);\n\n if (!pattern) {\n return null;\n }\n\n if (pattern.kind !== \"regex\") {\n throw FoundryCatalogError.invalidSchema(\n \"patterns\",\n `Pattern '${id}' is not a regex pattern (kind: ${pattern.kind})`,\n );\n }\n\n const cached = compiledRegexCache.get(id);\n if (cached !== undefined) {\n return cached;\n }\n\n let flags = \"\";\n if (pattern.flags?.typescript?.ignoreCase) {\n flags += \"i\";\n }\n\n const hasUnicodePropertyEscapes = /\\\\p\\{/.test(pattern.pattern);\n if (pattern.flags?.typescript?.unicode || hasUnicodePropertyEscapes) {\n flags += \"u\";\n }\n\n const regex = new RegExp(pattern.pattern, flags);\n compiledRegexCache.set(id, regex);\n return regex;\n}\n\nfunction getCompiledGlob(id: string, pattern: string): ReturnType<typeof picomatch> {\n const cached = compiledGlobCache.get(id);\n if (cached !== undefined) {\n return cached;\n }\n\n const matcher = picomatch(pattern);\n compiledGlobCache.set(id, matcher);\n return matcher;\n}\n\nexport async function matchPattern(id: string, value: string): Promise<boolean> {\n await ensureCatalogLoaded();\n const pattern = patternIndex.get(id);\n\n if (!pattern) {\n throw FoundryCatalogError.missingCatalog(`Pattern '${id}' not found`);\n }\n\n if (pattern.kind === \"regex\") {\n const regex = await getPatternRegex(id);\n return regex ? regex.test(value) : false;\n }\n\n if (pattern.kind === \"glob\") {\n const matcher = getCompiledGlob(id, pattern.pattern);\n return matcher(value);\n }\n\n if (pattern.kind === \"literal\") {\n return pattern.pattern === value;\n }\n\n throw FoundryCatalogError.invalidSchema(\"patterns\", `Unknown pattern kind: ${pattern.kind}`);\n}\n\nexport async function listPatterns(): Promise<ReadonlyArray<Readonly<Pattern>>> {\n await ensureCatalogLoaded();\n return Array.from(patternIndex.values()).map((p) => deepFreeze(deepClone(p)));\n}\n\nexport async function describePattern(id: string): Promise<string | null> {\n const pattern = await getPattern(id);\n return pattern?.description ?? null;\n}\n\nexport function clearPatternCache(): void {\n catalogCache = null;\n patternIndex.clear();\n compiledRegexCache.clear();\n compiledGlobCache.clear();\n}\n","/**\n * Signal Catalog Loader\n *\n * Loads and validates the signal handling catalog from Crucible SSOT assets\n * following the same pattern as other Foundry catalogs.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parse as parseYaml } from \"yaml\";\nimport { validateDataBySchemaId } from \"../../schema/validator.js\";\nimport { FoundryCatalogError } from \"../errors.js\";\nimport type { BehaviorInfo, SignalCatalog, SignalInfo } from \"./types.js\";\n\n// Get the directory of the current module file for proper path resolution\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Determine correct path based on whether we're in src/ or dist/\n// In development: src/foundry/signals/catalog.ts → ../../../config\n// In production: dist/foundry/index.js (bundled) → ../../config\nfunction getConfigPath(): string {\n if (__dirname.includes(\"/dist/\")) {\n // Bundled in dist/foundry/index.js\n return join(__dirname, \"../../config/crucible-ts/library/foundry/signals.yaml\");\n }\n // Running from source in src/foundry/signals/\n return join(__dirname, \"../../../config/crucible-ts/library/foundry/signals.yaml\");\n}\n\nconst SSOT_PATHS = {\n signals: getConfigPath(),\n} as const;\n\n// Schema ID for signals catalog (from Crucible SSOT)\nconst SCHEMA_ID = \"library/foundry/v1.0.0/signals\";\n\n/**\n * Load and validate the Signal Catalog from SSOT\n * Bun-first approach with Node.js fallback\n */\nasync function loadCatalog(): Promise<SignalCatalog> {\n const filePath = SSOT_PATHS.signals;\n const catalogName = \"signals\";\n\n try {\n let content: string;\n\n // Bun-first approach\n if (typeof Bun !== \"undefined\") {\n try {\n const file = Bun.file(filePath);\n if (!(await file.exists())) {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n content = await file.text();\n } catch (error) {\n // Handle Bun-specific errors\n if (error instanceof Error && error.message.includes(\"No such file\")) {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n throw error;\n }\n } else {\n // Node.js fallback\n try {\n content = await readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n throw error;\n }\n }\n\n // Parse YAML content\n const data = parseYaml(content) as SignalCatalog;\n\n // Validate against JSON Schema from Crucible SSOT\n const result = await validateDataBySchemaId(data, SCHEMA_ID);\n if (!result.valid) {\n const errorMessages = result.diagnostics.map((d) => `${d.pointer}: ${d.message}`).join(\"; \");\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n `Schema validation failed: ${errorMessages}`,\n );\n }\n\n return data;\n } catch (error) {\n if (error instanceof FoundryCatalogError) {\n throw error;\n }\n\n // Distinguish between different types of file access errors\n const err = error as NodeJS.ErrnoException;\n if (err.code === \"ENOENT\") {\n throw FoundryCatalogError.missingCatalog(catalogName);\n } else if (err.code === \"EACCES\") {\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n \"Permission denied accessing catalog file\",\n err,\n );\n } else if (err.code === \"EISDIR\") {\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n \"Expected file but found directory\",\n err,\n );\n } else if (err.code === \"EMFILE\" || err.code === \"ENFILE\") {\n throw FoundryCatalogError.invalidSchema(catalogName, \"Too many open files\", err);\n }\n\n throw FoundryCatalogError.invalidSchema(catalogName, \"Failed to load catalog\", err);\n }\n}\n\n// Cached catalog instance\nlet cachedCatalog: SignalCatalog | null = null;\n\n/**\n * Get the signal catalog, loading it if necessary\n */\nasync function getCatalog(): Promise<SignalCatalog> {\n if (!cachedCatalog) {\n cachedCatalog = await loadCatalog();\n }\n return cachedCatalog;\n}\n\n/**\n * Get the signals catalog version\n */\nexport async function getSignalsVersion(): Promise<string> {\n const catalog = await getCatalog();\n return catalog.version;\n}\n\n/**\n * Get all signals\n */\nexport async function listSignals(): Promise<SignalInfo[]> {\n const catalog = await getCatalog();\n return catalog.signals.map((signal) => ({ ...signal }));\n}\n\n/**\n * Get a specific signal by ID or name\n */\nexport async function getSignal(identifier: string): Promise<SignalInfo | null> {\n const catalog = await getCatalog();\n const signal = catalog.signals.find((s) => s.id === identifier || s.name === identifier);\n return signal ? { ...signal } : null;\n}\n\n/**\n * Get all behaviors\n */\nexport async function listBehaviors(): Promise<BehaviorInfo[]> {\n const catalog = await getCatalog();\n return catalog.behaviors.map((behavior) => ({ ...behavior }));\n}\n\n/**\n * Get a specific behavior by ID\n */\nexport async function getBehavior(id: string): Promise<BehaviorInfo | null> {\n const catalog = await getCatalog();\n const behavior = catalog.behaviors.find((b) => b.id === id);\n return behavior ? { ...behavior } : null;\n}\n\n/**\n * Get the complete catalog (for advanced use cases)\n */\nexport async function getSignalCatalog(): Promise<SignalCatalog> {\n return await getCatalog();\n}\n","/**\n * Signal Capability Detection\n *\n * Platform-aware signal support detection driven by catalog metadata.\n * Ensures cross-language parity by querying windows_event/fallback fields\n * rather than hardcoding signal names.\n */\n\nimport { getSignal, getSignalCatalog } from \"./catalog.js\";\n\n/**\n * Platform types\n */\nexport type Platform = \"linux\" | \"darwin\" | \"win32\" | \"freebsd\" | \"unknown\";\n\n/**\n * Platform capabilities summary\n */\nexport interface PlatformCapabilities {\n platform: Platform;\n isPOSIX: boolean;\n isWindows: boolean;\n supportsNativeSignals: boolean;\n supportsSignalExitCodes: boolean;\n supportedSignals: string[];\n unsupportedSignals: string[];\n mappedSignals: string[]; // Windows console events\n}\n\n/**\n * Detect current platform\n */\nexport function getPlatform(): Platform {\n const platform = process.platform;\n\n switch (platform) {\n case \"linux\":\n return \"linux\";\n case \"darwin\":\n return \"darwin\";\n case \"win32\":\n return \"win32\";\n case \"freebsd\":\n return \"freebsd\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Check if current platform is POSIX-compliant\n */\nexport function isPOSIX(): boolean {\n const platform = getPlatform();\n return platform === \"linux\" || platform === \"darwin\" || platform === \"freebsd\";\n}\n\n/**\n * Check if current platform is Windows\n */\nexport function isWindows(): boolean {\n return getPlatform() === \"win32\";\n}\n\n/**\n * Check if a signal is supported on the current platform\n *\n * Uses catalog metadata (windows_event field) to determine support.\n * Returns true if:\n * - Platform is POSIX (all signals natively supported)\n * - Platform is Windows AND signal has non-null windows_event\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n */\nexport async function supportsSignal(signalName: string): Promise<boolean> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return false;\n }\n\n // POSIX platforms support all signals natively\n if (isPOSIX()) {\n return true;\n }\n\n // Windows: check if signal has a console event mapping\n if (isWindows()) {\n // Signal is supported if windows_event is non-null\n return signal.windows_event !== null;\n }\n\n // Unknown platform: conservative approach (assume unsupported)\n return false;\n}\n\n/**\n * Check if platform supports signal-based exit codes (128+N pattern)\n *\n * Windows doesn't propagate signal numbers via exit codes in the same way\n * as POSIX systems. This function helps applications decide whether to\n * rely on signal exit codes for process monitoring.\n */\nexport function supportsSignalExitCodes(): boolean {\n // Only POSIX systems reliably support 128+N exit code pattern\n return isPOSIX();\n}\n\n/**\n * Get comprehensive platform capabilities\n *\n * Queries catalog to build a complete picture of signal support.\n * Useful for capability reporting, documentation generation, and testing.\n */\nexport async function getPlatformCapabilities(): Promise<PlatformCapabilities> {\n const platform = getPlatform();\n const isPosix = isPOSIX();\n const isWin = isWindows();\n const catalog = await getSignalCatalog();\n\n const supported: string[] = [];\n const unsupported: string[] = [];\n const mapped: string[] = [];\n\n // Categorize signals based on platform\n for (const signal of catalog.signals) {\n if (isPosix) {\n // All signals supported on POSIX\n supported.push(signal.name);\n } else if (isWin) {\n if (signal.windows_event !== null) {\n // Signal has Windows console event mapping\n supported.push(signal.name);\n mapped.push(signal.name);\n } else {\n // No Windows support - requires fallback\n unsupported.push(signal.name);\n }\n } else {\n // Unknown platform - mark as unsupported\n unsupported.push(signal.name);\n }\n }\n\n return {\n platform,\n isPOSIX: isPosix,\n isWindows: isWin,\n supportsNativeSignals: isPosix,\n supportsSignalExitCodes: supportsSignalExitCodes(),\n supportedSignals: supported,\n unsupportedSignals: unsupported,\n mappedSignals: mapped,\n };\n}\n\n/**\n * Get the signal number for the current platform\n *\n * Handles platform-specific overrides (e.g., SIGUSR1/SIGUSR2 on macOS/FreeBSD).\n * Returns the appropriate signal number based on platform_overrides.\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n * @returns Signal number for current platform, or null if signal not found\n */\nexport async function getSignalNumber(signalName: string): Promise<number | null> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return null;\n }\n\n const platform = getPlatform();\n\n // Check for platform-specific override\n if (signal.platform_overrides) {\n if (platform === \"darwin\" && signal.platform_overrides.darwin !== undefined) {\n return signal.platform_overrides.darwin;\n }\n if (platform === \"freebsd\" && signal.platform_overrides.freebsd !== undefined) {\n return signal.platform_overrides.freebsd;\n }\n }\n\n // Return standard Unix number\n return signal.unix_number;\n}\n\n/**\n * Get the Windows console event name for a signal\n *\n * Returns the Windows console event that corresponds to a Unix signal,\n * or null if the signal is not supported on Windows.\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n */\nexport async function getWindowsEvent(signalName: string): Promise<string | null> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return null;\n }\n\n return signal.windows_event;\n}\n","/**\n * Signal Handler Convenience Wrappers\n *\n * Common signal handling patterns for shutdown, reload, and custom behaviors.\n */\n\nimport type { HandlerOptions, SignalHandler, SignalManager } from \"./manager.js\";\n\n/**\n * Register a graceful shutdown handler\n *\n * Convenience wrapper for SIGTERM and SIGINT handlers.\n * Automatically registers both signals to the same handler.\n *\n * @param manager - Signal manager instance\n * @param handler - Shutdown handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onShutdown(manager, async () => {\n * await closeDatabase();\n * await flushLogs();\n * });\n * ```\n */\nexport async function onShutdown(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGTERM\", handler, options);\n await manager.register(\"SIGINT\", handler, options);\n}\n\n/**\n * Register a config reload handler\n *\n * Convenience wrapper for SIGHUP handler.\n * Only registers on POSIX platforms (SIGHUP not supported on Windows).\n *\n * @param manager - Signal manager instance\n * @param handler - Reload handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onReload(manager, async () => {\n * const newConfig = await loadConfig();\n * await validateConfig(newConfig);\n * process.exit(129); // Exit for restart\n * });\n * ```\n */\nexport async function onReload(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGHUP\", handler, options);\n}\n\n/**\n * Register a custom handler for SIGUSR1\n *\n * Common use cases: toggle debug logging, reopen log files, dump statistics.\n *\n * @param manager - Signal manager instance\n * @param handler - Custom handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onUSR1(manager, async () => {\n * logger.info('SIGUSR1 received - reopening log files');\n * await reopenLogFiles();\n * });\n * ```\n */\nexport async function onUSR1(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGUSR1\", handler, options);\n}\n\n/**\n * Register a custom handler for SIGUSR2\n *\n * Common use cases: trigger profiling, rotate credentials, toggle verbose mode.\n *\n * @param manager - Signal manager instance\n * @param handler - Custom handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onUSR2(manager, async () => {\n * logger.info('SIGUSR2 received - toggling debug mode');\n * toggleDebugMode();\n * });\n * ```\n */\nexport async function onUSR2(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGUSR2\", handler, options);\n}\n\n/**\n * Register an emergency quit handler\n *\n * Convenience wrapper for SIGQUIT (immediate exit, no cleanup).\n *\n * @param manager - Signal manager instance\n * @param handler - Emergency quit handler\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onEmergencyQuit(manager, async () => {\n * logger.error('SIGQUIT received - emergency exit');\n * process.exit(131);\n * });\n * ```\n */\nexport async function onEmergencyQuit(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGQUIT\", handler, options);\n}\n\n/**\n * Register handlers for all common shutdown signals\n *\n * Registers the same handler for SIGTERM, SIGINT, and SIGQUIT.\n * Useful for applications that want consistent shutdown behavior.\n *\n * @param manager - Signal manager instance\n * @param handler - Shutdown handler function\n * @param options - Handler options\n */\nexport async function onAnyShutdown(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGTERM\", handler, options);\n await manager.register(\"SIGINT\", handler, options);\n await manager.register(\"SIGQUIT\", handler, options);\n}\n","/**\n * Double-Tap Signal Handling\n *\n * Implements Ctrl+C double-tap pattern for graceful shutdown with force-quit option.\n * Per Crucible standard: 2-second window, immediate exit on second signal.\n */\n\nimport { getSignal } from \"./catalog.js\";\nimport type { FallbackLogger } from \"./windows.js\";\n\n/**\n * Double-tap configuration\n */\nexport interface DoubleTapConfig {\n /**\n * Debounce window in milliseconds (default: 2000ms per Crucible standard)\n */\n windowMs?: number;\n\n /**\n * Exit code for forced double-tap exit (default: 130 for SIGINT)\n */\n exitCode?: number;\n\n /**\n * Message to display on first signal (default: from catalog)\n */\n hintMessage?: string;\n\n /**\n * Logger for double-tap events\n */\n logger?: FallbackLogger;\n\n /**\n * Enable test mode (prevents process.exit calls)\n */\n testMode?: boolean;\n}\n\n/**\n * Double-tap state tracker\n */\nexport interface DoubleTapState {\n firstTapTime: number | null;\n windowMs: number;\n exitCode: number;\n hintMessage: string;\n logger?: FallbackLogger;\n testMode: boolean;\n}\n\n/**\n * Create double-tap state tracker for a signal\n *\n * @param signalName - Signal name (typically \"SIGINT\")\n * @param config - Double-tap configuration\n */\nexport async function createDoubleTapTracker(\n signalName: string,\n config: DoubleTapConfig = {},\n): Promise<DoubleTapState> {\n const signal = await getSignal(signalName);\n\n // Get defaults from catalog if available\n const defaultWindowMs = signal?.double_tap_window_seconds\n ? signal.double_tap_window_seconds * 1000\n : 2000;\n const defaultExitCode = signal?.double_tap_exit_code || 130;\n const defaultHintMessage =\n signal?.double_tap_message || \"Press Ctrl+C again within 2s to force quit\";\n\n return {\n firstTapTime: null,\n windowMs: config.windowMs ?? defaultWindowMs,\n exitCode: config.exitCode ?? defaultExitCode,\n hintMessage: config.hintMessage ?? defaultHintMessage,\n logger: config.logger,\n testMode: config.testMode ?? false,\n };\n}\n\n/**\n * Handle double-tap signal logic\n *\n * Returns true if this is the second tap (force-quit), false if first tap.\n * Updates state to track timing between taps.\n *\n * @param state - Double-tap state tracker\n * @returns true if force-quit should proceed, false if graceful shutdown\n */\nexport function handleDoubleTap(state: DoubleTapState): boolean {\n const now = Date.now();\n\n // First tap\n if (state.firstTapTime === null) {\n state.firstTapTime = now;\n if (state.logger) {\n state.logger.info(state.hintMessage);\n } else {\n console.log(state.hintMessage);\n }\n return false; // Start graceful shutdown\n }\n\n // Check if within window\n const elapsed = now - state.firstTapTime;\n if (elapsed < state.windowMs) {\n // Second tap within window - force quit\n if (state.logger) {\n state.logger.info(\"Force quitting...\");\n } else {\n console.log(\"Force quitting...\");\n }\n\n if (!state.testMode) {\n process.exit(state.exitCode);\n }\n\n return true; // Force quit\n }\n\n // Outside window - treat as new first tap\n state.firstTapTime = now;\n if (state.logger) {\n state.logger.info(state.hintMessage);\n } else {\n console.log(state.hintMessage);\n }\n return false; // Start new graceful shutdown\n}\n\n/**\n * Reset double-tap state\n *\n * Called when graceful shutdown completes before second tap.\n */\nexport function resetDoubleTap(state: DoubleTapState): void {\n state.firstTapTime = null;\n}\n\n/**\n * Check if currently within double-tap window\n *\n * Useful for testing and debugging.\n */\nexport function isWithinWindow(state: DoubleTapState): boolean {\n if (state.firstTapTime === null) {\n return false;\n }\n const elapsed = Date.now() - state.firstTapTime;\n return elapsed < state.windowMs;\n}\n\n/**\n * Get time remaining in double-tap window (milliseconds)\n *\n * Returns null if not in a window, otherwise milliseconds remaining.\n */\nexport function getWindowTimeRemaining(state: DoubleTapState): number | null {\n if (state.firstTapTime === null) {\n return null;\n }\n const elapsed = Date.now() - state.firstTapTime;\n const remaining = state.windowMs - elapsed;\n return remaining > 0 ? remaining : null;\n}\n","/**\n * Windows Signal Fallback\n *\n * Implements standardized Windows fallback behavior for unsupported signals.\n * Follows Crucible specification for logging, telemetry, and operational hints.\n */\n\nimport { getSignal } from \"./catalog.js\";\nimport type { WindowsFallback } from \"./types.js\";\n\n/**\n * Windows fallback result\n */\nexport interface WindowsFallbackResult {\n supported: boolean;\n fallback?: WindowsFallback;\n logged: boolean;\n}\n\n/**\n * Logger interface for Windows fallback\n *\n * Applications should provide a logger instance that implements this interface.\n * If no logger is provided, messages are written to console.\n */\nexport interface FallbackLogger {\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n}\n\n/**\n * Telemetry emitter interface\n *\n * Applications should provide a telemetry emitter for observability.\n * If no emitter is provided, telemetry events are skipped.\n */\nexport interface TelemetryEmitter {\n emit(event: string, tags: Record<string, string>): void;\n}\n\n/**\n * Windows fallback options\n */\nexport interface WindowsFallbackOptions {\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n silent?: boolean; // Skip logging/telemetry (for testing)\n}\n\n/**\n * Default console logger implementation\n */\nconst defaultLogger: FallbackLogger = {\n info(message: string, meta?: Record<string, unknown>) {\n if (meta) {\n console.info(message, meta);\n } else {\n console.info(message);\n }\n },\n warn(message: string, meta?: Record<string, unknown>) {\n if (meta) {\n console.warn(message, meta);\n } else {\n console.warn(message);\n }\n },\n};\n\n/**\n * Handle Windows signal registration fallback\n *\n * This function is called when attempting to register a signal handler\n * on Windows for a signal that lacks native support.\n *\n * Behavior per Crucible standard:\n * 1. Log structured message at INFO level (not WARN - this is expected on Windows)\n * 2. Emit standardized telemetry event (fulmen.signal.unsupported)\n * 3. Return fallback metadata for operational guidance\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n * @param options - Logging and telemetry configuration\n */\nexport async function handleWindowsFallback(\n signalName: string,\n options: WindowsFallbackOptions = {},\n): Promise<WindowsFallbackResult> {\n const signal = await getSignal(signalName);\n\n // Signal not found in catalog\n if (!signal) {\n return {\n supported: false,\n logged: false,\n };\n }\n\n // Signal is supported (has windows_event)\n if (signal.windows_event !== null) {\n return {\n supported: true,\n logged: false,\n };\n }\n\n // Signal is unsupported on Windows - apply fallback\n const fallback = signal.windows_fallback;\n if (!fallback) {\n // No fallback metadata defined (shouldn't happen with valid catalog)\n return {\n supported: false,\n logged: false,\n };\n }\n\n // Skip logging/telemetry if silent mode\n if (options.silent) {\n return {\n supported: false,\n fallback,\n logged: false,\n };\n }\n\n const logger = options.logger || defaultLogger;\n const telemetry = options.telemetry;\n\n // Structured logging per Crucible standard\n // Template: signal=${signal} platform=${platform} fallback=${fallback_behavior} message='${operation_hint}'\n const logMeta = {\n signal: signal.name,\n platform: \"windows\",\n fallback: fallback.fallback_behavior,\n operation_hint: fallback.operation_hint,\n };\n\n // Log at INFO level (not WARN - this is expected Windows behavior)\n logger.info(fallback.log_message, logMeta);\n\n // Emit standardized telemetry\n if (telemetry) {\n telemetry.emit(fallback.telemetry_event, fallback.telemetry_tags);\n }\n\n return {\n supported: false,\n fallback,\n logged: true,\n };\n}\n\n/**\n * Get fallback metadata for a signal without logging\n *\n * Useful for capability checking and testing without side effects.\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n */\nexport async function getFallbackMetadata(signalName: string): Promise<WindowsFallback | null> {\n const signal = await getSignal(signalName);\n if (!signal || !signal.windows_fallback) {\n return null;\n }\n return signal.windows_fallback;\n}\n\n/**\n * Check if a signal requires Windows fallback\n *\n * Returns true if signal is defined in catalog but lacks Windows support\n * (windows_event is null and windows_fallback is defined).\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n */\nexport async function requiresFallback(signalName: string): Promise<boolean> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return false;\n }\n return signal.windows_event === null && signal.windows_fallback !== undefined;\n}\n\n/**\n * Get HTTP endpoint recommendation for Windows fallback\n *\n * Returns formatted operational guidance for signals that require\n * HTTP admin endpoint fallback on Windows.\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n */\nexport async function getHttpFallbackGuidance(signalName: string): Promise<string | null> {\n const fallback = await getFallbackMetadata(signalName);\n if (!fallback || fallback.fallback_behavior !== \"http_admin_endpoint\") {\n return null;\n }\n return fallback.operation_hint;\n}\n","/**\n * Signal Support Guards\n *\n * Validation functions that throw actionable errors when signals are unsupported.\n * Used to fail-fast with clear operational guidance.\n */\n\nimport { FoundryCatalogError } from \"../errors.js\";\nimport { isPOSIX, isWindows, supportsSignal } from \"./capabilities.js\";\nimport { getSignal } from \"./catalog.js\";\nimport { getFallbackMetadata } from \"./windows.js\";\n\n/**\n * Guard options\n */\nexport interface GuardOptions {\n /**\n * Include platform-specific operational guidance in error message\n */\n includeGuidance?: boolean;\n}\n\n/**\n * Ensure a signal is supported on the current platform\n *\n * Throws an error with actionable guidance if the signal is not supported.\n * Use this as a guard at the start of signal registration functions.\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n * @param options - Guard configuration\n * @throws {FoundryCatalogError} If signal is not found or not supported\n *\n * @example\n * ```typescript\n * await ensureSupported(\"SIGHUP\");\n * // On Windows: throws with HTTP fallback guidance\n * // On POSIX: passes through\n * ```\n */\nexport async function ensureSupported(\n signalName: string,\n options: GuardOptions = {},\n): Promise<void> {\n const { includeGuidance = true } = options;\n\n // Check if signal exists in catalog\n const signal = await getSignal(signalName);\n if (!signal) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n `Signal \"${signalName}\" not found in catalog. ` +\n `Valid signals: SIGTERM, SIGINT, SIGHUP, SIGQUIT, SIGPIPE, SIGALRM, SIGUSR1, SIGUSR2`,\n );\n }\n\n // Check platform support\n const supported = await supportsSignal(signalName);\n if (supported) {\n return; // Signal is supported\n }\n\n // Signal is not supported - build actionable error message\n let message = `Signal ${signal.name} is not supported on this platform`;\n\n if (isWindows() && includeGuidance) {\n const fallback = await getFallbackMetadata(signalName);\n if (fallback) {\n message += `. ${fallback.log_message}`;\n\n // Add specific guidance based on fallback type\n switch (fallback.fallback_behavior) {\n case \"http_admin_endpoint\":\n message += `. Use HTTP endpoint: ${fallback.operation_hint}`;\n break;\n case \"exception_handling\":\n message += `. Alternative: ${fallback.operation_hint}`;\n break;\n case \"timer_api\":\n message += `. Alternative: ${fallback.operation_hint}`;\n break;\n }\n }\n }\n\n throw FoundryCatalogError.invalidSchema(\"signals\", message);\n}\n\n/**\n * Ensure platform supports signal-based exit codes\n *\n * Throws an error if the platform doesn't support the POSIX 128+N exit code pattern.\n * Use this when exit code semantics are critical to application logic.\n *\n * @throws {FoundryCatalogError} If platform doesn't support signal exit codes\n *\n * @example\n * ```typescript\n * ensureSignalExitCodesSupported();\n * // On Windows: throws with guidance\n * // On POSIX: passes through\n * ```\n */\nexport function ensureSignalExitCodesSupported(): void {\n if (!isPOSIX()) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n \"Signal-based exit codes (128+N pattern) are not supported on this platform. \" +\n \"Windows does not propagate signal numbers via exit codes. \" +\n \"Use explicit exit codes or monitor via HTTP admin endpoint.\",\n );\n }\n}\n\n/**\n * Ensure platform is POSIX\n *\n * Throws an error if the platform is not POSIX-compliant.\n * Use this for functionality that strictly requires POSIX signal semantics.\n *\n * @throws {FoundryCatalogError} If platform is not POSIX\n */\nexport function ensurePOSIX(): void {\n if (!isPOSIX()) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n \"This operation requires a POSIX-compliant platform (Linux, macOS, FreeBSD). \" +\n \"Current platform does not support native signal handling.\",\n );\n }\n}\n\n/**\n * Ensure platform is Windows\n *\n * Throws an error if the platform is not Windows.\n * Use this for Windows-specific fallback testing or functionality.\n *\n * @throws {FoundryCatalogError} If platform is not Windows\n */\nexport function ensureWindows(): void {\n if (!isWindows()) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n \"This operation requires Windows platform. Current platform uses native signals.\",\n );\n }\n}\n","/**\n * HTTP Signal Endpoint Helper\n *\n * Framework-agnostic scaffold for POST /admin/signal endpoint.\n * Applications provide auth/rate-limiting; helper handles validation and execution.\n */\n\nimport { supportsSignal } from \"./capabilities.js\";\nimport type { SignalManager } from \"./manager.js\";\nimport type { FallbackLogger, TelemetryEmitter } from \"./windows.js\";\n\n/**\n * Signal request payload\n */\nexport interface SignalRequest {\n signal: string;\n reason?: string;\n correlation_id?: string;\n}\n\n/**\n * Signal response (success)\n */\nexport interface SignalResponse {\n status: \"accepted\";\n signal: string;\n correlation_id: string;\n message: string;\n}\n\n/**\n * Signal error response\n */\nexport interface SignalErrorResponse {\n status: \"error\";\n error: string;\n message: string;\n valid_signals?: string[];\n}\n\n/**\n * Authentication result\n */\nexport interface AuthResult {\n authenticated: boolean;\n identity?: string; // Client identifier (IP, cert fingerprint, etc.)\n reason?: string;\n}\n\n/**\n * Rate limit result\n */\nexport interface RateLimitResult {\n allowed: boolean;\n remaining?: number;\n reset_at?: number;\n}\n\n/**\n * Authentication hook function\n *\n * Applications must provide this to validate requests.\n * Returns authentication result with optional identity.\n */\nexport type AuthHook = (req: unknown) => Promise<AuthResult> | AuthResult;\n\n/**\n * Rate limiting hook function\n *\n * Applications may provide this to enforce rate limits.\n * Returns whether request is allowed and quota info.\n */\nexport type RateLimitHook = (\n identity: string,\n signal: string,\n) => Promise<RateLimitResult> | RateLimitResult;\n\n/**\n * Signal endpoint options\n */\nexport interface SignalEndpointOptions {\n /**\n * Signal manager instance\n */\n manager: SignalManager;\n\n /**\n * Authentication hook (required)\n */\n auth: AuthHook;\n\n /**\n * Rate limiting hook (optional)\n */\n rateLimit?: RateLimitHook;\n\n /**\n * Logger for endpoint events\n */\n logger?: FallbackLogger;\n\n /**\n * Telemetry emitter\n */\n telemetry?: TelemetryEmitter;\n\n /**\n * Allowed signals (default: all catalog signals)\n */\n allowedSignals?: string[];\n}\n\n/**\n * Create a framework-agnostic signal endpoint handler\n *\n * Returns an async function that processes signal requests.\n * Applications wire this to their HTTP framework (Express, Fastify, etc.)\n *\n * @param options - Endpoint configuration\n *\n * @example Express\n * ```typescript\n * const handler = createSignalEndpoint({\n * manager,\n * auth: async (req) => {\n * const token = req.headers.authorization?.split(' ')[1];\n * return { authenticated: token === process.env.ADMIN_TOKEN };\n * },\n * });\n *\n * app.post('/admin/signal', async (req, res) => {\n * const result = await handler(req.body, req);\n * res.status(result.status === 'accepted' ? 202 : result.statusCode || 400)\n * .json(result);\n * });\n * ```\n *\n * @example Fastify\n * ```typescript\n * const handler = createSignalEndpoint({ manager, auth });\n *\n * fastify.post('/admin/signal', async (request, reply) => {\n * const result = await handler(request.body, request);\n * reply.status(result.status === 'accepted' ? 202 : 400).send(result);\n * });\n * ```\n */\nexport function createSignalEndpoint(\n options: SignalEndpointOptions,\n): (\n payload: SignalRequest,\n req: unknown,\n) => Promise<(SignalResponse | SignalErrorResponse) & { statusCode?: number }> {\n const { manager, auth, rateLimit, logger, telemetry, allowedSignals } = options;\n\n return async (payload: SignalRequest, req: unknown) => {\n const correlationId = payload.correlation_id ?? generateCorrelationId();\n\n // Authenticate request\n const authResult = await auth(req);\n if (!authResult.authenticated) {\n if (logger) {\n logger.warn(\"Signal endpoint: authentication failed\", {\n correlation_id: correlationId,\n reason: authResult.reason,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.http_endpoint.auth_failed\", {\n correlation_id: correlationId,\n });\n }\n\n return {\n status: \"error\",\n error: \"authentication_failed\",\n message: authResult.reason || \"Authentication required\",\n statusCode: 401,\n };\n }\n\n const identity = authResult.identity || \"unknown\";\n\n // Validate signal name\n if (!payload.signal) {\n return {\n status: \"error\",\n error: \"invalid_request\",\n message: \"Signal name is required\",\n statusCode: 400,\n };\n }\n\n // Normalize signal name first\n const signalName = normalizeSignalName(payload.signal);\n\n // Check if signal is in allowed list\n const defaultAllowed = [\n \"SIGHUP\",\n \"SIGTERM\",\n \"SIGINT\",\n \"SIGQUIT\",\n \"SIGUSR1\",\n \"SIGUSR2\",\n \"SIGPIPE\",\n \"SIGALRM\",\n ];\n\n // Normalize allowed signals list (handle both 'HUP' and 'SIGHUP' formats)\n const allowed = (allowedSignals || defaultAllowed).map((s) => normalizeSignalName(s));\n\n if (!allowed.includes(signalName)) {\n return {\n status: \"error\",\n error: \"invalid_signal\",\n message: `Signal '${payload.signal}' is not recognized. Valid signals: ${allowed.join(\", \")}`,\n valid_signals: allowed,\n statusCode: 400,\n };\n }\n\n // Check platform support\n const supported = await supportsSignal(signalName);\n if (!supported) {\n // This shouldn't happen on Windows (the only reason for HTTP endpoint)\n // but handle gracefully\n return {\n status: \"error\",\n error: \"signal_not_supported\",\n message: `Signal ${signalName} is not supported on this platform`,\n statusCode: 400,\n };\n }\n\n // Check rate limit\n if (rateLimit) {\n const rateLimitResult = await rateLimit(identity, signalName);\n if (!rateLimitResult.allowed) {\n if (logger) {\n logger.warn(\"Signal endpoint: rate limit exceeded\", {\n correlation_id: correlationId,\n identity,\n signal: signalName,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.http_endpoint.rate_limited\", {\n correlation_id: correlationId,\n signal: signalName,\n });\n }\n\n return {\n status: \"error\",\n error: \"rate_limit_exceeded\",\n message: \"Rate limit exceeded. Please try again later.\",\n statusCode: 429,\n };\n }\n }\n\n // Log signal request\n if (logger) {\n logger.info(\"Signal endpoint: signal received\", {\n correlation_id: correlationId,\n identity,\n signal: signalName,\n reason: payload.reason,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.http_endpoint.signal_received\", {\n correlation_id: correlationId,\n signal: signalName,\n });\n }\n\n // Trigger signal asynchronously\n // Don't await - signal handlers may exit the process\n void manager.trigger(signalName).catch((error) => {\n if (logger) {\n logger.warn(\"Signal handler execution failed\", {\n correlation_id: correlationId,\n signal: signalName,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Return success response immediately\n return {\n status: \"accepted\",\n signal: signalName,\n correlation_id: correlationId,\n message: \"Signal will be processed asynchronously\",\n statusCode: 202,\n };\n };\n}\n\n/**\n * Normalize signal name from HTTP request\n *\n * Converts \"HUP\" or \"hup\" to \"SIGHUP\"\n */\nfunction normalizeSignalName(signal: string): string {\n const upper = signal.toUpperCase();\n if (upper.startsWith(\"SIG\")) {\n return upper;\n }\n return `SIG${upper}`;\n}\n\n/**\n * Generate a correlation ID\n */\nfunction generateCorrelationId(): string {\n return `sig-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Create a simple bearer token auth hook\n *\n * Validates requests against a static token.\n * For production, use mTLS or more robust auth.\n *\n * @param expectedToken - Expected bearer token\n *\n * @example\n * ```typescript\n * const auth = createBearerTokenAuth(process.env.ADMIN_TOKEN);\n * const handler = createSignalEndpoint({ manager, auth });\n * ```\n */\nexport function createBearerTokenAuth(expectedToken: string): AuthHook {\n return (req: unknown) => {\n const headers = (req as { headers?: Record<string, string> }).headers;\n const authHeader = headers?.authorization || headers?.Authorization;\n\n if (!authHeader) {\n return {\n authenticated: false,\n reason: \"Missing Authorization header\",\n };\n }\n\n const [scheme, token] = authHeader.split(\" \");\n if (scheme !== \"Bearer\" || token !== expectedToken) {\n return {\n authenticated: false,\n reason: \"Invalid bearer token\",\n };\n }\n\n return {\n authenticated: true,\n identity: \"bearer-token-user\",\n };\n };\n}\n\n/**\n * Create a simple in-memory rate limiter\n *\n * Tracks requests per identity with sliding window.\n * For production, use Redis or distributed rate limiting.\n *\n * @param requestsPerMinute - Max requests per minute per identity\n *\n * @example\n * ```typescript\n * const rateLimit = createSimpleRateLimiter(10); // 10 req/min\n * const handler = createSignalEndpoint({ manager, auth, rateLimit });\n * ```\n */\nexport function createSimpleRateLimiter(requestsPerMinute: number): RateLimitHook {\n const requests = new Map<string, number[]>();\n const windowMs = 60000; // 1 minute\n\n return (identity: string) => {\n const now = Date.now();\n const key = identity;\n\n // Get existing requests\n let timestamps = requests.get(key) || [];\n\n // Remove timestamps outside window\n timestamps = timestamps.filter((ts) => now - ts < windowMs);\n\n // Check if limit exceeded\n if (timestamps.length >= requestsPerMinute) {\n const oldestTimestamp = Math.min(...timestamps);\n const resetAt = oldestTimestamp + windowMs;\n\n return {\n allowed: false,\n remaining: 0,\n reset_at: resetAt,\n };\n }\n\n // Add current request\n timestamps.push(now);\n requests.set(key, timestamps);\n\n return {\n allowed: true,\n remaining: requestsPerMinute - timestamps.length,\n reset_at: now + windowMs,\n };\n };\n}\n","/**\n * Signal Manager\n *\n * Cross-platform signal handler registration and lifecycle management.\n * Implements FIFO execution, priority overrides, timeout enforcement, and double-tap support.\n */\n\nimport { isWindows, supportsSignal } from \"./capabilities.js\";\nimport { getSignal } from \"./catalog.js\";\nimport {\n createDoubleTapTracker,\n type DoubleTapState,\n handleDoubleTap,\n resetDoubleTap,\n} from \"./double-tap.js\";\nimport { type FallbackLogger, handleWindowsFallback, type TelemetryEmitter } from \"./windows.js\";\n\n/**\n * Signal handler function type\n */\nexport type SignalHandler = (signal: NodeJS.Signals) => void | Promise<void>;\n\n/**\n * Handler registration options\n */\nexport interface HandlerOptions {\n /**\n * Priority for execution order (higher priority runs first)\n * Default: 0 (FIFO order)\n */\n priority?: number;\n\n /**\n * Timeout for this handler in milliseconds\n * Default: manager's default timeout (30s)\n */\n timeoutMs?: number;\n\n /**\n * Handler identifier for debugging\n */\n id?: string;\n}\n\n/**\n * Timeout behavior options\n */\nexport type TimeoutBehavior = \"force_exit\" | \"log_and_continue\";\n\n/**\n * Signal manager configuration\n */\nexport interface SignalManagerOptions {\n /**\n * Default handler timeout in milliseconds\n * Default: 30000 (30 seconds)\n */\n defaultTimeoutMs?: number;\n\n /**\n * Behavior when handler timeout is exceeded\n * Default: 'log_and_continue'\n */\n timeoutBehavior?: TimeoutBehavior;\n\n /**\n * Logger for handler events\n */\n logger?: FallbackLogger;\n\n /**\n * Telemetry emitter for observability\n */\n telemetry?: TelemetryEmitter;\n\n /**\n * Enable test mode (prevents process.exit, allows signal injection)\n */\n testMode?: boolean;\n\n /**\n * Double-tap debounce window in milliseconds (for SIGINT)\n * Default: 2000 (2 seconds per Crucible standard)\n */\n doubleTapWindowMs?: number;\n\n /**\n * Exit code for double-tap force quit\n * Default: 130 (SIGINT)\n */\n doubleTapExitCode?: number;\n}\n\n/**\n * Internal handler registration\n */\ninterface RegisteredHandler {\n signal: string;\n handler: SignalHandler;\n priority: number;\n timeoutMs: number;\n id: string;\n registeredAt: number;\n}\n\n/**\n * Signal Manager\n */\nexport class SignalManager {\n private handlers: Map<string, RegisteredHandler[]> = new Map();\n private nativeListeners: Map<string, (signal: NodeJS.Signals) => void> = new Map();\n private options: Required<Omit<SignalManagerOptions, \"logger\" | \"telemetry\">> & {\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n };\n private handlerIdCounter = 0;\n private doubleTapTrackers: Map<string, DoubleTapState> = new Map();\n private shuttingDown = false;\n\n constructor(options: SignalManagerOptions = {}) {\n this.options = {\n defaultTimeoutMs: options.defaultTimeoutMs ?? 30000,\n timeoutBehavior: options.timeoutBehavior ?? \"log_and_continue\",\n testMode: options.testMode ?? false,\n doubleTapWindowMs: options.doubleTapWindowMs ?? 2000,\n doubleTapExitCode: options.doubleTapExitCode ?? 130,\n logger: options.logger,\n telemetry: options.telemetry,\n };\n }\n\n /**\n * Register a signal handler\n *\n * @param signal - Signal name (e.g., \"SIGTERM\") or NodeJS.Signals\n * @param handler - Handler function\n * @param options - Handler options\n */\n async register(\n signal: string | NodeJS.Signals,\n handler: SignalHandler,\n options: HandlerOptions = {},\n ): Promise<void> {\n const signalName = typeof signal === \"string\" ? signal : signal;\n\n // Check if signal is supported on this platform\n const supported = await supportsSignal(signalName);\n if (!supported) {\n // Log Windows fallback if applicable\n if (isWindows()) {\n await handleWindowsFallback(signalName, {\n logger: this.options.logger,\n telemetry: this.options.telemetry,\n });\n }\n return; // Don't register unsupported signals\n }\n\n // Get or create handler list for this signal\n if (!this.handlers.has(signalName)) {\n this.handlers.set(signalName, []);\n }\n\n // Create handler registration\n const registration: RegisteredHandler = {\n signal: signalName,\n handler,\n priority: options.priority ?? 0,\n timeoutMs: options.timeoutMs ?? this.options.defaultTimeoutMs,\n id: options.id ?? `handler-${++this.handlerIdCounter}`,\n registeredAt: Date.now(),\n };\n\n // Add to handler list (guaranteed to exist from lines 160-162)\n const handlers = this.handlers.get(signalName);\n if (!handlers) {\n throw new Error(`Handler list not initialized for signal ${signalName}`);\n }\n handlers.push(registration);\n\n // Sort by priority (higher first), then by registration order (FIFO)\n handlers.sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority; // Higher priority first\n }\n return a.registeredAt - b.registeredAt; // FIFO for same priority\n });\n\n // Register native listener if not already registered\n if (!this.nativeListeners.has(signalName)) {\n await this.registerNativeListener(signalName);\n }\n\n // Log registration\n if (this.options.logger) {\n this.options.logger.info(`Signal handler registered: ${signalName}`, {\n handler_id: registration.id,\n priority: registration.priority,\n timeout_ms: registration.timeoutMs,\n });\n }\n\n // Emit telemetry\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_registered\", {\n signal: signalName,\n handler_id: registration.id,\n priority: String(registration.priority),\n });\n }\n }\n\n /**\n * Register native Node.js signal listener\n */\n private async registerNativeListener(signalName: string): Promise<void> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return;\n }\n\n // Check if this signal uses double-tap behavior\n const useDoubleTap = signal.default_behavior === \"graceful_shutdown_with_double_tap\";\n\n if (useDoubleTap) {\n // Create double-tap tracker\n const tracker = await createDoubleTapTracker(signalName, {\n windowMs: this.options.doubleTapWindowMs,\n exitCode: this.options.doubleTapExitCode,\n logger: this.options.logger,\n testMode: this.options.testMode,\n });\n this.doubleTapTrackers.set(signalName, tracker);\n }\n\n // Create native listener\n const listener = async (sig: NodeJS.Signals) => {\n // Handle double-tap if enabled\n if (useDoubleTap) {\n const tracker = this.doubleTapTrackers.get(signalName);\n if (tracker) {\n const forceQuit = handleDoubleTap(tracker);\n if (forceQuit) {\n // Second tap - force quit already handled by handleDoubleTap\n return;\n }\n // First tap - continue to graceful shutdown\n }\n }\n\n // Execute registered handlers\n await this.executeHandlers(signalName, sig);\n };\n\n // Register with Node.js\n process.on(signalName as NodeJS.Signals, listener);\n this.nativeListeners.set(signalName, listener);\n }\n\n /**\n * Execute all registered handlers for a signal\n */\n private async executeHandlers(signalName: string, signal: NodeJS.Signals): Promise<void> {\n const handlers = this.handlers.get(signalName);\n if (!handlers || handlers.length === 0) {\n return;\n }\n\n // Mark as shutting down\n this.shuttingDown = true;\n\n // Log signal receipt\n if (this.options.logger) {\n this.options.logger.info(`Signal received: ${signalName}`, {\n handler_count: handlers.length,\n });\n }\n\n // Execute handlers in priority order\n for (const registration of handlers) {\n try {\n // Execute with timeout\n await this.executeWithTimeout(registration, signal);\n } catch (error) {\n // Handler failed - log and continue or exit\n if (this.options.logger) {\n this.options.logger.warn(`Signal handler failed: ${signalName}`, {\n handler_id: registration.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_error\", {\n signal: signalName,\n handler_id: registration.id,\n error_type: error instanceof Error ? error.constructor.name : \"unknown\",\n });\n }\n\n if (this.options.timeoutBehavior === \"force_exit\") {\n const exitCode = (await getSignal(signalName))?.exit_code ?? 1;\n if (!this.options.testMode) {\n process.exit(exitCode);\n }\n return;\n }\n // Otherwise continue to next handler\n }\n }\n\n // Reset double-tap state if graceful shutdown completed\n const tracker = this.doubleTapTrackers.get(signalName);\n if (tracker) {\n resetDoubleTap(tracker);\n }\n }\n\n /**\n * Execute a handler with timeout enforcement\n */\n private async executeWithTimeout(\n registration: RegisteredHandler,\n signal: NodeJS.Signals,\n ): Promise<void> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Handler timeout exceeded: ${registration.timeoutMs}ms`));\n }, registration.timeoutMs);\n });\n\n const handlerPromise = Promise.resolve(registration.handler(signal));\n\n try {\n await Promise.race([handlerPromise, timeoutPromise]);\n\n // Handler completed successfully\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_completed\", {\n signal: registration.signal,\n handler_id: registration.id,\n });\n }\n } catch (error) {\n // Timeout or handler error\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_timeout\", {\n signal: registration.signal,\n handler_id: registration.id,\n timeout_ms: String(registration.timeoutMs),\n });\n }\n throw error;\n }\n }\n\n /**\n * Unregister a signal handler\n *\n * @param signal - Signal name\n * @param handler - Handler to remove (if not provided, removes all handlers)\n */\n unregister(signal: string, handler?: SignalHandler): void {\n const handlers = this.handlers.get(signal);\n if (!handlers) {\n return;\n }\n\n if (handler) {\n // Remove specific handler\n const index = handlers.findIndex((h) => h.handler === handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n } else {\n // Remove all handlers for this signal\n handlers.length = 0;\n }\n\n // If no handlers left, remove native listener\n if (handlers.length === 0) {\n const listener = this.nativeListeners.get(signal);\n if (listener) {\n process.off(signal as NodeJS.Signals, listener);\n this.nativeListeners.delete(signal);\n }\n this.handlers.delete(signal);\n }\n }\n\n /**\n * Check if a signal has registered handlers\n */\n isRegistered(signal: string): boolean {\n const handlers = this.handlers.get(signal);\n return handlers !== undefined && handlers.length > 0;\n }\n\n /**\n * Get handler count for a signal\n */\n getHandlerCount(signal: string): number {\n const handlers = this.handlers.get(signal);\n return handlers?.length ?? 0;\n }\n\n /**\n * Trigger signal handlers manually (for testing)\n *\n * @param signal - Signal name\n */\n async trigger(signal: string): Promise<void> {\n const handlers = this.handlers.get(signal);\n if (!handlers || handlers.length === 0) {\n return;\n }\n\n await this.executeHandlers(signal, signal as NodeJS.Signals);\n }\n\n /**\n * Shutdown the signal manager and cleanup all handlers\n */\n async shutdown(): Promise<void> {\n // Remove all native listeners\n for (const [signal, listener] of this.nativeListeners.entries()) {\n process.off(signal as NodeJS.Signals, listener);\n }\n\n // Clear state\n this.nativeListeners.clear();\n this.handlers.clear();\n this.doubleTapTrackers.clear();\n this.shuttingDown = false;\n }\n\n /**\n * Check if manager is currently shutting down\n */\n isShuttingDown(): boolean {\n return this.shuttingDown;\n }\n}\n\n/**\n * Create a new signal manager instance\n *\n * @param options - Manager configuration\n */\nexport function createSignalManager(options: SignalManagerOptions = {}): SignalManager {\n return new SignalManager(options);\n}\n","/**\n * Configuration Reload Helpers\n *\n * Implements restart-based config reload pattern with mandatory schema validation.\n * Per Crucible standard: validate before restart, reject invalid configs without disruption.\n */\n\nimport type { FallbackLogger, TelemetryEmitter } from \"./windows.js\";\n\n/**\n * Configuration validator function type\n *\n * Applications provide this function to validate new config against schema.\n * Should return validation result with errors if invalid.\n */\nexport type ConfigValidator<T = unknown> = (\n config: T,\n) => Promise<ConfigValidationResult> | ConfigValidationResult;\n\n/**\n * Configuration validation result\n */\nexport interface ConfigValidationResult {\n valid: boolean;\n errors?: Array<{\n path: string;\n message: string;\n }>;\n}\n\n/**\n * Configuration loader function type\n *\n * Applications provide this function to load new config from disk/environment.\n */\nexport type ConfigLoader<T = unknown> = () => Promise<T> | T;\n\n/**\n * Config reload options\n */\nexport interface ConfigReloadOptions<T = unknown> {\n /**\n * Config loader function\n */\n loader: ConfigLoader<T>;\n\n /**\n * Schema validator function\n */\n validator: ConfigValidator<T>;\n\n /**\n * Callback invoked after successful validation, before exit\n * Use for cleanup, logging, etc.\n */\n onValidated?: (config: T) => void | Promise<void>;\n\n /**\n * Exit code for successful reload (default: 129 for SIGHUP)\n */\n exitCode?: number;\n\n /**\n * Logger for reload events\n */\n logger?: FallbackLogger;\n\n /**\n * Telemetry emitter\n */\n telemetry?: TelemetryEmitter;\n\n /**\n * Test mode (prevents process.exit)\n */\n testMode?: boolean;\n}\n\n/**\n * Config reload result (for testing)\n */\nexport interface ConfigReloadResult {\n reloaded: boolean;\n validationErrors?: Array<{ path: string; message: string }>;\n error?: Error;\n}\n\n/**\n * Create a config reload handler with schema validation\n *\n * Returns a signal handler function that implements restart-based reload:\n * 1. Load new config\n * 2. Validate against schema (mandatory)\n * 3. If invalid: log errors, continue with current config\n * 4. If valid: invoke callback, exit for restart\n *\n * @param options - Reload configuration\n *\n * @example\n * ```typescript\n * const reloadHandler = createConfigReloadHandler({\n * loader: () => loadConfig('./config.yaml'),\n * validator: (config) => validateConfigSchema(config),\n * onValidated: async (config) => {\n * logger.info('Config validated, restarting...');\n * },\n * logger: myLogger,\n * });\n *\n * await manager.register('SIGHUP', reloadHandler);\n * ```\n */\nexport function createConfigReloadHandler<T = unknown>(\n options: ConfigReloadOptions<T>,\n): () => Promise<void> {\n const {\n loader,\n validator,\n onValidated,\n exitCode = 129,\n logger,\n telemetry,\n testMode = false,\n } = options;\n\n return async () => {\n // Log reload request\n if (logger) {\n logger.info(\"Config reload requested (SIGHUP)\");\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_requested\", {\n signal: \"SIGHUP\",\n });\n }\n\n try {\n // Load new config\n const newConfig = await loader();\n\n // Validate against schema (mandatory)\n const result = await validator(newConfig);\n\n if (!result.valid) {\n // Invalid config - log and reject without restart\n if (logger) {\n logger.warn(\"Config validation failed - continuing with current config\", {\n error_count: result.errors?.length ?? 0,\n errors: result.errors,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_rejected\", {\n signal: \"SIGHUP\",\n reason: \"validation_failed\",\n error_count: String(result.errors?.length ?? 0),\n });\n }\n\n return; // Don't exit - continue with current config\n }\n\n // Valid config - proceed with restart\n if (logger) {\n logger.info(\"Config validation succeeded - exiting for restart\");\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_accepted\", {\n signal: \"SIGHUP\",\n });\n }\n\n // Invoke pre-restart callback\n if (onValidated) {\n await onValidated(newConfig);\n }\n\n // Exit for restart (process supervisor will restart with new config)\n if (!testMode) {\n process.exit(exitCode);\n }\n } catch (error) {\n // Config load or validation threw error\n if (logger) {\n logger.warn(\"Config reload failed with error - continuing with current config\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_error\", {\n signal: \"SIGHUP\",\n error_type: error instanceof Error ? error.constructor.name : \"unknown\",\n });\n }\n\n // Don't exit - continue with current config\n }\n };\n}\n\n/**\n * Three-strikes failure tracker\n *\n * Tracks consecutive config reload failures and triggers alerts.\n * Useful for detecting persistent config source issues.\n */\nexport class ConfigReloadTracker {\n private failures = 0;\n private lastFailureTime: number | null = null;\n private readonly maxFailures: number;\n private readonly logger?: FallbackLogger;\n private readonly telemetry?: TelemetryEmitter;\n\n constructor(options: {\n maxFailures?: number;\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n }) {\n this.maxFailures = options.maxFailures ?? 3;\n this.logger = options.logger;\n this.telemetry = options.telemetry;\n }\n\n /**\n * Record a reload failure\n *\n * @returns true if threshold exceeded, false otherwise\n */\n recordFailure(): boolean {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.failures >= this.maxFailures) {\n if (this.logger) {\n this.logger.warn(\n `${this.failures} consecutive config reload failures - check config source`,\n {\n failure_count: this.failures,\n threshold: this.maxFailures,\n },\n );\n }\n\n if (this.telemetry) {\n this.telemetry.emit(\"fulmen.signal.config_reload_threshold_exceeded\", {\n failure_count: String(this.failures),\n threshold: String(this.maxFailures),\n });\n }\n\n return true; // Threshold exceeded\n }\n\n return false;\n }\n\n /**\n * Record a successful reload (resets counter)\n */\n recordSuccess(): void {\n this.failures = 0;\n this.lastFailureTime = null;\n }\n\n /**\n * Get current failure count\n */\n getFailureCount(): number {\n return this.failures;\n }\n\n /**\n * Get last failure timestamp\n */\n getLastFailureTime(): number | null {\n return this.lastFailureTime;\n }\n}\n","/**\n * TSFulmen Signals Module\n *\n * Cross-platform signal handling with Fulmen ecosystem standards.\n * Provides catalog access, handler registration, and platform-aware fallbacks.\n */\n\n// Capability exports\nexport {\n getPlatform,\n getPlatformCapabilities,\n getSignalNumber,\n getWindowsEvent,\n isPOSIX,\n isWindows,\n type Platform,\n type PlatformCapabilities,\n supportsSignal,\n supportsSignalExitCodes,\n} from \"./capabilities.js\";\n// Catalog exports\nexport {\n getBehavior,\n getSignal,\n getSignalCatalog,\n getSignalsVersion,\n listBehaviors,\n listSignals,\n} from \"./catalog.js\";\n// Convenience wrapper exports\nexport {\n onAnyShutdown,\n onEmergencyQuit,\n onReload,\n onShutdown,\n onUSR1,\n onUSR2,\n} from \"./convenience.js\";\n// Double-tap exports\nexport {\n createDoubleTapTracker,\n type DoubleTapConfig,\n type DoubleTapState,\n getWindowTimeRemaining,\n handleDoubleTap,\n isWithinWindow,\n resetDoubleTap,\n} from \"./double-tap.js\";\n// Guard exports\nexport {\n ensurePOSIX,\n ensureSignalExitCodesSupported,\n ensureSupported,\n ensureWindows,\n type GuardOptions,\n} from \"./guards.js\";\n// HTTP helper exports\nexport {\n type AuthHook,\n type AuthResult,\n createBearerTokenAuth,\n createSignalEndpoint,\n createSimpleRateLimiter,\n type RateLimitHook,\n type RateLimitResult,\n type SignalEndpointOptions,\n type SignalErrorResponse,\n type SignalRequest,\n type SignalResponse,\n} from \"./http-helper.js\";\n// Manager exports\nexport {\n createSignalManager,\n type HandlerOptions,\n type SignalHandler,\n SignalManager,\n type SignalManagerOptions,\n type TimeoutBehavior,\n} from \"./manager.js\";\n\n// Config reload exports\nexport {\n type ConfigLoader,\n type ConfigReloadOptions,\n type ConfigReloadResult,\n ConfigReloadTracker,\n type ConfigValidationResult,\n type ConfigValidator,\n createConfigReloadHandler,\n} from \"./reload.js\";\n// Type exports\nexport type {\n Behavior,\n BehaviorInfo,\n BehaviorPhase,\n ExitCodes,\n LogLevel,\n OsMappings,\n PlatformOverrides,\n PlatformSupport,\n PlatformSupportLevel,\n Signal,\n SignalBehavior,\n SignalCatalog,\n SignalInfo,\n WindowsFallback,\n WindowsFallbackBehavior,\n} from \"./types.js\";\n// Windows fallback exports\nexport {\n type FallbackLogger,\n getFallbackMetadata,\n getHttpFallbackGuidance,\n handleWindowsFallback,\n requiresFallback,\n type TelemetryEmitter,\n type WindowsFallbackOptions,\n type WindowsFallbackResult,\n} from \"./windows.js\";\n","/**\n * Distance calculation with multiple metric support.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0 with WASM-backed metrics.\n *\n * @module foundry/similarity/distance\n */\n\nimport {\n damerau_levenshtein,\n jaro_winkler,\n levenshtein,\n osa_distance,\n substringSimilarity,\n} from \"@3leaps/string-metrics-wasm\";\nimport type { MetricType } from \"./types.js\";\n\n/**\n * Calculate edit distance between two strings using specified metric.\n *\n * @param a - First string\n * @param b - Second string\n * @param metric - Distance metric (default: \"levenshtein\")\n * @returns Edit distance as non-negative integer (or similarity score for jaro_winkler/substring)\n *\n * @example\n * distance(\"kitten\", \"sitting\") // 3\n * distance(\"abcd\", \"abdc\", \"damerau_osa\") // 1\n * distance(\"CA\", \"ABC\", \"damerau_unrestricted\") // 2\n * distance(\"hello world\", \"world\", \"substring\") // 0.625 (as score, not distance)\n */\nexport function distance(a: string, b: string, metric: MetricType = \"levenshtein\"): number {\n switch (metric) {\n case \"levenshtein\":\n return levenshtein(a, b);\n case \"damerau_osa\":\n return osa_distance(a, b);\n case \"damerau_unrestricted\":\n return damerau_levenshtein(a, b);\n case \"jaro_winkler\":\n return jaro_winkler(a, b);\n case \"substring\":\n // Returns similarity score (not distance) with longest common substring\n return substringSimilarity(a, b).score;\n default:\n throw new Error(\n `Invalid metric '${metric}': must be one of: levenshtein, damerau_osa, damerau_unrestricted, jaro_winkler, substring`,\n );\n }\n}\n","import { FoundryCatalogError } from \"../errors.js\";\n\nexport class SimilarityError extends FoundryCatalogError {\n constructor(message: string, cause?: Error) {\n super(message, \"similarity\", cause);\n this.name = \"SimilarityError\";\n }\n}\n","/**\n * Unicode-aware text normalization utilities.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0 with normalization presets.\n *\n * @module foundry/similarity/normalization\n */\n\nimport {\n type NormalizationLocale,\n type NormalizationPreset as WasmNormalizationPreset,\n normalize as wasmNormalize,\n} from \"@3leaps/string-metrics-wasm\";\nimport type { NormalizationPreset, NormalizeOptions } from \"./types.js\";\n\nfunction toNormalizationLocale(locale?: string): NormalizationLocale | undefined {\n if (!locale) {\n return undefined;\n }\n\n if (locale === \"tr\" || locale === \"az\" || locale === \"lt\") {\n return locale;\n }\n\n return undefined;\n}\n\n/**\n * Apply normalization preset to text.\n *\n * @param value - Text to normalize\n * @param preset - Normalization preset (\"none\" | \"minimal\" | \"default\" | \"aggressive\")\n * @param locale - Optional locale for locale-aware casefolding (e.g., \"tr\" for Turkish)\n * @returns Normalized text\n *\n * @example\n * normalize(\" Café-Zürich! \", \"aggressive\") // \"cafezurich\"\n * normalize(\" Hello \", \"minimal\") // \"Hello\"\n * normalize(\"İstanbul\", \"default\", \"tr\") // \"istanbul\"\n */\nexport function normalize(\n value: string,\n preset: NormalizationPreset | NormalizeOptions = \"default\",\n locale?: string,\n): string {\n // Handle legacy NormalizeOptions interface for backward compatibility\n if (typeof preset === \"object\") {\n // Map old options to preset and extract locale\n const targetPreset = preset.stripAccents ? \"aggressive\" : \"default\";\n const targetLocale = toNormalizationLocale(preset.locale ?? locale);\n return wasmNormalize(value, targetPreset, targetLocale);\n }\n\n return wasmNormalize(value, preset as WasmNormalizationPreset, toNormalizationLocale(locale));\n}\n\n/**\n * Unicode-aware case folding.\n *\n * @param value - Text to casefold\n * @param locale - Optional locale (e.g., \"tr\" for Turkish)\n * @returns Lowercase text\n */\nexport function casefold(value: string, locale?: string): string {\n if (locale === \"tr\") {\n return value.toLocaleLowerCase(\"tr-TR\");\n }\n return value.toLowerCase();\n}\n\n/**\n * Strip diacritical marks from text.\n *\n * @param value - Text to process\n * @returns Text with accents removed\n */\nexport function stripAccents(value: string): string {\n return value.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\n}\n\n/**\n * Compare strings ignoring case and optionally accents.\n *\n * @param a - First string\n * @param b - Second string\n * @param options - Normalization options\n * @returns True if strings are equal after normalization\n */\nexport function equalsIgnoreCase(a: string, b: string, options?: NormalizeOptions): boolean {\n return normalize(a, options) === normalize(b, options);\n}\n","/**\n * Normalized similarity score with metric selection.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0.\n *\n * @module foundry/similarity/score\n */\n\nimport {\n type SimilarityMetric,\n substringSimilarity,\n score as wasmScore,\n} from \"@3leaps/string-metrics-wasm\";\nimport type { MetricType } from \"./types.js\";\n\n/**\n * Calculate normalized similarity score between two strings.\n *\n * Returns a value between 0.0 (completely different) and 1.0 (identical).\n * For distance-based metrics: 1 - distance / max(len(a), len(b))\n * For jaro_winkler and substring: direct similarity score\n *\n * @param a - First string\n * @param b - Second string\n * @param metric - Similarity metric (default: \"levenshtein\")\n * @returns Similarity score in range [0.0, 1.0]\n *\n * @example\n * score(\"kitten\", \"sitting\") // 0.5714...\n * score(\"hello\", \"hallo\", \"jaro_winkler\") // 0.88\n * score(\"hello world\", \"world\", \"substring\") // 0.625\n */\nexport function score(a: string, b: string, metric: MetricType = \"levenshtein\"): number {\n // Special case: substring uses different API to get proper longest common substring\n if (metric === \"substring\") {\n return substringSimilarity(a, b).score;\n }\n\n // All other metrics supported directly by WASM score function\n return wasmScore(a, b, metric as SimilarityMetric);\n}\n","/**\n * Suggestion API with fuzzy matching and configurable metrics.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0.\n *\n * @module foundry/similarity/suggest\n */\n\nimport { type SuggestMetric, suggest as wasmSuggest } from \"@3leaps/string-metrics-wasm\";\nimport type { Suggestion, SuggestOptions } from \"./types.js\";\n\nconst DEFAULT_MIN_SCORE = 0.6;\nconst DEFAULT_MAX_SUGGESTIONS = 3;\nconst DEFAULT_METRIC = \"levenshtein\";\nconst DEFAULT_NORMALIZE_PRESET = \"default\";\n\n/**\n * Generate ranked suggestions from candidate list based on similarity.\n *\n * @param input - Input string to match against\n * @param candidates - List of candidate strings\n * @param options - Suggestion options (metric, thresholds, normalization)\n * @returns Array of suggestions sorted by score (descending)\n *\n * @example\n * suggest(\"docscrib\", [\"docscribe\", \"crucible\"], { metric: \"levenshtein\" })\n * // [{ value: \"docscribe\", score: 0.889, ... }]\n */\nexport function suggest(\n input: string,\n candidates: readonly string[],\n options?: SuggestOptions,\n): Suggestion[] {\n const metric = options?.metric ?? DEFAULT_METRIC;\n const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;\n const maxSuggestions = options?.maxSuggestions ?? DEFAULT_MAX_SUGGESTIONS;\n\n // Handle legacy 'normalize' boolean option\n let normalizePreset = options?.normalizePreset ?? DEFAULT_NORMALIZE_PRESET;\n if (options?.normalize === false) {\n normalizePreset = \"none\";\n } else if (options?.normalize === true && !options?.normalizePreset) {\n normalizePreset = \"default\";\n }\n\n // Pass metric name directly to WASM library (it handles \"substring\" correctly)\n const wasmOptions = {\n metric: metric as SuggestMetric,\n normalizePreset,\n minScore,\n maxSuggestions,\n preferPrefix: options?.preferPrefix,\n jaroPrefixScale: options?.jaroPrefixScale,\n jaroMaxPrefix: options?.jaroMaxPrefix,\n };\n\n const results = wasmSuggest(input, candidates as string[], wasmOptions);\n\n // Map WASM results to our Suggestion interface\n return results.map((r) => ({\n value: r.value,\n score: r.score,\n matchedRange: r.matchedRange as [number, number] | undefined,\n reason: r.reason,\n normalizedValue: r.normalizedValue,\n }));\n}\n","/**\n * Foundry similarity module - Text similarity and normalization utilities\n *\n * Implements the Crucible Foundry Text Similarity & Normalization Standard v2.0.0 (2025.10.3).\n *\n * @module foundry/similarity\n */\n\nexport const VERSION = \"2.0.0\";\n\nexport { distance } from \"./distance.js\";\nexport { SimilarityError } from \"./errors.js\";\nexport {\n casefold,\n equalsIgnoreCase,\n normalize,\n stripAccents,\n} from \"./normalization.js\";\nexport { score } from \"./score.js\";\nexport { suggest } from \"./suggest.js\";\n\nexport type {\n MetricType,\n NormalizationPreset,\n NormalizeOptions,\n Suggestion,\n SuggestOptions,\n} from \"./types.js\";\n","/**\n * Foundry module - Main exports\n *\n * Provides ergonomic access to Crucible Foundry Pattern Catalog data including\n * patterns, HTTP status codes, MIME types, and country codes with Bun-first\n * implementation and comprehensive TypeScript support.\n */\n\nexport const VERSION = \"0.1.1\";\n\n// Country Code catalog exports\nexport {\n clearCountryCodeCache,\n getCountryByAlpha2,\n getCountryByAlpha3,\n getCountryByNumeric,\n listCountries,\n} from \"./country-codes.js\";\n// Detection options type export\nexport type { DetectionOptions } from \"./detector.js\";\n// Export error classes\nexport { FoundryCatalogError } from \"./errors.js\";\n// Exit Codes catalog and helpers\nexport {\n EXIT_CODES_VERSION,\n type ExitCode,\n type ExitCodeInfo,\n type ExitCodeName,\n exitCodeMetadata,\n exitCodes,\n getExitCodeInfo,\n getPlatform,\n getPlatformCapabilities,\n getSimplifiedCodeDescription,\n getSimplifiedCodes,\n isPOSIX,\n isWindows,\n mapExitCodeToSimplified,\n type PlatformCapabilities,\n SimplifiedMode,\n supportsSignalExitCodes,\n} from \"./exit-codes/index.js\";\n// HTTP Status catalog exports\nexport {\n clearHttpStatusCache,\n getHttpStatus,\n getStatusReason,\n isClientError,\n isInformational,\n isRedirection,\n isServerError,\n isSuccess,\n listHttpStatuses,\n} from \"./http-statuses.js\";\n// Export loader functions\nexport {\n loadAllCatalogs,\n loadCountryCodeCatalog,\n loadHttpStatusCatalog,\n loadMimeTypeCatalog,\n loadPatternCatalog,\n} from \"./loader.js\";\n// MIME Type catalog exports\nexport {\n clearMimeTypeCache,\n detectMimeType,\n detectMimeTypeFromBuffer,\n detectMimeTypeFromFile,\n detectMimeTypeFromStream,\n getMimeType,\n getMimeTypeByExtension,\n isSupportedMimeType,\n listMimeTypes,\n matchMagicNumber,\n} from \"./mime-types.js\";\n// Pattern catalog exports\nexport {\n clearPatternCache,\n describePattern,\n getPattern,\n getPatternRegex,\n listPatterns,\n matchPattern,\n} from \"./patterns.js\";\n// Signal catalog and module exports\nexport {\n // Types\n type AuthHook,\n type AuthResult,\n type Behavior,\n type BehaviorInfo,\n type BehaviorPhase,\n type ConfigLoader,\n type ConfigReloadOptions,\n type ConfigReloadResult,\n // Config reload\n ConfigReloadTracker,\n type ConfigValidationResult,\n type ConfigValidator,\n // HTTP helper\n createBearerTokenAuth,\n createConfigReloadHandler,\n // Double-tap\n createDoubleTapTracker,\n createSignalEndpoint,\n // Manager\n createSignalManager,\n createSimpleRateLimiter,\n type DoubleTapConfig,\n type DoubleTapState,\n type ExitCodes,\n // Guards\n ensurePOSIX,\n ensureSignalExitCodesSupported,\n ensureSupported,\n ensureWindows,\n type FallbackLogger,\n type GuardOptions,\n // Catalog\n getBehavior,\n // Windows fallback\n getFallbackMetadata,\n getHttpFallbackGuidance,\n // Capabilities\n getPlatformCapabilities as getSignalPlatformCapabilities,\n getSignal,\n getSignalCatalog,\n getSignalNumber,\n getSignalsVersion,\n getWindowsEvent,\n getWindowTimeRemaining,\n type HandlerOptions,\n handleDoubleTap,\n handleWindowsFallback,\n isPOSIX as isSignalPOSIX,\n isWindows as isSignalWindows,\n isWithinWindow,\n type LogLevel,\n listBehaviors,\n listSignals,\n type OsMappings,\n // Convenience wrappers\n onAnyShutdown,\n onEmergencyQuit,\n onReload,\n onShutdown,\n onUSR1,\n onUSR2,\n type Platform,\n type PlatformCapabilities as SignalPlatformCapabilities,\n type PlatformOverrides,\n type PlatformSupport,\n type PlatformSupportLevel,\n type RateLimitHook,\n type RateLimitResult,\n requiresFallback,\n resetDoubleTap,\n type Signal,\n type SignalBehavior,\n type SignalCatalog,\n type SignalEndpointOptions,\n type SignalErrorResponse,\n type SignalHandler,\n type SignalInfo,\n SignalManager,\n type SignalManagerOptions,\n type SignalRequest,\n type SignalResponse,\n supportsSignal,\n supportsSignalExitCodes as supportsSignalBasedExitCodes,\n type TelemetryEmitter,\n type TimeoutBehavior,\n type WindowsFallback,\n type WindowsFallbackBehavior,\n type WindowsFallbackOptions,\n type WindowsFallbackResult,\n} from \"./signals/index.js\";\nexport type {\n NormalizeOptions,\n Suggestion,\n SuggestOptions,\n} from \"./similarity/index.js\";\n// Similarity utilities exports\nexport {\n casefold,\n distance,\n equalsIgnoreCase,\n normalize,\n score,\n stripAccents,\n suggest,\n} from \"./similarity/index.js\";\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 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","/**\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 * 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 * 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 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 */\nexport { getCachedIdentity };\n\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport { clearIdentityCache };\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// Main entry point when run directly\nif (import.meta.url === `file://${process.argv[1]}`) {\n const program = createCLI();\n program.parse(process.argv);\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\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 * 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","'use strict';\n\nexports.getValueAsString = function getValueString(value) {\n\tif (Number.isNaN(value)) {\n\t\treturn 'Nan';\n\t} else if (!Number.isFinite(value)) {\n\t\tif (value < 0) {\n\t\t\treturn '-Inf';\n\t\t} else {\n\t\t\treturn '+Inf';\n\t\t}\n\t} else {\n\t\treturn `${value}`;\n\t}\n};\n\nexports.removeLabels = function removeLabels(\n\thashMap,\n\tlabels,\n\tsortedLabelNames,\n) {\n\tconst hash = hashObject(labels, sortedLabelNames);\n\tdelete hashMap[hash];\n};\n\nexports.setValue = function setValue(hashMap, value, labels) {\n\tconst hash = hashObject(labels);\n\thashMap[hash] = {\n\t\tvalue: typeof value === 'number' ? value : 0,\n\t\tlabels: labels || {},\n\t};\n\treturn hashMap;\n};\n\nexports.setValueDelta = function setValueDelta(\n\thashMap,\n\tdeltaValue,\n\tlabels,\n\thash = '',\n) {\n\tconst value = typeof deltaValue === 'number' ? deltaValue : 0;\n\tif (hashMap[hash]) {\n\t\thashMap[hash].value += value;\n\t} else {\n\t\thashMap[hash] = { value, labels };\n\t}\n\treturn hashMap;\n};\n\nexports.getLabels = function (labelNames, args) {\n\tif (typeof args[0] === 'object') {\n\t\treturn args[0];\n\t}\n\n\tif (labelNames.length !== args.length) {\n\t\tthrow new Error(\n\t\t\t`Invalid number of arguments (${args.length}): \"${args.join(\n\t\t\t\t', ',\n\t\t\t)}\" for label names (${labelNames.length}): \"${labelNames.join(', ')}\".`,\n\t\t);\n\t}\n\n\tconst acc = {};\n\tfor (let i = 0; i < labelNames.length; i++) {\n\t\tacc[labelNames[i]] = args[i];\n\t}\n\treturn acc;\n};\n\nfunction fastHashObject(keys, labels) {\n\tif (keys.length === 0) {\n\t\treturn '';\n\t}\n\n\tlet hash = '';\n\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tconst value = labels[key];\n\t\tif (value === undefined) continue;\n\n\t\thash += `${key}:${value},`;\n\t}\n\n\treturn hash;\n}\n\nfunction hashObject(labels, labelNames) {\n\t// We don't actually need a hash here. We just need a string that\n\t// is unique for each possible labels object and consistent across\n\t// calls with equivalent labels objects.\n\n\tif (labelNames) {\n\t\treturn fastHashObject(labelNames, labels);\n\t}\n\n\tconst keys = Object.keys(labels);\n\tif (keys.length > 1) {\n\t\tkeys.sort(); // need consistency across calls\n\t}\n\n\treturn fastHashObject(keys, labels);\n}\nexports.hashObject = hashObject;\n\nexports.isObject = function isObject(obj) {\n\treturn obj !== null && typeof obj === 'object';\n};\n\nexports.nowTimestamp = function nowTimestamp() {\n\treturn Date.now() / 1000;\n};\n\nclass Grouper extends Map {\n\t/**\n\t * Adds the `value` to the `key`'s array of values.\n\t * @param {*} key Key to set.\n\t * @param {*} value Value to add to `key`'s array.\n\t * @returns {undefined} undefined.\n\t */\n\tadd(key, value) {\n\t\tif (this.has(key)) {\n\t\t\tthis.get(key).push(value);\n\t\t} else {\n\t\t\tthis.set(key, [value]);\n\t\t}\n\t}\n}\n\nexports.Grouper = Grouper;\n","'use strict';\n\nconst { getValueAsString } = require('./util');\n\nclass Registry {\n\tstatic get PROMETHEUS_CONTENT_TYPE() {\n\t\treturn 'text/plain; version=0.0.4; charset=utf-8';\n\t}\n\n\tstatic get OPENMETRICS_CONTENT_TYPE() {\n\t\treturn 'application/openmetrics-text; version=1.0.0; charset=utf-8';\n\t}\n\n\tconstructor(regContentType = Registry.PROMETHEUS_CONTENT_TYPE) {\n\t\tthis._metrics = {};\n\t\tthis._collectors = [];\n\t\tthis._defaultLabels = {};\n\t\tif (\n\t\t\tregContentType !== Registry.PROMETHEUS_CONTENT_TYPE &&\n\t\t\tregContentType !== Registry.OPENMETRICS_CONTENT_TYPE\n\t\t) {\n\t\t\tthrow new TypeError(`Content type ${regContentType} is unsupported`);\n\t\t}\n\t\tthis._contentType = regContentType;\n\t}\n\n\tgetMetricsAsArray() {\n\t\treturn Object.values(this._metrics);\n\t}\n\n\tasync getMetricsAsString(metrics) {\n\t\tconst metric =\n\t\t\ttypeof metrics.getForPromString === 'function'\n\t\t\t\t? await metrics.getForPromString()\n\t\t\t\t: await metrics.get();\n\n\t\tconst name = escapeString(metric.name);\n\t\tconst help = `# HELP ${name} ${escapeString(metric.help)}`;\n\t\tconst type = `# TYPE ${name} ${metric.type}`;\n\t\tconst values = [help, type];\n\n\t\tconst defaultLabels =\n\t\t\tObject.keys(this._defaultLabels).length > 0 ? this._defaultLabels : null;\n\n\t\tconst isOpenMetrics =\n\t\t\tthis.contentType === Registry.OPENMETRICS_CONTENT_TYPE;\n\n\t\tfor (const val of metric.values || []) {\n\t\t\tlet { metricName = name, labels = {} } = val;\n\t\t\tconst { sharedLabels = {} } = val;\n\t\t\tif (isOpenMetrics && metric.type === 'counter') {\n\t\t\t\tmetricName = `${metricName}_total`;\n\t\t\t}\n\n\t\t\tif (defaultLabels) {\n\t\t\t\tlabels = { ...labels, ...defaultLabels, ...labels };\n\t\t\t}\n\n\t\t\t// We have to flatten these separately to avoid duplicate labels appearing\n\t\t\t// between the base labels and the shared labels\n\t\t\tconst formattedLabels = formatLabels(labels, sharedLabels);\n\n\t\t\tconst flattenedShared = flattenSharedLabels(sharedLabels);\n\t\t\tconst labelParts = [...formattedLabels, flattenedShared].filter(Boolean);\n\t\t\tconst labelsString = labelParts.length ? `{${labelParts.join(',')}}` : '';\n\t\t\tlet fullMetricLine = `${metricName}${labelsString} ${getValueAsString(\n\t\t\t\tval.value,\n\t\t\t)}`;\n\n\t\t\tconst { exemplar } = val;\n\t\t\tif (exemplar && isOpenMetrics) {\n\t\t\t\tconst formattedExemplars = formatLabels(exemplar.labelSet);\n\t\t\t\tfullMetricLine += ` # {${formattedExemplars.join(\n\t\t\t\t\t',',\n\t\t\t\t)}} ${getValueAsString(exemplar.value)} ${exemplar.timestamp}`;\n\t\t\t}\n\t\t\tvalues.push(fullMetricLine);\n\t\t}\n\n\t\treturn values.join('\\n');\n\t}\n\n\tasync metrics() {\n\t\tconst isOpenMetrics =\n\t\t\tthis.contentType === Registry.OPENMETRICS_CONTENT_TYPE;\n\n\t\tconst promises = this.getMetricsAsArray().map(metric => {\n\t\t\tif (isOpenMetrics && metric.type === 'counter') {\n\t\t\t\tmetric.name = standardizeCounterName(metric.name);\n\t\t\t}\n\t\t\treturn this.getMetricsAsString(metric);\n\t\t});\n\n\t\tconst resolves = await Promise.all(promises);\n\n\t\treturn isOpenMetrics\n\t\t\t? `${resolves.join('\\n')}\\n# EOF\\n`\n\t\t\t: `${resolves.join('\\n\\n')}\\n`;\n\t}\n\n\tregisterMetric(metric) {\n\t\tif (this._metrics[metric.name] && this._metrics[metric.name] !== metric) {\n\t\t\tthrow new Error(\n\t\t\t\t`A metric with the name ${metric.name} has already been registered.`,\n\t\t\t);\n\t\t}\n\n\t\tthis._metrics[metric.name] = metric;\n\t}\n\n\tclear() {\n\t\tthis._metrics = {};\n\t\tthis._defaultLabels = {};\n\t}\n\n\tasync getMetricsAsJSON() {\n\t\tconst metrics = [];\n\t\tconst defaultLabelNames = Object.keys(this._defaultLabels);\n\n\t\tconst promises = [];\n\n\t\tfor (const metric of this.getMetricsAsArray()) {\n\t\t\tpromises.push(metric.get());\n\t\t}\n\n\t\tconst resolves = await Promise.all(promises);\n\n\t\tfor (const item of resolves) {\n\t\t\tif (item.values && defaultLabelNames.length > 0) {\n\t\t\t\tfor (const val of item.values) {\n\t\t\t\t\t// Make a copy before mutating\n\t\t\t\t\tval.labels = Object.assign({}, val.labels);\n\n\t\t\t\t\tfor (const labelName of defaultLabelNames) {\n\t\t\t\t\t\tval.labels[labelName] =\n\t\t\t\t\t\t\tval.labels[labelName] || this._defaultLabels[labelName];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmetrics.push(item);\n\t\t}\n\n\t\treturn metrics;\n\t}\n\n\tremoveSingleMetric(name) {\n\t\tdelete this._metrics[name];\n\t}\n\n\tgetSingleMetricAsString(name) {\n\t\treturn this.getMetricsAsString(this._metrics[name]);\n\t}\n\n\tgetSingleMetric(name) {\n\t\treturn this._metrics[name];\n\t}\n\n\tsetDefaultLabels(labels) {\n\t\tthis._defaultLabels = labels;\n\t}\n\n\tresetMetrics() {\n\t\tfor (const metric in this._metrics) {\n\t\t\tthis._metrics[metric].reset();\n\t\t}\n\t}\n\n\tget contentType() {\n\t\treturn this._contentType;\n\t}\n\n\tsetContentType(metricsContentType) {\n\t\tif (\n\t\t\tmetricsContentType === Registry.OPENMETRICS_CONTENT_TYPE ||\n\t\t\tmetricsContentType === Registry.PROMETHEUS_CONTENT_TYPE\n\t\t) {\n\t\t\tthis._contentType = metricsContentType;\n\t\t} else {\n\t\t\tthrow new Error(`Content type ${metricsContentType} is unsupported`);\n\t\t}\n\t}\n\n\tstatic merge(registers) {\n\t\tconst regType = registers[0].contentType;\n\t\tfor (const reg of registers) {\n\t\t\tif (reg.contentType !== regType) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Registers can only be merged if they have the same content type',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst mergedRegistry = new Registry(regType);\n\n\t\tconst metricsToMerge = registers.reduce(\n\t\t\t(acc, reg) => acc.concat(reg.getMetricsAsArray()),\n\t\t\t[],\n\t\t);\n\n\t\tmetricsToMerge.forEach(mergedRegistry.registerMetric, mergedRegistry);\n\t\treturn mergedRegistry;\n\t}\n}\n\nfunction formatLabels(labels, exclude) {\n\tconst { hasOwnProperty } = Object.prototype;\n\tconst formatted = [];\n\tfor (const [name, value] of Object.entries(labels)) {\n\t\tif (!exclude || !hasOwnProperty.call(exclude, name)) {\n\t\t\tformatted.push(`${name}=\"${escapeLabelValue(value)}\"`);\n\t\t}\n\t}\n\treturn formatted;\n}\n\nconst sharedLabelCache = new WeakMap();\nfunction flattenSharedLabels(labels) {\n\tconst cached = sharedLabelCache.get(labels);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst formattedLabels = formatLabels(labels);\n\tconst flattened = formattedLabels.join(',');\n\tsharedLabelCache.set(labels, flattened);\n\treturn flattened;\n}\nfunction escapeLabelValue(str) {\n\tif (typeof str !== 'string') {\n\t\treturn str;\n\t}\n\treturn escapeString(str).replace(/\"/g, '\\\\\"');\n}\nfunction escapeString(str) {\n\treturn str.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n');\n}\nfunction standardizeCounterName(name) {\n\treturn name.replace(/_total$/, '');\n}\n\nmodule.exports = Registry;\nmodule.exports.globalRegistry = new Registry();\n","'use strict';\n\nconst util = require('util');\n\n// These are from https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels\nconst metricRegexp = /^[a-zA-Z_:][a-zA-Z0-9_:]*$/;\nconst labelRegexp = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\nexports.validateMetricName = function (name) {\n\treturn metricRegexp.test(name);\n};\n\nexports.validateLabelName = function (names = []) {\n\treturn names.every(name => labelRegexp.test(name));\n};\n\nexports.validateLabel = function validateLabel(savedLabels, labels) {\n\tfor (const label in labels) {\n\t\tif (!savedLabels.includes(label)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Added label \"${label}\" is not included in initial labelset: ${util.inspect(\n\t\t\t\t\tsavedLabels,\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\t}\n};\n","'use strict';\n\nconst Registry = require('./registry');\nconst { isObject } = require('./util');\nconst { validateMetricName, validateLabelName } = require('./validation');\n\n/**\n * @abstract\n */\nclass Metric {\n\tconstructor(config, defaults = {}) {\n\t\tif (!isObject(config)) {\n\t\t\tthrow new TypeError('constructor expected a config object');\n\t\t}\n\t\tObject.assign(\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tlabelNames: [],\n\t\t\t\tregisters: [Registry.globalRegistry],\n\t\t\t\taggregator: 'sum',\n\t\t\t\tenableExemplars: false,\n\t\t\t},\n\t\t\tdefaults,\n\t\t\tconfig,\n\t\t);\n\t\tif (!this.registers) {\n\t\t\t// in case config.registers is `undefined`\n\t\t\tthis.registers = [Registry.globalRegistry];\n\t\t}\n\t\tif (!this.help) {\n\t\t\tthrow new Error('Missing mandatory help parameter');\n\t\t}\n\t\tif (!this.name) {\n\t\t\tthrow new Error('Missing mandatory name parameter');\n\t\t}\n\t\tif (!validateMetricName(this.name)) {\n\t\t\tthrow new Error('Invalid metric name');\n\t\t}\n\t\tif (!validateLabelName(this.labelNames)) {\n\t\t\tthrow new Error('Invalid label name');\n\t\t}\n\n\t\tif (this.collect && typeof this.collect !== 'function') {\n\t\t\tthrow new Error('Optional \"collect\" parameter must be a function');\n\t\t}\n\n\t\tif (this.labelNames) {\n\t\t\tthis.sortedLabelNames = [...this.labelNames].sort();\n\t\t} else {\n\t\t\tthis.sortedLabelNames = [];\n\t\t}\n\n\t\tthis.reset();\n\n\t\tfor (const register of this.registers) {\n\t\t\tif (\n\t\t\t\tthis.enableExemplars &&\n\t\t\t\tregister.contentType === Registry.PROMETHEUS_CONTENT_TYPE\n\t\t\t) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t'Exemplars are supported only on OpenMetrics registries',\n\t\t\t\t);\n\t\t\t}\n\t\t\tregister.registerMetric(this);\n\t\t}\n\t}\n\n\treset() {\n\t\t/* abstract */\n\t}\n}\n\nmodule.exports = { Metric };\n","'use strict';\n\n/**\n * Class representing an OpenMetrics exemplar.\n *\n * @property {object} labelSet\n * @property {number} value\n * @property {number} [timestamp]\n * */\nclass Exemplar {\n\tconstructor(labelSet = {}, value = null) {\n\t\tthis.labelSet = labelSet;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Validation for the label set format.\n\t * https://github.com/OpenObservability/OpenMetrics/blob/d99b705f611b75fec8f450b05e344e02eea6921d/specification/OpenMetrics.md#exemplars\n\t *\n\t * @param {object} labelSet - Exemplar labels.\n\t * @throws {RangeError}\n\t * @return {void}\n\t */\n\tvalidateExemplarLabelSet(labelSet) {\n\t\tlet res = '';\n\t\tfor (const [labelName, labelValue] of Object.entries(labelSet)) {\n\t\t\tres += `${labelName}${labelValue}`;\n\t\t}\n\t\tif (res.length > 128) {\n\t\t\tthrow new RangeError(\n\t\t\t\t'Label set size must be smaller than 128 UTF-8 chars',\n\t\t\t);\n\t\t}\n\t}\n}\n\nmodule.exports = Exemplar;\n","/**\n * Counter metric\n */\n'use strict';\n\nconst util = require('util');\nconst {\n\thashObject,\n\tisObject,\n\tgetLabels,\n\tremoveLabels,\n\tnowTimestamp,\n} = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\nconst Exemplar = require('./exemplar');\n\nclass Counter extends Metric {\n\tconstructor(config) {\n\t\tsuper(config);\n\t\tthis.type = 'counter';\n\t\tthis.defaultLabels = {};\n\t\tthis.defaultValue = 1;\n\t\tthis.defaultExemplarLabelSet = {};\n\t\tif (config.enableExemplars) {\n\t\t\tthis.enableExemplars = true;\n\t\t\tthis.inc = this.incWithExemplar;\n\t\t} else {\n\t\t\tthis.inc = this.incWithoutExemplar;\n\t\t}\n\t}\n\n\t/**\n\t * Increment counter\n\t * @param {object} labels - What label you want to be incremented\n\t * @param {Number} value - Value to increment, if omitted increment with 1\n\t * @returns {object} results - object with information about the inc operation\n\t * @returns {string} results.labelHash - hash representation of the labels\n\t */\n\tincWithoutExemplar(labels, value) {\n\t\tlet hash = '';\n\t\tif (isObject(labels)) {\n\t\t\thash = hashObject(labels, this.sortedLabelNames);\n\t\t\tvalidateLabel(this.labelNames, labels);\n\t\t} else {\n\t\t\tvalue = labels;\n\t\t\tlabels = {};\n\t\t}\n\n\t\tif (value && !Number.isFinite(value)) {\n\t\t\tthrow new TypeError(`Value is not a valid number: ${util.format(value)}`);\n\t\t}\n\t\tif (value < 0) {\n\t\t\tthrow new Error('It is not possible to decrease a counter');\n\t\t}\n\n\t\tif (value === null || value === undefined) value = 1;\n\n\t\tsetValue(this.hashMap, value, labels, hash);\n\n\t\treturn { labelHash: hash };\n\t}\n\n\t/**\n\t * Increment counter with exemplar, same as inc but accepts labels for an\n\t * exemplar.\n\t * If no label is provided the current exemplar labels are kept unchanged\n\t * (defaults to empty set).\n\t *\n\t * @param {object} incOpts - Object with options about what metric to increase\n\t * @param {object} incOpts.labels - What label you want to be incremented,\n\t * defaults to null (metric with no labels)\n\t * @param {Number} incOpts.value - Value to increment, defaults to 1\n\t * @param {object} incOpts.exemplarLabels - Key-value labels for the\n\t * exemplar, defaults to empty set {}\n\t * @returns {void}\n\t */\n\tincWithExemplar({\n\t\tlabels = this.defaultLabels,\n\t\tvalue = this.defaultValue,\n\t\texemplarLabels = this.defaultExemplarLabelSet,\n\t} = {}) {\n\t\tconst res = this.incWithoutExemplar(labels, value);\n\t\tthis.updateExemplar(exemplarLabels, value, res.labelHash);\n\t}\n\n\tupdateExemplar(exemplarLabels, value, hash) {\n\t\tif (exemplarLabels === this.defaultExemplarLabelSet) return;\n\t\tif (!isObject(this.hashMap[hash].exemplar)) {\n\t\t\tthis.hashMap[hash].exemplar = new Exemplar();\n\t\t}\n\t\tthis.hashMap[hash].exemplar.validateExemplarLabelSet(exemplarLabels);\n\t\tthis.hashMap[hash].exemplar.labelSet = exemplarLabels;\n\t\tthis.hashMap[hash].exemplar.value = value ? value : 1;\n\t\tthis.hashMap[hash].exemplar.timestamp = nowTimestamp();\n\t}\n\n\t/**\n\t * Reset counter\n\t * @returns {void}\n\t */\n\treset() {\n\t\tthis.hashMap = {};\n\t\tif (this.labelNames.length === 0) {\n\t\t\tsetValue(this.hashMap, 0);\n\t\t}\n\t}\n\n\tasync get() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\n\t\treturn {\n\t\t\thelp: this.help,\n\t\t\tname: this.name,\n\t\t\ttype: this.type,\n\t\t\tvalues: Object.values(this.hashMap),\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args) || {};\n\t\treturn {\n\t\t\tinc: this.inc.bind(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args) || {};\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn removeLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction setValue(hashMap, value, labels = {}, hash = '') {\n\tif (hashMap[hash]) {\n\t\thashMap[hash].value += value;\n\t} else {\n\t\thashMap[hash] = { value, labels };\n\t}\n\treturn hashMap;\n}\n\nmodule.exports = Counter;\n","/**\n * Gauge metric\n */\n'use strict';\n\nconst util = require('util');\n\nconst {\n\tsetValue,\n\tsetValueDelta,\n\tgetLabels,\n\thashObject,\n\tisObject,\n\tremoveLabels,\n} = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\n\nclass Gauge extends Metric {\n\tconstructor(config) {\n\t\tsuper(config);\n\t\tthis.type = 'gauge';\n\t}\n\n\t/**\n\t * Set a gauge to a value\n\t * @param {object} labels - Object with labels and their values\n\t * @param {Number} value - Value to set the gauge to, must be positive\n\t * @returns {void}\n\t */\n\tset(labels, value) {\n\t\tvalue = getValueArg(labels, value);\n\t\tlabels = getLabelArg(labels);\n\t\tset(this, labels, value);\n\t}\n\n\t/**\n\t * Reset gauge\n\t * @returns {void}\n\t */\n\treset() {\n\t\tthis.hashMap = {};\n\t\tif (this.labelNames.length === 0) {\n\t\t\tsetValue(this.hashMap, 0, {});\n\t\t}\n\t}\n\n\t/**\n\t * Increment a gauge value\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to increment - if omitted, increment with 1\n\t * @returns {void}\n\t */\n\tinc(labels, value) {\n\t\tvalue = getValueArg(labels, value);\n\t\tlabels = getLabelArg(labels);\n\t\tif (value === undefined) value = 1;\n\t\tsetDelta(this, labels, value);\n\t}\n\n\t/**\n\t * Decrement a gauge value\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to decrement - if omitted, decrement with 1\n\t * @returns {void}\n\t */\n\tdec(labels, value) {\n\t\tvalue = getValueArg(labels, value);\n\t\tlabels = getLabelArg(labels);\n\t\tif (value === undefined) value = 1;\n\t\tsetDelta(this, labels, -value);\n\t}\n\n\t/**\n\t * Set the gauge to current unix epoch\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {void}\n\t */\n\tsetToCurrentTime(labels) {\n\t\tconst now = Date.now() / 1000;\n\t\tif (labels === undefined) {\n\t\t\tthis.set(now);\n\t\t} else {\n\t\t\tthis.set(labels, now);\n\t\t}\n\t}\n\n\t/**\n\t * Start a timer\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {function} - Invoke this function to set the duration in seconds since you started the timer.\n\t * @example\n\t * var done = gauge.startTimer();\n\t * makeXHRRequest(function(err, response) {\n\t *\tdone(); //Duration of the request will be saved\n\t * });\n\t */\n\tstartTimer(labels) {\n\t\tconst start = process.hrtime();\n\t\treturn endLabels => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.set(Object.assign({}, labels, endLabels), value);\n\t\t\treturn value;\n\t\t};\n\t}\n\n\tasync get() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\t\treturn {\n\t\t\thelp: this.help,\n\t\t\tname: this.name,\n\t\t\ttype: this.type,\n\t\t\tvalues: Object.values(this.hashMap),\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\t_getValue(labels) {\n\t\tconst hash = hashObject(labels || {}, this.sortedLabelNames);\n\t\treturn this.hashMap[hash] ? this.hashMap[hash].value : 0;\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn {\n\t\t\tinc: this.inc.bind(this, labels),\n\t\t\tdec: this.dec.bind(this, labels),\n\t\t\tset: this.set.bind(this, labels),\n\t\t\tsetToCurrentTime: this.setToCurrentTime.bind(this, labels),\n\t\t\tstartTimer: this.startTimer.bind(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tremoveLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction set(gauge, labels, value) {\n\tif (typeof value !== 'number') {\n\t\tthrow new TypeError(`Value is not a valid number: ${util.format(value)}`);\n\t}\n\n\tvalidateLabel(gauge.labelNames, labels);\n\tsetValue(gauge.hashMap, value, labels);\n}\n\nfunction setDelta(gauge, labels, delta) {\n\tif (typeof delta !== 'number') {\n\t\tthrow new TypeError(`Delta is not a valid number: ${util.format(delta)}`);\n\t}\n\n\tvalidateLabel(gauge.labelNames, labels);\n\tconst hash = hashObject(labels, gauge.sortedLabelNames);\n\tsetValueDelta(gauge.hashMap, delta, labels, hash);\n}\n\nfunction getLabelArg(labels) {\n\treturn isObject(labels) ? labels : {};\n}\n\nfunction getValueArg(labels, value) {\n\treturn isObject(labels) ? value : labels;\n}\n\nmodule.exports = Gauge;\n","/**\n * Histogram\n */\n'use strict';\n\nconst util = require('util');\nconst {\n\tgetLabels,\n\thashObject,\n\tisObject,\n\tremoveLabels,\n\tnowTimestamp,\n} = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\nconst Exemplar = require('./exemplar');\n\nclass Histogram extends Metric {\n\tconstructor(config) {\n\t\tsuper(config, {\n\t\t\tbuckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],\n\t\t});\n\n\t\tthis.type = 'histogram';\n\t\tthis.defaultLabels = {};\n\t\tthis.defaultExemplarLabelSet = {};\n\t\tthis.enableExemplars = false;\n\n\t\tfor (const label of this.labelNames) {\n\t\t\tif (label === 'le') {\n\t\t\t\tthrow new Error('le is a reserved label keyword');\n\t\t\t}\n\t\t}\n\n\t\tthis.upperBounds = this.buckets;\n\t\tthis.bucketValues = this.upperBounds.reduce((acc, upperBound) => {\n\t\t\tacc[upperBound] = 0;\n\t\t\treturn acc;\n\t\t}, {});\n\n\t\tif (config.enableExemplars) {\n\t\t\tthis.enableExemplars = true;\n\t\t\tthis.bucketExemplars = this.upperBounds.reduce((acc, upperBound) => {\n\t\t\t\tacc[upperBound] = null;\n\t\t\t\treturn acc;\n\t\t\t}, {});\n\t\t\tObject.freeze(this.bucketExemplars);\n\t\t\tthis.observe = this.observeWithExemplar;\n\t\t} else {\n\t\t\tthis.observe = this.observeWithoutExemplar;\n\t\t}\n\n\t\tObject.freeze(this.bucketValues);\n\t\tObject.freeze(this.upperBounds);\n\n\t\tif (this.labelNames.length === 0) {\n\t\t\tthis.hashMap = {\n\t\t\t\t[hashObject({})]: createBaseValues(\n\t\t\t\t\t{},\n\t\t\t\t\tthis.bucketValues,\n\t\t\t\t\tthis.bucketExemplars,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Observe a value in histogram\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to observe in the histogram\n\t * @returns {void}\n\t */\n\tobserveWithoutExemplar(labels, value) {\n\t\tobserve.call(this, labels === 0 ? 0 : labels || {})(value);\n\t}\n\n\tobserveWithExemplar({\n\t\tlabels = this.defaultLabels,\n\t\tvalue,\n\t\texemplarLabels = this.defaultExemplarLabelSet,\n\t} = {}) {\n\t\tobserve.call(this, labels === 0 ? 0 : labels || {})(value);\n\t\tthis.updateExemplar(labels, value, exemplarLabels);\n\t}\n\n\tupdateExemplar(labels, value, exemplarLabels) {\n\t\tif (Object.keys(exemplarLabels).length === 0) return;\n\t\tconst hash = hashObject(labels, this.sortedLabelNames);\n\t\tconst bound = findBound(this.upperBounds, value);\n\t\tconst { bucketExemplars } = this.hashMap[hash];\n\t\tlet exemplar = bucketExemplars[bound];\n\t\tif (!isObject(exemplar)) {\n\t\t\texemplar = new Exemplar();\n\t\t\tbucketExemplars[bound] = exemplar;\n\t\t}\n\t\texemplar.validateExemplarLabelSet(exemplarLabels);\n\t\texemplar.labelSet = exemplarLabels;\n\t\texemplar.value = value;\n\t\texemplar.timestamp = nowTimestamp();\n\t}\n\n\tasync get() {\n\t\tconst data = await this.getForPromString();\n\t\tdata.values = data.values.map(splayLabels);\n\t\treturn data;\n\t}\n\n\tasync getForPromString() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\t\tconst data = Object.values(this.hashMap);\n\t\tconst values = data\n\t\t\t.map(extractBucketValuesForExport(this))\n\t\t\t.reduce(addSumAndCountForExport(this), []);\n\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\thelp: this.help,\n\t\t\ttype: this.type,\n\t\t\tvalues,\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\treset() {\n\t\tthis.hashMap = {};\n\t}\n\n\t/**\n\t * Initialize the metrics for the given combination of labels to zero\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {void}\n\t */\n\tzero(labels) {\n\t\tconst hash = hashObject(labels, this.sortedLabelNames);\n\t\tthis.hashMap[hash] = createBaseValues(\n\t\t\tlabels,\n\t\t\tthis.bucketValues,\n\t\t\tthis.bucketExemplars,\n\t\t);\n\t}\n\n\t/**\n\t * Start a timer that could be used to logging durations\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {object} exemplarLabels - Object with labels for exemplar where key is the label key and value is label value. Can only be one level deep\n\t * @returns {function} - Function to invoke when you want to stop the timer and observe the duration in seconds\n\t * @example\n\t * var end = histogram.startTimer();\n\t * makeExpensiveXHRRequest(function(err, res) {\n\t * \tconst duration = end(); //Observe the duration of expensiveXHRRequest and returns duration in seconds\n\t * \tconsole.log('Duration', duration);\n\t * });\n\t */\n\tstartTimer(labels, exemplarLabels) {\n\t\treturn this.enableExemplars\n\t\t\t? startTimerWithExemplar.call(this, labels, exemplarLabels)()\n\t\t\t: startTimer.call(this, labels)();\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn {\n\t\t\tobserve: observe.call(this, labels),\n\t\t\tstartTimer: startTimer.call(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tremoveLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction startTimer(startLabels) {\n\treturn () => {\n\t\tconst start = process.hrtime();\n\t\treturn endLabels => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.observe(Object.assign({}, startLabels, endLabels), value);\n\t\t\treturn value;\n\t\t};\n\t};\n}\n\nfunction startTimerWithExemplar(startLabels, startExemplarLabels) {\n\treturn () => {\n\t\tconst start = process.hrtime();\n\t\treturn (endLabels, endExemplarLabels) => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.observe({\n\t\t\t\tlabels: Object.assign({}, startLabels, endLabels),\n\t\t\t\tvalue,\n\t\t\t\texemplarLabels: Object.assign(\n\t\t\t\t\t{},\n\t\t\t\t\tstartExemplarLabels,\n\t\t\t\t\tendExemplarLabels,\n\t\t\t\t),\n\t\t\t});\n\t\t\treturn value;\n\t\t};\n\t};\n}\n\nfunction setValuePair(labels, value, metricName, exemplar, sharedLabels = {}) {\n\treturn {\n\t\tlabels,\n\t\tsharedLabels,\n\t\tvalue,\n\t\tmetricName,\n\t\texemplar,\n\t};\n}\n\nfunction findBound(upperBounds, value) {\n\tfor (let i = 0; i < upperBounds.length; i++) {\n\t\tconst bound = upperBounds[i];\n\t\tif (value <= bound) {\n\t\t\treturn bound;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction observe(labels) {\n\treturn value => {\n\t\tconst labelValuePair = convertLabelsAndValues(labels, value);\n\n\t\tvalidateLabel(this.labelNames, labelValuePair.labels);\n\t\tif (!Number.isFinite(labelValuePair.value)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Value is not a valid number: ${util.format(labelValuePair.value)}`,\n\t\t\t);\n\t\t}\n\n\t\tconst hash = hashObject(labelValuePair.labels, this.sortedLabelNames);\n\t\tlet valueFromMap = this.hashMap[hash];\n\t\tif (!valueFromMap) {\n\t\t\tvalueFromMap = createBaseValues(\n\t\t\t\tlabelValuePair.labels,\n\t\t\t\tthis.bucketValues,\n\t\t\t\tthis.bucketExemplars,\n\t\t\t);\n\t\t}\n\n\t\tconst b = findBound(this.upperBounds, labelValuePair.value);\n\n\t\tvalueFromMap.sum += labelValuePair.value;\n\t\tvalueFromMap.count += 1;\n\n\t\tif (Object.prototype.hasOwnProperty.call(valueFromMap.bucketValues, b)) {\n\t\t\tvalueFromMap.bucketValues[b] += 1;\n\t\t}\n\n\t\tthis.hashMap[hash] = valueFromMap;\n\t};\n}\n\nfunction createBaseValues(labels, bucketValues, bucketExemplars) {\n\tconst result = {\n\t\tlabels,\n\t\tbucketValues: { ...bucketValues },\n\t\tsum: 0,\n\t\tcount: 0,\n\t};\n\tif (bucketExemplars) {\n\t\tresult.bucketExemplars = { ...bucketExemplars };\n\t}\n\treturn result;\n}\n\nfunction convertLabelsAndValues(labels, value) {\n\treturn isObject(labels)\n\t\t? {\n\t\t\t\tlabels,\n\t\t\t\tvalue,\n\t\t\t}\n\t\t: {\n\t\t\t\tvalue: labels,\n\t\t\t\tlabels: {},\n\t\t\t};\n}\n\nfunction extractBucketValuesForExport(histogram) {\n\tconst name = `${histogram.name}_bucket`;\n\treturn bucketData => {\n\t\tlet acc = 0;\n\t\tconst buckets = histogram.upperBounds.map(upperBound => {\n\t\t\tacc += bucketData.bucketValues[upperBound];\n\t\t\treturn setValuePair(\n\t\t\t\t{ le: upperBound },\n\t\t\t\tacc,\n\t\t\t\tname,\n\t\t\t\tbucketData.bucketExemplars\n\t\t\t\t\t? bucketData.bucketExemplars[upperBound]\n\t\t\t\t\t: null,\n\t\t\t\tbucketData.labels,\n\t\t\t);\n\t\t});\n\t\treturn { buckets, data: bucketData };\n\t};\n}\n\nfunction addSumAndCountForExport(histogram) {\n\treturn (acc, d) => {\n\t\tacc.push(...d.buckets);\n\n\t\tconst infLabel = { le: '+Inf' };\n\t\tacc.push(\n\t\t\tsetValuePair(\n\t\t\t\tinfLabel,\n\t\t\t\td.data.count,\n\t\t\t\t`${histogram.name}_bucket`,\n\t\t\t\td.data.bucketExemplars ? d.data.bucketExemplars['-1'] : null,\n\t\t\t\td.data.labels,\n\t\t\t),\n\t\t\tsetValuePair(\n\t\t\t\t{},\n\t\t\t\td.data.sum,\n\t\t\t\t`${histogram.name}_sum`,\n\t\t\t\tundefined,\n\t\t\t\td.data.labels,\n\t\t\t),\n\t\t\tsetValuePair(\n\t\t\t\t{},\n\t\t\t\td.data.count,\n\t\t\t\t`${histogram.name}_count`,\n\t\t\t\tundefined,\n\t\t\t\td.data.labels,\n\t\t\t),\n\t\t);\n\t\treturn acc;\n\t};\n}\n\nfunction splayLabels(bucket) {\n\tconst { sharedLabels, labels, ...newBucket } = bucket;\n\tfor (const label of Object.keys(sharedLabels)) {\n\t\tlabels[label] = sharedLabels[label];\n\t}\n\tnewBucket.labels = labels;\n\treturn newBucket;\n}\n\nmodule.exports = Histogram;\n","\nfunction TreeBase() {}\n\n// removes all nodes from the tree\nTreeBase.prototype.clear = function() {\n this._root = null;\n this.size = 0;\n};\n\n// returns node data if found, null otherwise\nTreeBase.prototype.find = function(data) {\n var res = this._root;\n\n while(res !== null) {\n var c = this._comparator(data, res.data);\n if(c === 0) {\n return res.data;\n }\n else {\n res = res.get_child(c > 0);\n }\n }\n\n return null;\n};\n\n// returns iterator to node if found, null otherwise\nTreeBase.prototype.findIter = function(data) {\n var res = this._root;\n var iter = this.iterator();\n\n while(res !== null) {\n var c = this._comparator(data, res.data);\n if(c === 0) {\n iter._cursor = res;\n return iter;\n }\n else {\n iter._ancestors.push(res);\n res = res.get_child(c > 0);\n }\n }\n\n return null;\n};\n\n// Returns an iterator to the tree node at or immediately after the item\nTreeBase.prototype.lowerBound = function(item) {\n var cur = this._root;\n var iter = this.iterator();\n var cmp = this._comparator;\n\n while(cur !== null) {\n var c = cmp(item, cur.data);\n if(c === 0) {\n iter._cursor = cur;\n return iter;\n }\n iter._ancestors.push(cur);\n cur = cur.get_child(c > 0);\n }\n\n for(var i=iter._ancestors.length - 1; i >= 0; --i) {\n cur = iter._ancestors[i];\n if(cmp(item, cur.data) < 0) {\n iter._cursor = cur;\n iter._ancestors.length = i;\n return iter;\n }\n }\n\n iter._ancestors.length = 0;\n return iter;\n};\n\n// Returns an iterator to the tree node immediately after the item\nTreeBase.prototype.upperBound = function(item) {\n var iter = this.lowerBound(item);\n var cmp = this._comparator;\n\n while(iter.data() !== null && cmp(iter.data(), item) === 0) {\n iter.next();\n }\n\n return iter;\n};\n\n// returns null if tree is empty\nTreeBase.prototype.min = function() {\n var res = this._root;\n if(res === null) {\n return null;\n }\n\n while(res.left !== null) {\n res = res.left;\n }\n\n return res.data;\n};\n\n// returns null if tree is empty\nTreeBase.prototype.max = function() {\n var res = this._root;\n if(res === null) {\n return null;\n }\n\n while(res.right !== null) {\n res = res.right;\n }\n\n return res.data;\n};\n\n// returns a null iterator\n// call next() or prev() to point to an element\nTreeBase.prototype.iterator = function() {\n return new Iterator(this);\n};\n\n// calls cb on each node's data, in order\nTreeBase.prototype.each = function(cb) {\n var it=this.iterator(), data;\n while((data = it.next()) !== null) {\n if(cb(data) === false) {\n return;\n }\n }\n};\n\n// calls cb on each node's data, in reverse order\nTreeBase.prototype.reach = function(cb) {\n var it=this.iterator(), data;\n while((data = it.prev()) !== null) {\n if(cb(data) === false) {\n return;\n }\n }\n};\n\n\nfunction Iterator(tree) {\n this._tree = tree;\n this._ancestors = [];\n this._cursor = null;\n}\n\nIterator.prototype.data = function() {\n return this._cursor !== null ? this._cursor.data : null;\n};\n\n// if null-iterator, returns first node\n// otherwise, returns next node\nIterator.prototype.next = function() {\n if(this._cursor === null) {\n var root = this._tree._root;\n if(root !== null) {\n this._minNode(root);\n }\n }\n else {\n if(this._cursor.right === null) {\n // no greater node in subtree, go up to parent\n // if coming from a right child, continue up the stack\n var save;\n do {\n save = this._cursor;\n if(this._ancestors.length) {\n this._cursor = this._ancestors.pop();\n }\n else {\n this._cursor = null;\n break;\n }\n } while(this._cursor.right === save);\n }\n else {\n // get the next node from the subtree\n this._ancestors.push(this._cursor);\n this._minNode(this._cursor.right);\n }\n }\n return this._cursor !== null ? this._cursor.data : null;\n};\n\n// if null-iterator, returns last node\n// otherwise, returns previous node\nIterator.prototype.prev = function() {\n if(this._cursor === null) {\n var root = this._tree._root;\n if(root !== null) {\n this._maxNode(root);\n }\n }\n else {\n if(this._cursor.left === null) {\n var save;\n do {\n save = this._cursor;\n if(this._ancestors.length) {\n this._cursor = this._ancestors.pop();\n }\n else {\n this._cursor = null;\n break;\n }\n } while(this._cursor.left === save);\n }\n else {\n this._ancestors.push(this._cursor);\n this._maxNode(this._cursor.left);\n }\n }\n return this._cursor !== null ? this._cursor.data : null;\n};\n\nIterator.prototype._minNode = function(start) {\n while(start.left !== null) {\n this._ancestors.push(start);\n start = start.left;\n }\n this._cursor = start;\n};\n\nIterator.prototype._maxNode = function(start) {\n while(start.right !== null) {\n this._ancestors.push(start);\n start = start.right;\n }\n this._cursor = start;\n};\n\nmodule.exports = TreeBase;\n\n","\nvar TreeBase = require('./treebase');\n\nfunction Node(data) {\n this.data = data;\n this.left = null;\n this.right = null;\n this.red = true;\n}\n\nNode.prototype.get_child = function(dir) {\n return dir ? this.right : this.left;\n};\n\nNode.prototype.set_child = function(dir, val) {\n if(dir) {\n this.right = val;\n }\n else {\n this.left = val;\n }\n};\n\nfunction RBTree(comparator) {\n this._root = null;\n this._comparator = comparator;\n this.size = 0;\n}\n\nRBTree.prototype = new TreeBase();\n\n// returns true if inserted, false if duplicate\nRBTree.prototype.insert = function(data) {\n var ret = false;\n\n if(this._root === null) {\n // empty tree\n this._root = new Node(data);\n ret = true;\n this.size++;\n }\n else {\n var head = new Node(undefined); // fake tree root\n\n var dir = 0;\n var last = 0;\n\n // setup\n var gp = null; // grandparent\n var ggp = head; // grand-grand-parent\n var p = null; // parent\n var node = this._root;\n ggp.right = this._root;\n\n // search down\n while(true) {\n if(node === null) {\n // insert new node at the bottom\n node = new Node(data);\n p.set_child(dir, node);\n ret = true;\n this.size++;\n }\n else if(is_red(node.left) && is_red(node.right)) {\n // color flip\n node.red = true;\n node.left.red = false;\n node.right.red = false;\n }\n\n // fix red violation\n if(is_red(node) && is_red(p)) {\n var dir2 = ggp.right === gp;\n\n if(node === p.get_child(last)) {\n ggp.set_child(dir2, single_rotate(gp, !last));\n }\n else {\n ggp.set_child(dir2, double_rotate(gp, !last));\n }\n }\n\n var cmp = this._comparator(node.data, data);\n\n // stop if found\n if(cmp === 0) {\n break;\n }\n\n last = dir;\n dir = cmp < 0;\n\n // update helpers\n if(gp !== null) {\n ggp = gp;\n }\n gp = p;\n p = node;\n node = node.get_child(dir);\n }\n\n // update root\n this._root = head.right;\n }\n\n // make root black\n this._root.red = false;\n\n return ret;\n};\n\n// returns true if removed, false if not found\nRBTree.prototype.remove = function(data) {\n if(this._root === null) {\n return false;\n }\n\n var head = new Node(undefined); // fake tree root\n var node = head;\n node.right = this._root;\n var p = null; // parent\n var gp = null; // grand parent\n var found = null; // found item\n var dir = 1;\n\n while(node.get_child(dir) !== null) {\n var last = dir;\n\n // update helpers\n gp = p;\n p = node;\n node = node.get_child(dir);\n\n var cmp = this._comparator(data, node.data);\n\n dir = cmp > 0;\n\n // save found node\n if(cmp === 0) {\n found = node;\n }\n\n // push the red node down\n if(!is_red(node) && !is_red(node.get_child(dir))) {\n if(is_red(node.get_child(!dir))) {\n var sr = single_rotate(node, dir);\n p.set_child(last, sr);\n p = sr;\n }\n else if(!is_red(node.get_child(!dir))) {\n var sibling = p.get_child(!last);\n if(sibling !== null) {\n if(!is_red(sibling.get_child(!last)) && !is_red(sibling.get_child(last))) {\n // color flip\n p.red = false;\n sibling.red = true;\n node.red = true;\n }\n else {\n var dir2 = gp.right === p;\n\n if(is_red(sibling.get_child(last))) {\n gp.set_child(dir2, double_rotate(p, last));\n }\n else if(is_red(sibling.get_child(!last))) {\n gp.set_child(dir2, single_rotate(p, last));\n }\n\n // ensure correct coloring\n var gpc = gp.get_child(dir2);\n gpc.red = true;\n node.red = true;\n gpc.left.red = false;\n gpc.right.red = false;\n }\n }\n }\n }\n }\n\n // replace and remove if found\n if(found !== null) {\n found.data = node.data;\n p.set_child(p.right === node, node.get_child(node.left === null));\n this.size--;\n }\n\n // update root and make it black\n this._root = head.right;\n if(this._root !== null) {\n this._root.red = false;\n }\n\n return found !== null;\n};\n\nfunction is_red(node) {\n return node !== null && node.red;\n}\n\nfunction single_rotate(root, dir) {\n var save = root.get_child(!dir);\n\n root.set_child(!dir, save.get_child(dir));\n save.set_child(dir, root);\n\n root.red = true;\n save.red = false;\n\n return save;\n}\n\nfunction double_rotate(root, dir) {\n root.set_child(!dir, single_rotate(root.get_child(!dir), !dir));\n return single_rotate(root, dir);\n}\n\nmodule.exports = RBTree;\n","\nvar TreeBase = require('./treebase');\n\nfunction Node(data) {\n this.data = data;\n this.left = null;\n this.right = null;\n}\n\nNode.prototype.get_child = function(dir) {\n return dir ? this.right : this.left;\n};\n\nNode.prototype.set_child = function(dir, val) {\n if(dir) {\n this.right = val;\n }\n else {\n this.left = val;\n }\n};\n\nfunction BinTree(comparator) {\n this._root = null;\n this._comparator = comparator;\n this.size = 0;\n}\n\nBinTree.prototype = new TreeBase();\n\n// returns true if inserted, false if duplicate\nBinTree.prototype.insert = function(data) {\n if(this._root === null) {\n // empty tree\n this._root = new Node(data);\n this.size++;\n return true;\n }\n\n var dir = 0;\n\n // setup\n var p = null; // parent\n var node = this._root;\n\n // search down\n while(true) {\n if(node === null) {\n // insert new node at the bottom\n node = new Node(data);\n p.set_child(dir, node);\n ret = true;\n this.size++;\n return true;\n }\n\n // stop if found\n if(this._comparator(node.data, data) === 0) {\n return false;\n }\n\n dir = this._comparator(node.data, data) < 0;\n\n // update helpers\n p = node;\n node = node.get_child(dir);\n }\n};\n\n// returns true if removed, false if not found\nBinTree.prototype.remove = function(data) {\n if(this._root === null) {\n return false;\n }\n\n var head = new Node(undefined); // fake tree root\n var node = head;\n node.right = this._root;\n var p = null; // parent\n var found = null; // found item\n var dir = 1;\n\n while(node.get_child(dir) !== null) {\n p = node;\n node = node.get_child(dir);\n var cmp = this._comparator(data, node.data);\n dir = cmp > 0;\n\n if(cmp === 0) {\n found = node;\n }\n }\n\n if(found !== null) {\n found.data = node.data;\n p.set_child(p.right === node, node.get_child(node.left === null));\n\n this._root = head.right;\n this.size--;\n return true;\n }\n else {\n return false;\n }\n};\n\nmodule.exports = BinTree;\n\n","module.exports = {\n RBTree: require('./lib/rbtree'),\n BinTree: require('./lib/bintree')\n};\n","//\n// TDigest:\n//\n// approximate distribution percentiles from a stream of reals\n//\nvar RBTree = require('bintrees').RBTree;\n\nfunction TDigest(delta, K, CX) {\n // allocate a TDigest structure.\n //\n // delta is the compression factor, the max fraction of mass that\n // can be owned by one centroid (bigger, up to 1.0, means more\n // compression). delta=false switches off TDigest behavior and treats\n // the distribution as discrete, with no merging and exact values\n // reported.\n //\n // K is a size threshold that triggers recompression as the TDigest\n // grows during input. (Set it to 0 to disable automatic recompression)\n //\n // CX specifies how often to update cached cumulative totals used\n // for quantile estimation during ingest (see cumulate()). Set to\n // 0 to use exact quantiles for each new point.\n //\n this.discrete = (delta === false);\n this.delta = delta || 0.01;\n this.K = (K === undefined) ? 25 : K;\n this.CX = (CX === undefined) ? 1.1 : CX;\n this.centroids = new RBTree(compare_centroid_means);\n this.nreset = 0;\n this.reset();\n}\n\nTDigest.prototype.reset = function() {\n // prepare to digest new points.\n //\n this.centroids.clear();\n this.n = 0;\n this.nreset += 1;\n this.last_cumulate = 0;\n};\n\nTDigest.prototype.size = function() {\n return this.centroids.size;\n};\n\nTDigest.prototype.toArray = function(everything) {\n // return {mean,n} of centroids as an array ordered by mean.\n //\n var result = [];\n if (everything) {\n this._cumulate(true); // be sure cumns are exact\n this.centroids.each(function(c) { result.push(c); });\n } else {\n this.centroids.each(function(c) { result.push({mean:c.mean, n:c.n}); });\n }\n return result;\n};\n\nTDigest.prototype.summary = function() {\n var approx = (this.discrete) ? \"exact \" : \"approximating \";\n var s = [approx + this.n + \" samples using \" + this.size() + \" centroids\",\n \"min = \"+this.percentile(0),\n \"Q1 = \"+this.percentile(0.25),\n \"Q2 = \"+this.percentile(0.5),\n \"Q3 = \"+this.percentile(0.75),\n \"max = \"+this.percentile(1.0)];\n return s.join('\\n');\n};\n\nfunction compare_centroid_means(a, b) {\n // order two centroids by mean.\n //\n return (a.mean > b.mean) ? 1 : (a.mean < b.mean) ? -1 : 0;\n}\n\nfunction compare_centroid_mean_cumns(a, b) {\n // order two centroids by mean_cumn.\n //\n return (a.mean_cumn - b.mean_cumn);\n}\n\nTDigest.prototype.push = function(x, n) {\n // incorporate value or array of values x, having count n into the\n // TDigest. n defaults to 1.\n //\n n = n || 1;\n x = Array.isArray(x) ? x : [x];\n for (var i = 0 ; i < x.length ; i++) {\n this._digest(x[i], n);\n }\n};\n\nTDigest.prototype.push_centroid = function(c) {\n // incorporate centroid or array of centroids c\n //\n c = Array.isArray(c) ? c : [c];\n for (var i = 0 ; i < c.length ; i++) {\n this._digest(c[i].mean, c[i].n);\n }\n};\n\nTDigest.prototype._cumulate = function(exact) {\n // update cumulative counts for each centroid\n //\n // exact: falsey means only cumulate after sufficient\n // growth. During ingest, these counts are used as quantile\n // estimates, and they work well even when somewhat out of\n // date. (this is a departure from the publication, you may set CX\n // to 0 to disable).\n //\n if (this.n === this.last_cumulate ||\n !exact && this.CX && this.CX > (this.n / this.last_cumulate)) {\n return;\n }\n var cumn = 0;\n this.centroids.each(function(c) {\n c.mean_cumn = cumn + c.n / 2; // half of n at the mean\n cumn = c.cumn = cumn + c.n;\n });\n this.n = this.last_cumulate = cumn;\n};\n\nTDigest.prototype.find_nearest = function(x) {\n // find the centroid closest to x. The assumption of\n // unique means and a unique nearest centroid departs from the\n // paper, see _digest() below\n //\n if (this.size() === 0) {\n return null;\n }\n var iter = this.centroids.lowerBound({mean:x}); // x <= iter || iter==null\n var c = (iter.data() === null) ? iter.prev() : iter.data();\n if (c.mean === x || this.discrete) {\n return c; // c is either x or a neighbor (discrete: no distance func)\n }\n var prev = iter.prev();\n if (prev && Math.abs(prev.mean - x) < Math.abs(c.mean - x)) {\n return prev;\n } else {\n return c;\n }\n};\n\nTDigest.prototype._new_centroid = function(x, n, cumn) {\n // create and insert a new centroid into the digest (don't update\n // cumulatives).\n //\n var c = {mean:x, n:n, cumn:cumn};\n this.centroids.insert(c);\n this.n += n;\n return c;\n};\n\nTDigest.prototype._addweight = function(nearest, x, n) {\n // add weight at location x to nearest centroid. adding x to\n // nearest will not shift its relative position in the tree and\n // require reinsertion.\n //\n if (x !== nearest.mean) {\n nearest.mean += n * (x - nearest.mean) / (nearest.n + n);\n }\n nearest.cumn += n;\n nearest.mean_cumn += n / 2;\n nearest.n += n;\n this.n += n;\n};\n\nTDigest.prototype._digest = function(x, n) {\n // incorporate value x, having count n into the TDigest.\n //\n var min = this.centroids.min();\n var max = this.centroids.max();\n var nearest = this.find_nearest(x);\n if (nearest && nearest.mean === x) {\n // accumulate exact matches into the centroid without\n // limit. this is a departure from the paper, made so\n // centroids remain unique and code can be simple.\n this._addweight(nearest, x, n);\n } else if (nearest === min) {\n this._new_centroid(x, n, 0); // new point around min boundary\n } else if (nearest === max ) {\n this._new_centroid(x, n, this.n); // new point around max boundary\n } else if (this.discrete) {\n this._new_centroid(x, n, nearest.cumn); // never merge\n } else {\n // conider a merge based on nearest centroid's capacity. if\n // there's not room for all of n, don't bother merging any of\n // it into nearest, as we'll have to make a new centroid\n // anyway for the remainder (departure from the paper).\n var p = nearest.mean_cumn / this.n;\n var max_n = Math.floor(4 * this.n * this.delta * p * (1 - p));\n if (max_n - nearest.n >= n) {\n this._addweight(nearest, x, n);\n } else {\n this._new_centroid(x, n, nearest.cumn);\n }\n }\n this._cumulate(false);\n if (!this.discrete && this.K && this.size() > this.K / this.delta) {\n // re-process the centroids and hope for some compression.\n this.compress();\n }\n};\n\nTDigest.prototype.bound_mean = function(x) {\n // find centroids lower and upper such that lower.mean < x <\n // upper.mean or lower.mean === x === upper.mean. Don't call\n // this for x out of bounds.\n //\n var iter = this.centroids.upperBound({mean:x}); // x < iter\n var lower = iter.prev(); // lower <= x\n var upper = (lower.mean === x) ? lower : iter.next();\n return [lower, upper];\n};\n\nTDigest.prototype.p_rank = function(x_or_xlist) {\n // return approximate percentile-ranks (0..1) for data value x.\n // or list of x. calculated according to\n // https://en.wikipedia.org/wiki/Percentile_rank\n //\n // (Note that in continuous mode, boundary sample values will\n // report half their centroid weight inward from 0/1 as the\n // percentile-rank. X values outside the observed range return\n // 0/1)\n //\n // this triggers cumulate() if cumn's are out of date.\n //\n var xs = Array.isArray(x_or_xlist) ? x_or_xlist : [x_or_xlist];\n var ps = xs.map(this._p_rank, this);\n return Array.isArray(x_or_xlist) ? ps : ps[0];\n};\n\nTDigest.prototype._p_rank = function(x) {\n if (this.size() === 0) {\n return undefined;\n } else if (x < this.centroids.min().mean) {\n return 0.0;\n } else if (x > this.centroids.max().mean) {\n return 1.0;\n }\n // find centroids that bracket x and interpolate x's cumn from\n // their cumn's.\n this._cumulate(true); // be sure cumns are exact\n var bound = this.bound_mean(x);\n var lower = bound[0], upper = bound[1];\n if (this.discrete) {\n return lower.cumn / this.n;\n } else {\n var cumn = lower.mean_cumn;\n if (lower !== upper) {\n cumn += (x - lower.mean) * (upper.mean_cumn - lower.mean_cumn) / (upper.mean - lower.mean);\n }\n return cumn / this.n;\n }\n};\n\nTDigest.prototype.bound_mean_cumn = function(cumn) {\n // find centroids lower and upper such that lower.mean_cumn < x <\n // upper.mean_cumn or lower.mean_cumn === x === upper.mean_cumn. Don't call\n // this for cumn out of bounds.\n //\n // XXX because mean and mean_cumn give rise to the same sort order\n // (up to identical means), use the mean rbtree for our search.\n this.centroids._comparator = compare_centroid_mean_cumns;\n var iter = this.centroids.upperBound({mean_cumn:cumn}); // cumn < iter\n this.centroids._comparator = compare_centroid_means;\n var lower = iter.prev(); // lower <= cumn\n var upper = (lower && lower.mean_cumn === cumn) ? lower : iter.next();\n return [lower, upper];\n};\n\nTDigest.prototype.percentile = function(p_or_plist) {\n // for percentage p (0..1), or for each p in a list of ps, return\n // the smallest data value q at which at least p percent of the\n // observations <= q.\n //\n // for discrete distributions, this selects q using the Nearest\n // Rank Method\n // (https://en.wikipedia.org/wiki/Percentile#The_Nearest_Rank_method)\n // (in scipy, same as percentile(...., interpolation='higher')\n //\n // for continuous distributions, interpolates data values between\n // count-weighted bracketing means.\n //\n // this triggers cumulate() if cumn's are out of date.\n //\n var ps = Array.isArray(p_or_plist) ? p_or_plist : [p_or_plist];\n var qs = ps.map(this._percentile, this);\n return Array.isArray(p_or_plist) ? qs : qs[0];\n};\n\nTDigest.prototype._percentile = function(p) {\n if (this.size() === 0) {\n return undefined;\n }\n this._cumulate(true); // be sure cumns are exact\n var h = this.n * p;\n var bound = this.bound_mean_cumn(h);\n var lower = bound[0], upper = bound[1];\n\n if (upper === lower || lower === null || upper === null) {\n return (lower || upper).mean;\n } else if (!this.discrete) {\n return lower.mean + (h - lower.mean_cumn) * (upper.mean - lower.mean) / (upper.mean_cumn - lower.mean_cumn);\n } else if (h <= lower.cumn) {\n return lower.mean;\n } else {\n return upper.mean;\n }\n};\n\nfunction pop_random(choices) {\n // remove and return an item randomly chosen from the array of choices\n // (mutates choices)\n //\n var idx = Math.floor(Math.random() * choices.length);\n return choices.splice(idx, 1)[0];\n}\n\nTDigest.prototype.compress = function() {\n // TDigests experience worst case compression (none) when input\n // increases monotonically. Improve on any bad luck by\n // reconsuming digest centroids as if they were weighted points\n // while shuffling their order (and hope for the best).\n //\n if (this.compressing) {\n return;\n }\n var points = this.toArray();\n this.reset();\n this.compressing = true;\n while (points.length > 0) {\n this.push_centroid(pop_random(points));\n }\n this._cumulate(true);\n this.compressing = false;\n};\n\nfunction Digest(config) {\n // allocate a distribution digest structure. This is an extension\n // of a TDigest structure that starts in exact histogram (discrete)\n // mode, and automatically switches to TDigest mode for large\n // samples that appear to be from a continuous distribution.\n //\n this.config = config || {};\n this.mode = this.config.mode || 'auto'; // disc, cont, auto\n TDigest.call(this, this.mode === 'cont' ? config.delta : false);\n this.digest_ratio = this.config.ratio || 0.9;\n this.digest_thresh = this.config.thresh || 1000;\n this.n_unique = 0;\n}\nDigest.prototype = Object.create(TDigest.prototype);\nDigest.prototype.constructor = Digest;\n\nDigest.prototype.push = function(x_or_xlist) {\n TDigest.prototype.push.call(this, x_or_xlist);\n this.check_continuous();\n};\n\nDigest.prototype._new_centroid = function(x, n, cumn) {\n this.n_unique += 1;\n TDigest.prototype._new_centroid.call(this, x, n, cumn);\n};\n\nDigest.prototype._addweight = function(nearest, x, n) {\n if (nearest.n === 1) {\n this.n_unique -= 1;\n }\n TDigest.prototype._addweight.call(this, nearest, x, n);\n};\n\nDigest.prototype.check_continuous = function() {\n // while in 'auto' mode, if there are many unique elements, assume\n // they are from a continuous distribution and switch to 'cont'\n // mode (tdigest behavior). Return true on transition from\n // disctete to continuous.\n if (this.mode !== 'auto' || this.size() < this.digest_thresh) {\n return false;\n }\n if (this.n_unique / this.size() > this.digest_ratio) {\n this.mode = 'cont';\n this.discrete = false;\n this.delta = this.config.delta || 0.01;\n this.compress();\n return true;\n }\n return false;\n};\n\nmodule.exports = {\n 'TDigest': TDigest,\n 'Digest': Digest\n};\n","'use strict';\n\nconst { TDigest } = require('tdigest');\n\nclass TimeWindowQuantiles {\n\tconstructor(maxAgeSeconds, ageBuckets) {\n\t\tthis.maxAgeSeconds = maxAgeSeconds || 0;\n\t\tthis.ageBuckets = ageBuckets || 0;\n\n\t\tthis.shouldRotate = maxAgeSeconds && ageBuckets;\n\n\t\tthis.ringBuffer = Array(ageBuckets).fill(new TDigest());\n\t\tthis.currentBuffer = 0;\n\n\t\tthis.lastRotateTimestampMillis = Date.now();\n\t\tthis.durationBetweenRotatesMillis =\n\t\t\t(maxAgeSeconds * 1000) / ageBuckets || Infinity;\n\t}\n\n\tsize() {\n\t\tconst bucket = rotate.call(this);\n\t\treturn bucket.size();\n\t}\n\n\tpercentile(quantile) {\n\t\tconst bucket = rotate.call(this);\n\t\treturn bucket.percentile(quantile);\n\t}\n\n\tpush(value) {\n\t\trotate.call(this);\n\t\tthis.ringBuffer.forEach(bucket => {\n\t\t\tbucket.push(value);\n\t\t});\n\t}\n\n\treset() {\n\t\tthis.ringBuffer.forEach(bucket => {\n\t\t\tbucket.reset();\n\t\t});\n\t}\n\n\tcompress() {\n\t\tthis.ringBuffer.forEach(bucket => {\n\t\t\tbucket.compress();\n\t\t});\n\t}\n}\n\nfunction rotate() {\n\tlet timeSinceLastRotateMillis = Date.now() - this.lastRotateTimestampMillis;\n\twhile (\n\t\ttimeSinceLastRotateMillis > this.durationBetweenRotatesMillis &&\n\t\tthis.shouldRotate\n\t) {\n\t\tthis.ringBuffer[this.currentBuffer] = new TDigest();\n\n\t\tif (++this.currentBuffer >= this.ringBuffer.length) {\n\t\t\tthis.currentBuffer = 0;\n\t\t}\n\t\ttimeSinceLastRotateMillis -= this.durationBetweenRotatesMillis;\n\t\tthis.lastRotateTimestampMillis += this.durationBetweenRotatesMillis;\n\t}\n\treturn this.ringBuffer[this.currentBuffer];\n}\n\nmodule.exports = TimeWindowQuantiles;\n","/**\n * Summary\n */\n'use strict';\n\nconst util = require('util');\nconst { getLabels, hashObject, removeLabels } = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\nconst timeWindowQuantiles = require('./timeWindowQuantiles');\n\nconst DEFAULT_COMPRESS_COUNT = 1000; // every 1000 measurements\n\nclass Summary extends Metric {\n\tconstructor(config) {\n\t\tsuper(config, {\n\t\t\tpercentiles: [0.01, 0.05, 0.5, 0.9, 0.95, 0.99, 0.999],\n\t\t\tcompressCount: DEFAULT_COMPRESS_COUNT,\n\t\t\thashMap: {},\n\t\t});\n\n\t\tthis.type = 'summary';\n\n\t\tfor (const label of this.labelNames) {\n\t\t\tif (label === 'quantile')\n\t\t\t\tthrow new Error('quantile is a reserved label keyword');\n\t\t}\n\n\t\tif (this.labelNames.length === 0) {\n\t\t\tthis.hashMap = {\n\t\t\t\t[hashObject({})]: {\n\t\t\t\t\tlabels: {},\n\t\t\t\t\ttd: new timeWindowQuantiles(this.maxAgeSeconds, this.ageBuckets),\n\t\t\t\t\tcount: 0,\n\t\t\t\t\tsum: 0,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Observe a value\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to observe\n\t * @returns {void}\n\t */\n\tobserve(labels, value) {\n\t\tobserve.call(this, labels === 0 ? 0 : labels || {})(value);\n\t}\n\n\tasync get() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\t\tconst hashKeys = Object.keys(this.hashMap);\n\t\tconst values = [];\n\n\t\thashKeys.forEach(hashKey => {\n\t\t\tconst s = this.hashMap[hashKey];\n\t\t\tif (s) {\n\t\t\t\tif (this.pruneAgedBuckets && s.td.size() === 0) {\n\t\t\t\t\tdelete this.hashMap[hashKey];\n\t\t\t\t} else {\n\t\t\t\t\textractSummariesForExport(s, this.percentiles).forEach(v => {\n\t\t\t\t\t\tvalues.push(v);\n\t\t\t\t\t});\n\t\t\t\t\tvalues.push(getSumForExport(s, this));\n\t\t\t\t\tvalues.push(getCountForExport(s, this));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\thelp: this.help,\n\t\t\ttype: this.type,\n\t\t\tvalues,\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\treset() {\n\t\tconst data = Object.values(this.hashMap);\n\t\tdata.forEach(s => {\n\t\t\ts.td.reset();\n\t\t\ts.count = 0;\n\t\t\ts.sum = 0;\n\t\t});\n\t}\n\n\t/**\n\t * Start a timer that could be used to logging durations\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {function} - Function to invoke when you want to stop the timer and observe the duration in seconds\n\t * @example\n\t * var end = summary.startTimer();\n\t * makeExpensiveXHRRequest(function(err, res) {\n\t *\tend(); //Observe the duration of expensiveXHRRequest\n\t * });\n\t */\n\tstartTimer(labels) {\n\t\treturn startTimer.call(this, labels)();\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn {\n\t\t\tobserve: observe.call(this, labels),\n\t\t\tstartTimer: startTimer.call(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tremoveLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction extractSummariesForExport(summaryOfLabels, percentiles) {\n\tsummaryOfLabels.td.compress();\n\n\treturn percentiles.map(percentile => {\n\t\tconst percentileValue = summaryOfLabels.td.percentile(percentile);\n\t\treturn {\n\t\t\tlabels: Object.assign({ quantile: percentile }, summaryOfLabels.labels),\n\t\t\tvalue: percentileValue ? percentileValue : 0,\n\t\t};\n\t});\n}\n\nfunction getCountForExport(value, summary) {\n\treturn {\n\t\tmetricName: `${summary.name}_count`,\n\t\tlabels: value.labels,\n\t\tvalue: value.count,\n\t};\n}\n\nfunction getSumForExport(value, summary) {\n\treturn {\n\t\tmetricName: `${summary.name}_sum`,\n\t\tlabels: value.labels,\n\t\tvalue: value.sum,\n\t};\n}\n\nfunction startTimer(startLabels) {\n\treturn () => {\n\t\tconst start = process.hrtime();\n\t\treturn endLabels => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.observe(Object.assign({}, startLabels, endLabels), value);\n\t\t\treturn value;\n\t\t};\n\t};\n}\n\nfunction observe(labels) {\n\treturn value => {\n\t\tconst labelValuePair = convertLabelsAndValues(labels, value);\n\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tif (!Number.isFinite(labelValuePair.value)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Value is not a valid number: ${util.format(labelValuePair.value)}`,\n\t\t\t);\n\t\t}\n\n\t\tconst hash = hashObject(labelValuePair.labels, this.sortedLabelNames);\n\t\tlet summaryOfLabel = this.hashMap[hash];\n\t\tif (!summaryOfLabel) {\n\t\t\tsummaryOfLabel = {\n\t\t\t\tlabels: labelValuePair.labels,\n\t\t\t\ttd: new timeWindowQuantiles(this.maxAgeSeconds, this.ageBuckets),\n\t\t\t\tcount: 0,\n\t\t\t\tsum: 0,\n\t\t\t};\n\t\t}\n\n\t\tsummaryOfLabel.td.push(labelValuePair.value);\n\t\tsummaryOfLabel.count++;\n\t\tif (summaryOfLabel.count % this.compressCount === 0) {\n\t\t\tsummaryOfLabel.td.compress();\n\t\t}\n\t\tsummaryOfLabel.sum += labelValuePair.value;\n\t\tthis.hashMap[hash] = summaryOfLabel;\n\t};\n}\n\nfunction convertLabelsAndValues(labels, value) {\n\tif (value === undefined) {\n\t\treturn {\n\t\t\tvalue: labels,\n\t\t\tlabels: {},\n\t\t};\n\t}\n\n\treturn {\n\t\tlabels,\n\t\tvalue,\n\t};\n}\n\nmodule.exports = Summary;\n","'use strict';\n\nconst url = require('url');\nconst http = require('http');\nconst https = require('https');\nconst { gzipSync } = require('zlib');\nconst { globalRegistry } = require('./registry');\n\nclass Pushgateway {\n\tconstructor(gatewayUrl, options, registry) {\n\t\tif (!registry) {\n\t\t\tregistry = globalRegistry;\n\t\t}\n\t\tthis.registry = registry;\n\t\tthis.gatewayUrl = gatewayUrl;\n\t\tconst { requireJobName, ...requestOptions } = {\n\t\t\trequireJobName: true,\n\t\t\t...options,\n\t\t};\n\t\tthis.requireJobName = requireJobName;\n\t\tthis.requestOptions = requestOptions;\n\t}\n\n\tpushAdd(params = {}) {\n\t\tif (this.requireJobName && !params.jobName) {\n\t\t\tthrow new Error('Missing jobName parameter');\n\t\t}\n\n\t\treturn useGateway.call(this, 'POST', params.jobName, params.groupings);\n\t}\n\n\tpush(params = {}) {\n\t\tif (this.requireJobName && !params.jobName) {\n\t\t\tthrow new Error('Missing jobName parameter');\n\t\t}\n\n\t\treturn useGateway.call(this, 'PUT', params.jobName, params.groupings);\n\t}\n\n\tdelete(params = {}) {\n\t\tif (this.requireJobName && !params.jobName) {\n\t\t\tthrow new Error('Missing jobName parameter');\n\t\t}\n\n\t\treturn useGateway.call(this, 'DELETE', params.jobName, params.groupings);\n\t}\n}\nasync function useGateway(method, job, groupings) {\n\t// `URL` first added in v6.13.0\n\t// eslint-disable-next-line n/no-deprecated-api\n\tconst gatewayUrlParsed = url.parse(this.gatewayUrl);\n\tconst gatewayUrlPath =\n\t\tgatewayUrlParsed.pathname && gatewayUrlParsed.pathname !== '/'\n\t\t\t? gatewayUrlParsed.pathname\n\t\t\t: '';\n\tconst jobPath = job\n\t\t? `/job/${encodeURIComponent(job)}${generateGroupings(groupings)}`\n\t\t: '';\n\tconst path = `${gatewayUrlPath}/metrics${jobPath}`;\n\n\t// eslint-disable-next-line n/no-deprecated-api\n\tconst target = url.resolve(this.gatewayUrl, path);\n\t// eslint-disable-next-line n/no-deprecated-api\n\tconst requestParams = url.parse(target);\n\tconst httpModule = isHttps(requestParams.href) ? https : http;\n\tconst options = Object.assign(requestParams, this.requestOptions, {\n\t\tmethod,\n\t});\n\n\treturn new Promise((resolve, reject) => {\n\t\tif (method === 'DELETE' && options.headers) {\n\t\t\tdelete options.headers['Content-Encoding'];\n\t\t}\n\t\tconst req = httpModule.request(options, resp => {\n\t\t\tlet body = '';\n\t\t\tresp.setEncoding('utf8');\n\t\t\tresp.on('data', chunk => {\n\t\t\t\tbody += chunk;\n\t\t\t});\n\t\t\tresp.on('end', () => {\n\t\t\t\tif (resp.statusCode >= 400) {\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(`push failed with status ${resp.statusCode}, ${body}`),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tresolve({ resp, body });\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\treq.on('error', err => {\n\t\t\treject(err);\n\t\t});\n\n\t\treq.on('timeout', () => {\n\t\t\treq.destroy(new Error('Pushgateway request timed out'));\n\t\t});\n\n\t\tif (method !== 'DELETE') {\n\t\t\tthis.registry\n\t\t\t\t.metrics()\n\t\t\t\t.then(metrics => {\n\t\t\t\t\tif (\n\t\t\t\t\t\toptions.headers &&\n\t\t\t\t\t\toptions.headers['Content-Encoding'] === 'gzip'\n\t\t\t\t\t) {\n\t\t\t\t\t\tmetrics = gzipSync(metrics);\n\t\t\t\t\t}\n\t\t\t\t\treq.write(metrics);\n\t\t\t\t\treq.end();\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t} else {\n\t\t\treq.end();\n\t\t}\n\t});\n}\n\nfunction generateGroupings(groupings) {\n\tif (!groupings) {\n\t\treturn '';\n\t}\n\treturn Object.keys(groupings)\n\t\t.map(\n\t\t\tkey =>\n\t\t\t\t`/${encodeURIComponent(key)}/${encodeURIComponent(groupings[key])}`,\n\t\t)\n\t\t.join('');\n}\n\nfunction isHttps(href) {\n\treturn href.search(/^https/) !== -1;\n}\n\nmodule.exports = Pushgateway;\n","'use strict';\n\nexports.linearBuckets = (start, width, count) => {\n\tif (count < 1) {\n\t\tthrow new Error('Linear buckets needs a positive count');\n\t}\n\n\tconst buckets = new Array(count);\n\tfor (let i = 0; i < count; i++) {\n\t\tbuckets[i] = start + i * width;\n\t}\n\treturn buckets;\n};\n\nexports.exponentialBuckets = (start, factor, count) => {\n\tif (start <= 0) {\n\t\tthrow new Error('Exponential buckets needs a positive start');\n\t}\n\tif (count < 1) {\n\t\tthrow new Error('Exponential buckets needs a positive count');\n\t}\n\tif (factor <= 1) {\n\t\tthrow new Error('Exponential buckets needs a factor greater than 1');\n\t}\n\tconst buckets = new Array(count);\n\tfor (let i = 0; i < count; i++) {\n\t\tbuckets[i] = start;\n\t\tstart *= factor;\n\t}\n\treturn buckets;\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** only globals that common to node and browsers are allowed */\n// eslint-disable-next-line node/no-unsupported-features/es-builtins\nexport const _globalThis = typeof globalThis === 'object' ? globalThis : global;\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './globalThis';\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './node';\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '1.9.0';\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { VERSION } from '../version';\n\nconst re = /^(\\d+)\\.(\\d+)\\.(\\d+)(-(.+))?$/;\n\n/**\n * Create a function to test an API version to see if it is compatible with the provided ownVersion.\n *\n * The returned function has the following semantics:\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param ownVersion version which should be checked against\n */\nexport function _makeCompatibilityCheck(\n ownVersion: string\n): (globalVersion: string) => boolean {\n const acceptedVersions = new Set<string>([ownVersion]);\n const rejectedVersions = new Set<string>();\n\n const myVersionMatch = ownVersion.match(re);\n if (!myVersionMatch) {\n // we cannot guarantee compatibility so we always return noop\n return () => false;\n }\n\n const ownVersionParsed = {\n major: +myVersionMatch[1],\n minor: +myVersionMatch[2],\n patch: +myVersionMatch[3],\n prerelease: myVersionMatch[4],\n };\n\n // if ownVersion has a prerelease tag, versions must match exactly\n if (ownVersionParsed.prerelease != null) {\n return function isExactmatch(globalVersion: string): boolean {\n return globalVersion === ownVersion;\n };\n }\n\n function _reject(v: string) {\n rejectedVersions.add(v);\n return false;\n }\n\n function _accept(v: string) {\n acceptedVersions.add(v);\n return true;\n }\n\n return function isCompatible(globalVersion: string): boolean {\n if (acceptedVersions.has(globalVersion)) {\n return true;\n }\n\n if (rejectedVersions.has(globalVersion)) {\n return false;\n }\n\n const globalVersionMatch = globalVersion.match(re);\n if (!globalVersionMatch) {\n // cannot parse other version\n // we cannot guarantee compatibility so we always noop\n return _reject(globalVersion);\n }\n\n const globalVersionParsed = {\n major: +globalVersionMatch[1],\n minor: +globalVersionMatch[2],\n patch: +globalVersionMatch[3],\n prerelease: globalVersionMatch[4],\n };\n\n // if globalVersion has a prerelease tag, versions must match exactly\n if (globalVersionParsed.prerelease != null) {\n return _reject(globalVersion);\n }\n\n // major versions must match\n if (ownVersionParsed.major !== globalVersionParsed.major) {\n return _reject(globalVersion);\n }\n\n if (ownVersionParsed.major === 0) {\n if (\n ownVersionParsed.minor === globalVersionParsed.minor &&\n ownVersionParsed.patch <= globalVersionParsed.patch\n ) {\n return _accept(globalVersion);\n }\n\n return _reject(globalVersion);\n }\n\n if (ownVersionParsed.minor <= globalVersionParsed.minor) {\n return _accept(globalVersion);\n }\n\n return _reject(globalVersion);\n };\n}\n\n/**\n * Test an API version to see if it is compatible with this API.\n *\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param version version of the API requesting an instance of the global API\n */\nexport const isCompatible = _makeCompatibilityCheck(VERSION);\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MeterProvider } from '../metrics/MeterProvider';\nimport { ContextManager } from '../context/types';\nimport { DiagLogger } from '../diag/types';\nimport { _globalThis } from '../platform';\nimport { TextMapPropagator } from '../propagation/TextMapPropagator';\nimport type { TracerProvider } from '../trace/tracer_provider';\nimport { VERSION } from '../version';\nimport { isCompatible } from './semver';\n\nconst major = VERSION.split('.')[0];\nconst GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for(\n `opentelemetry.js.api.${major}`\n);\n\nconst _global = _globalThis as OTelGlobal;\n\nexport function registerGlobal<Type extends keyof OTelGlobalAPI>(\n type: Type,\n instance: OTelGlobalAPI[Type],\n diag: DiagLogger,\n allowOverride = false\n): boolean {\n const api = (_global[GLOBAL_OPENTELEMETRY_API_KEY] = _global[\n GLOBAL_OPENTELEMETRY_API_KEY\n ] ?? {\n version: VERSION,\n });\n\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n const err = new Error(\n `@opentelemetry/api: Attempted duplicate registration of API: ${type}`\n );\n diag.error(err.stack || err.message);\n return false;\n }\n\n if (api.version !== VERSION) {\n // All registered APIs must be of the same version exactly\n const err = new Error(\n `@opentelemetry/api: Registration of version v${api.version} for ${type} does not match previously registered API v${VERSION}`\n );\n diag.error(err.stack || err.message);\n return false;\n }\n\n api[type] = instance;\n diag.debug(\n `@opentelemetry/api: Registered a global for ${type} v${VERSION}.`\n );\n\n return true;\n}\n\nexport function getGlobal<Type extends keyof OTelGlobalAPI>(\n type: Type\n): OTelGlobalAPI[Type] | undefined {\n const globalVersion = _global[GLOBAL_OPENTELEMETRY_API_KEY]?.version;\n if (!globalVersion || !isCompatible(globalVersion)) {\n return;\n }\n return _global[GLOBAL_OPENTELEMETRY_API_KEY]?.[type];\n}\n\nexport function unregisterGlobal(type: keyof OTelGlobalAPI, diag: DiagLogger) {\n diag.debug(\n `@opentelemetry/api: Unregistering a global for ${type} v${VERSION}.`\n );\n const api = _global[GLOBAL_OPENTELEMETRY_API_KEY];\n\n if (api) {\n delete api[type];\n }\n}\n\ntype OTelGlobal = {\n [GLOBAL_OPENTELEMETRY_API_KEY]?: OTelGlobalAPI;\n};\n\ntype OTelGlobalAPI = {\n version: string;\n\n diag?: DiagLogger;\n trace?: TracerProvider;\n context?: ContextManager;\n metrics?: MeterProvider;\n propagation?: TextMapPropagator;\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getGlobal } from '../internal/global-utils';\nimport { ComponentLoggerOptions, DiagLogger, DiagLogFunction } from './types';\n\n/**\n * Component Logger which is meant to be used as part of any component which\n * will add automatically additional namespace in front of the log message.\n * It will then forward all message to global diag logger\n * @example\n * const cLogger = diag.createComponentLogger({ namespace: '@opentelemetry/instrumentation-http' });\n * cLogger.debug('test');\n * // @opentelemetry/instrumentation-http test\n */\nexport class DiagComponentLogger implements DiagLogger {\n private _namespace: string;\n\n constructor(props: ComponentLoggerOptions) {\n this._namespace = props.namespace || 'DiagComponentLogger';\n }\n\n public debug(...args: any[]): void {\n return logProxy('debug', this._namespace, args);\n }\n\n public error(...args: any[]): void {\n return logProxy('error', this._namespace, args);\n }\n\n public info(...args: any[]): void {\n return logProxy('info', this._namespace, args);\n }\n\n public warn(...args: any[]): void {\n return logProxy('warn', this._namespace, args);\n }\n\n public verbose(...args: any[]): void {\n return logProxy('verbose', this._namespace, args);\n }\n}\n\nfunction logProxy(\n funcName: keyof DiagLogger,\n namespace: string,\n args: any\n): void {\n const logger = getGlobal('diag');\n // shortcut if logger not set\n if (!logger) {\n return;\n }\n\n args.unshift(namespace);\n return logger[funcName](...(args as Parameters<DiagLogFunction>));\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport type DiagLogFunction = (message: string, ...args: unknown[]) => void;\n\n/**\n * Defines an internal diagnostic logger interface which is used to log internal diagnostic\n * messages, you can set the default diagnostic logger via the {@link DiagAPI} setLogger function.\n * API provided implementations include :-\n * - a No-Op {@link createNoopDiagLogger}\n * - a {@link DiagLogLevel} filtering wrapper {@link createLogLevelDiagLogger}\n * - a general Console {@link DiagConsoleLogger} version.\n */\nexport interface DiagLogger {\n /** Log an error scenario that was not expected and caused the requested operation to fail. */\n error: DiagLogFunction;\n\n /**\n * Log a warning scenario to inform the developer of an issues that should be investigated.\n * The requested operation may or may not have succeeded or completed.\n */\n warn: DiagLogFunction;\n\n /**\n * Log a general informational message, this should not affect functionality.\n * This is also the default logging level so this should NOT be used for logging\n * debugging level information.\n */\n info: DiagLogFunction;\n\n /**\n * Log a general debug message that can be useful for identifying a failure.\n * Information logged at this level may include diagnostic details that would\n * help identify a failure scenario.\n * For example: Logging the order of execution of async operations.\n */\n debug: DiagLogFunction;\n\n /**\n * Log a detailed (verbose) trace level logging that can be used to identify failures\n * where debug level logging would be insufficient, this level of tracing can include\n * input and output parameters and as such may include PII information passing through\n * the API. As such it is recommended that this level of tracing should not be enabled\n * in a production environment.\n */\n verbose: DiagLogFunction;\n}\n\n/**\n * Defines the available internal logging levels for the diagnostic logger, the numeric values\n * of the levels are defined to match the original values from the initial LogLevel to avoid\n * compatibility/migration issues for any implementation that assume the numeric ordering.\n */\nexport enum DiagLogLevel {\n /** Diagnostic Logging level setting to disable all logging (except and forced logs) */\n NONE = 0,\n\n /** Identifies an error scenario */\n ERROR = 30,\n\n /** Identifies a warning scenario */\n WARN = 50,\n\n /** General informational log message */\n INFO = 60,\n\n /** General debug log message */\n DEBUG = 70,\n\n /**\n * Detailed trace level logging should only be used for development, should only be set\n * in a development environment.\n */\n VERBOSE = 80,\n\n /** Used to set the logging level to include all logging */\n ALL = 9999,\n}\n\n/**\n * Defines options for ComponentLogger\n */\nexport interface ComponentLoggerOptions {\n namespace: string;\n}\n\nexport interface DiagLoggerOptions {\n /**\n * The {@link DiagLogLevel} used to filter logs sent to the logger.\n *\n * @defaultValue DiagLogLevel.INFO\n */\n logLevel?: DiagLogLevel;\n\n /**\n * Setting this value to `true` will suppress the warning message normally emitted when registering a logger when another logger is already registered.\n */\n suppressOverrideMessage?: boolean;\n}\n\nexport interface DiagLoggerApi {\n /**\n * Set the global DiagLogger and DiagLogLevel.\n * If a global diag logger is already set, this will override it.\n *\n * @param logger - The {@link DiagLogger} instance to set as the default logger.\n * @param options - A {@link DiagLoggerOptions} object. If not provided, default values will be set.\n * @returns `true` if the logger was successfully registered, else `false`\n */\n setLogger(logger: DiagLogger, options?: DiagLoggerOptions): boolean;\n\n /**\n *\n * @param logger - The {@link DiagLogger} instance to set as the default logger.\n * @param logLevel - The {@link DiagLogLevel} used to filter logs sent to the logger. If not provided it will default to {@link DiagLogLevel.INFO}.\n * @returns `true` if the logger was successfully registered, else `false`\n */\n setLogger(logger: DiagLogger, logLevel?: DiagLogLevel): boolean;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagLogFunction, DiagLogger, DiagLogLevel } from '../types';\n\nexport function createLogLevelDiagLogger(\n maxLevel: DiagLogLevel,\n logger: DiagLogger\n): DiagLogger {\n if (maxLevel < DiagLogLevel.NONE) {\n maxLevel = DiagLogLevel.NONE;\n } else if (maxLevel > DiagLogLevel.ALL) {\n maxLevel = DiagLogLevel.ALL;\n }\n\n // In case the logger is null or undefined\n logger = logger || {};\n\n function _filterFunc(\n funcName: keyof DiagLogger,\n theLevel: DiagLogLevel\n ): DiagLogFunction {\n const theFunc = logger[funcName];\n\n if (typeof theFunc === 'function' && maxLevel >= theLevel) {\n return theFunc.bind(logger);\n }\n return function () {};\n }\n\n return {\n error: _filterFunc('error', DiagLogLevel.ERROR),\n warn: _filterFunc('warn', DiagLogLevel.WARN),\n info: _filterFunc('info', DiagLogLevel.INFO),\n debug: _filterFunc('debug', DiagLogLevel.DEBUG),\n verbose: _filterFunc('verbose', DiagLogLevel.VERBOSE),\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagComponentLogger } from '../diag/ComponentLogger';\nimport { createLogLevelDiagLogger } from '../diag/internal/logLevelLogger';\nimport {\n ComponentLoggerOptions,\n DiagLogFunction,\n DiagLogger,\n DiagLoggerApi,\n DiagLogLevel,\n} from '../diag/types';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\n\nconst API_NAME = 'diag';\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry internal\n * diagnostic API\n */\nexport class DiagAPI implements DiagLogger, DiagLoggerApi {\n private static _instance?: DiagAPI;\n\n /** Get the singleton instance of the DiagAPI API */\n public static instance(): DiagAPI {\n if (!this._instance) {\n this._instance = new DiagAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Private internal constructor\n * @private\n */\n private constructor() {\n function _logProxy(funcName: keyof DiagLogger): DiagLogFunction {\n return function (...args) {\n const logger = getGlobal('diag');\n // shortcut if logger not set\n if (!logger) return;\n return logger[funcName](...args);\n };\n }\n\n // Using self local variable for minification purposes as 'this' cannot be minified\n const self = this;\n\n // DiagAPI specific functions\n\n const setLogger: DiagLoggerApi['setLogger'] = (\n logger,\n optionsOrLogLevel = { logLevel: DiagLogLevel.INFO }\n ) => {\n if (logger === self) {\n // There isn't much we can do here.\n // Logging to the console might break the user application.\n // Try to log to self. If a logger was previously registered it will receive the log.\n const err = new Error(\n 'Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation'\n );\n self.error(err.stack ?? err.message);\n return false;\n }\n\n if (typeof optionsOrLogLevel === 'number') {\n optionsOrLogLevel = {\n logLevel: optionsOrLogLevel,\n };\n }\n\n const oldLogger = getGlobal('diag');\n const newLogger = createLogLevelDiagLogger(\n optionsOrLogLevel.logLevel ?? DiagLogLevel.INFO,\n logger\n );\n // There already is an logger registered. We'll let it know before overwriting it.\n if (oldLogger && !optionsOrLogLevel.suppressOverrideMessage) {\n const stack = new Error().stack ?? '<failed to generate stacktrace>';\n oldLogger.warn(`Current logger will be overwritten from ${stack}`);\n newLogger.warn(\n `Current logger will overwrite one already registered from ${stack}`\n );\n }\n\n return registerGlobal('diag', newLogger, self, true);\n };\n\n self.setLogger = setLogger;\n\n self.disable = () => {\n unregisterGlobal(API_NAME, self);\n };\n\n self.createComponentLogger = (options: ComponentLoggerOptions) => {\n return new DiagComponentLogger(options);\n };\n\n self.verbose = _logProxy('verbose');\n self.debug = _logProxy('debug');\n self.info = _logProxy('info');\n self.warn = _logProxy('warn');\n self.error = _logProxy('error');\n }\n\n public setLogger!: DiagLoggerApi['setLogger'];\n /**\n *\n */\n public createComponentLogger!: (\n options: ComponentLoggerOptions\n ) => DiagLogger;\n\n // DiagLogger implementation\n public verbose!: DiagLogFunction;\n public debug!: DiagLogFunction;\n public info!: DiagLogFunction;\n public warn!: DiagLogFunction;\n public error!: DiagLogFunction;\n\n /**\n * Unregister the global logger and return to Noop\n */\n public disable!: () => void;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Baggage, BaggageEntry } from '../types';\n\nexport class BaggageImpl implements Baggage {\n private _entries: Map<string, BaggageEntry>;\n\n constructor(entries?: Map<string, BaggageEntry>) {\n this._entries = entries ? new Map(entries) : new Map();\n }\n\n getEntry(key: string): BaggageEntry | undefined {\n const entry = this._entries.get(key);\n if (!entry) {\n return undefined;\n }\n\n return Object.assign({}, entry);\n }\n\n getAllEntries(): [string, BaggageEntry][] {\n return Array.from(this._entries.entries()).map(([k, v]) => [k, v]);\n }\n\n setEntry(key: string, entry: BaggageEntry): BaggageImpl {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.set(key, entry);\n return newBaggage;\n }\n\n removeEntry(key: string): BaggageImpl {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.delete(key);\n return newBaggage;\n }\n\n removeEntries(...keys: string[]): BaggageImpl {\n const newBaggage = new BaggageImpl(this._entries);\n for (const key of keys) {\n newBaggage._entries.delete(key);\n }\n return newBaggage;\n }\n\n clear(): BaggageImpl {\n return new BaggageImpl();\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Symbol used to make BaggageEntryMetadata an opaque type\n */\nexport const baggageEntryMetadataSymbol = Symbol('BaggageEntryMetadata');\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagAPI } from '../api/diag';\nimport { BaggageImpl } from './internal/baggage-impl';\nimport { baggageEntryMetadataSymbol } from './internal/symbol';\nimport { Baggage, BaggageEntry, BaggageEntryMetadata } from './types';\n\nconst diag = DiagAPI.instance();\n\n/**\n * Create a new Baggage with optional entries\n *\n * @param entries An array of baggage entries the new baggage should contain\n */\nexport function createBaggage(\n entries: Record<string, BaggageEntry> = {}\n): Baggage {\n return new BaggageImpl(new Map(Object.entries(entries)));\n}\n\n/**\n * Create a serializable BaggageEntryMetadata object from a string.\n *\n * @param str string metadata. Format is currently not defined by the spec and has no special meaning.\n *\n */\nexport function baggageEntryMetadataFromString(\n str: string\n): BaggageEntryMetadata {\n if (typeof str !== 'string') {\n diag.error(\n `Cannot create baggage metadata from unknown type: ${typeof str}`\n );\n str = '';\n }\n\n return {\n __TYPE__: baggageEntryMetadataSymbol,\n toString() {\n return str;\n },\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from './types';\n\n/** Get a key to uniquely identify a context value */\nexport function createContextKey(description: string) {\n // The specification states that for the same input, multiple calls should\n // return different keys. Due to the nature of the JS dependency management\n // system, this creates problems where multiple versions of some package\n // could hold different keys for the same property.\n //\n // Therefore, we use Symbol.for which returns the same key for the same input.\n return Symbol.for(description);\n}\n\nclass BaseContext implements Context {\n private _currentContext!: Map<symbol, unknown>;\n\n /**\n * Construct a new context which inherits values from an optional parent context.\n *\n * @param parentContext a context from which to inherit values\n */\n constructor(parentContext?: Map<symbol, unknown>) {\n // for minification\n const self = this;\n\n self._currentContext = parentContext ? new Map(parentContext) : new Map();\n\n self.getValue = (key: symbol) => self._currentContext.get(key);\n\n self.setValue = (key: symbol, value: unknown): Context => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.set(key, value);\n return context;\n };\n\n self.deleteValue = (key: symbol): Context => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.delete(key);\n return context;\n };\n }\n\n /**\n * Get a value from the context.\n *\n * @param key key which identifies a context value\n */\n public getValue!: (key: symbol) => unknown;\n\n /**\n * Create a new context which inherits from this context and has\n * the given key set to the given value.\n *\n * @param key context key for which to set the value\n * @param value value to set for the given key\n */\n public setValue!: (key: symbol, value: unknown) => Context;\n\n /**\n * Return a new context which inherits from this context but does\n * not contain a value for the given key.\n *\n * @param key context key for which to clear a value\n */\n public deleteValue!: (key: symbol) => Context;\n}\n\n/** The root context is used as the default parent context when there is no active context */\nexport const ROOT_CONTEXT: Context = new BaseContext();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagLogger, DiagLogFunction } from './types';\n\ntype ConsoleMapKeys = 'error' | 'warn' | 'info' | 'debug' | 'trace';\nconst consoleMap: { n: keyof DiagLogger; c: ConsoleMapKeys }[] = [\n { n: 'error', c: 'error' },\n { n: 'warn', c: 'warn' },\n { n: 'info', c: 'info' },\n { n: 'debug', c: 'debug' },\n { n: 'verbose', c: 'trace' },\n];\n\n/**\n * A simple Immutable Console based diagnostic logger which will output any messages to the Console.\n * If you want to limit the amount of logging to a specific level or lower use the\n * {@link createLogLevelDiagLogger}\n */\nexport class DiagConsoleLogger implements DiagLogger {\n constructor() {\n function _consoleFunc(funcName: ConsoleMapKeys): DiagLogFunction {\n return function (...args) {\n if (console) {\n // Some environments only expose the console when the F12 developer console is open\n // eslint-disable-next-line no-console\n let theFunc = console[funcName];\n if (typeof theFunc !== 'function') {\n // Not all environments support all functions\n // eslint-disable-next-line no-console\n theFunc = console.log;\n }\n\n // One last final check\n if (typeof theFunc === 'function') {\n return theFunc.apply(console, args);\n }\n }\n };\n }\n\n for (let i = 0; i < consoleMap.length; i++) {\n this[consoleMap[i].n] = _consoleFunc(consoleMap[i].c);\n }\n }\n\n /** Log an error scenario that was not expected and caused the requested operation to fail. */\n public error!: DiagLogFunction;\n\n /**\n * Log a warning scenario to inform the developer of an issues that should be investigated.\n * The requested operation may or may not have succeeded or completed.\n */\n public warn!: DiagLogFunction;\n\n /**\n * Log a general informational message, this should not affect functionality.\n * This is also the default logging level so this should NOT be used for logging\n * debugging level information.\n */\n public info!: DiagLogFunction;\n\n /**\n * Log a general debug message that can be useful for identifying a failure.\n * Information logged at this level may include diagnostic details that would\n * help identify a failure scenario. Useful scenarios would be to log the execution\n * order of async operations\n */\n public debug!: DiagLogFunction;\n\n /**\n * Log a detailed (verbose) trace level logging that can be used to identify failures\n * where debug level logging would be insufficient, this level of tracing can include\n * input and output parameters and as such may include PII information passing through\n * the API. As such it is recommended that this level of tracing should not be enabled\n * in a production environment.\n */\n public verbose!: DiagLogFunction;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Meter } from './Meter';\nimport {\n BatchObservableCallback,\n Counter,\n Gauge,\n Histogram,\n MetricAttributes,\n MetricOptions,\n Observable,\n ObservableCallback,\n ObservableCounter,\n ObservableGauge,\n ObservableUpDownCounter,\n UpDownCounter,\n} from './Metric';\n\n/**\n * NoopMeter is a noop implementation of the {@link Meter} interface. It reuses\n * constant NoopMetrics for all of its methods.\n */\nexport class NoopMeter implements Meter {\n constructor() {}\n\n /**\n * @see {@link Meter.createGauge}\n */\n createGauge(_name: string, _options?: MetricOptions): Gauge {\n return NOOP_GAUGE_METRIC;\n }\n\n /**\n * @see {@link Meter.createHistogram}\n */\n createHistogram(_name: string, _options?: MetricOptions): Histogram {\n return NOOP_HISTOGRAM_METRIC;\n }\n\n /**\n * @see {@link Meter.createCounter}\n */\n createCounter(_name: string, _options?: MetricOptions): Counter {\n return NOOP_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.createUpDownCounter}\n */\n createUpDownCounter(_name: string, _options?: MetricOptions): UpDownCounter {\n return NOOP_UP_DOWN_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.createObservableGauge}\n */\n createObservableGauge(\n _name: string,\n _options?: MetricOptions\n ): ObservableGauge {\n return NOOP_OBSERVABLE_GAUGE_METRIC;\n }\n\n /**\n * @see {@link Meter.createObservableCounter}\n */\n createObservableCounter(\n _name: string,\n _options?: MetricOptions\n ): ObservableCounter {\n return NOOP_OBSERVABLE_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.createObservableUpDownCounter}\n */\n createObservableUpDownCounter(\n _name: string,\n _options?: MetricOptions\n ): ObservableUpDownCounter {\n return NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.addBatchObservableCallback}\n */\n addBatchObservableCallback(\n _callback: BatchObservableCallback,\n _observables: Observable[]\n ): void {}\n\n /**\n * @see {@link Meter.removeBatchObservableCallback}\n */\n removeBatchObservableCallback(_callback: BatchObservableCallback): void {}\n}\n\nexport class NoopMetric {}\n\nexport class NoopCounterMetric extends NoopMetric implements Counter {\n add(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopUpDownCounterMetric\n extends NoopMetric\n implements UpDownCounter\n{\n add(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopGaugeMetric extends NoopMetric implements Gauge {\n record(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopHistogramMetric extends NoopMetric implements Histogram {\n record(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopObservableMetric {\n addCallback(_callback: ObservableCallback) {}\n\n removeCallback(_callback: ObservableCallback) {}\n}\n\nexport class NoopObservableCounterMetric\n extends NoopObservableMetric\n implements ObservableCounter {}\n\nexport class NoopObservableGaugeMetric\n extends NoopObservableMetric\n implements ObservableGauge {}\n\nexport class NoopObservableUpDownCounterMetric\n extends NoopObservableMetric\n implements ObservableUpDownCounter {}\n\nexport const NOOP_METER = new NoopMeter();\n\n// Synchronous instruments\nexport const NOOP_COUNTER_METRIC = new NoopCounterMetric();\nexport const NOOP_GAUGE_METRIC = new NoopGaugeMetric();\nexport const NOOP_HISTOGRAM_METRIC = new NoopHistogramMetric();\nexport const NOOP_UP_DOWN_COUNTER_METRIC = new NoopUpDownCounterMetric();\n\n// Asynchronous instruments\nexport const NOOP_OBSERVABLE_COUNTER_METRIC = new NoopObservableCounterMetric();\nexport const NOOP_OBSERVABLE_GAUGE_METRIC = new NoopObservableGaugeMetric();\nexport const NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC =\n new NoopObservableUpDownCounterMetric();\n\n/**\n * Create a no-op Meter\n */\nexport function createNoopMeter(): Meter {\n return NOOP_METER;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Attributes, AttributeValue } from '../common/Attributes';\nimport { Context } from '../context/types';\nimport { BatchObservableResult, ObservableResult } from './ObservableResult';\n\n/**\n * Advisory options influencing aggregation configuration parameters.\n * @experimental\n */\nexport interface MetricAdvice {\n /**\n * Hint the explicit bucket boundaries for SDK if the metric is been\n * aggregated with a HistogramAggregator.\n */\n explicitBucketBoundaries?: number[];\n}\n\n/**\n * Options needed for metric creation\n */\nexport interface MetricOptions {\n /**\n * The description of the Metric.\n * @default ''\n */\n description?: string;\n\n /**\n * The unit of the Metric values.\n * @default ''\n */\n unit?: string;\n\n /**\n * Indicates the type of the recorded value.\n * @default {@link ValueType.DOUBLE}\n */\n valueType?: ValueType;\n\n /**\n * The advice influencing aggregation configuration parameters.\n * @experimental\n */\n advice?: MetricAdvice;\n}\n\n/** The Type of value. It describes how the data is reported. */\nexport enum ValueType {\n INT,\n DOUBLE,\n}\n\n/**\n * Counter is the most common synchronous instrument. This instrument supports\n * an `Add(increment)` function for reporting a sum, and is restricted to\n * non-negative increments. The default aggregation is Sum, as for any additive\n * instrument.\n *\n * Example uses for Counter:\n * <ol>\n * <li> count the number of bytes received. </li>\n * <li> count the number of requests completed. </li>\n * <li> count the number of accounts created. </li>\n * <li> count the number of checkpoints run. </li>\n * <li> count the number of 5xx errors. </li>\n * <ol>\n */\nexport interface Counter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Increment value of counter by the input. Inputs must not be negative.\n */\n add(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\nexport interface UpDownCounter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Increment value of counter by the input. Inputs may be negative.\n */\n add(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\nexport interface Gauge<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Records a measurement.\n */\n record(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\nexport interface Histogram<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Records a measurement. Value of the measurement must not be negative.\n */\n record(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\n/**\n * @deprecated please use {@link Attributes}\n */\nexport type MetricAttributes = Attributes;\n\n/**\n * @deprecated please use {@link AttributeValue}\n */\nexport type MetricAttributeValue = AttributeValue;\n\n/**\n * The observable callback for Observable instruments.\n */\nexport type ObservableCallback<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = (\n observableResult: ObservableResult<AttributesTypes>\n) => void | Promise<void>;\n\n/**\n * The observable callback for a batch of Observable instruments.\n */\nexport type BatchObservableCallback<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = (\n observableResult: BatchObservableResult<AttributesTypes>\n) => void | Promise<void>;\n\nexport interface Observable<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Sets up a function that will be called whenever a metric collection is initiated.\n *\n * If the function is already in the list of callbacks for this Observable, the function is not added a second time.\n */\n addCallback(callback: ObservableCallback<AttributesTypes>): void;\n\n /**\n * Removes a callback previously registered with {@link Observable.addCallback}.\n */\n removeCallback(callback: ObservableCallback<AttributesTypes>): void;\n}\n\nexport type ObservableCounter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = Observable<AttributesTypes>;\nexport type ObservableUpDownCounter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = Observable<AttributesTypes>;\nexport type ObservableGauge<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = Observable<AttributesTypes>;\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\n\n/**\n * Injects `Context` into and extracts it from carriers that travel\n * in-band across process boundaries. Encoding is expected to conform to the\n * HTTP Header Field semantics. Values are often encoded as RPC/HTTP request\n * headers.\n *\n * The carrier of propagated data on both the client (injector) and server\n * (extractor) side is usually an object such as http headers. Propagation is\n * usually implemented via library-specific request interceptors, where the\n * client-side injects values and the server-side extracts them.\n */\nexport interface TextMapPropagator<Carrier = any> {\n /**\n * Injects values from a given `Context` into a carrier.\n *\n * OpenTelemetry defines a common set of format values (TextMapPropagator),\n * and each has an expected `carrier` type.\n *\n * @param context the Context from which to extract values to transmit over\n * the wire.\n * @param carrier the carrier of propagation fields, such as http request\n * headers.\n * @param setter an optional {@link TextMapSetter}. If undefined, values will be\n * set by direct object assignment.\n */\n inject(\n context: Context,\n carrier: Carrier,\n setter: TextMapSetter<Carrier>\n ): void;\n\n /**\n * Given a `Context` and a carrier, extract context values from a\n * carrier and return a new context, created from the old context, with the\n * extracted values.\n *\n * @param context the Context from which to extract values to transmit over\n * the wire.\n * @param carrier the carrier of propagation fields, such as http request\n * headers.\n * @param getter an optional {@link TextMapGetter}. If undefined, keys will be all\n * own properties, and keys will be accessed by direct object access.\n */\n extract(\n context: Context,\n carrier: Carrier,\n getter: TextMapGetter<Carrier>\n ): Context;\n\n /**\n * Return a list of all fields which may be used by the propagator.\n */\n fields(): string[];\n}\n\n/**\n * A setter is specified by the caller to define a specific method\n * to set key/value pairs on the carrier within a propagator.\n */\nexport interface TextMapSetter<Carrier = any> {\n /**\n * Callback used to set a key/value pair on an object.\n *\n * Should be called by the propagator each time a key/value pair\n * should be set, and should set that key/value pair on the propagator.\n *\n * @param carrier object or class which carries key/value pairs\n * @param key string key to modify\n * @param value value to be set to the key on the carrier\n */\n set(carrier: Carrier, key: string, value: string): void;\n}\n\n/**\n * A getter is specified by the caller to define a specific method\n * to get the value of a key from a carrier.\n */\nexport interface TextMapGetter<Carrier = any> {\n /**\n * Get a list of all keys available on the carrier.\n *\n * @param carrier\n */\n keys(carrier: Carrier): string[];\n\n /**\n * Get the value of a specific key from the carrier.\n *\n * @param carrier\n * @param key\n */\n get(carrier: Carrier, key: string): undefined | string | string[];\n}\n\nexport const defaultTextMapGetter: TextMapGetter = {\n get(carrier, key) {\n if (carrier == null) {\n return undefined;\n }\n return carrier[key];\n },\n\n keys(carrier) {\n if (carrier == null) {\n return [];\n }\n return Object.keys(carrier);\n },\n};\n\nexport const defaultTextMapSetter: TextMapSetter = {\n set(carrier, key, value) {\n if (carrier == null) {\n return;\n }\n\n carrier[key] = value;\n },\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ROOT_CONTEXT } from './context';\nimport * as types from './types';\n\nexport class NoopContextManager implements types.ContextManager {\n active(): types.Context {\n return ROOT_CONTEXT;\n }\n\n with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n _context: types.Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n return fn.call(thisArg, ...args);\n }\n\n bind<T>(_context: types.Context, target: T): T {\n return target;\n }\n\n enable(): this {\n return this;\n }\n\n disable(): this {\n return this;\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NoopContextManager } from '../context/NoopContextManager';\nimport { Context, ContextManager } from '../context/types';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'context';\nconst NOOP_CONTEXT_MANAGER = new NoopContextManager();\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Context API\n */\nexport class ContextAPI {\n private static _instance?: ContextAPI;\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Context API */\n public static getInstance(): ContextAPI {\n if (!this._instance) {\n this._instance = new ContextAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current context manager.\n *\n * @returns true if the context manager was successfully registered, else false\n */\n public setGlobalContextManager(contextManager: ContextManager): boolean {\n return registerGlobal(API_NAME, contextManager, DiagAPI.instance());\n }\n\n /**\n * Get the currently active context\n */\n public active(): Context {\n return this._getContextManager().active();\n }\n\n /**\n * Execute a function with an active context\n *\n * @param context context to be active during function execution\n * @param fn function to execute in a context\n * @param thisArg optional receiver to be used for calling fn\n * @param args optional arguments forwarded to fn\n */\n public with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n return this._getContextManager().with(context, fn, thisArg, ...args);\n }\n\n /**\n * Bind a context to a target function or event emitter\n *\n * @param context context to bind to the event emitter or function. Defaults to the currently active context\n * @param target function or event emitter to bind\n */\n public bind<T>(context: Context, target: T): T {\n return this._getContextManager().bind(context, target);\n }\n\n private _getContextManager(): ContextManager {\n return getGlobal(API_NAME) || NOOP_CONTEXT_MANAGER;\n }\n\n /** Disable and remove the global context manager */\n public disable() {\n this._getContextManager().disable();\n unregisterGlobal(API_NAME, DiagAPI.instance());\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport enum TraceFlags {\n /** Represents no flag set. */\n NONE = 0x0,\n /** Bit to represent whether trace is sampled in trace flags. */\n SAMPLED = 0x1 << 0,\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SpanContext } from './span_context';\nimport { TraceFlags } from './trace_flags';\n\nexport const INVALID_SPANID = '0000000000000000';\nexport const INVALID_TRACEID = '00000000000000000000000000000000';\nexport const INVALID_SPAN_CONTEXT: SpanContext = {\n traceId: INVALID_TRACEID,\n spanId: INVALID_SPANID,\n traceFlags: TraceFlags.NONE,\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Exception } from '../common/Exception';\nimport { TimeInput } from '../common/Time';\nimport { SpanAttributes } from './attributes';\nimport { INVALID_SPAN_CONTEXT } from './invalid-span-constants';\nimport { Span } from './span';\nimport { SpanContext } from './span_context';\nimport { SpanStatus } from './status';\nimport { Link } from './link';\n\n/**\n * The NonRecordingSpan is the default {@link Span} that is used when no Span\n * implementation is available. All operations are no-op including context\n * propagation.\n */\nexport class NonRecordingSpan implements Span {\n constructor(\n private readonly _spanContext: SpanContext = INVALID_SPAN_CONTEXT\n ) {}\n\n // Returns a SpanContext.\n spanContext(): SpanContext {\n return this._spanContext;\n }\n\n // By default does nothing\n setAttribute(_key: string, _value: unknown): this {\n return this;\n }\n\n // By default does nothing\n setAttributes(_attributes: SpanAttributes): this {\n return this;\n }\n\n // By default does nothing\n addEvent(_name: string, _attributes?: SpanAttributes): this {\n return this;\n }\n\n addLink(_link: Link): this {\n return this;\n }\n\n addLinks(_links: Link[]): this {\n return this;\n }\n\n // By default does nothing\n setStatus(_status: SpanStatus): this {\n return this;\n }\n\n // By default does nothing\n updateName(_name: string): this {\n return this;\n }\n\n // By default does nothing\n end(_endTime?: TimeInput): void {}\n\n // isRecording always returns false for NonRecordingSpan.\n isRecording(): boolean {\n return false;\n }\n\n // By default does nothing\n recordException(_exception: Exception, _time?: TimeInput): void {}\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createContextKey } from '../context/context';\nimport { Context } from '../context/types';\nimport { Span } from './span';\nimport { SpanContext } from './span_context';\nimport { NonRecordingSpan } from './NonRecordingSpan';\nimport { ContextAPI } from '../api/context';\n\n/**\n * span key\n */\nconst SPAN_KEY = createContextKey('OpenTelemetry Context Key SPAN');\n\n/**\n * Return the span if one exists\n *\n * @param context context to get span from\n */\nexport function getSpan(context: Context): Span | undefined {\n return (context.getValue(SPAN_KEY) as Span) || undefined;\n}\n\n/**\n * Gets the span from the current context, if one exists.\n */\nexport function getActiveSpan(): Span | undefined {\n return getSpan(ContextAPI.getInstance().active());\n}\n\n/**\n * Set the span on a context\n *\n * @param context context to use as parent\n * @param span span to set active\n */\nexport function setSpan(context: Context, span: Span): Context {\n return context.setValue(SPAN_KEY, span);\n}\n\n/**\n * Remove current span stored in the context\n *\n * @param context context to delete span from\n */\nexport function deleteSpan(context: Context): Context {\n return context.deleteValue(SPAN_KEY);\n}\n\n/**\n * Wrap span context in a NoopSpan and set as span in a new\n * context\n *\n * @param context context to set active span on\n * @param spanContext span context to be wrapped\n */\nexport function setSpanContext(\n context: Context,\n spanContext: SpanContext\n): Context {\n return setSpan(context, new NonRecordingSpan(spanContext));\n}\n\n/**\n * Get the span context of the span if it exists.\n *\n * @param context context to get values from\n */\nexport function getSpanContext(context: Context): SpanContext | undefined {\n return getSpan(context)?.spanContext();\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { INVALID_SPANID, INVALID_TRACEID } from './invalid-span-constants';\nimport { NonRecordingSpan } from './NonRecordingSpan';\nimport { Span } from './span';\nimport { SpanContext } from './span_context';\n\nconst VALID_TRACEID_REGEX = /^([0-9a-f]{32})$/i;\nconst VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i;\n\nexport function isValidTraceId(traceId: string): boolean {\n return VALID_TRACEID_REGEX.test(traceId) && traceId !== INVALID_TRACEID;\n}\n\nexport function isValidSpanId(spanId: string): boolean {\n return VALID_SPANID_REGEX.test(spanId) && spanId !== INVALID_SPANID;\n}\n\n/**\n * Returns true if this {@link SpanContext} is valid.\n * @return true if this {@link SpanContext} is valid.\n */\nexport function isSpanContextValid(spanContext: SpanContext): boolean {\n return (\n isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId)\n );\n}\n\n/**\n * Wrap the given {@link SpanContext} in a new non-recording {@link Span}\n *\n * @param spanContext span context to be wrapped\n * @returns a new non-recording {@link Span} with the provided context\n */\nexport function wrapSpanContext(spanContext: SpanContext): Span {\n return new NonRecordingSpan(spanContext);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ContextAPI } from '../api/context';\nimport { Context } from '../context/types';\nimport { getSpanContext, setSpan } from '../trace/context-utils';\nimport { NonRecordingSpan } from './NonRecordingSpan';\nimport { Span } from './span';\nimport { isSpanContextValid } from './spancontext-utils';\nimport { SpanOptions } from './SpanOptions';\nimport { SpanContext } from './span_context';\nimport { Tracer } from './tracer';\n\nconst contextApi = ContextAPI.getInstance();\n\n/**\n * No-op implementations of {@link Tracer}.\n */\nexport class NoopTracer implements Tracer {\n // startSpan starts a noop span.\n startSpan(\n name: string,\n options?: SpanOptions,\n context = contextApi.active()\n ): Span {\n const root = Boolean(options?.root);\n if (root) {\n return new NonRecordingSpan();\n }\n\n const parentFromContext = context && getSpanContext(context);\n\n if (\n isSpanContext(parentFromContext) &&\n isSpanContextValid(parentFromContext)\n ) {\n return new NonRecordingSpan(parentFromContext);\n } else {\n return new NonRecordingSpan();\n }\n }\n\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n fn: F\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n opts: SpanOptions | undefined,\n fn: F\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n opts: SpanOptions | undefined,\n ctx: Context | undefined,\n fn: F\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n arg2?: F | SpanOptions,\n arg3?: F | Context,\n arg4?: F\n ): ReturnType<F> | undefined {\n let opts: SpanOptions | undefined;\n let ctx: Context | undefined;\n let fn: F;\n\n if (arguments.length < 2) {\n return;\n } else if (arguments.length === 2) {\n fn = arg2 as F;\n } else if (arguments.length === 3) {\n opts = arg2 as SpanOptions | undefined;\n fn = arg3 as F;\n } else {\n opts = arg2 as SpanOptions | undefined;\n ctx = arg3 as Context | undefined;\n fn = arg4 as F;\n }\n\n const parentContext = ctx ?? contextApi.active();\n const span = this.startSpan(name, opts, parentContext);\n const contextWithSpanSet = setSpan(parentContext, span);\n\n return contextApi.with(contextWithSpanSet, fn, undefined, span);\n }\n}\n\nfunction isSpanContext(spanContext: any): spanContext is SpanContext {\n return (\n typeof spanContext === 'object' &&\n typeof spanContext['spanId'] === 'string' &&\n typeof spanContext['traceId'] === 'string' &&\n typeof spanContext['traceFlags'] === 'number'\n );\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\nimport { NoopTracer } from './NoopTracer';\nimport { Span } from './span';\nimport { SpanOptions } from './SpanOptions';\nimport { Tracer } from './tracer';\nimport { TracerOptions } from './tracer_options';\n\nconst NOOP_TRACER = new NoopTracer();\n\n/**\n * Proxy tracer provided by the proxy tracer provider\n */\nexport class ProxyTracer implements Tracer {\n // When a real implementation is provided, this will be it\n private _delegate?: Tracer;\n\n constructor(\n private _provider: TracerDelegator,\n public readonly name: string,\n public readonly version?: string,\n public readonly options?: TracerOptions\n ) {}\n\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n return this._getTracer().startSpan(name, options, context);\n }\n\n startActiveSpan<F extends (span: Span) => unknown>(\n _name: string,\n _options: F | SpanOptions,\n _context?: F | Context,\n _fn?: F\n ): ReturnType<F> {\n const tracer = this._getTracer();\n return Reflect.apply(tracer.startActiveSpan, tracer, arguments);\n }\n\n /**\n * Try to get a tracer from the proxy tracer provider.\n * If the proxy tracer provider has no delegate, return a noop tracer.\n */\n private _getTracer() {\n if (this._delegate) {\n return this._delegate;\n }\n\n const tracer = this._provider.getDelegateTracer(\n this.name,\n this.version,\n this.options\n );\n\n if (!tracer) {\n return NOOP_TRACER;\n }\n\n this._delegate = tracer;\n return this._delegate;\n }\n}\n\nexport interface TracerDelegator {\n getDelegateTracer(\n name: string,\n version?: string,\n options?: TracerOptions\n ): Tracer | undefined;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NoopTracer } from './NoopTracer';\nimport { Tracer } from './tracer';\nimport { TracerOptions } from './tracer_options';\nimport { TracerProvider } from './tracer_provider';\n\n/**\n * An implementation of the {@link TracerProvider} which returns an impotent\n * Tracer for all calls to `getTracer`.\n *\n * All operations are no-op.\n */\nexport class NoopTracerProvider implements TracerProvider {\n getTracer(\n _name?: string,\n _version?: string,\n _options?: TracerOptions\n ): Tracer {\n return new NoopTracer();\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Tracer } from './tracer';\nimport { TracerProvider } from './tracer_provider';\nimport { ProxyTracer } from './ProxyTracer';\nimport { NoopTracerProvider } from './NoopTracerProvider';\nimport { TracerOptions } from './tracer_options';\n\nconst NOOP_TRACER_PROVIDER = new NoopTracerProvider();\n\n/**\n * Tracer provider which provides {@link ProxyTracer}s.\n *\n * Before a delegate is set, tracers provided are NoOp.\n * When a delegate is set, traces are provided from the delegate.\n * When a delegate is set after tracers have already been provided,\n * all tracers already provided will use the provided delegate implementation.\n */\nexport class ProxyTracerProvider implements TracerProvider {\n private _delegate?: TracerProvider;\n\n /**\n * Get a {@link ProxyTracer}\n */\n getTracer(name: string, version?: string, options?: TracerOptions): Tracer {\n return (\n this.getDelegateTracer(name, version, options) ??\n new ProxyTracer(this, name, version, options)\n );\n }\n\n getDelegate(): TracerProvider {\n return this._delegate ?? NOOP_TRACER_PROVIDER;\n }\n\n /**\n * Set the delegate tracer provider\n */\n setDelegate(delegate: TracerProvider) {\n this._delegate = delegate;\n }\n\n getDelegateTracer(\n name: string,\n version?: string,\n options?: TracerOptions\n ): Tracer | undefined {\n return this._delegate?.getTracer(name, version, options);\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SpanAttributes } from './attributes';\nimport { TraceState } from './trace_state';\n\n/**\n * @deprecated use the one declared in @opentelemetry/sdk-trace-base instead.\n * A sampling decision that determines how a {@link Span} will be recorded\n * and collected.\n */\nexport enum SamplingDecision {\n /**\n * `Span.isRecording() === false`, span will not be recorded and all events\n * and attributes will be dropped.\n */\n NOT_RECORD,\n /**\n * `Span.isRecording() === true`, but `Sampled` flag in {@link TraceFlags}\n * MUST NOT be set.\n */\n RECORD,\n /**\n * `Span.isRecording() === true` AND `Sampled` flag in {@link TraceFlags}\n * MUST be set.\n */\n RECORD_AND_SAMPLED,\n}\n\n/**\n * @deprecated use the one declared in @opentelemetry/sdk-trace-base instead.\n * A sampling result contains a decision for a {@link Span} and additional\n * attributes the sampler would like to added to the Span.\n */\nexport interface SamplingResult {\n /**\n * A sampling decision, refer to {@link SamplingDecision} for details.\n */\n decision: SamplingDecision;\n /**\n * The list of attributes returned by SamplingResult MUST be immutable.\n * Caller may call {@link Sampler}.shouldSample any number of times and\n * can safely cache the returned value.\n */\n attributes?: Readonly<SpanAttributes>;\n /**\n * A {@link TraceState} that will be associated with the {@link Span} through\n * the new {@link SpanContext}. Samplers SHOULD return the TraceState from\n * the passed-in {@link Context} if they do not intend to change it. Leaving\n * the value undefined will also leave the TraceState unchanged.\n */\n traceState?: TraceState;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport enum SpanKind {\n /** Default value. Indicates that the span is used internally. */\n INTERNAL = 0,\n\n /**\n * Indicates that the span covers server-side handling of an RPC or other\n * remote request.\n */\n SERVER = 1,\n\n /**\n * Indicates that the span covers the client-side wrapper around an RPC or\n * other remote request.\n */\n CLIENT = 2,\n\n /**\n * Indicates that the span describes producer sending a message to a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n PRODUCER = 3,\n\n /**\n * Indicates that the span describes consumer receiving a message from a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n CONSUMER = 4,\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport interface SpanStatus {\n /** The status code of this message. */\n code: SpanStatusCode;\n /** A developer-facing error message. */\n message?: string;\n}\n\n/**\n * An enumeration of status codes.\n */\nexport enum SpanStatusCode {\n /**\n * The default status.\n */\n UNSET = 0,\n /**\n * The operation has been validated by an Application developer or\n * Operator to have completed successfully.\n */\n OK = 1,\n /**\n * The operation contains an error.\n */\n ERROR = 2,\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst VALID_KEY_CHAR_RANGE = '[_0-9a-z-*/]';\nconst VALID_KEY = `[a-z]${VALID_KEY_CHAR_RANGE}{0,255}`;\nconst VALID_VENDOR_KEY = `[a-z0-9]${VALID_KEY_CHAR_RANGE}{0,240}@[a-z]${VALID_KEY_CHAR_RANGE}{0,13}`;\nconst VALID_KEY_REGEX = new RegExp(`^(?:${VALID_KEY}|${VALID_VENDOR_KEY})$`);\nconst VALID_VALUE_BASE_REGEX = /^[ -~]{0,255}[!-~]$/;\nconst INVALID_VALUE_COMMA_EQUAL_REGEX = /,|=/;\n\n/**\n * Key is opaque string up to 256 characters printable. It MUST begin with a\n * lowercase letter, and can only contain lowercase letters a-z, digits 0-9,\n * underscores _, dashes -, asterisks *, and forward slashes /.\n * For multi-tenant vendor scenarios, an at sign (@) can be used to prefix the\n * vendor name. Vendors SHOULD set the tenant ID at the beginning of the key.\n * see https://www.w3.org/TR/trace-context/#key\n */\nexport function validateKey(key: string): boolean {\n return VALID_KEY_REGEX.test(key);\n}\n\n/**\n * Value is opaque string up to 256 characters printable ASCII RFC0020\n * characters (i.e., the range 0x20 to 0x7E) except comma , and =.\n */\nexport function validateValue(value: string): boolean {\n return (\n VALID_VALUE_BASE_REGEX.test(value) &&\n !INVALID_VALUE_COMMA_EQUAL_REGEX.test(value)\n );\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TraceState } from '../trace_state';\nimport { validateKey, validateValue } from './tracestate-validators';\n\nconst MAX_TRACE_STATE_ITEMS = 32;\nconst MAX_TRACE_STATE_LEN = 512;\nconst LIST_MEMBERS_SEPARATOR = ',';\nconst LIST_MEMBER_KEY_VALUE_SPLITTER = '=';\n\n/**\n * TraceState must be a class and not a simple object type because of the spec\n * requirement (https://www.w3.org/TR/trace-context/#tracestate-field).\n *\n * Here is the list of allowed mutations:\n * - New key-value pair should be added into the beginning of the list\n * - The value of any key can be updated. Modified keys MUST be moved to the\n * beginning of the list.\n */\nexport class TraceStateImpl implements TraceState {\n private _internalState: Map<string, string> = new Map();\n\n constructor(rawTraceState?: string) {\n if (rawTraceState) this._parse(rawTraceState);\n }\n\n set(key: string, value: string): TraceStateImpl {\n // TODO: Benchmark the different approaches(map vs list) and\n // use the faster one.\n const traceState = this._clone();\n if (traceState._internalState.has(key)) {\n traceState._internalState.delete(key);\n }\n traceState._internalState.set(key, value);\n return traceState;\n }\n\n unset(key: string): TraceStateImpl {\n const traceState = this._clone();\n traceState._internalState.delete(key);\n return traceState;\n }\n\n get(key: string): string | undefined {\n return this._internalState.get(key);\n }\n\n serialize(): string {\n return this._keys()\n .reduce((agg: string[], key) => {\n agg.push(key + LIST_MEMBER_KEY_VALUE_SPLITTER + this.get(key));\n return agg;\n }, [])\n .join(LIST_MEMBERS_SEPARATOR);\n }\n\n private _parse(rawTraceState: string) {\n if (rawTraceState.length > MAX_TRACE_STATE_LEN) return;\n this._internalState = rawTraceState\n .split(LIST_MEMBERS_SEPARATOR)\n .reverse() // Store in reverse so new keys (.set(...)) will be placed at the beginning\n .reduce((agg: Map<string, string>, part: string) => {\n const listMember = part.trim(); // Optional Whitespace (OWS) handling\n const i = listMember.indexOf(LIST_MEMBER_KEY_VALUE_SPLITTER);\n if (i !== -1) {\n const key = listMember.slice(0, i);\n const value = listMember.slice(i + 1, part.length);\n if (validateKey(key) && validateValue(value)) {\n agg.set(key, value);\n } else {\n // TODO: Consider to add warning log\n }\n }\n return agg;\n }, new Map());\n\n // Because of the reverse() requirement, trunc must be done after map is created\n if (this._internalState.size > MAX_TRACE_STATE_ITEMS) {\n this._internalState = new Map(\n Array.from(this._internalState.entries())\n .reverse() // Use reverse same as original tracestate parse chain\n .slice(0, MAX_TRACE_STATE_ITEMS)\n );\n }\n }\n\n private _keys(): string[] {\n return Array.from(this._internalState.keys()).reverse();\n }\n\n private _clone(): TraceStateImpl {\n const traceState = new TraceStateImpl();\n traceState._internalState = new Map(this._internalState);\n return traceState;\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TraceState } from '../trace_state';\nimport { TraceStateImpl } from './tracestate-impl';\n\nexport function createTraceState(rawTraceState?: string): TraceState {\n return new TraceStateImpl(rawTraceState);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { ContextAPI } from './api/context';\n/** Entrypoint for context API */\nexport const context = ContextAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { DiagAPI } from './api/diag';\n/**\n * Entrypoint for Diag API.\n * Defines Diagnostic handler used for internal diagnostic logging operations.\n * The default provides a Noop DiagLogger implementation which may be changed via the\n * diag.setLogger(logger: DiagLogger) function.\n */\nexport const diag = DiagAPI.instance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Meter, MeterOptions } from './Meter';\nimport { MeterProvider } from './MeterProvider';\nimport { NOOP_METER } from './NoopMeter';\n\n/**\n * An implementation of the {@link MeterProvider} which returns an impotent Meter\n * for all calls to `getMeter`\n */\nexport class NoopMeterProvider implements MeterProvider {\n getMeter(_name: string, _version?: string, _options?: MeterOptions): Meter {\n return NOOP_METER;\n }\n}\n\nexport const NOOP_METER_PROVIDER = new NoopMeterProvider();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Meter, MeterOptions } from '../metrics/Meter';\nimport { MeterProvider } from '../metrics/MeterProvider';\nimport { NOOP_METER_PROVIDER } from '../metrics/NoopMeterProvider';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'metrics';\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Metrics API\n */\nexport class MetricsAPI {\n private static _instance?: MetricsAPI;\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Metrics API */\n public static getInstance(): MetricsAPI {\n if (!this._instance) {\n this._instance = new MetricsAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current global meter provider.\n * Returns true if the meter provider was successfully registered, else false.\n */\n public setGlobalMeterProvider(provider: MeterProvider): boolean {\n return registerGlobal(API_NAME, provider, DiagAPI.instance());\n }\n\n /**\n * Returns the global meter provider.\n */\n public getMeterProvider(): MeterProvider {\n return getGlobal(API_NAME) || NOOP_METER_PROVIDER;\n }\n\n /**\n * Returns a meter from the global meter provider.\n */\n public getMeter(\n name: string,\n version?: string,\n options?: MeterOptions\n ): Meter {\n return this.getMeterProvider().getMeter(name, version, options);\n }\n\n /** Remove the global meter provider */\n public disable(): void {\n unregisterGlobal(API_NAME, DiagAPI.instance());\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { MetricsAPI } from './api/metrics';\n/** Entrypoint for metrics API */\nexport const metrics = MetricsAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\nimport { TextMapPropagator } from './TextMapPropagator';\n\n/**\n * No-op implementations of {@link TextMapPropagator}.\n */\nexport class NoopTextMapPropagator implements TextMapPropagator {\n /** Noop inject function does nothing */\n inject(_context: Context, _carrier: unknown): void {}\n /** Noop extract function does nothing and returns the input context */\n extract(context: Context, _carrier: unknown): Context {\n return context;\n }\n fields(): string[] {\n return [];\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ContextAPI } from '../api/context';\nimport { createContextKey } from '../context/context';\nimport { Context } from '../context/types';\nimport { Baggage } from './types';\n\n/**\n * Baggage key\n */\nconst BAGGAGE_KEY = createContextKey('OpenTelemetry Baggage Key');\n\n/**\n * Retrieve the current baggage from the given context\n *\n * @param {Context} Context that manage all context values\n * @returns {Baggage} Extracted baggage from the context\n */\nexport function getBaggage(context: Context): Baggage | undefined {\n return (context.getValue(BAGGAGE_KEY) as Baggage) || undefined;\n}\n\n/**\n * Retrieve the current baggage from the active/current context\n *\n * @returns {Baggage} Extracted baggage from the context\n */\nexport function getActiveBaggage(): Baggage | undefined {\n return getBaggage(ContextAPI.getInstance().active());\n}\n\n/**\n * Store a baggage in the given context\n *\n * @param {Context} Context that manage all context values\n * @param {Baggage} baggage that will be set in the actual context\n */\nexport function setBaggage(context: Context, baggage: Baggage): Context {\n return context.setValue(BAGGAGE_KEY, baggage);\n}\n\n/**\n * Delete the baggage stored in the given context\n *\n * @param {Context} Context that manage all context values\n */\nexport function deleteBaggage(context: Context): Context {\n return context.deleteValue(BAGGAGE_KEY);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { NoopTextMapPropagator } from '../propagation/NoopTextMapPropagator';\nimport {\n defaultTextMapGetter,\n defaultTextMapSetter,\n TextMapGetter,\n TextMapPropagator,\n TextMapSetter,\n} from '../propagation/TextMapPropagator';\nimport {\n getBaggage,\n getActiveBaggage,\n setBaggage,\n deleteBaggage,\n} from '../baggage/context-helpers';\nimport { createBaggage } from '../baggage/utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'propagation';\nconst NOOP_TEXT_MAP_PROPAGATOR = new NoopTextMapPropagator();\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Propagation API\n */\nexport class PropagationAPI {\n private static _instance?: PropagationAPI;\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Propagator API */\n public static getInstance(): PropagationAPI {\n if (!this._instance) {\n this._instance = new PropagationAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current propagator.\n *\n * @returns true if the propagator was successfully registered, else false\n */\n public setGlobalPropagator(propagator: TextMapPropagator): boolean {\n return registerGlobal(API_NAME, propagator, DiagAPI.instance());\n }\n\n /**\n * Inject context into a carrier to be propagated inter-process\n *\n * @param context Context carrying tracing data to inject\n * @param carrier carrier to inject context into\n * @param setter Function used to set values on the carrier\n */\n public inject<Carrier>(\n context: Context,\n carrier: Carrier,\n setter: TextMapSetter<Carrier> = defaultTextMapSetter\n ): void {\n return this._getGlobalPropagator().inject(context, carrier, setter);\n }\n\n /**\n * Extract context from a carrier\n *\n * @param context Context which the newly created context will inherit from\n * @param carrier Carrier to extract context from\n * @param getter Function used to extract keys from a carrier\n */\n public extract<Carrier>(\n context: Context,\n carrier: Carrier,\n getter: TextMapGetter<Carrier> = defaultTextMapGetter\n ): Context {\n return this._getGlobalPropagator().extract(context, carrier, getter);\n }\n\n /**\n * Return a list of all fields which may be used by the propagator.\n */\n public fields(): string[] {\n return this._getGlobalPropagator().fields();\n }\n\n /** Remove the global propagator */\n public disable() {\n unregisterGlobal(API_NAME, DiagAPI.instance());\n }\n\n public createBaggage = createBaggage;\n\n public getBaggage = getBaggage;\n\n public getActiveBaggage = getActiveBaggage;\n\n public setBaggage = setBaggage;\n\n public deleteBaggage = deleteBaggage;\n\n private _getGlobalPropagator(): TextMapPropagator {\n return getGlobal(API_NAME) || NOOP_TEXT_MAP_PROPAGATOR;\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { PropagationAPI } from './api/propagation';\n/** Entrypoint for propagation API */\nexport const propagation = PropagationAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { ProxyTracerProvider } from '../trace/ProxyTracerProvider';\nimport {\n isSpanContextValid,\n wrapSpanContext,\n} from '../trace/spancontext-utils';\nimport { Tracer } from '../trace/tracer';\nimport { TracerProvider } from '../trace/tracer_provider';\nimport {\n deleteSpan,\n getActiveSpan,\n getSpan,\n getSpanContext,\n setSpan,\n setSpanContext,\n} from '../trace/context-utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'trace';\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Tracing API\n */\nexport class TraceAPI {\n private static _instance?: TraceAPI;\n\n private _proxyTracerProvider = new ProxyTracerProvider();\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Trace API */\n public static getInstance(): TraceAPI {\n if (!this._instance) {\n this._instance = new TraceAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current global tracer.\n *\n * @returns true if the tracer provider was successfully registered, else false\n */\n public setGlobalTracerProvider(provider: TracerProvider): boolean {\n const success = registerGlobal(\n API_NAME,\n this._proxyTracerProvider,\n DiagAPI.instance()\n );\n if (success) {\n this._proxyTracerProvider.setDelegate(provider);\n }\n return success;\n }\n\n /**\n * Returns the global tracer provider.\n */\n public getTracerProvider(): TracerProvider {\n return getGlobal(API_NAME) || this._proxyTracerProvider;\n }\n\n /**\n * Returns a tracer from the global tracer provider.\n */\n public getTracer(name: string, version?: string): Tracer {\n return this.getTracerProvider().getTracer(name, version);\n }\n\n /** Remove the global tracer provider */\n public disable() {\n unregisterGlobal(API_NAME, DiagAPI.instance());\n this._proxyTracerProvider = new ProxyTracerProvider();\n }\n\n public wrapSpanContext = wrapSpanContext;\n\n public isSpanContextValid = isSpanContextValid;\n\n public deleteSpan = deleteSpan;\n\n public getSpan = getSpan;\n\n public getActiveSpan = getActiveSpan;\n\n public getSpanContext = getSpanContext;\n\n public setSpan = setSpan;\n\n public setSpanContext = setSpanContext;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { TraceAPI } from './api/trace';\n/** Entrypoint for trace API */\nexport const trace = TraceAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { BaggageEntry, BaggageEntryMetadata, Baggage } from './baggage/types';\nexport { baggageEntryMetadataFromString } from './baggage/utils';\nexport { Exception } from './common/Exception';\nexport { HrTime, TimeInput } from './common/Time';\nexport { Attributes, AttributeValue } from './common/Attributes';\n\n// Context APIs\nexport { createContextKey, ROOT_CONTEXT } from './context/context';\nexport { Context, ContextManager } from './context/types';\nexport type { ContextAPI } from './api/context';\n\n// Diag APIs\nexport { DiagConsoleLogger } from './diag/consoleLogger';\nexport {\n DiagLogFunction,\n DiagLogger,\n DiagLogLevel,\n ComponentLoggerOptions,\n DiagLoggerOptions,\n} from './diag/types';\nexport type { DiagAPI } from './api/diag';\n\n// Metrics APIs\nexport { createNoopMeter } from './metrics/NoopMeter';\nexport { MeterOptions, Meter } from './metrics/Meter';\nexport { MeterProvider } from './metrics/MeterProvider';\nexport {\n ValueType,\n Counter,\n Gauge,\n Histogram,\n MetricOptions,\n Observable,\n ObservableCounter,\n ObservableGauge,\n ObservableUpDownCounter,\n UpDownCounter,\n BatchObservableCallback,\n MetricAdvice,\n MetricAttributes,\n MetricAttributeValue,\n ObservableCallback,\n} from './metrics/Metric';\nexport {\n BatchObservableResult,\n ObservableResult,\n} from './metrics/ObservableResult';\nexport type { MetricsAPI } from './api/metrics';\n\n// Propagation APIs\nexport {\n TextMapPropagator,\n TextMapSetter,\n TextMapGetter,\n defaultTextMapGetter,\n defaultTextMapSetter,\n} from './propagation/TextMapPropagator';\nexport type { PropagationAPI } from './api/propagation';\n\n// Trace APIs\nexport { SpanAttributes, SpanAttributeValue } from './trace/attributes';\nexport { Link } from './trace/link';\nexport { ProxyTracer, TracerDelegator } from './trace/ProxyTracer';\nexport { ProxyTracerProvider } from './trace/ProxyTracerProvider';\nexport { Sampler } from './trace/Sampler';\nexport { SamplingDecision, SamplingResult } from './trace/SamplingResult';\nexport { SpanContext } from './trace/span_context';\nexport { SpanKind } from './trace/span_kind';\nexport { Span } from './trace/span';\nexport { SpanOptions } from './trace/SpanOptions';\nexport { SpanStatus, SpanStatusCode } from './trace/status';\nexport { TraceFlags } from './trace/trace_flags';\nexport { TraceState } from './trace/trace_state';\nexport { createTraceState } from './trace/internal/utils';\nexport { TracerProvider } from './trace/tracer_provider';\nexport { Tracer } from './trace/tracer';\nexport { TracerOptions } from './trace/tracer_options';\nexport {\n isSpanContextValid,\n isValidTraceId,\n isValidSpanId,\n} from './trace/spancontext-utils';\nexport {\n INVALID_SPANID,\n INVALID_TRACEID,\n INVALID_SPAN_CONTEXT,\n} from './trace/invalid-span-constants';\nexport type { TraceAPI } from './api/trace';\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { context } from './context-api';\nimport { diag } from './diag-api';\nimport { metrics } from './metrics-api';\nimport { propagation } from './propagation-api';\nimport { trace } from './trace-api';\n\n// Named export.\nexport { context, diag, metrics, propagation, trace };\n// Default export.\nexport default {\n context,\n diag,\n metrics,\n propagation,\n trace,\n};\n","'use strict';\n\nconst OtelApi = require('@opentelemetry/api');\nconst Counter = require('../counter');\n\nconst PROCESS_CPU_USER_SECONDS = 'process_cpu_user_seconds_total';\nconst PROCESS_CPU_SYSTEM_SECONDS = 'process_cpu_system_seconds_total';\nconst PROCESS_CPU_SECONDS = 'process_cpu_seconds_total';\n\nmodule.exports = (registry, config = {}) => {\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst exemplars = config.enableExemplars ? config.enableExemplars : false;\n\tconst labelNames = Object.keys(labels);\n\n\tlet lastCpuUsage = process.cpuUsage();\n\n\tconst cpuUserUsageCounter = new Counter({\n\t\tname: namePrefix + PROCESS_CPU_USER_SECONDS,\n\t\thelp: 'Total user CPU time spent in seconds.',\n\t\tenableExemplars: exemplars,\n\t\tregisters,\n\t\tlabelNames,\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect() {\n\t\t\tconst cpuUsage = process.cpuUsage();\n\n\t\t\tconst userUsageMicros = cpuUsage.user - lastCpuUsage.user;\n\t\t\tconst systemUsageMicros = cpuUsage.system - lastCpuUsage.system;\n\n\t\t\tlastCpuUsage = cpuUsage;\n\n\t\t\tif (this.enableExemplars) {\n\t\t\t\tlet exemplarLabels = {};\n\t\t\t\tconst currentSpan = OtelApi.trace.getSpan(OtelApi.context.active());\n\t\t\t\tif (currentSpan) {\n\t\t\t\t\texemplarLabels = {\n\t\t\t\t\t\ttraceId: currentSpan.spanContext().traceId,\n\t\t\t\t\t\tspanId: currentSpan.spanContext().spanId,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcpuUserUsageCounter.inc({\n\t\t\t\t\tlabels,\n\t\t\t\t\tvalue: userUsageMicros / 1e6,\n\t\t\t\t\texemplarLabels,\n\t\t\t\t});\n\t\t\t\tcpuSystemUsageCounter.inc({\n\t\t\t\t\tlabels,\n\t\t\t\t\tvalue: systemUsageMicros / 1e6,\n\t\t\t\t\texemplarLabels,\n\t\t\t\t});\n\t\t\t\tcpuUsageCounter.inc({\n\t\t\t\t\tlabels,\n\t\t\t\t\tvalue: (userUsageMicros + systemUsageMicros) / 1e6,\n\t\t\t\t\texemplarLabels,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tcpuUserUsageCounter.inc(labels, userUsageMicros / 1e6);\n\t\t\t\tcpuSystemUsageCounter.inc(labels, systemUsageMicros / 1e6);\n\t\t\t\tcpuUsageCounter.inc(\n\t\t\t\t\tlabels,\n\t\t\t\t\t(userUsageMicros + systemUsageMicros) / 1e6,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t});\n\tconst cpuSystemUsageCounter = new Counter({\n\t\tname: namePrefix + PROCESS_CPU_SYSTEM_SECONDS,\n\t\thelp: 'Total system CPU time spent in seconds.',\n\t\tenableExemplars: exemplars,\n\t\tregisters,\n\t\tlabelNames,\n\t});\n\tconst cpuUsageCounter = new Counter({\n\t\tname: namePrefix + PROCESS_CPU_SECONDS,\n\t\thelp: 'Total user and system CPU time spent in seconds.',\n\t\tenableExemplars: exemplars,\n\t\tregisters,\n\t\tlabelNames,\n\t});\n};\n\nmodule.exports.metricNames = [\n\tPROCESS_CPU_USER_SECONDS,\n\tPROCESS_CPU_SYSTEM_SECONDS,\n\tPROCESS_CPU_SECONDS,\n];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst startInSeconds = Math.round(Date.now() / 1000 - process.uptime());\n\nconst PROCESS_START_TIME = 'process_start_time_seconds';\n\nmodule.exports = (registry, config = {}) => {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_START_TIME,\n\t\thelp: 'Start time of the process since unix epoch in seconds.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\taggregator: 'omit',\n\t\tcollect() {\n\t\t\tthis.set(labels, startInSeconds);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [PROCESS_START_TIME];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst fs = require('fs');\n\nconst values = ['VmSize', 'VmRSS', 'VmData'];\n\nconst PROCESS_RESIDENT_MEMORY = 'process_resident_memory_bytes';\nconst PROCESS_VIRTUAL_MEMORY = 'process_virtual_memory_bytes';\nconst PROCESS_HEAP = 'process_heap_bytes';\n\nfunction structureOutput(input) {\n\treturn input.split('\\n').reduce((acc, string) => {\n\t\tif (!values.some(value => string.startsWith(value))) {\n\t\t\treturn acc;\n\t\t}\n\n\t\tconst split = string.split(':');\n\n\t\t// Get the value\n\t\tlet value = split[1].trim();\n\t\t// Remove trailing ` kb`\n\t\tvalue = value.substr(0, value.length - 3);\n\t\t// Make it into a number in bytes bytes\n\t\tvalue = Number(value) * 1024;\n\n\t\tacc[split[0]] = value;\n\n\t\treturn acc;\n\t}, {});\n}\n\nmodule.exports = (registry, config = {}) => {\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tconst residentMemGauge = new Gauge({\n\t\tname: namePrefix + PROCESS_RESIDENT_MEMORY,\n\t\thelp: 'Resident memory size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect() {\n\t\t\ttry {\n\t\t\t\t// Sync I/O is often problematic, but /proc isn't really I/O, it\n\t\t\t\t// a virtual filesystem that maps directly to in-kernel data\n\t\t\t\t// structures and never blocks.\n\t\t\t\t//\n\t\t\t\t// Node.js/libuv do this already for process.memoryUsage(), see:\n\t\t\t\t// - https://github.com/libuv/libuv/blob/a629688008694ed8022269e66826d4d6ec688b83/src/unix/linux-core.c#L506-L523\n\t\t\t\tconst stat = fs.readFileSync('/proc/self/status', 'utf8');\n\t\t\t\tconst structuredOutput = structureOutput(stat);\n\n\t\t\t\tresidentMemGauge.set(labels, structuredOutput.VmRSS);\n\t\t\t\tvirtualMemGauge.set(labels, structuredOutput.VmSize);\n\t\t\t\theapSizeMemGauge.set(labels, structuredOutput.VmData);\n\t\t\t} catch {\n\t\t\t\t// noop\n\t\t\t}\n\t\t},\n\t});\n\tconst virtualMemGauge = new Gauge({\n\t\tname: namePrefix + PROCESS_VIRTUAL_MEMORY,\n\t\thelp: 'Virtual memory size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n\tconst heapSizeMemGauge = new Gauge({\n\t\tname: namePrefix + PROCESS_HEAP,\n\t\thelp: 'Process heap size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n};\n\nmodule.exports.metricNames = [\n\tPROCESS_RESIDENT_MEMORY,\n\tPROCESS_VIRTUAL_MEMORY,\n\tPROCESS_HEAP,\n];\n","'use strict';\n\n// process.memoryUsage() can throw on some platforms, see #67\nfunction safeMemoryUsage() {\n\ttry {\n\t\treturn process.memoryUsage();\n\t} catch {\n\t\treturn;\n\t}\n}\n\nmodule.exports = safeMemoryUsage;\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst linuxVariant = require('./osMemoryHeapLinux');\nconst safeMemoryUsage = require('./helpers/safeMemoryUsage');\n\nconst PROCESS_RESIDENT_MEMORY = 'process_resident_memory_bytes';\n\nfunction notLinuxVariant(registry, config = {}) {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_RESIDENT_MEMORY,\n\t\thelp: 'Resident memory size in bytes.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst memUsage = safeMemoryUsage();\n\n\t\t\t// I don't think the other things returned from `process.memoryUsage()` is relevant to a standard export\n\t\t\tif (memUsage) {\n\t\t\t\tthis.set(labels, memUsage.rss);\n\t\t\t}\n\t\t},\n\t});\n}\n\nmodule.exports = (registry, config) =>\n\tprocess.platform === 'linux'\n\t\t? linuxVariant(registry, config)\n\t\t: notLinuxVariant(registry, config);\n\nmodule.exports.metricNames =\n\tprocess.platform === 'linux'\n\t\t? linuxVariant.metricNames\n\t\t: [PROCESS_RESIDENT_MEMORY];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst fs = require('fs');\nconst process = require('process');\n\nconst PROCESS_OPEN_FDS = 'process_open_fds';\n\nmodule.exports = (registry, config = {}) => {\n\tif (process.platform !== 'linux') {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_OPEN_FDS,\n\t\thelp: 'Number of open file descriptors.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\ttry {\n\t\t\t\tconst fds = fs.readdirSync('/proc/self/fd');\n\t\t\t\t// Minus 1 to not count the fd that was used by readdirSync(),\n\t\t\t\t// it's now closed.\n\t\t\t\tthis.set(labels, fds.length - 1);\n\t\t\t} catch {\n\t\t\t\t// noop\n\t\t\t}\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [PROCESS_OPEN_FDS];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst fs = require('fs');\n\nconst PROCESS_MAX_FDS = 'process_max_fds';\n\nlet maxFds;\n\nmodule.exports = (registry, config = {}) => {\n\tif (maxFds === undefined) {\n\t\t// This will fail if a linux-like procfs is not available.\n\t\ttry {\n\t\t\tconst limits = fs.readFileSync('/proc/self/limits', 'utf8');\n\t\t\tconst lines = limits.split('\\n');\n\t\t\tfor (const line of lines) {\n\t\t\t\tif (line.startsWith('Max open files')) {\n\t\t\t\t\tconst parts = line.split(/ +/);\n\t\t\t\t\tmaxFds = Number(parts[1]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (maxFds === undefined) return;\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_MAX_FDS,\n\t\thelp: 'Maximum number of open file descriptors.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tif (maxFds !== undefined) this.set(labels, maxFds);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [PROCESS_MAX_FDS];\n","'use strict';\n\nconst Gauge = require('../gauge');\n\n// Check if perf_hooks module is available\nlet perf_hooks;\ntry {\n\tperf_hooks = require('perf_hooks');\n} catch {\n\t// node version is too old\n}\n\n// Reported always.\nconst NODEJS_EVENTLOOP_LAG = 'nodejs_eventloop_lag_seconds';\n\n// Reported only when perf_hooks is available.\nconst NODEJS_EVENTLOOP_LAG_MIN = 'nodejs_eventloop_lag_min_seconds';\nconst NODEJS_EVENTLOOP_LAG_MAX = 'nodejs_eventloop_lag_max_seconds';\nconst NODEJS_EVENTLOOP_LAG_MEAN = 'nodejs_eventloop_lag_mean_seconds';\nconst NODEJS_EVENTLOOP_LAG_STDDEV = 'nodejs_eventloop_lag_stddev_seconds';\nconst NODEJS_EVENTLOOP_LAG_P50 = 'nodejs_eventloop_lag_p50_seconds';\nconst NODEJS_EVENTLOOP_LAG_P90 = 'nodejs_eventloop_lag_p90_seconds';\nconst NODEJS_EVENTLOOP_LAG_P99 = 'nodejs_eventloop_lag_p99_seconds';\n\nfunction reportEventloopLag(start, gauge, labels) {\n\tconst delta = process.hrtime(start);\n\tconst nanosec = delta[0] * 1e9 + delta[1];\n\tconst seconds = nanosec / 1e9;\n\n\tgauge.set(labels, seconds);\n}\n\nmodule.exports = (registry, config = {}) => {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\tconst registers = registry ? [registry] : undefined;\n\n\tlet collect = () => {\n\t\tconst start = process.hrtime();\n\t\tsetImmediate(reportEventloopLag, start, lag, labels);\n\t};\n\n\tif (perf_hooks && perf_hooks.monitorEventLoopDelay) {\n\t\ttry {\n\t\t\tconst histogram = perf_hooks.monitorEventLoopDelay({\n\t\t\t\tresolution: config.eventLoopMonitoringPrecision,\n\t\t\t});\n\t\t\thistogram.enable();\n\n\t\t\tcollect = () => {\n\t\t\t\tconst start = process.hrtime();\n\t\t\t\tsetImmediate(reportEventloopLag, start, lag, labels);\n\n\t\t\t\tlagMin.set(labels, histogram.min / 1e9);\n\t\t\t\tlagMax.set(labels, histogram.max / 1e9);\n\t\t\t\tlagMean.set(labels, histogram.mean / 1e9);\n\t\t\t\tlagStddev.set(labels, histogram.stddev / 1e9);\n\t\t\t\tlagP50.set(labels, histogram.percentile(50) / 1e9);\n\t\t\t\tlagP90.set(labels, histogram.percentile(90) / 1e9);\n\t\t\t\tlagP99.set(labels, histogram.percentile(99) / 1e9);\n\n\t\t\t\thistogram.reset();\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tif (e.code === 'ERR_NOT_IMPLEMENTED') {\n\t\t\t\treturn; // Bun\n\t\t\t}\n\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tconst lag = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG,\n\t\thelp: 'Lag of event loop in seconds.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect,\n\t});\n\tconst lagMin = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_MIN,\n\t\thelp: 'The minimum recorded event loop delay.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'min',\n\t});\n\tconst lagMax = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_MAX,\n\t\thelp: 'The maximum recorded event loop delay.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'max',\n\t});\n\tconst lagMean = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_MEAN,\n\t\thelp: 'The mean of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagStddev = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_STDDEV,\n\t\thelp: 'The standard deviation of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagP50 = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_P50,\n\t\thelp: 'The 50th percentile of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagP90 = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_P90,\n\t\thelp: 'The 90th percentile of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagP99 = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_P99,\n\t\thelp: 'The 99th percentile of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_EVENTLOOP_LAG,\n\tNODEJS_EVENTLOOP_LAG_MIN,\n\tNODEJS_EVENTLOOP_LAG_MAX,\n\tNODEJS_EVENTLOOP_LAG_MEAN,\n\tNODEJS_EVENTLOOP_LAG_STDDEV,\n\tNODEJS_EVENTLOOP_LAG_P50,\n\tNODEJS_EVENTLOOP_LAG_P90,\n\tNODEJS_EVENTLOOP_LAG_P99,\n];\n","'use strict';\n\nfunction aggregateByObjectName(list) {\n\tconst data = {};\n\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst listElement = list[i];\n\n\t\tif (!listElement || typeof listElement.constructor === 'undefined') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (Object.hasOwnProperty.call(data, listElement.constructor.name)) {\n\t\t\tdata[listElement.constructor.name] += 1;\n\t\t} else {\n\t\t\tdata[listElement.constructor.name] = 1;\n\t\t}\n\t}\n\treturn data;\n}\n\nfunction updateMetrics(gauge, data, labels) {\n\tgauge.reset();\n\tfor (const key in data) {\n\t\tgauge.set(Object.assign({ type: key }, labels || {}), data[key]);\n\t}\n}\n\nmodule.exports = {\n\taggregateByObjectName,\n\tupdateMetrics,\n};\n","'use strict';\n\nconst { aggregateByObjectName } = require('./helpers/processMetricsHelpers');\nconst { updateMetrics } = require('./helpers/processMetricsHelpers');\nconst Gauge = require('../gauge');\n\nconst NODEJS_ACTIVE_HANDLES = 'nodejs_active_handles';\nconst NODEJS_ACTIVE_HANDLES_TOTAL = 'nodejs_active_handles_total';\n\nmodule.exports = (registry, config = {}) => {\n\t// Don't do anything if the function is removed in later nodes (exists in node@6-12...)\n\tif (typeof process._getActiveHandles !== 'function') {\n\t\treturn;\n\t}\n\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_HANDLES,\n\t\thelp: 'Number of active libuv handles grouped by handle type. Every handle type is C++ class name.',\n\t\tlabelNames: ['type', ...labelNames],\n\t\tregisters,\n\t\tcollect() {\n\t\t\tconst handles = process._getActiveHandles();\n\t\t\tupdateMetrics(this, aggregateByObjectName(handles), labels);\n\t\t},\n\t});\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_HANDLES_TOTAL,\n\t\thelp: 'Total number of active handles.',\n\t\tregisters,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst handles = process._getActiveHandles();\n\t\t\tthis.set(labels, handles.length);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_ACTIVE_HANDLES,\n\tNODEJS_ACTIVE_HANDLES_TOTAL,\n];\n","'use strict';\nconst Gauge = require('../gauge');\nconst { aggregateByObjectName } = require('./helpers/processMetricsHelpers');\nconst { updateMetrics } = require('./helpers/processMetricsHelpers');\n\nconst NODEJS_ACTIVE_REQUESTS = 'nodejs_active_requests';\nconst NODEJS_ACTIVE_REQUESTS_TOTAL = 'nodejs_active_requests_total';\n\nmodule.exports = (registry, config = {}) => {\n\t// Don't do anything if the function is removed in later nodes (exists in node@6)\n\tif (typeof process._getActiveRequests !== 'function') {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_REQUESTS,\n\t\thelp: 'Number of active libuv requests grouped by request type. Every request type is C++ class name.',\n\t\tlabelNames: ['type', ...labelNames],\n\t\tregisters: registry ? [registry] : undefined,\n\t\tcollect() {\n\t\t\tconst requests = process._getActiveRequests();\n\t\t\tupdateMetrics(this, aggregateByObjectName(requests), labels);\n\t\t},\n\t});\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_REQUESTS_TOTAL,\n\t\thelp: 'Total number of active requests.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst requests = process._getActiveRequests();\n\t\t\tthis.set(labels, requests.length);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_ACTIVE_REQUESTS,\n\tNODEJS_ACTIVE_REQUESTS_TOTAL,\n];\n","'use strict';\nconst Gauge = require('../gauge');\nconst { updateMetrics } = require('./helpers/processMetricsHelpers');\n\nconst NODEJS_ACTIVE_RESOURCES = 'nodejs_active_resources';\nconst NODEJS_ACTIVE_RESOURCES_TOTAL = 'nodejs_active_resources_total';\n\nmodule.exports = (registry, config = {}) => {\n\t// Don't do anything if the function does not exist in previous nodes (exists in node@17.3.0)\n\tif (typeof process.getActiveResourcesInfo !== 'function') {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_RESOURCES,\n\t\thelp: 'Number of active resources that are currently keeping the event loop alive, grouped by async resource type.',\n\t\tlabelNames: ['type', ...labelNames],\n\t\tregisters: registry ? [registry] : undefined,\n\t\tcollect() {\n\t\t\tconst resources = process.getActiveResourcesInfo();\n\n\t\t\tconst data = {};\n\n\t\t\tfor (let i = 0; i < resources.length; i++) {\n\t\t\t\tconst resource = resources[i];\n\n\t\t\t\tif (Object.hasOwn(data, resource)) {\n\t\t\t\t\tdata[resource] += 1;\n\t\t\t\t} else {\n\t\t\t\t\tdata[resource] = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tupdateMetrics(this, data, labels);\n\t\t},\n\t});\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_RESOURCES_TOTAL,\n\t\thelp: 'Total number of active resources.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst resources = process.getActiveResourcesInfo();\n\t\t\tthis.set(labels, resources.length);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_ACTIVE_RESOURCES,\n\tNODEJS_ACTIVE_RESOURCES_TOTAL,\n];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst safeMemoryUsage = require('./helpers/safeMemoryUsage');\n\nconst NODEJS_HEAP_SIZE_TOTAL = 'nodejs_heap_size_total_bytes';\nconst NODEJS_HEAP_SIZE_USED = 'nodejs_heap_size_used_bytes';\nconst NODEJS_EXTERNAL_MEMORY = 'nodejs_external_memory_bytes';\n\nmodule.exports = (registry, config = {}) => {\n\tif (typeof process.memoryUsage !== 'function') {\n\t\treturn;\n\t}\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst collect = () => {\n\t\tconst memUsage = safeMemoryUsage();\n\t\tif (memUsage) {\n\t\t\theapSizeTotal.set(labels, memUsage.heapTotal);\n\t\t\theapSizeUsed.set(labels, memUsage.heapUsed);\n\t\t\tif (memUsage.external !== undefined) {\n\t\t\t\texternalMemUsed.set(labels, memUsage.external);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst heapSizeTotal = new Gauge({\n\t\tname: namePrefix + NODEJS_HEAP_SIZE_TOTAL,\n\t\thelp: 'Process heap size from Node.js in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect,\n\t});\n\tconst heapSizeUsed = new Gauge({\n\t\tname: namePrefix + NODEJS_HEAP_SIZE_USED,\n\t\thelp: 'Process heap size used from Node.js in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n\tconst externalMemUsed = new Gauge({\n\t\tname: namePrefix + NODEJS_EXTERNAL_MEMORY,\n\t\thelp: 'Node.js external memory size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_HEAP_SIZE_TOTAL,\n\tNODEJS_HEAP_SIZE_USED,\n\tNODEJS_EXTERNAL_MEMORY,\n];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst v8 = require('v8');\n\nconst METRICS = ['total', 'used', 'available'];\nconst NODEJS_HEAP_SIZE = {};\n\nMETRICS.forEach(metricType => {\n\tNODEJS_HEAP_SIZE[metricType] = `nodejs_heap_space_size_${metricType}_bytes`;\n});\n\nmodule.exports = (registry, config = {}) => {\n\ttry {\n\t\tv8.getHeapSpaceStatistics();\n\t} catch (e) {\n\t\tif (e.code === 'ERR_NOT_IMPLEMENTED') {\n\t\t\treturn; // Bun\n\t\t}\n\t\tthrow e;\n\t}\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = ['space', ...Object.keys(labels)];\n\n\tconst gauges = {};\n\n\tMETRICS.forEach(metricType => {\n\t\tgauges[metricType] = new Gauge({\n\t\t\tname: namePrefix + NODEJS_HEAP_SIZE[metricType],\n\t\t\thelp: `Process heap space size ${metricType} from Node.js in bytes.`,\n\t\t\tlabelNames,\n\t\t\tregisters,\n\t\t});\n\t});\n\n\t// Use this one metric's `collect` to set all metrics' values.\n\tgauges.total.collect = () => {\n\t\tfor (const space of v8.getHeapSpaceStatistics()) {\n\t\t\tconst spaceName = space.space_name.substr(\n\t\t\t\t0,\n\t\t\t\tspace.space_name.indexOf('_space'),\n\t\t\t);\n\n\t\t\tgauges.total.set({ space: spaceName, ...labels }, space.space_size);\n\t\t\tgauges.used.set({ space: spaceName, ...labels }, space.space_used_size);\n\t\t\tgauges.available.set(\n\t\t\t\t{ space: spaceName, ...labels },\n\t\t\t\tspace.space_available_size,\n\t\t\t);\n\t\t}\n\t};\n};\n\nmodule.exports.metricNames = Object.values(NODEJS_HEAP_SIZE);\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst version = process.version;\nconst versionSegments = version.slice(1).split('.').map(Number);\n\nconst NODE_VERSION_INFO = 'nodejs_version_info';\n\nmodule.exports = (registry, config = {}) => {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODE_VERSION_INFO,\n\t\thelp: 'Node.js version info.',\n\t\tlabelNames: ['version', 'major', 'minor', 'patch', ...labelNames],\n\t\tregisters: registry ? [registry] : undefined,\n\t\taggregator: 'first',\n\t\tcollect() {\n\t\t\t// Needs to be in collect() so value is present even if reg is reset\n\t\t\tthis.labels(\n\t\t\t\tversion,\n\t\t\t\tversionSegments[0],\n\t\t\t\tversionSegments[1],\n\t\t\t\tversionSegments[2],\n\t\t\t\t...Object.values(labels),\n\t\t\t).set(1);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [NODE_VERSION_INFO];\n","'use strict';\nconst Histogram = require('../histogram');\n\nlet perf_hooks;\n\ntry {\n\t// eslint-disable-next-line\n\tperf_hooks = require('perf_hooks');\n} catch {\n\t// node version is too old\n}\n\nconst NODEJS_GC_DURATION_SECONDS = 'nodejs_gc_duration_seconds';\nconst DEFAULT_GC_DURATION_BUCKETS = [0.001, 0.01, 0.1, 1, 2, 5];\n\nconst kinds = [];\n\nif (perf_hooks && perf_hooks.constants) {\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR] = 'major';\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR] = 'minor';\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL] = 'incremental';\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB] = 'weakcb';\n}\n\nmodule.exports = (registry, config = {}) => {\n\tif (!perf_hooks) {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\tconst buckets = config.gcDurationBuckets\n\t\t? config.gcDurationBuckets\n\t\t: DEFAULT_GC_DURATION_BUCKETS;\n\tconst gcHistogram = new Histogram({\n\t\tname: namePrefix + NODEJS_GC_DURATION_SECONDS,\n\t\thelp: 'Garbage collection duration by kind, one of major, minor, incremental or weakcb.',\n\t\tlabelNames: ['kind', ...labelNames],\n\t\tenableExemplars: false,\n\t\tbuckets,\n\t\tregisters: registry ? [registry] : undefined,\n\t});\n\n\tconst obs = new perf_hooks.PerformanceObserver(list => {\n\t\tconst entry = list.getEntries()[0];\n\t\t// Node < 16 uses entry.kind\n\t\t// Node >= 16 uses entry.detail.kind\n\t\t// See: https://nodejs.org/docs/latest-v16.x/api/deprecations.html#deprecations_dep0152_extension_performanceentry_properties\n\t\tconst kind = entry.detail ? kinds[entry.detail.kind] : kinds[entry.kind];\n\t\t// Convert duration from milliseconds to seconds\n\t\tgcHistogram.observe(Object.assign({ kind }, labels), entry.duration / 1000);\n\t});\n\n\tobs.observe({ entryTypes: ['gc'] });\n};\n\nmodule.exports.metricNames = [NODEJS_GC_DURATION_SECONDS];\n","'use strict';\n\nconst { isObject } = require('./util');\n\n// Default metrics.\nconst processCpuTotal = require('./metrics/processCpuTotal');\nconst processStartTime = require('./metrics/processStartTime');\nconst osMemoryHeap = require('./metrics/osMemoryHeap');\nconst processOpenFileDescriptors = require('./metrics/processOpenFileDescriptors');\nconst processMaxFileDescriptors = require('./metrics/processMaxFileDescriptors');\nconst eventLoopLag = require('./metrics/eventLoopLag');\nconst processHandles = require('./metrics/processHandles');\nconst processRequests = require('./metrics/processRequests');\nconst processResources = require('./metrics/processResources');\nconst heapSizeAndUsed = require('./metrics/heapSizeAndUsed');\nconst heapSpacesSizeAndUsed = require('./metrics/heapSpacesSizeAndUsed');\nconst version = require('./metrics/version');\nconst gc = require('./metrics/gc');\n\nconst metrics = {\n\tprocessCpuTotal,\n\tprocessStartTime,\n\tosMemoryHeap,\n\tprocessOpenFileDescriptors,\n\tprocessMaxFileDescriptors,\n\teventLoopLag,\n\t...(typeof process.getActiveResourcesInfo === 'function'\n\t\t? { processResources }\n\t\t: {}),\n\tprocessHandles,\n\tprocessRequests,\n\theapSizeAndUsed,\n\theapSpacesSizeAndUsed,\n\tversion,\n\tgc,\n};\nconst metricsList = Object.keys(metrics);\n\nmodule.exports = function collectDefaultMetrics(config) {\n\tif (config !== null && config !== undefined && !isObject(config)) {\n\t\tthrow new TypeError('config must be null, undefined, or an object');\n\t}\n\n\tconfig = { eventLoopMonitoringPrecision: 10, ...config };\n\n\tfor (const metric of Object.values(metrics)) {\n\t\tmetric(config.register, config);\n\t}\n};\n\nmodule.exports.metricsList = metricsList;\n","'use strict';\n\nconst { Grouper, hashObject } = require('./util');\n\n/**\n * Returns a new function that applies the `aggregatorFn` to the values.\n * @param {Function} aggregatorFn function to apply to values.\n * @return {Function} aggregator function\n */\nfunction AggregatorFactory(aggregatorFn) {\n\treturn metrics => {\n\t\tif (metrics.length === 0) return;\n\t\tconst result = {\n\t\t\thelp: metrics[0].help,\n\t\t\tname: metrics[0].name,\n\t\t\ttype: metrics[0].type,\n\t\t\tvalues: [],\n\t\t\taggregator: metrics[0].aggregator,\n\t\t};\n\t\t// Gather metrics by metricName and labels.\n\t\tconst byLabels = new Grouper();\n\t\tmetrics.forEach(metric => {\n\t\t\tmetric.values.forEach(value => {\n\t\t\t\tconst key = hashObject(value.labels);\n\t\t\t\tbyLabels.add(`${value.metricName}_${key}`, value);\n\t\t\t});\n\t\t});\n\t\t// Apply aggregator function to gathered metrics.\n\t\tbyLabels.forEach(values => {\n\t\t\tif (values.length === 0) return;\n\t\t\tconst valObj = {\n\t\t\t\tvalue: aggregatorFn(values),\n\t\t\t\tlabels: values[0].labels,\n\t\t\t};\n\t\t\tif (values[0].metricName) {\n\t\t\t\tvalObj.metricName = values[0].metricName;\n\t\t\t}\n\t\t\t// NB: Timestamps are omitted.\n\t\t\tresult.values.push(valObj);\n\t\t});\n\t\treturn result;\n\t};\n}\n// Export for users to define their own aggregation methods.\nexports.AggregatorFactory = AggregatorFactory;\n\n/**\n * Functions that can be used to aggregate metrics from multiple registries.\n */\nexports.aggregators = {\n\t/**\n\t * @return The sum of values.\n\t */\n\tsum: AggregatorFactory(v => v.reduce((p, c) => p + c.value, 0)),\n\t/**\n\t * @return The first value.\n\t */\n\tfirst: AggregatorFactory(v => v[0].value),\n\t/**\n\t * @return {undefined} Undefined; omits the metric.\n\t */\n\tomit: () => {},\n\t/**\n\t * @return The arithmetic mean of the values.\n\t */\n\taverage: AggregatorFactory(\n\t\tv => v.reduce((p, c) => p + c.value, 0) / v.length,\n\t),\n\t/**\n\t * @return The minimum of the values.\n\t */\n\tmin: AggregatorFactory(v =>\n\t\tv.reduce((p, c) => Math.min(p, c.value), Infinity),\n\t),\n\t/**\n\t * @return The maximum of the values.\n\t */\n\tmax: AggregatorFactory(v =>\n\t\tv.reduce((p, c) => Math.max(p, c.value), -Infinity),\n\t),\n};\n","'use strict';\n\n/**\n * Extends the Registry class with a `clusterMetrics` method that returns\n * aggregated metrics for all workers.\n *\n * In cluster workers, listens for and responds to requests for metrics by the\n * cluster master.\n */\n\nconst Registry = require('./registry');\nconst { Grouper } = require('./util');\nconst { aggregators } = require('./metricAggregators');\n// We need to lazy-load the 'cluster' module as some application servers -\n// namely Passenger - crash when it is imported.\nlet cluster = () => {\n\tconst data = require('cluster');\n\tcluster = () => data;\n\treturn data;\n};\n\nconst GET_METRICS_REQ = 'prom-client:getMetricsReq';\nconst GET_METRICS_RES = 'prom-client:getMetricsRes';\n\nlet registries = [Registry.globalRegistry];\nlet requestCtr = 0; // Concurrency control\nlet listenersAdded = false;\nconst requests = new Map(); // Pending requests for workers' local metrics.\n\nclass AggregatorRegistry extends Registry {\n\tconstructor(regContentType = Registry.PROMETHEUS_CONTENT_TYPE) {\n\t\tsuper(regContentType);\n\t\taddListeners();\n\t}\n\n\t/**\n\t * Gets aggregated metrics for all workers. The optional callback and\n\t * returned Promise resolve with the same value; either may be used.\n\t * @return {Promise<string>} Promise that resolves with the aggregated\n\t * metrics.\n\t */\n\tclusterMetrics() {\n\t\tconst requestId = requestCtr++;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet settled = false;\n\t\t\tfunction done(err, result) {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t}\n\n\t\t\tconst request = {\n\t\t\t\tresponses: [],\n\t\t\t\tpending: 0,\n\t\t\t\tdone,\n\t\t\t\terrorTimeout: setTimeout(() => {\n\t\t\t\t\tconst err = new Error('Operation timed out.');\n\t\t\t\t\trequest.done(err);\n\t\t\t\t}, 5000),\n\t\t\t};\n\t\t\trequests.set(requestId, request);\n\n\t\t\tconst message = {\n\t\t\t\ttype: GET_METRICS_REQ,\n\t\t\t\trequestId,\n\t\t\t};\n\n\t\t\tfor (const id in cluster().workers) {\n\t\t\t\t// If the worker exits abruptly, it may still be in the workers\n\t\t\t\t// list but not able to communicate.\n\t\t\t\tif (cluster().workers[id].isConnected()) {\n\t\t\t\t\tcluster().workers[id].send(message);\n\t\t\t\t\trequest.pending++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (request.pending === 0) {\n\t\t\t\t// No workers were up\n\t\t\t\tclearTimeout(request.errorTimeout);\n\t\t\t\tprocess.nextTick(() => done(null, ''));\n\t\t\t}\n\t\t});\n\t}\n\n\tget contentType() {\n\t\treturn super.contentType;\n\t}\n\n\t/**\n\t * Creates a new Registry instance from an array of metrics that were\n\t * created by `registry.getMetricsAsJSON()`. Metrics are aggregated using\n\t * the method specified by their `aggregator` property, or by summation if\n\t * `aggregator` is undefined.\n\t * @param {Array} metricsArr Array of metrics, each of which created by\n\t * `registry.getMetricsAsJSON()`.\n\t * @param {string} registryType content type of the new registry. Defaults\n\t * to PROMETHEUS_CONTENT_TYPE.\n\t * @return {Registry} aggregated registry.\n\t */\n\tstatic aggregate(\n\t\tmetricsArr,\n\t\tregistryType = Registry.PROMETHEUS_CONTENT_TYPE,\n\t) {\n\t\tconst aggregatedRegistry = new Registry();\n\t\tconst metricsByName = new Grouper();\n\n\t\taggregatedRegistry.setContentType(registryType);\n\n\t\t// Gather by name\n\t\tmetricsArr.forEach(metrics => {\n\t\t\tmetrics.forEach(metric => {\n\t\t\t\tmetricsByName.add(metric.name, metric);\n\t\t\t});\n\t\t});\n\n\t\t// Aggregate gathered metrics.\n\t\tmetricsByName.forEach(metrics => {\n\t\t\tconst aggregatorName = metrics[0].aggregator;\n\t\t\tconst aggregatorFn = aggregators[aggregatorName];\n\t\t\tif (typeof aggregatorFn !== 'function') {\n\t\t\t\tthrow new Error(`'${aggregatorName}' is not a defined aggregator.`);\n\t\t\t}\n\t\t\tconst aggregatedMetric = aggregatorFn(metrics);\n\t\t\t// NB: The 'omit' aggregator returns undefined.\n\t\t\tif (aggregatedMetric) {\n\t\t\t\tconst aggregatedMetricWrapper = Object.assign(\n\t\t\t\t\t{\n\t\t\t\t\t\tget: () => aggregatedMetric,\n\t\t\t\t\t},\n\t\t\t\t\taggregatedMetric,\n\t\t\t\t);\n\t\t\t\taggregatedRegistry.registerMetric(aggregatedMetricWrapper);\n\t\t\t}\n\t\t});\n\n\t\treturn aggregatedRegistry;\n\t}\n\n\t/**\n\t * Sets the registry or registries to be aggregated. Call from workers to\n\t * use a registry/registries other than the default global registry.\n\t * @param {Array<Registry>|Registry} regs Registry or registries to be\n\t * aggregated.\n\t * @return {void}\n\t */\n\tstatic setRegistries(regs) {\n\t\tif (!Array.isArray(regs)) regs = [regs];\n\t\tregs.forEach(reg => {\n\t\t\tif (!(reg instanceof Registry)) {\n\t\t\t\tthrow new TypeError(`Expected Registry, got ${typeof reg}`);\n\t\t\t}\n\t\t});\n\t\tregistries = regs;\n\t}\n}\n\n/**\n * Adds event listeners for cluster aggregation. Idempotent (safe to call more\n * than once).\n * @return {void}\n */\nfunction addListeners() {\n\tif (listenersAdded) return;\n\tlistenersAdded = true;\n\n\tif (cluster().isMaster) {\n\t\t// Listen for worker responses to requests for local metrics\n\t\tcluster().on('message', (worker, message) => {\n\t\t\tif (message.type === GET_METRICS_RES) {\n\t\t\t\tconst request = requests.get(message.requestId);\n\n\t\t\t\tif (message.error) {\n\t\t\t\t\trequest.done(new Error(message.error));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tmessage.metrics.forEach(registry => request.responses.push(registry));\n\t\t\t\trequest.pending--;\n\n\t\t\t\tif (request.pending === 0) {\n\t\t\t\t\t// finalize\n\t\t\t\t\trequests.delete(message.requestId);\n\t\t\t\t\tclearTimeout(request.errorTimeout);\n\n\t\t\t\t\tconst registry = AggregatorRegistry.aggregate(request.responses);\n\t\t\t\t\tconst promString = registry.metrics();\n\t\t\t\t\trequest.done(null, promString);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (cluster().isWorker) {\n\t\t// Respond to master's requests for worker's local metrics.\n\t\tprocess.on('message', message => {\n\t\t\tif (message.type === GET_METRICS_REQ) {\n\t\t\t\tPromise.all(registries.map(r => r.getMetricsAsJSON()))\n\t\t\t\t\t.then(metrics => {\n\t\t\t\t\t\tprocess.send({\n\t\t\t\t\t\t\ttype: GET_METRICS_RES,\n\t\t\t\t\t\t\trequestId: message.requestId,\n\t\t\t\t\t\t\tmetrics,\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\tprocess.send({\n\t\t\t\t\t\t\ttype: GET_METRICS_RES,\n\t\t\t\t\t\t\trequestId: message.requestId,\n\t\t\t\t\t\t\terror: error.message,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n}\n\nmodule.exports = AggregatorRegistry;\n","/**\n * Prometheus client\n * @module Prometheus client\n */\n\n'use strict';\n\nexports.register = require('./lib/registry').globalRegistry;\nexports.Registry = require('./lib/registry');\nObject.defineProperty(exports, 'contentType', {\n\tconfigurable: false,\n\tenumerable: true,\n\tget() {\n\t\treturn exports.register.contentType;\n\t},\n\tset(value) {\n\t\texports.register.setContentType(value);\n\t},\n});\nexports.prometheusContentType = exports.Registry.PROMETHEUS_CONTENT_TYPE;\nexports.openMetricsContentType = exports.Registry.OPENMETRICS_CONTENT_TYPE;\nexports.validateMetricName = require('./lib/validation').validateMetricName;\n\nexports.Counter = require('./lib/counter');\nexports.Gauge = require('./lib/gauge');\nexports.Histogram = require('./lib/histogram');\nexports.Summary = require('./lib/summary');\nexports.Pushgateway = require('./lib/pushgateway');\n\nexports.linearBuckets = require('./lib/bucketGenerators').linearBuckets;\nexports.exponentialBuckets =\n\trequire('./lib/bucketGenerators').exponentialBuckets;\n\nexports.collectDefaultMetrics = require('./lib/defaultMetrics');\n\nexports.aggregators = require('./lib/metricAggregators').aggregators;\nexports.AggregatorRegistry = require('./lib/cluster');\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 * 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 { clearIdentityCache, getCachedIdentity, loadIdentity } from \"./loader.js\";\n// Types\nexport type {\n AppIdentity,\n Identity,\n IdentityMetadata,\n LoadIdentityOptions,\n PythonMetadata,\n RepositoryCategory,\n} from \"./types.js\";\n","/**\n * Prometheus exporter constants\n *\n * ADR-0007 histogram buckets and metric names from Crucible v0.2.7 taxonomy.\n */\n\n/**\n * ADR-0007 histogram buckets for millisecond timing\n *\n * Buckets: 1ms, 5ms, 10ms, 50ms, 100ms, 500ms, 1s, 5s, 10s\n * Used for: MIME detection, error handling, FulHash operations\n */\nexport const ADR0007_BUCKETS_MS = [1, 5, 10, 50, 100, 500, 1000, 5000, 10000] as const;\n\n/**\n * ADR-0007 histogram buckets for second timing (refresh operations)\n *\n * Buckets: 1ms, 5ms, 10ms, 50ms, 100ms, 500ms, 1s, 5s, 10s (converted to seconds)\n * Used for: Prometheus exporter refresh duration\n */\nexport const ADR0007_BUCKETS_SECONDS = [\n 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0, 5.0, 10.0,\n] as const;\n\n/**\n * Convert milliseconds to seconds for Prometheus histograms\n */\nexport function msToSeconds(ms: number): number {\n return ms / 1000;\n}\n\n/**\n * Prometheus exporter metric names (Crucible v0.2.7 taxonomy)\n */\nexport const PROMETHEUS_EXPORTER_METRICS = {\n // Refresh metrics\n REFRESH_DURATION_SECONDS: \"prometheus_exporter_refresh_duration_seconds\",\n REFRESH_TOTAL: \"prometheus_exporter_refresh_total\",\n REFRESH_ERRORS_TOTAL: \"prometheus_exporter_refresh_errors_total\",\n REFRESH_INFLIGHT: \"prometheus_exporter_refresh_inflight\",\n\n // HTTP metrics\n HTTP_REQUESTS_TOTAL: \"prometheus_exporter_http_requests_total\",\n HTTP_ERRORS_TOTAL: \"prometheus_exporter_http_errors_total\",\n\n // Restart metrics\n RESTARTS_TOTAL: \"prometheus_exporter_restarts_total\",\n} as const;\n\n/**\n * Foundry module metric names (Crucible v0.2.7 taxonomy)\n */\nexport const FOUNDRY_METRICS = {\n // MIME detection counters\n MIME_DETECTIONS_JSON: \"foundry_mime_detections_total_json\",\n MIME_DETECTIONS_XML: \"foundry_mime_detections_total_xml\",\n MIME_DETECTIONS_YAML: \"foundry_mime_detections_total_yaml\",\n MIME_DETECTIONS_CSV: \"foundry_mime_detections_total_csv\",\n MIME_DETECTIONS_PLAIN_TEXT: \"foundry_mime_detections_total_plain_text\",\n MIME_DETECTIONS_UNKNOWN: \"foundry_mime_detections_total_unknown\",\n\n // MIME detection timing histograms\n MIME_DETECTION_MS_JSON: \"foundry_mime_detection_ms_json\",\n MIME_DETECTION_MS_XML: \"foundry_mime_detection_ms_xml\",\n MIME_DETECTION_MS_YAML: \"foundry_mime_detection_ms_yaml\",\n MIME_DETECTION_MS_CSV: \"foundry_mime_detection_ms_csv\",\n MIME_DETECTION_MS_PLAIN_TEXT: \"foundry_mime_detection_ms_plain_text\",\n MIME_DETECTION_MS_UNKNOWN: \"foundry_mime_detection_ms_unknown\",\n\n // General lookup counter\n LOOKUP_COUNT: \"foundry_lookup_count\",\n} as const;\n\n/**\n * Error handling module metric names (Crucible v0.2.7 taxonomy)\n */\nexport const ERROR_HANDLING_METRICS = {\n WRAPS_TOTAL: \"error_handling_wraps_total\",\n WRAP_MS: \"error_handling_wrap_ms\",\n} as const;\n\n/**\n * FulHash module metric names (Crucible v0.2.7 taxonomy)\n */\nexport const FULHASH_METRICS = {\n // Algorithm-specific counters\n OPERATIONS_XXH3_128: \"fulhash_operations_total_xxh3_128\",\n OPERATIONS_SHA256: \"fulhash_operations_total_sha256\",\n\n // General counters\n HASH_STRING_TOTAL: \"fulhash_hash_string_total\",\n BYTES_HASHED_TOTAL: \"fulhash_bytes_hashed_total\",\n\n // Timing histogram\n OPERATION_MS: \"fulhash_operation_ms\",\n} as const;\n\n/**\n * Label values for Prometheus exporter metrics (taxonomy-compliant)\n */\nexport const EXPORTER_LABELS = {\n // Refresh phases\n PHASE_COLLECT: \"collect\",\n PHASE_CONVERT: \"convert\",\n PHASE_EXPORT: \"export\",\n\n // Results\n RESULT_SUCCESS: \"success\",\n RESULT_ERROR: \"error\",\n\n // Error types\n ERROR_VALIDATION: \"validation\",\n ERROR_IO: \"io\",\n ERROR_TIMEOUT: \"timeout\",\n ERROR_OTHER: \"other\",\n\n // Restart reasons\n REASON_CONFIG_CHANGE: \"config_change\",\n REASON_ERROR: \"error\",\n REASON_MANUAL: \"manual\",\n REASON_OTHER: \"other\",\n} as const;\n","/**\n * Prometheus exporter error classes\n *\n * Specialized errors for Prometheus integration failures.\n */\n\nimport { FulmenError } from \"../../errors/index.js\";\n\n/**\n * Base error class for Prometheus exporter errors\n */\nexport class PrometheusExporterError extends FulmenError {\n constructor(\n message: string,\n options?: {\n code?: string;\n cause?: unknown;\n context?: Record<string, unknown>;\n },\n ) {\n super({\n code: options?.code || \"PROMETHEUS_EXPORTER_ERROR\",\n message,\n severity: \"medium\",\n context: options?.context,\n });\n\n if (options?.cause) {\n this.cause = options.cause;\n }\n\n this.name = \"PrometheusExporterError\";\n }\n}\n\n/**\n * Error thrown when prom-client peer dependency is not installed\n */\nexport class PromClientNotFoundError extends PrometheusExporterError {\n constructor(cause?: unknown) {\n super(\n \"prom-client peer dependency not found. Install with: bun add prom-client\\n\" +\n \"For npm: npm install prom-client\\n\" +\n \"For more information, see: https://github.com/siimon/prom-client\",\n {\n code: \"PROM_CLIENT_NOT_FOUND\",\n cause,\n context: {\n suggestion: 'Run \"bun add prom-client\" to install the required peer dependency',\n },\n },\n );\n\n this.name = \"PromClientNotFoundError\";\n }\n}\n\n/**\n * Error thrown when metric name is invalid for Prometheus\n */\nexport class InvalidMetricNameError extends PrometheusExporterError {\n constructor(metricName: string, reason: string) {\n super(`Invalid Prometheus metric name: \"${metricName}\". ${reason}`, {\n code: \"INVALID_METRIC_NAME\",\n context: {\n metricName,\n reason,\n suggestion:\n \"Prometheus metric names must match: [a-zA-Z_:][a-zA-Z0-9_:]*\\n\" +\n \"See: https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels\",\n },\n });\n\n this.name = \"InvalidMetricNameError\";\n }\n}\n\n/**\n * Error thrown when label name is invalid for Prometheus\n */\nexport class InvalidLabelNameError extends PrometheusExporterError {\n constructor(labelName: string, reason: string) {\n super(`Invalid Prometheus label name: \"${labelName}\". ${reason}`, {\n code: \"INVALID_LABEL_NAME\",\n context: {\n labelName,\n reason,\n suggestion:\n \"Prometheus label names must match: [a-zA-Z_][a-zA-Z0-9_]*\\n\" +\n \"See: https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels\",\n },\n });\n\n this.name = \"InvalidLabelNameError\";\n }\n}\n\n/**\n * Error thrown when metric registration fails\n */\nexport class MetricRegistrationError extends PrometheusExporterError {\n constructor(metricName: string, cause: unknown) {\n super(`Failed to register Prometheus metric: \"${metricName}\"`, {\n code: \"METRIC_REGISTRATION_FAILED\",\n cause,\n context: {\n metricName,\n suggestion: \"Check for duplicate metric names or incompatible collector types\",\n },\n });\n\n this.name = \"MetricRegistrationError\";\n }\n}\n\n/**\n * Error thrown when refresh operation fails\n *\n * This error wraps underlying errors (InvalidMetricNameError, MetricRegistrationError, etc.)\n * that occur during the refresh process. Callers should inspect the `cause` property\n * to access the root error for specific error handling.\n *\n * @example\n * ```typescript\n * try {\n * await exporter.refresh();\n * } catch (err) {\n * if (err instanceof RefreshError) {\n * // Check the underlying cause for specific error types\n * if (err.cause instanceof InvalidMetricNameError) {\n * console.error('Invalid metric name:', err.cause.message);\n * }\n * }\n * }\n * ```\n */\nexport class RefreshError extends PrometheusExporterError {\n constructor(cause: unknown, context?: Record<string, unknown>) {\n super(\"Failed to refresh Prometheus metrics from TelemetryRegistry\", {\n code: \"REFRESH_FAILED\",\n cause,\n context,\n });\n\n this.name = \"RefreshError\";\n }\n}\n","/**\n * Prometheus exporter core implementation\n *\n * Bridges TSFulmen TelemetryRegistry to prom-client for Prometheus exposition.\n * Uses dynamic imports and loose typing for optional peer dependency (prom-client).\n *\n * NOTE: This file intentionally uses 'any' types for prom-client peer dependency\n * to avoid compile-time dependency. Runtime validation ensures type safety.\n * See .plans/active/v0.2.x-plans/prometheus-type-safety-enhancement.md for future work.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { metrics as defaultRegistry } from \"../index.js\";\nimport type { MetricsEvent } from \"../types.js\";\nimport { isHistogramSummary } from \"../types.js\";\nimport {\n ADR0007_BUCKETS_SECONDS,\n EXPORTER_LABELS,\n msToSeconds,\n PROMETHEUS_EXPORTER_METRICS,\n} from \"./constants.js\";\nimport {\n InvalidLabelNameError,\n InvalidMetricNameError,\n MetricRegistrationError,\n PromClientNotFoundError,\n RefreshError,\n} from \"./errors.js\";\nimport type { ExporterStats, PrometheusExporterOptions, RefreshOptions } from \"./types.js\";\n\n/**\n * Prometheus exporter\n *\n * Converts TSFulmen TelemetryRegistry metrics to Prometheus format using prom-client.\n *\n * @example\n * ```typescript\n * import { PrometheusExporter } from '@fulmenhq/tsfulmen/telemetry/prometheus';\n * import { metrics } from '@fulmenhq/tsfulmen/telemetry';\n *\n * // Create exporter\n * const exporter = new PrometheusExporter({\n * registry: metrics,\n * namespace: 'myapp',\n * defaultLabels: { environment: 'production' }\n * });\n *\n * // Refresh metrics from registry\n * await exporter.refresh();\n *\n * // Get Prometheus text format\n * const output = await exporter.getMetrics();\n * console.log(output);\n * ```\n */\nexport class PrometheusExporter {\n private readonly telemetryRegistry: typeof defaultRegistry;\n private namespace: string;\n private subsystem: string;\n private readonly defaultLabels: Record<string, string>;\n private readonly helpText: Record<string, string>;\n private readonly metricsEnabled: boolean;\n private readonly recordClientLabel: boolean;\n private readonly moduleMetricsEnabled: boolean;\n\n // prom-client types unavailable at compile time (optional peer dependency)\n // Using 'any' with runtime validation - see file header comment for rationale\n // biome-ignore lint/suspicious/noExplicitAny: prom-client is optional peer dependency\n private promClient: any = null;\n // biome-ignore lint/suspicious/noExplicitAny: prom-client Registry type unavailable at compile time\n private promRegistry: any = null;\n // biome-ignore lint/suspicious/noExplicitAny: prom-client Counter type unavailable at compile time\n private counters: Map<string, any> = new Map();\n // biome-ignore lint/suspicious/noExplicitAny: prom-client Gauge type unavailable at compile time\n private gauges: Map<string, any> = new Map();\n // biome-ignore lint/suspicious/noExplicitAny: prom-client Histogram type unavailable at compile time\n private histograms: Map<string, any> = new Map();\n\n // Statistics\n private refreshCount = 0;\n private errorCount = 0;\n private lastRefreshTime: string | null = null;\n\n // Background refresh loop\n private refreshInterval: NodeJS.Timeout | null = null;\n private refreshPromise: Promise<void> | null = null;\n private isRefreshing = false;\n\n /**\n * Create Prometheus exporter\n *\n * @param options - Exporter configuration\n * @throws {InvalidLabelNameError} If default label names are invalid\n */\n constructor(options: PrometheusExporterOptions = {}) {\n this.telemetryRegistry = options.registry || defaultRegistry;\n this.defaultLabels = options.defaultLabels || {};\n this.helpText = options.helpText || {};\n this.metricsEnabled = options.metricsEnabled ?? true;\n this.recordClientLabel = options.recordClientLabel ?? false;\n this.moduleMetricsEnabled = options.moduleMetricsEnabled ?? true;\n\n // Validate default label names\n for (const labelName of Object.keys(this.defaultLabels)) {\n this.validateLabelName(labelName);\n }\n\n // Initialize namespace and subsystem\n // May be overridden by App Identity in init()\n this.namespace = options.namespace || \"tsfulmen\";\n this.subsystem = options.subsystem || \"app\";\n }\n\n /**\n * Initialize exporter (async setup)\n *\n * Loads prom-client and optionally loads App Identity for namespace/subsystem.\n * Called automatically on first refresh() or getMetrics() call.\n *\n * @throws {PromClientNotFoundError} If prom-client not installed\n */\n private async init(): Promise<void> {\n if (this.promClient) {\n return; // Already initialized\n }\n\n // Lazy load prom-client (peer dependency)\n try {\n this.promClient = await import(\"prom-client\");\n this.promRegistry = new this.promClient.Registry();\n } catch (err) {\n throw new PromClientNotFoundError(err);\n }\n\n // Try to load App Identity for namespace/subsystem (optional)\n if (this.namespace === \"tsfulmen\" || this.subsystem === \"app\") {\n try {\n const { loadIdentity } = await import(\"../../appidentity/index.js\");\n const identity = await loadIdentity({ skipValidation: true });\n\n if (this.namespace === \"tsfulmen\" && identity.app.vendor) {\n this.namespace = identity.app.vendor;\n }\n if (this.subsystem === \"app\" && identity.app.binary_name) {\n this.subsystem = identity.app.binary_name;\n }\n } catch {\n // App Identity not available - use defaults\n }\n }\n }\n\n /**\n * Safely emit instrumentation metric (silently fails if registry doesn't support it)\n * Used to avoid breaking tests that use mock registries\n */\n private safeInstrument(fn: () => void): void {\n try {\n fn();\n } catch {\n // Silently ignore instrumentation failures (e.g., mock registries in tests)\n }\n }\n\n /**\n * Refresh metrics from TelemetryRegistry\n *\n * Exports current metrics from TelemetryRegistry and updates Prometheus collectors.\n * Emits instrumentation metrics per Crucible v0.2.7 taxonomy.\n *\n * @throws {RefreshError} If refresh operation fails. Inspect `error.cause` for the\n * underlying error (InvalidMetricNameError, MetricRegistrationError, etc.) to handle\n * specific failure conditions.\n */\n async refresh(): Promise<void> {\n const startTime = performance.now();\n\n // Set inflight gauge to 1\n this.safeInstrument(() => {\n this.telemetryRegistry.gauge(PROMETHEUS_EXPORTER_METRICS.REFRESH_INFLIGHT).set(1);\n });\n\n try {\n // Phase: collect - export from telemetry registry\n await this.init();\n const events = await this.telemetryRegistry.export();\n\n // Phase: convert - update Prometheus collectors\n for (const event of events) {\n this.updateCollector(event);\n }\n\n // Success metrics\n this.refreshCount++;\n this.lastRefreshTime = new Date().toISOString();\n\n const durationMs = performance.now() - startTime;\n\n // Emit success metrics\n this.safeInstrument(() => {\n this.telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.REFRESH_TOTAL)\n .inc(1, { result: EXPORTER_LABELS.RESULT_SUCCESS });\n\n this.telemetryRegistry\n .histogram(PROMETHEUS_EXPORTER_METRICS.REFRESH_DURATION_SECONDS, {\n buckets: [...ADR0007_BUCKETS_SECONDS],\n })\n .observe(msToSeconds(durationMs), {\n phase: EXPORTER_LABELS.PHASE_EXPORT,\n result: EXPORTER_LABELS.RESULT_SUCCESS,\n });\n });\n } catch (err) {\n this.errorCount++;\n\n const durationMs = performance.now() - startTime;\n\n // Classify error type\n let errorType: string = EXPORTER_LABELS.ERROR_OTHER;\n if (err instanceof InvalidMetricNameError || err instanceof InvalidLabelNameError) {\n errorType = EXPORTER_LABELS.ERROR_VALIDATION;\n } else if (err instanceof MetricRegistrationError) {\n errorType = EXPORTER_LABELS.ERROR_OTHER;\n }\n\n // Emit error metrics\n this.safeInstrument(() => {\n this.telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.REFRESH_TOTAL)\n .inc(1, { result: EXPORTER_LABELS.RESULT_ERROR });\n\n this.telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.REFRESH_ERRORS_TOTAL)\n .inc(1, { error_type: errorType });\n\n this.telemetryRegistry\n .histogram(PROMETHEUS_EXPORTER_METRICS.REFRESH_DURATION_SECONDS, {\n buckets: [...ADR0007_BUCKETS_SECONDS],\n })\n .observe(msToSeconds(durationMs), {\n phase: EXPORTER_LABELS.PHASE_EXPORT,\n result: EXPORTER_LABELS.RESULT_ERROR,\n });\n });\n\n throw new RefreshError(err, {\n refreshCount: this.refreshCount,\n errorCount: this.errorCount,\n });\n } finally {\n // Clear inflight gauge\n this.safeInstrument(() => {\n this.telemetryRegistry.gauge(PROMETHEUS_EXPORTER_METRICS.REFRESH_INFLIGHT).set(0);\n });\n }\n }\n\n /**\n * Get Prometheus metrics in text format\n *\n * Returns metrics in Prometheus exposition text format.\n *\n * @returns Prometheus text format string\n */\n async getMetrics(): Promise<string> {\n await this.init();\n\n if (!this.promRegistry) {\n throw new Error(\"Prometheus registry not initialized\");\n }\n\n return this.promRegistry.metrics();\n }\n\n /**\n * Get exporter statistics\n */\n getStats(): ExporterStats {\n return {\n refreshCount: this.refreshCount,\n errorCount: this.errorCount,\n lastRefreshTime: this.lastRefreshTime,\n metricsCount: this.counters.size + this.gauges.size + this.histograms.size,\n isRefreshing: this.isRefreshing,\n };\n }\n\n /**\n * Get current metrics configuration\n *\n * Returns effective configuration being used by exporter,\n * including defaults for any unspecified options.\n *\n * @returns Current metrics configuration\n */\n getMetricsConfig() {\n return {\n metricsEnabled: this.metricsEnabled,\n recordClientLabel: this.recordClientLabel,\n moduleMetricsEnabled: this.moduleMetricsEnabled,\n namespace: this.namespace,\n subsystem: this.subsystem,\n defaultLabels: { ...this.defaultLabels },\n helpText: { ...this.helpText },\n };\n }\n\n /**\n * Get underlying prom-client Registry\n *\n * Returns null if not yet initialized.\n * Use for advanced prom-client operations.\n */\n // biome-ignore lint/suspicious/noExplicitAny: Returns prom-client Registry type (optional peer dependency)\n getRegistry(): any {\n return this.promRegistry;\n }\n\n /**\n * Get telemetry registry for self-instrumentation\n *\n * Returns the MetricsRegistry instance used for exporter self-instrumentation.\n * Useful for HTTP handler instrumentation.\n *\n * @internal\n */\n getTelemetryRegistry(): typeof defaultRegistry {\n return this.telemetryRegistry;\n }\n\n /**\n * Emit restart metric\n *\n * Records a restart event for tracking exporter or server restarts.\n * Use this when restarting the HTTP metrics server or other exporter components.\n *\n * @param reason - Reason for restart (config_change, error, manual, other)\n *\n * @example\n * ```typescript\n * // Restart server after config change\n * await stopMetricsServer(server);\n * exporter.recordRestart('config_change');\n * const newServer = await startMetricsServer(exporter, newConfig);\n * ```\n */\n recordRestart(reason: \"config_change\" | \"error\" | \"manual\" | \"other\"): void {\n this.safeInstrument(() => {\n this.telemetryRegistry.counter(PROMETHEUS_EXPORTER_METRICS.RESTARTS_TOTAL).inc(1, { reason });\n });\n }\n\n /**\n * Reset all metrics\n */\n reset(): void {\n if (this.promRegistry) {\n this.promRegistry.clear();\n }\n this.counters.clear();\n this.gauges.clear();\n this.histograms.clear();\n }\n\n /**\n * Start background refresh loop\n *\n * Automatically refreshes metrics from TelemetryRegistry at specified interval.\n * Useful for long-running services where metrics should be continuously updated.\n *\n * @param options - Refresh configuration (interval, error handler)\n *\n * @example\n * ```typescript\n * const exporter = new PrometheusExporter({ registry: metrics });\n *\n * // Start refreshing every 15 seconds (default)\n * exporter.startRefresh();\n *\n * // Custom interval and error handling\n * exporter.startRefresh({\n * intervalMs: 10000,\n * onError: (err) => logger.error('Refresh failed:', err)\n * });\n * ```\n */\n startRefresh(options: RefreshOptions = {}): void {\n const intervalMs = options.intervalMs ?? 15000;\n const _isRestart = !!this.refreshInterval;\n\n // Stop existing refresh if running (restart scenario)\n if (this.refreshInterval) {\n this.stopRefresh();\n\n // Emit restart metric\n this.safeInstrument(() => {\n this.telemetryRegistry.counter(PROMETHEUS_EXPORTER_METRICS.RESTARTS_TOTAL).inc(1, {\n reason: options.restartReason || EXPORTER_LABELS.REASON_OTHER,\n });\n });\n }\n\n // Start refresh loop\n this.refreshInterval = setInterval(() => {\n // Don't start new refresh if one is already running (serialization)\n if (this.refreshPromise) {\n return;\n }\n\n this.refreshPromise = this.refresh()\n .catch((err) => {\n // Call error handler if provided\n if (options.onError) {\n options.onError(err as Error);\n }\n })\n .finally(() => {\n this.refreshPromise = null;\n });\n }, intervalMs);\n\n // Update stats to indicate refreshing\n this.isRefreshing = true;\n }\n\n /**\n * Stop background refresh loop\n *\n * Clears the refresh interval and performs one final refresh to capture\n * the latest metrics state before stopping.\n *\n * @example\n * ```typescript\n * // Graceful shutdown\n * await exporter.stopRefresh();\n * ```\n */\n async stopRefresh(): Promise<void> {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n this.refreshInterval = null;\n }\n\n // Wait for any in-flight refresh to complete\n if (this.refreshPromise) {\n await this.refreshPromise;\n }\n\n // Perform final refresh to capture latest state\n try {\n await this.refresh();\n } catch (_err) {\n // Log but don't throw during shutdown\n // Error is already tracked in stats\n }\n\n // Update stats to indicate not refreshing\n this.isRefreshing = false;\n }\n\n /**\n * Update Prometheus collector from MetricsEvent\n */\n private updateCollector(event: MetricsEvent): void {\n const metricName = this.formatMetricName(event.name);\n const help = this.getHelpText(event.name);\n const labelNames = Object.keys(this.defaultLabels);\n\n if (isHistogramSummary(event.value)) {\n this.updateHistogram(metricName, help, labelNames, event.value);\n } else if (typeof event.value === \"number\") {\n // Use Gauge for all scalar metrics (simplest approach)\n // TSFulmen doesn't distinguish Counter vs Gauge in export format\n this.updateGauge(metricName, help, labelNames, event.value);\n }\n }\n\n /**\n * Update or create Prometheus Gauge\n */\n private updateGauge(name: string, help: string, labelNames: string[], value: number): void {\n let gauge = this.gauges.get(name);\n if (!gauge) {\n try {\n gauge = new this.promClient.Gauge({\n name,\n help,\n labelNames,\n registers: [this.promRegistry],\n });\n this.gauges.set(name, gauge);\n } catch (err) {\n throw new MetricRegistrationError(name, err);\n }\n }\n\n gauge.labels(this.defaultLabels).set(value);\n }\n\n /**\n * Update or create Prometheus Histogram\n *\n * CRITICAL: Converts OTLP cumulative buckets to Prometheus format.\n * This is an approximation - see Phase 0 investigation for details.\n *\n * LIMITATION: Original observations cannot be perfectly reconstructed from bucket summary.\n * Percentiles will be approximate based on bucket midpoints.\n */\n // biome-ignore lint/suspicious/noExplicitAny: summary is HistogramSummary from TelemetryRegistry\n private updateHistogram(name: string, help: string, labelNames: string[], summary: any): void {\n // biome-ignore lint/suspicious/noExplicitAny: bucket type from HistogramSummary\n const buckets = summary.buckets.map((b: any) => b.le);\n\n let histogram = this.histograms.get(name);\n if (!histogram) {\n try {\n histogram = new this.promClient.Histogram({\n name,\n help,\n labelNames,\n buckets,\n registers: [this.promRegistry],\n });\n this.histograms.set(name, histogram);\n } catch (err) {\n throw new MetricRegistrationError(name, err);\n }\n }\n\n // Reconstruct observations from summary\n const observations = this.reconstructObservations(summary);\n for (const value of observations) {\n histogram.labels(this.defaultLabels).observe(value);\n }\n }\n\n /**\n * Reconstruct observations from histogram summary\n *\n * Converts OTLP cumulative bucket counts to approximate observation values.\n * Uses bucket midpoints to generate synthetic observations.\n *\n * LIMITATION: This is an approximation. Original observation values cannot be\n * perfectly reconstructed from bucket summaries. Percentiles will be approximate\n * based on bucket boundaries. This is acceptable for v0.1.8 initial release.\n *\n * TODO: Future enhancement - capture raw observations in TelemetryRegistry\n * for lossless Prometheus export. Track in Phase 2+ planning.\n * See: .plans/active/v0.2.x-plans/prometheus-type-safety-enhancement.md\n *\n * Algorithm:\n * 1. Calculate non-cumulative count for each bucket (delta between adjacent buckets)\n * 2. For each bucket, place observations at the midpoint between bucket boundaries\n * 3. Return array of synthetic observation values\n */\n // biome-ignore lint/suspicious/noExplicitAny: summary is HistogramSummary from TelemetryRegistry\n private reconstructObservations(summary: any): number[] {\n const observations: number[] = [];\n const buckets = summary.buckets;\n\n if (!buckets || buckets.length === 0) {\n return observations;\n }\n\n let prevCount = 0;\n for (let i = 0; i < buckets.length; i++) {\n const bucket = buckets[i];\n const count = bucket.count - prevCount; // Non-cumulative count for this bucket\n\n if (count > 0) {\n // Determine observation value (bucket midpoint)\n let value: number;\n if (i === 0) {\n // First bucket: midpoint between 0 and upper bound\n value = bucket.le / 2;\n } else {\n // Other buckets: midpoint between previous and current upper bound\n const prevLe = buckets[i - 1].le;\n value = (prevLe + bucket.le) / 2;\n }\n\n // Add 'count' observations at this value\n for (let j = 0; j < count; j++) {\n observations.push(value);\n }\n }\n\n prevCount = bucket.count;\n }\n\n return observations;\n }\n\n /**\n * Format metric name with namespace and subsystem prefix\n *\n * Format: {namespace}_{subsystem}_{metric}\n * Example: fulmen_myapp_schema_validations\n */\n private formatMetricName(name: string): string {\n this.validateMetricName(name);\n return `${this.namespace}_${this.subsystem}_${name}`;\n }\n\n /**\n * Get help text for metric\n *\n * Uses custom help text if provided, otherwise generates default.\n */\n private getHelpText(name: string): string {\n if (this.helpText[name]) {\n return this.helpText[name];\n }\n return `TSFulmen metric: ${name}`;\n }\n\n /**\n * Validate Prometheus metric name\n *\n * Rules: Must start with [a-zA-Z_:] and contain only [a-zA-Z0-9_:]\n *\n * @throws {InvalidMetricNameError} If name is invalid\n */\n private validateMetricName(name: string): void {\n const validPattern = /^[a-zA-Z_:][a-zA-Z0-9_:]*$/;\n if (!validPattern.test(name)) {\n throw new InvalidMetricNameError(\n name,\n \"Metric names must start with [a-zA-Z_:] and contain only [a-zA-Z0-9_:]\",\n );\n }\n }\n\n /**\n * Validate Prometheus label name\n *\n * Rules: Must start with [a-zA-Z_] and contain only [a-zA-Z0-9_]\n *\n * @throws {InvalidLabelNameError} If name is invalid\n */\n private validateLabelName(name: string): void {\n const validPattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n if (!validPattern.test(name)) {\n throw new InvalidLabelNameError(\n name,\n \"Label names must start with [a-zA-Z_] and contain only [a-zA-Z0-9_]\",\n );\n }\n }\n}\n","/**\n * Prometheus exporter lifecycle integration\n *\n * Helpers for integrating PrometheusExporter with TSFulmen lifecycle management,\n * particularly signal handling for graceful shutdown.\n */\n\nimport type { SignalManager } from \"../../foundry/signals/index.js\";\nimport type { PrometheusExporter } from \"./exporter.js\";\n\n/**\n * Register Prometheus exporter shutdown handler\n *\n * Automatically stops the background refresh loop and performs a final refresh\n * when SIGTERM or SIGINT is received. This ensures metrics are up-to-date\n * before the process terminates.\n *\n * @param exporter - PrometheusExporter instance to manage\n * @param manager - SignalManager instance for lifecycle coordination\n *\n * @example\n * ```typescript\n * import { PrometheusExporter, registerPrometheusShutdown } from '@fulmenhq/tsfulmen/telemetry/prometheus';\n * import { createSignalManager } from '@fulmenhq/tsfulmen/foundry/signals';\n *\n * const exporter = new PrometheusExporter({ registry: metrics });\n * const signalManager = createSignalManager();\n *\n * // Register graceful shutdown\n * await registerPrometheusShutdown(exporter, signalManager);\n *\n * // Start refresh loop\n * exporter.startRefresh({ intervalMs: 15000 });\n *\n * // When SIGTERM/SIGINT received, exporter will:\n * // 1. Stop refresh loop\n * // 2. Perform final refresh\n * // 3. Allow process to exit gracefully\n * ```\n */\nexport async function registerPrometheusShutdown(\n exporter: PrometheusExporter,\n manager: SignalManager,\n): Promise<void> {\n const shutdownHandler = async () => {\n await exporter.stopRefresh();\n };\n\n // Register for both SIGTERM and SIGINT\n await manager.register(\"SIGTERM\", shutdownHandler);\n await manager.register(\"SIGINT\", shutdownHandler);\n}\n","/**\n * Core types for progressive logging interface\n */\n\n/**\n * Logging profile enum matching cross-language standard\n */\nexport enum LoggingProfile {\n /**\n * Basic logging for CLI tools and simple applications.\n *\n * Features:\n * - Console output only\n * - Basic severity levels (DEBUG, INFO, WARN, ERROR)\n * - Simple string formatting\n * - No correlation/middleware support\n */\n SIMPLE = \"simple\",\n\n /**\n * Structured logging with basic enterprise features.\n *\n * Features:\n * - JSON output with core envelope fields\n * - Correlation and request IDs\n * - Basic middleware (redaction)\n * - Console and file sinks\n * - No throttling/advanced features\n */\n STRUCTURED = \"structured\",\n\n /**\n * Full enterprise logging with all features.\n *\n * Features:\n * - Complete JSON envelope (20+ fields)\n * - Full correlation/trace support\n * - Complete middleware pipeline\n * - Multiple sink types with rotation\n * - Throttling and backpressure\n * - Performance optimization\n */\n ENTERPRISE = \"enterprise\",\n\n /**\n * User-defined configuration with explicit parameters.\n *\n * Features:\n * - Full parameter control\n * - Custom sink/middleware combinations\n * - Advanced configuration options\n */\n CUSTOM = \"custom\",\n}\n\n/**\n * Base logger configuration\n */\nexport interface BaseLoggerConfig {\n service: string;\n profile: LoggingProfile;\n policyFile?: string;\n}\n\n/**\n * Profile-specific configurations using discriminated unions\n */\nexport type LoggerConfig =\n | ({ profile: LoggingProfile.SIMPLE } & BaseLoggerConfig)\n | ({\n profile: LoggingProfile.STRUCTURED;\n filePath?: string;\n middleware?: Middleware[];\n } & BaseLoggerConfig)\n | ({\n profile: LoggingProfile.ENTERPRISE;\n sinks?: Sink[];\n middleware?: Middleware[];\n } & BaseLoggerConfig)\n | ({\n profile: LoggingProfile.CUSTOM;\n customConfig: CustomLoggerConfig;\n } & BaseLoggerConfig);\n\n/**\n * Custom configuration for CUSTOM profile\n */\nexport interface CustomLoggerConfig {\n sinks: Sink[];\n middleware?: Middleware[];\n throttling?: ThrottlingConfig;\n envelope?: EnvelopeConfig;\n}\n\n/**\n * Log context for structured/enterprise profiles\n */\nexport interface LogContext {\n correlationId?: string;\n requestId?: string;\n userId?: string | number;\n traceId?: string;\n spanId?: string;\n [key: string]: unknown;\n}\n\n/**\n * Sink interface for log output destinations\n */\nexport interface Sink {\n write(event: LogEvent): void;\n}\n\n/**\n * Middleware interface for log processing pipeline\n */\nexport interface Middleware {\n process(event: LogEvent): LogEvent;\n}\n\n/**\n * Base log event interface\n */\nexport interface LogEvent {\n timestamp: string;\n service: string;\n severity: string;\n message: string;\n [key: string]: unknown;\n}\n\n/**\n * Enterprise log event with full envelope\n */\nexport interface EnterpriseLogEvent extends LogEvent {\n correlationId: string;\n requestId?: string;\n traceId?: string;\n spanId?: string;\n userId?: string | number;\n host?: string;\n pid?: number;\n version?: string;\n environment?: string;\n region?: string;\n zone?: string;\n instanceId?: string;\n cluster?: string;\n namespace?: string;\n deployment?: string;\n component?: string;\n module?: string;\n function?: string;\n line?: number;\n stackTrace?: string;\n}\n\n/**\n * Throttling configuration\n */\nexport interface ThrottlingConfig {\n maxPerSecond: number;\n maxPerMinute?: number;\n burstSize?: number;\n}\n\n/**\n * Envelope configuration\n */\nexport interface EnvelopeConfig {\n includeStackTrace?: boolean;\n includeHostInfo?: boolean;\n includeProcessInfo?: boolean;\n customFields?: Record<string, unknown>;\n}\n\n/**\n * Logger implementation interface\n */\nexport interface LoggerImplementation {\n debug(message: string, context?: LogContext): void;\n info(message: string, context?: LogContext): void;\n warn(message: string, context?: LogContext): void;\n error(message: string, error?: Error, context?: LogContext): void;\n child(bindings: Record<string, unknown>): LoggerImplementation;\n}\n\n/**\n * Logging policy definition\n */\nexport interface LoggingPolicy {\n allowedProfiles: LoggingProfile[];\n requiredProfiles?: Record<string, LoggingProfile[]>;\n environmentRules?: Record<string, LoggingProfile[]>;\n customRequirements?: Record<string, unknown>;\n}\n\n/**\n * Policy error thrown when profile not allowed\n */\nexport class PolicyError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PolicyError\";\n }\n}\n","/**\n * Policy enforcement for progressive logging profiles\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport { type LoggingPolicy, LoggingProfile, PolicyError } from \"./types.js\";\n\n/**\n * Options for profile validation\n */\nexport interface PolicyValidationOptions {\n appType?: string;\n environment?: string;\n}\n\n/**\n * Policy enforcer for validating logging profiles against organizational policies\n */\nexport class PolicyEnforcer {\n private readonly policy: LoggingPolicy;\n private readonly policyFile: string;\n\n /**\n * Create a new policy enforcer\n *\n * @param policyFile - Path to YAML policy file\n * @throws {PolicyError} If policy file cannot be loaded or is invalid\n */\n constructor(policyFile: string) {\n this.policyFile = policyFile;\n this.policy = this.loadPolicy(policyFile);\n }\n\n /**\n * Validate if a profile is allowed under the current policy\n *\n * @param profile - The logging profile to validate\n * @param options - Optional validation context (appType, environment)\n * @returns true if profile is allowed, false otherwise\n *\n * @example\n * const enforcer = new PolicyEnforcer('/org/logging-policy.yaml');\n * if (enforcer.validateProfile(LoggingProfile.ENTERPRISE, { environment: 'production' })) {\n * // Profile is allowed\n * }\n */\n validateProfile(profile: LoggingProfile, options?: PolicyValidationOptions): boolean {\n // Check if profile is in allowed list\n if (!this.policy.allowedProfiles.includes(profile)) {\n return false;\n }\n\n // Check environment-specific rules if environment provided\n if (options?.environment && this.policy.environmentRules) {\n const envRules = this.policy.environmentRules[options.environment];\n if (envRules && !envRules.includes(profile)) {\n return false;\n }\n }\n\n // Check app-type specific requirements if appType provided\n if (options?.appType && this.policy.requiredProfiles) {\n const appTypeRules = this.policy.requiredProfiles[options.appType];\n if (appTypeRules && !appTypeRules.includes(profile)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Get the required profile for a given app type and environment\n *\n * @param appType - The application type\n * @param environment - The deployment environment\n * @returns The required logging profile\n * @throws {PolicyError} If no required profile found for app type\n *\n * @example\n * const enforcer = new PolicyEnforcer('/org/logging-policy.yaml');\n * const profile = enforcer.getRequiredProfile('api-server', 'production');\n * // Returns LoggingProfile.ENTERPRISE\n */\n getRequiredProfile(appType: string, environment: string): LoggingProfile {\n // Check required profiles by app type\n if (this.policy.requiredProfiles?.[appType]) {\n const profiles = this.policy.requiredProfiles[appType];\n\n // If environment rules exist, filter by environment\n if (this.policy.environmentRules?.[environment]) {\n const envProfiles = this.policy.environmentRules[environment];\n const validProfiles = profiles.filter((p) => envProfiles.includes(p));\n\n if (validProfiles.length > 0) {\n // Return most restrictive (highest in enum order)\n return this.getMostRestrictiveProfile(validProfiles);\n }\n }\n\n // Return most restrictive from app type requirements\n return this.getMostRestrictiveProfile(profiles);\n }\n\n throw new PolicyError(\n `No required profile found for app type \"${appType}\" in policy ${this.policyFile}`,\n );\n }\n\n /**\n * Get a helpful error message for policy validation failure\n *\n * @param profile - The profile that failed validation\n * @param options - The validation options used\n * @returns A descriptive error message\n */\n getValidationErrorMessage(profile: LoggingProfile, options?: PolicyValidationOptions): string {\n const parts: string[] = [`Profile \"${profile}\" not allowed by policy \"${this.policyFile}\".`];\n\n if (options?.environment) {\n parts.push(`Environment: ${options.environment}`);\n }\n\n if (options?.appType) {\n parts.push(`App Type: ${options.appType}`);\n }\n\n parts.push(`Allowed profiles: ${this.policy.allowedProfiles.join(\", \")}`);\n\n if (options?.environment && this.policy.environmentRules?.[options.environment]) {\n const envProfiles = this.policy.environmentRules[options.environment];\n parts.push(`Environment \"${options.environment}\" allows: ${envProfiles.join(\", \")}`);\n }\n\n if (options?.appType && this.policy.requiredProfiles?.[options.appType]) {\n const appProfiles = this.policy.requiredProfiles[options.appType];\n parts.push(`App type \"${options.appType}\" requires: ${appProfiles.join(\", \")}`);\n }\n\n return parts.join(\" | \");\n }\n\n /**\n * Load and parse the policy file\n *\n * @param policyFile - Path to YAML policy file\n * @returns Parsed logging policy\n * @throws {PolicyError} If file cannot be read or parsed\n */\n private loadPolicy(policyFile: string): LoggingPolicy {\n try {\n const content = readFileSync(policyFile, \"utf-8\");\n const parsed = parseYaml(content) as LoggingPolicy;\n\n // Validate required fields\n if (!parsed.allowedProfiles || !Array.isArray(parsed.allowedProfiles)) {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: missing or invalid \"allowedProfiles\" field`,\n );\n }\n\n // Ensure all profile values are valid\n const validProfiles = Object.values(LoggingProfile);\n for (const profile of parsed.allowedProfiles) {\n if (!validProfiles.includes(profile)) {\n throw new PolicyError(`Invalid policy file ${policyFile}: unknown profile \"${profile}\"`);\n }\n }\n\n // Validate requiredProfiles structure if present\n if (parsed.requiredProfiles) {\n if (typeof parsed.requiredProfiles !== \"object\") {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: \"requiredProfiles\" must be an object`,\n );\n }\n\n for (const [appType, profiles] of Object.entries(parsed.requiredProfiles)) {\n if (!Array.isArray(profiles)) {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: requiredProfiles[\"${appType}\"] must be an array, got ${typeof profiles}. ` +\n \"Check YAML formatting - each profile should be on a new line with a hyphen.\",\n );\n }\n\n for (const profile of profiles) {\n if (!validProfiles.includes(profile)) {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: requiredProfiles[\"${appType}\"] contains unknown profile \"${profile}\"`,\n );\n }\n }\n }\n }\n\n // Validate environmentRules structure if present\n if (parsed.environmentRules) {\n if (typeof parsed.environmentRules !== \"object\") {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: \"environmentRules\" must be an object`,\n );\n }\n\n for (const [environment, profiles] of Object.entries(parsed.environmentRules)) {\n if (!Array.isArray(profiles)) {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: environmentRules[\"${environment}\"] must be an array, got ${typeof profiles}. ` +\n \"Check YAML formatting - each profile should be on a new line with a hyphen.\",\n );\n }\n\n for (const profile of profiles) {\n if (!validProfiles.includes(profile)) {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: environmentRules[\"${environment}\"] contains unknown profile \"${profile}\"`,\n );\n }\n }\n }\n }\n\n return parsed;\n } catch (error) {\n if (error instanceof PolicyError) {\n throw error;\n }\n\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new PolicyError(`Policy file not found: ${policyFile}`);\n }\n\n throw new PolicyError(\n `Failed to load policy file ${policyFile}: ${(error as Error).message}`,\n );\n }\n }\n\n /**\n * Get the most restrictive profile from a list\n * Order: CUSTOM > ENTERPRISE > STRUCTURED > SIMPLE\n *\n * @param profiles - List of profiles\n * @returns The most restrictive profile\n */\n private getMostRestrictiveProfile(profiles: LoggingProfile[]): LoggingProfile {\n const order = [\n LoggingProfile.CUSTOM,\n LoggingProfile.ENTERPRISE,\n LoggingProfile.STRUCTURED,\n LoggingProfile.SIMPLE,\n ];\n\n for (const profile of order) {\n if (profiles.includes(profile)) {\n return profile;\n }\n }\n\n // Fallback to first in list (shouldn't happen with valid input)\n return profiles[0];\n }\n}\n","/**\n * Sink implementations for log output destinations\n */\n\nimport { appendFileSync } from \"node:fs\";\nimport type { LogEvent, Sink } from \"./types.js\";\n\n/**\n * Console sink - writes log events to stdout as JSON\n */\nexport class ConsoleSink implements Sink {\n write(event: LogEvent): void {\n console.log(JSON.stringify(event));\n }\n}\n\n/**\n * File sink - appends log events to a file as JSON\n */\nexport class FileSink implements Sink {\n constructor(private readonly filePath: string) {}\n\n write(event: LogEvent): void {\n try {\n appendFileSync(this.filePath, `${JSON.stringify(event)}\\n`);\n } catch (error) {\n // Log to stderr if file write fails to avoid losing the log\n console.error(`FileSink: Failed to write to ${this.filePath}:`, (error as Error).message);\n // Fall back to console\n console.log(JSON.stringify(event));\n }\n }\n}\n\n/**\n * Null sink - discards all log events (useful for testing or disabling logging)\n */\nexport class NullSink implements Sink {\n write(_event: LogEvent): void {\n // Intentionally do nothing\n }\n}\n","/**\n * Progressive logging interface with profile-driven configuration\n */\n\nimport { hostname } from \"node:os\";\nimport pino from \"pino\";\nimport { PolicyEnforcer } from \"./policy.js\";\nimport { ConsoleSink } from \"./sinks.js\";\nimport {\n type LogContext,\n type LogEvent,\n type LoggerConfig,\n type LoggerImplementation,\n LoggingProfile,\n type Middleware,\n PolicyError,\n type Sink,\n} from \"./types.js\";\n\n/**\n * Progressive logger with profile-based configuration\n */\nexport class Logger {\n private readonly service: string;\n private readonly profile: LoggingProfile;\n private readonly impl: LoggerImplementation;\n\n constructor(config: LoggerConfig) {\n this.service = config.service;\n this.profile = config.profile;\n\n // Validate against policy if provided\n if (config.policyFile) {\n this.validatePolicy(config.profile, config.policyFile);\n }\n\n // Create appropriate implementation\n this.impl = this.createImplementation(config);\n }\n\n debug(message: string, context?: LogContext): void {\n this.impl.debug(message, context);\n }\n\n info(message: string, context?: LogContext): void {\n this.impl.info(message, context);\n }\n\n warn(message: string, context?: LogContext): void {\n this.impl.warn(message, context);\n }\n\n error(message: string, error?: Error, context?: LogContext): void {\n this.impl.error(message, error, context);\n }\n\n child(bindings: Record<string, unknown>): Logger {\n const childLogger = Object.create(this);\n childLogger.impl = this.impl.child(bindings);\n return childLogger;\n }\n\n private validatePolicy(profile: LoggingProfile, policyFile: string): void {\n const enforcer = new PolicyEnforcer(policyFile);\n const appType = process.env.APP_TYPE;\n const environment = process.env.NODE_ENV;\n\n if (!enforcer.validateProfile(profile, { appType, environment })) {\n throw new PolicyError(enforcer.getValidationErrorMessage(profile, { appType, environment }));\n }\n }\n\n private createImplementation(config: LoggerConfig): LoggerImplementation {\n switch (config.profile) {\n case LoggingProfile.SIMPLE:\n return new SimpleLogger(config.service);\n case LoggingProfile.STRUCTURED: {\n const structuredConfig = config as Extract<\n LoggerConfig,\n { profile: LoggingProfile.STRUCTURED }\n >;\n return new StructuredLogger(\n structuredConfig.service,\n structuredConfig.filePath,\n structuredConfig.middleware,\n );\n }\n case LoggingProfile.ENTERPRISE:\n return new EnterpriseLogger(config.service, {\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - proper discriminated union handling in Phase 2\n sinks: (config as any).sinks,\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - proper discriminated union handling in Phase 2\n middleware: (config as any).middleware,\n });\n case LoggingProfile.CUSTOM:\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - proper discriminated union handling in Phase 2\n return new EnterpriseLogger(config.service, (config as any).customConfig);\n }\n }\n}\n\n/**\n * Simple logger implementation using Pino\n */\nclass SimpleLogger implements LoggerImplementation {\n private readonly pino: pino.Logger;\n\n constructor(private readonly service: string) {\n this.pino = pino({\n name: service,\n level: \"debug\",\n messageKey: \"message\",\n base: undefined,\n timestamp: false,\n formatters: {\n level: (label: string) => ({ severity: label.toUpperCase() }),\n // biome-ignore lint/suspicious/noExplicitAny: Pino formatter requires any type\n log: (object: any) => {\n return {\n service: this.service,\n ...object,\n };\n },\n },\n });\n }\n\n debug(message: string, context?: LogContext): void {\n this.pino.debug(context, message);\n }\n\n info(message: string, context?: LogContext): void {\n this.pino.info(context, message);\n }\n\n warn(message: string, context?: LogContext): void {\n this.pino.warn(context, message);\n }\n\n error(message: string, error?: Error, context?: LogContext): void {\n const errorContext = {\n ...context,\n ...(error && { error: error.message, stack: error.stack }),\n };\n this.pino.error(errorContext, message);\n }\n\n child(bindings: Record<string, unknown>): LoggerImplementation {\n const childPino = this.pino.child(bindings);\n const childLogger = Object.create(this);\n childLogger.pino = childPino;\n return childLogger;\n }\n}\n\n/**\n * Structured logger implementation using Pino with optional middleware\n */\nclass StructuredLogger implements LoggerImplementation {\n private readonly pino: pino.Logger;\n private readonly middleware: Middleware[];\n private readonly bindings: Record<string, unknown>;\n\n constructor(\n private readonly service: string,\n readonly filePath?: string,\n middleware?: Middleware[],\n bindings?: Record<string, unknown>,\n existingPino?: pino.Logger,\n ) {\n this.middleware = middleware ?? [];\n this.bindings = bindings ?? {};\n\n const config: pino.LoggerOptions = {\n name: service,\n level: \"debug\",\n messageKey: \"message\",\n base: undefined,\n timestamp: () => `,\"timestamp\":\"${new Date().toISOString()}\"`,\n formatters: {\n level: (label: string) => ({ severity: label.toUpperCase() }),\n // biome-ignore lint/suspicious/noExplicitAny: Pino formatter requires any type\n log: (object: any) => {\n return {\n service: this.service,\n ...object,\n };\n },\n },\n };\n\n // Configure output streams (console + optional file)\n this.pino =\n existingPino ??\n (filePath\n ? pino(\n config,\n pino.multistream([{ stream: process.stdout }, { stream: pino.destination(filePath) }]),\n )\n : pino(config));\n }\n\n debug(message: string, context?: LogContext): void {\n if (this.middleware.length > 0) {\n this.logWithMiddleware(\"DEBUG\", message, context);\n } else {\n this.pino.debug(context, message);\n }\n }\n\n info(message: string, context?: LogContext): void {\n if (this.middleware.length > 0) {\n this.logWithMiddleware(\"INFO\", message, context);\n } else {\n this.pino.info(context, message);\n }\n }\n\n warn(message: string, context?: LogContext): void {\n if (this.middleware.length > 0) {\n this.logWithMiddleware(\"WARN\", message, context);\n } else {\n this.pino.warn(context, message);\n }\n }\n\n error(message: string, error?: Error, context?: LogContext): void {\n const errorContext = {\n ...context,\n ...(error && { error: error.message, stack: error.stack }),\n };\n if (this.middleware.length > 0) {\n this.logWithMiddleware(\"ERROR\", message, errorContext);\n } else {\n this.pino.error(errorContext, message);\n }\n }\n\n private logWithMiddleware(severity: string, message: string, context?: LogContext): void {\n // Build base log event\n let event: LogEvent = {\n timestamp: new Date().toISOString(),\n service: this.service,\n severity,\n message,\n ...this.bindings,\n ...context,\n };\n\n // Apply middleware pipeline\n for (const mw of this.middleware) {\n event = mw.process(event);\n }\n\n // Extract final message and context for Pino\n const { message: finalMessage, severity: finalSeverity, ...finalContext } = event;\n\n // Log through Pino with appropriate level\n const level = (finalSeverity || severity).toLowerCase();\n switch (level) {\n case \"debug\":\n this.pino.debug(finalContext, finalMessage);\n break;\n case \"info\":\n this.pino.info(finalContext, finalMessage);\n break;\n case \"warn\":\n this.pino.warn(finalContext, finalMessage);\n break;\n case \"error\":\n this.pino.error(finalContext, finalMessage);\n break;\n default:\n this.pino.info(finalContext, finalMessage);\n }\n }\n\n child(bindings: Record<string, unknown>): LoggerImplementation {\n const mergedBindings = { ...this.bindings, ...bindings };\n const childPino = this.pino.child(bindings);\n return new StructuredLogger(\n this.service,\n this.filePath,\n this.middleware,\n mergedBindings,\n childPino,\n );\n }\n}\n\n/**\n * Enterprise logger implementation using Pino\n */\nclass EnterpriseLogger implements LoggerImplementation {\n private readonly sinks: Sink[];\n private readonly middleware: Middleware[];\n private readonly bindings: Record<string, unknown>;\n\n constructor(\n private readonly service: string,\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - proper discriminated union handling in Phase 2\n config?: any,\n bindings?: Record<string, unknown>,\n ) {\n this.sinks = config?.sinks ?? [new ConsoleSink()];\n this.middleware = config?.middleware ?? [];\n this.bindings = bindings ?? {};\n }\n\n debug(message: string, context?: LogContext): void {\n this.logWithPipeline(\"DEBUG\", message, context);\n }\n\n info(message: string, context?: LogContext): void {\n this.logWithPipeline(\"INFO\", message, context);\n }\n\n warn(message: string, context?: LogContext): void {\n this.logWithPipeline(\"WARN\", message, context);\n }\n\n error(message: string, error?: Error, context?: LogContext): void {\n const errorContext = {\n ...context,\n ...(error && {\n error: error.message,\n stack: error.stack,\n errorType: error.constructor.name,\n }),\n };\n this.logWithPipeline(\"ERROR\", message, errorContext);\n }\n\n private logWithPipeline(severity: string, message: string, context?: LogContext): void {\n // Create enterprise log event\n let event: LogEvent = {\n timestamp: new Date().toISOString(),\n service: this.service,\n severity,\n message,\n correlationId: context?.correlationId ?? this.generateCorrelationId(),\n host: this.getHostname(),\n pid: process.pid,\n ...this.bindings,\n ...context,\n };\n\n // Apply middleware pipeline\n for (const mw of this.middleware) {\n event = mw.process(event);\n }\n\n // Emit to all sinks\n for (const sink of this.sinks) {\n sink.write(event);\n }\n }\n\n child(bindings: Record<string, unknown>): LoggerImplementation {\n const mergedBindings = { ...this.bindings, ...bindings };\n return new EnterpriseLogger(\n this.service,\n {\n sinks: this.sinks,\n middleware: this.middleware,\n },\n mergedBindings,\n );\n }\n\n private generateCorrelationId(): string {\n // Simple correlation ID generation - will be enhanced in Phase 2\n return `corr-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n private getHostname(): string {\n try {\n return hostname();\n } catch {\n return process.env.HOSTNAME || \"unknown\";\n }\n }\n}\n","/**\n * Factory function for creating loggers with progressive interface\n */\n\nimport { Logger } from \"./logger.js\";\nimport { RedactSecretsMiddleware } from \"./middleware.js\";\nimport { type LoggerConfig, LoggingProfile } from \"./types.js\";\n\n/**\n * Create a logger with the specified configuration\n *\n * @param config - Logger configuration\n * @returns Configured logger instance\n *\n * @example\n * // Simple logger for CLI\n * const logger = createLogger({\n * service: 'mycli',\n * profile: LoggingProfile.SIMPLE\n * });\n *\n * @example\n * // Structured logger with file output\n * const logger = createLogger({\n * service: 'myapp',\n * profile: LoggingProfile.STRUCTURED,\n * filePath: '/var/log/app.log'\n * });\n */\nexport function createLogger(config: LoggerConfig): Logger {\n return new Logger(config);\n}\n\n/**\n * Create a simple logger for CLI tools\n *\n * @param service - Service name\n * @returns Simple logger instance\n */\nexport function createSimpleLogger(service: string): Logger {\n return new Logger({\n service,\n profile: LoggingProfile.SIMPLE,\n });\n}\n\n/**\n * Create a structured logger with JSON output\n *\n * @param service - Service name\n * @param filePath - Optional file path for log output\n * @returns Structured logger instance\n */\nexport function createStructuredLogger(service: string, filePath?: string): Logger {\n return new Logger({\n service,\n profile: LoggingProfile.STRUCTURED,\n filePath,\n });\n}\n\n/**\n * Create an enterprise logger with full features\n *\n * @param service - Service name\n * @param options - Enterprise options (sinks, middleware, etc.)\n * @returns Enterprise logger instance\n */\nexport function createEnterpriseLogger(\n service: string,\n options?: {\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - Sink type to be properly defined in Phase 2\n sinks?: any[];\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - Middleware type to be properly defined in Phase 2\n middleware?: any[];\n },\n): Logger {\n return new Logger({\n service,\n profile: LoggingProfile.ENTERPRISE,\n ...options,\n });\n}\n\n/**\n * Create a structured logger with default redaction middleware\n *\n * Enables secure logging with gofulmen-aligned secret redaction patterns.\n * Child loggers inherit both middleware chain and bindings from parent.\n *\n * Default redaction patterns (can be disabled with useDefaultPatterns: false):\n * - SECRET_* environment variables\n * - *TOKEN*, *KEY* variants\n * - Base64 blobs (40+ characters)\n * - Email addresses\n * - Credit card numbers (13-19 digits)\n *\n * Default field names (case-insensitive):\n * - password, token, apiKey, authorization, secret\n * - cardNumber, cvv, ssn\n *\n * Middleware can modify event severity. The finalSeverity from middleware\n * output is honored in Pino logging, allowing middleware to downgrade noisy\n * errors to warnings or upgrade critical info to error.\n *\n * @param service - Service name\n * @param options - Configuration options\n * @returns Structured logger with redaction enabled\n *\n * @example\n * // Basic usage (default patterns)\n * const logger = createStructuredLoggerWithRedaction('api-server');\n *\n * @example\n * // Custom patterns only\n * const logger = createStructuredLoggerWithRedaction('api-server', {\n * useDefaultPatterns: false,\n * customPatterns: [/MY_CUSTOM_SECRET/g]\n * });\n *\n * @example\n * // Custom fields with default patterns\n * const logger = createStructuredLoggerWithRedaction('api-server', {\n * customFields: ['internalId', 'customerKey']\n * });\n *\n * @example\n * // With file output\n * const logger = createStructuredLoggerWithRedaction('api-server', {\n * filePath: '/var/log/app.log'\n * });\n */\nexport function createStructuredLoggerWithRedaction(\n service: string,\n options?: {\n filePath?: string;\n customPatterns?: RegExp[];\n customFields?: string[];\n useDefaultPatterns?: boolean; // default: true\n },\n): Logger {\n return new Logger({\n service,\n profile: LoggingProfile.STRUCTURED,\n filePath: options?.filePath,\n middleware: [\n new RedactSecretsMiddleware({\n secretKeys: options?.customFields,\n patterns: options?.customPatterns,\n useDefaultPatterns: options?.useDefaultPatterns,\n }),\n ],\n });\n}\n","/**\n * Prometheus HTTP server implementation\n *\n * Framework-agnostic HTTP handler and dev server for exposing Prometheus metrics.\n * Compatible with Node.js http, Express, Fastify, and other frameworks.\n */\n\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport { createServer } from \"node:http\";\nimport { createLogger, LoggingProfile } from \"../../logging/index.js\";\nimport type { MetricsRegistry } from \"../registry.js\";\nimport { PROMETHEUS_EXPORTER_METRICS } from \"./constants.js\";\nimport type { PrometheusExporter } from \"./exporter.js\";\nimport type { ServerOptions } from \"./types.js\";\n\n/**\n * Safe instrumentation helper for HTTP metrics\n *\n * Emits HTTP metrics to provided registry, silently failing if registry\n * doesn't support operation (e.g., mock registries in tests).\n */\nfunction safeInstrumentHTTP(registry: MetricsRegistry | null, fn: () => void): void {\n if (!registry) return;\n try {\n fn();\n } catch {\n // Silently fail - instrumentation is non-critical\n }\n}\n\n/**\n * Get logger from exporter with metricsEnabled check\n */\nfunction getExporterLogger(exporter: PrometheusExporter) {\n // Access private logger property through type assertion\n // biome-ignore lint/suspicious/noExplicitAny: Need to access private logger property\n const exporterAny = exporter as any;\n const logger = exporterAny.logger;\n\n // Return null logger if metrics disabled\n return exporterAny.metricsEnabled ? logger : null;\n}\n\n/**\n * HTTP request context for hooks\n *\n * Provides minimal interface for auth and rate limiting hooks.\n * Compatible with Node.js IncomingMessage and framework request objects.\n */\nexport interface RequestContext {\n /** HTTP method (GET, POST, etc.) */\n method?: string;\n /** Request URL path */\n url?: string;\n /** Request headers */\n headers: Record<string, string | string[] | undefined>;\n /** Remote IP address */\n remoteAddress?: string;\n}\n\n/**\n * Extract request context from Node.js IncomingMessage\n */\nfunction extractRequestContext(req: IncomingMessage): RequestContext {\n return {\n method: req.method,\n url: req.url,\n headers: req.headers as Record<string, string | string[] | undefined>,\n remoteAddress: req.socket.remoteAddress,\n };\n}\n\n/**\n * Create Prometheus metrics HTTP handler\n *\n * Returns a framework-agnostic handler compatible with Node.js http, Express,\n * Fastify, and other frameworks. The handler serves Prometheus metrics in\n * text exposition format with optional authentication and rate limiting.\n *\n * @param exporter - PrometheusExporter instance\n * @param options - Server options (auth, rate limiting, refresh behavior)\n * @returns HTTP handler function\n *\n * @example\n * ```typescript\n * // Basic usage with Node.js http\n * import http from 'node:http';\n * import { PrometheusExporter, createMetricsHandler } from '@fulmenhq/tsfulmen/telemetry/prometheus';\n *\n * const exporter = new PrometheusExporter({ registry: metrics });\n * const handler = createMetricsHandler(exporter);\n *\n * const server = http.createServer(handler);\n * server.listen(9464);\n * ```\n *\n * @example\n * ```typescript\n * // With authentication\n * const handler = createMetricsHandler(exporter, {\n * authenticate: async (req) => {\n * const token = req.headers['authorization'];\n * return token === 'Bearer secret-token';\n * }\n * });\n * ```\n *\n * @example\n * ```typescript\n * // With rate limiting\n * const handler = createMetricsHandler(exporter, {\n * rateLimit: async (req) => {\n * const ip = req.remoteAddress;\n * return rateLimiter.checkLimit(ip);\n * }\n * });\n * ```\n */\nexport function createMetricsHandler(\n exporter: PrometheusExporter,\n options: ServerOptions = {},\n): (req: IncomingMessage, res: ServerResponse) => Promise<void> {\n const path = options.path ?? \"/metrics\";\n const refreshOnScrape = options.refreshOnScrape ?? false;\n const logger = getExporterLogger(exporter);\n\n return async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const telemetryRegistry = exporter.getTelemetryRegistry();\n let _statusCode = 200;\n const startTime = performance.now();\n\n try {\n // Extract request context for hooks\n const context = extractRequestContext(req);\n\n // Check path - only serve metrics on configured path\n if (req.url !== path) {\n _statusCode = 404;\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not Found\");\n\n // Emit HTTP request metric (4xx)\n safeInstrumentHTTP(telemetryRegistry, () => {\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL)\n .inc(1, { status: \"404\", path: req.url || \"unknown\" });\n });\n return;\n }\n\n // Check authentication if hook provided\n if (options.authenticate) {\n const authResult = await options.authenticate(context);\n if (!authResult) {\n _statusCode = 401;\n res.writeHead(401, {\n \"Content-Type\": \"text/plain\",\n \"WWW-Authenticate\": \"Bearer\",\n });\n res.end(\"Unauthorized\");\n\n // Emit HTTP request and error metrics (auth failure)\n safeInstrumentHTTP(telemetryRegistry, () => {\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL)\n .inc(1, { status: \"401\", path });\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_ERRORS_TOTAL)\n .inc(1, { status: \"401\", path });\n });\n return;\n }\n }\n\n // Check rate limit if hook provided\n if (options.rateLimit) {\n const rateLimitResult = await options.rateLimit(context);\n if (!rateLimitResult) {\n _statusCode = 429;\n res.writeHead(429, {\n \"Content-Type\": \"text/plain\",\n \"Retry-After\": \"60\",\n });\n res.end(\"Too Many Requests\");\n\n // Emit HTTP request metric (4xx rate limit)\n safeInstrumentHTTP(telemetryRegistry, () => {\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL)\n .inc(1, { status: \"429\", path });\n });\n return;\n }\n }\n\n // Refresh metrics if configured (optional, adds latency)\n if (refreshOnScrape) {\n await exporter.refresh();\n }\n\n // Get metrics in Prometheus text format\n const metrics = await exporter.getMetrics();\n\n // Send response with correct content-type\n // Prometheus text format version 0.0.4\n _statusCode = 200;\n res.writeHead(200, {\n \"Content-Type\": \"text/plain; version=0.0.4; charset=utf-8\",\n \"Content-Length\": Buffer.byteLength(metrics, \"utf-8\"),\n });\n res.end(metrics);\n\n // Emit HTTP request metric (2xx success)\n safeInstrumentHTTP(telemetryRegistry, () => {\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL)\n .inc(1, { status: \"200\", path });\n });\n } catch (err) {\n // Internal server error\n const errorMessage = err instanceof Error ? err.message : \"Internal Server Error\";\n\n _statusCode = 500;\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(`Error: ${errorMessage}`);\n\n // Emit HTTP request and error metrics (5xx failure)\n safeInstrumentHTTP(telemetryRegistry, () => {\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL)\n .inc(1, { status: \"500\", path });\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_ERRORS_TOTAL)\n .inc(1, { status: \"500\", path });\n });\n } finally {\n // Log HTTP request completion\n if (logger) {\n const durationMs = performance.now() - startTime;\n const context = extractRequestContext(req);\n\n logger.info(\"HTTP request processed\", {\n metric_name: PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL,\n status: _statusCode.toString(),\n path: req.url || \"unknown\",\n method: context.method || \"GET\",\n duration_ms: Math.round(durationMs),\n remote_address: context.remoteAddress,\n });\n }\n }\n };\n}\n\n/**\n * Start Prometheus metrics dev server\n *\n * Creates a standalone HTTP server for serving Prometheus metrics.\n * Useful for development, testing, and simple deployments without a full application framework.\n *\n * @param exporter - PrometheusExporter instance\n * @param options - Server configuration (host, port, path, auth, rate limiting)\n * @returns Promise that resolves to the HTTP Server instance\n *\n * @example\n * ```typescript\n * import { PrometheusExporter, startMetricsServer } from '@fulmenhq/tsfulmen/telemetry/prometheus';\n *\n * const exporter = new PrometheusExporter({ registry: metrics });\n *\n * // Start dev server\n * const server = await startMetricsServer(exporter, {\n * host: '127.0.0.1',\n * port: 9464,\n * path: '/metrics'\n * });\n *\n * console.log('Metrics server listening on http://127.0.0.1:9464/metrics');\n *\n * // Graceful shutdown\n * process.on('SIGTERM', async () => {\n * await stopMetricsServer(server);\n * });\n * ```\n */\nexport async function startMetricsServer(\n exporter: PrometheusExporter,\n options: ServerOptions = {},\n): Promise<Server> {\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 9464;\n const path = options.path ?? \"/metrics\";\n\n // Create handler with options\n const handler = createMetricsHandler(exporter, options);\n\n // Create HTTP server\n const server = createServer(handler);\n\n // Create logger for server operations (only if metrics enabled)\n const exporterLogger = getExporterLogger(exporter);\n const logger =\n exporterLogger ||\n createLogger({\n service: \"prometheus_exporter\",\n profile: LoggingProfile.STRUCTURED,\n });\n\n // Start listening\n return new Promise((resolve, reject) => {\n server.listen(port, host, () => {\n // Log server startup\n logger.info(\"Prometheus metrics server started\", {\n host,\n port,\n path,\n url: `http://${host}:${port}${path}`,\n });\n resolve(server);\n });\n\n server.on(\"error\", (err) => {\n // Log server error\n logger.error(\"Prometheus metrics server error\", err as Error, {\n host,\n port,\n path,\n });\n reject(err);\n });\n });\n}\n\n/**\n * Stop Prometheus metrics server\n *\n * Gracefully shuts down the HTTP server with a configurable timeout.\n * Closes all connections and waits for in-flight requests to complete.\n *\n * @param server - HTTP Server instance from startMetricsServer\n * @param timeoutMs - Timeout in milliseconds (default: 5000)\n * @returns Promise that resolves when server is closed\n *\n * @example\n * ```typescript\n * // Graceful shutdown with 5 second timeout\n * await stopMetricsServer(server);\n *\n * // Custom timeout\n * await stopMetricsServer(server, 10000);\n * ```\n */\nexport async function stopMetricsServer(\n server: Server,\n timeoutMs = 5000,\n exporter?: PrometheusExporter,\n): Promise<void> {\n // Create logger for server operations (only if metrics enabled)\n const exporterLogger = exporter ? getExporterLogger(exporter) : null;\n const logger =\n exporterLogger ||\n createLogger({\n service: \"prometheus_exporter\",\n profile: LoggingProfile.STRUCTURED,\n });\n\n return new Promise((resolve, reject) => {\n // Set timeout for forced shutdown\n const timeout = setTimeout(() => {\n logger.warn(\"Prometheus metrics server shutdown timed out, forcing close\", {\n timeout_ms: timeoutMs,\n });\n server.closeAllConnections?.(); // Available in Node.js 18.2+\n reject(new Error(`Server shutdown timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n\n // Graceful close\n server.close((err) => {\n clearTimeout(timeout);\n if (err) {\n logger.error(\"Error stopping Prometheus metrics server\", err, {\n timeout_ms: timeoutMs,\n });\n reject(err);\n } else {\n logger.info(\"Prometheus metrics server stopped\", {\n timeout_ms: timeoutMs,\n });\n resolve();\n }\n });\n\n // Close all connections immediately (allows graceful request completion)\n server.closeAllConnections?.(); // Available in Node.js 18.2+\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/errors/correlation.ts","../../../src/errors/severity.ts","../../../src/errors/serialization.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/export.ts","../../../src/foundry/errors.ts","../../../src/foundry/loader.ts","../../../src/foundry/country-codes.ts","../../../src/crucible/foundry/exitCodes.ts","../../../src/foundry/exit-codes/capabilities.ts","../../../src/foundry/exit-codes/simplified.ts","../../../src/foundry/exit-codes/index.ts","../../../src/foundry/http-statuses.ts","../../../src/foundry/magic-numbers.ts","../../../src/foundry/detector.ts","../../../src/foundry/mime-types.ts","../../../src/foundry/patterns.ts","../../../src/foundry/signals/catalog.ts","../../../src/foundry/signals/capabilities.ts","../../../src/foundry/signals/config-reload-endpoint.ts","../../../src/appidentity/runtime.ts","../../../src/foundry/signals/control-discovery-endpoint.ts","../../../src/foundry/signals/convenience.ts","../../../src/foundry/signals/double-tap.ts","../../../src/foundry/signals/windows.ts","../../../src/foundry/signals/guards.ts","../../../src/foundry/signals/http-helper.ts","../../../src/foundry/signals/manager.ts","../../../src/foundry/signals/reload.ts","../../../src/foundry/signals/index.ts","../../../src/foundry/similarity/distance.ts","../../../src/foundry/similarity/errors.ts","../../../src/foundry/similarity/normalization.ts","../../../src/foundry/similarity/score.ts","../../../src/foundry/similarity/suggest.ts","../../../src/foundry/similarity/index.ts","../../../src/foundry/index.ts","../../../src/appidentity/cache.ts","../../../src/appidentity/constants.ts","../../../src/appidentity/errors.ts","../../../src/appidentity/discovery.ts","../../../src/appidentity/embedded.ts","../../../src/appidentity/loader.ts","../../../src/schema/cli.ts","../../../src/schema/index.ts","../../../src/errors/validators.ts","../../../src/errors/fulmen-error.ts","../../../src/errors/index.ts","../../../node_modules/prom-client/lib/util.js","../../../node_modules/prom-client/lib/registry.js","../../../node_modules/prom-client/lib/validation.js","../../../node_modules/prom-client/lib/metric.js","../../../node_modules/prom-client/lib/exemplar.js","../../../node_modules/prom-client/lib/counter.js","../../../node_modules/prom-client/lib/gauge.js","../../../node_modules/prom-client/lib/histogram.js","../../../node_modules/bintrees/lib/treebase.js","../../../node_modules/bintrees/lib/rbtree.js","../../../node_modules/bintrees/lib/bintree.js","../../../node_modules/bintrees/index.js","../../../node_modules/tdigest/tdigest.js","../../../node_modules/prom-client/lib/timeWindowQuantiles.js","../../../node_modules/prom-client/lib/summary.js","../../../node_modules/prom-client/lib/pushgateway.js","../../../node_modules/prom-client/lib/bucketGenerators.js","../../../node_modules/@opentelemetry/api/src/platform/node/globalThis.ts","../../../node_modules/@opentelemetry/api/src/platform/node/index.ts","../../../node_modules/@opentelemetry/api/src/platform/index.ts","../../../node_modules/@opentelemetry/api/src/version.ts","../../../node_modules/@opentelemetry/api/src/internal/semver.ts","../../../node_modules/@opentelemetry/api/src/internal/global-utils.ts","../../../node_modules/@opentelemetry/api/src/diag/ComponentLogger.ts","../../../node_modules/@opentelemetry/api/src/diag/types.ts","../../../node_modules/@opentelemetry/api/src/diag/internal/logLevelLogger.ts","../../../node_modules/@opentelemetry/api/src/api/diag.ts","../../../node_modules/@opentelemetry/api/src/baggage/internal/baggage-impl.ts","../../../node_modules/@opentelemetry/api/src/baggage/internal/symbol.ts","../../../node_modules/@opentelemetry/api/src/baggage/utils.ts","../../../node_modules/@opentelemetry/api/src/context/context.ts","../../../node_modules/@opentelemetry/api/src/diag/consoleLogger.ts","../../../node_modules/@opentelemetry/api/src/metrics/NoopMeter.ts","../../../node_modules/@opentelemetry/api/src/metrics/Metric.ts","../../../node_modules/@opentelemetry/api/src/propagation/TextMapPropagator.ts","../../../node_modules/@opentelemetry/api/src/context/NoopContextManager.ts","../../../node_modules/@opentelemetry/api/src/api/context.ts","../../../node_modules/@opentelemetry/api/src/trace/trace_flags.ts","../../../node_modules/@opentelemetry/api/src/trace/invalid-span-constants.ts","../../../node_modules/@opentelemetry/api/src/trace/NonRecordingSpan.ts","../../../node_modules/@opentelemetry/api/src/trace/context-utils.ts","../../../node_modules/@opentelemetry/api/src/trace/spancontext-utils.ts","../../../node_modules/@opentelemetry/api/src/trace/NoopTracer.ts","../../../node_modules/@opentelemetry/api/src/trace/ProxyTracer.ts","../../../node_modules/@opentelemetry/api/src/trace/NoopTracerProvider.ts","../../../node_modules/@opentelemetry/api/src/trace/ProxyTracerProvider.ts","../../../node_modules/@opentelemetry/api/src/trace/SamplingResult.ts","../../../node_modules/@opentelemetry/api/src/trace/span_kind.ts","../../../node_modules/@opentelemetry/api/src/trace/status.ts","../../../node_modules/@opentelemetry/api/src/trace/internal/tracestate-validators.ts","../../../node_modules/@opentelemetry/api/src/trace/internal/tracestate-impl.ts","../../../node_modules/@opentelemetry/api/src/trace/internal/utils.ts","../../../node_modules/@opentelemetry/api/src/context-api.ts","../../../node_modules/@opentelemetry/api/src/diag-api.ts","../../../node_modules/@opentelemetry/api/src/metrics/NoopMeterProvider.ts","../../../node_modules/@opentelemetry/api/src/api/metrics.ts","../../../node_modules/@opentelemetry/api/src/metrics-api.ts","../../../node_modules/@opentelemetry/api/src/propagation/NoopTextMapPropagator.ts","../../../node_modules/@opentelemetry/api/src/baggage/context-helpers.ts","../../../node_modules/@opentelemetry/api/src/api/propagation.ts","../../../node_modules/@opentelemetry/api/src/propagation-api.ts","../../../node_modules/@opentelemetry/api/src/api/trace.ts","../../../node_modules/@opentelemetry/api/src/trace-api.ts","../../../node_modules/@opentelemetry/api/src/index.ts","../../../node_modules/prom-client/lib/metrics/processCpuTotal.js","../../../node_modules/prom-client/lib/metrics/processStartTime.js","../../../node_modules/prom-client/lib/metrics/osMemoryHeapLinux.js","../../../node_modules/prom-client/lib/metrics/helpers/safeMemoryUsage.js","../../../node_modules/prom-client/lib/metrics/osMemoryHeap.js","../../../node_modules/prom-client/lib/metrics/processOpenFileDescriptors.js","../../../node_modules/prom-client/lib/metrics/processMaxFileDescriptors.js","../../../node_modules/prom-client/lib/metrics/eventLoopLag.js","../../../node_modules/prom-client/lib/metrics/helpers/processMetricsHelpers.js","../../../node_modules/prom-client/lib/metrics/processHandles.js","../../../node_modules/prom-client/lib/metrics/processRequests.js","../../../node_modules/prom-client/lib/metrics/processResources.js","../../../node_modules/prom-client/lib/metrics/heapSizeAndUsed.js","../../../node_modules/prom-client/lib/metrics/heapSpacesSizeAndUsed.js","../../../node_modules/prom-client/lib/metrics/version.js","../../../node_modules/prom-client/lib/metrics/gc.js","../../../node_modules/prom-client/lib/defaultMetrics.js","../../../node_modules/prom-client/lib/metricAggregators.js","../../../node_modules/prom-client/lib/cluster.js","../../../node_modules/prom-client/index.js","../../../src/appidentity/helpers.ts","../../../src/appidentity/index.ts","../../../src/telemetry/prometheus/constants.ts","../../../src/telemetry/prometheus/errors.ts","../../../src/telemetry/prometheus/exporter.ts","../../../src/telemetry/prometheus/lifecycle.ts","../../../src/logging/types.ts","../../../src/logging/policy.ts","../../../src/logging/sinks.ts","../../../src/logging/logger.ts","../../../src/logging/create-logger.ts","../../../src/telemetry/prometheus/server.ts"],"names":["ExportErrorReason","diag","parseYAML","__filename","__dirname","access","join","readFile","parseYaml","init_registry","fileURLToPath","dirname","stringifyYAML","extname","init_errors","SimplifiedMode","deepClone","deepFreeze","ensureCatalogLoaded","catalogCache","loadCatalog","SSOT_PATHS","getPlatform","isPOSIX","isWindows","supportsSignalExitCodes","getPlatformCapabilities","init_capabilities","onReload","generateCorrelationId","wasmNormalize","substringSimilarity","wasmScore","wasmSuggest","errors_exports","init_loader","validateSchema","writeFile","exportSchema","exitCodes","SchemaExportError","SchemaValidationError","loadIdentity","AppIdentityError","init_validators","metrics","Counter","Gauge","Histogram","ret","globalRegistry","VERSION","isCompatible","DiagComponentLogger","init_types","DiagLogLevel","DiagAPI","__spreadArray","__read","BaggageImpl","init_utils","BaseContext","context","DiagConsoleLogger","NoopMeter","NoopMetric","NoopCounterMetric","NoopUpDownCounterMetric","NoopGaugeMetric","NoopHistogramMetric","NoopObservableMetric","NoopObservableCounterMetric","NoopObservableGaugeMetric","NoopObservableUpDownCounterMetric","ValueType","NoopContextManager","API_NAME","init_context","ContextAPI","TraceFlags","NonRecordingSpan","NoopTracer","ProxyTracer","NoopTracerProvider","ProxyTracerProvider","SamplingDecision","SpanKind","SpanStatusCode","TraceStateImpl","NoopMeterProvider","MetricsAPI","NoopTextMapPropagator","PropagationAPI","TraceAPI","value","process","LoggingProfile"],"mappings":"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","file":"index.js","sourcesContent":["/**\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","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 addFormats(ajv, { 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 proc.on(\"close\", (code) => resolve(code === 0));\n proc.on(\"error\", () => resolve(false));\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\";\nimport Ajv2020 from \"ajv/dist/2020\";\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 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 * Foundry module - Error handling\n *\n * Custom error classes for Foundry catalog operations with fail-fast validation.\n */\n\nexport class FoundryCatalogError extends Error {\n constructor(\n message: string,\n public readonly catalog?: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = \"FoundryCatalogError\";\n\n // Maintain proper stack trace for V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FoundryCatalogError);\n }\n }\n\n static invalidSchema(catalog: string, details: string, cause?: Error): FoundryCatalogError {\n return new FoundryCatalogError(\n `Invalid schema in ${catalog} catalog: ${details}`,\n catalog,\n cause,\n );\n }\n\n static missingCatalog(catalog: string): FoundryCatalogError {\n return new FoundryCatalogError(`Catalog ${catalog} not found or could not be loaded`, catalog);\n }\n\n static invalidPattern(patternId: string, details: string): FoundryCatalogError {\n return new FoundryCatalogError(`Invalid pattern ${patternId}: ${details}`, \"patterns\");\n }\n\n static compilationError(patternId: string, details: string, cause?: Error): FoundryCatalogError {\n return new FoundryCatalogError(\n `Failed to compile pattern ${patternId}: ${details}`,\n \"patterns\",\n cause,\n );\n }\n}\n","/**\n * Foundry module - SSOT data loader\n *\n * Loads and validates Foundry catalog data from Crucible SSOT assets\n * with Bun-first approach and comprehensive schema validation.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parse as parseYaml } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/validator.js\";\nimport { FoundryCatalogError } from \"./errors.js\";\nimport type {\n CountryCatalog,\n HttpStatusCatalog,\n MimeTypeCatalog,\n PatternCatalog,\n} from \"./types.js\";\n\n// Get the directory of the current module file for proper path resolution\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// SSOT Asset Paths (relative to module file, resolved to absolute paths)\nconst SSOT_PATHS = {\n patterns: join(__dirname, \"../../config/crucible-ts/library/foundry/patterns.yaml\"),\n httpStatuses: join(__dirname, \"../../config/crucible-ts/library/foundry/http-statuses.yaml\"),\n mimeTypes: join(__dirname, \"../../config/crucible-ts/library/foundry/mime-types.yaml\"),\n countryCodes: join(__dirname, \"../../config/crucible-ts/library/foundry/country-codes.yaml\"),\n} as const;\n\n// Schema IDs for Foundry catalogs (from Crucible SSOT)\nconst SCHEMA_IDS = {\n patterns: \"library/foundry/v1.0.0/patterns\",\n httpStatuses: \"library/foundry/v1.0.0/http-status-groups\",\n mimeTypes: \"library/foundry/v1.0.0/mime-types\",\n countryCodes: \"library/foundry/v1.0.0/country-codes\",\n} as const;\n\n/**\n * Load and validate a Foundry catalog from YAML file\n * Bun-first approach with Node.js fallback\n */\nasync function loadCatalog<T>(filePath: string, catalogName: string, schemaId: string): Promise<T> {\n try {\n let content: string;\n\n // Bun-first approach\n if (typeof Bun !== \"undefined\") {\n try {\n const file = Bun.file(filePath);\n if (!(await file.exists())) {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n content = await file.text();\n } catch (error) {\n // Handle Bun-specific errors\n if (error instanceof Error && error.message.includes(\"No such file\")) {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n throw error;\n }\n } else {\n // Node.js fallback\n try {\n content = await readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n throw error;\n }\n }\n\n // Parse YAML content\n const data = parseYaml(content) as T;\n\n // Validate against JSON Schema from Crucible SSOT\n const result = await validateDataBySchemaId(data, schemaId);\n if (!result.valid) {\n const errorMessages = result.diagnostics.map((d) => `${d.pointer}: ${d.message}`).join(\"; \");\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n `Schema validation failed: ${errorMessages}`,\n );\n }\n\n return data;\n } catch (error) {\n if (error instanceof FoundryCatalogError) {\n throw error;\n }\n\n // Distinguish between different types of file access errors\n const err = error as NodeJS.ErrnoException;\n if (err.code === \"ENOENT\") {\n throw FoundryCatalogError.missingCatalog(catalogName);\n } else if (err.code === \"EACCES\") {\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n \"Permission denied accessing catalog file\",\n err,\n );\n } else if (err.code === \"EISDIR\") {\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n \"Expected file but found directory\",\n err,\n );\n } else if (err.code === \"EMFILE\" || err.code === \"ENFILE\") {\n throw FoundryCatalogError.invalidSchema(catalogName, \"Too many open files\", err);\n }\n\n throw FoundryCatalogError.invalidSchema(catalogName, \"Failed to load catalog\", err);\n }\n}\n\n/**\n * Load Pattern Catalog from SSOT\n */\nexport async function loadPatternCatalog(): Promise<PatternCatalog> {\n return loadCatalog<PatternCatalog>(SSOT_PATHS.patterns, \"patterns\", SCHEMA_IDS.patterns);\n}\n\n/**\n * Load HTTP Status Catalog from SSOT\n */\nexport async function loadHttpStatusCatalog(): Promise<HttpStatusCatalog> {\n return loadCatalog<HttpStatusCatalog>(\n SSOT_PATHS.httpStatuses,\n \"httpStatuses\",\n SCHEMA_IDS.httpStatuses,\n );\n}\n\n/**\n * Load MIME Type Catalog from SSOT\n */\nexport async function loadMimeTypeCatalog(): Promise<MimeTypeCatalog> {\n return loadCatalog<MimeTypeCatalog>(SSOT_PATHS.mimeTypes, \"mimeTypes\", SCHEMA_IDS.mimeTypes);\n}\n\n/**\n * Load Country Code Catalog from SSOT\n */\nexport async function loadCountryCodeCatalog(): Promise<CountryCatalog> {\n return loadCatalog<CountryCatalog>(\n SSOT_PATHS.countryCodes,\n \"countryCodes\",\n SCHEMA_IDS.countryCodes,\n );\n}\n\n/**\n * Load all Foundry catalogs\n */\nexport async function loadAllCatalogs(): Promise<{\n patterns: PatternCatalog;\n httpStatuses: HttpStatusCatalog;\n mimeTypes: MimeTypeCatalog;\n countryCodes: CountryCatalog;\n}> {\n const [patterns, httpStatuses, mimeTypes, countryCodes] = await Promise.all([\n loadPatternCatalog(),\n loadHttpStatusCatalog(),\n loadMimeTypeCatalog(),\n loadCountryCodeCatalog(),\n ]);\n\n return { patterns, httpStatuses, mimeTypes, countryCodes };\n}\n","/**\n * Foundry Country Code Catalog - implements ISO 3166 country code lookups\n *\n * Provides case-insensitive alpha-2/alpha-3 lookups and normalized numeric lookups\n * with proper padding (76 → \"076\", \"76\" → \"076\", \"076\" → \"076\")\n */\n\nimport { loadCountryCodeCatalog } from \"./loader.js\";\nimport type { Country, CountryCatalog } from \"./types.js\";\n\nlet catalogCache: CountryCatalog | null = null;\nconst alpha2Index = new Map<string, Country>();\nconst alpha3Index = new Map<string, Country>();\nconst numericIndex = new Map<string, Country>();\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as T;\n }\n\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return cloned as T;\n}\n\nfunction deepFreeze<T extends object>(obj: T): T {\n Object.freeze(obj);\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key];\n if (value !== null && typeof value === \"object\") {\n deepFreeze(value);\n }\n }\n }\n\n return obj;\n}\n\nfunction normalizeNumeric(code: string | number): string {\n const str = typeof code === \"number\" ? code.toString() : code;\n return str.padStart(3, \"0\");\n}\n\nasync function ensureCatalogLoaded(): Promise<void> {\n if (catalogCache !== null) {\n return;\n }\n\n catalogCache = await loadCountryCodeCatalog();\n\n for (const country of catalogCache.countries) {\n // Alpha-2 index (case-insensitive, uppercase keys)\n alpha2Index.set(country.alpha2.toUpperCase(), country);\n\n // Alpha-3 index (case-insensitive, uppercase keys)\n alpha3Index.set(country.alpha3.toUpperCase(), country);\n\n // Numeric index (normalized to 3 digits with leading zeros)\n const normalized = normalizeNumeric(country.numeric);\n numericIndex.set(normalized, country);\n }\n}\n\nexport async function getCountryByAlpha2(code: string): Promise<Readonly<Country> | null> {\n await ensureCatalogLoaded();\n const normalized = code.toUpperCase();\n const country = alpha2Index.get(normalized);\n return country ? deepFreeze(deepClone(country)) : null;\n}\n\nexport async function getCountryByAlpha3(code: string): Promise<Readonly<Country> | null> {\n await ensureCatalogLoaded();\n const normalized = code.toUpperCase();\n const country = alpha3Index.get(normalized);\n return country ? deepFreeze(deepClone(country)) : null;\n}\n\nexport async function getCountryByNumeric(\n code: string | number,\n): Promise<Readonly<Country> | null> {\n await ensureCatalogLoaded();\n const normalized = normalizeNumeric(code);\n const country = numericIndex.get(normalized);\n return country ? deepFreeze(deepClone(country)) : null;\n}\n\nexport async function listCountries(): Promise<ReadonlyArray<Readonly<Country>>> {\n await ensureCatalogLoaded();\n return Array.from(alpha2Index.values()).map((c) => deepFreeze(deepClone(c)));\n}\n\nexport function clearCountryCodeCache(): void {\n catalogCache = null;\n alpha2Index.clear();\n alpha3Index.clear();\n numericIndex.clear();\n}\n","/**\n * Exit Codes - Generated from Crucible catalog\n *\n * This file is AUTO-GENERATED from the Foundry exit codes catalog.\n * DO NOT EDIT MANUALLY - changes will be overwritten.\n *\n * Catalog Version: v1.0.0\n * Last Reviewed: 2025-10-31\n * Source: config/library/foundry/exit-codes.yaml\n */\n\n/**\n * Standardized process exit codes for Fulmen ecosystem\n *\n * @see https://github.com/fulmenhq/crucible/blob/main/docs/standards/library/foundry/README.md#exit-codes\n */\nexport const exitCodes = {\n // Standard Exit Codes (0-1)\n // POSIX standard success and generic failure codes\n EXIT_SUCCESS: 0,\n EXIT_FAILURE: 1,\n\n // Networking & Port Management (10-19)\n // Network-related failures (ports, connectivity, etc.)\n EXIT_PORT_IN_USE: 10,\n EXIT_PORT_RANGE_EXHAUSTED: 11,\n EXIT_INSTANCE_ALREADY_RUNNING: 12,\n EXIT_NETWORK_UNREACHABLE: 13,\n EXIT_CONNECTION_REFUSED: 14,\n EXIT_CONNECTION_TIMEOUT: 15,\n\n // Configuration & Validation (20-29)\n // Configuration errors, validation failures, version mismatches\n EXIT_CONFIG_INVALID: 20,\n EXIT_MISSING_DEPENDENCY: 21,\n EXIT_SSOT_VERSION_MISMATCH: 22,\n EXIT_CONFIG_FILE_NOT_FOUND: 23,\n EXIT_ENVIRONMENT_INVALID: 24,\n\n // Runtime Errors (30-39)\n // Errors during normal operation (health checks, database, etc.)\n EXIT_HEALTH_CHECK_FAILED: 30,\n EXIT_DATABASE_UNAVAILABLE: 31,\n EXIT_EXTERNAL_SERVICE_UNAVAILABLE: 32,\n EXIT_RESOURCE_EXHAUSTED: 33,\n EXIT_OPERATION_TIMEOUT: 34,\n\n // Command-Line Usage Errors (40-49)\n // Invalid arguments, missing required flags, usage errors\n EXIT_INVALID_ARGUMENT: 40,\n EXIT_MISSING_REQUIRED_ARGUMENT: 41,\n EXIT_USAGE: 64,\n\n // Permissions & File Access (50-59)\n // Permission denied, file not found, access errors\n EXIT_PERMISSION_DENIED: 50,\n EXIT_FILE_NOT_FOUND: 51,\n EXIT_DIRECTORY_NOT_FOUND: 52,\n EXIT_FILE_READ_ERROR: 53,\n EXIT_FILE_WRITE_ERROR: 54,\n\n // Data & Processing Errors (60-69)\n // Data validation, parsing, transformation failures\n EXIT_DATA_INVALID: 60,\n EXIT_PARSE_ERROR: 61,\n EXIT_TRANSFORMATION_FAILED: 62,\n EXIT_DATA_CORRUPT: 63,\n\n // Security & Authentication (70-79)\n // Authentication failures, authorization errors, security violations\n EXIT_AUTHENTICATION_FAILED: 70,\n EXIT_AUTHORIZATION_FAILED: 71,\n EXIT_SECURITY_VIOLATION: 72,\n EXIT_CERTIFICATE_INVALID: 73,\n\n // Observability & Monitoring (80-89)\n // Observability infrastructure failures. Use when observability is CRITICAL to operation (e.g., monitoring agents, telemetry exporters). For workhorses where observability is auxiliary: - Log warning and continue (don't exit) - Emit degraded health status - Only exit if explicitly configured (fail_on_observability_error: true)\n EXIT_METRICS_UNAVAILABLE: 80,\n EXIT_TRACING_FAILED: 81,\n EXIT_LOGGING_FAILED: 82,\n EXIT_ALERT_SYSTEM_FAILED: 83,\n EXIT_STRUCTURED_LOGGING_FAILED: 84,\n\n // Testing & Validation (91-99)\n // Test execution outcomes and validation failures. NOTE: Test harnesses MUST use EXIT_SUCCESS (0) for successful test runs per ecosystem conventions (pytest, Go testing, Jest all use 0 for success). Codes in this category are for FAILURES and exceptional conditions only.\n EXIT_TEST_FAILURE: 91,\n EXIT_TEST_ERROR: 92,\n EXIT_TEST_INTERRUPTED: 93,\n EXIT_TEST_USAGE_ERROR: 94,\n EXIT_TEST_NO_TESTS_COLLECTED: 95,\n EXIT_COVERAGE_THRESHOLD_NOT_MET: 96,\n\n // Shell & Process Control (124-127)\n // Exit codes from shell conventions and process control utilities (timeout, exec)\n EXIT_TIMEOUT: 124,\n EXIT_TIMEOUT_INTERNAL: 125,\n EXIT_CANNOT_EXECUTE: 126,\n EXIT_NOT_FOUND: 127,\n\n // Signal-Induced Exits (128-165)\n // Process terminated by Unix signals (128+N pattern per POSIX). Signal codes follow Linux numbering; macOS/FreeBSD differ for SIGUSR1/SIGUSR2. For full signal semantics, see config/library/foundry/signals.yaml. For signal handling patterns, see docs/standards/library/modules/signal-handling.md.\n EXIT_SIGNAL_HUP: 129,\n EXIT_SIGNAL_INT: 130,\n EXIT_SIGNAL_QUIT: 131,\n EXIT_SIGNAL_KILL: 137,\n EXIT_SIGNAL_PIPE: 141,\n EXIT_SIGNAL_ALRM: 142,\n EXIT_SIGNAL_TERM: 143,\n EXIT_SIGNAL_USR1: 138,\n EXIT_SIGNAL_USR2: 140,\n} as const;\n\n/**\n * Exit code value type - union of all valid exit code numbers\n */\nexport type ExitCode = (typeof exitCodes)[keyof typeof exitCodes];\n\n/**\n * Exit code name type - union of all valid exit code constant names\n */\nexport type ExitCodeName = keyof typeof exitCodes;\n\n/**\n * Exit code metadata information\n */\nexport interface ExitCodeInfo {\n code: number;\n name: string;\n description: string;\n context: string;\n category: string;\n retryHint?: \"retry\" | \"no_retry\" | \"investigate\";\n bsdEquivalent?: string;\n pythonNote?: string;\n}\n\n/**\n * Metadata for all exit codes\n */\nexport const exitCodeMetadata: Record<number, ExitCodeInfo> = {\n 0: {\n code: 0,\n name: \"EXIT_SUCCESS\",\n description: \"Successful execution\",\n context: \"Command completed without errors\",\n category: \"standard\",\n },\n 1: {\n code: 1,\n name: \"EXIT_FAILURE\",\n description: \"Generic failure (unspecified error)\",\n context: \"Use when no more specific exit code applies\",\n category: \"standard\",\n },\n 10: {\n code: 10,\n name: \"EXIT_PORT_IN_USE\",\n description: \"Specified port is already in use\",\n context: \"Server startup when port unavailable and fail_if_unavailable strategy\",\n category: \"networking\",\n },\n 11: {\n code: 11,\n name: \"EXIT_PORT_RANGE_EXHAUSTED\",\n description: \"No available ports in configured range\",\n context: \"Server startup when all ports in environment range occupied\",\n category: \"networking\",\n },\n 12: {\n code: 12,\n name: \"EXIT_INSTANCE_ALREADY_RUNNING\",\n description: \"Another instance already running on target port\",\n context: \"Server startup when PID registry shows active process on port\",\n category: \"networking\",\n },\n 13: {\n code: 13,\n name: \"EXIT_NETWORK_UNREACHABLE\",\n description: \"Network destination unreachable\",\n context: \"Client connections, health checks, external service validation\",\n category: \"networking\",\n },\n 14: {\n code: 14,\n name: \"EXIT_CONNECTION_REFUSED\",\n description: \"Connection refused by remote host\",\n context: \"Database connections, API endpoints, upstream services\",\n category: \"networking\",\n },\n 15: {\n code: 15,\n name: \"EXIT_CONNECTION_TIMEOUT\",\n description: \"Connection attempt timed out\",\n context: \"Slow networks, unresponsive services, firewall blocks\",\n category: \"networking\",\n },\n 20: {\n code: 20,\n name: \"EXIT_CONFIG_INVALID\",\n description: \"Configuration file failed validation\",\n context: \"Startup validation, schema mismatches, invalid YAML/JSON\",\n category: \"configuration\",\n retryHint: \"no_retry\",\n },\n 21: {\n code: 21,\n name: \"EXIT_MISSING_DEPENDENCY\",\n description: \"Required dependency not found\",\n context: \"Missing binaries, libraries, or runtime requirements\",\n category: \"configuration\",\n retryHint: \"investigate\",\n },\n 22: {\n code: 22,\n name: \"EXIT_SSOT_VERSION_MISMATCH\",\n description: \"SSOT (Crucible) version incompatible\",\n context: \"Helper library detects unsupported Crucible version\",\n category: \"configuration\",\n retryHint: \"no_retry\",\n },\n 23: {\n code: 23,\n name: \"EXIT_CONFIG_FILE_NOT_FOUND\",\n description: \"Required configuration file not found\",\n context: \"Explicitly specified config path doesn't exist\",\n category: \"configuration\",\n },\n 24: {\n code: 24,\n name: \"EXIT_ENVIRONMENT_INVALID\",\n description: \"Invalid or unsupported environment specification\",\n context: \"Unknown environment name, missing environment config\",\n category: \"configuration\",\n },\n 30: {\n code: 30,\n name: \"EXIT_HEALTH_CHECK_FAILED\",\n description: \"Health check endpoint returned non-healthy status\",\n context: \"Startup health validation, readiness probes\",\n category: \"runtime\",\n retryHint: \"retry\",\n },\n 31: {\n code: 31,\n name: \"EXIT_DATABASE_UNAVAILABLE\",\n description: \"Database connection failed or unavailable\",\n context: \"Startup connection checks, critical query failures\",\n category: \"runtime\",\n retryHint: \"retry\",\n },\n 32: {\n code: 32,\n name: \"EXIT_EXTERNAL_SERVICE_UNAVAILABLE\",\n description: \"Required external service unavailable\",\n context: \"API dependencies, message queues, cache servers\",\n category: \"runtime\",\n },\n 33: {\n code: 33,\n name: \"EXIT_RESOURCE_EXHAUSTED\",\n description: \"System resources exhausted (memory, disk, file descriptors)\",\n context: \"Out-of-memory, disk full, too many open files\",\n category: \"runtime\",\n retryHint: \"investigate\",\n },\n 34: {\n code: 34,\n name: \"EXIT_OPERATION_TIMEOUT\",\n description: \"Operation exceeded timeout threshold\",\n context: \"Long-running tasks, async operations, batch processing\",\n category: \"runtime\",\n retryHint: \"retry\",\n },\n 40: {\n code: 40,\n name: \"EXIT_INVALID_ARGUMENT\",\n description: \"Invalid command-line argument or flag value\",\n context: \"Type errors, out-of-range values, malformed input\",\n category: \"usage\",\n },\n 41: {\n code: 41,\n name: \"EXIT_MISSING_REQUIRED_ARGUMENT\",\n description: \"Required command-line argument not provided\",\n context: \"Missing --config, --port, or other required flags\",\n category: \"usage\",\n },\n 64: {\n code: 64,\n name: \"EXIT_USAGE\",\n description: \"Command-line usage error\",\n context: \"BSD sysexits.h EX_USAGE - wrong number of arguments, bad syntax\",\n category: \"usage\",\n bsdEquivalent: \"EX_USAGE\",\n },\n 50: {\n code: 50,\n name: \"EXIT_PERMISSION_DENIED\",\n description: \"Insufficient permissions for operation\",\n context: \"File access, port binding (<1024), privileged operations\",\n category: \"permissions\",\n },\n 51: {\n code: 51,\n name: \"EXIT_FILE_NOT_FOUND\",\n description: \"Required file not found\",\n context: \"Assets, templates, data files (not config - use 23)\",\n category: \"permissions\",\n },\n 52: {\n code: 52,\n name: \"EXIT_DIRECTORY_NOT_FOUND\",\n description: \"Required directory not found\",\n context: \"State directories, log paths, data directories\",\n category: \"permissions\",\n },\n 53: {\n code: 53,\n name: \"EXIT_FILE_READ_ERROR\",\n description: \"Error reading file\",\n context: \"Corrupt files, I/O errors, encoding issues\",\n category: \"permissions\",\n },\n 54: {\n code: 54,\n name: \"EXIT_FILE_WRITE_ERROR\",\n description: \"Error writing file\",\n context: \"Disk full, read-only filesystem, permission errors\",\n category: \"permissions\",\n },\n 60: {\n code: 60,\n name: \"EXIT_DATA_INVALID\",\n description: \"Input data failed validation\",\n context: \"Schema validation, business rule violations\",\n category: \"data\",\n },\n 61: {\n code: 61,\n name: \"EXIT_PARSE_ERROR\",\n description: \"Error parsing input data\",\n context: \"Malformed JSON/YAML/XML, syntax errors\",\n category: \"data\",\n },\n 62: {\n code: 62,\n name: \"EXIT_TRANSFORMATION_FAILED\",\n description: \"Data transformation or conversion failed\",\n context: \"Type conversions, format transformations, encoding changes\",\n category: \"data\",\n },\n 63: {\n code: 63,\n name: \"EXIT_DATA_CORRUPT\",\n description: \"Data corruption detected\",\n context: \"Checksum failures, integrity violations\",\n category: \"data\",\n },\n 70: {\n code: 70,\n name: \"EXIT_AUTHENTICATION_FAILED\",\n description: \"Authentication failed\",\n context: \"Invalid credentials, expired tokens, auth service unavailable\",\n category: \"security\",\n },\n 71: {\n code: 71,\n name: \"EXIT_AUTHORIZATION_FAILED\",\n description: \"Authorization failed (authenticated but insufficient permissions)\",\n context: \"RBAC failures, scope violations, resource access denied\",\n category: \"security\",\n },\n 72: {\n code: 72,\n name: \"EXIT_SECURITY_VIOLATION\",\n description: \"Security policy violation detected\",\n context: \"Suspicious activity, rate limit exceeded, IP blocklist\",\n category: \"security\",\n },\n 73: {\n code: 73,\n name: \"EXIT_CERTIFICATE_INVALID\",\n description: \"TLS/SSL certificate validation failed\",\n context: \"Expired certs, untrusted CAs, hostname mismatches\",\n category: \"security\",\n bsdEquivalent: \"EX_PROTOCOL\",\n },\n 80: {\n code: 80,\n name: \"EXIT_METRICS_UNAVAILABLE\",\n description: \"Metrics endpoint or collection system unavailable\",\n context:\n \"Use for observability-focused tools (Prometheus exporters, StatsD agents).\\nWorkhorses SHOULD log warning and continue unless configured to fail-fast.\\n\",\n category: \"observability\",\n },\n 81: {\n code: 81,\n name: \"EXIT_TRACING_FAILED\",\n description: \"Distributed tracing system unavailable\",\n context: \"OTLP exporter failed, Jaeger collector unreachable\",\n category: \"observability\",\n },\n 82: {\n code: 82,\n name: \"EXIT_LOGGING_FAILED\",\n description: \"Logging system unavailable or misconfigured\",\n context: \"Log aggregator unreachable, log file unwritable\",\n category: \"observability\",\n },\n 83: {\n code: 83,\n name: \"EXIT_ALERT_SYSTEM_FAILED\",\n description: \"Alerting system unavailable\",\n context: \"PagerDuty API failed, Slack webhook unreachable\",\n category: \"observability\",\n },\n 84: {\n code: 84,\n name: \"EXIT_STRUCTURED_LOGGING_FAILED\",\n description: \"Structured logging system unavailable\",\n context: \"JSON log aggregator unreachable, log schema validation failed\",\n category: \"observability\",\n },\n 91: {\n code: 91,\n name: \"EXIT_TEST_FAILURE\",\n description: \"One or more tests failed\",\n context:\n \"Test assertions failed, expected behavior not met.\\nMaps to pytest exit code 1, Go test failure, Jest failure.\\n\",\n category: \"testing\",\n },\n 92: {\n code: 92,\n name: \"EXIT_TEST_ERROR\",\n description: \"Test execution error (not test failure)\",\n context:\n \"Test setup failed, fixture unavailable, test harness error.\\nMaps to pytest exit code 3 (internal error).\\n\",\n category: \"testing\",\n },\n 93: {\n code: 93,\n name: \"EXIT_TEST_INTERRUPTED\",\n description: \"Test run interrupted by user or system\",\n context:\n \"Ctrl+C during tests, system signal, user cancellation.\\nMaps to pytest exit code 2.\\n\",\n category: \"testing\",\n },\n 94: {\n code: 94,\n name: \"EXIT_TEST_USAGE_ERROR\",\n description: \"Test command usage error\",\n context: \"Invalid test arguments, bad configuration.\\nMaps to pytest exit code 4.\\n\",\n category: \"testing\",\n },\n 95: {\n code: 95,\n name: \"EXIT_TEST_NO_TESTS_COLLECTED\",\n description: \"No tests found or all tests skipped\",\n context: \"Empty test suite, all tests deselected or skipped.\\nMaps to pytest exit code 5.\\n\",\n category: \"testing\",\n },\n 96: {\n code: 96,\n name: \"EXIT_COVERAGE_THRESHOLD_NOT_MET\",\n description: \"Test coverage below required threshold\",\n context: \"Code coverage validation, quality gate failure\",\n category: \"testing\",\n },\n 124: {\n code: 124,\n name: \"EXIT_TIMEOUT\",\n description: \"Command timed out before completion\",\n context: \"GNU timeout or similar utility terminated command after deadline\",\n category: \"shell\",\n },\n 125: {\n code: 125,\n name: \"EXIT_TIMEOUT_INTERNAL\",\n description: \"Timeout utility itself failed\",\n context: \"Error in timeout tool before or during command execution (not command failure)\",\n category: \"shell\",\n },\n 126: {\n code: 126,\n name: \"EXIT_CANNOT_EXECUTE\",\n description: \"Command found but could not be executed\",\n context: \"Permission denied, not executable, exec format error\",\n category: \"shell\",\n bsdEquivalent: \"EX_NOPERM (partial)\",\n },\n 127: {\n code: 127,\n name: \"EXIT_NOT_FOUND\",\n description: \"Command not found\",\n context: \"Executable not found in PATH or specified path does not exist\",\n category: \"shell\",\n bsdEquivalent: \"EX_UNAVAILABLE (partial)\",\n },\n 129: {\n code: 129,\n name: \"EXIT_SIGNAL_HUP\",\n description: \"Hangup signal (SIGHUP) - config reload via restart\",\n context:\n \"Config reload via restart-based pattern (mandatory schema validation).\\nProcess exits with 129, supervisor restarts with new config.\\nSee signals.yaml for reload behavior definition.\",\n category: \"signals\",\n bsdEquivalent: \"128 + 1\",\n },\n 130: {\n code: 130,\n name: \"EXIT_SIGNAL_INT\",\n description: \"Interrupt signal (SIGINT) - user interrupt with Ctrl+C double-tap\",\n context:\n \"Ctrl+C pressed. First tap initiates graceful shutdown, second within 2s forces immediate exit.\\nSame exit code (130) for both graceful and force modes.\\nSee signals.yaml for double-tap behavior definition.\",\n category: \"signals\",\n bsdEquivalent: \"128 + 2\",\n },\n 131: {\n code: 131,\n name: \"EXIT_SIGNAL_QUIT\",\n description: \"Quit signal (SIGQUIT) - immediate exit\",\n context:\n \"Ctrl+\\\\ on Unix, Ctrl+Break on Windows. Immediate termination without cleanup.\\nUse for emergency shutdown or debugging (core dumps).\",\n category: \"signals\",\n bsdEquivalent: \"128 + 3\",\n },\n 137: {\n code: 137,\n name: \"EXIT_SIGNAL_KILL\",\n description: \"Kill signal (SIGKILL)\",\n context: \"Forceful termination, non-graceful shutdown (not catchable)\",\n category: \"signals\",\n bsdEquivalent: \"128 + 9\",\n pythonNote: \"Cannot be caught in Python (OS-level)\",\n },\n 141: {\n code: 141,\n name: \"EXIT_SIGNAL_PIPE\",\n description: \"Broken pipe (SIGPIPE) - observe only\",\n context:\n \"Writing to closed pipe/socket. Fulmen default is observe_only (log + graceful exit).\\nApplications may override to ignore for network services.\\nSee signals.yaml for SIGPIPE handling guidance.\",\n category: \"signals\",\n bsdEquivalent: \"128 + 13\",\n pythonNote: \"Raised as BrokenPipeError exception\",\n },\n 142: {\n code: 142,\n name: \"EXIT_SIGNAL_ALRM\",\n description: \"Alarm signal (SIGALRM) - watchdog timeout\",\n context:\n \"Watchdog timer expired. Treat as timeout-induced exit.\\nWatchdog pattern out of scope for v1.0.0 module implementations.\",\n category: \"signals\",\n bsdEquivalent: \"128 + 14\",\n pythonNote: \"Supported by signal module, rarely used in practice\",\n },\n 143: {\n code: 143,\n name: \"EXIT_SIGNAL_TERM\",\n description: \"Termination signal (SIGTERM) - graceful shutdown\",\n context:\n \"Graceful shutdown requested by container orchestrator or process supervisor.\\nStandard 30-second timeout for cleanup. Applications run cleanup handlers before exit.\\nSee signals.yaml for graceful shutdown behavior definition.\",\n category: \"signals\",\n bsdEquivalent: \"128 + 15\",\n pythonNote: \"Default signal for graceful shutdown\",\n },\n 138: {\n code: 138,\n name: \"EXIT_SIGNAL_USR1\",\n description: \"User-defined signal 1 (SIGUSR1) - custom handler\",\n context:\n \"Application-specific signal (e.g., reopen logs, dump stats, trigger profiling).\\nApplications register custom handlers. Exit code 138 on Linux (128+10).\\nPlatform differences: macOS/FreeBSD use signal 30 (exit 158), not 10.\",\n category: \"signals\",\n },\n 140: {\n code: 140,\n name: \"EXIT_SIGNAL_USR2\",\n description: \"User-defined signal 2 (SIGUSR2) - custom handler\",\n context:\n \"Application-specific signal (e.g., toggle debug mode, rotate credentials).\\nApplications register custom handlers. Exit code 140 on Linux (128+12).\\nPlatform differences: macOS/FreeBSD use signal 31 (exit 159), not 12.\",\n category: \"signals\",\n },\n};\n\n/**\n * Get metadata for a specific exit code\n *\n * @param code - Exit code number\n * @returns Exit code metadata or undefined if not found\n */\nexport function getExitCodeInfo(code: number): ExitCodeInfo | undefined {\n return exitCodeMetadata[code];\n}\n\n/**\n * Catalog version for telemetry and compatibility checks\n */\nexport const EXIT_CODES_VERSION = \"v1.0.0\";\n","/**\n * Exit Code Capabilities Detection\n *\n * Detects platform capabilities for exit code support, particularly\n * for signal-based exit codes which are POSIX-specific.\n *\n * @module foundry/exit-codes/capabilities\n */\n\n/**\n * Check if the current platform supports signal-based exit codes\n *\n * Signal exit codes (128+N pattern) are POSIX-specific and not\n * meaningful on Windows. Applications should use this to decide\n * whether to use simplified mode.\n *\n * @returns true if platform supports signal exit codes (POSIX), false otherwise (Windows)\n *\n * @example\n * ```ts\n * import { supportsSignalExitCodes, SimplifiedMode } from '@fulmenhq/tsfulmen/foundry/exit-codes';\n *\n * const exitCodeMode = supportsSignalExitCodes()\n * ? 'full' // Use all 54 exit codes\n * : SimplifiedMode.SEVERITY; // Use simplified mode on Windows\n *\n * console.log(`Exit code mode: ${exitCodeMode}`);\n * ```\n *\n * @example\n * ```ts\n * // Guard signal exit code usage\n * import { exitCodes, supportsSignalExitCodes } from '@fulmenhq/tsfulmen/foundry/exit-codes';\n *\n * function handleTermination() {\n * if (supportsSignalExitCodes()) {\n * // POSIX: Use specific signal exit code\n * process.exit(exitCodes.EXIT_SIGNAL_TERM);\n * } else {\n * // Windows: Use generic failure\n * process.exit(exitCodes.EXIT_FAILURE);\n * }\n * }\n * ```\n */\nexport function supportsSignalExitCodes(): boolean {\n // Windows does not support POSIX signals in the same way\n // WSL reports as 'linux' so it will correctly return true\n return process.platform !== \"win32\";\n}\n\n/**\n * Get the current platform identifier\n *\n * Useful for logging and diagnostics.\n *\n * @returns Platform string (linux, darwin, win32, etc.)\n */\nexport function getPlatform(): NodeJS.Platform {\n return process.platform;\n}\n\n/**\n * Check if running on Windows (including WSL detection)\n *\n * Note: WSL reports as 'linux' not 'win32', so this only returns\n * true for native Windows processes.\n *\n * @returns true if running on native Windows\n */\nexport function isWindows(): boolean {\n return process.platform === \"win32\";\n}\n\n/**\n * Check if running on a POSIX-compliant platform\n *\n * @returns true if running on Linux, macOS, or other POSIX systems\n */\nexport function isPOSIX(): boolean {\n return !isWindows();\n}\n\n/**\n * Platform capabilities summary\n */\nexport interface PlatformCapabilities {\n platform: NodeJS.Platform;\n supportsSignalExitCodes: boolean;\n isPOSIX: boolean;\n isWindows: boolean;\n}\n\n/**\n * Get a summary of platform capabilities\n *\n * @returns Platform capabilities object\n *\n * @example\n * ```ts\n * import { getPlatformCapabilities } from '@fulmenhq/tsfulmen/foundry/exit-codes';\n *\n * const caps = getPlatformCapabilities();\n * console.log(`Platform: ${caps.platform}`);\n * console.log(`Supports signal exit codes: ${caps.supportsSignalExitCodes}`);\n * ```\n */\nexport function getPlatformCapabilities(): PlatformCapabilities {\n return {\n platform: getPlatform(),\n supportsSignalExitCodes: supportsSignalExitCodes(),\n isPOSIX: isPOSIX(),\n isWindows: isWindows(),\n };\n}\n","/**\n * Simplified Exit Code Mapping\n *\n * Provides simplified exit code modes for applications that don't need\n * the full granularity of 54 exit codes. Useful for:\n * - Windows environments where signal codes may not be relevant\n * - Simple scripts that only need basic success/failure indication\n * - Wrapper scripts that aggregate multiple failure types\n *\n * @module foundry/exit-codes/simplified\n */\n\nimport type { ExitCode } from \"../../crucible/foundry/exitCodes.js\";\nimport { exitCodeMetadata } from \"../../crucible/foundry/exitCodes.js\";\n\n/**\n * Simplified exit code modes\n */\nexport enum SimplifiedMode {\n /**\n * BASIC mode: Only success (0) and failure (1)\n * - 0 = EXIT_SUCCESS\n * - 1 = All failures\n */\n BASIC = \"basic\",\n\n /**\n * SEVERITY mode: Success, recoverable, config, fatal\n * - 0 = EXIT_SUCCESS\n * - 1 = Recoverable errors (retry possible)\n * - 2 = Configuration/usage errors (fix config, don't retry)\n * - 3 = Fatal errors (investigate required)\n */\n SEVERITY = \"severity\",\n}\n\n/**\n * Map a full exit code to a simplified code based on mode\n *\n * @param code - Full exit code from exitCodes\n * @param mode - Simplified mode to use\n * @returns Simplified exit code (0-3 depending on mode)\n *\n * @example\n * ```ts\n * import { exitCodes, mapExitCodeToSimplified, SimplifiedMode } from '@fulmenhq/tsfulmen/foundry/exit-codes';\n *\n * // Basic mode - only 0 or 1\n * const basicCode = mapExitCodeToSimplified(exitCodes.EXIT_CONFIG_INVALID, SimplifiedMode.BASIC);\n * console.log(basicCode); // 1 (any failure)\n *\n * // Severity mode - categorizes failures\n * const sevCode = mapExitCodeToSimplified(exitCodes.EXIT_CONFIG_INVALID, SimplifiedMode.SEVERITY);\n * console.log(sevCode); // 2 (config error - don't retry)\n *\n * const retryCode = mapExitCodeToSimplified(exitCodes.EXIT_DATABASE_UNAVAILABLE, SimplifiedMode.SEVERITY);\n * console.log(retryCode); // 1 (recoverable - retry possible)\n * ```\n */\nexport function mapExitCodeToSimplified(\n code: ExitCode,\n mode: SimplifiedMode = SimplifiedMode.BASIC,\n): number {\n // Success is always 0\n if (code === 0) {\n return 0;\n }\n\n // BASIC mode: everything else is 1\n if (mode === SimplifiedMode.BASIC) {\n return 1;\n }\n\n // SEVERITY mode: categorize based on metadata\n const info = exitCodeMetadata[code];\n if (!info) {\n // Unknown code - treat as fatal\n return 3;\n }\n\n // Check retry hint first\n if (info.retryHint === \"retry\") {\n // Recoverable - likely transient failure\n return 1;\n }\n\n if (info.retryHint === \"no_retry\") {\n // Configuration/permanent error - don't retry\n return 2;\n }\n\n if (info.retryHint === \"investigate\") {\n // Serious issue requiring investigation\n return 3;\n }\n\n // Category-based fallback\n switch (info.category) {\n case \"configuration\":\n case \"usage\":\n // Config and usage errors - fix config, don't retry\n return 2;\n\n case \"networking\":\n case \"runtime\":\n // Network and runtime issues - often recoverable\n return 1;\n\n case \"permissions\":\n case \"data\":\n // Permission and data errors - likely permanent\n return 2;\n\n case \"security\":\n // Security issues - investigate\n return 3;\n\n case \"observability\":\n // Observability failures - recoverable if non-critical\n return 1;\n\n case \"testing\":\n // Test failures - depends on context, default to failure\n return 1;\n\n case \"signals\":\n // Signal termination - not applicable on Windows\n // Treat as fatal since process was forcibly terminated\n return 3;\n\n default:\n // Unknown category - treat as generic failure\n return 1;\n }\n}\n\n/**\n * Get all simplified exit codes for a given mode\n *\n * @param mode - Simplified mode\n * @returns Array of simplified codes for this mode\n *\n * @example\n * ```ts\n * import { getSimplifiedCodes, SimplifiedMode } from '@fulmenhq/tsfulmen/foundry/exit-codes';\n *\n * console.log(getSimplifiedCodes(SimplifiedMode.BASIC));\n * // [0, 1]\n *\n * console.log(getSimplifiedCodes(SimplifiedMode.SEVERITY));\n * // [0, 1, 2, 3]\n * ```\n */\nexport function getSimplifiedCodes(mode: SimplifiedMode): number[] {\n switch (mode) {\n case SimplifiedMode.BASIC:\n return [0, 1];\n case SimplifiedMode.SEVERITY:\n return [0, 1, 2, 3];\n default:\n return [0, 1];\n }\n}\n\n/**\n * Get description for a simplified exit code\n *\n * @param code - Simplified exit code\n * @param mode - Simplified mode\n * @returns Human-readable description\n */\nexport function getSimplifiedCodeDescription(code: number, mode: SimplifiedMode): string {\n if (mode === SimplifiedMode.BASIC) {\n switch (code) {\n case 0:\n return \"Success\";\n case 1:\n return \"Failure\";\n default:\n return \"Unknown\";\n }\n }\n\n if (mode === SimplifiedMode.SEVERITY) {\n switch (code) {\n case 0:\n return \"Success\";\n case 1:\n return \"Recoverable error (retry possible)\";\n case 2:\n return \"Configuration error (fix config, don't retry)\";\n case 3:\n return \"Fatal error (investigate required)\";\n default:\n return \"Unknown\";\n }\n }\n\n return \"Unknown mode\";\n}\n","/**\n * Exit Codes Module\n *\n * Standardized process exit codes for the Fulmen ecosystem.\n * Generated from Crucible catalog and synced via make sync-ssot.\n *\n * @module foundry/exit-codes\n */\n\n// Re-export generated exit codes from crucible foundry\nexport {\n EXIT_CODES_VERSION,\n type ExitCode,\n type ExitCodeInfo,\n type ExitCodeName,\n exitCodeMetadata,\n exitCodes,\n getExitCodeInfo,\n} from \"../../crucible/foundry/exitCodes.js\";\n// Export capability detection helpers\nexport {\n getPlatform,\n getPlatformCapabilities,\n isPOSIX,\n isWindows,\n type PlatformCapabilities,\n supportsSignalExitCodes,\n} from \"./capabilities.js\";\n// Export simplified mode helpers\nexport {\n getSimplifiedCodeDescription,\n getSimplifiedCodes,\n mapExitCodeToSimplified,\n SimplifiedMode,\n} from \"./simplified.js\";\n","/**\n * Foundry HTTP Status Catalog - implements HTTP status code access and helpers\n */\n\nimport { loadHttpStatusCatalog } from \"./loader.js\";\nimport type { HttpStatusCatalog, HttpStatusCode, HttpStatusGroupId } from \"./types.js\";\n\nlet catalogCache: HttpStatusCatalog | null = null;\nconst statusCodeIndex = new Map<number, HttpStatusCode>();\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as T;\n }\n\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return cloned as T;\n}\n\nfunction deepFreeze<T extends object>(obj: T): T {\n Object.freeze(obj);\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key];\n if (value !== null && typeof value === \"object\") {\n deepFreeze(value);\n }\n }\n }\n\n return obj;\n}\n\nasync function ensureCatalogLoaded(): Promise<void> {\n if (catalogCache !== null) {\n return;\n }\n\n catalogCache = await loadHttpStatusCatalog();\n\n for (const group of catalogCache.groups) {\n const groupId = group.id as HttpStatusGroupId;\n for (const code of group.codes) {\n statusCodeIndex.set(code.value, {\n value: code.value,\n reason: code.reason,\n group: groupId,\n });\n }\n }\n}\n\nexport async function getHttpStatus(code: number): Promise<Readonly<HttpStatusCode> | null> {\n await ensureCatalogLoaded();\n const status = statusCodeIndex.get(code);\n return status ? deepFreeze(deepClone(status)) : null;\n}\n\nexport function isInformational(code: number): boolean {\n return code >= 100 && code < 200;\n}\n\nexport function isSuccess(code: number): boolean {\n return code >= 200 && code < 300;\n}\n\nexport function isRedirection(code: number): boolean {\n return code >= 300 && code < 400;\n}\n\nexport function isClientError(code: number): boolean {\n return code >= 400 && code < 500;\n}\n\nexport function isServerError(code: number): boolean {\n return code >= 500 && code < 600;\n}\n\nexport async function listHttpStatuses(): Promise<ReadonlyArray<Readonly<HttpStatusCode>>> {\n await ensureCatalogLoaded();\n return Array.from(statusCodeIndex.values()).map((s) => deepFreeze(deepClone(s)));\n}\n\nexport async function getStatusReason(code: number): Promise<string | null> {\n const status = await getHttpStatus(code);\n return status?.reason ?? null;\n}\n\nexport function clearHttpStatusCache(): void {\n catalogCache = null;\n statusCodeIndex.clear();\n}\n","/**\n * Foundry MIME Type Magic Number Database\n *\n * Defines byte patterns (magic numbers) for content-based MIME type detection.\n * Patterns are ordered by priority for accurate multi-format detection.\n */\n\nexport interface MagicNumberPattern {\n offset: number;\n bytes: number[];\n mask?: number[];\n description: string;\n}\n\nexport type MatchStrategy = \"exact\" | \"heuristic\";\n\nexport interface MagicNumberSignature {\n mimeType: string;\n patterns: MagicNumberPattern[];\n priority: number;\n matchStrategy: MatchStrategy;\n}\n\n// UTF-8 BOM (Byte Order Mark)\nexport const UTF8_BOM: number[] = [0xef, 0xbb, 0xbf];\n\n// XML Patterns (Priority 10 - Most specific)\nconst XML_PATTERNS: MagicNumberPattern[] = [\n {\n offset: 0,\n bytes: [0x3c, 0x3f, 0x78, 0x6d, 0x6c],\n description: \"XML declaration: <?xml\",\n },\n {\n offset: 0,\n bytes: [0xef, 0xbb, 0xbf, 0x3c, 0x3f, 0x78, 0x6d, 0x6c],\n description: \"XML with UTF-8 BOM: BOM + <?xml\",\n },\n];\n\n// JSON Patterns (Priority 9)\nconst JSON_PATTERNS: MagicNumberPattern[] = [\n {\n offset: 0,\n bytes: [0x7b],\n description: \"JSON object start: {\",\n },\n {\n offset: 0,\n bytes: [0x5b],\n description: \"JSON array start: [\",\n },\n {\n offset: 0,\n bytes: [0xef, 0xbb, 0xbf, 0x7b],\n description: \"JSON object with BOM: BOM + {\",\n },\n {\n offset: 0,\n bytes: [0xef, 0xbb, 0xbf, 0x5b],\n description: \"JSON array with BOM: BOM + [\",\n },\n];\n\n// YAML Patterns (Priority 8)\nconst YAML_PATTERNS: MagicNumberPattern[] = [\n {\n offset: 0,\n bytes: [0x2d, 0x2d, 0x2d],\n description: \"YAML document marker: ---\",\n },\n {\n offset: 0,\n bytes: [0x25, 0x59, 0x41, 0x4d, 0x4c],\n description: \"YAML directive: %YAML\",\n },\n];\n\n// NDJSON Patterns (Priority 7 - Heuristic only)\nconst NDJSON_PATTERNS: MagicNumberPattern[] = [];\n\n// CSV Patterns (Priority 6 - Heuristic only)\nconst CSV_PATTERNS: MagicNumberPattern[] = [];\n\n// Protobuf Patterns (Priority 5 - Heuristic only)\nconst PROTOBUF_PATTERNS: MagicNumberPattern[] = [];\n\n// Plain Text Patterns (Priority 1 - Fallback, heuristic)\nconst TEXT_PATTERNS: MagicNumberPattern[] = [];\n\n/**\n * Magic Number Database\n *\n * Ordered by detection priority (highest first).\n * Note: Heuristic detection runs BEFORE exact pattern matching\n * for formats that can be ambiguous (NDJSON vs JSON).\n */\nexport const MAGIC_NUMBER_DATABASE: MagicNumberSignature[] = [\n {\n mimeType: \"application/xml\",\n patterns: XML_PATTERNS,\n priority: 10,\n matchStrategy: \"exact\",\n },\n {\n mimeType: \"application/x-ndjson\",\n patterns: NDJSON_PATTERNS,\n priority: 9,\n matchStrategy: \"heuristic\",\n },\n {\n mimeType: \"application/json\",\n patterns: JSON_PATTERNS,\n priority: 8,\n matchStrategy: \"exact\",\n },\n {\n mimeType: \"application/yaml\",\n patterns: YAML_PATTERNS,\n priority: 7,\n matchStrategy: \"exact\",\n },\n {\n mimeType: \"application/yaml\",\n patterns: [],\n priority: 6.5,\n matchStrategy: \"heuristic\",\n },\n {\n mimeType: \"text/csv\",\n patterns: CSV_PATTERNS,\n priority: 6,\n matchStrategy: \"heuristic\",\n },\n {\n mimeType: \"application/x-protobuf\",\n patterns: PROTOBUF_PATTERNS,\n priority: 5,\n matchStrategy: \"heuristic\",\n },\n {\n mimeType: \"text/plain\",\n patterns: TEXT_PATTERNS,\n priority: 1,\n matchStrategy: \"heuristic\",\n },\n];\n\n/**\n * Check if buffer starts with UTF-8 BOM\n */\nexport function hasBOM(buffer: Buffer): boolean {\n if (buffer.length < 3) return false;\n return buffer[0] === UTF8_BOM[0] && buffer[1] === UTF8_BOM[1] && buffer[2] === UTF8_BOM[2];\n}\n\n/**\n * Get offset to skip BOM if present\n */\nexport function getBOMOffset(buffer: Buffer): number {\n return hasBOM(buffer) ? 3 : 0;\n}\n","/**\n * Foundry MIME Type Detector\n *\n * Pattern matching engine for content-based MIME type detection using\n * magic numbers and heuristic analysis.\n */\n\nimport {\n getBOMOffset,\n MAGIC_NUMBER_DATABASE,\n type MagicNumberPattern,\n type MagicNumberSignature,\n} from \"./magic-numbers.js\";\nimport type { MimeType } from \"./types.js\";\n\nexport interface DetectionOptions {\n /**\n * Fall back to extension-based detection if magic number detection fails.\n * Default: true\n */\n fallbackToExtension?: boolean;\n\n /**\n * Number of bytes to read for magic number detection.\n * Default: 512\n */\n bytesToRead?: number;\n\n /**\n * File extension hint for fallback detection.\n * Useful when input is a Buffer without path context.\n */\n extensionHint?: string;\n}\n\nexport class MimeTypeDetector {\n private patterns: MagicNumberSignature[];\n private catalog: Map<string, MimeType>;\n\n constructor(patterns: MagicNumberSignature[], catalog: Map<string, MimeType>) {\n this.patterns = [...patterns].sort((a, b) => b.priority - a.priority);\n this.catalog = catalog;\n }\n\n /**\n * Detect MIME type from buffer content\n */\n detect(buffer: Buffer, _options: DetectionOptions = {}): MimeType | null {\n // Skip BOM if present\n const offset = getBOMOffset(buffer);\n const workingBuffer = offset > 0 ? buffer.subarray(offset) : buffer;\n\n // Try patterns in priority order, regardless of strategy\n // This allows NDJSON heuristic to run before JSON exact match\n for (const pattern of this.patterns) {\n if (pattern.matchStrategy === \"exact\" && this.matchPattern(workingBuffer, pattern)) {\n return this.catalog.get(pattern.mimeType) || null;\n }\n if (pattern.matchStrategy === \"heuristic\" && this.matchHeuristic(workingBuffer, pattern)) {\n return this.catalog.get(pattern.mimeType) || null;\n }\n }\n\n return null;\n }\n\n /**\n * Match buffer against a pattern signature\n */\n private matchPattern(buffer: Buffer, signature: MagicNumberSignature): boolean {\n for (const pattern of signature.patterns) {\n if (this.matchBytes(buffer, pattern)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Match bytes at specified offset with optional masking\n */\n private matchBytes(buffer: Buffer, pattern: MagicNumberPattern): boolean {\n const { offset, bytes, mask } = pattern;\n\n if (buffer.length < offset + bytes.length) {\n return false;\n }\n\n for (let i = 0; i < bytes.length; i++) {\n const bufferByte = buffer[offset + i];\n const patternByte = bytes[i];\n const maskByte = mask ? mask[i] : 0xff;\n\n if ((bufferByte & maskByte) !== (patternByte & maskByte)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Heuristic detection for formats without magic numbers\n */\n private matchHeuristic(buffer: Buffer, signature: MagicNumberSignature): boolean {\n switch (signature.mimeType) {\n case \"application/x-ndjson\":\n return this.detectNDJSON(buffer);\n case \"application/yaml\":\n return this.detectYAML(buffer);\n case \"text/csv\":\n return this.detectCSV(buffer);\n case \"application/x-protobuf\":\n return this.detectProtobuf(buffer);\n case \"text/plain\":\n return this.detectPlainText(buffer);\n default:\n return false;\n }\n }\n\n /**\n * Detect NDJSON (newline-delimited JSON)\n */\n private detectNDJSON(buffer: Buffer): boolean {\n try {\n const text = buffer.toString(\"utf-8\", 0, Math.min(buffer.length, 512));\n const lines = text.split(\"\\n\").filter((line) => line.trim().length > 0);\n\n if (lines.length < 2) return false;\n\n // Check if at least first 2-3 lines are valid JSON\n const linesToCheck = Math.min(3, lines.length);\n let validJsonLines = 0;\n\n for (let i = 0; i < linesToCheck; i++) {\n try {\n JSON.parse(lines[i]);\n validJsonLines++;\n } catch {\n return false;\n }\n }\n\n return validJsonLines >= 2;\n } catch {\n return false;\n }\n }\n\n /**\n * Detect YAML format (heuristic for files without --- header)\n */\n private detectYAML(buffer: Buffer): boolean {\n try {\n const text = buffer.toString(\"utf-8\", 0, Math.min(buffer.length, 512));\n const lines = text.split(\"\\n\").filter((line) => line.trim().length > 0);\n\n if (lines.length === 0) return false;\n\n // Count YAML-like patterns\n let yamlIndicators = 0;\n let nonYamlIndicators = 0;\n\n for (const line of lines.slice(0, 10)) {\n const trimmed = line.trim();\n\n // Skip comments\n if (trimmed.startsWith(\"#\")) continue;\n\n // YAML key-value pattern: \"key: value\"\n if (/^[\\w\"'-]+\\s*:\\s*.+$/.test(trimmed)) {\n yamlIndicators++;\n continue;\n }\n\n // YAML list item: \"- item\"\n if (/^-\\s+/.test(trimmed)) {\n yamlIndicators++;\n continue;\n }\n\n // JSON-like patterns suggest not YAML\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\") || trimmed.endsWith(\",\")) {\n nonYamlIndicators++;\n }\n }\n\n // Require at least 2 YAML indicators and no JSON indicators\n return yamlIndicators >= 2 && nonYamlIndicators === 0;\n } catch {\n return false;\n }\n }\n\n /**\n * Detect CSV format\n */\n private detectCSV(buffer: Buffer): boolean {\n try {\n const text = buffer.toString(\"utf-8\", 0, Math.min(buffer.length, 512));\n const lines = text.split(\"\\n\").filter((line) => line.trim().length > 0);\n\n if (lines.length < 2) return false;\n\n // Try common delimiters\n const delimiters = [\",\", \";\", \"\\t\"];\n\n for (const delimiter of delimiters) {\n const counts = lines.map((line) => {\n const escaped = delimiter.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const matches = line.match(new RegExp(escaped, \"g\"));\n return matches ? matches.length : 0;\n });\n\n // Check for consistent delimiter count across lines (and at least 1 delimiter)\n const firstCount = counts[0];\n if (firstCount > 0 && counts.every((count) => count === firstCount)) {\n return true;\n }\n }\n\n return false;\n } catch {\n return false;\n }\n }\n\n /**\n * Detect protobuf binary format\n */\n private detectProtobuf(buffer: Buffer): boolean {\n if (buffer.length < 4) return false;\n\n // Protobuf messages typically start with field tags\n // Field tag = (field_number << 3) | wire_type\n // Wire types: 0 (varint), 1 (64-bit), 2 (length-delimited), 5 (32-bit)\n\n const firstByte = buffer[0];\n const wireType = firstByte & 0x07;\n const fieldNumber = firstByte >> 3;\n\n // Valid wire type (0-5, excluding 3 and 4 which are deprecated)\n const hasValidWireType = wireType === 0 || wireType === 1 || wireType === 2 || wireType === 5;\n\n // Reasonable field number (1-99)\n const hasValidFieldNumber = fieldNumber > 0 && fieldNumber < 100;\n\n // Check if content is binary (not text)\n const isBinary = this.isBinaryContent(buffer);\n\n // All three conditions must be met\n return hasValidWireType && hasValidFieldNumber && isBinary;\n }\n\n /**\n * Detect plain text format\n */\n private detectPlainText(buffer: Buffer): boolean {\n const sample = buffer.subarray(0, Math.min(buffer.length, 512));\n\n // Reject empty buffers\n if (sample.length === 0) return false;\n\n let binaryBytes = 0;\n\n for (const byte of sample) {\n // Count null bytes and non-printable characters (excluding common whitespace)\n if (byte === 0x00 || (byte < 0x20 && byte !== 0x09 && byte !== 0x0a && byte !== 0x0d)) {\n binaryBytes++;\n }\n }\n\n // If less than 5% binary bytes, likely text (stricter threshold)\n return binaryBytes / sample.length < 0.05;\n }\n\n /**\n * Check if buffer contains binary content\n */\n private isBinaryContent(buffer: Buffer): boolean {\n const sample = buffer.subarray(0, Math.min(buffer.length, 512));\n let binaryBytes = 0;\n\n for (const byte of sample) {\n if (byte === 0x00 || (byte < 0x20 && byte !== 0x09 && byte !== 0x0a && byte !== 0x0d)) {\n binaryBytes++;\n }\n }\n\n // More than 10% binary bytes indicates binary content\n return binaryBytes / sample.length > 0.1;\n }\n}\n\n/**\n * Create a detector instance with the global magic number database\n */\nexport function createDetector(catalog: Map<string, MimeType>): MimeTypeDetector {\n return new MimeTypeDetector(MAGIC_NUMBER_DATABASE, catalog);\n}\n","/**\n * Foundry MIME Type Catalog - implements MIME type detection and lookup\n *\n * v0.1.1: Extension-based detection\n * v0.1.2: Magic number detection with streaming support\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { Readable } from \"node:stream\";\nimport { createDetector, type DetectionOptions } from \"./detector.js\";\nimport { loadMimeTypeCatalog } from \"./loader.js\";\nimport type { MimeType, MimeTypeCatalog } from \"./types.js\";\n\nlet catalogCache: MimeTypeCatalog | null = null;\nconst mimeStringIndex = new Map<string, MimeType>();\nconst extensionIndex = new Map<string, MimeType>();\nlet detectorInstance: ReturnType<typeof createDetector> | null = null;\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as T;\n }\n\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return cloned as T;\n}\n\nfunction deepFreeze<T extends object>(obj: T): T {\n Object.freeze(obj);\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key];\n if (value !== null && typeof value === \"object\") {\n deepFreeze(value);\n }\n }\n }\n\n return obj;\n}\n\nasync function ensureCatalogLoaded(): Promise<void> {\n if (catalogCache !== null) {\n return;\n }\n\n catalogCache = await loadMimeTypeCatalog();\n\n for (const mimeType of catalogCache.types) {\n // Index by MIME string (case-insensitive)\n mimeStringIndex.set(mimeType.mime.toLowerCase(), mimeType);\n\n // Index by extensions (case-insensitive, with and without leading dot)\n for (const ext of mimeType.extensions) {\n const normalized = ext.toLowerCase().replace(/^\\./, \"\");\n extensionIndex.set(normalized, mimeType);\n }\n }\n\n // Initialize detector\n detectorInstance = createDetector(mimeStringIndex);\n}\n\nexport async function getMimeType(mimeString: string): Promise<Readonly<MimeType> | null> {\n await ensureCatalogLoaded();\n const normalized = mimeString.toLowerCase();\n const mimeType = mimeStringIndex.get(normalized);\n return mimeType ? deepFreeze(deepClone(mimeType)) : null;\n}\n\nexport async function getMimeTypeByExtension(\n extension: string,\n): Promise<Readonly<MimeType> | null> {\n await ensureCatalogLoaded();\n const normalized = extension.toLowerCase().replace(/^\\./, \"\");\n const mimeType = extensionIndex.get(normalized);\n return mimeType ? deepFreeze(deepClone(mimeType)) : null;\n}\n\n/**\n * Check if a MIME type is supported in the catalog\n *\n * Note: Must be async to ensure catalog is loaded on cold calls.\n * Without ensureCatalogLoaded(), mimeStringIndex would be empty\n * and return false even for valid types.\n */\nexport async function isSupportedMimeType(mime: string): Promise<boolean> {\n await ensureCatalogLoaded();\n return mimeStringIndex.has(mime.toLowerCase());\n}\n\n/**\n * Detect MIME type from content using magic number analysis.\n *\n * Supports multiple input types:\n * - Buffer: Direct content analysis\n * - string (file path): Read and analyze file\n * - ReadableStream: Stream first N bytes for analysis\n * - Readable: Node.js stream first N bytes for analysis\n *\n * @param input - Content to analyze\n * @param options - Detection options\n * @returns Detected MIME type or null if unknown\n */\nexport async function detectMimeType(\n input: Buffer | ReadableStream | Readable | string,\n options?: DetectionOptions,\n): Promise<Readonly<MimeType> | null> {\n await ensureCatalogLoaded();\n\n if (!detectorInstance) {\n throw new Error(\"Detector not initialized\");\n }\n\n // Handle different input types\n if (typeof input === \"string\") {\n return detectMimeTypeFromFile(input, options);\n }\n\n if (Buffer.isBuffer(input)) {\n return detectMimeTypeFromBuffer(input, options);\n }\n\n return detectMimeTypeFromStream(input, options);\n}\n\n/**\n * Detect MIME type from file path\n */\nexport async function detectMimeTypeFromFile(\n filePath: string,\n options: DetectionOptions = {},\n): Promise<Readonly<MimeType> | null> {\n await ensureCatalogLoaded();\n\n if (!detectorInstance) {\n throw new Error(\"Detector not initialized\");\n }\n\n const bytesToRead = options.bytesToRead || 512;\n\n // Use Bun.file() when available for better performance\n if (typeof Bun !== \"undefined\") {\n const file = Bun.file(filePath);\n if (!(await file.exists())) {\n return null;\n }\n const slice = file.slice(0, bytesToRead);\n const arrayBuffer = await slice.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n return detectMimeTypeFromBuffer(buffer, options);\n }\n\n // Node.js fallback\n try {\n const buffer = await readFile(filePath, { encoding: null });\n const sample = buffer.subarray(0, Math.min(buffer.length, bytesToRead));\n return detectMimeTypeFromBuffer(sample, options);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Detect MIME type from Buffer\n */\nexport function detectMimeTypeFromBuffer(\n buffer: Buffer,\n options: DetectionOptions = {},\n): Readonly<MimeType> | null {\n if (!detectorInstance) {\n throw new Error(\"Detector not initialized\");\n }\n\n const result = detectorInstance.detect(buffer, options);\n return result ? deepFreeze(deepClone(result)) : null;\n}\n\n/**\n * Detect MIME type from stream (ReadableStream or Node.js Readable)\n */\nexport async function detectMimeTypeFromStream(\n stream: ReadableStream | Readable,\n options: DetectionOptions = {},\n): Promise<Readonly<MimeType> | null> {\n await ensureCatalogLoaded();\n\n const bytesToRead = options.bytesToRead || 512;\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n\n // Convert Node.js Readable to Web ReadableStream if needed\n const webStream: ReadableStream =\n typeof (stream as ReadableStream).getReader === \"function\"\n ? (stream as ReadableStream)\n : Readable.toWeb(stream as Readable);\n\n const reader = webStream.getReader();\n\n try {\n while (totalBytes < bytesToRead) {\n const { value, done } = await reader.read();\n if (done) break;\n\n chunks.push(value);\n totalBytes += value.length;\n }\n\n const buffer = Buffer.concat(chunks.map((c) => Buffer.from(c)));\n const sample = buffer.subarray(0, Math.min(buffer.length, bytesToRead));\n\n return detectMimeTypeFromBuffer(sample, options);\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Check if buffer matches a known magic number pattern\n */\nexport function matchMagicNumber(buffer: Buffer, mimeType: string): boolean {\n if (!detectorInstance) {\n throw new Error(\"Detector not initialized\");\n }\n\n const result = detectorInstance.detect(buffer);\n return result?.mime === mimeType;\n}\n\nexport async function listMimeTypes(): Promise<ReadonlyArray<Readonly<MimeType>>> {\n await ensureCatalogLoaded();\n return Array.from(mimeStringIndex.values()).map((m) => deepFreeze(deepClone(m)));\n}\n\nexport function clearMimeTypeCache(): void {\n catalogCache = null;\n mimeStringIndex.clear();\n extensionIndex.clear();\n detectorInstance = null;\n}\n","/**\n * Foundry Pattern Catalog - implements pattern access and matching\n */\n\nimport picomatch from \"picomatch\";\nimport { FoundryCatalogError } from \"./errors.js\";\nimport { loadPatternCatalog } from \"./loader.js\";\nimport type { Pattern, PatternCatalog } from \"./types.js\";\n\nlet catalogCache: PatternCatalog | null = null;\nconst patternIndex = new Map<string, Pattern>();\nconst compiledRegexCache = new Map<string, RegExp>();\nconst compiledGlobCache = new Map<string, ReturnType<typeof picomatch>>();\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as T;\n }\n\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return cloned as T;\n}\n\nfunction deepFreeze<T extends object>(obj: T): T {\n Object.freeze(obj);\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key];\n if (value !== null && typeof value === \"object\") {\n deepFreeze(value);\n }\n }\n }\n\n return obj;\n}\n\nasync function ensureCatalogLoaded(): Promise<void> {\n if (catalogCache !== null) {\n return;\n }\n\n catalogCache = await loadPatternCatalog();\n\n for (const pattern of catalogCache.patterns) {\n patternIndex.set(pattern.id, pattern);\n }\n}\n\nexport async function getPattern(id: string): Promise<Readonly<Pattern> | null> {\n await ensureCatalogLoaded();\n const pattern = patternIndex.get(id);\n return pattern ? deepFreeze(deepClone(pattern)) : null;\n}\n\nexport async function getPatternRegex(id: string): Promise<RegExp | null> {\n await ensureCatalogLoaded();\n const pattern = patternIndex.get(id);\n\n if (!pattern) {\n return null;\n }\n\n if (pattern.kind !== \"regex\") {\n throw FoundryCatalogError.invalidSchema(\n \"patterns\",\n `Pattern '${id}' is not a regex pattern (kind: ${pattern.kind})`,\n );\n }\n\n const cached = compiledRegexCache.get(id);\n if (cached !== undefined) {\n return cached;\n }\n\n let flags = \"\";\n if (pattern.flags?.typescript?.ignoreCase) {\n flags += \"i\";\n }\n\n const hasUnicodePropertyEscapes = /\\\\p\\{/.test(pattern.pattern);\n if (pattern.flags?.typescript?.unicode || hasUnicodePropertyEscapes) {\n flags += \"u\";\n }\n\n const regex = new RegExp(pattern.pattern, flags);\n compiledRegexCache.set(id, regex);\n return regex;\n}\n\nfunction getCompiledGlob(id: string, pattern: string): ReturnType<typeof picomatch> {\n const cached = compiledGlobCache.get(id);\n if (cached !== undefined) {\n return cached;\n }\n\n const matcher = picomatch(pattern);\n compiledGlobCache.set(id, matcher);\n return matcher;\n}\n\nexport async function matchPattern(id: string, value: string): Promise<boolean> {\n await ensureCatalogLoaded();\n const pattern = patternIndex.get(id);\n\n if (!pattern) {\n throw FoundryCatalogError.missingCatalog(`Pattern '${id}' not found`);\n }\n\n if (pattern.kind === \"regex\") {\n const regex = await getPatternRegex(id);\n return regex ? regex.test(value) : false;\n }\n\n if (pattern.kind === \"glob\") {\n const matcher = getCompiledGlob(id, pattern.pattern);\n return matcher(value);\n }\n\n if (pattern.kind === \"literal\") {\n return pattern.pattern === value;\n }\n\n throw FoundryCatalogError.invalidSchema(\"patterns\", `Unknown pattern kind: ${pattern.kind}`);\n}\n\nexport async function listPatterns(): Promise<ReadonlyArray<Readonly<Pattern>>> {\n await ensureCatalogLoaded();\n return Array.from(patternIndex.values()).map((p) => deepFreeze(deepClone(p)));\n}\n\nexport async function describePattern(id: string): Promise<string | null> {\n const pattern = await getPattern(id);\n return pattern?.description ?? null;\n}\n\nexport function clearPatternCache(): void {\n catalogCache = null;\n patternIndex.clear();\n compiledRegexCache.clear();\n compiledGlobCache.clear();\n}\n","/**\n * Signal Catalog Loader\n *\n * Loads and validates the signal handling catalog from Crucible SSOT assets\n * following the same pattern as other Foundry catalogs.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parse as parseYaml } from \"yaml\";\nimport { validateDataBySchemaId } from \"../../schema/validator.js\";\nimport { FoundryCatalogError } from \"../errors.js\";\nimport type { BehaviorInfo, SignalCatalog, SignalInfo } from \"./types.js\";\n\n// Get the directory of the current module file for proper path resolution\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Determine correct path based on whether we're in src/ or dist/\n// In development: src/foundry/signals/catalog.ts → ../../../config\n// In production: dist/foundry/index.js (bundled) → ../../config\nfunction getConfigPath(): string {\n if (__dirname.includes(\"/dist/\")) {\n // Bundled in dist/foundry/index.js\n return join(__dirname, \"../../config/crucible-ts/library/foundry/signals.yaml\");\n }\n // Running from source in src/foundry/signals/\n return join(__dirname, \"../../../config/crucible-ts/library/foundry/signals.yaml\");\n}\n\nconst SSOT_PATHS = {\n signals: getConfigPath(),\n} as const;\n\n// Schema ID for signals catalog (from Crucible SSOT)\nconst SCHEMA_ID = \"library/foundry/v1.0.0/signals\";\n\n/**\n * Load and validate the Signal Catalog from SSOT\n * Bun-first approach with Node.js fallback\n */\nasync function loadCatalog(): Promise<SignalCatalog> {\n const filePath = SSOT_PATHS.signals;\n const catalogName = \"signals\";\n\n try {\n let content: string;\n\n // Bun-first approach\n if (typeof Bun !== \"undefined\") {\n try {\n const file = Bun.file(filePath);\n if (!(await file.exists())) {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n content = await file.text();\n } catch (error) {\n // Handle Bun-specific errors\n if (error instanceof Error && error.message.includes(\"No such file\")) {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n throw error;\n }\n } else {\n // Node.js fallback\n try {\n content = await readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n throw error;\n }\n }\n\n // Parse YAML content\n const data = parseYaml(content) as SignalCatalog;\n\n // Validate against JSON Schema from Crucible SSOT\n const result = await validateDataBySchemaId(data, SCHEMA_ID);\n if (!result.valid) {\n const errorMessages = result.diagnostics.map((d) => `${d.pointer}: ${d.message}`).join(\"; \");\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n `Schema validation failed: ${errorMessages}`,\n );\n }\n\n return data;\n } catch (error) {\n if (error instanceof FoundryCatalogError) {\n throw error;\n }\n\n // Distinguish between different types of file access errors\n const err = error as NodeJS.ErrnoException;\n if (err.code === \"ENOENT\") {\n throw FoundryCatalogError.missingCatalog(catalogName);\n } else if (err.code === \"EACCES\") {\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n \"Permission denied accessing catalog file\",\n err,\n );\n } else if (err.code === \"EISDIR\") {\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n \"Expected file but found directory\",\n err,\n );\n } else if (err.code === \"EMFILE\" || err.code === \"ENFILE\") {\n throw FoundryCatalogError.invalidSchema(catalogName, \"Too many open files\", err);\n }\n\n throw FoundryCatalogError.invalidSchema(catalogName, \"Failed to load catalog\", err);\n }\n}\n\n// Cached catalog instance\nlet cachedCatalog: SignalCatalog | null = null;\n\n/**\n * Get the signal catalog, loading it if necessary\n */\nasync function getCatalog(): Promise<SignalCatalog> {\n if (!cachedCatalog) {\n cachedCatalog = await loadCatalog();\n }\n return cachedCatalog;\n}\n\n/**\n * Get the signals catalog version\n */\nexport async function getSignalsVersion(): Promise<string> {\n const catalog = await getCatalog();\n return catalog.version;\n}\n\n/**\n * Get all signals\n */\nexport async function listSignals(): Promise<SignalInfo[]> {\n const catalog = await getCatalog();\n return catalog.signals.map((signal) => ({ ...signal }));\n}\n\n/**\n * Get a specific signal by ID or name\n */\nexport async function getSignal(identifier: string): Promise<SignalInfo | null> {\n const catalog = await getCatalog();\n const signal = catalog.signals.find((s) => s.id === identifier || s.name === identifier);\n return signal ? { ...signal } : null;\n}\n\n/**\n * Get all behaviors\n */\nexport async function listBehaviors(): Promise<BehaviorInfo[]> {\n const catalog = await getCatalog();\n return catalog.behaviors.map((behavior) => ({ ...behavior }));\n}\n\n/**\n * Get a specific behavior by ID\n */\nexport async function getBehavior(id: string): Promise<BehaviorInfo | null> {\n const catalog = await getCatalog();\n const behavior = catalog.behaviors.find((b) => b.id === id);\n return behavior ? { ...behavior } : null;\n}\n\n/**\n * Get the complete catalog (for advanced use cases)\n */\nexport async function getSignalCatalog(): Promise<SignalCatalog> {\n return await getCatalog();\n}\n","/**\n * Signal Capability Detection\n *\n * Platform-aware signal support detection driven by catalog metadata.\n * Ensures cross-language parity by querying windows_event/fallback fields\n * rather than hardcoding signal names.\n */\n\nimport { getSignal, getSignalCatalog } from \"./catalog.js\";\n\n/**\n * Platform types\n */\nexport type Platform = \"linux\" | \"darwin\" | \"win32\" | \"freebsd\" | \"unknown\";\n\n/**\n * Platform capabilities summary\n */\nexport interface PlatformCapabilities {\n platform: Platform;\n isPOSIX: boolean;\n isWindows: boolean;\n supportsNativeSignals: boolean;\n supportsSignalExitCodes: boolean;\n supportedSignals: string[];\n unsupportedSignals: string[];\n mappedSignals: string[]; // Windows console events\n}\n\n/**\n * Detect current platform\n */\nexport function getPlatform(): Platform {\n const platform = process.platform;\n\n switch (platform) {\n case \"linux\":\n return \"linux\";\n case \"darwin\":\n return \"darwin\";\n case \"win32\":\n return \"win32\";\n case \"freebsd\":\n return \"freebsd\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Check if current platform is POSIX-compliant\n */\nexport function isPOSIX(): boolean {\n const platform = getPlatform();\n return platform === \"linux\" || platform === \"darwin\" || platform === \"freebsd\";\n}\n\n/**\n * Check if current platform is Windows\n */\nexport function isWindows(): boolean {\n return getPlatform() === \"win32\";\n}\n\n/**\n * Check if a signal is supported on the current platform\n *\n * Uses catalog metadata (windows_event field) to determine support.\n * Returns true if:\n * - Platform is POSIX (all signals natively supported)\n * - Platform is Windows AND signal has non-null windows_event\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n */\nexport async function supportsSignal(signalName: string): Promise<boolean> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return false;\n }\n\n // POSIX platforms support all signals natively\n if (isPOSIX()) {\n return true;\n }\n\n // Windows: check if signal has a console event mapping\n if (isWindows()) {\n // Signal is supported if windows_event is non-null\n return signal.windows_event !== null;\n }\n\n // Unknown platform: conservative approach (assume unsupported)\n return false;\n}\n\n/**\n * Check if platform supports signal-based exit codes (128+N pattern)\n *\n * Windows doesn't propagate signal numbers via exit codes in the same way\n * as POSIX systems. This function helps applications decide whether to\n * rely on signal exit codes for process monitoring.\n */\nexport function supportsSignalExitCodes(): boolean {\n // Only POSIX systems reliably support 128+N exit code pattern\n return isPOSIX();\n}\n\n/**\n * Get comprehensive platform capabilities\n *\n * Queries catalog to build a complete picture of signal support.\n * Useful for capability reporting, documentation generation, and testing.\n */\nexport async function getPlatformCapabilities(): Promise<PlatformCapabilities> {\n const platform = getPlatform();\n const isPosix = isPOSIX();\n const isWin = isWindows();\n const catalog = await getSignalCatalog();\n\n const supported: string[] = [];\n const unsupported: string[] = [];\n const mapped: string[] = [];\n\n // Categorize signals based on platform\n for (const signal of catalog.signals) {\n if (isPosix) {\n // All signals supported on POSIX\n supported.push(signal.name);\n } else if (isWin) {\n if (signal.windows_event !== null) {\n // Signal has Windows console event mapping\n supported.push(signal.name);\n mapped.push(signal.name);\n } else {\n // No Windows support - requires fallback\n unsupported.push(signal.name);\n }\n } else {\n // Unknown platform - mark as unsupported\n unsupported.push(signal.name);\n }\n }\n\n return {\n platform,\n isPOSIX: isPosix,\n isWindows: isWin,\n supportsNativeSignals: isPosix,\n supportsSignalExitCodes: supportsSignalExitCodes(),\n supportedSignals: supported,\n unsupportedSignals: unsupported,\n mappedSignals: mapped,\n };\n}\n\n/**\n * Get the signal number for the current platform\n *\n * Handles platform-specific overrides (e.g., SIGUSR1/SIGUSR2 on macOS/FreeBSD).\n * Returns the appropriate signal number based on platform_overrides.\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n * @returns Signal number for current platform, or null if signal not found\n */\nexport async function getSignalNumber(signalName: string): Promise<number | null> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return null;\n }\n\n const platform = getPlatform();\n\n // Check for platform-specific override\n if (signal.platform_overrides) {\n if (platform === \"darwin\" && signal.platform_overrides.darwin !== undefined) {\n return signal.platform_overrides.darwin;\n }\n if (platform === \"freebsd\" && signal.platform_overrides.freebsd !== undefined) {\n return signal.platform_overrides.freebsd;\n }\n }\n\n // Return standard Unix number\n return signal.unix_number;\n}\n\n/**\n * Get the Windows console event name for a signal\n *\n * Returns the Windows console event that corresponds to a Unix signal,\n * or null if the signal is not supported on Windows.\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n */\nexport async function getWindowsEvent(signalName: string): Promise<string | null> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return null;\n }\n\n return signal.windows_event;\n}\n","/**\n * HTTP Config Reload Endpoint Helper\n *\n * Framework-agnostic scaffold for POST /admin/config/reload.\n *\n * Unlike the signal-based reload handler, this helper is synchronous from the\n * perspective of the caller (it returns a response object). Applications can\n * choose whether to apply config live or initiate a restart.\n */\n\nimport type { AuthHook, AuthResult, RateLimitResult } from \"./http-helper.js\";\nimport type { ConfigLoader, ConfigValidator } from \"./reload.js\";\nimport type { FallbackLogger, TelemetryEmitter } from \"./windows.js\";\n\nexport interface ConfigReloadRequest {\n reason?: string;\n correlation_id?: string;\n}\n\nexport interface ConfigReloadResponse {\n status: \"reloaded\";\n correlation_id: string;\n message: string;\n}\n\nexport interface ConfigReloadErrorResponse {\n status: \"error\";\n error: string;\n message: string;\n validation_errors?: Array<{ path: string; message: string }>;\n}\n\nexport type ConfigReloadRateLimitHook = (\n identity: string,\n) => Promise<RateLimitResult> | RateLimitResult;\n\nexport interface ConfigReloadEndpointOptions<T = unknown> {\n loader: ConfigLoader<T>;\n validator?: ConfigValidator<T>;\n onReload?: (config: T) => Promise<void> | void;\n\n auth: AuthHook;\n rateLimit?: ConfigReloadRateLimitHook;\n\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n}\n\nexport function createConfigReloadEndpoint<T = unknown>(\n options: ConfigReloadEndpointOptions<T>,\n): (\n payload: ConfigReloadRequest,\n req: unknown,\n) => Promise<(ConfigReloadResponse | ConfigReloadErrorResponse) & { statusCode?: number }> {\n const { loader, validator, onReload, auth, rateLimit, logger, telemetry } = options;\n\n return async (payload: ConfigReloadRequest, req: unknown) => {\n const correlationId = payload.correlation_id ?? generateCorrelationId();\n\n const authResult: AuthResult = await auth(req);\n if (!authResult.authenticated) {\n if (logger) {\n logger.warn(\"Config reload endpoint: authentication failed\", {\n correlation_id: correlationId,\n reason: authResult.reason,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.auth_failed\", {\n correlation_id: correlationId,\n });\n }\n\n return {\n status: \"error\",\n error: \"authentication_failed\",\n message: authResult.reason || \"Authentication required\",\n statusCode: 401,\n };\n }\n\n const identity = authResult.identity || \"unknown\";\n\n if (rateLimit) {\n const rateLimitResult = await rateLimit(identity);\n if (!rateLimitResult.allowed) {\n if (logger) {\n logger.warn(\"Config reload endpoint: rate limit exceeded\", {\n correlation_id: correlationId,\n identity,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.rate_limited\", {\n correlation_id: correlationId,\n });\n }\n\n return {\n status: \"error\",\n error: \"rate_limit_exceeded\",\n message: \"Rate limit exceeded. Please try again later.\",\n statusCode: 429,\n };\n }\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.reload_requested\", {\n correlation_id: correlationId,\n });\n }\n\n try {\n const config = await loader();\n\n if (validator) {\n const validation = await validator(config);\n if (!validation.valid) {\n if (logger) {\n logger.warn(\"Config reload endpoint: validation failed\", {\n correlation_id: correlationId,\n error_count: validation.errors?.length ?? 0,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.reload_rejected\", {\n correlation_id: correlationId,\n reason: \"validation_failed\",\n });\n }\n\n return {\n status: \"error\",\n error: \"validation_failed\",\n message: \"Configuration validation failed\",\n validation_errors: validation.errors,\n statusCode: 422,\n };\n }\n }\n\n if (onReload) {\n await onReload(config);\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.reload_accepted\", {\n correlation_id: correlationId,\n });\n }\n\n if (logger) {\n logger.info(\"Config reload endpoint: reload accepted\", {\n correlation_id: correlationId,\n reason: payload.reason,\n });\n }\n\n return {\n status: \"reloaded\",\n correlation_id: correlationId,\n message: \"Configuration reloaded\",\n statusCode: 200,\n };\n } catch (error) {\n if (logger) {\n logger.warn(\"Config reload endpoint: reload failed\", {\n correlation_id: correlationId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.reload_error\", {\n correlation_id: correlationId,\n error_type: error instanceof Error ? error.constructor.name : \"unknown\",\n });\n }\n\n return {\n status: \"error\",\n error: \"reload_failed\",\n message: error instanceof Error ? error.message : String(error),\n statusCode: 500,\n };\n }\n };\n}\n\nfunction generateCorrelationId(): string {\n return `cfg-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\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 * HTTP Control Discovery Endpoint Helper\n *\n * Framework-agnostic scaffold for a control-plane discovery endpoint.\n */\n\nimport { buildRuntimeInfo } from \"../../appidentity/runtime.js\";\nimport type { Identity } from \"../../appidentity/types.js\";\nimport type { AuthHook, AuthResult } from \"./http-helper.js\";\nimport type { FallbackLogger, TelemetryEmitter } from \"./windows.js\";\n\nexport interface ControlEndpointDescriptor {\n method: string;\n path: string;\n summary?: string;\n}\n\nexport interface ControlDiscoveryResponse {\n status: \"ok\";\n service: {\n name: string;\n vendor: string;\n version: string;\n };\n runtime: {\n name: string;\n version?: string;\n platform: string;\n arch: string;\n };\n auth_summary?: string;\n endpoints: ControlEndpointDescriptor[];\n}\n\nexport interface ControlDiscoveryErrorResponse {\n status: \"error\";\n error: string;\n message: string;\n}\n\nexport interface ControlDiscoveryEndpointOptions {\n identity: Identity;\n version: string;\n endpoints: ControlEndpointDescriptor[];\n\n auth?: AuthHook;\n authSummary?: string;\n\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n}\n\nexport function createControlDiscoveryEndpoint(options: ControlDiscoveryEndpointOptions): (\n req: unknown,\n) => Promise<\n (ControlDiscoveryResponse | ControlDiscoveryErrorResponse) & {\n statusCode?: number;\n }\n> {\n const { identity, version, endpoints, auth, authSummary, logger, telemetry } = options;\n\n return async (req: unknown) => {\n if (auth) {\n const authResult: AuthResult = await auth(req);\n if (!authResult.authenticated) {\n if (logger) {\n logger.warn(\"Control discovery endpoint: authentication failed\", {\n reason: authResult.reason,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.control.discovery.auth_failed\", {\n service: identity.app.binary_name,\n });\n }\n\n return {\n status: \"error\",\n error: \"authentication_failed\",\n message: authResult.reason || \"Authentication required\",\n statusCode: 401,\n };\n }\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.control.discovery.served\", {\n service: identity.app.binary_name,\n });\n }\n\n const runtime = buildRuntimeInfo({ identity, version });\n\n return {\n status: \"ok\",\n service: {\n name: identity.app.binary_name,\n vendor: identity.app.vendor,\n version,\n },\n runtime: {\n name: runtime.runtime.name,\n version: runtime.runtime.version,\n platform: runtime.platform.os,\n arch: runtime.platform.arch,\n },\n auth_summary: authSummary,\n endpoints,\n statusCode: 200,\n };\n };\n}\n","/**\n * Signal Handler Convenience Wrappers\n *\n * Common signal handling patterns for shutdown, reload, and custom behaviors.\n */\n\nimport type { HandlerOptions, SignalHandler, SignalManager } from \"./manager.js\";\n\n/**\n * Register a graceful shutdown handler\n *\n * Convenience wrapper for SIGTERM and SIGINT handlers.\n * Automatically registers both signals to the same handler.\n *\n * @param manager - Signal manager instance\n * @param handler - Shutdown handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onShutdown(manager, async () => {\n * await closeDatabase();\n * await flushLogs();\n * });\n * ```\n */\nexport async function onShutdown(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGTERM\", handler, options);\n await manager.register(\"SIGINT\", handler, options);\n}\n\n/**\n * Register a config reload handler\n *\n * Convenience wrapper for SIGHUP handler.\n * Only registers on POSIX platforms (SIGHUP not supported on Windows).\n *\n * @param manager - Signal manager instance\n * @param handler - Reload handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onReload(manager, async () => {\n * const newConfig = await loadConfig();\n * await validateConfig(newConfig);\n * process.exit(129); // Exit for restart\n * });\n * ```\n */\nexport async function onReload(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGHUP\", handler, options);\n}\n\n/**\n * Register a custom handler for SIGUSR1\n *\n * Common use cases: toggle debug logging, reopen log files, dump statistics.\n *\n * @param manager - Signal manager instance\n * @param handler - Custom handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onUSR1(manager, async () => {\n * logger.info('SIGUSR1 received - reopening log files');\n * await reopenLogFiles();\n * });\n * ```\n */\nexport async function onUSR1(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGUSR1\", handler, options);\n}\n\n/**\n * Register a custom handler for SIGUSR2\n *\n * Common use cases: trigger profiling, rotate credentials, toggle verbose mode.\n *\n * @param manager - Signal manager instance\n * @param handler - Custom handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onUSR2(manager, async () => {\n * logger.info('SIGUSR2 received - toggling debug mode');\n * toggleDebugMode();\n * });\n * ```\n */\nexport async function onUSR2(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGUSR2\", handler, options);\n}\n\n/**\n * Register an emergency quit handler\n *\n * Convenience wrapper for SIGQUIT (immediate exit, no cleanup).\n *\n * @param manager - Signal manager instance\n * @param handler - Emergency quit handler\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onEmergencyQuit(manager, async () => {\n * logger.error('SIGQUIT received - emergency exit');\n * process.exit(131);\n * });\n * ```\n */\nexport async function onEmergencyQuit(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGQUIT\", handler, options);\n}\n\n/**\n * Register handlers for all common shutdown signals\n *\n * Registers the same handler for SIGTERM, SIGINT, and SIGQUIT.\n * Useful for applications that want consistent shutdown behavior.\n *\n * @param manager - Signal manager instance\n * @param handler - Shutdown handler function\n * @param options - Handler options\n */\nexport async function onAnyShutdown(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGTERM\", handler, options);\n await manager.register(\"SIGINT\", handler, options);\n await manager.register(\"SIGQUIT\", handler, options);\n}\n","/**\n * Double-Tap Signal Handling\n *\n * Implements Ctrl+C double-tap pattern for graceful shutdown with force-quit option.\n * Per Crucible standard: 2-second window, immediate exit on second signal.\n */\n\nimport { getSignal } from \"./catalog.js\";\nimport type { FallbackLogger } from \"./windows.js\";\n\n/**\n * Double-tap configuration\n */\nexport interface DoubleTapConfig {\n /**\n * Debounce window in milliseconds (default: 2000ms per Crucible standard)\n */\n windowMs?: number;\n\n /**\n * Exit code for forced double-tap exit (default: 130 for SIGINT)\n */\n exitCode?: number;\n\n /**\n * Message to display on first signal (default: from catalog)\n */\n hintMessage?: string;\n\n /**\n * Logger for double-tap events\n */\n logger?: FallbackLogger;\n\n /**\n * Enable test mode (prevents process.exit calls)\n */\n testMode?: boolean;\n}\n\n/**\n * Double-tap state tracker\n */\nexport interface DoubleTapState {\n firstTapTime: number | null;\n windowMs: number;\n exitCode: number;\n hintMessage: string;\n logger?: FallbackLogger;\n testMode: boolean;\n}\n\n/**\n * Create double-tap state tracker for a signal\n *\n * @param signalName - Signal name (typically \"SIGINT\")\n * @param config - Double-tap configuration\n */\nexport async function createDoubleTapTracker(\n signalName: string,\n config: DoubleTapConfig = {},\n): Promise<DoubleTapState> {\n const signal = await getSignal(signalName);\n\n // Get defaults from catalog if available\n const defaultWindowMs = signal?.double_tap_window_seconds\n ? signal.double_tap_window_seconds * 1000\n : 2000;\n const defaultExitCode = signal?.double_tap_exit_code || 130;\n const defaultHintMessage =\n signal?.double_tap_message || \"Press Ctrl+C again within 2s to force quit\";\n\n return {\n firstTapTime: null,\n windowMs: config.windowMs ?? defaultWindowMs,\n exitCode: config.exitCode ?? defaultExitCode,\n hintMessage: config.hintMessage ?? defaultHintMessage,\n logger: config.logger,\n testMode: config.testMode ?? false,\n };\n}\n\n/**\n * Handle double-tap signal logic\n *\n * Returns true if this is the second tap (force-quit), false if first tap.\n * Updates state to track timing between taps.\n *\n * @param state - Double-tap state tracker\n * @returns true if force-quit should proceed, false if graceful shutdown\n */\nexport function handleDoubleTap(state: DoubleTapState): boolean {\n const now = Date.now();\n\n // First tap\n if (state.firstTapTime === null) {\n state.firstTapTime = now;\n if (state.logger) {\n state.logger.info(state.hintMessage);\n } else {\n console.log(state.hintMessage);\n }\n return false; // Start graceful shutdown\n }\n\n // Check if within window\n const elapsed = now - state.firstTapTime;\n if (elapsed < state.windowMs) {\n // Second tap within window - force quit\n if (state.logger) {\n state.logger.info(\"Force quitting...\");\n } else {\n console.log(\"Force quitting...\");\n }\n\n if (!state.testMode) {\n process.exit(state.exitCode);\n }\n\n return true; // Force quit\n }\n\n // Outside window - treat as new first tap\n state.firstTapTime = now;\n if (state.logger) {\n state.logger.info(state.hintMessage);\n } else {\n console.log(state.hintMessage);\n }\n return false; // Start new graceful shutdown\n}\n\n/**\n * Reset double-tap state\n *\n * Called when graceful shutdown completes before second tap.\n */\nexport function resetDoubleTap(state: DoubleTapState): void {\n state.firstTapTime = null;\n}\n\n/**\n * Check if currently within double-tap window\n *\n * Useful for testing and debugging.\n */\nexport function isWithinWindow(state: DoubleTapState): boolean {\n if (state.firstTapTime === null) {\n return false;\n }\n const elapsed = Date.now() - state.firstTapTime;\n return elapsed < state.windowMs;\n}\n\n/**\n * Get time remaining in double-tap window (milliseconds)\n *\n * Returns null if not in a window, otherwise milliseconds remaining.\n */\nexport function getWindowTimeRemaining(state: DoubleTapState): number | null {\n if (state.firstTapTime === null) {\n return null;\n }\n const elapsed = Date.now() - state.firstTapTime;\n const remaining = state.windowMs - elapsed;\n return remaining > 0 ? remaining : null;\n}\n","/**\n * Windows Signal Fallback\n *\n * Implements standardized Windows fallback behavior for unsupported signals.\n * Follows Crucible specification for logging, telemetry, and operational hints.\n */\n\nimport { getSignal } from \"./catalog.js\";\nimport type { WindowsFallback } from \"./types.js\";\n\n/**\n * Windows fallback result\n */\nexport interface WindowsFallbackResult {\n supported: boolean;\n fallback?: WindowsFallback;\n logged: boolean;\n}\n\n/**\n * Logger interface for Windows fallback\n *\n * Applications should provide a logger instance that implements this interface.\n * If no logger is provided, messages are written to console.\n */\nexport interface FallbackLogger {\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n}\n\n/**\n * Telemetry emitter interface\n *\n * Applications should provide a telemetry emitter for observability.\n * If no emitter is provided, telemetry events are skipped.\n */\nexport interface TelemetryEmitter {\n emit(event: string, tags: Record<string, string>): void;\n}\n\n/**\n * Windows fallback options\n */\nexport interface WindowsFallbackOptions {\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n silent?: boolean; // Skip logging/telemetry (for testing)\n}\n\n/**\n * Default console logger implementation\n */\nconst defaultLogger: FallbackLogger = {\n info(message: string, meta?: Record<string, unknown>) {\n if (meta) {\n console.info(message, meta);\n } else {\n console.info(message);\n }\n },\n warn(message: string, meta?: Record<string, unknown>) {\n if (meta) {\n console.warn(message, meta);\n } else {\n console.warn(message);\n }\n },\n};\n\n/**\n * Handle Windows signal registration fallback\n *\n * This function is called when attempting to register a signal handler\n * on Windows for a signal that lacks native support.\n *\n * Behavior per Crucible standard:\n * 1. Log structured message at INFO level (not WARN - this is expected on Windows)\n * 2. Emit standardized telemetry event (fulmen.signal.unsupported)\n * 3. Return fallback metadata for operational guidance\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n * @param options - Logging and telemetry configuration\n */\nexport async function handleWindowsFallback(\n signalName: string,\n options: WindowsFallbackOptions = {},\n): Promise<WindowsFallbackResult> {\n const signal = await getSignal(signalName);\n\n // Signal not found in catalog\n if (!signal) {\n return {\n supported: false,\n logged: false,\n };\n }\n\n // Signal is supported (has windows_event)\n if (signal.windows_event !== null) {\n return {\n supported: true,\n logged: false,\n };\n }\n\n // Signal is unsupported on Windows - apply fallback\n const fallback = signal.windows_fallback;\n if (!fallback) {\n // No fallback metadata defined (shouldn't happen with valid catalog)\n return {\n supported: false,\n logged: false,\n };\n }\n\n // Skip logging/telemetry if silent mode\n if (options.silent) {\n return {\n supported: false,\n fallback,\n logged: false,\n };\n }\n\n const logger = options.logger || defaultLogger;\n const telemetry = options.telemetry;\n\n // Structured logging per Crucible standard\n // Template: signal=${signal} platform=${platform} fallback=${fallback_behavior} message='${operation_hint}'\n const logMeta = {\n signal: signal.name,\n platform: \"windows\",\n fallback: fallback.fallback_behavior,\n operation_hint: fallback.operation_hint,\n };\n\n // Log at INFO level (not WARN - this is expected Windows behavior)\n logger.info(fallback.log_message, logMeta);\n\n // Emit standardized telemetry\n if (telemetry) {\n telemetry.emit(fallback.telemetry_event, fallback.telemetry_tags);\n }\n\n return {\n supported: false,\n fallback,\n logged: true,\n };\n}\n\n/**\n * Get fallback metadata for a signal without logging\n *\n * Useful for capability checking and testing without side effects.\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n */\nexport async function getFallbackMetadata(signalName: string): Promise<WindowsFallback | null> {\n const signal = await getSignal(signalName);\n if (!signal || !signal.windows_fallback) {\n return null;\n }\n return signal.windows_fallback;\n}\n\n/**\n * Check if a signal requires Windows fallback\n *\n * Returns true if signal is defined in catalog but lacks Windows support\n * (windows_event is null and windows_fallback is defined).\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n */\nexport async function requiresFallback(signalName: string): Promise<boolean> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return false;\n }\n return signal.windows_event === null && signal.windows_fallback !== undefined;\n}\n\n/**\n * Get HTTP endpoint recommendation for Windows fallback\n *\n * Returns formatted operational guidance for signals that require\n * HTTP admin endpoint fallback on Windows.\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n */\nexport async function getHttpFallbackGuidance(signalName: string): Promise<string | null> {\n const fallback = await getFallbackMetadata(signalName);\n if (!fallback || fallback.fallback_behavior !== \"http_admin_endpoint\") {\n return null;\n }\n return fallback.operation_hint;\n}\n","/**\n * Signal Support Guards\n *\n * Validation functions that throw actionable errors when signals are unsupported.\n * Used to fail-fast with clear operational guidance.\n */\n\nimport { FoundryCatalogError } from \"../errors.js\";\nimport { isPOSIX, isWindows, supportsSignal } from \"./capabilities.js\";\nimport { getSignal } from \"./catalog.js\";\nimport { getFallbackMetadata } from \"./windows.js\";\n\n/**\n * Guard options\n */\nexport interface GuardOptions {\n /**\n * Include platform-specific operational guidance in error message\n */\n includeGuidance?: boolean;\n}\n\n/**\n * Ensure a signal is supported on the current platform\n *\n * Throws an error with actionable guidance if the signal is not supported.\n * Use this as a guard at the start of signal registration functions.\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n * @param options - Guard configuration\n * @throws {FoundryCatalogError} If signal is not found or not supported\n *\n * @example\n * ```typescript\n * await ensureSupported(\"SIGHUP\");\n * // On Windows: throws with HTTP fallback guidance\n * // On POSIX: passes through\n * ```\n */\nexport async function ensureSupported(\n signalName: string,\n options: GuardOptions = {},\n): Promise<void> {\n const { includeGuidance = true } = options;\n\n // Check if signal exists in catalog\n const signal = await getSignal(signalName);\n if (!signal) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n `Signal \"${signalName}\" not found in catalog. ` +\n `Valid signals: SIGTERM, SIGINT, SIGHUP, SIGQUIT, SIGPIPE, SIGALRM, SIGUSR1, SIGUSR2`,\n );\n }\n\n // Check platform support\n const supported = await supportsSignal(signalName);\n if (supported) {\n return; // Signal is supported\n }\n\n // Signal is not supported - build actionable error message\n let message = `Signal ${signal.name} is not supported on this platform`;\n\n if (isWindows() && includeGuidance) {\n const fallback = await getFallbackMetadata(signalName);\n if (fallback) {\n message += `. ${fallback.log_message}`;\n\n // Add specific guidance based on fallback type\n switch (fallback.fallback_behavior) {\n case \"http_admin_endpoint\":\n message += `. Use HTTP endpoint: ${fallback.operation_hint}`;\n break;\n case \"exception_handling\":\n message += `. Alternative: ${fallback.operation_hint}`;\n break;\n case \"timer_api\":\n message += `. Alternative: ${fallback.operation_hint}`;\n break;\n }\n }\n }\n\n throw FoundryCatalogError.invalidSchema(\"signals\", message);\n}\n\n/**\n * Ensure platform supports signal-based exit codes\n *\n * Throws an error if the platform doesn't support the POSIX 128+N exit code pattern.\n * Use this when exit code semantics are critical to application logic.\n *\n * @throws {FoundryCatalogError} If platform doesn't support signal exit codes\n *\n * @example\n * ```typescript\n * ensureSignalExitCodesSupported();\n * // On Windows: throws with guidance\n * // On POSIX: passes through\n * ```\n */\nexport function ensureSignalExitCodesSupported(): void {\n if (!isPOSIX()) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n \"Signal-based exit codes (128+N pattern) are not supported on this platform. \" +\n \"Windows does not propagate signal numbers via exit codes. \" +\n \"Use explicit exit codes or monitor via HTTP admin endpoint.\",\n );\n }\n}\n\n/**\n * Ensure platform is POSIX\n *\n * Throws an error if the platform is not POSIX-compliant.\n * Use this for functionality that strictly requires POSIX signal semantics.\n *\n * @throws {FoundryCatalogError} If platform is not POSIX\n */\nexport function ensurePOSIX(): void {\n if (!isPOSIX()) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n \"This operation requires a POSIX-compliant platform (Linux, macOS, FreeBSD). \" +\n \"Current platform does not support native signal handling.\",\n );\n }\n}\n\n/**\n * Ensure platform is Windows\n *\n * Throws an error if the platform is not Windows.\n * Use this for Windows-specific fallback testing or functionality.\n *\n * @throws {FoundryCatalogError} If platform is not Windows\n */\nexport function ensureWindows(): void {\n if (!isWindows()) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n \"This operation requires Windows platform. Current platform uses native signals.\",\n );\n }\n}\n","/**\n * HTTP Signal Endpoint Helper\n *\n * Framework-agnostic scaffold for POST /admin/signal endpoint.\n * Applications provide auth/rate-limiting; helper handles validation and execution.\n */\n\nimport { supportsSignal } from \"./capabilities.js\";\nimport type { SignalManager } from \"./manager.js\";\nimport type { FallbackLogger, TelemetryEmitter } from \"./windows.js\";\n\n/**\n * Signal request payload\n */\nexport interface SignalRequest {\n signal: string;\n reason?: string;\n correlation_id?: string;\n}\n\n/**\n * Signal response (success)\n */\nexport interface SignalResponse {\n status: \"accepted\";\n signal: string;\n correlation_id: string;\n message: string;\n}\n\n/**\n * Signal error response\n */\nexport interface SignalErrorResponse {\n status: \"error\";\n error: string;\n message: string;\n valid_signals?: string[];\n}\n\n/**\n * Authentication result\n */\nexport interface AuthResult {\n authenticated: boolean;\n identity?: string; // Client identifier (IP, cert fingerprint, etc.)\n reason?: string;\n}\n\n/**\n * Rate limit result\n */\nexport interface RateLimitResult {\n allowed: boolean;\n remaining?: number;\n reset_at?: number;\n}\n\n/**\n * Authentication hook function\n *\n * Applications must provide this to validate requests.\n * Returns authentication result with optional identity.\n */\nexport type AuthHook = (req: unknown) => Promise<AuthResult> | AuthResult;\n\n/**\n * Rate limiting hook function\n *\n * Applications may provide this to enforce rate limits.\n * Returns whether request is allowed and quota info.\n */\nexport type RateLimitHook = (\n identity: string,\n signal: string,\n) => Promise<RateLimitResult> | RateLimitResult;\n\n/**\n * Signal endpoint options\n */\nexport interface SignalEndpointOptions {\n /**\n * Signal manager instance\n */\n manager: SignalManager;\n\n /**\n * Authentication hook (required)\n */\n auth: AuthHook;\n\n /**\n * Rate limiting hook (optional)\n */\n rateLimit?: RateLimitHook;\n\n /**\n * Logger for endpoint events\n */\n logger?: FallbackLogger;\n\n /**\n * Telemetry emitter\n */\n telemetry?: TelemetryEmitter;\n\n /**\n * Allowed signals (default: all catalog signals)\n */\n allowedSignals?: string[];\n}\n\n/**\n * Create a framework-agnostic signal endpoint handler\n *\n * Returns an async function that processes signal requests.\n * Applications wire this to their HTTP framework (Express, Fastify, etc.)\n *\n * @param options - Endpoint configuration\n *\n * @example Express\n * ```typescript\n * const handler = createSignalEndpoint({\n * manager,\n * auth: async (req) => {\n * const token = req.headers.authorization?.split(' ')[1];\n * return { authenticated: token === process.env.ADMIN_TOKEN };\n * },\n * });\n *\n * app.post('/admin/signal', async (req, res) => {\n * const result = await handler(req.body, req);\n * res.status(result.status === 'accepted' ? 202 : result.statusCode || 400)\n * .json(result);\n * });\n * ```\n *\n * @example Fastify\n * ```typescript\n * const handler = createSignalEndpoint({ manager, auth });\n *\n * fastify.post('/admin/signal', async (request, reply) => {\n * const result = await handler(request.body, request);\n * reply.status(result.status === 'accepted' ? 202 : 400).send(result);\n * });\n * ```\n */\nexport function createSignalEndpoint(\n options: SignalEndpointOptions,\n): (\n payload: SignalRequest,\n req: unknown,\n) => Promise<(SignalResponse | SignalErrorResponse) & { statusCode?: number }> {\n const { manager, auth, rateLimit, logger, telemetry, allowedSignals } = options;\n\n return async (payload: SignalRequest, req: unknown) => {\n const correlationId = payload.correlation_id ?? generateCorrelationId();\n\n // Authenticate request\n const authResult = await auth(req);\n if (!authResult.authenticated) {\n if (logger) {\n logger.warn(\"Signal endpoint: authentication failed\", {\n correlation_id: correlationId,\n reason: authResult.reason,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.http_endpoint.auth_failed\", {\n correlation_id: correlationId,\n });\n }\n\n return {\n status: \"error\",\n error: \"authentication_failed\",\n message: authResult.reason || \"Authentication required\",\n statusCode: 401,\n };\n }\n\n const identity = authResult.identity || \"unknown\";\n\n // Validate signal name\n if (!payload.signal) {\n return {\n status: \"error\",\n error: \"invalid_request\",\n message: \"Signal name is required\",\n statusCode: 400,\n };\n }\n\n // Normalize signal name first\n const signalName = normalizeSignalName(payload.signal);\n\n // Check if signal is in allowed list\n const defaultAllowed = [\n \"SIGHUP\",\n \"SIGTERM\",\n \"SIGINT\",\n \"SIGQUIT\",\n \"SIGUSR1\",\n \"SIGUSR2\",\n \"SIGPIPE\",\n \"SIGALRM\",\n ];\n\n // Normalize allowed signals list (handle both 'HUP' and 'SIGHUP' formats)\n const allowed = (allowedSignals || defaultAllowed).map((s) => normalizeSignalName(s));\n\n if (!allowed.includes(signalName)) {\n return {\n status: \"error\",\n error: \"invalid_signal\",\n message: `Signal '${payload.signal}' is not recognized. Valid signals: ${allowed.join(\", \")}`,\n valid_signals: allowed,\n statusCode: 400,\n };\n }\n\n // Check platform support\n const supported = await supportsSignal(signalName);\n if (!supported) {\n // This shouldn't happen on Windows (the only reason for HTTP endpoint)\n // but handle gracefully\n return {\n status: \"error\",\n error: \"signal_not_supported\",\n message: `Signal ${signalName} is not supported on this platform`,\n statusCode: 400,\n };\n }\n\n // Check rate limit\n if (rateLimit) {\n const rateLimitResult = await rateLimit(identity, signalName);\n if (!rateLimitResult.allowed) {\n if (logger) {\n logger.warn(\"Signal endpoint: rate limit exceeded\", {\n correlation_id: correlationId,\n identity,\n signal: signalName,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.http_endpoint.rate_limited\", {\n correlation_id: correlationId,\n signal: signalName,\n });\n }\n\n return {\n status: \"error\",\n error: \"rate_limit_exceeded\",\n message: \"Rate limit exceeded. Please try again later.\",\n statusCode: 429,\n };\n }\n }\n\n // Log signal request\n if (logger) {\n logger.info(\"Signal endpoint: signal received\", {\n correlation_id: correlationId,\n identity,\n signal: signalName,\n reason: payload.reason,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.http_endpoint.signal_received\", {\n correlation_id: correlationId,\n signal: signalName,\n });\n }\n\n // Trigger signal asynchronously\n // Don't await - signal handlers may exit the process\n void manager.trigger(signalName).catch((error) => {\n if (logger) {\n logger.warn(\"Signal handler execution failed\", {\n correlation_id: correlationId,\n signal: signalName,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Return success response immediately\n return {\n status: \"accepted\",\n signal: signalName,\n correlation_id: correlationId,\n message: \"Signal will be processed asynchronously\",\n statusCode: 202,\n };\n };\n}\n\n/**\n * Normalize signal name from HTTP request\n *\n * Converts \"HUP\" or \"hup\" to \"SIGHUP\"\n */\nfunction normalizeSignalName(signal: string): string {\n const upper = signal.toUpperCase();\n if (upper.startsWith(\"SIG\")) {\n return upper;\n }\n return `SIG${upper}`;\n}\n\n/**\n * Generate a correlation ID\n */\nfunction generateCorrelationId(): string {\n return `sig-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Create a simple bearer token auth hook\n *\n * Validates requests against a static token.\n * For production, use mTLS or more robust auth.\n *\n * @param expectedToken - Expected bearer token\n *\n * @example\n * ```typescript\n * const auth = createBearerTokenAuth(process.env.ADMIN_TOKEN);\n * const handler = createSignalEndpoint({ manager, auth });\n * ```\n */\nexport function createBearerTokenAuth(expectedToken: string): AuthHook {\n return (req: unknown) => {\n const headers = (req as { headers?: Record<string, string> }).headers;\n const authHeader = headers?.authorization || headers?.Authorization;\n\n if (!authHeader) {\n return {\n authenticated: false,\n reason: \"Missing Authorization header\",\n };\n }\n\n const [scheme, token] = authHeader.split(\" \");\n if (scheme !== \"Bearer\" || token !== expectedToken) {\n return {\n authenticated: false,\n reason: \"Invalid bearer token\",\n };\n }\n\n return {\n authenticated: true,\n identity: \"bearer-token-user\",\n };\n };\n}\n\n/**\n * Create a simple in-memory rate limiter\n *\n * Tracks requests per identity with sliding window.\n * For production, use Redis or distributed rate limiting.\n *\n * @param requestsPerMinute - Max requests per minute per identity\n *\n * @example\n * ```typescript\n * const rateLimit = createSimpleRateLimiter(10); // 10 req/min\n * const handler = createSignalEndpoint({ manager, auth, rateLimit });\n * ```\n */\nexport function createSimpleRateLimiter(requestsPerMinute: number): RateLimitHook {\n const requests = new Map<string, number[]>();\n const windowMs = 60000; // 1 minute\n\n return (identity: string) => {\n const now = Date.now();\n const key = identity;\n\n // Get existing requests\n let timestamps = requests.get(key) || [];\n\n // Remove timestamps outside window\n timestamps = timestamps.filter((ts) => now - ts < windowMs);\n\n // Check if limit exceeded\n if (timestamps.length >= requestsPerMinute) {\n const oldestTimestamp = Math.min(...timestamps);\n const resetAt = oldestTimestamp + windowMs;\n\n return {\n allowed: false,\n remaining: 0,\n reset_at: resetAt,\n };\n }\n\n // Add current request\n timestamps.push(now);\n requests.set(key, timestamps);\n\n return {\n allowed: true,\n remaining: requestsPerMinute - timestamps.length,\n reset_at: now + windowMs,\n };\n };\n}\n","/**\n * Signal Manager\n *\n * Cross-platform signal handler registration and lifecycle management.\n * Implements FIFO execution, priority overrides, timeout enforcement, and double-tap support.\n */\n\nimport { isWindows, supportsSignal } from \"./capabilities.js\";\nimport { getSignal } from \"./catalog.js\";\nimport {\n createDoubleTapTracker,\n type DoubleTapState,\n handleDoubleTap,\n resetDoubleTap,\n} from \"./double-tap.js\";\nimport { type FallbackLogger, handleWindowsFallback, type TelemetryEmitter } from \"./windows.js\";\n\n/**\n * Signal handler function type\n */\nexport type SignalHandler = (signal: NodeJS.Signals) => void | Promise<void>;\n\n/**\n * Handler registration options\n */\nexport interface HandlerOptions {\n /**\n * Priority for execution order (higher priority runs first)\n * Default: 0 (FIFO order)\n */\n priority?: number;\n\n /**\n * Timeout for this handler in milliseconds\n * Default: manager's default timeout (30s)\n */\n timeoutMs?: number;\n\n /**\n * Handler identifier for debugging\n */\n id?: string;\n}\n\n/**\n * Timeout behavior options\n */\nexport type TimeoutBehavior = \"force_exit\" | \"log_and_continue\";\n\n/**\n * Signal manager configuration\n */\nexport interface SignalManagerOptions {\n /**\n * Default handler timeout in milliseconds\n * Default: 30000 (30 seconds)\n */\n defaultTimeoutMs?: number;\n\n /**\n * Behavior when handler timeout is exceeded\n * Default: 'log_and_continue'\n */\n timeoutBehavior?: TimeoutBehavior;\n\n /**\n * Logger for handler events\n */\n logger?: FallbackLogger;\n\n /**\n * Telemetry emitter for observability\n */\n telemetry?: TelemetryEmitter;\n\n /**\n * Enable test mode (prevents process.exit, allows signal injection)\n */\n testMode?: boolean;\n\n /**\n * Double-tap debounce window in milliseconds (for SIGINT)\n * Default: 2000 (2 seconds per Crucible standard)\n */\n doubleTapWindowMs?: number;\n\n /**\n * Exit code for double-tap force quit\n * Default: 130 (SIGINT)\n */\n doubleTapExitCode?: number;\n}\n\n/**\n * Internal handler registration\n */\ninterface RegisteredHandler {\n signal: string;\n handler: SignalHandler;\n priority: number;\n timeoutMs: number;\n id: string;\n registeredAt: number;\n}\n\n/**\n * Signal Manager\n */\nexport class SignalManager {\n private handlers: Map<string, RegisteredHandler[]> = new Map();\n private nativeListeners: Map<string, (signal: NodeJS.Signals) => void> = new Map();\n private options: Required<Omit<SignalManagerOptions, \"logger\" | \"telemetry\">> & {\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n };\n private handlerIdCounter = 0;\n private doubleTapTrackers: Map<string, DoubleTapState> = new Map();\n private shuttingDown = false;\n\n constructor(options: SignalManagerOptions = {}) {\n this.options = {\n defaultTimeoutMs: options.defaultTimeoutMs ?? 30000,\n timeoutBehavior: options.timeoutBehavior ?? \"log_and_continue\",\n testMode: options.testMode ?? false,\n doubleTapWindowMs: options.doubleTapWindowMs ?? 2000,\n doubleTapExitCode: options.doubleTapExitCode ?? 130,\n logger: options.logger,\n telemetry: options.telemetry,\n };\n }\n\n /**\n * Register a signal handler\n *\n * @param signal - Signal name (e.g., \"SIGTERM\") or NodeJS.Signals\n * @param handler - Handler function\n * @param options - Handler options\n */\n async register(\n signal: string | NodeJS.Signals,\n handler: SignalHandler,\n options: HandlerOptions = {},\n ): Promise<void> {\n const signalName = typeof signal === \"string\" ? signal : signal;\n\n // Check if signal is supported on this platform\n const supported = await supportsSignal(signalName);\n if (!supported) {\n // Log Windows fallback if applicable\n if (isWindows()) {\n await handleWindowsFallback(signalName, {\n logger: this.options.logger,\n telemetry: this.options.telemetry,\n });\n }\n return; // Don't register unsupported signals\n }\n\n // Get or create handler list for this signal\n if (!this.handlers.has(signalName)) {\n this.handlers.set(signalName, []);\n }\n\n // Create handler registration\n const registration: RegisteredHandler = {\n signal: signalName,\n handler,\n priority: options.priority ?? 0,\n timeoutMs: options.timeoutMs ?? this.options.defaultTimeoutMs,\n id: options.id ?? `handler-${++this.handlerIdCounter}`,\n registeredAt: Date.now(),\n };\n\n // Add to handler list (guaranteed to exist from lines 160-162)\n const handlers = this.handlers.get(signalName);\n if (!handlers) {\n throw new Error(`Handler list not initialized for signal ${signalName}`);\n }\n handlers.push(registration);\n\n // Sort by priority (higher first), then by registration order (FIFO)\n handlers.sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority; // Higher priority first\n }\n return a.registeredAt - b.registeredAt; // FIFO for same priority\n });\n\n // Register native listener if not already registered\n if (!this.nativeListeners.has(signalName)) {\n await this.registerNativeListener(signalName);\n }\n\n // Log registration\n if (this.options.logger) {\n this.options.logger.info(`Signal handler registered: ${signalName}`, {\n handler_id: registration.id,\n priority: registration.priority,\n timeout_ms: registration.timeoutMs,\n });\n }\n\n // Emit telemetry\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_registered\", {\n signal: signalName,\n handler_id: registration.id,\n priority: String(registration.priority),\n });\n }\n }\n\n /**\n * Register native Node.js signal listener\n */\n private async registerNativeListener(signalName: string): Promise<void> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return;\n }\n\n // Check if this signal uses double-tap behavior\n const useDoubleTap = signal.default_behavior === \"graceful_shutdown_with_double_tap\";\n\n if (useDoubleTap) {\n // Create double-tap tracker\n const tracker = await createDoubleTapTracker(signalName, {\n windowMs: this.options.doubleTapWindowMs,\n exitCode: this.options.doubleTapExitCode,\n logger: this.options.logger,\n testMode: this.options.testMode,\n });\n this.doubleTapTrackers.set(signalName, tracker);\n }\n\n // Create native listener\n const listener = async (sig: NodeJS.Signals) => {\n // Handle double-tap if enabled\n if (useDoubleTap) {\n const tracker = this.doubleTapTrackers.get(signalName);\n if (tracker) {\n const forceQuit = handleDoubleTap(tracker);\n if (forceQuit) {\n // Second tap - force quit already handled by handleDoubleTap\n return;\n }\n // First tap - continue to graceful shutdown\n }\n }\n\n // Execute registered handlers\n await this.executeHandlers(signalName, sig);\n };\n\n // Register with Node.js\n process.on(signalName as NodeJS.Signals, listener);\n this.nativeListeners.set(signalName, listener);\n }\n\n /**\n * Execute all registered handlers for a signal\n */\n private async executeHandlers(signalName: string, signal: NodeJS.Signals): Promise<void> {\n const handlers = this.handlers.get(signalName);\n if (!handlers || handlers.length === 0) {\n return;\n }\n\n // Mark as shutting down\n this.shuttingDown = true;\n\n // Log signal receipt\n if (this.options.logger) {\n this.options.logger.info(`Signal received: ${signalName}`, {\n handler_count: handlers.length,\n });\n }\n\n // Execute handlers in priority order\n for (const registration of handlers) {\n try {\n // Execute with timeout\n await this.executeWithTimeout(registration, signal);\n } catch (error) {\n // Handler failed - log and continue or exit\n if (this.options.logger) {\n this.options.logger.warn(`Signal handler failed: ${signalName}`, {\n handler_id: registration.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_error\", {\n signal: signalName,\n handler_id: registration.id,\n error_type: error instanceof Error ? error.constructor.name : \"unknown\",\n });\n }\n\n if (this.options.timeoutBehavior === \"force_exit\") {\n const exitCode = (await getSignal(signalName))?.exit_code ?? 1;\n if (!this.options.testMode) {\n process.exit(exitCode);\n }\n return;\n }\n // Otherwise continue to next handler\n }\n }\n\n // Reset double-tap state if graceful shutdown completed\n const tracker = this.doubleTapTrackers.get(signalName);\n if (tracker) {\n resetDoubleTap(tracker);\n }\n }\n\n /**\n * Execute a handler with timeout enforcement\n */\n private async executeWithTimeout(\n registration: RegisteredHandler,\n signal: NodeJS.Signals,\n ): Promise<void> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Handler timeout exceeded: ${registration.timeoutMs}ms`));\n }, registration.timeoutMs);\n });\n\n const handlerPromise = Promise.resolve(registration.handler(signal));\n\n try {\n await Promise.race([handlerPromise, timeoutPromise]);\n\n // Handler completed successfully\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_completed\", {\n signal: registration.signal,\n handler_id: registration.id,\n });\n }\n } catch (error) {\n // Timeout or handler error\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_timeout\", {\n signal: registration.signal,\n handler_id: registration.id,\n timeout_ms: String(registration.timeoutMs),\n });\n }\n throw error;\n }\n }\n\n /**\n * Unregister a signal handler\n *\n * @param signal - Signal name\n * @param handler - Handler to remove (if not provided, removes all handlers)\n */\n unregister(signal: string, handler?: SignalHandler): void {\n const handlers = this.handlers.get(signal);\n if (!handlers) {\n return;\n }\n\n if (handler) {\n // Remove specific handler\n const index = handlers.findIndex((h) => h.handler === handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n } else {\n // Remove all handlers for this signal\n handlers.length = 0;\n }\n\n // If no handlers left, remove native listener\n if (handlers.length === 0) {\n const listener = this.nativeListeners.get(signal);\n if (listener) {\n process.off(signal as NodeJS.Signals, listener);\n this.nativeListeners.delete(signal);\n }\n this.handlers.delete(signal);\n }\n }\n\n /**\n * Check if a signal has registered handlers\n */\n isRegistered(signal: string): boolean {\n const handlers = this.handlers.get(signal);\n return handlers !== undefined && handlers.length > 0;\n }\n\n /**\n * Get handler count for a signal\n */\n getHandlerCount(signal: string): number {\n const handlers = this.handlers.get(signal);\n return handlers?.length ?? 0;\n }\n\n /**\n * Trigger signal handlers manually (for testing)\n *\n * @param signal - Signal name\n */\n async trigger(signal: string): Promise<void> {\n const handlers = this.handlers.get(signal);\n if (!handlers || handlers.length === 0) {\n return;\n }\n\n await this.executeHandlers(signal, signal as NodeJS.Signals);\n }\n\n /**\n * Shutdown the signal manager and cleanup all handlers\n */\n async shutdown(): Promise<void> {\n // Remove all native listeners\n for (const [signal, listener] of this.nativeListeners.entries()) {\n process.off(signal as NodeJS.Signals, listener);\n }\n\n // Clear state\n this.nativeListeners.clear();\n this.handlers.clear();\n this.doubleTapTrackers.clear();\n this.shuttingDown = false;\n }\n\n /**\n * Check if manager is currently shutting down\n */\n isShuttingDown(): boolean {\n return this.shuttingDown;\n }\n}\n\n/**\n * Create a new signal manager instance\n *\n * @param options - Manager configuration\n */\nexport function createSignalManager(options: SignalManagerOptions = {}): SignalManager {\n return new SignalManager(options);\n}\n","/**\n * Configuration Reload Helpers\n *\n * Implements restart-based config reload pattern with mandatory schema validation.\n * Per Crucible standard: validate before restart, reject invalid configs without disruption.\n */\n\nimport type { FallbackLogger, TelemetryEmitter } from \"./windows.js\";\n\n/**\n * Configuration validator function type\n *\n * Applications provide this function to validate new config against schema.\n * Should return validation result with errors if invalid.\n */\nexport type ConfigValidator<T = unknown> = (\n config: T,\n) => Promise<ConfigValidationResult> | ConfigValidationResult;\n\n/**\n * Configuration validation result\n */\nexport interface ConfigValidationResult {\n valid: boolean;\n errors?: Array<{\n path: string;\n message: string;\n }>;\n}\n\n/**\n * Configuration loader function type\n *\n * Applications provide this function to load new config from disk/environment.\n */\nexport type ConfigLoader<T = unknown> = () => Promise<T> | T;\n\n/**\n * Config reload options\n */\nexport interface ConfigReloadOptions<T = unknown> {\n /**\n * Config loader function\n */\n loader: ConfigLoader<T>;\n\n /**\n * Schema validator function\n */\n validator: ConfigValidator<T>;\n\n /**\n * Callback invoked after successful validation, before exit\n * Use for cleanup, logging, etc.\n */\n onValidated?: (config: T) => void | Promise<void>;\n\n /**\n * Exit code for successful reload (default: 129 for SIGHUP)\n */\n exitCode?: number;\n\n /**\n * Logger for reload events\n */\n logger?: FallbackLogger;\n\n /**\n * Telemetry emitter\n */\n telemetry?: TelemetryEmitter;\n\n /**\n * Test mode (prevents process.exit)\n */\n testMode?: boolean;\n}\n\n/**\n * Config reload result (for testing)\n */\nexport interface ConfigReloadResult {\n reloaded: boolean;\n validationErrors?: Array<{ path: string; message: string }>;\n error?: Error;\n}\n\n/**\n * Create a config reload handler with schema validation\n *\n * Returns a signal handler function that implements restart-based reload:\n * 1. Load new config\n * 2. Validate against schema (mandatory)\n * 3. If invalid: log errors, continue with current config\n * 4. If valid: invoke callback, exit for restart\n *\n * @param options - Reload configuration\n *\n * @example\n * ```typescript\n * const reloadHandler = createConfigReloadHandler({\n * loader: () => loadConfig('./config.yaml'),\n * validator: (config) => validateConfigSchema(config),\n * onValidated: async (config) => {\n * logger.info('Config validated, restarting...');\n * },\n * logger: myLogger,\n * });\n *\n * await manager.register('SIGHUP', reloadHandler);\n * ```\n */\nexport function createConfigReloadHandler<T = unknown>(\n options: ConfigReloadOptions<T>,\n): () => Promise<void> {\n const {\n loader,\n validator,\n onValidated,\n exitCode = 129,\n logger,\n telemetry,\n testMode = false,\n } = options;\n\n return async () => {\n // Log reload request\n if (logger) {\n logger.info(\"Config reload requested (SIGHUP)\");\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_requested\", {\n signal: \"SIGHUP\",\n });\n }\n\n try {\n // Load new config\n const newConfig = await loader();\n\n // Validate against schema (mandatory)\n const result = await validator(newConfig);\n\n if (!result.valid) {\n // Invalid config - log and reject without restart\n if (logger) {\n logger.warn(\"Config validation failed - continuing with current config\", {\n error_count: result.errors?.length ?? 0,\n errors: result.errors,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_rejected\", {\n signal: \"SIGHUP\",\n reason: \"validation_failed\",\n error_count: String(result.errors?.length ?? 0),\n });\n }\n\n return; // Don't exit - continue with current config\n }\n\n // Valid config - proceed with restart\n if (logger) {\n logger.info(\"Config validation succeeded - exiting for restart\");\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_accepted\", {\n signal: \"SIGHUP\",\n });\n }\n\n // Invoke pre-restart callback\n if (onValidated) {\n await onValidated(newConfig);\n }\n\n // Exit for restart (process supervisor will restart with new config)\n if (!testMode) {\n process.exit(exitCode);\n }\n } catch (error) {\n // Config load or validation threw error\n if (logger) {\n logger.warn(\"Config reload failed with error - continuing with current config\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_error\", {\n signal: \"SIGHUP\",\n error_type: error instanceof Error ? error.constructor.name : \"unknown\",\n });\n }\n\n // Don't exit - continue with current config\n }\n };\n}\n\n/**\n * Three-strikes failure tracker\n *\n * Tracks consecutive config reload failures and triggers alerts.\n * Useful for detecting persistent config source issues.\n */\nexport class ConfigReloadTracker {\n private failures = 0;\n private lastFailureTime: number | null = null;\n private readonly maxFailures: number;\n private readonly logger?: FallbackLogger;\n private readonly telemetry?: TelemetryEmitter;\n\n constructor(options: {\n maxFailures?: number;\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n }) {\n this.maxFailures = options.maxFailures ?? 3;\n this.logger = options.logger;\n this.telemetry = options.telemetry;\n }\n\n /**\n * Record a reload failure\n *\n * @returns true if threshold exceeded, false otherwise\n */\n recordFailure(): boolean {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.failures >= this.maxFailures) {\n if (this.logger) {\n this.logger.warn(\n `${this.failures} consecutive config reload failures - check config source`,\n {\n failure_count: this.failures,\n threshold: this.maxFailures,\n },\n );\n }\n\n if (this.telemetry) {\n this.telemetry.emit(\"fulmen.signal.config_reload_threshold_exceeded\", {\n failure_count: String(this.failures),\n threshold: String(this.maxFailures),\n });\n }\n\n return true; // Threshold exceeded\n }\n\n return false;\n }\n\n /**\n * Record a successful reload (resets counter)\n */\n recordSuccess(): void {\n this.failures = 0;\n this.lastFailureTime = null;\n }\n\n /**\n * Get current failure count\n */\n getFailureCount(): number {\n return this.failures;\n }\n\n /**\n * Get last failure timestamp\n */\n getLastFailureTime(): number | null {\n return this.lastFailureTime;\n }\n}\n","/**\n * TSFulmen Signals Module\n *\n * Cross-platform signal handling with Fulmen ecosystem standards.\n * Provides catalog access, handler registration, and platform-aware fallbacks.\n */\n\n// Capability exports\nexport {\n getPlatform,\n getPlatformCapabilities,\n getSignalNumber,\n getWindowsEvent,\n isPOSIX,\n isWindows,\n type Platform,\n type PlatformCapabilities,\n supportsSignal,\n supportsSignalExitCodes,\n} from \"./capabilities.js\";\n// Catalog exports\nexport {\n getBehavior,\n getSignal,\n getSignalCatalog,\n getSignalsVersion,\n listBehaviors,\n listSignals,\n} from \"./catalog.js\";\n// HTTP config reload endpoint helper exports\nexport {\n type ConfigReloadEndpointOptions,\n type ConfigReloadErrorResponse,\n type ConfigReloadRateLimitHook,\n type ConfigReloadRequest,\n type ConfigReloadResponse,\n createConfigReloadEndpoint,\n} from \"./config-reload-endpoint.js\";\n\n// HTTP control discovery endpoint helper exports\nexport {\n type ControlDiscoveryEndpointOptions,\n type ControlDiscoveryErrorResponse,\n type ControlDiscoveryResponse,\n type ControlEndpointDescriptor,\n createControlDiscoveryEndpoint,\n} from \"./control-discovery-endpoint.js\";\n// Convenience wrapper exports\nexport {\n onAnyShutdown,\n onEmergencyQuit,\n onReload,\n onShutdown,\n onUSR1,\n onUSR2,\n} from \"./convenience.js\";\n// Double-tap exports\nexport {\n createDoubleTapTracker,\n type DoubleTapConfig,\n type DoubleTapState,\n getWindowTimeRemaining,\n handleDoubleTap,\n isWithinWindow,\n resetDoubleTap,\n} from \"./double-tap.js\";\n// Guard exports\nexport {\n ensurePOSIX,\n ensureSignalExitCodesSupported,\n ensureSupported,\n ensureWindows,\n type GuardOptions,\n} from \"./guards.js\";\n// HTTP helper exports\nexport {\n type AuthHook,\n type AuthResult,\n createBearerTokenAuth,\n createSignalEndpoint,\n createSimpleRateLimiter,\n type RateLimitHook,\n type RateLimitResult,\n type SignalEndpointOptions,\n type SignalErrorResponse,\n type SignalRequest,\n type SignalResponse,\n} from \"./http-helper.js\";\n// Manager exports\nexport {\n createSignalManager,\n type HandlerOptions,\n type SignalHandler,\n SignalManager,\n type SignalManagerOptions,\n type TimeoutBehavior,\n} from \"./manager.js\";\n\n// Config reload exports\nexport {\n type ConfigLoader,\n type ConfigReloadOptions,\n type ConfigReloadResult,\n ConfigReloadTracker,\n type ConfigValidationResult,\n type ConfigValidator,\n createConfigReloadHandler,\n} from \"./reload.js\";\n// Type exports\nexport type {\n Behavior,\n BehaviorInfo,\n BehaviorPhase,\n ExitCodes,\n LogLevel,\n OsMappings,\n PlatformOverrides,\n PlatformSupport,\n PlatformSupportLevel,\n Signal,\n SignalBehavior,\n SignalCatalog,\n SignalInfo,\n WindowsFallback,\n WindowsFallbackBehavior,\n} from \"./types.js\";\n// Windows fallback exports\nexport {\n type FallbackLogger,\n getFallbackMetadata,\n getHttpFallbackGuidance,\n handleWindowsFallback,\n requiresFallback,\n type TelemetryEmitter,\n type WindowsFallbackOptions,\n type WindowsFallbackResult,\n} from \"./windows.js\";\n","/**\n * Distance calculation with multiple metric support.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0 with WASM-backed metrics.\n *\n * @module foundry/similarity/distance\n */\n\nimport {\n damerau_levenshtein,\n jaro_winkler,\n levenshtein,\n osa_distance,\n substringSimilarity,\n} from \"@3leaps/string-metrics-wasm\";\nimport type { MetricType } from \"./types.js\";\n\n/**\n * Calculate edit distance between two strings using specified metric.\n *\n * @param a - First string\n * @param b - Second string\n * @param metric - Distance metric (default: \"levenshtein\")\n * @returns Edit distance as non-negative integer (or similarity score for jaro_winkler/substring)\n *\n * @example\n * distance(\"kitten\", \"sitting\") // 3\n * distance(\"abcd\", \"abdc\", \"damerau_osa\") // 1\n * distance(\"CA\", \"ABC\", \"damerau_unrestricted\") // 2\n * distance(\"hello world\", \"world\", \"substring\") // 0.625 (as score, not distance)\n */\nexport function distance(a: string, b: string, metric: MetricType = \"levenshtein\"): number {\n switch (metric) {\n case \"levenshtein\":\n return levenshtein(a, b);\n case \"damerau_osa\":\n return osa_distance(a, b);\n case \"damerau_unrestricted\":\n return damerau_levenshtein(a, b);\n case \"jaro_winkler\":\n return jaro_winkler(a, b);\n case \"substring\":\n // Returns similarity score (not distance) with longest common substring\n return substringSimilarity(a, b).score;\n default:\n throw new Error(\n `Invalid metric '${metric}': must be one of: levenshtein, damerau_osa, damerau_unrestricted, jaro_winkler, substring`,\n );\n }\n}\n","import { FoundryCatalogError } from \"../errors.js\";\n\nexport class SimilarityError extends FoundryCatalogError {\n constructor(message: string, cause?: Error) {\n super(message, \"similarity\", cause);\n this.name = \"SimilarityError\";\n }\n}\n","/**\n * Unicode-aware text normalization utilities.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0 with normalization presets.\n *\n * @module foundry/similarity/normalization\n */\n\nimport {\n type NormalizationLocale,\n type NormalizationPreset as WasmNormalizationPreset,\n normalize as wasmNormalize,\n} from \"@3leaps/string-metrics-wasm\";\nimport type { NormalizationPreset, NormalizeOptions } from \"./types.js\";\n\nfunction toNormalizationLocale(locale?: string): NormalizationLocale | undefined {\n if (!locale) {\n return undefined;\n }\n\n if (locale === \"tr\" || locale === \"az\" || locale === \"lt\") {\n return locale;\n }\n\n return undefined;\n}\n\n/**\n * Apply normalization preset to text.\n *\n * @param value - Text to normalize\n * @param preset - Normalization preset (\"none\" | \"minimal\" | \"default\" | \"aggressive\")\n * @param locale - Optional locale for locale-aware casefolding (e.g., \"tr\" for Turkish)\n * @returns Normalized text\n *\n * @example\n * normalize(\" Café-Zürich! \", \"aggressive\") // \"cafezurich\"\n * normalize(\" Hello \", \"minimal\") // \"Hello\"\n * normalize(\"İstanbul\", \"default\", \"tr\") // \"istanbul\"\n */\nexport function normalize(\n value: string,\n preset: NormalizationPreset | NormalizeOptions = \"default\",\n locale?: string,\n): string {\n // Handle legacy NormalizeOptions interface for backward compatibility\n if (typeof preset === \"object\") {\n // Map old options to preset and extract locale\n const targetPreset = preset.stripAccents ? \"aggressive\" : \"default\";\n const targetLocale = toNormalizationLocale(preset.locale ?? locale);\n return wasmNormalize(value, targetPreset, targetLocale);\n }\n\n return wasmNormalize(value, preset as WasmNormalizationPreset, toNormalizationLocale(locale));\n}\n\n/**\n * Unicode-aware case folding.\n *\n * @param value - Text to casefold\n * @param locale - Optional locale (e.g., \"tr\" for Turkish)\n * @returns Lowercase text\n */\nexport function casefold(value: string, locale?: string): string {\n if (locale === \"tr\") {\n return value.toLocaleLowerCase(\"tr-TR\");\n }\n return value.toLowerCase();\n}\n\n/**\n * Strip diacritical marks from text.\n *\n * @param value - Text to process\n * @returns Text with accents removed\n */\nexport function stripAccents(value: string): string {\n return value.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\n}\n\n/**\n * Compare strings ignoring case and optionally accents.\n *\n * @param a - First string\n * @param b - Second string\n * @param options - Normalization options\n * @returns True if strings are equal after normalization\n */\nexport function equalsIgnoreCase(a: string, b: string, options?: NormalizeOptions): boolean {\n return normalize(a, options) === normalize(b, options);\n}\n","/**\n * Normalized similarity score with metric selection.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0.\n *\n * @module foundry/similarity/score\n */\n\nimport {\n type SimilarityMetric,\n substringSimilarity,\n score as wasmScore,\n} from \"@3leaps/string-metrics-wasm\";\nimport type { MetricType } from \"./types.js\";\n\n/**\n * Calculate normalized similarity score between two strings.\n *\n * Returns a value between 0.0 (completely different) and 1.0 (identical).\n * For distance-based metrics: 1 - distance / max(len(a), len(b))\n * For jaro_winkler and substring: direct similarity score\n *\n * @param a - First string\n * @param b - Second string\n * @param metric - Similarity metric (default: \"levenshtein\")\n * @returns Similarity score in range [0.0, 1.0]\n *\n * @example\n * score(\"kitten\", \"sitting\") // 0.5714...\n * score(\"hello\", \"hallo\", \"jaro_winkler\") // 0.88\n * score(\"hello world\", \"world\", \"substring\") // 0.625\n */\nexport function score(a: string, b: string, metric: MetricType = \"levenshtein\"): number {\n // Special case: substring uses different API to get proper longest common substring\n if (metric === \"substring\") {\n return substringSimilarity(a, b).score;\n }\n\n // All other metrics supported directly by WASM score function\n return wasmScore(a, b, metric as SimilarityMetric);\n}\n","/**\n * Suggestion API with fuzzy matching and configurable metrics.\n *\n * Implements Crucible Foundry Similarity Standard v2.0.0.\n *\n * @module foundry/similarity/suggest\n */\n\nimport { type SuggestMetric, suggest as wasmSuggest } from \"@3leaps/string-metrics-wasm\";\nimport type { Suggestion, SuggestOptions } from \"./types.js\";\n\nconst DEFAULT_MIN_SCORE = 0.6;\nconst DEFAULT_MAX_SUGGESTIONS = 3;\nconst DEFAULT_METRIC = \"levenshtein\";\nconst DEFAULT_NORMALIZE_PRESET = \"default\";\n\n/**\n * Generate ranked suggestions from candidate list based on similarity.\n *\n * @param input - Input string to match against\n * @param candidates - List of candidate strings\n * @param options - Suggestion options (metric, thresholds, normalization)\n * @returns Array of suggestions sorted by score (descending)\n *\n * @example\n * suggest(\"docscrib\", [\"docscribe\", \"crucible\"], { metric: \"levenshtein\" })\n * // [{ value: \"docscribe\", score: 0.889, ... }]\n */\nexport function suggest(\n input: string,\n candidates: readonly string[],\n options?: SuggestOptions,\n): Suggestion[] {\n const metric = options?.metric ?? DEFAULT_METRIC;\n const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;\n const maxSuggestions = options?.maxSuggestions ?? DEFAULT_MAX_SUGGESTIONS;\n\n // Handle legacy 'normalize' boolean option\n let normalizePreset = options?.normalizePreset ?? DEFAULT_NORMALIZE_PRESET;\n if (options?.normalize === false) {\n normalizePreset = \"none\";\n } else if (options?.normalize === true && !options?.normalizePreset) {\n normalizePreset = \"default\";\n }\n\n // Pass metric name directly to WASM library (it handles \"substring\" correctly)\n const wasmOptions = {\n metric: metric as SuggestMetric,\n normalizePreset,\n minScore,\n maxSuggestions,\n preferPrefix: options?.preferPrefix,\n jaroPrefixScale: options?.jaroPrefixScale,\n jaroMaxPrefix: options?.jaroMaxPrefix,\n };\n\n const results = wasmSuggest(input, candidates as string[], wasmOptions);\n\n // Map WASM results to our Suggestion interface\n return results.map((r) => ({\n value: r.value,\n score: r.score,\n matchedRange: r.matchedRange as [number, number] | undefined,\n reason: r.reason,\n normalizedValue: r.normalizedValue,\n }));\n}\n","/**\n * Foundry similarity module - Text similarity and normalization utilities\n *\n * Implements the Crucible Foundry Text Similarity & Normalization Standard v2.0.0 (2025.10.3).\n *\n * @module foundry/similarity\n */\n\nexport const VERSION = \"2.0.0\";\n\nexport { distance } from \"./distance.js\";\nexport { SimilarityError } from \"./errors.js\";\nexport {\n casefold,\n equalsIgnoreCase,\n normalize,\n stripAccents,\n} from \"./normalization.js\";\nexport { score } from \"./score.js\";\nexport { suggest } from \"./suggest.js\";\n\nexport type {\n MetricType,\n NormalizationPreset,\n NormalizeOptions,\n Suggestion,\n SuggestOptions,\n} from \"./types.js\";\n","/**\n * Foundry module - Main exports\n *\n * Provides ergonomic access to Crucible Foundry Pattern Catalog data including\n * patterns, HTTP status codes, MIME types, and country codes with Bun-first\n * implementation and comprehensive TypeScript support.\n */\n\nexport const VERSION = \"0.1.1\";\n\n// Country Code catalog exports\nexport {\n clearCountryCodeCache,\n getCountryByAlpha2,\n getCountryByAlpha3,\n getCountryByNumeric,\n listCountries,\n} from \"./country-codes.js\";\n// Detection options type export\nexport type { DetectionOptions } from \"./detector.js\";\n// Export error classes\nexport { FoundryCatalogError } from \"./errors.js\";\n// Exit Codes catalog and helpers\nexport {\n EXIT_CODES_VERSION,\n type ExitCode,\n type ExitCodeInfo,\n type ExitCodeName,\n exitCodeMetadata,\n exitCodes,\n getExitCodeInfo,\n getPlatform,\n getPlatformCapabilities,\n getSimplifiedCodeDescription,\n getSimplifiedCodes,\n isPOSIX,\n isWindows,\n mapExitCodeToSimplified,\n type PlatformCapabilities,\n SimplifiedMode,\n supportsSignalExitCodes,\n} from \"./exit-codes/index.js\";\n// HTTP Status catalog exports\nexport {\n clearHttpStatusCache,\n getHttpStatus,\n getStatusReason,\n isClientError,\n isInformational,\n isRedirection,\n isServerError,\n isSuccess,\n listHttpStatuses,\n} from \"./http-statuses.js\";\n// Export loader functions\nexport {\n loadAllCatalogs,\n loadCountryCodeCatalog,\n loadHttpStatusCatalog,\n loadMimeTypeCatalog,\n loadPatternCatalog,\n} from \"./loader.js\";\n// MIME Type catalog exports\nexport {\n clearMimeTypeCache,\n detectMimeType,\n detectMimeTypeFromBuffer,\n detectMimeTypeFromFile,\n detectMimeTypeFromStream,\n getMimeType,\n getMimeTypeByExtension,\n isSupportedMimeType,\n listMimeTypes,\n matchMagicNumber,\n} from \"./mime-types.js\";\n// Pattern catalog exports\nexport {\n clearPatternCache,\n describePattern,\n getPattern,\n getPatternRegex,\n listPatterns,\n matchPattern,\n} from \"./patterns.js\";\n// Signal catalog and module exports\nexport {\n // Types\n type AuthHook,\n type AuthResult,\n type Behavior,\n type BehaviorInfo,\n type BehaviorPhase,\n type ConfigLoader,\n type ConfigReloadEndpointOptions,\n type ConfigReloadErrorResponse,\n type ConfigReloadOptions,\n type ConfigReloadRequest,\n type ConfigReloadResponse,\n type ConfigReloadResult,\n // Config reload\n ConfigReloadTracker,\n type ConfigValidationResult,\n type ConfigValidator,\n type ControlDiscoveryEndpointOptions,\n type ControlDiscoveryErrorResponse,\n type ControlDiscoveryResponse,\n type ControlEndpointDescriptor,\n // HTTP helper\n createBearerTokenAuth,\n createConfigReloadEndpoint,\n createConfigReloadHandler,\n createControlDiscoveryEndpoint,\n // Double-tap\n createDoubleTapTracker,\n createSignalEndpoint,\n // Manager\n createSignalManager,\n createSimpleRateLimiter,\n type DoubleTapConfig,\n type DoubleTapState,\n type ExitCodes,\n // Guards\n ensurePOSIX,\n ensureSignalExitCodesSupported,\n ensureSupported,\n ensureWindows,\n type FallbackLogger,\n type GuardOptions,\n // Catalog\n getBehavior,\n // Windows fallback\n getFallbackMetadata,\n getHttpFallbackGuidance,\n // Capabilities\n getPlatformCapabilities as getSignalPlatformCapabilities,\n getSignal,\n getSignalCatalog,\n getSignalNumber,\n getSignalsVersion,\n getWindowsEvent,\n getWindowTimeRemaining,\n type HandlerOptions,\n handleDoubleTap,\n handleWindowsFallback,\n isPOSIX as isSignalPOSIX,\n isWindows as isSignalWindows,\n isWithinWindow,\n type LogLevel,\n listBehaviors,\n listSignals,\n type OsMappings,\n // Convenience wrappers\n onAnyShutdown,\n onEmergencyQuit,\n onReload,\n onShutdown,\n onUSR1,\n onUSR2,\n type Platform,\n type PlatformCapabilities as SignalPlatformCapabilities,\n type PlatformOverrides,\n type PlatformSupport,\n type PlatformSupportLevel,\n type RateLimitHook,\n type RateLimitResult,\n requiresFallback,\n resetDoubleTap,\n type Signal,\n type SignalBehavior,\n type SignalCatalog,\n type SignalEndpointOptions,\n type SignalErrorResponse,\n type SignalHandler,\n type SignalInfo,\n SignalManager,\n type SignalManagerOptions,\n type SignalRequest,\n type SignalResponse,\n supportsSignal,\n supportsSignalExitCodes as supportsSignalBasedExitCodes,\n type TelemetryEmitter,\n type TimeoutBehavior,\n type WindowsFallback,\n type WindowsFallbackBehavior,\n type WindowsFallbackOptions,\n type WindowsFallbackResult,\n} from \"./signals/index.js\";\nexport type {\n NormalizeOptions,\n Suggestion,\n SuggestOptions,\n} from \"./similarity/index.js\";\n// Similarity utilities exports\nexport {\n casefold,\n distance,\n equalsIgnoreCase,\n normalize,\n score,\n stripAccents,\n suggest,\n} from \"./similarity/index.js\";\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 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","/**\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 * 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 * 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 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 */\nexport { getCachedIdentity };\n\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport { clearIdentityCache };\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// Main entry point when run directly\nif (import.meta.url === `file://${process.argv[1]}`) {\n const program = createCLI();\n program.parse(process.argv);\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 * 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","'use strict';\n\nexports.getValueAsString = function getValueString(value) {\n\tif (Number.isNaN(value)) {\n\t\treturn 'Nan';\n\t} else if (!Number.isFinite(value)) {\n\t\tif (value < 0) {\n\t\t\treturn '-Inf';\n\t\t} else {\n\t\t\treturn '+Inf';\n\t\t}\n\t} else {\n\t\treturn `${value}`;\n\t}\n};\n\nexports.removeLabels = function removeLabels(\n\thashMap,\n\tlabels,\n\tsortedLabelNames,\n) {\n\tconst hash = hashObject(labels, sortedLabelNames);\n\tdelete hashMap[hash];\n};\n\nexports.setValue = function setValue(hashMap, value, labels) {\n\tconst hash = hashObject(labels);\n\thashMap[hash] = {\n\t\tvalue: typeof value === 'number' ? value : 0,\n\t\tlabels: labels || {},\n\t};\n\treturn hashMap;\n};\n\nexports.setValueDelta = function setValueDelta(\n\thashMap,\n\tdeltaValue,\n\tlabels,\n\thash = '',\n) {\n\tconst value = typeof deltaValue === 'number' ? deltaValue : 0;\n\tif (hashMap[hash]) {\n\t\thashMap[hash].value += value;\n\t} else {\n\t\thashMap[hash] = { value, labels };\n\t}\n\treturn hashMap;\n};\n\nexports.getLabels = function (labelNames, args) {\n\tif (typeof args[0] === 'object') {\n\t\treturn args[0];\n\t}\n\n\tif (labelNames.length !== args.length) {\n\t\tthrow new Error(\n\t\t\t`Invalid number of arguments (${args.length}): \"${args.join(\n\t\t\t\t', ',\n\t\t\t)}\" for label names (${labelNames.length}): \"${labelNames.join(', ')}\".`,\n\t\t);\n\t}\n\n\tconst acc = {};\n\tfor (let i = 0; i < labelNames.length; i++) {\n\t\tacc[labelNames[i]] = args[i];\n\t}\n\treturn acc;\n};\n\nfunction fastHashObject(keys, labels) {\n\tif (keys.length === 0) {\n\t\treturn '';\n\t}\n\n\tlet hash = '';\n\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tconst value = labels[key];\n\t\tif (value === undefined) continue;\n\n\t\thash += `${key}:${value},`;\n\t}\n\n\treturn hash;\n}\n\nfunction hashObject(labels, labelNames) {\n\t// We don't actually need a hash here. We just need a string that\n\t// is unique for each possible labels object and consistent across\n\t// calls with equivalent labels objects.\n\n\tif (labelNames) {\n\t\treturn fastHashObject(labelNames, labels);\n\t}\n\n\tconst keys = Object.keys(labels);\n\tif (keys.length > 1) {\n\t\tkeys.sort(); // need consistency across calls\n\t}\n\n\treturn fastHashObject(keys, labels);\n}\nexports.hashObject = hashObject;\n\nexports.isObject = function isObject(obj) {\n\treturn obj !== null && typeof obj === 'object';\n};\n\nexports.nowTimestamp = function nowTimestamp() {\n\treturn Date.now() / 1000;\n};\n\nclass Grouper extends Map {\n\t/**\n\t * Adds the `value` to the `key`'s array of values.\n\t * @param {*} key Key to set.\n\t * @param {*} value Value to add to `key`'s array.\n\t * @returns {undefined} undefined.\n\t */\n\tadd(key, value) {\n\t\tif (this.has(key)) {\n\t\t\tthis.get(key).push(value);\n\t\t} else {\n\t\t\tthis.set(key, [value]);\n\t\t}\n\t}\n}\n\nexports.Grouper = Grouper;\n","'use strict';\n\nconst { getValueAsString } = require('./util');\n\nclass Registry {\n\tstatic get PROMETHEUS_CONTENT_TYPE() {\n\t\treturn 'text/plain; version=0.0.4; charset=utf-8';\n\t}\n\n\tstatic get OPENMETRICS_CONTENT_TYPE() {\n\t\treturn 'application/openmetrics-text; version=1.0.0; charset=utf-8';\n\t}\n\n\tconstructor(regContentType = Registry.PROMETHEUS_CONTENT_TYPE) {\n\t\tthis._metrics = {};\n\t\tthis._collectors = [];\n\t\tthis._defaultLabels = {};\n\t\tif (\n\t\t\tregContentType !== Registry.PROMETHEUS_CONTENT_TYPE &&\n\t\t\tregContentType !== Registry.OPENMETRICS_CONTENT_TYPE\n\t\t) {\n\t\t\tthrow new TypeError(`Content type ${regContentType} is unsupported`);\n\t\t}\n\t\tthis._contentType = regContentType;\n\t}\n\n\tgetMetricsAsArray() {\n\t\treturn Object.values(this._metrics);\n\t}\n\n\tasync getMetricsAsString(metrics) {\n\t\tconst metric =\n\t\t\ttypeof metrics.getForPromString === 'function'\n\t\t\t\t? await metrics.getForPromString()\n\t\t\t\t: await metrics.get();\n\n\t\tconst name = escapeString(metric.name);\n\t\tconst help = `# HELP ${name} ${escapeString(metric.help)}`;\n\t\tconst type = `# TYPE ${name} ${metric.type}`;\n\t\tconst values = [help, type];\n\n\t\tconst defaultLabels =\n\t\t\tObject.keys(this._defaultLabels).length > 0 ? this._defaultLabels : null;\n\n\t\tconst isOpenMetrics =\n\t\t\tthis.contentType === Registry.OPENMETRICS_CONTENT_TYPE;\n\n\t\tfor (const val of metric.values || []) {\n\t\t\tlet { metricName = name, labels = {} } = val;\n\t\t\tconst { sharedLabels = {} } = val;\n\t\t\tif (isOpenMetrics && metric.type === 'counter') {\n\t\t\t\tmetricName = `${metricName}_total`;\n\t\t\t}\n\n\t\t\tif (defaultLabels) {\n\t\t\t\tlabels = { ...labels, ...defaultLabels, ...labels };\n\t\t\t}\n\n\t\t\t// We have to flatten these separately to avoid duplicate labels appearing\n\t\t\t// between the base labels and the shared labels\n\t\t\tconst formattedLabels = formatLabels(labels, sharedLabels);\n\n\t\t\tconst flattenedShared = flattenSharedLabels(sharedLabels);\n\t\t\tconst labelParts = [...formattedLabels, flattenedShared].filter(Boolean);\n\t\t\tconst labelsString = labelParts.length ? `{${labelParts.join(',')}}` : '';\n\t\t\tlet fullMetricLine = `${metricName}${labelsString} ${getValueAsString(\n\t\t\t\tval.value,\n\t\t\t)}`;\n\n\t\t\tconst { exemplar } = val;\n\t\t\tif (exemplar && isOpenMetrics) {\n\t\t\t\tconst formattedExemplars = formatLabels(exemplar.labelSet);\n\t\t\t\tfullMetricLine += ` # {${formattedExemplars.join(\n\t\t\t\t\t',',\n\t\t\t\t)}} ${getValueAsString(exemplar.value)} ${exemplar.timestamp}`;\n\t\t\t}\n\t\t\tvalues.push(fullMetricLine);\n\t\t}\n\n\t\treturn values.join('\\n');\n\t}\n\n\tasync metrics() {\n\t\tconst isOpenMetrics =\n\t\t\tthis.contentType === Registry.OPENMETRICS_CONTENT_TYPE;\n\n\t\tconst promises = this.getMetricsAsArray().map(metric => {\n\t\t\tif (isOpenMetrics && metric.type === 'counter') {\n\t\t\t\tmetric.name = standardizeCounterName(metric.name);\n\t\t\t}\n\t\t\treturn this.getMetricsAsString(metric);\n\t\t});\n\n\t\tconst resolves = await Promise.all(promises);\n\n\t\treturn isOpenMetrics\n\t\t\t? `${resolves.join('\\n')}\\n# EOF\\n`\n\t\t\t: `${resolves.join('\\n\\n')}\\n`;\n\t}\n\n\tregisterMetric(metric) {\n\t\tif (this._metrics[metric.name] && this._metrics[metric.name] !== metric) {\n\t\t\tthrow new Error(\n\t\t\t\t`A metric with the name ${metric.name} has already been registered.`,\n\t\t\t);\n\t\t}\n\n\t\tthis._metrics[metric.name] = metric;\n\t}\n\n\tclear() {\n\t\tthis._metrics = {};\n\t\tthis._defaultLabels = {};\n\t}\n\n\tasync getMetricsAsJSON() {\n\t\tconst metrics = [];\n\t\tconst defaultLabelNames = Object.keys(this._defaultLabels);\n\n\t\tconst promises = [];\n\n\t\tfor (const metric of this.getMetricsAsArray()) {\n\t\t\tpromises.push(metric.get());\n\t\t}\n\n\t\tconst resolves = await Promise.all(promises);\n\n\t\tfor (const item of resolves) {\n\t\t\tif (item.values && defaultLabelNames.length > 0) {\n\t\t\t\tfor (const val of item.values) {\n\t\t\t\t\t// Make a copy before mutating\n\t\t\t\t\tval.labels = Object.assign({}, val.labels);\n\n\t\t\t\t\tfor (const labelName of defaultLabelNames) {\n\t\t\t\t\t\tval.labels[labelName] =\n\t\t\t\t\t\t\tval.labels[labelName] || this._defaultLabels[labelName];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmetrics.push(item);\n\t\t}\n\n\t\treturn metrics;\n\t}\n\n\tremoveSingleMetric(name) {\n\t\tdelete this._metrics[name];\n\t}\n\n\tgetSingleMetricAsString(name) {\n\t\treturn this.getMetricsAsString(this._metrics[name]);\n\t}\n\n\tgetSingleMetric(name) {\n\t\treturn this._metrics[name];\n\t}\n\n\tsetDefaultLabels(labels) {\n\t\tthis._defaultLabels = labels;\n\t}\n\n\tresetMetrics() {\n\t\tfor (const metric in this._metrics) {\n\t\t\tthis._metrics[metric].reset();\n\t\t}\n\t}\n\n\tget contentType() {\n\t\treturn this._contentType;\n\t}\n\n\tsetContentType(metricsContentType) {\n\t\tif (\n\t\t\tmetricsContentType === Registry.OPENMETRICS_CONTENT_TYPE ||\n\t\t\tmetricsContentType === Registry.PROMETHEUS_CONTENT_TYPE\n\t\t) {\n\t\t\tthis._contentType = metricsContentType;\n\t\t} else {\n\t\t\tthrow new Error(`Content type ${metricsContentType} is unsupported`);\n\t\t}\n\t}\n\n\tstatic merge(registers) {\n\t\tconst regType = registers[0].contentType;\n\t\tfor (const reg of registers) {\n\t\t\tif (reg.contentType !== regType) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Registers can only be merged if they have the same content type',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst mergedRegistry = new Registry(regType);\n\n\t\tconst metricsToMerge = registers.reduce(\n\t\t\t(acc, reg) => acc.concat(reg.getMetricsAsArray()),\n\t\t\t[],\n\t\t);\n\n\t\tmetricsToMerge.forEach(mergedRegistry.registerMetric, mergedRegistry);\n\t\treturn mergedRegistry;\n\t}\n}\n\nfunction formatLabels(labels, exclude) {\n\tconst { hasOwnProperty } = Object.prototype;\n\tconst formatted = [];\n\tfor (const [name, value] of Object.entries(labels)) {\n\t\tif (!exclude || !hasOwnProperty.call(exclude, name)) {\n\t\t\tformatted.push(`${name}=\"${escapeLabelValue(value)}\"`);\n\t\t}\n\t}\n\treturn formatted;\n}\n\nconst sharedLabelCache = new WeakMap();\nfunction flattenSharedLabels(labels) {\n\tconst cached = sharedLabelCache.get(labels);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst formattedLabels = formatLabels(labels);\n\tconst flattened = formattedLabels.join(',');\n\tsharedLabelCache.set(labels, flattened);\n\treturn flattened;\n}\nfunction escapeLabelValue(str) {\n\tif (typeof str !== 'string') {\n\t\treturn str;\n\t}\n\treturn escapeString(str).replace(/\"/g, '\\\\\"');\n}\nfunction escapeString(str) {\n\treturn str.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n');\n}\nfunction standardizeCounterName(name) {\n\treturn name.replace(/_total$/, '');\n}\n\nmodule.exports = Registry;\nmodule.exports.globalRegistry = new Registry();\n","'use strict';\n\nconst util = require('util');\n\n// These are from https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels\nconst metricRegexp = /^[a-zA-Z_:][a-zA-Z0-9_:]*$/;\nconst labelRegexp = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\nexports.validateMetricName = function (name) {\n\treturn metricRegexp.test(name);\n};\n\nexports.validateLabelName = function (names = []) {\n\treturn names.every(name => labelRegexp.test(name));\n};\n\nexports.validateLabel = function validateLabel(savedLabels, labels) {\n\tfor (const label in labels) {\n\t\tif (!savedLabels.includes(label)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Added label \"${label}\" is not included in initial labelset: ${util.inspect(\n\t\t\t\t\tsavedLabels,\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\t}\n};\n","'use strict';\n\nconst Registry = require('./registry');\nconst { isObject } = require('./util');\nconst { validateMetricName, validateLabelName } = require('./validation');\n\n/**\n * @abstract\n */\nclass Metric {\n\tconstructor(config, defaults = {}) {\n\t\tif (!isObject(config)) {\n\t\t\tthrow new TypeError('constructor expected a config object');\n\t\t}\n\t\tObject.assign(\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tlabelNames: [],\n\t\t\t\tregisters: [Registry.globalRegistry],\n\t\t\t\taggregator: 'sum',\n\t\t\t\tenableExemplars: false,\n\t\t\t},\n\t\t\tdefaults,\n\t\t\tconfig,\n\t\t);\n\t\tif (!this.registers) {\n\t\t\t// in case config.registers is `undefined`\n\t\t\tthis.registers = [Registry.globalRegistry];\n\t\t}\n\t\tif (!this.help) {\n\t\t\tthrow new Error('Missing mandatory help parameter');\n\t\t}\n\t\tif (!this.name) {\n\t\t\tthrow new Error('Missing mandatory name parameter');\n\t\t}\n\t\tif (!validateMetricName(this.name)) {\n\t\t\tthrow new Error('Invalid metric name');\n\t\t}\n\t\tif (!validateLabelName(this.labelNames)) {\n\t\t\tthrow new Error('Invalid label name');\n\t\t}\n\n\t\tif (this.collect && typeof this.collect !== 'function') {\n\t\t\tthrow new Error('Optional \"collect\" parameter must be a function');\n\t\t}\n\n\t\tif (this.labelNames) {\n\t\t\tthis.sortedLabelNames = [...this.labelNames].sort();\n\t\t} else {\n\t\t\tthis.sortedLabelNames = [];\n\t\t}\n\n\t\tthis.reset();\n\n\t\tfor (const register of this.registers) {\n\t\t\tif (\n\t\t\t\tthis.enableExemplars &&\n\t\t\t\tregister.contentType === Registry.PROMETHEUS_CONTENT_TYPE\n\t\t\t) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t'Exemplars are supported only on OpenMetrics registries',\n\t\t\t\t);\n\t\t\t}\n\t\t\tregister.registerMetric(this);\n\t\t}\n\t}\n\n\treset() {\n\t\t/* abstract */\n\t}\n}\n\nmodule.exports = { Metric };\n","'use strict';\n\n/**\n * Class representing an OpenMetrics exemplar.\n *\n * @property {object} labelSet\n * @property {number} value\n * @property {number} [timestamp]\n * */\nclass Exemplar {\n\tconstructor(labelSet = {}, value = null) {\n\t\tthis.labelSet = labelSet;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Validation for the label set format.\n\t * https://github.com/OpenObservability/OpenMetrics/blob/d99b705f611b75fec8f450b05e344e02eea6921d/specification/OpenMetrics.md#exemplars\n\t *\n\t * @param {object} labelSet - Exemplar labels.\n\t * @throws {RangeError}\n\t * @return {void}\n\t */\n\tvalidateExemplarLabelSet(labelSet) {\n\t\tlet res = '';\n\t\tfor (const [labelName, labelValue] of Object.entries(labelSet)) {\n\t\t\tres += `${labelName}${labelValue}`;\n\t\t}\n\t\tif (res.length > 128) {\n\t\t\tthrow new RangeError(\n\t\t\t\t'Label set size must be smaller than 128 UTF-8 chars',\n\t\t\t);\n\t\t}\n\t}\n}\n\nmodule.exports = Exemplar;\n","/**\n * Counter metric\n */\n'use strict';\n\nconst util = require('util');\nconst {\n\thashObject,\n\tisObject,\n\tgetLabels,\n\tremoveLabels,\n\tnowTimestamp,\n} = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\nconst Exemplar = require('./exemplar');\n\nclass Counter extends Metric {\n\tconstructor(config) {\n\t\tsuper(config);\n\t\tthis.type = 'counter';\n\t\tthis.defaultLabels = {};\n\t\tthis.defaultValue = 1;\n\t\tthis.defaultExemplarLabelSet = {};\n\t\tif (config.enableExemplars) {\n\t\t\tthis.enableExemplars = true;\n\t\t\tthis.inc = this.incWithExemplar;\n\t\t} else {\n\t\t\tthis.inc = this.incWithoutExemplar;\n\t\t}\n\t}\n\n\t/**\n\t * Increment counter\n\t * @param {object} labels - What label you want to be incremented\n\t * @param {Number} value - Value to increment, if omitted increment with 1\n\t * @returns {object} results - object with information about the inc operation\n\t * @returns {string} results.labelHash - hash representation of the labels\n\t */\n\tincWithoutExemplar(labels, value) {\n\t\tlet hash = '';\n\t\tif (isObject(labels)) {\n\t\t\thash = hashObject(labels, this.sortedLabelNames);\n\t\t\tvalidateLabel(this.labelNames, labels);\n\t\t} else {\n\t\t\tvalue = labels;\n\t\t\tlabels = {};\n\t\t}\n\n\t\tif (value && !Number.isFinite(value)) {\n\t\t\tthrow new TypeError(`Value is not a valid number: ${util.format(value)}`);\n\t\t}\n\t\tif (value < 0) {\n\t\t\tthrow new Error('It is not possible to decrease a counter');\n\t\t}\n\n\t\tif (value === null || value === undefined) value = 1;\n\n\t\tsetValue(this.hashMap, value, labels, hash);\n\n\t\treturn { labelHash: hash };\n\t}\n\n\t/**\n\t * Increment counter with exemplar, same as inc but accepts labels for an\n\t * exemplar.\n\t * If no label is provided the current exemplar labels are kept unchanged\n\t * (defaults to empty set).\n\t *\n\t * @param {object} incOpts - Object with options about what metric to increase\n\t * @param {object} incOpts.labels - What label you want to be incremented,\n\t * defaults to null (metric with no labels)\n\t * @param {Number} incOpts.value - Value to increment, defaults to 1\n\t * @param {object} incOpts.exemplarLabels - Key-value labels for the\n\t * exemplar, defaults to empty set {}\n\t * @returns {void}\n\t */\n\tincWithExemplar({\n\t\tlabels = this.defaultLabels,\n\t\tvalue = this.defaultValue,\n\t\texemplarLabels = this.defaultExemplarLabelSet,\n\t} = {}) {\n\t\tconst res = this.incWithoutExemplar(labels, value);\n\t\tthis.updateExemplar(exemplarLabels, value, res.labelHash);\n\t}\n\n\tupdateExemplar(exemplarLabels, value, hash) {\n\t\tif (exemplarLabels === this.defaultExemplarLabelSet) return;\n\t\tif (!isObject(this.hashMap[hash].exemplar)) {\n\t\t\tthis.hashMap[hash].exemplar = new Exemplar();\n\t\t}\n\t\tthis.hashMap[hash].exemplar.validateExemplarLabelSet(exemplarLabels);\n\t\tthis.hashMap[hash].exemplar.labelSet = exemplarLabels;\n\t\tthis.hashMap[hash].exemplar.value = value ? value : 1;\n\t\tthis.hashMap[hash].exemplar.timestamp = nowTimestamp();\n\t}\n\n\t/**\n\t * Reset counter\n\t * @returns {void}\n\t */\n\treset() {\n\t\tthis.hashMap = {};\n\t\tif (this.labelNames.length === 0) {\n\t\t\tsetValue(this.hashMap, 0);\n\t\t}\n\t}\n\n\tasync get() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\n\t\treturn {\n\t\t\thelp: this.help,\n\t\t\tname: this.name,\n\t\t\ttype: this.type,\n\t\t\tvalues: Object.values(this.hashMap),\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args) || {};\n\t\treturn {\n\t\t\tinc: this.inc.bind(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args) || {};\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn removeLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction setValue(hashMap, value, labels = {}, hash = '') {\n\tif (hashMap[hash]) {\n\t\thashMap[hash].value += value;\n\t} else {\n\t\thashMap[hash] = { value, labels };\n\t}\n\treturn hashMap;\n}\n\nmodule.exports = Counter;\n","/**\n * Gauge metric\n */\n'use strict';\n\nconst util = require('util');\n\nconst {\n\tsetValue,\n\tsetValueDelta,\n\tgetLabels,\n\thashObject,\n\tisObject,\n\tremoveLabels,\n} = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\n\nclass Gauge extends Metric {\n\tconstructor(config) {\n\t\tsuper(config);\n\t\tthis.type = 'gauge';\n\t}\n\n\t/**\n\t * Set a gauge to a value\n\t * @param {object} labels - Object with labels and their values\n\t * @param {Number} value - Value to set the gauge to, must be positive\n\t * @returns {void}\n\t */\n\tset(labels, value) {\n\t\tvalue = getValueArg(labels, value);\n\t\tlabels = getLabelArg(labels);\n\t\tset(this, labels, value);\n\t}\n\n\t/**\n\t * Reset gauge\n\t * @returns {void}\n\t */\n\treset() {\n\t\tthis.hashMap = {};\n\t\tif (this.labelNames.length === 0) {\n\t\t\tsetValue(this.hashMap, 0, {});\n\t\t}\n\t}\n\n\t/**\n\t * Increment a gauge value\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to increment - if omitted, increment with 1\n\t * @returns {void}\n\t */\n\tinc(labels, value) {\n\t\tvalue = getValueArg(labels, value);\n\t\tlabels = getLabelArg(labels);\n\t\tif (value === undefined) value = 1;\n\t\tsetDelta(this, labels, value);\n\t}\n\n\t/**\n\t * Decrement a gauge value\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to decrement - if omitted, decrement with 1\n\t * @returns {void}\n\t */\n\tdec(labels, value) {\n\t\tvalue = getValueArg(labels, value);\n\t\tlabels = getLabelArg(labels);\n\t\tif (value === undefined) value = 1;\n\t\tsetDelta(this, labels, -value);\n\t}\n\n\t/**\n\t * Set the gauge to current unix epoch\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {void}\n\t */\n\tsetToCurrentTime(labels) {\n\t\tconst now = Date.now() / 1000;\n\t\tif (labels === undefined) {\n\t\t\tthis.set(now);\n\t\t} else {\n\t\t\tthis.set(labels, now);\n\t\t}\n\t}\n\n\t/**\n\t * Start a timer\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {function} - Invoke this function to set the duration in seconds since you started the timer.\n\t * @example\n\t * var done = gauge.startTimer();\n\t * makeXHRRequest(function(err, response) {\n\t *\tdone(); //Duration of the request will be saved\n\t * });\n\t */\n\tstartTimer(labels) {\n\t\tconst start = process.hrtime();\n\t\treturn endLabels => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.set(Object.assign({}, labels, endLabels), value);\n\t\t\treturn value;\n\t\t};\n\t}\n\n\tasync get() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\t\treturn {\n\t\t\thelp: this.help,\n\t\t\tname: this.name,\n\t\t\ttype: this.type,\n\t\t\tvalues: Object.values(this.hashMap),\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\t_getValue(labels) {\n\t\tconst hash = hashObject(labels || {}, this.sortedLabelNames);\n\t\treturn this.hashMap[hash] ? this.hashMap[hash].value : 0;\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn {\n\t\t\tinc: this.inc.bind(this, labels),\n\t\t\tdec: this.dec.bind(this, labels),\n\t\t\tset: this.set.bind(this, labels),\n\t\t\tsetToCurrentTime: this.setToCurrentTime.bind(this, labels),\n\t\t\tstartTimer: this.startTimer.bind(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tremoveLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction set(gauge, labels, value) {\n\tif (typeof value !== 'number') {\n\t\tthrow new TypeError(`Value is not a valid number: ${util.format(value)}`);\n\t}\n\n\tvalidateLabel(gauge.labelNames, labels);\n\tsetValue(gauge.hashMap, value, labels);\n}\n\nfunction setDelta(gauge, labels, delta) {\n\tif (typeof delta !== 'number') {\n\t\tthrow new TypeError(`Delta is not a valid number: ${util.format(delta)}`);\n\t}\n\n\tvalidateLabel(gauge.labelNames, labels);\n\tconst hash = hashObject(labels, gauge.sortedLabelNames);\n\tsetValueDelta(gauge.hashMap, delta, labels, hash);\n}\n\nfunction getLabelArg(labels) {\n\treturn isObject(labels) ? labels : {};\n}\n\nfunction getValueArg(labels, value) {\n\treturn isObject(labels) ? value : labels;\n}\n\nmodule.exports = Gauge;\n","/**\n * Histogram\n */\n'use strict';\n\nconst util = require('util');\nconst {\n\tgetLabels,\n\thashObject,\n\tisObject,\n\tremoveLabels,\n\tnowTimestamp,\n} = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\nconst Exemplar = require('./exemplar');\n\nclass Histogram extends Metric {\n\tconstructor(config) {\n\t\tsuper(config, {\n\t\t\tbuckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],\n\t\t});\n\n\t\tthis.type = 'histogram';\n\t\tthis.defaultLabels = {};\n\t\tthis.defaultExemplarLabelSet = {};\n\t\tthis.enableExemplars = false;\n\n\t\tfor (const label of this.labelNames) {\n\t\t\tif (label === 'le') {\n\t\t\t\tthrow new Error('le is a reserved label keyword');\n\t\t\t}\n\t\t}\n\n\t\tthis.upperBounds = this.buckets;\n\t\tthis.bucketValues = this.upperBounds.reduce((acc, upperBound) => {\n\t\t\tacc[upperBound] = 0;\n\t\t\treturn acc;\n\t\t}, {});\n\n\t\tif (config.enableExemplars) {\n\t\t\tthis.enableExemplars = true;\n\t\t\tthis.bucketExemplars = this.upperBounds.reduce((acc, upperBound) => {\n\t\t\t\tacc[upperBound] = null;\n\t\t\t\treturn acc;\n\t\t\t}, {});\n\t\t\tObject.freeze(this.bucketExemplars);\n\t\t\tthis.observe = this.observeWithExemplar;\n\t\t} else {\n\t\t\tthis.observe = this.observeWithoutExemplar;\n\t\t}\n\n\t\tObject.freeze(this.bucketValues);\n\t\tObject.freeze(this.upperBounds);\n\n\t\tif (this.labelNames.length === 0) {\n\t\t\tthis.hashMap = {\n\t\t\t\t[hashObject({})]: createBaseValues(\n\t\t\t\t\t{},\n\t\t\t\t\tthis.bucketValues,\n\t\t\t\t\tthis.bucketExemplars,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Observe a value in histogram\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to observe in the histogram\n\t * @returns {void}\n\t */\n\tobserveWithoutExemplar(labels, value) {\n\t\tobserve.call(this, labels === 0 ? 0 : labels || {})(value);\n\t}\n\n\tobserveWithExemplar({\n\t\tlabels = this.defaultLabels,\n\t\tvalue,\n\t\texemplarLabels = this.defaultExemplarLabelSet,\n\t} = {}) {\n\t\tobserve.call(this, labels === 0 ? 0 : labels || {})(value);\n\t\tthis.updateExemplar(labels, value, exemplarLabels);\n\t}\n\n\tupdateExemplar(labels, value, exemplarLabels) {\n\t\tif (Object.keys(exemplarLabels).length === 0) return;\n\t\tconst hash = hashObject(labels, this.sortedLabelNames);\n\t\tconst bound = findBound(this.upperBounds, value);\n\t\tconst { bucketExemplars } = this.hashMap[hash];\n\t\tlet exemplar = bucketExemplars[bound];\n\t\tif (!isObject(exemplar)) {\n\t\t\texemplar = new Exemplar();\n\t\t\tbucketExemplars[bound] = exemplar;\n\t\t}\n\t\texemplar.validateExemplarLabelSet(exemplarLabels);\n\t\texemplar.labelSet = exemplarLabels;\n\t\texemplar.value = value;\n\t\texemplar.timestamp = nowTimestamp();\n\t}\n\n\tasync get() {\n\t\tconst data = await this.getForPromString();\n\t\tdata.values = data.values.map(splayLabels);\n\t\treturn data;\n\t}\n\n\tasync getForPromString() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\t\tconst data = Object.values(this.hashMap);\n\t\tconst values = data\n\t\t\t.map(extractBucketValuesForExport(this))\n\t\t\t.reduce(addSumAndCountForExport(this), []);\n\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\thelp: this.help,\n\t\t\ttype: this.type,\n\t\t\tvalues,\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\treset() {\n\t\tthis.hashMap = {};\n\t}\n\n\t/**\n\t * Initialize the metrics for the given combination of labels to zero\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {void}\n\t */\n\tzero(labels) {\n\t\tconst hash = hashObject(labels, this.sortedLabelNames);\n\t\tthis.hashMap[hash] = createBaseValues(\n\t\t\tlabels,\n\t\t\tthis.bucketValues,\n\t\t\tthis.bucketExemplars,\n\t\t);\n\t}\n\n\t/**\n\t * Start a timer that could be used to logging durations\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {object} exemplarLabels - Object with labels for exemplar where key is the label key and value is label value. Can only be one level deep\n\t * @returns {function} - Function to invoke when you want to stop the timer and observe the duration in seconds\n\t * @example\n\t * var end = histogram.startTimer();\n\t * makeExpensiveXHRRequest(function(err, res) {\n\t * \tconst duration = end(); //Observe the duration of expensiveXHRRequest and returns duration in seconds\n\t * \tconsole.log('Duration', duration);\n\t * });\n\t */\n\tstartTimer(labels, exemplarLabels) {\n\t\treturn this.enableExemplars\n\t\t\t? startTimerWithExemplar.call(this, labels, exemplarLabels)()\n\t\t\t: startTimer.call(this, labels)();\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn {\n\t\t\tobserve: observe.call(this, labels),\n\t\t\tstartTimer: startTimer.call(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tremoveLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction startTimer(startLabels) {\n\treturn () => {\n\t\tconst start = process.hrtime();\n\t\treturn endLabels => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.observe(Object.assign({}, startLabels, endLabels), value);\n\t\t\treturn value;\n\t\t};\n\t};\n}\n\nfunction startTimerWithExemplar(startLabels, startExemplarLabels) {\n\treturn () => {\n\t\tconst start = process.hrtime();\n\t\treturn (endLabels, endExemplarLabels) => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.observe({\n\t\t\t\tlabels: Object.assign({}, startLabels, endLabels),\n\t\t\t\tvalue,\n\t\t\t\texemplarLabels: Object.assign(\n\t\t\t\t\t{},\n\t\t\t\t\tstartExemplarLabels,\n\t\t\t\t\tendExemplarLabels,\n\t\t\t\t),\n\t\t\t});\n\t\t\treturn value;\n\t\t};\n\t};\n}\n\nfunction setValuePair(labels, value, metricName, exemplar, sharedLabels = {}) {\n\treturn {\n\t\tlabels,\n\t\tsharedLabels,\n\t\tvalue,\n\t\tmetricName,\n\t\texemplar,\n\t};\n}\n\nfunction findBound(upperBounds, value) {\n\tfor (let i = 0; i < upperBounds.length; i++) {\n\t\tconst bound = upperBounds[i];\n\t\tif (value <= bound) {\n\t\t\treturn bound;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction observe(labels) {\n\treturn value => {\n\t\tconst labelValuePair = convertLabelsAndValues(labels, value);\n\n\t\tvalidateLabel(this.labelNames, labelValuePair.labels);\n\t\tif (!Number.isFinite(labelValuePair.value)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Value is not a valid number: ${util.format(labelValuePair.value)}`,\n\t\t\t);\n\t\t}\n\n\t\tconst hash = hashObject(labelValuePair.labels, this.sortedLabelNames);\n\t\tlet valueFromMap = this.hashMap[hash];\n\t\tif (!valueFromMap) {\n\t\t\tvalueFromMap = createBaseValues(\n\t\t\t\tlabelValuePair.labels,\n\t\t\t\tthis.bucketValues,\n\t\t\t\tthis.bucketExemplars,\n\t\t\t);\n\t\t}\n\n\t\tconst b = findBound(this.upperBounds, labelValuePair.value);\n\n\t\tvalueFromMap.sum += labelValuePair.value;\n\t\tvalueFromMap.count += 1;\n\n\t\tif (Object.prototype.hasOwnProperty.call(valueFromMap.bucketValues, b)) {\n\t\t\tvalueFromMap.bucketValues[b] += 1;\n\t\t}\n\n\t\tthis.hashMap[hash] = valueFromMap;\n\t};\n}\n\nfunction createBaseValues(labels, bucketValues, bucketExemplars) {\n\tconst result = {\n\t\tlabels,\n\t\tbucketValues: { ...bucketValues },\n\t\tsum: 0,\n\t\tcount: 0,\n\t};\n\tif (bucketExemplars) {\n\t\tresult.bucketExemplars = { ...bucketExemplars };\n\t}\n\treturn result;\n}\n\nfunction convertLabelsAndValues(labels, value) {\n\treturn isObject(labels)\n\t\t? {\n\t\t\t\tlabels,\n\t\t\t\tvalue,\n\t\t\t}\n\t\t: {\n\t\t\t\tvalue: labels,\n\t\t\t\tlabels: {},\n\t\t\t};\n}\n\nfunction extractBucketValuesForExport(histogram) {\n\tconst name = `${histogram.name}_bucket`;\n\treturn bucketData => {\n\t\tlet acc = 0;\n\t\tconst buckets = histogram.upperBounds.map(upperBound => {\n\t\t\tacc += bucketData.bucketValues[upperBound];\n\t\t\treturn setValuePair(\n\t\t\t\t{ le: upperBound },\n\t\t\t\tacc,\n\t\t\t\tname,\n\t\t\t\tbucketData.bucketExemplars\n\t\t\t\t\t? bucketData.bucketExemplars[upperBound]\n\t\t\t\t\t: null,\n\t\t\t\tbucketData.labels,\n\t\t\t);\n\t\t});\n\t\treturn { buckets, data: bucketData };\n\t};\n}\n\nfunction addSumAndCountForExport(histogram) {\n\treturn (acc, d) => {\n\t\tacc.push(...d.buckets);\n\n\t\tconst infLabel = { le: '+Inf' };\n\t\tacc.push(\n\t\t\tsetValuePair(\n\t\t\t\tinfLabel,\n\t\t\t\td.data.count,\n\t\t\t\t`${histogram.name}_bucket`,\n\t\t\t\td.data.bucketExemplars ? d.data.bucketExemplars['-1'] : null,\n\t\t\t\td.data.labels,\n\t\t\t),\n\t\t\tsetValuePair(\n\t\t\t\t{},\n\t\t\t\td.data.sum,\n\t\t\t\t`${histogram.name}_sum`,\n\t\t\t\tundefined,\n\t\t\t\td.data.labels,\n\t\t\t),\n\t\t\tsetValuePair(\n\t\t\t\t{},\n\t\t\t\td.data.count,\n\t\t\t\t`${histogram.name}_count`,\n\t\t\t\tundefined,\n\t\t\t\td.data.labels,\n\t\t\t),\n\t\t);\n\t\treturn acc;\n\t};\n}\n\nfunction splayLabels(bucket) {\n\tconst { sharedLabels, labels, ...newBucket } = bucket;\n\tfor (const label of Object.keys(sharedLabels)) {\n\t\tlabels[label] = sharedLabels[label];\n\t}\n\tnewBucket.labels = labels;\n\treturn newBucket;\n}\n\nmodule.exports = Histogram;\n","\nfunction TreeBase() {}\n\n// removes all nodes from the tree\nTreeBase.prototype.clear = function() {\n this._root = null;\n this.size = 0;\n};\n\n// returns node data if found, null otherwise\nTreeBase.prototype.find = function(data) {\n var res = this._root;\n\n while(res !== null) {\n var c = this._comparator(data, res.data);\n if(c === 0) {\n return res.data;\n }\n else {\n res = res.get_child(c > 0);\n }\n }\n\n return null;\n};\n\n// returns iterator to node if found, null otherwise\nTreeBase.prototype.findIter = function(data) {\n var res = this._root;\n var iter = this.iterator();\n\n while(res !== null) {\n var c = this._comparator(data, res.data);\n if(c === 0) {\n iter._cursor = res;\n return iter;\n }\n else {\n iter._ancestors.push(res);\n res = res.get_child(c > 0);\n }\n }\n\n return null;\n};\n\n// Returns an iterator to the tree node at or immediately after the item\nTreeBase.prototype.lowerBound = function(item) {\n var cur = this._root;\n var iter = this.iterator();\n var cmp = this._comparator;\n\n while(cur !== null) {\n var c = cmp(item, cur.data);\n if(c === 0) {\n iter._cursor = cur;\n return iter;\n }\n iter._ancestors.push(cur);\n cur = cur.get_child(c > 0);\n }\n\n for(var i=iter._ancestors.length - 1; i >= 0; --i) {\n cur = iter._ancestors[i];\n if(cmp(item, cur.data) < 0) {\n iter._cursor = cur;\n iter._ancestors.length = i;\n return iter;\n }\n }\n\n iter._ancestors.length = 0;\n return iter;\n};\n\n// Returns an iterator to the tree node immediately after the item\nTreeBase.prototype.upperBound = function(item) {\n var iter = this.lowerBound(item);\n var cmp = this._comparator;\n\n while(iter.data() !== null && cmp(iter.data(), item) === 0) {\n iter.next();\n }\n\n return iter;\n};\n\n// returns null if tree is empty\nTreeBase.prototype.min = function() {\n var res = this._root;\n if(res === null) {\n return null;\n }\n\n while(res.left !== null) {\n res = res.left;\n }\n\n return res.data;\n};\n\n// returns null if tree is empty\nTreeBase.prototype.max = function() {\n var res = this._root;\n if(res === null) {\n return null;\n }\n\n while(res.right !== null) {\n res = res.right;\n }\n\n return res.data;\n};\n\n// returns a null iterator\n// call next() or prev() to point to an element\nTreeBase.prototype.iterator = function() {\n return new Iterator(this);\n};\n\n// calls cb on each node's data, in order\nTreeBase.prototype.each = function(cb) {\n var it=this.iterator(), data;\n while((data = it.next()) !== null) {\n if(cb(data) === false) {\n return;\n }\n }\n};\n\n// calls cb on each node's data, in reverse order\nTreeBase.prototype.reach = function(cb) {\n var it=this.iterator(), data;\n while((data = it.prev()) !== null) {\n if(cb(data) === false) {\n return;\n }\n }\n};\n\n\nfunction Iterator(tree) {\n this._tree = tree;\n this._ancestors = [];\n this._cursor = null;\n}\n\nIterator.prototype.data = function() {\n return this._cursor !== null ? this._cursor.data : null;\n};\n\n// if null-iterator, returns first node\n// otherwise, returns next node\nIterator.prototype.next = function() {\n if(this._cursor === null) {\n var root = this._tree._root;\n if(root !== null) {\n this._minNode(root);\n }\n }\n else {\n if(this._cursor.right === null) {\n // no greater node in subtree, go up to parent\n // if coming from a right child, continue up the stack\n var save;\n do {\n save = this._cursor;\n if(this._ancestors.length) {\n this._cursor = this._ancestors.pop();\n }\n else {\n this._cursor = null;\n break;\n }\n } while(this._cursor.right === save);\n }\n else {\n // get the next node from the subtree\n this._ancestors.push(this._cursor);\n this._minNode(this._cursor.right);\n }\n }\n return this._cursor !== null ? this._cursor.data : null;\n};\n\n// if null-iterator, returns last node\n// otherwise, returns previous node\nIterator.prototype.prev = function() {\n if(this._cursor === null) {\n var root = this._tree._root;\n if(root !== null) {\n this._maxNode(root);\n }\n }\n else {\n if(this._cursor.left === null) {\n var save;\n do {\n save = this._cursor;\n if(this._ancestors.length) {\n this._cursor = this._ancestors.pop();\n }\n else {\n this._cursor = null;\n break;\n }\n } while(this._cursor.left === save);\n }\n else {\n this._ancestors.push(this._cursor);\n this._maxNode(this._cursor.left);\n }\n }\n return this._cursor !== null ? this._cursor.data : null;\n};\n\nIterator.prototype._minNode = function(start) {\n while(start.left !== null) {\n this._ancestors.push(start);\n start = start.left;\n }\n this._cursor = start;\n};\n\nIterator.prototype._maxNode = function(start) {\n while(start.right !== null) {\n this._ancestors.push(start);\n start = start.right;\n }\n this._cursor = start;\n};\n\nmodule.exports = TreeBase;\n\n","\nvar TreeBase = require('./treebase');\n\nfunction Node(data) {\n this.data = data;\n this.left = null;\n this.right = null;\n this.red = true;\n}\n\nNode.prototype.get_child = function(dir) {\n return dir ? this.right : this.left;\n};\n\nNode.prototype.set_child = function(dir, val) {\n if(dir) {\n this.right = val;\n }\n else {\n this.left = val;\n }\n};\n\nfunction RBTree(comparator) {\n this._root = null;\n this._comparator = comparator;\n this.size = 0;\n}\n\nRBTree.prototype = new TreeBase();\n\n// returns true if inserted, false if duplicate\nRBTree.prototype.insert = function(data) {\n var ret = false;\n\n if(this._root === null) {\n // empty tree\n this._root = new Node(data);\n ret = true;\n this.size++;\n }\n else {\n var head = new Node(undefined); // fake tree root\n\n var dir = 0;\n var last = 0;\n\n // setup\n var gp = null; // grandparent\n var ggp = head; // grand-grand-parent\n var p = null; // parent\n var node = this._root;\n ggp.right = this._root;\n\n // search down\n while(true) {\n if(node === null) {\n // insert new node at the bottom\n node = new Node(data);\n p.set_child(dir, node);\n ret = true;\n this.size++;\n }\n else if(is_red(node.left) && is_red(node.right)) {\n // color flip\n node.red = true;\n node.left.red = false;\n node.right.red = false;\n }\n\n // fix red violation\n if(is_red(node) && is_red(p)) {\n var dir2 = ggp.right === gp;\n\n if(node === p.get_child(last)) {\n ggp.set_child(dir2, single_rotate(gp, !last));\n }\n else {\n ggp.set_child(dir2, double_rotate(gp, !last));\n }\n }\n\n var cmp = this._comparator(node.data, data);\n\n // stop if found\n if(cmp === 0) {\n break;\n }\n\n last = dir;\n dir = cmp < 0;\n\n // update helpers\n if(gp !== null) {\n ggp = gp;\n }\n gp = p;\n p = node;\n node = node.get_child(dir);\n }\n\n // update root\n this._root = head.right;\n }\n\n // make root black\n this._root.red = false;\n\n return ret;\n};\n\n// returns true if removed, false if not found\nRBTree.prototype.remove = function(data) {\n if(this._root === null) {\n return false;\n }\n\n var head = new Node(undefined); // fake tree root\n var node = head;\n node.right = this._root;\n var p = null; // parent\n var gp = null; // grand parent\n var found = null; // found item\n var dir = 1;\n\n while(node.get_child(dir) !== null) {\n var last = dir;\n\n // update helpers\n gp = p;\n p = node;\n node = node.get_child(dir);\n\n var cmp = this._comparator(data, node.data);\n\n dir = cmp > 0;\n\n // save found node\n if(cmp === 0) {\n found = node;\n }\n\n // push the red node down\n if(!is_red(node) && !is_red(node.get_child(dir))) {\n if(is_red(node.get_child(!dir))) {\n var sr = single_rotate(node, dir);\n p.set_child(last, sr);\n p = sr;\n }\n else if(!is_red(node.get_child(!dir))) {\n var sibling = p.get_child(!last);\n if(sibling !== null) {\n if(!is_red(sibling.get_child(!last)) && !is_red(sibling.get_child(last))) {\n // color flip\n p.red = false;\n sibling.red = true;\n node.red = true;\n }\n else {\n var dir2 = gp.right === p;\n\n if(is_red(sibling.get_child(last))) {\n gp.set_child(dir2, double_rotate(p, last));\n }\n else if(is_red(sibling.get_child(!last))) {\n gp.set_child(dir2, single_rotate(p, last));\n }\n\n // ensure correct coloring\n var gpc = gp.get_child(dir2);\n gpc.red = true;\n node.red = true;\n gpc.left.red = false;\n gpc.right.red = false;\n }\n }\n }\n }\n }\n\n // replace and remove if found\n if(found !== null) {\n found.data = node.data;\n p.set_child(p.right === node, node.get_child(node.left === null));\n this.size--;\n }\n\n // update root and make it black\n this._root = head.right;\n if(this._root !== null) {\n this._root.red = false;\n }\n\n return found !== null;\n};\n\nfunction is_red(node) {\n return node !== null && node.red;\n}\n\nfunction single_rotate(root, dir) {\n var save = root.get_child(!dir);\n\n root.set_child(!dir, save.get_child(dir));\n save.set_child(dir, root);\n\n root.red = true;\n save.red = false;\n\n return save;\n}\n\nfunction double_rotate(root, dir) {\n root.set_child(!dir, single_rotate(root.get_child(!dir), !dir));\n return single_rotate(root, dir);\n}\n\nmodule.exports = RBTree;\n","\nvar TreeBase = require('./treebase');\n\nfunction Node(data) {\n this.data = data;\n this.left = null;\n this.right = null;\n}\n\nNode.prototype.get_child = function(dir) {\n return dir ? this.right : this.left;\n};\n\nNode.prototype.set_child = function(dir, val) {\n if(dir) {\n this.right = val;\n }\n else {\n this.left = val;\n }\n};\n\nfunction BinTree(comparator) {\n this._root = null;\n this._comparator = comparator;\n this.size = 0;\n}\n\nBinTree.prototype = new TreeBase();\n\n// returns true if inserted, false if duplicate\nBinTree.prototype.insert = function(data) {\n if(this._root === null) {\n // empty tree\n this._root = new Node(data);\n this.size++;\n return true;\n }\n\n var dir = 0;\n\n // setup\n var p = null; // parent\n var node = this._root;\n\n // search down\n while(true) {\n if(node === null) {\n // insert new node at the bottom\n node = new Node(data);\n p.set_child(dir, node);\n ret = true;\n this.size++;\n return true;\n }\n\n // stop if found\n if(this._comparator(node.data, data) === 0) {\n return false;\n }\n\n dir = this._comparator(node.data, data) < 0;\n\n // update helpers\n p = node;\n node = node.get_child(dir);\n }\n};\n\n// returns true if removed, false if not found\nBinTree.prototype.remove = function(data) {\n if(this._root === null) {\n return false;\n }\n\n var head = new Node(undefined); // fake tree root\n var node = head;\n node.right = this._root;\n var p = null; // parent\n var found = null; // found item\n var dir = 1;\n\n while(node.get_child(dir) !== null) {\n p = node;\n node = node.get_child(dir);\n var cmp = this._comparator(data, node.data);\n dir = cmp > 0;\n\n if(cmp === 0) {\n found = node;\n }\n }\n\n if(found !== null) {\n found.data = node.data;\n p.set_child(p.right === node, node.get_child(node.left === null));\n\n this._root = head.right;\n this.size--;\n return true;\n }\n else {\n return false;\n }\n};\n\nmodule.exports = BinTree;\n\n","module.exports = {\n RBTree: require('./lib/rbtree'),\n BinTree: require('./lib/bintree')\n};\n","//\n// TDigest:\n//\n// approximate distribution percentiles from a stream of reals\n//\nvar RBTree = require('bintrees').RBTree;\n\nfunction TDigest(delta, K, CX) {\n // allocate a TDigest structure.\n //\n // delta is the compression factor, the max fraction of mass that\n // can be owned by one centroid (bigger, up to 1.0, means more\n // compression). delta=false switches off TDigest behavior and treats\n // the distribution as discrete, with no merging and exact values\n // reported.\n //\n // K is a size threshold that triggers recompression as the TDigest\n // grows during input. (Set it to 0 to disable automatic recompression)\n //\n // CX specifies how often to update cached cumulative totals used\n // for quantile estimation during ingest (see cumulate()). Set to\n // 0 to use exact quantiles for each new point.\n //\n this.discrete = (delta === false);\n this.delta = delta || 0.01;\n this.K = (K === undefined) ? 25 : K;\n this.CX = (CX === undefined) ? 1.1 : CX;\n this.centroids = new RBTree(compare_centroid_means);\n this.nreset = 0;\n this.reset();\n}\n\nTDigest.prototype.reset = function() {\n // prepare to digest new points.\n //\n this.centroids.clear();\n this.n = 0;\n this.nreset += 1;\n this.last_cumulate = 0;\n};\n\nTDigest.prototype.size = function() {\n return this.centroids.size;\n};\n\nTDigest.prototype.toArray = function(everything) {\n // return {mean,n} of centroids as an array ordered by mean.\n //\n var result = [];\n if (everything) {\n this._cumulate(true); // be sure cumns are exact\n this.centroids.each(function(c) { result.push(c); });\n } else {\n this.centroids.each(function(c) { result.push({mean:c.mean, n:c.n}); });\n }\n return result;\n};\n\nTDigest.prototype.summary = function() {\n var approx = (this.discrete) ? \"exact \" : \"approximating \";\n var s = [approx + this.n + \" samples using \" + this.size() + \" centroids\",\n \"min = \"+this.percentile(0),\n \"Q1 = \"+this.percentile(0.25),\n \"Q2 = \"+this.percentile(0.5),\n \"Q3 = \"+this.percentile(0.75),\n \"max = \"+this.percentile(1.0)];\n return s.join('\\n');\n};\n\nfunction compare_centroid_means(a, b) {\n // order two centroids by mean.\n //\n return (a.mean > b.mean) ? 1 : (a.mean < b.mean) ? -1 : 0;\n}\n\nfunction compare_centroid_mean_cumns(a, b) {\n // order two centroids by mean_cumn.\n //\n return (a.mean_cumn - b.mean_cumn);\n}\n\nTDigest.prototype.push = function(x, n) {\n // incorporate value or array of values x, having count n into the\n // TDigest. n defaults to 1.\n //\n n = n || 1;\n x = Array.isArray(x) ? x : [x];\n for (var i = 0 ; i < x.length ; i++) {\n this._digest(x[i], n);\n }\n};\n\nTDigest.prototype.push_centroid = function(c) {\n // incorporate centroid or array of centroids c\n //\n c = Array.isArray(c) ? c : [c];\n for (var i = 0 ; i < c.length ; i++) {\n this._digest(c[i].mean, c[i].n);\n }\n};\n\nTDigest.prototype._cumulate = function(exact) {\n // update cumulative counts for each centroid\n //\n // exact: falsey means only cumulate after sufficient\n // growth. During ingest, these counts are used as quantile\n // estimates, and they work well even when somewhat out of\n // date. (this is a departure from the publication, you may set CX\n // to 0 to disable).\n //\n if (this.n === this.last_cumulate ||\n !exact && this.CX && this.CX > (this.n / this.last_cumulate)) {\n return;\n }\n var cumn = 0;\n this.centroids.each(function(c) {\n c.mean_cumn = cumn + c.n / 2; // half of n at the mean\n cumn = c.cumn = cumn + c.n;\n });\n this.n = this.last_cumulate = cumn;\n};\n\nTDigest.prototype.find_nearest = function(x) {\n // find the centroid closest to x. The assumption of\n // unique means and a unique nearest centroid departs from the\n // paper, see _digest() below\n //\n if (this.size() === 0) {\n return null;\n }\n var iter = this.centroids.lowerBound({mean:x}); // x <= iter || iter==null\n var c = (iter.data() === null) ? iter.prev() : iter.data();\n if (c.mean === x || this.discrete) {\n return c; // c is either x or a neighbor (discrete: no distance func)\n }\n var prev = iter.prev();\n if (prev && Math.abs(prev.mean - x) < Math.abs(c.mean - x)) {\n return prev;\n } else {\n return c;\n }\n};\n\nTDigest.prototype._new_centroid = function(x, n, cumn) {\n // create and insert a new centroid into the digest (don't update\n // cumulatives).\n //\n var c = {mean:x, n:n, cumn:cumn};\n this.centroids.insert(c);\n this.n += n;\n return c;\n};\n\nTDigest.prototype._addweight = function(nearest, x, n) {\n // add weight at location x to nearest centroid. adding x to\n // nearest will not shift its relative position in the tree and\n // require reinsertion.\n //\n if (x !== nearest.mean) {\n nearest.mean += n * (x - nearest.mean) / (nearest.n + n);\n }\n nearest.cumn += n;\n nearest.mean_cumn += n / 2;\n nearest.n += n;\n this.n += n;\n};\n\nTDigest.prototype._digest = function(x, n) {\n // incorporate value x, having count n into the TDigest.\n //\n var min = this.centroids.min();\n var max = this.centroids.max();\n var nearest = this.find_nearest(x);\n if (nearest && nearest.mean === x) {\n // accumulate exact matches into the centroid without\n // limit. this is a departure from the paper, made so\n // centroids remain unique and code can be simple.\n this._addweight(nearest, x, n);\n } else if (nearest === min) {\n this._new_centroid(x, n, 0); // new point around min boundary\n } else if (nearest === max ) {\n this._new_centroid(x, n, this.n); // new point around max boundary\n } else if (this.discrete) {\n this._new_centroid(x, n, nearest.cumn); // never merge\n } else {\n // conider a merge based on nearest centroid's capacity. if\n // there's not room for all of n, don't bother merging any of\n // it into nearest, as we'll have to make a new centroid\n // anyway for the remainder (departure from the paper).\n var p = nearest.mean_cumn / this.n;\n var max_n = Math.floor(4 * this.n * this.delta * p * (1 - p));\n if (max_n - nearest.n >= n) {\n this._addweight(nearest, x, n);\n } else {\n this._new_centroid(x, n, nearest.cumn);\n }\n }\n this._cumulate(false);\n if (!this.discrete && this.K && this.size() > this.K / this.delta) {\n // re-process the centroids and hope for some compression.\n this.compress();\n }\n};\n\nTDigest.prototype.bound_mean = function(x) {\n // find centroids lower and upper such that lower.mean < x <\n // upper.mean or lower.mean === x === upper.mean. Don't call\n // this for x out of bounds.\n //\n var iter = this.centroids.upperBound({mean:x}); // x < iter\n var lower = iter.prev(); // lower <= x\n var upper = (lower.mean === x) ? lower : iter.next();\n return [lower, upper];\n};\n\nTDigest.prototype.p_rank = function(x_or_xlist) {\n // return approximate percentile-ranks (0..1) for data value x.\n // or list of x. calculated according to\n // https://en.wikipedia.org/wiki/Percentile_rank\n //\n // (Note that in continuous mode, boundary sample values will\n // report half their centroid weight inward from 0/1 as the\n // percentile-rank. X values outside the observed range return\n // 0/1)\n //\n // this triggers cumulate() if cumn's are out of date.\n //\n var xs = Array.isArray(x_or_xlist) ? x_or_xlist : [x_or_xlist];\n var ps = xs.map(this._p_rank, this);\n return Array.isArray(x_or_xlist) ? ps : ps[0];\n};\n\nTDigest.prototype._p_rank = function(x) {\n if (this.size() === 0) {\n return undefined;\n } else if (x < this.centroids.min().mean) {\n return 0.0;\n } else if (x > this.centroids.max().mean) {\n return 1.0;\n }\n // find centroids that bracket x and interpolate x's cumn from\n // their cumn's.\n this._cumulate(true); // be sure cumns are exact\n var bound = this.bound_mean(x);\n var lower = bound[0], upper = bound[1];\n if (this.discrete) {\n return lower.cumn / this.n;\n } else {\n var cumn = lower.mean_cumn;\n if (lower !== upper) {\n cumn += (x - lower.mean) * (upper.mean_cumn - lower.mean_cumn) / (upper.mean - lower.mean);\n }\n return cumn / this.n;\n }\n};\n\nTDigest.prototype.bound_mean_cumn = function(cumn) {\n // find centroids lower and upper such that lower.mean_cumn < x <\n // upper.mean_cumn or lower.mean_cumn === x === upper.mean_cumn. Don't call\n // this for cumn out of bounds.\n //\n // XXX because mean and mean_cumn give rise to the same sort order\n // (up to identical means), use the mean rbtree for our search.\n this.centroids._comparator = compare_centroid_mean_cumns;\n var iter = this.centroids.upperBound({mean_cumn:cumn}); // cumn < iter\n this.centroids._comparator = compare_centroid_means;\n var lower = iter.prev(); // lower <= cumn\n var upper = (lower && lower.mean_cumn === cumn) ? lower : iter.next();\n return [lower, upper];\n};\n\nTDigest.prototype.percentile = function(p_or_plist) {\n // for percentage p (0..1), or for each p in a list of ps, return\n // the smallest data value q at which at least p percent of the\n // observations <= q.\n //\n // for discrete distributions, this selects q using the Nearest\n // Rank Method\n // (https://en.wikipedia.org/wiki/Percentile#The_Nearest_Rank_method)\n // (in scipy, same as percentile(...., interpolation='higher')\n //\n // for continuous distributions, interpolates data values between\n // count-weighted bracketing means.\n //\n // this triggers cumulate() if cumn's are out of date.\n //\n var ps = Array.isArray(p_or_plist) ? p_or_plist : [p_or_plist];\n var qs = ps.map(this._percentile, this);\n return Array.isArray(p_or_plist) ? qs : qs[0];\n};\n\nTDigest.prototype._percentile = function(p) {\n if (this.size() === 0) {\n return undefined;\n }\n this._cumulate(true); // be sure cumns are exact\n var h = this.n * p;\n var bound = this.bound_mean_cumn(h);\n var lower = bound[0], upper = bound[1];\n\n if (upper === lower || lower === null || upper === null) {\n return (lower || upper).mean;\n } else if (!this.discrete) {\n return lower.mean + (h - lower.mean_cumn) * (upper.mean - lower.mean) / (upper.mean_cumn - lower.mean_cumn);\n } else if (h <= lower.cumn) {\n return lower.mean;\n } else {\n return upper.mean;\n }\n};\n\nfunction pop_random(choices) {\n // remove and return an item randomly chosen from the array of choices\n // (mutates choices)\n //\n var idx = Math.floor(Math.random() * choices.length);\n return choices.splice(idx, 1)[0];\n}\n\nTDigest.prototype.compress = function() {\n // TDigests experience worst case compression (none) when input\n // increases monotonically. Improve on any bad luck by\n // reconsuming digest centroids as if they were weighted points\n // while shuffling their order (and hope for the best).\n //\n if (this.compressing) {\n return;\n }\n var points = this.toArray();\n this.reset();\n this.compressing = true;\n while (points.length > 0) {\n this.push_centroid(pop_random(points));\n }\n this._cumulate(true);\n this.compressing = false;\n};\n\nfunction Digest(config) {\n // allocate a distribution digest structure. This is an extension\n // of a TDigest structure that starts in exact histogram (discrete)\n // mode, and automatically switches to TDigest mode for large\n // samples that appear to be from a continuous distribution.\n //\n this.config = config || {};\n this.mode = this.config.mode || 'auto'; // disc, cont, auto\n TDigest.call(this, this.mode === 'cont' ? config.delta : false);\n this.digest_ratio = this.config.ratio || 0.9;\n this.digest_thresh = this.config.thresh || 1000;\n this.n_unique = 0;\n}\nDigest.prototype = Object.create(TDigest.prototype);\nDigest.prototype.constructor = Digest;\n\nDigest.prototype.push = function(x_or_xlist) {\n TDigest.prototype.push.call(this, x_or_xlist);\n this.check_continuous();\n};\n\nDigest.prototype._new_centroid = function(x, n, cumn) {\n this.n_unique += 1;\n TDigest.prototype._new_centroid.call(this, x, n, cumn);\n};\n\nDigest.prototype._addweight = function(nearest, x, n) {\n if (nearest.n === 1) {\n this.n_unique -= 1;\n }\n TDigest.prototype._addweight.call(this, nearest, x, n);\n};\n\nDigest.prototype.check_continuous = function() {\n // while in 'auto' mode, if there are many unique elements, assume\n // they are from a continuous distribution and switch to 'cont'\n // mode (tdigest behavior). Return true on transition from\n // disctete to continuous.\n if (this.mode !== 'auto' || this.size() < this.digest_thresh) {\n return false;\n }\n if (this.n_unique / this.size() > this.digest_ratio) {\n this.mode = 'cont';\n this.discrete = false;\n this.delta = this.config.delta || 0.01;\n this.compress();\n return true;\n }\n return false;\n};\n\nmodule.exports = {\n 'TDigest': TDigest,\n 'Digest': Digest\n};\n","'use strict';\n\nconst { TDigest } = require('tdigest');\n\nclass TimeWindowQuantiles {\n\tconstructor(maxAgeSeconds, ageBuckets) {\n\t\tthis.maxAgeSeconds = maxAgeSeconds || 0;\n\t\tthis.ageBuckets = ageBuckets || 0;\n\n\t\tthis.shouldRotate = maxAgeSeconds && ageBuckets;\n\n\t\tthis.ringBuffer = Array(ageBuckets).fill(new TDigest());\n\t\tthis.currentBuffer = 0;\n\n\t\tthis.lastRotateTimestampMillis = Date.now();\n\t\tthis.durationBetweenRotatesMillis =\n\t\t\t(maxAgeSeconds * 1000) / ageBuckets || Infinity;\n\t}\n\n\tsize() {\n\t\tconst bucket = rotate.call(this);\n\t\treturn bucket.size();\n\t}\n\n\tpercentile(quantile) {\n\t\tconst bucket = rotate.call(this);\n\t\treturn bucket.percentile(quantile);\n\t}\n\n\tpush(value) {\n\t\trotate.call(this);\n\t\tthis.ringBuffer.forEach(bucket => {\n\t\t\tbucket.push(value);\n\t\t});\n\t}\n\n\treset() {\n\t\tthis.ringBuffer.forEach(bucket => {\n\t\t\tbucket.reset();\n\t\t});\n\t}\n\n\tcompress() {\n\t\tthis.ringBuffer.forEach(bucket => {\n\t\t\tbucket.compress();\n\t\t});\n\t}\n}\n\nfunction rotate() {\n\tlet timeSinceLastRotateMillis = Date.now() - this.lastRotateTimestampMillis;\n\twhile (\n\t\ttimeSinceLastRotateMillis > this.durationBetweenRotatesMillis &&\n\t\tthis.shouldRotate\n\t) {\n\t\tthis.ringBuffer[this.currentBuffer] = new TDigest();\n\n\t\tif (++this.currentBuffer >= this.ringBuffer.length) {\n\t\t\tthis.currentBuffer = 0;\n\t\t}\n\t\ttimeSinceLastRotateMillis -= this.durationBetweenRotatesMillis;\n\t\tthis.lastRotateTimestampMillis += this.durationBetweenRotatesMillis;\n\t}\n\treturn this.ringBuffer[this.currentBuffer];\n}\n\nmodule.exports = TimeWindowQuantiles;\n","/**\n * Summary\n */\n'use strict';\n\nconst util = require('util');\nconst { getLabels, hashObject, removeLabels } = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\nconst timeWindowQuantiles = require('./timeWindowQuantiles');\n\nconst DEFAULT_COMPRESS_COUNT = 1000; // every 1000 measurements\n\nclass Summary extends Metric {\n\tconstructor(config) {\n\t\tsuper(config, {\n\t\t\tpercentiles: [0.01, 0.05, 0.5, 0.9, 0.95, 0.99, 0.999],\n\t\t\tcompressCount: DEFAULT_COMPRESS_COUNT,\n\t\t\thashMap: {},\n\t\t});\n\n\t\tthis.type = 'summary';\n\n\t\tfor (const label of this.labelNames) {\n\t\t\tif (label === 'quantile')\n\t\t\t\tthrow new Error('quantile is a reserved label keyword');\n\t\t}\n\n\t\tif (this.labelNames.length === 0) {\n\t\t\tthis.hashMap = {\n\t\t\t\t[hashObject({})]: {\n\t\t\t\t\tlabels: {},\n\t\t\t\t\ttd: new timeWindowQuantiles(this.maxAgeSeconds, this.ageBuckets),\n\t\t\t\t\tcount: 0,\n\t\t\t\t\tsum: 0,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Observe a value\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to observe\n\t * @returns {void}\n\t */\n\tobserve(labels, value) {\n\t\tobserve.call(this, labels === 0 ? 0 : labels || {})(value);\n\t}\n\n\tasync get() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\t\tconst hashKeys = Object.keys(this.hashMap);\n\t\tconst values = [];\n\n\t\thashKeys.forEach(hashKey => {\n\t\t\tconst s = this.hashMap[hashKey];\n\t\t\tif (s) {\n\t\t\t\tif (this.pruneAgedBuckets && s.td.size() === 0) {\n\t\t\t\t\tdelete this.hashMap[hashKey];\n\t\t\t\t} else {\n\t\t\t\t\textractSummariesForExport(s, this.percentiles).forEach(v => {\n\t\t\t\t\t\tvalues.push(v);\n\t\t\t\t\t});\n\t\t\t\t\tvalues.push(getSumForExport(s, this));\n\t\t\t\t\tvalues.push(getCountForExport(s, this));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\thelp: this.help,\n\t\t\ttype: this.type,\n\t\t\tvalues,\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\treset() {\n\t\tconst data = Object.values(this.hashMap);\n\t\tdata.forEach(s => {\n\t\t\ts.td.reset();\n\t\t\ts.count = 0;\n\t\t\ts.sum = 0;\n\t\t});\n\t}\n\n\t/**\n\t * Start a timer that could be used to logging durations\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {function} - Function to invoke when you want to stop the timer and observe the duration in seconds\n\t * @example\n\t * var end = summary.startTimer();\n\t * makeExpensiveXHRRequest(function(err, res) {\n\t *\tend(); //Observe the duration of expensiveXHRRequest\n\t * });\n\t */\n\tstartTimer(labels) {\n\t\treturn startTimer.call(this, labels)();\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn {\n\t\t\tobserve: observe.call(this, labels),\n\t\t\tstartTimer: startTimer.call(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tremoveLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction extractSummariesForExport(summaryOfLabels, percentiles) {\n\tsummaryOfLabels.td.compress();\n\n\treturn percentiles.map(percentile => {\n\t\tconst percentileValue = summaryOfLabels.td.percentile(percentile);\n\t\treturn {\n\t\t\tlabels: Object.assign({ quantile: percentile }, summaryOfLabels.labels),\n\t\t\tvalue: percentileValue ? percentileValue : 0,\n\t\t};\n\t});\n}\n\nfunction getCountForExport(value, summary) {\n\treturn {\n\t\tmetricName: `${summary.name}_count`,\n\t\tlabels: value.labels,\n\t\tvalue: value.count,\n\t};\n}\n\nfunction getSumForExport(value, summary) {\n\treturn {\n\t\tmetricName: `${summary.name}_sum`,\n\t\tlabels: value.labels,\n\t\tvalue: value.sum,\n\t};\n}\n\nfunction startTimer(startLabels) {\n\treturn () => {\n\t\tconst start = process.hrtime();\n\t\treturn endLabels => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.observe(Object.assign({}, startLabels, endLabels), value);\n\t\t\treturn value;\n\t\t};\n\t};\n}\n\nfunction observe(labels) {\n\treturn value => {\n\t\tconst labelValuePair = convertLabelsAndValues(labels, value);\n\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tif (!Number.isFinite(labelValuePair.value)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Value is not a valid number: ${util.format(labelValuePair.value)}`,\n\t\t\t);\n\t\t}\n\n\t\tconst hash = hashObject(labelValuePair.labels, this.sortedLabelNames);\n\t\tlet summaryOfLabel = this.hashMap[hash];\n\t\tif (!summaryOfLabel) {\n\t\t\tsummaryOfLabel = {\n\t\t\t\tlabels: labelValuePair.labels,\n\t\t\t\ttd: new timeWindowQuantiles(this.maxAgeSeconds, this.ageBuckets),\n\t\t\t\tcount: 0,\n\t\t\t\tsum: 0,\n\t\t\t};\n\t\t}\n\n\t\tsummaryOfLabel.td.push(labelValuePair.value);\n\t\tsummaryOfLabel.count++;\n\t\tif (summaryOfLabel.count % this.compressCount === 0) {\n\t\t\tsummaryOfLabel.td.compress();\n\t\t}\n\t\tsummaryOfLabel.sum += labelValuePair.value;\n\t\tthis.hashMap[hash] = summaryOfLabel;\n\t};\n}\n\nfunction convertLabelsAndValues(labels, value) {\n\tif (value === undefined) {\n\t\treturn {\n\t\t\tvalue: labels,\n\t\t\tlabels: {},\n\t\t};\n\t}\n\n\treturn {\n\t\tlabels,\n\t\tvalue,\n\t};\n}\n\nmodule.exports = Summary;\n","'use strict';\n\nconst url = require('url');\nconst http = require('http');\nconst https = require('https');\nconst { gzipSync } = require('zlib');\nconst { globalRegistry } = require('./registry');\n\nclass Pushgateway {\n\tconstructor(gatewayUrl, options, registry) {\n\t\tif (!registry) {\n\t\t\tregistry = globalRegistry;\n\t\t}\n\t\tthis.registry = registry;\n\t\tthis.gatewayUrl = gatewayUrl;\n\t\tconst { requireJobName, ...requestOptions } = {\n\t\t\trequireJobName: true,\n\t\t\t...options,\n\t\t};\n\t\tthis.requireJobName = requireJobName;\n\t\tthis.requestOptions = requestOptions;\n\t}\n\n\tpushAdd(params = {}) {\n\t\tif (this.requireJobName && !params.jobName) {\n\t\t\tthrow new Error('Missing jobName parameter');\n\t\t}\n\n\t\treturn useGateway.call(this, 'POST', params.jobName, params.groupings);\n\t}\n\n\tpush(params = {}) {\n\t\tif (this.requireJobName && !params.jobName) {\n\t\t\tthrow new Error('Missing jobName parameter');\n\t\t}\n\n\t\treturn useGateway.call(this, 'PUT', params.jobName, params.groupings);\n\t}\n\n\tdelete(params = {}) {\n\t\tif (this.requireJobName && !params.jobName) {\n\t\t\tthrow new Error('Missing jobName parameter');\n\t\t}\n\n\t\treturn useGateway.call(this, 'DELETE', params.jobName, params.groupings);\n\t}\n}\nasync function useGateway(method, job, groupings) {\n\t// `URL` first added in v6.13.0\n\t// eslint-disable-next-line n/no-deprecated-api\n\tconst gatewayUrlParsed = url.parse(this.gatewayUrl);\n\tconst gatewayUrlPath =\n\t\tgatewayUrlParsed.pathname && gatewayUrlParsed.pathname !== '/'\n\t\t\t? gatewayUrlParsed.pathname\n\t\t\t: '';\n\tconst jobPath = job\n\t\t? `/job/${encodeURIComponent(job)}${generateGroupings(groupings)}`\n\t\t: '';\n\tconst path = `${gatewayUrlPath}/metrics${jobPath}`;\n\n\t// eslint-disable-next-line n/no-deprecated-api\n\tconst target = url.resolve(this.gatewayUrl, path);\n\t// eslint-disable-next-line n/no-deprecated-api\n\tconst requestParams = url.parse(target);\n\tconst httpModule = isHttps(requestParams.href) ? https : http;\n\tconst options = Object.assign(requestParams, this.requestOptions, {\n\t\tmethod,\n\t});\n\n\treturn new Promise((resolve, reject) => {\n\t\tif (method === 'DELETE' && options.headers) {\n\t\t\tdelete options.headers['Content-Encoding'];\n\t\t}\n\t\tconst req = httpModule.request(options, resp => {\n\t\t\tlet body = '';\n\t\t\tresp.setEncoding('utf8');\n\t\t\tresp.on('data', chunk => {\n\t\t\t\tbody += chunk;\n\t\t\t});\n\t\t\tresp.on('end', () => {\n\t\t\t\tif (resp.statusCode >= 400) {\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(`push failed with status ${resp.statusCode}, ${body}`),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tresolve({ resp, body });\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\treq.on('error', err => {\n\t\t\treject(err);\n\t\t});\n\n\t\treq.on('timeout', () => {\n\t\t\treq.destroy(new Error('Pushgateway request timed out'));\n\t\t});\n\n\t\tif (method !== 'DELETE') {\n\t\t\tthis.registry\n\t\t\t\t.metrics()\n\t\t\t\t.then(metrics => {\n\t\t\t\t\tif (\n\t\t\t\t\t\toptions.headers &&\n\t\t\t\t\t\toptions.headers['Content-Encoding'] === 'gzip'\n\t\t\t\t\t) {\n\t\t\t\t\t\tmetrics = gzipSync(metrics);\n\t\t\t\t\t}\n\t\t\t\t\treq.write(metrics);\n\t\t\t\t\treq.end();\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t} else {\n\t\t\treq.end();\n\t\t}\n\t});\n}\n\nfunction generateGroupings(groupings) {\n\tif (!groupings) {\n\t\treturn '';\n\t}\n\treturn Object.keys(groupings)\n\t\t.map(\n\t\t\tkey =>\n\t\t\t\t`/${encodeURIComponent(key)}/${encodeURIComponent(groupings[key])}`,\n\t\t)\n\t\t.join('');\n}\n\nfunction isHttps(href) {\n\treturn href.search(/^https/) !== -1;\n}\n\nmodule.exports = Pushgateway;\n","'use strict';\n\nexports.linearBuckets = (start, width, count) => {\n\tif (count < 1) {\n\t\tthrow new Error('Linear buckets needs a positive count');\n\t}\n\n\tconst buckets = new Array(count);\n\tfor (let i = 0; i < count; i++) {\n\t\tbuckets[i] = start + i * width;\n\t}\n\treturn buckets;\n};\n\nexports.exponentialBuckets = (start, factor, count) => {\n\tif (start <= 0) {\n\t\tthrow new Error('Exponential buckets needs a positive start');\n\t}\n\tif (count < 1) {\n\t\tthrow new Error('Exponential buckets needs a positive count');\n\t}\n\tif (factor <= 1) {\n\t\tthrow new Error('Exponential buckets needs a factor greater than 1');\n\t}\n\tconst buckets = new Array(count);\n\tfor (let i = 0; i < count; i++) {\n\t\tbuckets[i] = start;\n\t\tstart *= factor;\n\t}\n\treturn buckets;\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** only globals that common to node and browsers are allowed */\n// eslint-disable-next-line node/no-unsupported-features/es-builtins\nexport const _globalThis = typeof globalThis === 'object' ? globalThis : global;\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './globalThis';\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './node';\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '1.9.0';\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { VERSION } from '../version';\n\nconst re = /^(\\d+)\\.(\\d+)\\.(\\d+)(-(.+))?$/;\n\n/**\n * Create a function to test an API version to see if it is compatible with the provided ownVersion.\n *\n * The returned function has the following semantics:\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param ownVersion version which should be checked against\n */\nexport function _makeCompatibilityCheck(\n ownVersion: string\n): (globalVersion: string) => boolean {\n const acceptedVersions = new Set<string>([ownVersion]);\n const rejectedVersions = new Set<string>();\n\n const myVersionMatch = ownVersion.match(re);\n if (!myVersionMatch) {\n // we cannot guarantee compatibility so we always return noop\n return () => false;\n }\n\n const ownVersionParsed = {\n major: +myVersionMatch[1],\n minor: +myVersionMatch[2],\n patch: +myVersionMatch[3],\n prerelease: myVersionMatch[4],\n };\n\n // if ownVersion has a prerelease tag, versions must match exactly\n if (ownVersionParsed.prerelease != null) {\n return function isExactmatch(globalVersion: string): boolean {\n return globalVersion === ownVersion;\n };\n }\n\n function _reject(v: string) {\n rejectedVersions.add(v);\n return false;\n }\n\n function _accept(v: string) {\n acceptedVersions.add(v);\n return true;\n }\n\n return function isCompatible(globalVersion: string): boolean {\n if (acceptedVersions.has(globalVersion)) {\n return true;\n }\n\n if (rejectedVersions.has(globalVersion)) {\n return false;\n }\n\n const globalVersionMatch = globalVersion.match(re);\n if (!globalVersionMatch) {\n // cannot parse other version\n // we cannot guarantee compatibility so we always noop\n return _reject(globalVersion);\n }\n\n const globalVersionParsed = {\n major: +globalVersionMatch[1],\n minor: +globalVersionMatch[2],\n patch: +globalVersionMatch[3],\n prerelease: globalVersionMatch[4],\n };\n\n // if globalVersion has a prerelease tag, versions must match exactly\n if (globalVersionParsed.prerelease != null) {\n return _reject(globalVersion);\n }\n\n // major versions must match\n if (ownVersionParsed.major !== globalVersionParsed.major) {\n return _reject(globalVersion);\n }\n\n if (ownVersionParsed.major === 0) {\n if (\n ownVersionParsed.minor === globalVersionParsed.minor &&\n ownVersionParsed.patch <= globalVersionParsed.patch\n ) {\n return _accept(globalVersion);\n }\n\n return _reject(globalVersion);\n }\n\n if (ownVersionParsed.minor <= globalVersionParsed.minor) {\n return _accept(globalVersion);\n }\n\n return _reject(globalVersion);\n };\n}\n\n/**\n * Test an API version to see if it is compatible with this API.\n *\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param version version of the API requesting an instance of the global API\n */\nexport const isCompatible = _makeCompatibilityCheck(VERSION);\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MeterProvider } from '../metrics/MeterProvider';\nimport { ContextManager } from '../context/types';\nimport { DiagLogger } from '../diag/types';\nimport { _globalThis } from '../platform';\nimport { TextMapPropagator } from '../propagation/TextMapPropagator';\nimport type { TracerProvider } from '../trace/tracer_provider';\nimport { VERSION } from '../version';\nimport { isCompatible } from './semver';\n\nconst major = VERSION.split('.')[0];\nconst GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for(\n `opentelemetry.js.api.${major}`\n);\n\nconst _global = _globalThis as OTelGlobal;\n\nexport function registerGlobal<Type extends keyof OTelGlobalAPI>(\n type: Type,\n instance: OTelGlobalAPI[Type],\n diag: DiagLogger,\n allowOverride = false\n): boolean {\n const api = (_global[GLOBAL_OPENTELEMETRY_API_KEY] = _global[\n GLOBAL_OPENTELEMETRY_API_KEY\n ] ?? {\n version: VERSION,\n });\n\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n const err = new Error(\n `@opentelemetry/api: Attempted duplicate registration of API: ${type}`\n );\n diag.error(err.stack || err.message);\n return false;\n }\n\n if (api.version !== VERSION) {\n // All registered APIs must be of the same version exactly\n const err = new Error(\n `@opentelemetry/api: Registration of version v${api.version} for ${type} does not match previously registered API v${VERSION}`\n );\n diag.error(err.stack || err.message);\n return false;\n }\n\n api[type] = instance;\n diag.debug(\n `@opentelemetry/api: Registered a global for ${type} v${VERSION}.`\n );\n\n return true;\n}\n\nexport function getGlobal<Type extends keyof OTelGlobalAPI>(\n type: Type\n): OTelGlobalAPI[Type] | undefined {\n const globalVersion = _global[GLOBAL_OPENTELEMETRY_API_KEY]?.version;\n if (!globalVersion || !isCompatible(globalVersion)) {\n return;\n }\n return _global[GLOBAL_OPENTELEMETRY_API_KEY]?.[type];\n}\n\nexport function unregisterGlobal(type: keyof OTelGlobalAPI, diag: DiagLogger) {\n diag.debug(\n `@opentelemetry/api: Unregistering a global for ${type} v${VERSION}.`\n );\n const api = _global[GLOBAL_OPENTELEMETRY_API_KEY];\n\n if (api) {\n delete api[type];\n }\n}\n\ntype OTelGlobal = {\n [GLOBAL_OPENTELEMETRY_API_KEY]?: OTelGlobalAPI;\n};\n\ntype OTelGlobalAPI = {\n version: string;\n\n diag?: DiagLogger;\n trace?: TracerProvider;\n context?: ContextManager;\n metrics?: MeterProvider;\n propagation?: TextMapPropagator;\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getGlobal } from '../internal/global-utils';\nimport { ComponentLoggerOptions, DiagLogger, DiagLogFunction } from './types';\n\n/**\n * Component Logger which is meant to be used as part of any component which\n * will add automatically additional namespace in front of the log message.\n * It will then forward all message to global diag logger\n * @example\n * const cLogger = diag.createComponentLogger({ namespace: '@opentelemetry/instrumentation-http' });\n * cLogger.debug('test');\n * // @opentelemetry/instrumentation-http test\n */\nexport class DiagComponentLogger implements DiagLogger {\n private _namespace: string;\n\n constructor(props: ComponentLoggerOptions) {\n this._namespace = props.namespace || 'DiagComponentLogger';\n }\n\n public debug(...args: any[]): void {\n return logProxy('debug', this._namespace, args);\n }\n\n public error(...args: any[]): void {\n return logProxy('error', this._namespace, args);\n }\n\n public info(...args: any[]): void {\n return logProxy('info', this._namespace, args);\n }\n\n public warn(...args: any[]): void {\n return logProxy('warn', this._namespace, args);\n }\n\n public verbose(...args: any[]): void {\n return logProxy('verbose', this._namespace, args);\n }\n}\n\nfunction logProxy(\n funcName: keyof DiagLogger,\n namespace: string,\n args: any\n): void {\n const logger = getGlobal('diag');\n // shortcut if logger not set\n if (!logger) {\n return;\n }\n\n args.unshift(namespace);\n return logger[funcName](...(args as Parameters<DiagLogFunction>));\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport type DiagLogFunction = (message: string, ...args: unknown[]) => void;\n\n/**\n * Defines an internal diagnostic logger interface which is used to log internal diagnostic\n * messages, you can set the default diagnostic logger via the {@link DiagAPI} setLogger function.\n * API provided implementations include :-\n * - a No-Op {@link createNoopDiagLogger}\n * - a {@link DiagLogLevel} filtering wrapper {@link createLogLevelDiagLogger}\n * - a general Console {@link DiagConsoleLogger} version.\n */\nexport interface DiagLogger {\n /** Log an error scenario that was not expected and caused the requested operation to fail. */\n error: DiagLogFunction;\n\n /**\n * Log a warning scenario to inform the developer of an issues that should be investigated.\n * The requested operation may or may not have succeeded or completed.\n */\n warn: DiagLogFunction;\n\n /**\n * Log a general informational message, this should not affect functionality.\n * This is also the default logging level so this should NOT be used for logging\n * debugging level information.\n */\n info: DiagLogFunction;\n\n /**\n * Log a general debug message that can be useful for identifying a failure.\n * Information logged at this level may include diagnostic details that would\n * help identify a failure scenario.\n * For example: Logging the order of execution of async operations.\n */\n debug: DiagLogFunction;\n\n /**\n * Log a detailed (verbose) trace level logging that can be used to identify failures\n * where debug level logging would be insufficient, this level of tracing can include\n * input and output parameters and as such may include PII information passing through\n * the API. As such it is recommended that this level of tracing should not be enabled\n * in a production environment.\n */\n verbose: DiagLogFunction;\n}\n\n/**\n * Defines the available internal logging levels for the diagnostic logger, the numeric values\n * of the levels are defined to match the original values from the initial LogLevel to avoid\n * compatibility/migration issues for any implementation that assume the numeric ordering.\n */\nexport enum DiagLogLevel {\n /** Diagnostic Logging level setting to disable all logging (except and forced logs) */\n NONE = 0,\n\n /** Identifies an error scenario */\n ERROR = 30,\n\n /** Identifies a warning scenario */\n WARN = 50,\n\n /** General informational log message */\n INFO = 60,\n\n /** General debug log message */\n DEBUG = 70,\n\n /**\n * Detailed trace level logging should only be used for development, should only be set\n * in a development environment.\n */\n VERBOSE = 80,\n\n /** Used to set the logging level to include all logging */\n ALL = 9999,\n}\n\n/**\n * Defines options for ComponentLogger\n */\nexport interface ComponentLoggerOptions {\n namespace: string;\n}\n\nexport interface DiagLoggerOptions {\n /**\n * The {@link DiagLogLevel} used to filter logs sent to the logger.\n *\n * @defaultValue DiagLogLevel.INFO\n */\n logLevel?: DiagLogLevel;\n\n /**\n * Setting this value to `true` will suppress the warning message normally emitted when registering a logger when another logger is already registered.\n */\n suppressOverrideMessage?: boolean;\n}\n\nexport interface DiagLoggerApi {\n /**\n * Set the global DiagLogger and DiagLogLevel.\n * If a global diag logger is already set, this will override it.\n *\n * @param logger - The {@link DiagLogger} instance to set as the default logger.\n * @param options - A {@link DiagLoggerOptions} object. If not provided, default values will be set.\n * @returns `true` if the logger was successfully registered, else `false`\n */\n setLogger(logger: DiagLogger, options?: DiagLoggerOptions): boolean;\n\n /**\n *\n * @param logger - The {@link DiagLogger} instance to set as the default logger.\n * @param logLevel - The {@link DiagLogLevel} used to filter logs sent to the logger. If not provided it will default to {@link DiagLogLevel.INFO}.\n * @returns `true` if the logger was successfully registered, else `false`\n */\n setLogger(logger: DiagLogger, logLevel?: DiagLogLevel): boolean;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagLogFunction, DiagLogger, DiagLogLevel } from '../types';\n\nexport function createLogLevelDiagLogger(\n maxLevel: DiagLogLevel,\n logger: DiagLogger\n): DiagLogger {\n if (maxLevel < DiagLogLevel.NONE) {\n maxLevel = DiagLogLevel.NONE;\n } else if (maxLevel > DiagLogLevel.ALL) {\n maxLevel = DiagLogLevel.ALL;\n }\n\n // In case the logger is null or undefined\n logger = logger || {};\n\n function _filterFunc(\n funcName: keyof DiagLogger,\n theLevel: DiagLogLevel\n ): DiagLogFunction {\n const theFunc = logger[funcName];\n\n if (typeof theFunc === 'function' && maxLevel >= theLevel) {\n return theFunc.bind(logger);\n }\n return function () {};\n }\n\n return {\n error: _filterFunc('error', DiagLogLevel.ERROR),\n warn: _filterFunc('warn', DiagLogLevel.WARN),\n info: _filterFunc('info', DiagLogLevel.INFO),\n debug: _filterFunc('debug', DiagLogLevel.DEBUG),\n verbose: _filterFunc('verbose', DiagLogLevel.VERBOSE),\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagComponentLogger } from '../diag/ComponentLogger';\nimport { createLogLevelDiagLogger } from '../diag/internal/logLevelLogger';\nimport {\n ComponentLoggerOptions,\n DiagLogFunction,\n DiagLogger,\n DiagLoggerApi,\n DiagLogLevel,\n} from '../diag/types';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\n\nconst API_NAME = 'diag';\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry internal\n * diagnostic API\n */\nexport class DiagAPI implements DiagLogger, DiagLoggerApi {\n private static _instance?: DiagAPI;\n\n /** Get the singleton instance of the DiagAPI API */\n public static instance(): DiagAPI {\n if (!this._instance) {\n this._instance = new DiagAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Private internal constructor\n * @private\n */\n private constructor() {\n function _logProxy(funcName: keyof DiagLogger): DiagLogFunction {\n return function (...args) {\n const logger = getGlobal('diag');\n // shortcut if logger not set\n if (!logger) return;\n return logger[funcName](...args);\n };\n }\n\n // Using self local variable for minification purposes as 'this' cannot be minified\n const self = this;\n\n // DiagAPI specific functions\n\n const setLogger: DiagLoggerApi['setLogger'] = (\n logger,\n optionsOrLogLevel = { logLevel: DiagLogLevel.INFO }\n ) => {\n if (logger === self) {\n // There isn't much we can do here.\n // Logging to the console might break the user application.\n // Try to log to self. If a logger was previously registered it will receive the log.\n const err = new Error(\n 'Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation'\n );\n self.error(err.stack ?? err.message);\n return false;\n }\n\n if (typeof optionsOrLogLevel === 'number') {\n optionsOrLogLevel = {\n logLevel: optionsOrLogLevel,\n };\n }\n\n const oldLogger = getGlobal('diag');\n const newLogger = createLogLevelDiagLogger(\n optionsOrLogLevel.logLevel ?? DiagLogLevel.INFO,\n logger\n );\n // There already is an logger registered. We'll let it know before overwriting it.\n if (oldLogger && !optionsOrLogLevel.suppressOverrideMessage) {\n const stack = new Error().stack ?? '<failed to generate stacktrace>';\n oldLogger.warn(`Current logger will be overwritten from ${stack}`);\n newLogger.warn(\n `Current logger will overwrite one already registered from ${stack}`\n );\n }\n\n return registerGlobal('diag', newLogger, self, true);\n };\n\n self.setLogger = setLogger;\n\n self.disable = () => {\n unregisterGlobal(API_NAME, self);\n };\n\n self.createComponentLogger = (options: ComponentLoggerOptions) => {\n return new DiagComponentLogger(options);\n };\n\n self.verbose = _logProxy('verbose');\n self.debug = _logProxy('debug');\n self.info = _logProxy('info');\n self.warn = _logProxy('warn');\n self.error = _logProxy('error');\n }\n\n public setLogger!: DiagLoggerApi['setLogger'];\n /**\n *\n */\n public createComponentLogger!: (\n options: ComponentLoggerOptions\n ) => DiagLogger;\n\n // DiagLogger implementation\n public verbose!: DiagLogFunction;\n public debug!: DiagLogFunction;\n public info!: DiagLogFunction;\n public warn!: DiagLogFunction;\n public error!: DiagLogFunction;\n\n /**\n * Unregister the global logger and return to Noop\n */\n public disable!: () => void;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Baggage, BaggageEntry } from '../types';\n\nexport class BaggageImpl implements Baggage {\n private _entries: Map<string, BaggageEntry>;\n\n constructor(entries?: Map<string, BaggageEntry>) {\n this._entries = entries ? new Map(entries) : new Map();\n }\n\n getEntry(key: string): BaggageEntry | undefined {\n const entry = this._entries.get(key);\n if (!entry) {\n return undefined;\n }\n\n return Object.assign({}, entry);\n }\n\n getAllEntries(): [string, BaggageEntry][] {\n return Array.from(this._entries.entries()).map(([k, v]) => [k, v]);\n }\n\n setEntry(key: string, entry: BaggageEntry): BaggageImpl {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.set(key, entry);\n return newBaggage;\n }\n\n removeEntry(key: string): BaggageImpl {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.delete(key);\n return newBaggage;\n }\n\n removeEntries(...keys: string[]): BaggageImpl {\n const newBaggage = new BaggageImpl(this._entries);\n for (const key of keys) {\n newBaggage._entries.delete(key);\n }\n return newBaggage;\n }\n\n clear(): BaggageImpl {\n return new BaggageImpl();\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Symbol used to make BaggageEntryMetadata an opaque type\n */\nexport const baggageEntryMetadataSymbol = Symbol('BaggageEntryMetadata');\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagAPI } from '../api/diag';\nimport { BaggageImpl } from './internal/baggage-impl';\nimport { baggageEntryMetadataSymbol } from './internal/symbol';\nimport { Baggage, BaggageEntry, BaggageEntryMetadata } from './types';\n\nconst diag = DiagAPI.instance();\n\n/**\n * Create a new Baggage with optional entries\n *\n * @param entries An array of baggage entries the new baggage should contain\n */\nexport function createBaggage(\n entries: Record<string, BaggageEntry> = {}\n): Baggage {\n return new BaggageImpl(new Map(Object.entries(entries)));\n}\n\n/**\n * Create a serializable BaggageEntryMetadata object from a string.\n *\n * @param str string metadata. Format is currently not defined by the spec and has no special meaning.\n *\n */\nexport function baggageEntryMetadataFromString(\n str: string\n): BaggageEntryMetadata {\n if (typeof str !== 'string') {\n diag.error(\n `Cannot create baggage metadata from unknown type: ${typeof str}`\n );\n str = '';\n }\n\n return {\n __TYPE__: baggageEntryMetadataSymbol,\n toString() {\n return str;\n },\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from './types';\n\n/** Get a key to uniquely identify a context value */\nexport function createContextKey(description: string) {\n // The specification states that for the same input, multiple calls should\n // return different keys. Due to the nature of the JS dependency management\n // system, this creates problems where multiple versions of some package\n // could hold different keys for the same property.\n //\n // Therefore, we use Symbol.for which returns the same key for the same input.\n return Symbol.for(description);\n}\n\nclass BaseContext implements Context {\n private _currentContext!: Map<symbol, unknown>;\n\n /**\n * Construct a new context which inherits values from an optional parent context.\n *\n * @param parentContext a context from which to inherit values\n */\n constructor(parentContext?: Map<symbol, unknown>) {\n // for minification\n const self = this;\n\n self._currentContext = parentContext ? new Map(parentContext) : new Map();\n\n self.getValue = (key: symbol) => self._currentContext.get(key);\n\n self.setValue = (key: symbol, value: unknown): Context => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.set(key, value);\n return context;\n };\n\n self.deleteValue = (key: symbol): Context => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.delete(key);\n return context;\n };\n }\n\n /**\n * Get a value from the context.\n *\n * @param key key which identifies a context value\n */\n public getValue!: (key: symbol) => unknown;\n\n /**\n * Create a new context which inherits from this context and has\n * the given key set to the given value.\n *\n * @param key context key for which to set the value\n * @param value value to set for the given key\n */\n public setValue!: (key: symbol, value: unknown) => Context;\n\n /**\n * Return a new context which inherits from this context but does\n * not contain a value for the given key.\n *\n * @param key context key for which to clear a value\n */\n public deleteValue!: (key: symbol) => Context;\n}\n\n/** The root context is used as the default parent context when there is no active context */\nexport const ROOT_CONTEXT: Context = new BaseContext();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagLogger, DiagLogFunction } from './types';\n\ntype ConsoleMapKeys = 'error' | 'warn' | 'info' | 'debug' | 'trace';\nconst consoleMap: { n: keyof DiagLogger; c: ConsoleMapKeys }[] = [\n { n: 'error', c: 'error' },\n { n: 'warn', c: 'warn' },\n { n: 'info', c: 'info' },\n { n: 'debug', c: 'debug' },\n { n: 'verbose', c: 'trace' },\n];\n\n/**\n * A simple Immutable Console based diagnostic logger which will output any messages to the Console.\n * If you want to limit the amount of logging to a specific level or lower use the\n * {@link createLogLevelDiagLogger}\n */\nexport class DiagConsoleLogger implements DiagLogger {\n constructor() {\n function _consoleFunc(funcName: ConsoleMapKeys): DiagLogFunction {\n return function (...args) {\n if (console) {\n // Some environments only expose the console when the F12 developer console is open\n // eslint-disable-next-line no-console\n let theFunc = console[funcName];\n if (typeof theFunc !== 'function') {\n // Not all environments support all functions\n // eslint-disable-next-line no-console\n theFunc = console.log;\n }\n\n // One last final check\n if (typeof theFunc === 'function') {\n return theFunc.apply(console, args);\n }\n }\n };\n }\n\n for (let i = 0; i < consoleMap.length; i++) {\n this[consoleMap[i].n] = _consoleFunc(consoleMap[i].c);\n }\n }\n\n /** Log an error scenario that was not expected and caused the requested operation to fail. */\n public error!: DiagLogFunction;\n\n /**\n * Log a warning scenario to inform the developer of an issues that should be investigated.\n * The requested operation may or may not have succeeded or completed.\n */\n public warn!: DiagLogFunction;\n\n /**\n * Log a general informational message, this should not affect functionality.\n * This is also the default logging level so this should NOT be used for logging\n * debugging level information.\n */\n public info!: DiagLogFunction;\n\n /**\n * Log a general debug message that can be useful for identifying a failure.\n * Information logged at this level may include diagnostic details that would\n * help identify a failure scenario. Useful scenarios would be to log the execution\n * order of async operations\n */\n public debug!: DiagLogFunction;\n\n /**\n * Log a detailed (verbose) trace level logging that can be used to identify failures\n * where debug level logging would be insufficient, this level of tracing can include\n * input and output parameters and as such may include PII information passing through\n * the API. As such it is recommended that this level of tracing should not be enabled\n * in a production environment.\n */\n public verbose!: DiagLogFunction;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Meter } from './Meter';\nimport {\n BatchObservableCallback,\n Counter,\n Gauge,\n Histogram,\n MetricAttributes,\n MetricOptions,\n Observable,\n ObservableCallback,\n ObservableCounter,\n ObservableGauge,\n ObservableUpDownCounter,\n UpDownCounter,\n} from './Metric';\n\n/**\n * NoopMeter is a noop implementation of the {@link Meter} interface. It reuses\n * constant NoopMetrics for all of its methods.\n */\nexport class NoopMeter implements Meter {\n constructor() {}\n\n /**\n * @see {@link Meter.createGauge}\n */\n createGauge(_name: string, _options?: MetricOptions): Gauge {\n return NOOP_GAUGE_METRIC;\n }\n\n /**\n * @see {@link Meter.createHistogram}\n */\n createHistogram(_name: string, _options?: MetricOptions): Histogram {\n return NOOP_HISTOGRAM_METRIC;\n }\n\n /**\n * @see {@link Meter.createCounter}\n */\n createCounter(_name: string, _options?: MetricOptions): Counter {\n return NOOP_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.createUpDownCounter}\n */\n createUpDownCounter(_name: string, _options?: MetricOptions): UpDownCounter {\n return NOOP_UP_DOWN_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.createObservableGauge}\n */\n createObservableGauge(\n _name: string,\n _options?: MetricOptions\n ): ObservableGauge {\n return NOOP_OBSERVABLE_GAUGE_METRIC;\n }\n\n /**\n * @see {@link Meter.createObservableCounter}\n */\n createObservableCounter(\n _name: string,\n _options?: MetricOptions\n ): ObservableCounter {\n return NOOP_OBSERVABLE_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.createObservableUpDownCounter}\n */\n createObservableUpDownCounter(\n _name: string,\n _options?: MetricOptions\n ): ObservableUpDownCounter {\n return NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.addBatchObservableCallback}\n */\n addBatchObservableCallback(\n _callback: BatchObservableCallback,\n _observables: Observable[]\n ): void {}\n\n /**\n * @see {@link Meter.removeBatchObservableCallback}\n */\n removeBatchObservableCallback(_callback: BatchObservableCallback): void {}\n}\n\nexport class NoopMetric {}\n\nexport class NoopCounterMetric extends NoopMetric implements Counter {\n add(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopUpDownCounterMetric\n extends NoopMetric\n implements UpDownCounter\n{\n add(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopGaugeMetric extends NoopMetric implements Gauge {\n record(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopHistogramMetric extends NoopMetric implements Histogram {\n record(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopObservableMetric {\n addCallback(_callback: ObservableCallback) {}\n\n removeCallback(_callback: ObservableCallback) {}\n}\n\nexport class NoopObservableCounterMetric\n extends NoopObservableMetric\n implements ObservableCounter {}\n\nexport class NoopObservableGaugeMetric\n extends NoopObservableMetric\n implements ObservableGauge {}\n\nexport class NoopObservableUpDownCounterMetric\n extends NoopObservableMetric\n implements ObservableUpDownCounter {}\n\nexport const NOOP_METER = new NoopMeter();\n\n// Synchronous instruments\nexport const NOOP_COUNTER_METRIC = new NoopCounterMetric();\nexport const NOOP_GAUGE_METRIC = new NoopGaugeMetric();\nexport const NOOP_HISTOGRAM_METRIC = new NoopHistogramMetric();\nexport const NOOP_UP_DOWN_COUNTER_METRIC = new NoopUpDownCounterMetric();\n\n// Asynchronous instruments\nexport const NOOP_OBSERVABLE_COUNTER_METRIC = new NoopObservableCounterMetric();\nexport const NOOP_OBSERVABLE_GAUGE_METRIC = new NoopObservableGaugeMetric();\nexport const NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC =\n new NoopObservableUpDownCounterMetric();\n\n/**\n * Create a no-op Meter\n */\nexport function createNoopMeter(): Meter {\n return NOOP_METER;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Attributes, AttributeValue } from '../common/Attributes';\nimport { Context } from '../context/types';\nimport { BatchObservableResult, ObservableResult } from './ObservableResult';\n\n/**\n * Advisory options influencing aggregation configuration parameters.\n * @experimental\n */\nexport interface MetricAdvice {\n /**\n * Hint the explicit bucket boundaries for SDK if the metric is been\n * aggregated with a HistogramAggregator.\n */\n explicitBucketBoundaries?: number[];\n}\n\n/**\n * Options needed for metric creation\n */\nexport interface MetricOptions {\n /**\n * The description of the Metric.\n * @default ''\n */\n description?: string;\n\n /**\n * The unit of the Metric values.\n * @default ''\n */\n unit?: string;\n\n /**\n * Indicates the type of the recorded value.\n * @default {@link ValueType.DOUBLE}\n */\n valueType?: ValueType;\n\n /**\n * The advice influencing aggregation configuration parameters.\n * @experimental\n */\n advice?: MetricAdvice;\n}\n\n/** The Type of value. It describes how the data is reported. */\nexport enum ValueType {\n INT,\n DOUBLE,\n}\n\n/**\n * Counter is the most common synchronous instrument. This instrument supports\n * an `Add(increment)` function for reporting a sum, and is restricted to\n * non-negative increments. The default aggregation is Sum, as for any additive\n * instrument.\n *\n * Example uses for Counter:\n * <ol>\n * <li> count the number of bytes received. </li>\n * <li> count the number of requests completed. </li>\n * <li> count the number of accounts created. </li>\n * <li> count the number of checkpoints run. </li>\n * <li> count the number of 5xx errors. </li>\n * <ol>\n */\nexport interface Counter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Increment value of counter by the input. Inputs must not be negative.\n */\n add(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\nexport interface UpDownCounter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Increment value of counter by the input. Inputs may be negative.\n */\n add(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\nexport interface Gauge<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Records a measurement.\n */\n record(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\nexport interface Histogram<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Records a measurement. Value of the measurement must not be negative.\n */\n record(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\n/**\n * @deprecated please use {@link Attributes}\n */\nexport type MetricAttributes = Attributes;\n\n/**\n * @deprecated please use {@link AttributeValue}\n */\nexport type MetricAttributeValue = AttributeValue;\n\n/**\n * The observable callback for Observable instruments.\n */\nexport type ObservableCallback<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = (\n observableResult: ObservableResult<AttributesTypes>\n) => void | Promise<void>;\n\n/**\n * The observable callback for a batch of Observable instruments.\n */\nexport type BatchObservableCallback<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = (\n observableResult: BatchObservableResult<AttributesTypes>\n) => void | Promise<void>;\n\nexport interface Observable<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Sets up a function that will be called whenever a metric collection is initiated.\n *\n * If the function is already in the list of callbacks for this Observable, the function is not added a second time.\n */\n addCallback(callback: ObservableCallback<AttributesTypes>): void;\n\n /**\n * Removes a callback previously registered with {@link Observable.addCallback}.\n */\n removeCallback(callback: ObservableCallback<AttributesTypes>): void;\n}\n\nexport type ObservableCounter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = Observable<AttributesTypes>;\nexport type ObservableUpDownCounter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = Observable<AttributesTypes>;\nexport type ObservableGauge<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = Observable<AttributesTypes>;\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\n\n/**\n * Injects `Context` into and extracts it from carriers that travel\n * in-band across process boundaries. Encoding is expected to conform to the\n * HTTP Header Field semantics. Values are often encoded as RPC/HTTP request\n * headers.\n *\n * The carrier of propagated data on both the client (injector) and server\n * (extractor) side is usually an object such as http headers. Propagation is\n * usually implemented via library-specific request interceptors, where the\n * client-side injects values and the server-side extracts them.\n */\nexport interface TextMapPropagator<Carrier = any> {\n /**\n * Injects values from a given `Context` into a carrier.\n *\n * OpenTelemetry defines a common set of format values (TextMapPropagator),\n * and each has an expected `carrier` type.\n *\n * @param context the Context from which to extract values to transmit over\n * the wire.\n * @param carrier the carrier of propagation fields, such as http request\n * headers.\n * @param setter an optional {@link TextMapSetter}. If undefined, values will be\n * set by direct object assignment.\n */\n inject(\n context: Context,\n carrier: Carrier,\n setter: TextMapSetter<Carrier>\n ): void;\n\n /**\n * Given a `Context` and a carrier, extract context values from a\n * carrier and return a new context, created from the old context, with the\n * extracted values.\n *\n * @param context the Context from which to extract values to transmit over\n * the wire.\n * @param carrier the carrier of propagation fields, such as http request\n * headers.\n * @param getter an optional {@link TextMapGetter}. If undefined, keys will be all\n * own properties, and keys will be accessed by direct object access.\n */\n extract(\n context: Context,\n carrier: Carrier,\n getter: TextMapGetter<Carrier>\n ): Context;\n\n /**\n * Return a list of all fields which may be used by the propagator.\n */\n fields(): string[];\n}\n\n/**\n * A setter is specified by the caller to define a specific method\n * to set key/value pairs on the carrier within a propagator.\n */\nexport interface TextMapSetter<Carrier = any> {\n /**\n * Callback used to set a key/value pair on an object.\n *\n * Should be called by the propagator each time a key/value pair\n * should be set, and should set that key/value pair on the propagator.\n *\n * @param carrier object or class which carries key/value pairs\n * @param key string key to modify\n * @param value value to be set to the key on the carrier\n */\n set(carrier: Carrier, key: string, value: string): void;\n}\n\n/**\n * A getter is specified by the caller to define a specific method\n * to get the value of a key from a carrier.\n */\nexport interface TextMapGetter<Carrier = any> {\n /**\n * Get a list of all keys available on the carrier.\n *\n * @param carrier\n */\n keys(carrier: Carrier): string[];\n\n /**\n * Get the value of a specific key from the carrier.\n *\n * @param carrier\n * @param key\n */\n get(carrier: Carrier, key: string): undefined | string | string[];\n}\n\nexport const defaultTextMapGetter: TextMapGetter = {\n get(carrier, key) {\n if (carrier == null) {\n return undefined;\n }\n return carrier[key];\n },\n\n keys(carrier) {\n if (carrier == null) {\n return [];\n }\n return Object.keys(carrier);\n },\n};\n\nexport const defaultTextMapSetter: TextMapSetter = {\n set(carrier, key, value) {\n if (carrier == null) {\n return;\n }\n\n carrier[key] = value;\n },\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ROOT_CONTEXT } from './context';\nimport * as types from './types';\n\nexport class NoopContextManager implements types.ContextManager {\n active(): types.Context {\n return ROOT_CONTEXT;\n }\n\n with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n _context: types.Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n return fn.call(thisArg, ...args);\n }\n\n bind<T>(_context: types.Context, target: T): T {\n return target;\n }\n\n enable(): this {\n return this;\n }\n\n disable(): this {\n return this;\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NoopContextManager } from '../context/NoopContextManager';\nimport { Context, ContextManager } from '../context/types';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'context';\nconst NOOP_CONTEXT_MANAGER = new NoopContextManager();\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Context API\n */\nexport class ContextAPI {\n private static _instance?: ContextAPI;\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Context API */\n public static getInstance(): ContextAPI {\n if (!this._instance) {\n this._instance = new ContextAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current context manager.\n *\n * @returns true if the context manager was successfully registered, else false\n */\n public setGlobalContextManager(contextManager: ContextManager): boolean {\n return registerGlobal(API_NAME, contextManager, DiagAPI.instance());\n }\n\n /**\n * Get the currently active context\n */\n public active(): Context {\n return this._getContextManager().active();\n }\n\n /**\n * Execute a function with an active context\n *\n * @param context context to be active during function execution\n * @param fn function to execute in a context\n * @param thisArg optional receiver to be used for calling fn\n * @param args optional arguments forwarded to fn\n */\n public with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n return this._getContextManager().with(context, fn, thisArg, ...args);\n }\n\n /**\n * Bind a context to a target function or event emitter\n *\n * @param context context to bind to the event emitter or function. Defaults to the currently active context\n * @param target function or event emitter to bind\n */\n public bind<T>(context: Context, target: T): T {\n return this._getContextManager().bind(context, target);\n }\n\n private _getContextManager(): ContextManager {\n return getGlobal(API_NAME) || NOOP_CONTEXT_MANAGER;\n }\n\n /** Disable and remove the global context manager */\n public disable() {\n this._getContextManager().disable();\n unregisterGlobal(API_NAME, DiagAPI.instance());\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport enum TraceFlags {\n /** Represents no flag set. */\n NONE = 0x0,\n /** Bit to represent whether trace is sampled in trace flags. */\n SAMPLED = 0x1 << 0,\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SpanContext } from './span_context';\nimport { TraceFlags } from './trace_flags';\n\nexport const INVALID_SPANID = '0000000000000000';\nexport const INVALID_TRACEID = '00000000000000000000000000000000';\nexport const INVALID_SPAN_CONTEXT: SpanContext = {\n traceId: INVALID_TRACEID,\n spanId: INVALID_SPANID,\n traceFlags: TraceFlags.NONE,\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Exception } from '../common/Exception';\nimport { TimeInput } from '../common/Time';\nimport { SpanAttributes } from './attributes';\nimport { INVALID_SPAN_CONTEXT } from './invalid-span-constants';\nimport { Span } from './span';\nimport { SpanContext } from './span_context';\nimport { SpanStatus } from './status';\nimport { Link } from './link';\n\n/**\n * The NonRecordingSpan is the default {@link Span} that is used when no Span\n * implementation is available. All operations are no-op including context\n * propagation.\n */\nexport class NonRecordingSpan implements Span {\n constructor(\n private readonly _spanContext: SpanContext = INVALID_SPAN_CONTEXT\n ) {}\n\n // Returns a SpanContext.\n spanContext(): SpanContext {\n return this._spanContext;\n }\n\n // By default does nothing\n setAttribute(_key: string, _value: unknown): this {\n return this;\n }\n\n // By default does nothing\n setAttributes(_attributes: SpanAttributes): this {\n return this;\n }\n\n // By default does nothing\n addEvent(_name: string, _attributes?: SpanAttributes): this {\n return this;\n }\n\n addLink(_link: Link): this {\n return this;\n }\n\n addLinks(_links: Link[]): this {\n return this;\n }\n\n // By default does nothing\n setStatus(_status: SpanStatus): this {\n return this;\n }\n\n // By default does nothing\n updateName(_name: string): this {\n return this;\n }\n\n // By default does nothing\n end(_endTime?: TimeInput): void {}\n\n // isRecording always returns false for NonRecordingSpan.\n isRecording(): boolean {\n return false;\n }\n\n // By default does nothing\n recordException(_exception: Exception, _time?: TimeInput): void {}\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createContextKey } from '../context/context';\nimport { Context } from '../context/types';\nimport { Span } from './span';\nimport { SpanContext } from './span_context';\nimport { NonRecordingSpan } from './NonRecordingSpan';\nimport { ContextAPI } from '../api/context';\n\n/**\n * span key\n */\nconst SPAN_KEY = createContextKey('OpenTelemetry Context Key SPAN');\n\n/**\n * Return the span if one exists\n *\n * @param context context to get span from\n */\nexport function getSpan(context: Context): Span | undefined {\n return (context.getValue(SPAN_KEY) as Span) || undefined;\n}\n\n/**\n * Gets the span from the current context, if one exists.\n */\nexport function getActiveSpan(): Span | undefined {\n return getSpan(ContextAPI.getInstance().active());\n}\n\n/**\n * Set the span on a context\n *\n * @param context context to use as parent\n * @param span span to set active\n */\nexport function setSpan(context: Context, span: Span): Context {\n return context.setValue(SPAN_KEY, span);\n}\n\n/**\n * Remove current span stored in the context\n *\n * @param context context to delete span from\n */\nexport function deleteSpan(context: Context): Context {\n return context.deleteValue(SPAN_KEY);\n}\n\n/**\n * Wrap span context in a NoopSpan and set as span in a new\n * context\n *\n * @param context context to set active span on\n * @param spanContext span context to be wrapped\n */\nexport function setSpanContext(\n context: Context,\n spanContext: SpanContext\n): Context {\n return setSpan(context, new NonRecordingSpan(spanContext));\n}\n\n/**\n * Get the span context of the span if it exists.\n *\n * @param context context to get values from\n */\nexport function getSpanContext(context: Context): SpanContext | undefined {\n return getSpan(context)?.spanContext();\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { INVALID_SPANID, INVALID_TRACEID } from './invalid-span-constants';\nimport { NonRecordingSpan } from './NonRecordingSpan';\nimport { Span } from './span';\nimport { SpanContext } from './span_context';\n\nconst VALID_TRACEID_REGEX = /^([0-9a-f]{32})$/i;\nconst VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i;\n\nexport function isValidTraceId(traceId: string): boolean {\n return VALID_TRACEID_REGEX.test(traceId) && traceId !== INVALID_TRACEID;\n}\n\nexport function isValidSpanId(spanId: string): boolean {\n return VALID_SPANID_REGEX.test(spanId) && spanId !== INVALID_SPANID;\n}\n\n/**\n * Returns true if this {@link SpanContext} is valid.\n * @return true if this {@link SpanContext} is valid.\n */\nexport function isSpanContextValid(spanContext: SpanContext): boolean {\n return (\n isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId)\n );\n}\n\n/**\n * Wrap the given {@link SpanContext} in a new non-recording {@link Span}\n *\n * @param spanContext span context to be wrapped\n * @returns a new non-recording {@link Span} with the provided context\n */\nexport function wrapSpanContext(spanContext: SpanContext): Span {\n return new NonRecordingSpan(spanContext);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ContextAPI } from '../api/context';\nimport { Context } from '../context/types';\nimport { getSpanContext, setSpan } from '../trace/context-utils';\nimport { NonRecordingSpan } from './NonRecordingSpan';\nimport { Span } from './span';\nimport { isSpanContextValid } from './spancontext-utils';\nimport { SpanOptions } from './SpanOptions';\nimport { SpanContext } from './span_context';\nimport { Tracer } from './tracer';\n\nconst contextApi = ContextAPI.getInstance();\n\n/**\n * No-op implementations of {@link Tracer}.\n */\nexport class NoopTracer implements Tracer {\n // startSpan starts a noop span.\n startSpan(\n name: string,\n options?: SpanOptions,\n context = contextApi.active()\n ): Span {\n const root = Boolean(options?.root);\n if (root) {\n return new NonRecordingSpan();\n }\n\n const parentFromContext = context && getSpanContext(context);\n\n if (\n isSpanContext(parentFromContext) &&\n isSpanContextValid(parentFromContext)\n ) {\n return new NonRecordingSpan(parentFromContext);\n } else {\n return new NonRecordingSpan();\n }\n }\n\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n fn: F\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n opts: SpanOptions | undefined,\n fn: F\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n opts: SpanOptions | undefined,\n ctx: Context | undefined,\n fn: F\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n arg2?: F | SpanOptions,\n arg3?: F | Context,\n arg4?: F\n ): ReturnType<F> | undefined {\n let opts: SpanOptions | undefined;\n let ctx: Context | undefined;\n let fn: F;\n\n if (arguments.length < 2) {\n return;\n } else if (arguments.length === 2) {\n fn = arg2 as F;\n } else if (arguments.length === 3) {\n opts = arg2 as SpanOptions | undefined;\n fn = arg3 as F;\n } else {\n opts = arg2 as SpanOptions | undefined;\n ctx = arg3 as Context | undefined;\n fn = arg4 as F;\n }\n\n const parentContext = ctx ?? contextApi.active();\n const span = this.startSpan(name, opts, parentContext);\n const contextWithSpanSet = setSpan(parentContext, span);\n\n return contextApi.with(contextWithSpanSet, fn, undefined, span);\n }\n}\n\nfunction isSpanContext(spanContext: any): spanContext is SpanContext {\n return (\n typeof spanContext === 'object' &&\n typeof spanContext['spanId'] === 'string' &&\n typeof spanContext['traceId'] === 'string' &&\n typeof spanContext['traceFlags'] === 'number'\n );\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\nimport { NoopTracer } from './NoopTracer';\nimport { Span } from './span';\nimport { SpanOptions } from './SpanOptions';\nimport { Tracer } from './tracer';\nimport { TracerOptions } from './tracer_options';\n\nconst NOOP_TRACER = new NoopTracer();\n\n/**\n * Proxy tracer provided by the proxy tracer provider\n */\nexport class ProxyTracer implements Tracer {\n // When a real implementation is provided, this will be it\n private _delegate?: Tracer;\n\n constructor(\n private _provider: TracerDelegator,\n public readonly name: string,\n public readonly version?: string,\n public readonly options?: TracerOptions\n ) {}\n\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n return this._getTracer().startSpan(name, options, context);\n }\n\n startActiveSpan<F extends (span: Span) => unknown>(\n _name: string,\n _options: F | SpanOptions,\n _context?: F | Context,\n _fn?: F\n ): ReturnType<F> {\n const tracer = this._getTracer();\n return Reflect.apply(tracer.startActiveSpan, tracer, arguments);\n }\n\n /**\n * Try to get a tracer from the proxy tracer provider.\n * If the proxy tracer provider has no delegate, return a noop tracer.\n */\n private _getTracer() {\n if (this._delegate) {\n return this._delegate;\n }\n\n const tracer = this._provider.getDelegateTracer(\n this.name,\n this.version,\n this.options\n );\n\n if (!tracer) {\n return NOOP_TRACER;\n }\n\n this._delegate = tracer;\n return this._delegate;\n }\n}\n\nexport interface TracerDelegator {\n getDelegateTracer(\n name: string,\n version?: string,\n options?: TracerOptions\n ): Tracer | undefined;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NoopTracer } from './NoopTracer';\nimport { Tracer } from './tracer';\nimport { TracerOptions } from './tracer_options';\nimport { TracerProvider } from './tracer_provider';\n\n/**\n * An implementation of the {@link TracerProvider} which returns an impotent\n * Tracer for all calls to `getTracer`.\n *\n * All operations are no-op.\n */\nexport class NoopTracerProvider implements TracerProvider {\n getTracer(\n _name?: string,\n _version?: string,\n _options?: TracerOptions\n ): Tracer {\n return new NoopTracer();\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Tracer } from './tracer';\nimport { TracerProvider } from './tracer_provider';\nimport { ProxyTracer } from './ProxyTracer';\nimport { NoopTracerProvider } from './NoopTracerProvider';\nimport { TracerOptions } from './tracer_options';\n\nconst NOOP_TRACER_PROVIDER = new NoopTracerProvider();\n\n/**\n * Tracer provider which provides {@link ProxyTracer}s.\n *\n * Before a delegate is set, tracers provided are NoOp.\n * When a delegate is set, traces are provided from the delegate.\n * When a delegate is set after tracers have already been provided,\n * all tracers already provided will use the provided delegate implementation.\n */\nexport class ProxyTracerProvider implements TracerProvider {\n private _delegate?: TracerProvider;\n\n /**\n * Get a {@link ProxyTracer}\n */\n getTracer(name: string, version?: string, options?: TracerOptions): Tracer {\n return (\n this.getDelegateTracer(name, version, options) ??\n new ProxyTracer(this, name, version, options)\n );\n }\n\n getDelegate(): TracerProvider {\n return this._delegate ?? NOOP_TRACER_PROVIDER;\n }\n\n /**\n * Set the delegate tracer provider\n */\n setDelegate(delegate: TracerProvider) {\n this._delegate = delegate;\n }\n\n getDelegateTracer(\n name: string,\n version?: string,\n options?: TracerOptions\n ): Tracer | undefined {\n return this._delegate?.getTracer(name, version, options);\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SpanAttributes } from './attributes';\nimport { TraceState } from './trace_state';\n\n/**\n * @deprecated use the one declared in @opentelemetry/sdk-trace-base instead.\n * A sampling decision that determines how a {@link Span} will be recorded\n * and collected.\n */\nexport enum SamplingDecision {\n /**\n * `Span.isRecording() === false`, span will not be recorded and all events\n * and attributes will be dropped.\n */\n NOT_RECORD,\n /**\n * `Span.isRecording() === true`, but `Sampled` flag in {@link TraceFlags}\n * MUST NOT be set.\n */\n RECORD,\n /**\n * `Span.isRecording() === true` AND `Sampled` flag in {@link TraceFlags}\n * MUST be set.\n */\n RECORD_AND_SAMPLED,\n}\n\n/**\n * @deprecated use the one declared in @opentelemetry/sdk-trace-base instead.\n * A sampling result contains a decision for a {@link Span} and additional\n * attributes the sampler would like to added to the Span.\n */\nexport interface SamplingResult {\n /**\n * A sampling decision, refer to {@link SamplingDecision} for details.\n */\n decision: SamplingDecision;\n /**\n * The list of attributes returned by SamplingResult MUST be immutable.\n * Caller may call {@link Sampler}.shouldSample any number of times and\n * can safely cache the returned value.\n */\n attributes?: Readonly<SpanAttributes>;\n /**\n * A {@link TraceState} that will be associated with the {@link Span} through\n * the new {@link SpanContext}. Samplers SHOULD return the TraceState from\n * the passed-in {@link Context} if they do not intend to change it. Leaving\n * the value undefined will also leave the TraceState unchanged.\n */\n traceState?: TraceState;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport enum SpanKind {\n /** Default value. Indicates that the span is used internally. */\n INTERNAL = 0,\n\n /**\n * Indicates that the span covers server-side handling of an RPC or other\n * remote request.\n */\n SERVER = 1,\n\n /**\n * Indicates that the span covers the client-side wrapper around an RPC or\n * other remote request.\n */\n CLIENT = 2,\n\n /**\n * Indicates that the span describes producer sending a message to a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n PRODUCER = 3,\n\n /**\n * Indicates that the span describes consumer receiving a message from a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n CONSUMER = 4,\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport interface SpanStatus {\n /** The status code of this message. */\n code: SpanStatusCode;\n /** A developer-facing error message. */\n message?: string;\n}\n\n/**\n * An enumeration of status codes.\n */\nexport enum SpanStatusCode {\n /**\n * The default status.\n */\n UNSET = 0,\n /**\n * The operation has been validated by an Application developer or\n * Operator to have completed successfully.\n */\n OK = 1,\n /**\n * The operation contains an error.\n */\n ERROR = 2,\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst VALID_KEY_CHAR_RANGE = '[_0-9a-z-*/]';\nconst VALID_KEY = `[a-z]${VALID_KEY_CHAR_RANGE}{0,255}`;\nconst VALID_VENDOR_KEY = `[a-z0-9]${VALID_KEY_CHAR_RANGE}{0,240}@[a-z]${VALID_KEY_CHAR_RANGE}{0,13}`;\nconst VALID_KEY_REGEX = new RegExp(`^(?:${VALID_KEY}|${VALID_VENDOR_KEY})$`);\nconst VALID_VALUE_BASE_REGEX = /^[ -~]{0,255}[!-~]$/;\nconst INVALID_VALUE_COMMA_EQUAL_REGEX = /,|=/;\n\n/**\n * Key is opaque string up to 256 characters printable. It MUST begin with a\n * lowercase letter, and can only contain lowercase letters a-z, digits 0-9,\n * underscores _, dashes -, asterisks *, and forward slashes /.\n * For multi-tenant vendor scenarios, an at sign (@) can be used to prefix the\n * vendor name. Vendors SHOULD set the tenant ID at the beginning of the key.\n * see https://www.w3.org/TR/trace-context/#key\n */\nexport function validateKey(key: string): boolean {\n return VALID_KEY_REGEX.test(key);\n}\n\n/**\n * Value is opaque string up to 256 characters printable ASCII RFC0020\n * characters (i.e., the range 0x20 to 0x7E) except comma , and =.\n */\nexport function validateValue(value: string): boolean {\n return (\n VALID_VALUE_BASE_REGEX.test(value) &&\n !INVALID_VALUE_COMMA_EQUAL_REGEX.test(value)\n );\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TraceState } from '../trace_state';\nimport { validateKey, validateValue } from './tracestate-validators';\n\nconst MAX_TRACE_STATE_ITEMS = 32;\nconst MAX_TRACE_STATE_LEN = 512;\nconst LIST_MEMBERS_SEPARATOR = ',';\nconst LIST_MEMBER_KEY_VALUE_SPLITTER = '=';\n\n/**\n * TraceState must be a class and not a simple object type because of the spec\n * requirement (https://www.w3.org/TR/trace-context/#tracestate-field).\n *\n * Here is the list of allowed mutations:\n * - New key-value pair should be added into the beginning of the list\n * - The value of any key can be updated. Modified keys MUST be moved to the\n * beginning of the list.\n */\nexport class TraceStateImpl implements TraceState {\n private _internalState: Map<string, string> = new Map();\n\n constructor(rawTraceState?: string) {\n if (rawTraceState) this._parse(rawTraceState);\n }\n\n set(key: string, value: string): TraceStateImpl {\n // TODO: Benchmark the different approaches(map vs list) and\n // use the faster one.\n const traceState = this._clone();\n if (traceState._internalState.has(key)) {\n traceState._internalState.delete(key);\n }\n traceState._internalState.set(key, value);\n return traceState;\n }\n\n unset(key: string): TraceStateImpl {\n const traceState = this._clone();\n traceState._internalState.delete(key);\n return traceState;\n }\n\n get(key: string): string | undefined {\n return this._internalState.get(key);\n }\n\n serialize(): string {\n return this._keys()\n .reduce((agg: string[], key) => {\n agg.push(key + LIST_MEMBER_KEY_VALUE_SPLITTER + this.get(key));\n return agg;\n }, [])\n .join(LIST_MEMBERS_SEPARATOR);\n }\n\n private _parse(rawTraceState: string) {\n if (rawTraceState.length > MAX_TRACE_STATE_LEN) return;\n this._internalState = rawTraceState\n .split(LIST_MEMBERS_SEPARATOR)\n .reverse() // Store in reverse so new keys (.set(...)) will be placed at the beginning\n .reduce((agg: Map<string, string>, part: string) => {\n const listMember = part.trim(); // Optional Whitespace (OWS) handling\n const i = listMember.indexOf(LIST_MEMBER_KEY_VALUE_SPLITTER);\n if (i !== -1) {\n const key = listMember.slice(0, i);\n const value = listMember.slice(i + 1, part.length);\n if (validateKey(key) && validateValue(value)) {\n agg.set(key, value);\n } else {\n // TODO: Consider to add warning log\n }\n }\n return agg;\n }, new Map());\n\n // Because of the reverse() requirement, trunc must be done after map is created\n if (this._internalState.size > MAX_TRACE_STATE_ITEMS) {\n this._internalState = new Map(\n Array.from(this._internalState.entries())\n .reverse() // Use reverse same as original tracestate parse chain\n .slice(0, MAX_TRACE_STATE_ITEMS)\n );\n }\n }\n\n private _keys(): string[] {\n return Array.from(this._internalState.keys()).reverse();\n }\n\n private _clone(): TraceStateImpl {\n const traceState = new TraceStateImpl();\n traceState._internalState = new Map(this._internalState);\n return traceState;\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TraceState } from '../trace_state';\nimport { TraceStateImpl } from './tracestate-impl';\n\nexport function createTraceState(rawTraceState?: string): TraceState {\n return new TraceStateImpl(rawTraceState);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { ContextAPI } from './api/context';\n/** Entrypoint for context API */\nexport const context = ContextAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { DiagAPI } from './api/diag';\n/**\n * Entrypoint for Diag API.\n * Defines Diagnostic handler used for internal diagnostic logging operations.\n * The default provides a Noop DiagLogger implementation which may be changed via the\n * diag.setLogger(logger: DiagLogger) function.\n */\nexport const diag = DiagAPI.instance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Meter, MeterOptions } from './Meter';\nimport { MeterProvider } from './MeterProvider';\nimport { NOOP_METER } from './NoopMeter';\n\n/**\n * An implementation of the {@link MeterProvider} which returns an impotent Meter\n * for all calls to `getMeter`\n */\nexport class NoopMeterProvider implements MeterProvider {\n getMeter(_name: string, _version?: string, _options?: MeterOptions): Meter {\n return NOOP_METER;\n }\n}\n\nexport const NOOP_METER_PROVIDER = new NoopMeterProvider();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Meter, MeterOptions } from '../metrics/Meter';\nimport { MeterProvider } from '../metrics/MeterProvider';\nimport { NOOP_METER_PROVIDER } from '../metrics/NoopMeterProvider';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'metrics';\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Metrics API\n */\nexport class MetricsAPI {\n private static _instance?: MetricsAPI;\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Metrics API */\n public static getInstance(): MetricsAPI {\n if (!this._instance) {\n this._instance = new MetricsAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current global meter provider.\n * Returns true if the meter provider was successfully registered, else false.\n */\n public setGlobalMeterProvider(provider: MeterProvider): boolean {\n return registerGlobal(API_NAME, provider, DiagAPI.instance());\n }\n\n /**\n * Returns the global meter provider.\n */\n public getMeterProvider(): MeterProvider {\n return getGlobal(API_NAME) || NOOP_METER_PROVIDER;\n }\n\n /**\n * Returns a meter from the global meter provider.\n */\n public getMeter(\n name: string,\n version?: string,\n options?: MeterOptions\n ): Meter {\n return this.getMeterProvider().getMeter(name, version, options);\n }\n\n /** Remove the global meter provider */\n public disable(): void {\n unregisterGlobal(API_NAME, DiagAPI.instance());\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { MetricsAPI } from './api/metrics';\n/** Entrypoint for metrics API */\nexport const metrics = MetricsAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\nimport { TextMapPropagator } from './TextMapPropagator';\n\n/**\n * No-op implementations of {@link TextMapPropagator}.\n */\nexport class NoopTextMapPropagator implements TextMapPropagator {\n /** Noop inject function does nothing */\n inject(_context: Context, _carrier: unknown): void {}\n /** Noop extract function does nothing and returns the input context */\n extract(context: Context, _carrier: unknown): Context {\n return context;\n }\n fields(): string[] {\n return [];\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ContextAPI } from '../api/context';\nimport { createContextKey } from '../context/context';\nimport { Context } from '../context/types';\nimport { Baggage } from './types';\n\n/**\n * Baggage key\n */\nconst BAGGAGE_KEY = createContextKey('OpenTelemetry Baggage Key');\n\n/**\n * Retrieve the current baggage from the given context\n *\n * @param {Context} Context that manage all context values\n * @returns {Baggage} Extracted baggage from the context\n */\nexport function getBaggage(context: Context): Baggage | undefined {\n return (context.getValue(BAGGAGE_KEY) as Baggage) || undefined;\n}\n\n/**\n * Retrieve the current baggage from the active/current context\n *\n * @returns {Baggage} Extracted baggage from the context\n */\nexport function getActiveBaggage(): Baggage | undefined {\n return getBaggage(ContextAPI.getInstance().active());\n}\n\n/**\n * Store a baggage in the given context\n *\n * @param {Context} Context that manage all context values\n * @param {Baggage} baggage that will be set in the actual context\n */\nexport function setBaggage(context: Context, baggage: Baggage): Context {\n return context.setValue(BAGGAGE_KEY, baggage);\n}\n\n/**\n * Delete the baggage stored in the given context\n *\n * @param {Context} Context that manage all context values\n */\nexport function deleteBaggage(context: Context): Context {\n return context.deleteValue(BAGGAGE_KEY);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { NoopTextMapPropagator } from '../propagation/NoopTextMapPropagator';\nimport {\n defaultTextMapGetter,\n defaultTextMapSetter,\n TextMapGetter,\n TextMapPropagator,\n TextMapSetter,\n} from '../propagation/TextMapPropagator';\nimport {\n getBaggage,\n getActiveBaggage,\n setBaggage,\n deleteBaggage,\n} from '../baggage/context-helpers';\nimport { createBaggage } from '../baggage/utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'propagation';\nconst NOOP_TEXT_MAP_PROPAGATOR = new NoopTextMapPropagator();\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Propagation API\n */\nexport class PropagationAPI {\n private static _instance?: PropagationAPI;\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Propagator API */\n public static getInstance(): PropagationAPI {\n if (!this._instance) {\n this._instance = new PropagationAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current propagator.\n *\n * @returns true if the propagator was successfully registered, else false\n */\n public setGlobalPropagator(propagator: TextMapPropagator): boolean {\n return registerGlobal(API_NAME, propagator, DiagAPI.instance());\n }\n\n /**\n * Inject context into a carrier to be propagated inter-process\n *\n * @param context Context carrying tracing data to inject\n * @param carrier carrier to inject context into\n * @param setter Function used to set values on the carrier\n */\n public inject<Carrier>(\n context: Context,\n carrier: Carrier,\n setter: TextMapSetter<Carrier> = defaultTextMapSetter\n ): void {\n return this._getGlobalPropagator().inject(context, carrier, setter);\n }\n\n /**\n * Extract context from a carrier\n *\n * @param context Context which the newly created context will inherit from\n * @param carrier Carrier to extract context from\n * @param getter Function used to extract keys from a carrier\n */\n public extract<Carrier>(\n context: Context,\n carrier: Carrier,\n getter: TextMapGetter<Carrier> = defaultTextMapGetter\n ): Context {\n return this._getGlobalPropagator().extract(context, carrier, getter);\n }\n\n /**\n * Return a list of all fields which may be used by the propagator.\n */\n public fields(): string[] {\n return this._getGlobalPropagator().fields();\n }\n\n /** Remove the global propagator */\n public disable() {\n unregisterGlobal(API_NAME, DiagAPI.instance());\n }\n\n public createBaggage = createBaggage;\n\n public getBaggage = getBaggage;\n\n public getActiveBaggage = getActiveBaggage;\n\n public setBaggage = setBaggage;\n\n public deleteBaggage = deleteBaggage;\n\n private _getGlobalPropagator(): TextMapPropagator {\n return getGlobal(API_NAME) || NOOP_TEXT_MAP_PROPAGATOR;\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { PropagationAPI } from './api/propagation';\n/** Entrypoint for propagation API */\nexport const propagation = PropagationAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { ProxyTracerProvider } from '../trace/ProxyTracerProvider';\nimport {\n isSpanContextValid,\n wrapSpanContext,\n} from '../trace/spancontext-utils';\nimport { Tracer } from '../trace/tracer';\nimport { TracerProvider } from '../trace/tracer_provider';\nimport {\n deleteSpan,\n getActiveSpan,\n getSpan,\n getSpanContext,\n setSpan,\n setSpanContext,\n} from '../trace/context-utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'trace';\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Tracing API\n */\nexport class TraceAPI {\n private static _instance?: TraceAPI;\n\n private _proxyTracerProvider = new ProxyTracerProvider();\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Trace API */\n public static getInstance(): TraceAPI {\n if (!this._instance) {\n this._instance = new TraceAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current global tracer.\n *\n * @returns true if the tracer provider was successfully registered, else false\n */\n public setGlobalTracerProvider(provider: TracerProvider): boolean {\n const success = registerGlobal(\n API_NAME,\n this._proxyTracerProvider,\n DiagAPI.instance()\n );\n if (success) {\n this._proxyTracerProvider.setDelegate(provider);\n }\n return success;\n }\n\n /**\n * Returns the global tracer provider.\n */\n public getTracerProvider(): TracerProvider {\n return getGlobal(API_NAME) || this._proxyTracerProvider;\n }\n\n /**\n * Returns a tracer from the global tracer provider.\n */\n public getTracer(name: string, version?: string): Tracer {\n return this.getTracerProvider().getTracer(name, version);\n }\n\n /** Remove the global tracer provider */\n public disable() {\n unregisterGlobal(API_NAME, DiagAPI.instance());\n this._proxyTracerProvider = new ProxyTracerProvider();\n }\n\n public wrapSpanContext = wrapSpanContext;\n\n public isSpanContextValid = isSpanContextValid;\n\n public deleteSpan = deleteSpan;\n\n public getSpan = getSpan;\n\n public getActiveSpan = getActiveSpan;\n\n public getSpanContext = getSpanContext;\n\n public setSpan = setSpan;\n\n public setSpanContext = setSpanContext;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { TraceAPI } from './api/trace';\n/** Entrypoint for trace API */\nexport const trace = TraceAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { BaggageEntry, BaggageEntryMetadata, Baggage } from './baggage/types';\nexport { baggageEntryMetadataFromString } from './baggage/utils';\nexport { Exception } from './common/Exception';\nexport { HrTime, TimeInput } from './common/Time';\nexport { Attributes, AttributeValue } from './common/Attributes';\n\n// Context APIs\nexport { createContextKey, ROOT_CONTEXT } from './context/context';\nexport { Context, ContextManager } from './context/types';\nexport type { ContextAPI } from './api/context';\n\n// Diag APIs\nexport { DiagConsoleLogger } from './diag/consoleLogger';\nexport {\n DiagLogFunction,\n DiagLogger,\n DiagLogLevel,\n ComponentLoggerOptions,\n DiagLoggerOptions,\n} from './diag/types';\nexport type { DiagAPI } from './api/diag';\n\n// Metrics APIs\nexport { createNoopMeter } from './metrics/NoopMeter';\nexport { MeterOptions, Meter } from './metrics/Meter';\nexport { MeterProvider } from './metrics/MeterProvider';\nexport {\n ValueType,\n Counter,\n Gauge,\n Histogram,\n MetricOptions,\n Observable,\n ObservableCounter,\n ObservableGauge,\n ObservableUpDownCounter,\n UpDownCounter,\n BatchObservableCallback,\n MetricAdvice,\n MetricAttributes,\n MetricAttributeValue,\n ObservableCallback,\n} from './metrics/Metric';\nexport {\n BatchObservableResult,\n ObservableResult,\n} from './metrics/ObservableResult';\nexport type { MetricsAPI } from './api/metrics';\n\n// Propagation APIs\nexport {\n TextMapPropagator,\n TextMapSetter,\n TextMapGetter,\n defaultTextMapGetter,\n defaultTextMapSetter,\n} from './propagation/TextMapPropagator';\nexport type { PropagationAPI } from './api/propagation';\n\n// Trace APIs\nexport { SpanAttributes, SpanAttributeValue } from './trace/attributes';\nexport { Link } from './trace/link';\nexport { ProxyTracer, TracerDelegator } from './trace/ProxyTracer';\nexport { ProxyTracerProvider } from './trace/ProxyTracerProvider';\nexport { Sampler } from './trace/Sampler';\nexport { SamplingDecision, SamplingResult } from './trace/SamplingResult';\nexport { SpanContext } from './trace/span_context';\nexport { SpanKind } from './trace/span_kind';\nexport { Span } from './trace/span';\nexport { SpanOptions } from './trace/SpanOptions';\nexport { SpanStatus, SpanStatusCode } from './trace/status';\nexport { TraceFlags } from './trace/trace_flags';\nexport { TraceState } from './trace/trace_state';\nexport { createTraceState } from './trace/internal/utils';\nexport { TracerProvider } from './trace/tracer_provider';\nexport { Tracer } from './trace/tracer';\nexport { TracerOptions } from './trace/tracer_options';\nexport {\n isSpanContextValid,\n isValidTraceId,\n isValidSpanId,\n} from './trace/spancontext-utils';\nexport {\n INVALID_SPANID,\n INVALID_TRACEID,\n INVALID_SPAN_CONTEXT,\n} from './trace/invalid-span-constants';\nexport type { TraceAPI } from './api/trace';\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { context } from './context-api';\nimport { diag } from './diag-api';\nimport { metrics } from './metrics-api';\nimport { propagation } from './propagation-api';\nimport { trace } from './trace-api';\n\n// Named export.\nexport { context, diag, metrics, propagation, trace };\n// Default export.\nexport default {\n context,\n diag,\n metrics,\n propagation,\n trace,\n};\n","'use strict';\n\nconst OtelApi = require('@opentelemetry/api');\nconst Counter = require('../counter');\n\nconst PROCESS_CPU_USER_SECONDS = 'process_cpu_user_seconds_total';\nconst PROCESS_CPU_SYSTEM_SECONDS = 'process_cpu_system_seconds_total';\nconst PROCESS_CPU_SECONDS = 'process_cpu_seconds_total';\n\nmodule.exports = (registry, config = {}) => {\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst exemplars = config.enableExemplars ? config.enableExemplars : false;\n\tconst labelNames = Object.keys(labels);\n\n\tlet lastCpuUsage = process.cpuUsage();\n\n\tconst cpuUserUsageCounter = new Counter({\n\t\tname: namePrefix + PROCESS_CPU_USER_SECONDS,\n\t\thelp: 'Total user CPU time spent in seconds.',\n\t\tenableExemplars: exemplars,\n\t\tregisters,\n\t\tlabelNames,\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect() {\n\t\t\tconst cpuUsage = process.cpuUsage();\n\n\t\t\tconst userUsageMicros = cpuUsage.user - lastCpuUsage.user;\n\t\t\tconst systemUsageMicros = cpuUsage.system - lastCpuUsage.system;\n\n\t\t\tlastCpuUsage = cpuUsage;\n\n\t\t\tif (this.enableExemplars) {\n\t\t\t\tlet exemplarLabels = {};\n\t\t\t\tconst currentSpan = OtelApi.trace.getSpan(OtelApi.context.active());\n\t\t\t\tif (currentSpan) {\n\t\t\t\t\texemplarLabels = {\n\t\t\t\t\t\ttraceId: currentSpan.spanContext().traceId,\n\t\t\t\t\t\tspanId: currentSpan.spanContext().spanId,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcpuUserUsageCounter.inc({\n\t\t\t\t\tlabels,\n\t\t\t\t\tvalue: userUsageMicros / 1e6,\n\t\t\t\t\texemplarLabels,\n\t\t\t\t});\n\t\t\t\tcpuSystemUsageCounter.inc({\n\t\t\t\t\tlabels,\n\t\t\t\t\tvalue: systemUsageMicros / 1e6,\n\t\t\t\t\texemplarLabels,\n\t\t\t\t});\n\t\t\t\tcpuUsageCounter.inc({\n\t\t\t\t\tlabels,\n\t\t\t\t\tvalue: (userUsageMicros + systemUsageMicros) / 1e6,\n\t\t\t\t\texemplarLabels,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tcpuUserUsageCounter.inc(labels, userUsageMicros / 1e6);\n\t\t\t\tcpuSystemUsageCounter.inc(labels, systemUsageMicros / 1e6);\n\t\t\t\tcpuUsageCounter.inc(\n\t\t\t\t\tlabels,\n\t\t\t\t\t(userUsageMicros + systemUsageMicros) / 1e6,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t});\n\tconst cpuSystemUsageCounter = new Counter({\n\t\tname: namePrefix + PROCESS_CPU_SYSTEM_SECONDS,\n\t\thelp: 'Total system CPU time spent in seconds.',\n\t\tenableExemplars: exemplars,\n\t\tregisters,\n\t\tlabelNames,\n\t});\n\tconst cpuUsageCounter = new Counter({\n\t\tname: namePrefix + PROCESS_CPU_SECONDS,\n\t\thelp: 'Total user and system CPU time spent in seconds.',\n\t\tenableExemplars: exemplars,\n\t\tregisters,\n\t\tlabelNames,\n\t});\n};\n\nmodule.exports.metricNames = [\n\tPROCESS_CPU_USER_SECONDS,\n\tPROCESS_CPU_SYSTEM_SECONDS,\n\tPROCESS_CPU_SECONDS,\n];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst startInSeconds = Math.round(Date.now() / 1000 - process.uptime());\n\nconst PROCESS_START_TIME = 'process_start_time_seconds';\n\nmodule.exports = (registry, config = {}) => {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_START_TIME,\n\t\thelp: 'Start time of the process since unix epoch in seconds.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\taggregator: 'omit',\n\t\tcollect() {\n\t\t\tthis.set(labels, startInSeconds);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [PROCESS_START_TIME];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst fs = require('fs');\n\nconst values = ['VmSize', 'VmRSS', 'VmData'];\n\nconst PROCESS_RESIDENT_MEMORY = 'process_resident_memory_bytes';\nconst PROCESS_VIRTUAL_MEMORY = 'process_virtual_memory_bytes';\nconst PROCESS_HEAP = 'process_heap_bytes';\n\nfunction structureOutput(input) {\n\treturn input.split('\\n').reduce((acc, string) => {\n\t\tif (!values.some(value => string.startsWith(value))) {\n\t\t\treturn acc;\n\t\t}\n\n\t\tconst split = string.split(':');\n\n\t\t// Get the value\n\t\tlet value = split[1].trim();\n\t\t// Remove trailing ` kb`\n\t\tvalue = value.substr(0, value.length - 3);\n\t\t// Make it into a number in bytes bytes\n\t\tvalue = Number(value) * 1024;\n\n\t\tacc[split[0]] = value;\n\n\t\treturn acc;\n\t}, {});\n}\n\nmodule.exports = (registry, config = {}) => {\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tconst residentMemGauge = new Gauge({\n\t\tname: namePrefix + PROCESS_RESIDENT_MEMORY,\n\t\thelp: 'Resident memory size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect() {\n\t\t\ttry {\n\t\t\t\t// Sync I/O is often problematic, but /proc isn't really I/O, it\n\t\t\t\t// a virtual filesystem that maps directly to in-kernel data\n\t\t\t\t// structures and never blocks.\n\t\t\t\t//\n\t\t\t\t// Node.js/libuv do this already for process.memoryUsage(), see:\n\t\t\t\t// - https://github.com/libuv/libuv/blob/a629688008694ed8022269e66826d4d6ec688b83/src/unix/linux-core.c#L506-L523\n\t\t\t\tconst stat = fs.readFileSync('/proc/self/status', 'utf8');\n\t\t\t\tconst structuredOutput = structureOutput(stat);\n\n\t\t\t\tresidentMemGauge.set(labels, structuredOutput.VmRSS);\n\t\t\t\tvirtualMemGauge.set(labels, structuredOutput.VmSize);\n\t\t\t\theapSizeMemGauge.set(labels, structuredOutput.VmData);\n\t\t\t} catch {\n\t\t\t\t// noop\n\t\t\t}\n\t\t},\n\t});\n\tconst virtualMemGauge = new Gauge({\n\t\tname: namePrefix + PROCESS_VIRTUAL_MEMORY,\n\t\thelp: 'Virtual memory size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n\tconst heapSizeMemGauge = new Gauge({\n\t\tname: namePrefix + PROCESS_HEAP,\n\t\thelp: 'Process heap size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n};\n\nmodule.exports.metricNames = [\n\tPROCESS_RESIDENT_MEMORY,\n\tPROCESS_VIRTUAL_MEMORY,\n\tPROCESS_HEAP,\n];\n","'use strict';\n\n// process.memoryUsage() can throw on some platforms, see #67\nfunction safeMemoryUsage() {\n\ttry {\n\t\treturn process.memoryUsage();\n\t} catch {\n\t\treturn;\n\t}\n}\n\nmodule.exports = safeMemoryUsage;\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst linuxVariant = require('./osMemoryHeapLinux');\nconst safeMemoryUsage = require('./helpers/safeMemoryUsage');\n\nconst PROCESS_RESIDENT_MEMORY = 'process_resident_memory_bytes';\n\nfunction notLinuxVariant(registry, config = {}) {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_RESIDENT_MEMORY,\n\t\thelp: 'Resident memory size in bytes.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst memUsage = safeMemoryUsage();\n\n\t\t\t// I don't think the other things returned from `process.memoryUsage()` is relevant to a standard export\n\t\t\tif (memUsage) {\n\t\t\t\tthis.set(labels, memUsage.rss);\n\t\t\t}\n\t\t},\n\t});\n}\n\nmodule.exports = (registry, config) =>\n\tprocess.platform === 'linux'\n\t\t? linuxVariant(registry, config)\n\t\t: notLinuxVariant(registry, config);\n\nmodule.exports.metricNames =\n\tprocess.platform === 'linux'\n\t\t? linuxVariant.metricNames\n\t\t: [PROCESS_RESIDENT_MEMORY];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst fs = require('fs');\nconst process = require('process');\n\nconst PROCESS_OPEN_FDS = 'process_open_fds';\n\nmodule.exports = (registry, config = {}) => {\n\tif (process.platform !== 'linux') {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_OPEN_FDS,\n\t\thelp: 'Number of open file descriptors.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\ttry {\n\t\t\t\tconst fds = fs.readdirSync('/proc/self/fd');\n\t\t\t\t// Minus 1 to not count the fd that was used by readdirSync(),\n\t\t\t\t// it's now closed.\n\t\t\t\tthis.set(labels, fds.length - 1);\n\t\t\t} catch {\n\t\t\t\t// noop\n\t\t\t}\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [PROCESS_OPEN_FDS];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst fs = require('fs');\n\nconst PROCESS_MAX_FDS = 'process_max_fds';\n\nlet maxFds;\n\nmodule.exports = (registry, config = {}) => {\n\tif (maxFds === undefined) {\n\t\t// This will fail if a linux-like procfs is not available.\n\t\ttry {\n\t\t\tconst limits = fs.readFileSync('/proc/self/limits', 'utf8');\n\t\t\tconst lines = limits.split('\\n');\n\t\t\tfor (const line of lines) {\n\t\t\t\tif (line.startsWith('Max open files')) {\n\t\t\t\t\tconst parts = line.split(/ +/);\n\t\t\t\t\tmaxFds = Number(parts[1]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (maxFds === undefined) return;\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_MAX_FDS,\n\t\thelp: 'Maximum number of open file descriptors.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tif (maxFds !== undefined) this.set(labels, maxFds);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [PROCESS_MAX_FDS];\n","'use strict';\n\nconst Gauge = require('../gauge');\n\n// Check if perf_hooks module is available\nlet perf_hooks;\ntry {\n\tperf_hooks = require('perf_hooks');\n} catch {\n\t// node version is too old\n}\n\n// Reported always.\nconst NODEJS_EVENTLOOP_LAG = 'nodejs_eventloop_lag_seconds';\n\n// Reported only when perf_hooks is available.\nconst NODEJS_EVENTLOOP_LAG_MIN = 'nodejs_eventloop_lag_min_seconds';\nconst NODEJS_EVENTLOOP_LAG_MAX = 'nodejs_eventloop_lag_max_seconds';\nconst NODEJS_EVENTLOOP_LAG_MEAN = 'nodejs_eventloop_lag_mean_seconds';\nconst NODEJS_EVENTLOOP_LAG_STDDEV = 'nodejs_eventloop_lag_stddev_seconds';\nconst NODEJS_EVENTLOOP_LAG_P50 = 'nodejs_eventloop_lag_p50_seconds';\nconst NODEJS_EVENTLOOP_LAG_P90 = 'nodejs_eventloop_lag_p90_seconds';\nconst NODEJS_EVENTLOOP_LAG_P99 = 'nodejs_eventloop_lag_p99_seconds';\n\nfunction reportEventloopLag(start, gauge, labels) {\n\tconst delta = process.hrtime(start);\n\tconst nanosec = delta[0] * 1e9 + delta[1];\n\tconst seconds = nanosec / 1e9;\n\n\tgauge.set(labels, seconds);\n}\n\nmodule.exports = (registry, config = {}) => {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\tconst registers = registry ? [registry] : undefined;\n\n\tlet collect = () => {\n\t\tconst start = process.hrtime();\n\t\tsetImmediate(reportEventloopLag, start, lag, labels);\n\t};\n\n\tif (perf_hooks && perf_hooks.monitorEventLoopDelay) {\n\t\ttry {\n\t\t\tconst histogram = perf_hooks.monitorEventLoopDelay({\n\t\t\t\tresolution: config.eventLoopMonitoringPrecision,\n\t\t\t});\n\t\t\thistogram.enable();\n\n\t\t\tcollect = () => {\n\t\t\t\tconst start = process.hrtime();\n\t\t\t\tsetImmediate(reportEventloopLag, start, lag, labels);\n\n\t\t\t\tlagMin.set(labels, histogram.min / 1e9);\n\t\t\t\tlagMax.set(labels, histogram.max / 1e9);\n\t\t\t\tlagMean.set(labels, histogram.mean / 1e9);\n\t\t\t\tlagStddev.set(labels, histogram.stddev / 1e9);\n\t\t\t\tlagP50.set(labels, histogram.percentile(50) / 1e9);\n\t\t\t\tlagP90.set(labels, histogram.percentile(90) / 1e9);\n\t\t\t\tlagP99.set(labels, histogram.percentile(99) / 1e9);\n\n\t\t\t\thistogram.reset();\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tif (e.code === 'ERR_NOT_IMPLEMENTED') {\n\t\t\t\treturn; // Bun\n\t\t\t}\n\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tconst lag = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG,\n\t\thelp: 'Lag of event loop in seconds.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect,\n\t});\n\tconst lagMin = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_MIN,\n\t\thelp: 'The minimum recorded event loop delay.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'min',\n\t});\n\tconst lagMax = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_MAX,\n\t\thelp: 'The maximum recorded event loop delay.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'max',\n\t});\n\tconst lagMean = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_MEAN,\n\t\thelp: 'The mean of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagStddev = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_STDDEV,\n\t\thelp: 'The standard deviation of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagP50 = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_P50,\n\t\thelp: 'The 50th percentile of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagP90 = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_P90,\n\t\thelp: 'The 90th percentile of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagP99 = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_P99,\n\t\thelp: 'The 99th percentile of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_EVENTLOOP_LAG,\n\tNODEJS_EVENTLOOP_LAG_MIN,\n\tNODEJS_EVENTLOOP_LAG_MAX,\n\tNODEJS_EVENTLOOP_LAG_MEAN,\n\tNODEJS_EVENTLOOP_LAG_STDDEV,\n\tNODEJS_EVENTLOOP_LAG_P50,\n\tNODEJS_EVENTLOOP_LAG_P90,\n\tNODEJS_EVENTLOOP_LAG_P99,\n];\n","'use strict';\n\nfunction aggregateByObjectName(list) {\n\tconst data = {};\n\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst listElement = list[i];\n\n\t\tif (!listElement || typeof listElement.constructor === 'undefined') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (Object.hasOwnProperty.call(data, listElement.constructor.name)) {\n\t\t\tdata[listElement.constructor.name] += 1;\n\t\t} else {\n\t\t\tdata[listElement.constructor.name] = 1;\n\t\t}\n\t}\n\treturn data;\n}\n\nfunction updateMetrics(gauge, data, labels) {\n\tgauge.reset();\n\tfor (const key in data) {\n\t\tgauge.set(Object.assign({ type: key }, labels || {}), data[key]);\n\t}\n}\n\nmodule.exports = {\n\taggregateByObjectName,\n\tupdateMetrics,\n};\n","'use strict';\n\nconst { aggregateByObjectName } = require('./helpers/processMetricsHelpers');\nconst { updateMetrics } = require('./helpers/processMetricsHelpers');\nconst Gauge = require('../gauge');\n\nconst NODEJS_ACTIVE_HANDLES = 'nodejs_active_handles';\nconst NODEJS_ACTIVE_HANDLES_TOTAL = 'nodejs_active_handles_total';\n\nmodule.exports = (registry, config = {}) => {\n\t// Don't do anything if the function is removed in later nodes (exists in node@6-12...)\n\tif (typeof process._getActiveHandles !== 'function') {\n\t\treturn;\n\t}\n\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_HANDLES,\n\t\thelp: 'Number of active libuv handles grouped by handle type. Every handle type is C++ class name.',\n\t\tlabelNames: ['type', ...labelNames],\n\t\tregisters,\n\t\tcollect() {\n\t\t\tconst handles = process._getActiveHandles();\n\t\t\tupdateMetrics(this, aggregateByObjectName(handles), labels);\n\t\t},\n\t});\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_HANDLES_TOTAL,\n\t\thelp: 'Total number of active handles.',\n\t\tregisters,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst handles = process._getActiveHandles();\n\t\t\tthis.set(labels, handles.length);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_ACTIVE_HANDLES,\n\tNODEJS_ACTIVE_HANDLES_TOTAL,\n];\n","'use strict';\nconst Gauge = require('../gauge');\nconst { aggregateByObjectName } = require('./helpers/processMetricsHelpers');\nconst { updateMetrics } = require('./helpers/processMetricsHelpers');\n\nconst NODEJS_ACTIVE_REQUESTS = 'nodejs_active_requests';\nconst NODEJS_ACTIVE_REQUESTS_TOTAL = 'nodejs_active_requests_total';\n\nmodule.exports = (registry, config = {}) => {\n\t// Don't do anything if the function is removed in later nodes (exists in node@6)\n\tif (typeof process._getActiveRequests !== 'function') {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_REQUESTS,\n\t\thelp: 'Number of active libuv requests grouped by request type. Every request type is C++ class name.',\n\t\tlabelNames: ['type', ...labelNames],\n\t\tregisters: registry ? [registry] : undefined,\n\t\tcollect() {\n\t\t\tconst requests = process._getActiveRequests();\n\t\t\tupdateMetrics(this, aggregateByObjectName(requests), labels);\n\t\t},\n\t});\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_REQUESTS_TOTAL,\n\t\thelp: 'Total number of active requests.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst requests = process._getActiveRequests();\n\t\t\tthis.set(labels, requests.length);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_ACTIVE_REQUESTS,\n\tNODEJS_ACTIVE_REQUESTS_TOTAL,\n];\n","'use strict';\nconst Gauge = require('../gauge');\nconst { updateMetrics } = require('./helpers/processMetricsHelpers');\n\nconst NODEJS_ACTIVE_RESOURCES = 'nodejs_active_resources';\nconst NODEJS_ACTIVE_RESOURCES_TOTAL = 'nodejs_active_resources_total';\n\nmodule.exports = (registry, config = {}) => {\n\t// Don't do anything if the function does not exist in previous nodes (exists in node@17.3.0)\n\tif (typeof process.getActiveResourcesInfo !== 'function') {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_RESOURCES,\n\t\thelp: 'Number of active resources that are currently keeping the event loop alive, grouped by async resource type.',\n\t\tlabelNames: ['type', ...labelNames],\n\t\tregisters: registry ? [registry] : undefined,\n\t\tcollect() {\n\t\t\tconst resources = process.getActiveResourcesInfo();\n\n\t\t\tconst data = {};\n\n\t\t\tfor (let i = 0; i < resources.length; i++) {\n\t\t\t\tconst resource = resources[i];\n\n\t\t\t\tif (Object.hasOwn(data, resource)) {\n\t\t\t\t\tdata[resource] += 1;\n\t\t\t\t} else {\n\t\t\t\t\tdata[resource] = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tupdateMetrics(this, data, labels);\n\t\t},\n\t});\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_RESOURCES_TOTAL,\n\t\thelp: 'Total number of active resources.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst resources = process.getActiveResourcesInfo();\n\t\t\tthis.set(labels, resources.length);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_ACTIVE_RESOURCES,\n\tNODEJS_ACTIVE_RESOURCES_TOTAL,\n];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst safeMemoryUsage = require('./helpers/safeMemoryUsage');\n\nconst NODEJS_HEAP_SIZE_TOTAL = 'nodejs_heap_size_total_bytes';\nconst NODEJS_HEAP_SIZE_USED = 'nodejs_heap_size_used_bytes';\nconst NODEJS_EXTERNAL_MEMORY = 'nodejs_external_memory_bytes';\n\nmodule.exports = (registry, config = {}) => {\n\tif (typeof process.memoryUsage !== 'function') {\n\t\treturn;\n\t}\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst collect = () => {\n\t\tconst memUsage = safeMemoryUsage();\n\t\tif (memUsage) {\n\t\t\theapSizeTotal.set(labels, memUsage.heapTotal);\n\t\t\theapSizeUsed.set(labels, memUsage.heapUsed);\n\t\t\tif (memUsage.external !== undefined) {\n\t\t\t\texternalMemUsed.set(labels, memUsage.external);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst heapSizeTotal = new Gauge({\n\t\tname: namePrefix + NODEJS_HEAP_SIZE_TOTAL,\n\t\thelp: 'Process heap size from Node.js in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect,\n\t});\n\tconst heapSizeUsed = new Gauge({\n\t\tname: namePrefix + NODEJS_HEAP_SIZE_USED,\n\t\thelp: 'Process heap size used from Node.js in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n\tconst externalMemUsed = new Gauge({\n\t\tname: namePrefix + NODEJS_EXTERNAL_MEMORY,\n\t\thelp: 'Node.js external memory size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_HEAP_SIZE_TOTAL,\n\tNODEJS_HEAP_SIZE_USED,\n\tNODEJS_EXTERNAL_MEMORY,\n];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst v8 = require('v8');\n\nconst METRICS = ['total', 'used', 'available'];\nconst NODEJS_HEAP_SIZE = {};\n\nMETRICS.forEach(metricType => {\n\tNODEJS_HEAP_SIZE[metricType] = `nodejs_heap_space_size_${metricType}_bytes`;\n});\n\nmodule.exports = (registry, config = {}) => {\n\ttry {\n\t\tv8.getHeapSpaceStatistics();\n\t} catch (e) {\n\t\tif (e.code === 'ERR_NOT_IMPLEMENTED') {\n\t\t\treturn; // Bun\n\t\t}\n\t\tthrow e;\n\t}\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = ['space', ...Object.keys(labels)];\n\n\tconst gauges = {};\n\n\tMETRICS.forEach(metricType => {\n\t\tgauges[metricType] = new Gauge({\n\t\t\tname: namePrefix + NODEJS_HEAP_SIZE[metricType],\n\t\t\thelp: `Process heap space size ${metricType} from Node.js in bytes.`,\n\t\t\tlabelNames,\n\t\t\tregisters,\n\t\t});\n\t});\n\n\t// Use this one metric's `collect` to set all metrics' values.\n\tgauges.total.collect = () => {\n\t\tfor (const space of v8.getHeapSpaceStatistics()) {\n\t\t\tconst spaceName = space.space_name.substr(\n\t\t\t\t0,\n\t\t\t\tspace.space_name.indexOf('_space'),\n\t\t\t);\n\n\t\t\tgauges.total.set({ space: spaceName, ...labels }, space.space_size);\n\t\t\tgauges.used.set({ space: spaceName, ...labels }, space.space_used_size);\n\t\t\tgauges.available.set(\n\t\t\t\t{ space: spaceName, ...labels },\n\t\t\t\tspace.space_available_size,\n\t\t\t);\n\t\t}\n\t};\n};\n\nmodule.exports.metricNames = Object.values(NODEJS_HEAP_SIZE);\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst version = process.version;\nconst versionSegments = version.slice(1).split('.').map(Number);\n\nconst NODE_VERSION_INFO = 'nodejs_version_info';\n\nmodule.exports = (registry, config = {}) => {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODE_VERSION_INFO,\n\t\thelp: 'Node.js version info.',\n\t\tlabelNames: ['version', 'major', 'minor', 'patch', ...labelNames],\n\t\tregisters: registry ? [registry] : undefined,\n\t\taggregator: 'first',\n\t\tcollect() {\n\t\t\t// Needs to be in collect() so value is present even if reg is reset\n\t\t\tthis.labels(\n\t\t\t\tversion,\n\t\t\t\tversionSegments[0],\n\t\t\t\tversionSegments[1],\n\t\t\t\tversionSegments[2],\n\t\t\t\t...Object.values(labels),\n\t\t\t).set(1);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [NODE_VERSION_INFO];\n","'use strict';\nconst Histogram = require('../histogram');\n\nlet perf_hooks;\n\ntry {\n\t// eslint-disable-next-line\n\tperf_hooks = require('perf_hooks');\n} catch {\n\t// node version is too old\n}\n\nconst NODEJS_GC_DURATION_SECONDS = 'nodejs_gc_duration_seconds';\nconst DEFAULT_GC_DURATION_BUCKETS = [0.001, 0.01, 0.1, 1, 2, 5];\n\nconst kinds = [];\n\nif (perf_hooks && perf_hooks.constants) {\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR] = 'major';\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR] = 'minor';\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL] = 'incremental';\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB] = 'weakcb';\n}\n\nmodule.exports = (registry, config = {}) => {\n\tif (!perf_hooks) {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\tconst buckets = config.gcDurationBuckets\n\t\t? config.gcDurationBuckets\n\t\t: DEFAULT_GC_DURATION_BUCKETS;\n\tconst gcHistogram = new Histogram({\n\t\tname: namePrefix + NODEJS_GC_DURATION_SECONDS,\n\t\thelp: 'Garbage collection duration by kind, one of major, minor, incremental or weakcb.',\n\t\tlabelNames: ['kind', ...labelNames],\n\t\tenableExemplars: false,\n\t\tbuckets,\n\t\tregisters: registry ? [registry] : undefined,\n\t});\n\n\tconst obs = new perf_hooks.PerformanceObserver(list => {\n\t\tconst entry = list.getEntries()[0];\n\t\t// Node < 16 uses entry.kind\n\t\t// Node >= 16 uses entry.detail.kind\n\t\t// See: https://nodejs.org/docs/latest-v16.x/api/deprecations.html#deprecations_dep0152_extension_performanceentry_properties\n\t\tconst kind = entry.detail ? kinds[entry.detail.kind] : kinds[entry.kind];\n\t\t// Convert duration from milliseconds to seconds\n\t\tgcHistogram.observe(Object.assign({ kind }, labels), entry.duration / 1000);\n\t});\n\n\tobs.observe({ entryTypes: ['gc'] });\n};\n\nmodule.exports.metricNames = [NODEJS_GC_DURATION_SECONDS];\n","'use strict';\n\nconst { isObject } = require('./util');\n\n// Default metrics.\nconst processCpuTotal = require('./metrics/processCpuTotal');\nconst processStartTime = require('./metrics/processStartTime');\nconst osMemoryHeap = require('./metrics/osMemoryHeap');\nconst processOpenFileDescriptors = require('./metrics/processOpenFileDescriptors');\nconst processMaxFileDescriptors = require('./metrics/processMaxFileDescriptors');\nconst eventLoopLag = require('./metrics/eventLoopLag');\nconst processHandles = require('./metrics/processHandles');\nconst processRequests = require('./metrics/processRequests');\nconst processResources = require('./metrics/processResources');\nconst heapSizeAndUsed = require('./metrics/heapSizeAndUsed');\nconst heapSpacesSizeAndUsed = require('./metrics/heapSpacesSizeAndUsed');\nconst version = require('./metrics/version');\nconst gc = require('./metrics/gc');\n\nconst metrics = {\n\tprocessCpuTotal,\n\tprocessStartTime,\n\tosMemoryHeap,\n\tprocessOpenFileDescriptors,\n\tprocessMaxFileDescriptors,\n\teventLoopLag,\n\t...(typeof process.getActiveResourcesInfo === 'function'\n\t\t? { processResources }\n\t\t: {}),\n\tprocessHandles,\n\tprocessRequests,\n\theapSizeAndUsed,\n\theapSpacesSizeAndUsed,\n\tversion,\n\tgc,\n};\nconst metricsList = Object.keys(metrics);\n\nmodule.exports = function collectDefaultMetrics(config) {\n\tif (config !== null && config !== undefined && !isObject(config)) {\n\t\tthrow new TypeError('config must be null, undefined, or an object');\n\t}\n\n\tconfig = { eventLoopMonitoringPrecision: 10, ...config };\n\n\tfor (const metric of Object.values(metrics)) {\n\t\tmetric(config.register, config);\n\t}\n};\n\nmodule.exports.metricsList = metricsList;\n","'use strict';\n\nconst { Grouper, hashObject } = require('./util');\n\n/**\n * Returns a new function that applies the `aggregatorFn` to the values.\n * @param {Function} aggregatorFn function to apply to values.\n * @return {Function} aggregator function\n */\nfunction AggregatorFactory(aggregatorFn) {\n\treturn metrics => {\n\t\tif (metrics.length === 0) return;\n\t\tconst result = {\n\t\t\thelp: metrics[0].help,\n\t\t\tname: metrics[0].name,\n\t\t\ttype: metrics[0].type,\n\t\t\tvalues: [],\n\t\t\taggregator: metrics[0].aggregator,\n\t\t};\n\t\t// Gather metrics by metricName and labels.\n\t\tconst byLabels = new Grouper();\n\t\tmetrics.forEach(metric => {\n\t\t\tmetric.values.forEach(value => {\n\t\t\t\tconst key = hashObject(value.labels);\n\t\t\t\tbyLabels.add(`${value.metricName}_${key}`, value);\n\t\t\t});\n\t\t});\n\t\t// Apply aggregator function to gathered metrics.\n\t\tbyLabels.forEach(values => {\n\t\t\tif (values.length === 0) return;\n\t\t\tconst valObj = {\n\t\t\t\tvalue: aggregatorFn(values),\n\t\t\t\tlabels: values[0].labels,\n\t\t\t};\n\t\t\tif (values[0].metricName) {\n\t\t\t\tvalObj.metricName = values[0].metricName;\n\t\t\t}\n\t\t\t// NB: Timestamps are omitted.\n\t\t\tresult.values.push(valObj);\n\t\t});\n\t\treturn result;\n\t};\n}\n// Export for users to define their own aggregation methods.\nexports.AggregatorFactory = AggregatorFactory;\n\n/**\n * Functions that can be used to aggregate metrics from multiple registries.\n */\nexports.aggregators = {\n\t/**\n\t * @return The sum of values.\n\t */\n\tsum: AggregatorFactory(v => v.reduce((p, c) => p + c.value, 0)),\n\t/**\n\t * @return The first value.\n\t */\n\tfirst: AggregatorFactory(v => v[0].value),\n\t/**\n\t * @return {undefined} Undefined; omits the metric.\n\t */\n\tomit: () => {},\n\t/**\n\t * @return The arithmetic mean of the values.\n\t */\n\taverage: AggregatorFactory(\n\t\tv => v.reduce((p, c) => p + c.value, 0) / v.length,\n\t),\n\t/**\n\t * @return The minimum of the values.\n\t */\n\tmin: AggregatorFactory(v =>\n\t\tv.reduce((p, c) => Math.min(p, c.value), Infinity),\n\t),\n\t/**\n\t * @return The maximum of the values.\n\t */\n\tmax: AggregatorFactory(v =>\n\t\tv.reduce((p, c) => Math.max(p, c.value), -Infinity),\n\t),\n};\n","'use strict';\n\n/**\n * Extends the Registry class with a `clusterMetrics` method that returns\n * aggregated metrics for all workers.\n *\n * In cluster workers, listens for and responds to requests for metrics by the\n * cluster master.\n */\n\nconst Registry = require('./registry');\nconst { Grouper } = require('./util');\nconst { aggregators } = require('./metricAggregators');\n// We need to lazy-load the 'cluster' module as some application servers -\n// namely Passenger - crash when it is imported.\nlet cluster = () => {\n\tconst data = require('cluster');\n\tcluster = () => data;\n\treturn data;\n};\n\nconst GET_METRICS_REQ = 'prom-client:getMetricsReq';\nconst GET_METRICS_RES = 'prom-client:getMetricsRes';\n\nlet registries = [Registry.globalRegistry];\nlet requestCtr = 0; // Concurrency control\nlet listenersAdded = false;\nconst requests = new Map(); // Pending requests for workers' local metrics.\n\nclass AggregatorRegistry extends Registry {\n\tconstructor(regContentType = Registry.PROMETHEUS_CONTENT_TYPE) {\n\t\tsuper(regContentType);\n\t\taddListeners();\n\t}\n\n\t/**\n\t * Gets aggregated metrics for all workers. The optional callback and\n\t * returned Promise resolve with the same value; either may be used.\n\t * @return {Promise<string>} Promise that resolves with the aggregated\n\t * metrics.\n\t */\n\tclusterMetrics() {\n\t\tconst requestId = requestCtr++;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet settled = false;\n\t\t\tfunction done(err, result) {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t}\n\n\t\t\tconst request = {\n\t\t\t\tresponses: [],\n\t\t\t\tpending: 0,\n\t\t\t\tdone,\n\t\t\t\terrorTimeout: setTimeout(() => {\n\t\t\t\t\tconst err = new Error('Operation timed out.');\n\t\t\t\t\trequest.done(err);\n\t\t\t\t}, 5000),\n\t\t\t};\n\t\t\trequests.set(requestId, request);\n\n\t\t\tconst message = {\n\t\t\t\ttype: GET_METRICS_REQ,\n\t\t\t\trequestId,\n\t\t\t};\n\n\t\t\tfor (const id in cluster().workers) {\n\t\t\t\t// If the worker exits abruptly, it may still be in the workers\n\t\t\t\t// list but not able to communicate.\n\t\t\t\tif (cluster().workers[id].isConnected()) {\n\t\t\t\t\tcluster().workers[id].send(message);\n\t\t\t\t\trequest.pending++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (request.pending === 0) {\n\t\t\t\t// No workers were up\n\t\t\t\tclearTimeout(request.errorTimeout);\n\t\t\t\tprocess.nextTick(() => done(null, ''));\n\t\t\t}\n\t\t});\n\t}\n\n\tget contentType() {\n\t\treturn super.contentType;\n\t}\n\n\t/**\n\t * Creates a new Registry instance from an array of metrics that were\n\t * created by `registry.getMetricsAsJSON()`. Metrics are aggregated using\n\t * the method specified by their `aggregator` property, or by summation if\n\t * `aggregator` is undefined.\n\t * @param {Array} metricsArr Array of metrics, each of which created by\n\t * `registry.getMetricsAsJSON()`.\n\t * @param {string} registryType content type of the new registry. Defaults\n\t * to PROMETHEUS_CONTENT_TYPE.\n\t * @return {Registry} aggregated registry.\n\t */\n\tstatic aggregate(\n\t\tmetricsArr,\n\t\tregistryType = Registry.PROMETHEUS_CONTENT_TYPE,\n\t) {\n\t\tconst aggregatedRegistry = new Registry();\n\t\tconst metricsByName = new Grouper();\n\n\t\taggregatedRegistry.setContentType(registryType);\n\n\t\t// Gather by name\n\t\tmetricsArr.forEach(metrics => {\n\t\t\tmetrics.forEach(metric => {\n\t\t\t\tmetricsByName.add(metric.name, metric);\n\t\t\t});\n\t\t});\n\n\t\t// Aggregate gathered metrics.\n\t\tmetricsByName.forEach(metrics => {\n\t\t\tconst aggregatorName = metrics[0].aggregator;\n\t\t\tconst aggregatorFn = aggregators[aggregatorName];\n\t\t\tif (typeof aggregatorFn !== 'function') {\n\t\t\t\tthrow new Error(`'${aggregatorName}' is not a defined aggregator.`);\n\t\t\t}\n\t\t\tconst aggregatedMetric = aggregatorFn(metrics);\n\t\t\t// NB: The 'omit' aggregator returns undefined.\n\t\t\tif (aggregatedMetric) {\n\t\t\t\tconst aggregatedMetricWrapper = Object.assign(\n\t\t\t\t\t{\n\t\t\t\t\t\tget: () => aggregatedMetric,\n\t\t\t\t\t},\n\t\t\t\t\taggregatedMetric,\n\t\t\t\t);\n\t\t\t\taggregatedRegistry.registerMetric(aggregatedMetricWrapper);\n\t\t\t}\n\t\t});\n\n\t\treturn aggregatedRegistry;\n\t}\n\n\t/**\n\t * Sets the registry or registries to be aggregated. Call from workers to\n\t * use a registry/registries other than the default global registry.\n\t * @param {Array<Registry>|Registry} regs Registry or registries to be\n\t * aggregated.\n\t * @return {void}\n\t */\n\tstatic setRegistries(regs) {\n\t\tif (!Array.isArray(regs)) regs = [regs];\n\t\tregs.forEach(reg => {\n\t\t\tif (!(reg instanceof Registry)) {\n\t\t\t\tthrow new TypeError(`Expected Registry, got ${typeof reg}`);\n\t\t\t}\n\t\t});\n\t\tregistries = regs;\n\t}\n}\n\n/**\n * Adds event listeners for cluster aggregation. Idempotent (safe to call more\n * than once).\n * @return {void}\n */\nfunction addListeners() {\n\tif (listenersAdded) return;\n\tlistenersAdded = true;\n\n\tif (cluster().isMaster) {\n\t\t// Listen for worker responses to requests for local metrics\n\t\tcluster().on('message', (worker, message) => {\n\t\t\tif (message.type === GET_METRICS_RES) {\n\t\t\t\tconst request = requests.get(message.requestId);\n\n\t\t\t\tif (message.error) {\n\t\t\t\t\trequest.done(new Error(message.error));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tmessage.metrics.forEach(registry => request.responses.push(registry));\n\t\t\t\trequest.pending--;\n\n\t\t\t\tif (request.pending === 0) {\n\t\t\t\t\t// finalize\n\t\t\t\t\trequests.delete(message.requestId);\n\t\t\t\t\tclearTimeout(request.errorTimeout);\n\n\t\t\t\t\tconst registry = AggregatorRegistry.aggregate(request.responses);\n\t\t\t\t\tconst promString = registry.metrics();\n\t\t\t\t\trequest.done(null, promString);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (cluster().isWorker) {\n\t\t// Respond to master's requests for worker's local metrics.\n\t\tprocess.on('message', message => {\n\t\t\tif (message.type === GET_METRICS_REQ) {\n\t\t\t\tPromise.all(registries.map(r => r.getMetricsAsJSON()))\n\t\t\t\t\t.then(metrics => {\n\t\t\t\t\t\tprocess.send({\n\t\t\t\t\t\t\ttype: GET_METRICS_RES,\n\t\t\t\t\t\t\trequestId: message.requestId,\n\t\t\t\t\t\t\tmetrics,\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\tprocess.send({\n\t\t\t\t\t\t\ttype: GET_METRICS_RES,\n\t\t\t\t\t\t\trequestId: message.requestId,\n\t\t\t\t\t\t\terror: error.message,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n}\n\nmodule.exports = AggregatorRegistry;\n","/**\n * Prometheus client\n * @module Prometheus client\n */\n\n'use strict';\n\nexports.register = require('./lib/registry').globalRegistry;\nexports.Registry = require('./lib/registry');\nObject.defineProperty(exports, 'contentType', {\n\tconfigurable: false,\n\tenumerable: true,\n\tget() {\n\t\treturn exports.register.contentType;\n\t},\n\tset(value) {\n\t\texports.register.setContentType(value);\n\t},\n});\nexports.prometheusContentType = exports.Registry.PROMETHEUS_CONTENT_TYPE;\nexports.openMetricsContentType = exports.Registry.OPENMETRICS_CONTENT_TYPE;\nexports.validateMetricName = require('./lib/validation').validateMetricName;\n\nexports.Counter = require('./lib/counter');\nexports.Gauge = require('./lib/gauge');\nexports.Histogram = require('./lib/histogram');\nexports.Summary = require('./lib/summary');\nexports.Pushgateway = require('./lib/pushgateway');\n\nexports.linearBuckets = require('./lib/bucketGenerators').linearBuckets;\nexports.exponentialBuckets =\n\trequire('./lib/bucketGenerators').exponentialBuckets;\n\nexports.collectDefaultMetrics = require('./lib/defaultMetrics');\n\nexports.aggregators = require('./lib/metricAggregators').aggregators;\nexports.AggregatorRegistry = require('./lib/cluster');\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 * 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 * Prometheus exporter constants\n *\n * ADR-0007 histogram buckets and metric names from Crucible v0.2.7 taxonomy.\n */\n\n/**\n * ADR-0007 histogram buckets for millisecond timing\n *\n * Buckets: 1ms, 5ms, 10ms, 50ms, 100ms, 500ms, 1s, 5s, 10s\n * Used for: MIME detection, error handling, FulHash operations\n */\nexport const ADR0007_BUCKETS_MS = [1, 5, 10, 50, 100, 500, 1000, 5000, 10000] as const;\n\n/**\n * ADR-0007 histogram buckets for second timing (refresh operations)\n *\n * Buckets: 1ms, 5ms, 10ms, 50ms, 100ms, 500ms, 1s, 5s, 10s (converted to seconds)\n * Used for: Prometheus exporter refresh duration\n */\nexport const ADR0007_BUCKETS_SECONDS = [\n 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0, 5.0, 10.0,\n] as const;\n\n/**\n * Convert milliseconds to seconds for Prometheus histograms\n */\nexport function msToSeconds(ms: number): number {\n return ms / 1000;\n}\n\n/**\n * Prometheus exporter metric names (Crucible v0.2.7 taxonomy)\n */\nexport const PROMETHEUS_EXPORTER_METRICS = {\n // Refresh metrics\n REFRESH_DURATION_SECONDS: \"prometheus_exporter_refresh_duration_seconds\",\n REFRESH_TOTAL: \"prometheus_exporter_refresh_total\",\n REFRESH_ERRORS_TOTAL: \"prometheus_exporter_refresh_errors_total\",\n REFRESH_INFLIGHT: \"prometheus_exporter_refresh_inflight\",\n\n // HTTP metrics\n HTTP_REQUESTS_TOTAL: \"prometheus_exporter_http_requests_total\",\n HTTP_ERRORS_TOTAL: \"prometheus_exporter_http_errors_total\",\n\n // Restart metrics\n RESTARTS_TOTAL: \"prometheus_exporter_restarts_total\",\n} as const;\n\n/**\n * Foundry module metric names (Crucible v0.2.7 taxonomy)\n */\nexport const FOUNDRY_METRICS = {\n // MIME detection counters\n MIME_DETECTIONS_JSON: \"foundry_mime_detections_total_json\",\n MIME_DETECTIONS_XML: \"foundry_mime_detections_total_xml\",\n MIME_DETECTIONS_YAML: \"foundry_mime_detections_total_yaml\",\n MIME_DETECTIONS_CSV: \"foundry_mime_detections_total_csv\",\n MIME_DETECTIONS_PLAIN_TEXT: \"foundry_mime_detections_total_plain_text\",\n MIME_DETECTIONS_UNKNOWN: \"foundry_mime_detections_total_unknown\",\n\n // MIME detection timing histograms\n MIME_DETECTION_MS_JSON: \"foundry_mime_detection_ms_json\",\n MIME_DETECTION_MS_XML: \"foundry_mime_detection_ms_xml\",\n MIME_DETECTION_MS_YAML: \"foundry_mime_detection_ms_yaml\",\n MIME_DETECTION_MS_CSV: \"foundry_mime_detection_ms_csv\",\n MIME_DETECTION_MS_PLAIN_TEXT: \"foundry_mime_detection_ms_plain_text\",\n MIME_DETECTION_MS_UNKNOWN: \"foundry_mime_detection_ms_unknown\",\n\n // General lookup counter\n LOOKUP_COUNT: \"foundry_lookup_count\",\n} as const;\n\n/**\n * Error handling module metric names (Crucible v0.2.7 taxonomy)\n */\nexport const ERROR_HANDLING_METRICS = {\n WRAPS_TOTAL: \"error_handling_wraps_total\",\n WRAP_MS: \"error_handling_wrap_ms\",\n} as const;\n\n/**\n * FulHash module metric names (Crucible v0.2.7 taxonomy)\n */\nexport const FULHASH_METRICS = {\n // Algorithm-specific counters\n OPERATIONS_XXH3_128: \"fulhash_operations_total_xxh3_128\",\n OPERATIONS_SHA256: \"fulhash_operations_total_sha256\",\n\n // General counters\n HASH_STRING_TOTAL: \"fulhash_hash_string_total\",\n BYTES_HASHED_TOTAL: \"fulhash_bytes_hashed_total\",\n\n // Timing histogram\n OPERATION_MS: \"fulhash_operation_ms\",\n} as const;\n\n/**\n * Label values for Prometheus exporter metrics (taxonomy-compliant)\n */\nexport const EXPORTER_LABELS = {\n // Refresh phases\n PHASE_COLLECT: \"collect\",\n PHASE_CONVERT: \"convert\",\n PHASE_EXPORT: \"export\",\n\n // Results\n RESULT_SUCCESS: \"success\",\n RESULT_ERROR: \"error\",\n\n // Error types\n ERROR_VALIDATION: \"validation\",\n ERROR_IO: \"io\",\n ERROR_TIMEOUT: \"timeout\",\n ERROR_OTHER: \"other\",\n\n // Restart reasons\n REASON_CONFIG_CHANGE: \"config_change\",\n REASON_ERROR: \"error\",\n REASON_MANUAL: \"manual\",\n REASON_OTHER: \"other\",\n} as const;\n","/**\n * Prometheus exporter error classes\n *\n * Specialized errors for Prometheus integration failures.\n */\n\nimport { FulmenError } from \"../../errors/index.js\";\n\n/**\n * Base error class for Prometheus exporter errors\n */\nexport class PrometheusExporterError extends FulmenError {\n constructor(\n message: string,\n options?: {\n code?: string;\n cause?: unknown;\n context?: Record<string, unknown>;\n },\n ) {\n super({\n code: options?.code || \"PROMETHEUS_EXPORTER_ERROR\",\n message,\n severity: \"medium\",\n context: options?.context,\n });\n\n if (options?.cause) {\n this.cause = options.cause;\n }\n\n this.name = \"PrometheusExporterError\";\n }\n}\n\n/**\n * Error thrown when prom-client peer dependency is not installed\n */\nexport class PromClientNotFoundError extends PrometheusExporterError {\n constructor(cause?: unknown) {\n super(\n \"prom-client peer dependency not found. Install with: bun add prom-client\\n\" +\n \"For npm: npm install prom-client\\n\" +\n \"For more information, see: https://github.com/siimon/prom-client\",\n {\n code: \"PROM_CLIENT_NOT_FOUND\",\n cause,\n context: {\n suggestion: 'Run \"bun add prom-client\" to install the required peer dependency',\n },\n },\n );\n\n this.name = \"PromClientNotFoundError\";\n }\n}\n\n/**\n * Error thrown when metric name is invalid for Prometheus\n */\nexport class InvalidMetricNameError extends PrometheusExporterError {\n constructor(metricName: string, reason: string) {\n super(`Invalid Prometheus metric name: \"${metricName}\". ${reason}`, {\n code: \"INVALID_METRIC_NAME\",\n context: {\n metricName,\n reason,\n suggestion:\n \"Prometheus metric names must match: [a-zA-Z_:][a-zA-Z0-9_:]*\\n\" +\n \"See: https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels\",\n },\n });\n\n this.name = \"InvalidMetricNameError\";\n }\n}\n\n/**\n * Error thrown when label name is invalid for Prometheus\n */\nexport class InvalidLabelNameError extends PrometheusExporterError {\n constructor(labelName: string, reason: string) {\n super(`Invalid Prometheus label name: \"${labelName}\". ${reason}`, {\n code: \"INVALID_LABEL_NAME\",\n context: {\n labelName,\n reason,\n suggestion:\n \"Prometheus label names must match: [a-zA-Z_][a-zA-Z0-9_]*\\n\" +\n \"See: https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels\",\n },\n });\n\n this.name = \"InvalidLabelNameError\";\n }\n}\n\n/**\n * Error thrown when metric registration fails\n */\nexport class MetricRegistrationError extends PrometheusExporterError {\n constructor(metricName: string, cause: unknown) {\n super(`Failed to register Prometheus metric: \"${metricName}\"`, {\n code: \"METRIC_REGISTRATION_FAILED\",\n cause,\n context: {\n metricName,\n suggestion: \"Check for duplicate metric names or incompatible collector types\",\n },\n });\n\n this.name = \"MetricRegistrationError\";\n }\n}\n\n/**\n * Error thrown when refresh operation fails\n *\n * This error wraps underlying errors (InvalidMetricNameError, MetricRegistrationError, etc.)\n * that occur during the refresh process. Callers should inspect the `cause` property\n * to access the root error for specific error handling.\n *\n * @example\n * ```typescript\n * try {\n * await exporter.refresh();\n * } catch (err) {\n * if (err instanceof RefreshError) {\n * // Check the underlying cause for specific error types\n * if (err.cause instanceof InvalidMetricNameError) {\n * console.error('Invalid metric name:', err.cause.message);\n * }\n * }\n * }\n * ```\n */\nexport class RefreshError extends PrometheusExporterError {\n constructor(cause: unknown, context?: Record<string, unknown>) {\n super(\"Failed to refresh Prometheus metrics from TelemetryRegistry\", {\n code: \"REFRESH_FAILED\",\n cause,\n context,\n });\n\n this.name = \"RefreshError\";\n }\n}\n","/**\n * Prometheus exporter core implementation\n *\n * Bridges TSFulmen TelemetryRegistry to prom-client for Prometheus exposition.\n * Uses dynamic imports and loose typing for optional peer dependency (prom-client).\n *\n * NOTE: This file intentionally uses 'any' types for prom-client peer dependency\n * to avoid compile-time dependency. Runtime validation ensures type safety.\n * See .plans/active/v0.2.x-plans/prometheus-type-safety-enhancement.md for future work.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { metrics as defaultRegistry } from \"../index.js\";\nimport type { MetricsEvent } from \"../types.js\";\nimport { isHistogramSummary } from \"../types.js\";\nimport {\n ADR0007_BUCKETS_SECONDS,\n EXPORTER_LABELS,\n msToSeconds,\n PROMETHEUS_EXPORTER_METRICS,\n} from \"./constants.js\";\nimport {\n InvalidLabelNameError,\n InvalidMetricNameError,\n MetricRegistrationError,\n PromClientNotFoundError,\n RefreshError,\n} from \"./errors.js\";\nimport type { ExporterStats, PrometheusExporterOptions, RefreshOptions } from \"./types.js\";\n\n/**\n * Prometheus exporter\n *\n * Converts TSFulmen TelemetryRegistry metrics to Prometheus format using prom-client.\n *\n * @example\n * ```typescript\n * import { PrometheusExporter } from '@fulmenhq/tsfulmen/telemetry/prometheus';\n * import { metrics } from '@fulmenhq/tsfulmen/telemetry';\n *\n * // Create exporter\n * const exporter = new PrometheusExporter({\n * registry: metrics,\n * namespace: 'myapp',\n * defaultLabels: { environment: 'production' }\n * });\n *\n * // Refresh metrics from registry\n * await exporter.refresh();\n *\n * // Get Prometheus text format\n * const output = await exporter.getMetrics();\n * console.log(output);\n * ```\n */\nexport class PrometheusExporter {\n private readonly telemetryRegistry: typeof defaultRegistry;\n private namespace: string;\n private subsystem: string;\n private readonly defaultLabels: Record<string, string>;\n private readonly helpText: Record<string, string>;\n private readonly metricsEnabled: boolean;\n private readonly recordClientLabel: boolean;\n private readonly moduleMetricsEnabled: boolean;\n\n // prom-client types unavailable at compile time (optional peer dependency)\n // Using 'any' with runtime validation - see file header comment for rationale\n // biome-ignore lint/suspicious/noExplicitAny: prom-client is optional peer dependency\n private promClient: any = null;\n // biome-ignore lint/suspicious/noExplicitAny: prom-client Registry type unavailable at compile time\n private promRegistry: any = null;\n // biome-ignore lint/suspicious/noExplicitAny: prom-client Counter type unavailable at compile time\n private counters: Map<string, any> = new Map();\n // biome-ignore lint/suspicious/noExplicitAny: prom-client Gauge type unavailable at compile time\n private gauges: Map<string, any> = new Map();\n // biome-ignore lint/suspicious/noExplicitAny: prom-client Histogram type unavailable at compile time\n private histograms: Map<string, any> = new Map();\n\n // Statistics\n private refreshCount = 0;\n private errorCount = 0;\n private lastRefreshTime: string | null = null;\n\n // Background refresh loop\n private refreshInterval: NodeJS.Timeout | null = null;\n private refreshPromise: Promise<void> | null = null;\n private isRefreshing = false;\n\n /**\n * Create Prometheus exporter\n *\n * @param options - Exporter configuration\n * @throws {InvalidLabelNameError} If default label names are invalid\n */\n constructor(options: PrometheusExporterOptions = {}) {\n this.telemetryRegistry = options.registry || defaultRegistry;\n this.defaultLabels = options.defaultLabels || {};\n this.helpText = options.helpText || {};\n this.metricsEnabled = options.metricsEnabled ?? true;\n this.recordClientLabel = options.recordClientLabel ?? false;\n this.moduleMetricsEnabled = options.moduleMetricsEnabled ?? true;\n\n // Validate default label names\n for (const labelName of Object.keys(this.defaultLabels)) {\n this.validateLabelName(labelName);\n }\n\n // Initialize namespace and subsystem\n // May be overridden by App Identity in init()\n this.namespace = options.namespace || \"tsfulmen\";\n this.subsystem = options.subsystem || \"app\";\n }\n\n /**\n * Initialize exporter (async setup)\n *\n * Loads prom-client and optionally loads App Identity for namespace/subsystem.\n * Called automatically on first refresh() or getMetrics() call.\n *\n * @throws {PromClientNotFoundError} If prom-client not installed\n */\n private async init(): Promise<void> {\n if (this.promClient) {\n return; // Already initialized\n }\n\n // Lazy load prom-client (peer dependency)\n try {\n this.promClient = await import(\"prom-client\");\n this.promRegistry = new this.promClient.Registry();\n } catch (err) {\n throw new PromClientNotFoundError(err);\n }\n\n // Try to load App Identity for namespace/subsystem (optional)\n if (this.namespace === \"tsfulmen\" || this.subsystem === \"app\") {\n try {\n const { loadIdentity } = await import(\"../../appidentity/index.js\");\n const identity = await loadIdentity({ skipValidation: true });\n\n if (this.namespace === \"tsfulmen\" && identity.app.vendor) {\n this.namespace = identity.app.vendor;\n }\n if (this.subsystem === \"app\" && identity.app.binary_name) {\n this.subsystem = identity.app.binary_name;\n }\n } catch {\n // App Identity not available - use defaults\n }\n }\n }\n\n /**\n * Safely emit instrumentation metric (silently fails if registry doesn't support it)\n * Used to avoid breaking tests that use mock registries\n */\n private safeInstrument(fn: () => void): void {\n try {\n fn();\n } catch {\n // Silently ignore instrumentation failures (e.g., mock registries in tests)\n }\n }\n\n /**\n * Refresh metrics from TelemetryRegistry\n *\n * Exports current metrics from TelemetryRegistry and updates Prometheus collectors.\n * Emits instrumentation metrics per Crucible v0.2.7 taxonomy.\n *\n * @throws {RefreshError} If refresh operation fails. Inspect `error.cause` for the\n * underlying error (InvalidMetricNameError, MetricRegistrationError, etc.) to handle\n * specific failure conditions.\n */\n async refresh(): Promise<void> {\n const startTime = performance.now();\n\n // Set inflight gauge to 1\n this.safeInstrument(() => {\n this.telemetryRegistry.gauge(PROMETHEUS_EXPORTER_METRICS.REFRESH_INFLIGHT).set(1);\n });\n\n try {\n // Phase: collect - export from telemetry registry\n await this.init();\n const events = await this.telemetryRegistry.export();\n\n // Phase: convert - update Prometheus collectors\n for (const event of events) {\n this.updateCollector(event);\n }\n\n // Success metrics\n this.refreshCount++;\n this.lastRefreshTime = new Date().toISOString();\n\n const durationMs = performance.now() - startTime;\n\n // Emit success metrics\n this.safeInstrument(() => {\n this.telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.REFRESH_TOTAL)\n .inc(1, { result: EXPORTER_LABELS.RESULT_SUCCESS });\n\n this.telemetryRegistry\n .histogram(PROMETHEUS_EXPORTER_METRICS.REFRESH_DURATION_SECONDS, {\n buckets: [...ADR0007_BUCKETS_SECONDS],\n })\n .observe(msToSeconds(durationMs), {\n phase: EXPORTER_LABELS.PHASE_EXPORT,\n result: EXPORTER_LABELS.RESULT_SUCCESS,\n });\n });\n } catch (err) {\n this.errorCount++;\n\n const durationMs = performance.now() - startTime;\n\n // Classify error type\n let errorType: string = EXPORTER_LABELS.ERROR_OTHER;\n if (err instanceof InvalidMetricNameError || err instanceof InvalidLabelNameError) {\n errorType = EXPORTER_LABELS.ERROR_VALIDATION;\n } else if (err instanceof MetricRegistrationError) {\n errorType = EXPORTER_LABELS.ERROR_OTHER;\n }\n\n // Emit error metrics\n this.safeInstrument(() => {\n this.telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.REFRESH_TOTAL)\n .inc(1, { result: EXPORTER_LABELS.RESULT_ERROR });\n\n this.telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.REFRESH_ERRORS_TOTAL)\n .inc(1, { error_type: errorType });\n\n this.telemetryRegistry\n .histogram(PROMETHEUS_EXPORTER_METRICS.REFRESH_DURATION_SECONDS, {\n buckets: [...ADR0007_BUCKETS_SECONDS],\n })\n .observe(msToSeconds(durationMs), {\n phase: EXPORTER_LABELS.PHASE_EXPORT,\n result: EXPORTER_LABELS.RESULT_ERROR,\n });\n });\n\n throw new RefreshError(err, {\n refreshCount: this.refreshCount,\n errorCount: this.errorCount,\n });\n } finally {\n // Clear inflight gauge\n this.safeInstrument(() => {\n this.telemetryRegistry.gauge(PROMETHEUS_EXPORTER_METRICS.REFRESH_INFLIGHT).set(0);\n });\n }\n }\n\n /**\n * Get Prometheus metrics in text format\n *\n * Returns metrics in Prometheus exposition text format.\n *\n * @returns Prometheus text format string\n */\n async getMetrics(): Promise<string> {\n await this.init();\n\n if (!this.promRegistry) {\n throw new Error(\"Prometheus registry not initialized\");\n }\n\n return this.promRegistry.metrics();\n }\n\n /**\n * Get exporter statistics\n */\n getStats(): ExporterStats {\n return {\n refreshCount: this.refreshCount,\n errorCount: this.errorCount,\n lastRefreshTime: this.lastRefreshTime,\n metricsCount: this.counters.size + this.gauges.size + this.histograms.size,\n isRefreshing: this.isRefreshing,\n };\n }\n\n /**\n * Get current metrics configuration\n *\n * Returns effective configuration being used by exporter,\n * including defaults for any unspecified options.\n *\n * @returns Current metrics configuration\n */\n getMetricsConfig() {\n return {\n metricsEnabled: this.metricsEnabled,\n recordClientLabel: this.recordClientLabel,\n moduleMetricsEnabled: this.moduleMetricsEnabled,\n namespace: this.namespace,\n subsystem: this.subsystem,\n defaultLabels: { ...this.defaultLabels },\n helpText: { ...this.helpText },\n };\n }\n\n /**\n * Get underlying prom-client Registry\n *\n * Returns null if not yet initialized.\n * Use for advanced prom-client operations.\n */\n // biome-ignore lint/suspicious/noExplicitAny: Returns prom-client Registry type (optional peer dependency)\n getRegistry(): any {\n return this.promRegistry;\n }\n\n /**\n * Get telemetry registry for self-instrumentation\n *\n * Returns the MetricsRegistry instance used for exporter self-instrumentation.\n * Useful for HTTP handler instrumentation.\n *\n * @internal\n */\n getTelemetryRegistry(): typeof defaultRegistry {\n return this.telemetryRegistry;\n }\n\n /**\n * Emit restart metric\n *\n * Records a restart event for tracking exporter or server restarts.\n * Use this when restarting the HTTP metrics server or other exporter components.\n *\n * @param reason - Reason for restart (config_change, error, manual, other)\n *\n * @example\n * ```typescript\n * // Restart server after config change\n * await stopMetricsServer(server);\n * exporter.recordRestart('config_change');\n * const newServer = await startMetricsServer(exporter, newConfig);\n * ```\n */\n recordRestart(reason: \"config_change\" | \"error\" | \"manual\" | \"other\"): void {\n this.safeInstrument(() => {\n this.telemetryRegistry.counter(PROMETHEUS_EXPORTER_METRICS.RESTARTS_TOTAL).inc(1, { reason });\n });\n }\n\n /**\n * Reset all metrics\n */\n reset(): void {\n if (this.promRegistry) {\n this.promRegistry.clear();\n }\n this.counters.clear();\n this.gauges.clear();\n this.histograms.clear();\n }\n\n /**\n * Start background refresh loop\n *\n * Automatically refreshes metrics from TelemetryRegistry at specified interval.\n * Useful for long-running services where metrics should be continuously updated.\n *\n * @param options - Refresh configuration (interval, error handler)\n *\n * @example\n * ```typescript\n * const exporter = new PrometheusExporter({ registry: metrics });\n *\n * // Start refreshing every 15 seconds (default)\n * exporter.startRefresh();\n *\n * // Custom interval and error handling\n * exporter.startRefresh({\n * intervalMs: 10000,\n * onError: (err) => logger.error('Refresh failed:', err)\n * });\n * ```\n */\n startRefresh(options: RefreshOptions = {}): void {\n const intervalMs = options.intervalMs ?? 15000;\n const _isRestart = !!this.refreshInterval;\n\n // Stop existing refresh if running (restart scenario)\n if (this.refreshInterval) {\n this.stopRefresh();\n\n // Emit restart metric\n this.safeInstrument(() => {\n this.telemetryRegistry.counter(PROMETHEUS_EXPORTER_METRICS.RESTARTS_TOTAL).inc(1, {\n reason: options.restartReason || EXPORTER_LABELS.REASON_OTHER,\n });\n });\n }\n\n // Start refresh loop\n this.refreshInterval = setInterval(() => {\n // Don't start new refresh if one is already running (serialization)\n if (this.refreshPromise) {\n return;\n }\n\n this.refreshPromise = this.refresh()\n .catch((err) => {\n // Call error handler if provided\n if (options.onError) {\n options.onError(err as Error);\n }\n })\n .finally(() => {\n this.refreshPromise = null;\n });\n }, intervalMs);\n\n // Update stats to indicate refreshing\n this.isRefreshing = true;\n }\n\n /**\n * Stop background refresh loop\n *\n * Clears the refresh interval and performs one final refresh to capture\n * the latest metrics state before stopping.\n *\n * @example\n * ```typescript\n * // Graceful shutdown\n * await exporter.stopRefresh();\n * ```\n */\n async stopRefresh(): Promise<void> {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n this.refreshInterval = null;\n }\n\n // Wait for any in-flight refresh to complete\n if (this.refreshPromise) {\n await this.refreshPromise;\n }\n\n // Perform final refresh to capture latest state\n try {\n await this.refresh();\n } catch (_err) {\n // Log but don't throw during shutdown\n // Error is already tracked in stats\n }\n\n // Update stats to indicate not refreshing\n this.isRefreshing = false;\n }\n\n /**\n * Update Prometheus collector from MetricsEvent\n */\n private updateCollector(event: MetricsEvent): void {\n const metricName = this.formatMetricName(event.name);\n const help = this.getHelpText(event.name);\n const labelNames = Object.keys(this.defaultLabels);\n\n if (isHistogramSummary(event.value)) {\n this.updateHistogram(metricName, help, labelNames, event.value);\n } else if (typeof event.value === \"number\") {\n // Use Gauge for all scalar metrics (simplest approach)\n // TSFulmen doesn't distinguish Counter vs Gauge in export format\n this.updateGauge(metricName, help, labelNames, event.value);\n }\n }\n\n /**\n * Update or create Prometheus Gauge\n */\n private updateGauge(name: string, help: string, labelNames: string[], value: number): void {\n let gauge = this.gauges.get(name);\n if (!gauge) {\n try {\n gauge = new this.promClient.Gauge({\n name,\n help,\n labelNames,\n registers: [this.promRegistry],\n });\n this.gauges.set(name, gauge);\n } catch (err) {\n throw new MetricRegistrationError(name, err);\n }\n }\n\n gauge.labels(this.defaultLabels).set(value);\n }\n\n /**\n * Update or create Prometheus Histogram\n *\n * CRITICAL: Converts OTLP cumulative buckets to Prometheus format.\n * This is an approximation - see Phase 0 investigation for details.\n *\n * LIMITATION: Original observations cannot be perfectly reconstructed from bucket summary.\n * Percentiles will be approximate based on bucket midpoints.\n */\n // biome-ignore lint/suspicious/noExplicitAny: summary is HistogramSummary from TelemetryRegistry\n private updateHistogram(name: string, help: string, labelNames: string[], summary: any): void {\n // biome-ignore lint/suspicious/noExplicitAny: bucket type from HistogramSummary\n const buckets = summary.buckets.map((b: any) => b.le);\n\n let histogram = this.histograms.get(name);\n if (!histogram) {\n try {\n histogram = new this.promClient.Histogram({\n name,\n help,\n labelNames,\n buckets,\n registers: [this.promRegistry],\n });\n this.histograms.set(name, histogram);\n } catch (err) {\n throw new MetricRegistrationError(name, err);\n }\n }\n\n // Reconstruct observations from summary\n const observations = this.reconstructObservations(summary);\n for (const value of observations) {\n histogram.labels(this.defaultLabels).observe(value);\n }\n }\n\n /**\n * Reconstruct observations from histogram summary\n *\n * Converts OTLP cumulative bucket counts to approximate observation values.\n * Uses bucket midpoints to generate synthetic observations.\n *\n * LIMITATION: This is an approximation. Original observation values cannot be\n * perfectly reconstructed from bucket summaries. Percentiles will be approximate\n * based on bucket boundaries. This is acceptable for v0.1.8 initial release.\n *\n * TODO: Future enhancement - capture raw observations in TelemetryRegistry\n * for lossless Prometheus export. Track in Phase 2+ planning.\n * See: .plans/active/v0.2.x-plans/prometheus-type-safety-enhancement.md\n *\n * Algorithm:\n * 1. Calculate non-cumulative count for each bucket (delta between adjacent buckets)\n * 2. For each bucket, place observations at the midpoint between bucket boundaries\n * 3. Return array of synthetic observation values\n */\n // biome-ignore lint/suspicious/noExplicitAny: summary is HistogramSummary from TelemetryRegistry\n private reconstructObservations(summary: any): number[] {\n const observations: number[] = [];\n const buckets = summary.buckets;\n\n if (!buckets || buckets.length === 0) {\n return observations;\n }\n\n let prevCount = 0;\n for (let i = 0; i < buckets.length; i++) {\n const bucket = buckets[i];\n const count = bucket.count - prevCount; // Non-cumulative count for this bucket\n\n if (count > 0) {\n // Determine observation value (bucket midpoint)\n let value: number;\n if (i === 0) {\n // First bucket: midpoint between 0 and upper bound\n value = bucket.le / 2;\n } else {\n // Other buckets: midpoint between previous and current upper bound\n const prevLe = buckets[i - 1].le;\n value = (prevLe + bucket.le) / 2;\n }\n\n // Add 'count' observations at this value\n for (let j = 0; j < count; j++) {\n observations.push(value);\n }\n }\n\n prevCount = bucket.count;\n }\n\n return observations;\n }\n\n /**\n * Format metric name with namespace and subsystem prefix\n *\n * Format: {namespace}_{subsystem}_{metric}\n * Example: fulmen_myapp_schema_validations\n */\n private formatMetricName(name: string): string {\n this.validateMetricName(name);\n return `${this.namespace}_${this.subsystem}_${name}`;\n }\n\n /**\n * Get help text for metric\n *\n * Uses custom help text if provided, otherwise generates default.\n */\n private getHelpText(name: string): string {\n if (this.helpText[name]) {\n return this.helpText[name];\n }\n return `TSFulmen metric: ${name}`;\n }\n\n /**\n * Validate Prometheus metric name\n *\n * Rules: Must start with [a-zA-Z_:] and contain only [a-zA-Z0-9_:]\n *\n * @throws {InvalidMetricNameError} If name is invalid\n */\n private validateMetricName(name: string): void {\n const validPattern = /^[a-zA-Z_:][a-zA-Z0-9_:]*$/;\n if (!validPattern.test(name)) {\n throw new InvalidMetricNameError(\n name,\n \"Metric names must start with [a-zA-Z_:] and contain only [a-zA-Z0-9_:]\",\n );\n }\n }\n\n /**\n * Validate Prometheus label name\n *\n * Rules: Must start with [a-zA-Z_] and contain only [a-zA-Z0-9_]\n *\n * @throws {InvalidLabelNameError} If name is invalid\n */\n private validateLabelName(name: string): void {\n const validPattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n if (!validPattern.test(name)) {\n throw new InvalidLabelNameError(\n name,\n \"Label names must start with [a-zA-Z_] and contain only [a-zA-Z0-9_]\",\n );\n }\n }\n}\n","/**\n * Prometheus exporter lifecycle integration\n *\n * Helpers for integrating PrometheusExporter with TSFulmen lifecycle management,\n * particularly signal handling for graceful shutdown.\n */\n\nimport type { SignalManager } from \"../../foundry/signals/index.js\";\nimport type { PrometheusExporter } from \"./exporter.js\";\n\n/**\n * Register Prometheus exporter shutdown handler\n *\n * Automatically stops the background refresh loop and performs a final refresh\n * when SIGTERM or SIGINT is received. This ensures metrics are up-to-date\n * before the process terminates.\n *\n * @param exporter - PrometheusExporter instance to manage\n * @param manager - SignalManager instance for lifecycle coordination\n *\n * @example\n * ```typescript\n * import { PrometheusExporter, registerPrometheusShutdown } from '@fulmenhq/tsfulmen/telemetry/prometheus';\n * import { createSignalManager } from '@fulmenhq/tsfulmen/foundry/signals';\n *\n * const exporter = new PrometheusExporter({ registry: metrics });\n * const signalManager = createSignalManager();\n *\n * // Register graceful shutdown\n * await registerPrometheusShutdown(exporter, signalManager);\n *\n * // Start refresh loop\n * exporter.startRefresh({ intervalMs: 15000 });\n *\n * // When SIGTERM/SIGINT received, exporter will:\n * // 1. Stop refresh loop\n * // 2. Perform final refresh\n * // 3. Allow process to exit gracefully\n * ```\n */\nexport async function registerPrometheusShutdown(\n exporter: PrometheusExporter,\n manager: SignalManager,\n): Promise<void> {\n const shutdownHandler = async () => {\n await exporter.stopRefresh();\n };\n\n // Register for both SIGTERM and SIGINT\n await manager.register(\"SIGTERM\", shutdownHandler);\n await manager.register(\"SIGINT\", shutdownHandler);\n}\n","/**\n * Core types for progressive logging interface\n */\n\n/**\n * Logging profile enum matching cross-language standard\n */\nexport enum LoggingProfile {\n /**\n * Basic logging for CLI tools and simple applications.\n *\n * Features:\n * - Console output only\n * - Basic severity levels (DEBUG, INFO, WARN, ERROR)\n * - Simple string formatting\n * - No correlation/middleware support\n */\n SIMPLE = \"simple\",\n\n /**\n * Structured logging with basic enterprise features.\n *\n * Features:\n * - JSON output with core envelope fields\n * - Correlation and request IDs\n * - Basic middleware (redaction)\n * - Console and file sinks\n * - No throttling/advanced features\n */\n STRUCTURED = \"structured\",\n\n /**\n * Full enterprise logging with all features.\n *\n * Features:\n * - Complete JSON envelope (20+ fields)\n * - Full correlation/trace support\n * - Complete middleware pipeline\n * - Multiple sink types with rotation\n * - Throttling and backpressure\n * - Performance optimization\n */\n ENTERPRISE = \"enterprise\",\n\n /**\n * User-defined configuration with explicit parameters.\n *\n * Features:\n * - Full parameter control\n * - Custom sink/middleware combinations\n * - Advanced configuration options\n */\n CUSTOM = \"custom\",\n}\n\n/**\n * Base logger configuration\n */\nexport interface BaseLoggerConfig {\n service: string;\n profile: LoggingProfile;\n policyFile?: string;\n}\n\n/**\n * Profile-specific configurations using discriminated unions\n */\nexport type LoggerConfig =\n | ({ profile: LoggingProfile.SIMPLE } & BaseLoggerConfig)\n | ({\n profile: LoggingProfile.STRUCTURED;\n filePath?: string;\n middleware?: Middleware[];\n } & BaseLoggerConfig)\n | ({\n profile: LoggingProfile.ENTERPRISE;\n sinks?: Sink[];\n middleware?: Middleware[];\n } & BaseLoggerConfig)\n | ({\n profile: LoggingProfile.CUSTOM;\n customConfig: CustomLoggerConfig;\n } & BaseLoggerConfig);\n\n/**\n * Custom configuration for CUSTOM profile\n */\nexport interface CustomLoggerConfig {\n sinks: Sink[];\n middleware?: Middleware[];\n throttling?: ThrottlingConfig;\n envelope?: EnvelopeConfig;\n}\n\n/**\n * Log context for structured/enterprise profiles\n */\nexport interface LogContext {\n correlationId?: string;\n requestId?: string;\n userId?: string | number;\n traceId?: string;\n spanId?: string;\n [key: string]: unknown;\n}\n\n/**\n * Sink interface for log output destinations\n */\nexport interface Sink {\n write(event: LogEvent): void;\n}\n\n/**\n * Middleware interface for log processing pipeline\n */\nexport interface Middleware {\n process(event: LogEvent): LogEvent;\n}\n\n/**\n * Base log event interface\n */\nexport interface LogEvent {\n timestamp: string;\n service: string;\n severity: string;\n message: string;\n [key: string]: unknown;\n}\n\n/**\n * Enterprise log event with full envelope\n */\nexport interface EnterpriseLogEvent extends LogEvent {\n correlationId: string;\n requestId?: string;\n traceId?: string;\n spanId?: string;\n userId?: string | number;\n host?: string;\n pid?: number;\n version?: string;\n environment?: string;\n region?: string;\n zone?: string;\n instanceId?: string;\n cluster?: string;\n namespace?: string;\n deployment?: string;\n component?: string;\n module?: string;\n function?: string;\n line?: number;\n stackTrace?: string;\n}\n\n/**\n * Throttling configuration\n */\nexport interface ThrottlingConfig {\n maxPerSecond: number;\n maxPerMinute?: number;\n burstSize?: number;\n}\n\n/**\n * Envelope configuration\n */\nexport interface EnvelopeConfig {\n includeStackTrace?: boolean;\n includeHostInfo?: boolean;\n includeProcessInfo?: boolean;\n customFields?: Record<string, unknown>;\n}\n\n/**\n * Logger implementation interface\n */\nexport interface LoggerImplementation {\n debug(message: string, context?: LogContext): void;\n info(message: string, context?: LogContext): void;\n warn(message: string, context?: LogContext): void;\n error(message: string, error?: Error, context?: LogContext): void;\n child(bindings: Record<string, unknown>): LoggerImplementation;\n}\n\n/**\n * Logging policy definition\n */\nexport interface LoggingPolicy {\n allowedProfiles: LoggingProfile[];\n requiredProfiles?: Record<string, LoggingProfile[]>;\n environmentRules?: Record<string, LoggingProfile[]>;\n customRequirements?: Record<string, unknown>;\n}\n\n/**\n * Policy error thrown when profile not allowed\n */\nexport class PolicyError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PolicyError\";\n }\n}\n","/**\n * Policy enforcement for progressive logging profiles\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport { type LoggingPolicy, LoggingProfile, PolicyError } from \"./types.js\";\n\n/**\n * Options for profile validation\n */\nexport interface PolicyValidationOptions {\n appType?: string;\n environment?: string;\n}\n\n/**\n * Policy enforcer for validating logging profiles against organizational policies\n */\nexport class PolicyEnforcer {\n private readonly policy: LoggingPolicy;\n private readonly policyFile: string;\n\n /**\n * Create a new policy enforcer\n *\n * @param policyFile - Path to YAML policy file\n * @throws {PolicyError} If policy file cannot be loaded or is invalid\n */\n constructor(policyFile: string) {\n this.policyFile = policyFile;\n this.policy = this.loadPolicy(policyFile);\n }\n\n /**\n * Validate if a profile is allowed under the current policy\n *\n * @param profile - The logging profile to validate\n * @param options - Optional validation context (appType, environment)\n * @returns true if profile is allowed, false otherwise\n *\n * @example\n * const enforcer = new PolicyEnforcer('/org/logging-policy.yaml');\n * if (enforcer.validateProfile(LoggingProfile.ENTERPRISE, { environment: 'production' })) {\n * // Profile is allowed\n * }\n */\n validateProfile(profile: LoggingProfile, options?: PolicyValidationOptions): boolean {\n // Check if profile is in allowed list\n if (!this.policy.allowedProfiles.includes(profile)) {\n return false;\n }\n\n // Check environment-specific rules if environment provided\n if (options?.environment && this.policy.environmentRules) {\n const envRules = this.policy.environmentRules[options.environment];\n if (envRules && !envRules.includes(profile)) {\n return false;\n }\n }\n\n // Check app-type specific requirements if appType provided\n if (options?.appType && this.policy.requiredProfiles) {\n const appTypeRules = this.policy.requiredProfiles[options.appType];\n if (appTypeRules && !appTypeRules.includes(profile)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Get the required profile for a given app type and environment\n *\n * @param appType - The application type\n * @param environment - The deployment environment\n * @returns The required logging profile\n * @throws {PolicyError} If no required profile found for app type\n *\n * @example\n * const enforcer = new PolicyEnforcer('/org/logging-policy.yaml');\n * const profile = enforcer.getRequiredProfile('api-server', 'production');\n * // Returns LoggingProfile.ENTERPRISE\n */\n getRequiredProfile(appType: string, environment: string): LoggingProfile {\n // Check required profiles by app type\n if (this.policy.requiredProfiles?.[appType]) {\n const profiles = this.policy.requiredProfiles[appType];\n\n // If environment rules exist, filter by environment\n if (this.policy.environmentRules?.[environment]) {\n const envProfiles = this.policy.environmentRules[environment];\n const validProfiles = profiles.filter((p) => envProfiles.includes(p));\n\n if (validProfiles.length > 0) {\n // Return most restrictive (highest in enum order)\n return this.getMostRestrictiveProfile(validProfiles);\n }\n }\n\n // Return most restrictive from app type requirements\n return this.getMostRestrictiveProfile(profiles);\n }\n\n throw new PolicyError(\n `No required profile found for app type \"${appType}\" in policy ${this.policyFile}`,\n );\n }\n\n /**\n * Get a helpful error message for policy validation failure\n *\n * @param profile - The profile that failed validation\n * @param options - The validation options used\n * @returns A descriptive error message\n */\n getValidationErrorMessage(profile: LoggingProfile, options?: PolicyValidationOptions): string {\n const parts: string[] = [`Profile \"${profile}\" not allowed by policy \"${this.policyFile}\".`];\n\n if (options?.environment) {\n parts.push(`Environment: ${options.environment}`);\n }\n\n if (options?.appType) {\n parts.push(`App Type: ${options.appType}`);\n }\n\n parts.push(`Allowed profiles: ${this.policy.allowedProfiles.join(\", \")}`);\n\n if (options?.environment && this.policy.environmentRules?.[options.environment]) {\n const envProfiles = this.policy.environmentRules[options.environment];\n parts.push(`Environment \"${options.environment}\" allows: ${envProfiles.join(\", \")}`);\n }\n\n if (options?.appType && this.policy.requiredProfiles?.[options.appType]) {\n const appProfiles = this.policy.requiredProfiles[options.appType];\n parts.push(`App type \"${options.appType}\" requires: ${appProfiles.join(\", \")}`);\n }\n\n return parts.join(\" | \");\n }\n\n /**\n * Load and parse the policy file\n *\n * @param policyFile - Path to YAML policy file\n * @returns Parsed logging policy\n * @throws {PolicyError} If file cannot be read or parsed\n */\n private loadPolicy(policyFile: string): LoggingPolicy {\n try {\n const content = readFileSync(policyFile, \"utf-8\");\n const parsed = parseYaml(content) as LoggingPolicy;\n\n // Validate required fields\n if (!parsed.allowedProfiles || !Array.isArray(parsed.allowedProfiles)) {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: missing or invalid \"allowedProfiles\" field`,\n );\n }\n\n // Ensure all profile values are valid\n const validProfiles = Object.values(LoggingProfile);\n for (const profile of parsed.allowedProfiles) {\n if (!validProfiles.includes(profile)) {\n throw new PolicyError(`Invalid policy file ${policyFile}: unknown profile \"${profile}\"`);\n }\n }\n\n // Validate requiredProfiles structure if present\n if (parsed.requiredProfiles) {\n if (typeof parsed.requiredProfiles !== \"object\") {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: \"requiredProfiles\" must be an object`,\n );\n }\n\n for (const [appType, profiles] of Object.entries(parsed.requiredProfiles)) {\n if (!Array.isArray(profiles)) {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: requiredProfiles[\"${appType}\"] must be an array, got ${typeof profiles}. ` +\n \"Check YAML formatting - each profile should be on a new line with a hyphen.\",\n );\n }\n\n for (const profile of profiles) {\n if (!validProfiles.includes(profile)) {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: requiredProfiles[\"${appType}\"] contains unknown profile \"${profile}\"`,\n );\n }\n }\n }\n }\n\n // Validate environmentRules structure if present\n if (parsed.environmentRules) {\n if (typeof parsed.environmentRules !== \"object\") {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: \"environmentRules\" must be an object`,\n );\n }\n\n for (const [environment, profiles] of Object.entries(parsed.environmentRules)) {\n if (!Array.isArray(profiles)) {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: environmentRules[\"${environment}\"] must be an array, got ${typeof profiles}. ` +\n \"Check YAML formatting - each profile should be on a new line with a hyphen.\",\n );\n }\n\n for (const profile of profiles) {\n if (!validProfiles.includes(profile)) {\n throw new PolicyError(\n `Invalid policy file ${policyFile}: environmentRules[\"${environment}\"] contains unknown profile \"${profile}\"`,\n );\n }\n }\n }\n }\n\n return parsed;\n } catch (error) {\n if (error instanceof PolicyError) {\n throw error;\n }\n\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new PolicyError(`Policy file not found: ${policyFile}`);\n }\n\n throw new PolicyError(\n `Failed to load policy file ${policyFile}: ${(error as Error).message}`,\n );\n }\n }\n\n /**\n * Get the most restrictive profile from a list\n * Order: CUSTOM > ENTERPRISE > STRUCTURED > SIMPLE\n *\n * @param profiles - List of profiles\n * @returns The most restrictive profile\n */\n private getMostRestrictiveProfile(profiles: LoggingProfile[]): LoggingProfile {\n const order = [\n LoggingProfile.CUSTOM,\n LoggingProfile.ENTERPRISE,\n LoggingProfile.STRUCTURED,\n LoggingProfile.SIMPLE,\n ];\n\n for (const profile of order) {\n if (profiles.includes(profile)) {\n return profile;\n }\n }\n\n // Fallback to first in list (shouldn't happen with valid input)\n return profiles[0];\n }\n}\n","/**\n * Sink implementations for log output destinations\n */\n\nimport { appendFileSync } from \"node:fs\";\nimport type { LogEvent, Sink } from \"./types.js\";\n\n/**\n * Console sink - writes log events to stdout as JSON\n */\nexport class ConsoleSink implements Sink {\n write(event: LogEvent): void {\n console.log(JSON.stringify(event));\n }\n}\n\n/**\n * File sink - appends log events to a file as JSON\n */\nexport class FileSink implements Sink {\n constructor(private readonly filePath: string) {}\n\n write(event: LogEvent): void {\n try {\n appendFileSync(this.filePath, `${JSON.stringify(event)}\\n`);\n } catch (error) {\n // Log to stderr if file write fails to avoid losing the log\n console.error(`FileSink: Failed to write to ${this.filePath}:`, (error as Error).message);\n // Fall back to console\n console.log(JSON.stringify(event));\n }\n }\n}\n\n/**\n * Null sink - discards all log events (useful for testing or disabling logging)\n */\nexport class NullSink implements Sink {\n write(_event: LogEvent): void {\n // Intentionally do nothing\n }\n}\n","/**\n * Progressive logging interface with profile-driven configuration\n */\n\nimport { hostname } from \"node:os\";\nimport pino from \"pino\";\nimport { PolicyEnforcer } from \"./policy.js\";\nimport { ConsoleSink } from \"./sinks.js\";\nimport {\n type LogContext,\n type LogEvent,\n type LoggerConfig,\n type LoggerImplementation,\n LoggingProfile,\n type Middleware,\n PolicyError,\n type Sink,\n} from \"./types.js\";\n\n/**\n * Progressive logger with profile-based configuration\n */\nexport class Logger {\n private readonly service: string;\n private readonly profile: LoggingProfile;\n private readonly impl: LoggerImplementation;\n\n constructor(config: LoggerConfig) {\n this.service = config.service;\n this.profile = config.profile;\n\n // Validate against policy if provided\n if (config.policyFile) {\n this.validatePolicy(config.profile, config.policyFile);\n }\n\n // Create appropriate implementation\n this.impl = this.createImplementation(config);\n }\n\n debug(message: string, context?: LogContext): void {\n this.impl.debug(message, context);\n }\n\n info(message: string, context?: LogContext): void {\n this.impl.info(message, context);\n }\n\n warn(message: string, context?: LogContext): void {\n this.impl.warn(message, context);\n }\n\n error(message: string, error?: Error, context?: LogContext): void {\n this.impl.error(message, error, context);\n }\n\n child(bindings: Record<string, unknown>): Logger {\n const childLogger = Object.create(this);\n childLogger.impl = this.impl.child(bindings);\n return childLogger;\n }\n\n private validatePolicy(profile: LoggingProfile, policyFile: string): void {\n const enforcer = new PolicyEnforcer(policyFile);\n const appType = process.env.APP_TYPE;\n const environment = process.env.NODE_ENV;\n\n if (!enforcer.validateProfile(profile, { appType, environment })) {\n throw new PolicyError(enforcer.getValidationErrorMessage(profile, { appType, environment }));\n }\n }\n\n private createImplementation(config: LoggerConfig): LoggerImplementation {\n switch (config.profile) {\n case LoggingProfile.SIMPLE:\n return new SimpleLogger(config.service);\n case LoggingProfile.STRUCTURED: {\n const structuredConfig = config as Extract<\n LoggerConfig,\n { profile: LoggingProfile.STRUCTURED }\n >;\n return new StructuredLogger(\n structuredConfig.service,\n structuredConfig.filePath,\n structuredConfig.middleware,\n );\n }\n case LoggingProfile.ENTERPRISE:\n return new EnterpriseLogger(config.service, {\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - proper discriminated union handling in Phase 2\n sinks: (config as any).sinks,\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - proper discriminated union handling in Phase 2\n middleware: (config as any).middleware,\n });\n case LoggingProfile.CUSTOM:\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - proper discriminated union handling in Phase 2\n return new EnterpriseLogger(config.service, (config as any).customConfig);\n }\n }\n}\n\n/**\n * Simple logger implementation using Pino\n */\nclass SimpleLogger implements LoggerImplementation {\n private readonly pino: pino.Logger;\n\n constructor(private readonly service: string) {\n this.pino = pino({\n name: service,\n level: \"debug\",\n messageKey: \"message\",\n base: undefined,\n timestamp: false,\n formatters: {\n level: (label: string) => ({ severity: label.toUpperCase() }),\n // biome-ignore lint/suspicious/noExplicitAny: Pino formatter requires any type\n log: (object: any) => {\n return {\n service: this.service,\n ...object,\n };\n },\n },\n });\n }\n\n debug(message: string, context?: LogContext): void {\n this.pino.debug(context, message);\n }\n\n info(message: string, context?: LogContext): void {\n this.pino.info(context, message);\n }\n\n warn(message: string, context?: LogContext): void {\n this.pino.warn(context, message);\n }\n\n error(message: string, error?: Error, context?: LogContext): void {\n const errorContext = {\n ...context,\n ...(error && { error: error.message, stack: error.stack }),\n };\n this.pino.error(errorContext, message);\n }\n\n child(bindings: Record<string, unknown>): LoggerImplementation {\n const childPino = this.pino.child(bindings);\n const childLogger = Object.create(this);\n childLogger.pino = childPino;\n return childLogger;\n }\n}\n\n/**\n * Structured logger implementation using Pino with optional middleware\n */\nclass StructuredLogger implements LoggerImplementation {\n private readonly pino: pino.Logger;\n private readonly middleware: Middleware[];\n private readonly bindings: Record<string, unknown>;\n\n constructor(\n private readonly service: string,\n readonly filePath?: string,\n middleware?: Middleware[],\n bindings?: Record<string, unknown>,\n existingPino?: pino.Logger,\n ) {\n this.middleware = middleware ?? [];\n this.bindings = bindings ?? {};\n\n const config: pino.LoggerOptions = {\n name: service,\n level: \"debug\",\n messageKey: \"message\",\n base: undefined,\n timestamp: () => `,\"timestamp\":\"${new Date().toISOString()}\"`,\n formatters: {\n level: (label: string) => ({ severity: label.toUpperCase() }),\n // biome-ignore lint/suspicious/noExplicitAny: Pino formatter requires any type\n log: (object: any) => {\n return {\n service: this.service,\n ...object,\n };\n },\n },\n };\n\n // Configure output streams (console + optional file)\n this.pino =\n existingPino ??\n (filePath\n ? pino(\n config,\n pino.multistream([{ stream: process.stdout }, { stream: pino.destination(filePath) }]),\n )\n : pino(config));\n }\n\n debug(message: string, context?: LogContext): void {\n if (this.middleware.length > 0) {\n this.logWithMiddleware(\"DEBUG\", message, context);\n } else {\n this.pino.debug(context, message);\n }\n }\n\n info(message: string, context?: LogContext): void {\n if (this.middleware.length > 0) {\n this.logWithMiddleware(\"INFO\", message, context);\n } else {\n this.pino.info(context, message);\n }\n }\n\n warn(message: string, context?: LogContext): void {\n if (this.middleware.length > 0) {\n this.logWithMiddleware(\"WARN\", message, context);\n } else {\n this.pino.warn(context, message);\n }\n }\n\n error(message: string, error?: Error, context?: LogContext): void {\n const errorContext = {\n ...context,\n ...(error && { error: error.message, stack: error.stack }),\n };\n if (this.middleware.length > 0) {\n this.logWithMiddleware(\"ERROR\", message, errorContext);\n } else {\n this.pino.error(errorContext, message);\n }\n }\n\n private logWithMiddleware(severity: string, message: string, context?: LogContext): void {\n // Build base log event\n let event: LogEvent = {\n timestamp: new Date().toISOString(),\n service: this.service,\n severity,\n message,\n ...this.bindings,\n ...context,\n };\n\n // Apply middleware pipeline\n for (const mw of this.middleware) {\n event = mw.process(event);\n }\n\n // Extract final message and context for Pino\n const { message: finalMessage, severity: finalSeverity, ...finalContext } = event;\n\n // Log through Pino with appropriate level\n const level = (finalSeverity || severity).toLowerCase();\n switch (level) {\n case \"debug\":\n this.pino.debug(finalContext, finalMessage);\n break;\n case \"info\":\n this.pino.info(finalContext, finalMessage);\n break;\n case \"warn\":\n this.pino.warn(finalContext, finalMessage);\n break;\n case \"error\":\n this.pino.error(finalContext, finalMessage);\n break;\n default:\n this.pino.info(finalContext, finalMessage);\n }\n }\n\n child(bindings: Record<string, unknown>): LoggerImplementation {\n const mergedBindings = { ...this.bindings, ...bindings };\n const childPino = this.pino.child(bindings);\n return new StructuredLogger(\n this.service,\n this.filePath,\n this.middleware,\n mergedBindings,\n childPino,\n );\n }\n}\n\n/**\n * Enterprise logger implementation using Pino\n */\nclass EnterpriseLogger implements LoggerImplementation {\n private readonly sinks: Sink[];\n private readonly middleware: Middleware[];\n private readonly bindings: Record<string, unknown>;\n\n constructor(\n private readonly service: string,\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - proper discriminated union handling in Phase 2\n config?: any,\n bindings?: Record<string, unknown>,\n ) {\n this.sinks = config?.sinks ?? [new ConsoleSink()];\n this.middleware = config?.middleware ?? [];\n this.bindings = bindings ?? {};\n }\n\n debug(message: string, context?: LogContext): void {\n this.logWithPipeline(\"DEBUG\", message, context);\n }\n\n info(message: string, context?: LogContext): void {\n this.logWithPipeline(\"INFO\", message, context);\n }\n\n warn(message: string, context?: LogContext): void {\n this.logWithPipeline(\"WARN\", message, context);\n }\n\n error(message: string, error?: Error, context?: LogContext): void {\n const errorContext = {\n ...context,\n ...(error && {\n error: error.message,\n stack: error.stack,\n errorType: error.constructor.name,\n }),\n };\n this.logWithPipeline(\"ERROR\", message, errorContext);\n }\n\n private logWithPipeline(severity: string, message: string, context?: LogContext): void {\n // Create enterprise log event\n let event: LogEvent = {\n timestamp: new Date().toISOString(),\n service: this.service,\n severity,\n message,\n correlationId: context?.correlationId ?? this.generateCorrelationId(),\n host: this.getHostname(),\n pid: process.pid,\n ...this.bindings,\n ...context,\n };\n\n // Apply middleware pipeline\n for (const mw of this.middleware) {\n event = mw.process(event);\n }\n\n // Emit to all sinks\n for (const sink of this.sinks) {\n sink.write(event);\n }\n }\n\n child(bindings: Record<string, unknown>): LoggerImplementation {\n const mergedBindings = { ...this.bindings, ...bindings };\n return new EnterpriseLogger(\n this.service,\n {\n sinks: this.sinks,\n middleware: this.middleware,\n },\n mergedBindings,\n );\n }\n\n private generateCorrelationId(): string {\n // Simple correlation ID generation - will be enhanced in Phase 2\n return `corr-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n private getHostname(): string {\n try {\n return hostname();\n } catch {\n return process.env.HOSTNAME || \"unknown\";\n }\n }\n}\n","/**\n * Factory function for creating loggers with progressive interface\n */\n\nimport { Logger } from \"./logger.js\";\nimport { RedactSecretsMiddleware } from \"./middleware.js\";\nimport { type LoggerConfig, LoggingProfile } from \"./types.js\";\n\n/**\n * Create a logger with the specified configuration\n *\n * @param config - Logger configuration\n * @returns Configured logger instance\n *\n * @example\n * // Simple logger for CLI\n * const logger = createLogger({\n * service: 'mycli',\n * profile: LoggingProfile.SIMPLE\n * });\n *\n * @example\n * // Structured logger with file output\n * const logger = createLogger({\n * service: 'myapp',\n * profile: LoggingProfile.STRUCTURED,\n * filePath: '/var/log/app.log'\n * });\n */\nexport function createLogger(config: LoggerConfig): Logger {\n return new Logger(config);\n}\n\n/**\n * Create a simple logger for CLI tools\n *\n * @param service - Service name\n * @returns Simple logger instance\n */\nexport function createSimpleLogger(service: string): Logger {\n return new Logger({\n service,\n profile: LoggingProfile.SIMPLE,\n });\n}\n\n/**\n * Create a structured logger with JSON output\n *\n * @param service - Service name\n * @param filePath - Optional file path for log output\n * @returns Structured logger instance\n */\nexport function createStructuredLogger(service: string, filePath?: string): Logger {\n return new Logger({\n service,\n profile: LoggingProfile.STRUCTURED,\n filePath,\n });\n}\n\n/**\n * Create an enterprise logger with full features\n *\n * @param service - Service name\n * @param options - Enterprise options (sinks, middleware, etc.)\n * @returns Enterprise logger instance\n */\nexport function createEnterpriseLogger(\n service: string,\n options?: {\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - Sink type to be properly defined in Phase 2\n sinks?: any[];\n // biome-ignore lint/suspicious/noExplicitAny: Phase 1 - Middleware type to be properly defined in Phase 2\n middleware?: any[];\n },\n): Logger {\n return new Logger({\n service,\n profile: LoggingProfile.ENTERPRISE,\n ...options,\n });\n}\n\n/**\n * Create a structured logger with default redaction middleware\n *\n * Enables secure logging with gofulmen-aligned secret redaction patterns.\n * Child loggers inherit both middleware chain and bindings from parent.\n *\n * Default redaction patterns (can be disabled with useDefaultPatterns: false):\n * - SECRET_* environment variables\n * - *TOKEN*, *KEY* variants\n * - Base64 blobs (40+ characters)\n * - Email addresses\n * - Credit card numbers (13-19 digits)\n *\n * Default field names (case-insensitive):\n * - password, token, apiKey, authorization, secret\n * - cardNumber, cvv, ssn\n *\n * Middleware can modify event severity. The finalSeverity from middleware\n * output is honored in Pino logging, allowing middleware to downgrade noisy\n * errors to warnings or upgrade critical info to error.\n *\n * @param service - Service name\n * @param options - Configuration options\n * @returns Structured logger with redaction enabled\n *\n * @example\n * // Basic usage (default patterns)\n * const logger = createStructuredLoggerWithRedaction('api-server');\n *\n * @example\n * // Custom patterns only\n * const logger = createStructuredLoggerWithRedaction('api-server', {\n * useDefaultPatterns: false,\n * customPatterns: [/MY_CUSTOM_SECRET/g]\n * });\n *\n * @example\n * // Custom fields with default patterns\n * const logger = createStructuredLoggerWithRedaction('api-server', {\n * customFields: ['internalId', 'customerKey']\n * });\n *\n * @example\n * // With file output\n * const logger = createStructuredLoggerWithRedaction('api-server', {\n * filePath: '/var/log/app.log'\n * });\n */\nexport function createStructuredLoggerWithRedaction(\n service: string,\n options?: {\n filePath?: string;\n customPatterns?: RegExp[];\n customFields?: string[];\n useDefaultPatterns?: boolean; // default: true\n },\n): Logger {\n return new Logger({\n service,\n profile: LoggingProfile.STRUCTURED,\n filePath: options?.filePath,\n middleware: [\n new RedactSecretsMiddleware({\n secretKeys: options?.customFields,\n patterns: options?.customPatterns,\n useDefaultPatterns: options?.useDefaultPatterns,\n }),\n ],\n });\n}\n","/**\n * Prometheus HTTP server implementation\n *\n * Framework-agnostic HTTP handler and dev server for exposing Prometheus metrics.\n * Compatible with Node.js http, Express, Fastify, and other frameworks.\n */\n\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport { createServer } from \"node:http\";\nimport { createLogger, LoggingProfile } from \"../../logging/index.js\";\nimport type { MetricsRegistry } from \"../registry.js\";\nimport { PROMETHEUS_EXPORTER_METRICS } from \"./constants.js\";\nimport type { PrometheusExporter } from \"./exporter.js\";\nimport type { ServerOptions } from \"./types.js\";\n\n/**\n * Safe instrumentation helper for HTTP metrics\n *\n * Emits HTTP metrics to provided registry, silently failing if registry\n * doesn't support operation (e.g., mock registries in tests).\n */\nfunction safeInstrumentHTTP(registry: MetricsRegistry | null, fn: () => void): void {\n if (!registry) return;\n try {\n fn();\n } catch {\n // Silently fail - instrumentation is non-critical\n }\n}\n\n/**\n * Get logger from exporter with metricsEnabled check\n */\nfunction getExporterLogger(exporter: PrometheusExporter) {\n // Access private logger property through type assertion\n // biome-ignore lint/suspicious/noExplicitAny: Need to access private logger property\n const exporterAny = exporter as any;\n const logger = exporterAny.logger;\n\n // Return null logger if metrics disabled\n return exporterAny.metricsEnabled ? logger : null;\n}\n\n/**\n * HTTP request context for hooks\n *\n * Provides minimal interface for auth and rate limiting hooks.\n * Compatible with Node.js IncomingMessage and framework request objects.\n */\nexport interface RequestContext {\n /** HTTP method (GET, POST, etc.) */\n method?: string;\n /** Request URL path */\n url?: string;\n /** Request headers */\n headers: Record<string, string | string[] | undefined>;\n /** Remote IP address */\n remoteAddress?: string;\n}\n\n/**\n * Extract request context from Node.js IncomingMessage\n */\nfunction extractRequestContext(req: IncomingMessage): RequestContext {\n return {\n method: req.method,\n url: req.url,\n headers: req.headers as Record<string, string | string[] | undefined>,\n remoteAddress: req.socket.remoteAddress,\n };\n}\n\n/**\n * Create Prometheus metrics HTTP handler\n *\n * Returns a framework-agnostic handler compatible with Node.js http, Express,\n * Fastify, and other frameworks. The handler serves Prometheus metrics in\n * text exposition format with optional authentication and rate limiting.\n *\n * @param exporter - PrometheusExporter instance\n * @param options - Server options (auth, rate limiting, refresh behavior)\n * @returns HTTP handler function\n *\n * @example\n * ```typescript\n * // Basic usage with Node.js http\n * import http from 'node:http';\n * import { PrometheusExporter, createMetricsHandler } from '@fulmenhq/tsfulmen/telemetry/prometheus';\n *\n * const exporter = new PrometheusExporter({ registry: metrics });\n * const handler = createMetricsHandler(exporter);\n *\n * const server = http.createServer(handler);\n * server.listen(9464);\n * ```\n *\n * @example\n * ```typescript\n * // With authentication\n * const handler = createMetricsHandler(exporter, {\n * authenticate: async (req) => {\n * const token = req.headers['authorization'];\n * return token === 'Bearer secret-token';\n * }\n * });\n * ```\n *\n * @example\n * ```typescript\n * // With rate limiting\n * const handler = createMetricsHandler(exporter, {\n * rateLimit: async (req) => {\n * const ip = req.remoteAddress;\n * return rateLimiter.checkLimit(ip);\n * }\n * });\n * ```\n */\nexport function createMetricsHandler(\n exporter: PrometheusExporter,\n options: ServerOptions = {},\n): (req: IncomingMessage, res: ServerResponse) => Promise<void> {\n const path = options.path ?? \"/metrics\";\n const refreshOnScrape = options.refreshOnScrape ?? false;\n const logger = getExporterLogger(exporter);\n\n return async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const telemetryRegistry = exporter.getTelemetryRegistry();\n let _statusCode = 200;\n const startTime = performance.now();\n\n try {\n // Extract request context for hooks\n const context = extractRequestContext(req);\n\n // Check path - only serve metrics on configured path\n if (req.url !== path) {\n _statusCode = 404;\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not Found\");\n\n // Emit HTTP request metric (4xx)\n safeInstrumentHTTP(telemetryRegistry, () => {\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL)\n .inc(1, { status: \"404\", path: req.url || \"unknown\" });\n });\n return;\n }\n\n // Check authentication if hook provided\n if (options.authenticate) {\n const authResult = await options.authenticate(context);\n if (!authResult) {\n _statusCode = 401;\n res.writeHead(401, {\n \"Content-Type\": \"text/plain\",\n \"WWW-Authenticate\": \"Bearer\",\n });\n res.end(\"Unauthorized\");\n\n // Emit HTTP request and error metrics (auth failure)\n safeInstrumentHTTP(telemetryRegistry, () => {\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL)\n .inc(1, { status: \"401\", path });\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_ERRORS_TOTAL)\n .inc(1, { status: \"401\", path });\n });\n return;\n }\n }\n\n // Check rate limit if hook provided\n if (options.rateLimit) {\n const rateLimitResult = await options.rateLimit(context);\n if (!rateLimitResult) {\n _statusCode = 429;\n res.writeHead(429, {\n \"Content-Type\": \"text/plain\",\n \"Retry-After\": \"60\",\n });\n res.end(\"Too Many Requests\");\n\n // Emit HTTP request metric (4xx rate limit)\n safeInstrumentHTTP(telemetryRegistry, () => {\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL)\n .inc(1, { status: \"429\", path });\n });\n return;\n }\n }\n\n // Refresh metrics if configured (optional, adds latency)\n if (refreshOnScrape) {\n await exporter.refresh();\n }\n\n // Get metrics in Prometheus text format\n const metrics = await exporter.getMetrics();\n\n // Send response with correct content-type\n // Prometheus text format version 0.0.4\n _statusCode = 200;\n res.writeHead(200, {\n \"Content-Type\": \"text/plain; version=0.0.4; charset=utf-8\",\n \"Content-Length\": Buffer.byteLength(metrics, \"utf-8\"),\n });\n res.end(metrics);\n\n // Emit HTTP request metric (2xx success)\n safeInstrumentHTTP(telemetryRegistry, () => {\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL)\n .inc(1, { status: \"200\", path });\n });\n } catch (err) {\n // Internal server error\n const errorMessage = err instanceof Error ? err.message : \"Internal Server Error\";\n\n _statusCode = 500;\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(`Error: ${errorMessage}`);\n\n // Emit HTTP request and error metrics (5xx failure)\n safeInstrumentHTTP(telemetryRegistry, () => {\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL)\n .inc(1, { status: \"500\", path });\n telemetryRegistry\n .counter(PROMETHEUS_EXPORTER_METRICS.HTTP_ERRORS_TOTAL)\n .inc(1, { status: \"500\", path });\n });\n } finally {\n // Log HTTP request completion\n if (logger) {\n const durationMs = performance.now() - startTime;\n const context = extractRequestContext(req);\n\n logger.info(\"HTTP request processed\", {\n metric_name: PROMETHEUS_EXPORTER_METRICS.HTTP_REQUESTS_TOTAL,\n status: _statusCode.toString(),\n path: req.url || \"unknown\",\n method: context.method || \"GET\",\n duration_ms: Math.round(durationMs),\n remote_address: context.remoteAddress,\n });\n }\n }\n };\n}\n\n/**\n * Start Prometheus metrics dev server\n *\n * Creates a standalone HTTP server for serving Prometheus metrics.\n * Useful for development, testing, and simple deployments without a full application framework.\n *\n * @param exporter - PrometheusExporter instance\n * @param options - Server configuration (host, port, path, auth, rate limiting)\n * @returns Promise that resolves to the HTTP Server instance\n *\n * @example\n * ```typescript\n * import { PrometheusExporter, startMetricsServer } from '@fulmenhq/tsfulmen/telemetry/prometheus';\n *\n * const exporter = new PrometheusExporter({ registry: metrics });\n *\n * // Start dev server\n * const server = await startMetricsServer(exporter, {\n * host: '127.0.0.1',\n * port: 9464,\n * path: '/metrics'\n * });\n *\n * console.log('Metrics server listening on http://127.0.0.1:9464/metrics');\n *\n * // Graceful shutdown\n * process.on('SIGTERM', async () => {\n * await stopMetricsServer(server);\n * });\n * ```\n */\nexport async function startMetricsServer(\n exporter: PrometheusExporter,\n options: ServerOptions = {},\n): Promise<Server> {\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 9464;\n const path = options.path ?? \"/metrics\";\n\n // Create handler with options\n const handler = createMetricsHandler(exporter, options);\n\n // Create HTTP server\n const server = createServer(handler);\n\n // Create logger for server operations (only if metrics enabled)\n const exporterLogger = getExporterLogger(exporter);\n const logger =\n exporterLogger ||\n createLogger({\n service: \"prometheus_exporter\",\n profile: LoggingProfile.STRUCTURED,\n });\n\n // Start listening\n return new Promise((resolve, reject) => {\n server.listen(port, host, () => {\n // Log server startup\n logger.info(\"Prometheus metrics server started\", {\n host,\n port,\n path,\n url: `http://${host}:${port}${path}`,\n });\n resolve(server);\n });\n\n server.on(\"error\", (err) => {\n // Log server error\n logger.error(\"Prometheus metrics server error\", err as Error, {\n host,\n port,\n path,\n });\n reject(err);\n });\n });\n}\n\n/**\n * Stop Prometheus metrics server\n *\n * Gracefully shuts down the HTTP server with a configurable timeout.\n * Closes all connections and waits for in-flight requests to complete.\n *\n * @param server - HTTP Server instance from startMetricsServer\n * @param timeoutMs - Timeout in milliseconds (default: 5000)\n * @returns Promise that resolves when server is closed\n *\n * @example\n * ```typescript\n * // Graceful shutdown with 5 second timeout\n * await stopMetricsServer(server);\n *\n * // Custom timeout\n * await stopMetricsServer(server, 10000);\n * ```\n */\nexport async function stopMetricsServer(\n server: Server,\n timeoutMs = 5000,\n exporter?: PrometheusExporter,\n): Promise<void> {\n // Create logger for server operations (only if metrics enabled)\n const exporterLogger = exporter ? getExporterLogger(exporter) : null;\n const logger =\n exporterLogger ||\n createLogger({\n service: \"prometheus_exporter\",\n profile: LoggingProfile.STRUCTURED,\n });\n\n return new Promise((resolve, reject) => {\n // Set timeout for forced shutdown\n const timeout = setTimeout(() => {\n logger.warn(\"Prometheus metrics server shutdown timed out, forcing close\", {\n timeout_ms: timeoutMs,\n });\n server.closeAllConnections?.(); // Available in Node.js 18.2+\n reject(new Error(`Server shutdown timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n\n // Graceful close\n server.close((err) => {\n clearTimeout(timeout);\n if (err) {\n logger.error(\"Error stopping Prometheus metrics server\", err, {\n timeout_ms: timeoutMs,\n });\n reject(err);\n } else {\n logger.info(\"Prometheus metrics server stopped\", {\n timeout_ms: timeoutMs,\n });\n resolve();\n }\n });\n\n // Close all connections immediately (allows graceful request completion)\n server.closeAllConnections?.(); // Available in Node.js 18.2+\n });\n}\n"]}
|