@fulmenhq/tsfulmen 0.3.3 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/CHANGELOG.md +76 -1
  2. package/README.md +30 -1
  3. package/config/crucible-ts/taxonomy/metrics.yaml +1 -1
  4. package/dist/appidentity/index.js +9 -2209
  5. package/dist/appidentity/index.js.map +1 -1
  6. package/dist/assets/index.d.ts +184 -0
  7. package/dist/assets/index.js +4 -0
  8. package/dist/assets/index.js.map +1 -0
  9. package/dist/bin/prometheus-cli.js +15 -9139
  10. package/dist/bin/prometheus-cli.js.map +1 -1
  11. package/dist/bin/schema-cli.js +4 -6098
  12. package/dist/bin/schema-cli.js.map +1 -1
  13. package/dist/bin/signals-cli.js +15 -1910
  14. package/dist/bin/signals-cli.js.map +1 -1
  15. package/dist/chunk-24BAF63H.js +194 -0
  16. package/dist/chunk-24BAF63H.js.map +1 -0
  17. package/dist/chunk-3HISR2XI.js +36 -0
  18. package/dist/chunk-3HISR2XI.js.map +1 -0
  19. package/dist/chunk-56F2EEAG.js +328 -0
  20. package/dist/chunk-56F2EEAG.js.map +1 -0
  21. package/dist/chunk-5HZEJGZ5.js +725 -0
  22. package/dist/chunk-5HZEJGZ5.js.map +1 -0
  23. package/dist/chunk-7YWACZEJ.js +837 -0
  24. package/dist/chunk-7YWACZEJ.js.map +1 -0
  25. package/dist/chunk-BCO3FUUO.js +682 -0
  26. package/dist/chunk-BCO3FUUO.js.map +1 -0
  27. package/dist/chunk-GOTEQYAD.js +410 -0
  28. package/dist/chunk-GOTEQYAD.js.map +1 -0
  29. package/dist/chunk-HY6JQOFN.js +32 -0
  30. package/dist/chunk-HY6JQOFN.js.map +1 -0
  31. package/dist/chunk-LMNAUTW7.js +43 -0
  32. package/dist/chunk-LMNAUTW7.js.map +1 -0
  33. package/dist/chunk-LWAH2UG7.js +103 -0
  34. package/dist/chunk-LWAH2UG7.js.map +1 -0
  35. package/dist/chunk-OHE2AOH4.js +273 -0
  36. package/dist/chunk-OHE2AOH4.js.map +1 -0
  37. package/dist/chunk-P3DNOZOG.js +1488 -0
  38. package/dist/chunk-P3DNOZOG.js.map +1 -0
  39. package/dist/chunk-PQ6TKPUN.js +27 -0
  40. package/dist/chunk-PQ6TKPUN.js.map +1 -0
  41. package/dist/chunk-QCCN6POA.js +211 -0
  42. package/dist/chunk-QCCN6POA.js.map +1 -0
  43. package/dist/chunk-QGTNV4U2.js +985 -0
  44. package/dist/chunk-QGTNV4U2.js.map +1 -0
  45. package/dist/chunk-RSLFR4TO.js +631 -0
  46. package/dist/chunk-RSLFR4TO.js.map +1 -0
  47. package/dist/chunk-SNV5WG5V.js +9412 -0
  48. package/dist/chunk-SNV5WG5V.js.map +1 -0
  49. package/dist/chunk-UP2VWCW5.js +33 -0
  50. package/dist/chunk-UP2VWCW5.js.map +1 -0
  51. package/dist/chunk-VJIGX7MH.js +208 -0
  52. package/dist/chunk-VJIGX7MH.js.map +1 -0
  53. package/dist/chunk-WCCMRVZF.js +130 -0
  54. package/dist/chunk-WCCMRVZF.js.map +1 -0
  55. package/dist/chunk-WSMVLWLB.js +269 -0
  56. package/dist/chunk-WSMVLWLB.js.map +1 -0
  57. package/dist/config/index.js +6 -1220
  58. package/dist/config/index.js.map +1 -1
  59. package/dist/crucible/fulpack/index.js +2 -25
  60. package/dist/crucible/fulpack/index.js.map +1 -1
  61. package/dist/crucible/index.js +13 -1129
  62. package/dist/crucible/index.js.map +1 -1
  63. package/dist/docscribe/index.js +2 -680
  64. package/dist/docscribe/index.js.map +1 -1
  65. package/dist/errors/index.js +5 -1831
  66. package/dist/errors/index.js.map +1 -1
  67. package/dist/errors-D7KXV3QW.js +4 -0
  68. package/dist/errors-D7KXV3QW.js.map +1 -0
  69. package/dist/errors-R7ZODJXS.js +8 -0
  70. package/dist/errors-R7ZODJXS.js.map +1 -0
  71. package/dist/export-EA3RNQNS.js +6 -0
  72. package/dist/export-EA3RNQNS.js.map +1 -0
  73. package/dist/foundry/index.js +340 -3949
  74. package/dist/foundry/index.js.map +1 -1
  75. package/dist/foundry/similarity/index.js +3 -134
  76. package/dist/foundry/similarity/index.js.map +1 -1
  77. package/dist/fulencode/index.js +3 -319
  78. package/dist/fulencode/index.js.map +1 -1
  79. package/dist/fulhash/index.js +3 -611
  80. package/dist/fulhash/index.js.map +1 -1
  81. package/dist/fulpack/index.js +3 -1515
  82. package/dist/fulpack/index.js.map +1 -1
  83. package/dist/hash-YOJYVOWH.js +4 -0
  84. package/dist/hash-YOJYVOWH.js.map +1 -0
  85. package/dist/index.d.ts +1 -1
  86. package/dist/index.js +14 -4395
  87. package/dist/index.js.map +1 -1
  88. package/dist/loader-VP2ZIC4O.js +9 -0
  89. package/dist/loader-VP2ZIC4O.js.map +1 -0
  90. package/dist/logging/index.js +2 -723
  91. package/dist/logging/index.js.map +1 -1
  92. package/dist/pathfinder/index.js +18 -2341
  93. package/dist/pathfinder/index.js.map +1 -1
  94. package/dist/prom-client-PNEBGD3G.js +4801 -0
  95. package/dist/prom-client-PNEBGD3G.js.map +1 -0
  96. package/dist/reports/license-inventory.csv +1 -1
  97. package/dist/schema/index.d.ts +19 -6
  98. package/dist/schema/index.js +4 -6148
  99. package/dist/schema/index.js.map +1 -1
  100. package/dist/signals/index.js +8 -2767
  101. package/dist/signals/index.js.map +1 -1
  102. package/dist/similarity/index.js +3 -134
  103. package/dist/similarity/index.js.map +1 -1
  104. package/dist/telemetry/http/index.js +9 -930
  105. package/dist/telemetry/http/index.js.map +1 -1
  106. package/dist/telemetry/index.js +4 -1561
  107. package/dist/telemetry/index.js.map +1 -1
  108. package/dist/telemetry/prometheus/index.js +7 -8422
  109. package/dist/telemetry/prometheus/index.js.map +1 -1
  110. package/dist/validator-I3ASDVDB.js +6 -0
  111. package/dist/validator-I3ASDVDB.js.map +1 -0
  112. package/package.json +5 -1
  113. package/schemas/crucible-ts/library/module-manifest/v1.0.0/module-manifest.schema.json +1 -1
  114. package/schemas/crucible-ts/observability/logging/v1.0.0/definitions.schema.json +1 -1
  115. package/schemas/crucible-ts/observability/logging/v1.0.0/log-event.schema.json +13 -13
  116. package/schemas/crucible-ts/observability/logging/v1.0.0/logger-config.schema.json +2 -2
  117. package/schemas/crucible-ts/observability/logging/v1.0.0/logging-policy.schema.json +1 -1
  118. package/schemas/crucible-ts/observability/logging/v1.0.0/middleware-config.schema.json +2 -2
  119. package/schemas/crucible-ts/observability/logging/v1.0.0/severity-filter.schema.json +3 -3
  120. package/schemas/crucible-ts/upstream/3leaps/crucible/PROVENANCE.md +3 -3
  121. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/catalog/classifiers/README.md +1 -1
  122. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/classifiers-framework.md +1 -1
  123. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/data-sensitivity-classification.md +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/docscribe/normalize.ts","../src/docscribe/types.ts","../src/docscribe/frontmatter.ts","../src/docscribe/headers.ts","../src/docscribe/format.ts","../src/docscribe/split.ts"],"names":[],"mappings":"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","file":"chunk-BCO3FUUO.js","sourcesContent":["/**\n * Normalization utilities for DocScribe module inputs.\n */\n\nconst decoder = new TextDecoder(\"utf-8\", { fatal: false, ignoreBOM: true });\n\nexport type NormalizedInput = {\n readonly content: string;\n readonly original: string | Uint8Array | ArrayBufferLike;\n};\n\nfunction stripBom(value: string): string {\n return value.charCodeAt(0) === 0xfeff ? value.slice(1) : value;\n}\n\nfunction normalizeNewlines(value: string): string {\n return value.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\n/**\n * Normalize supported input types to a UTF-8 string with consistent newlines.\n */\nexport function normalizeInput(input: string | Uint8Array | ArrayBufferLike): NormalizedInput {\n let content: string;\n\n if (typeof input === \"string\") {\n content = input;\n } else if (input instanceof Uint8Array) {\n content = decoder.decode(input);\n } else {\n content = decoder.decode(new Uint8Array(input));\n }\n\n const normalized = normalizeNewlines(stripBom(content));\n return { content: normalized, original: input };\n}\n","/**\n * DocScribe module public types.\n */\n\nexport type DocScribePrimitiveValue = string | number | boolean | null;\n\nexport type DocScribeMetadataValue =\n | DocScribePrimitiveValue\n | ReadonlyArray<DocScribeMetadataValue>\n | { readonly [key: string]: DocScribeMetadataValue };\n\nexport interface DocScribeMetadata extends Record<string, DocScribeMetadataValue | undefined> {\n readonly title?: string;\n readonly description?: string;\n readonly author?: string;\n readonly date?: string;\n readonly lastUpdated?: string;\n readonly status?: string;\n readonly tags?: ReadonlyArray<string>;\n readonly version?: string;\n readonly relatedDocs?: ReadonlyArray<string>;\n readonly meta?: DocScribeMetadataValue;\n}\n\nexport interface DocScribeFrontmatterResult {\n readonly metadata: DocScribeMetadata | null;\n readonly body: string;\n readonly range: {\n readonly start: number;\n readonly end: number;\n } | null;\n readonly bodyStartLine: number;\n}\n\nexport interface DocScribeHeader {\n readonly level: number;\n readonly text: string;\n readonly slug: string;\n readonly line: number;\n}\n\nexport type DocScribeFormat = \"markdown\" | \"yaml\" | \"yaml-stream\" | \"json\" | \"toml\" | \"plain\";\n\nexport interface DocScribeInfo {\n readonly format: DocScribeFormat;\n readonly hasFrontmatter: boolean;\n readonly frontmatterRange: {\n readonly start: number;\n readonly end: number;\n } | null;\n readonly metadata: DocScribeMetadata | null;\n readonly headerCount: number;\n readonly estimatedSections: number;\n readonly bodyStartLine: number;\n readonly lineCount: number;\n readonly size: number;\n readonly headers: ReadonlyArray<DocScribeHeader>;\n}\n\nexport interface DocScribeSplit {\n readonly content: string;\n readonly format: DocScribeFormat;\n readonly hasFrontmatter: boolean;\n readonly metadata: DocScribeMetadata | null;\n readonly startLine: number;\n readonly endLine: number;\n readonly index: number;\n}\n\nexport interface DocScribeOptions {\n readonly maxDocuments?: number;\n readonly slugify?: (header: string) => string;\n readonly maxDepth?: number;\n}\n\nexport class DocScribeError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"DocScribeError\";\n }\n}\n\nexport class DocScribeParseError extends DocScribeError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"DocScribeParseError\";\n }\n}\n\nexport class DocScribeUnsupportedFormatError extends DocScribeError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"DocScribeUnsupportedFormatError\";\n }\n}\n","import { parseDocument } from \"yaml\";\n\nimport { normalizeInput } from \"./normalize.js\";\nimport {\n type DocScribeFrontmatterResult,\n type DocScribeMetadata,\n type DocScribeMetadataValue,\n DocScribeParseError,\n} from \"./types.js\";\n\nconst FRONTMATTER_DELIMITER = \"---\";\nconst STRING_KEYS = new Set<string>([\n \"title\",\n \"description\",\n \"author\",\n \"date\",\n \"lastUpdated\",\n \"status\",\n \"version\",\n]);\n\ninterface FrontmatterBounds {\n readonly start: number;\n readonly openEnd: number;\n readonly closingStart: number;\n readonly closingEnd: number;\n}\n\nexport function parseFrontmatter(\n input: string | Uint8Array | ArrayBufferLike,\n): DocScribeFrontmatterResult {\n const { content } = normalizeInput(input);\n const bounds = locateFrontmatter(content);\n\n if (!bounds) {\n return { metadata: null, body: content, range: null, bodyStartLine: 1 };\n }\n\n const yamlBlock = content.slice(bounds.openEnd, bounds.closingStart);\n const metadata =\n yamlBlock.trim().length === 0 ? ({} as DocScribeMetadata) : parseYamlMetadata(yamlBlock);\n\n const bodyRaw = content.slice(bounds.closingEnd);\n const leadingNewlinesMatch = bodyRaw.match(/^\\n+/);\n const leadingNewlinesLength = leadingNewlinesMatch ? leadingNewlinesMatch[0].length : 0;\n const bodyStartIndex = bounds.closingEnd + leadingNewlinesLength;\n const prefix = content.slice(0, bodyStartIndex);\n const bodyStartLine = prefix.length === 0 ? 1 : prefix.split(\"\\n\").length;\n const body = bodyRaw.slice(leadingNewlinesLength);\n\n return {\n metadata,\n body,\n range: { start: bounds.start, end: bounds.closingEnd },\n bodyStartLine,\n };\n}\n\nexport function stripFrontmatter(input: string | Uint8Array | ArrayBufferLike): string {\n return parseFrontmatter(input).body;\n}\n\nexport function extractMetadata(\n input: string | Uint8Array | ArrayBufferLike,\n): DocScribeMetadata | null {\n return parseFrontmatter(input).metadata;\n}\n\nfunction locateFrontmatter(content: string): FrontmatterBounds | null {\n let cursor = 0;\n\n while (cursor < content.length) {\n const newlineIndex = content.indexOf(\"\\n\", cursor);\n const lineEnd = newlineIndex === -1 ? content.length : newlineIndex;\n const line = content.slice(cursor, lineEnd);\n\n if (line.trim().length === 0) {\n if (newlineIndex === -1) {\n return null;\n }\n cursor = newlineIndex + 1;\n continue;\n }\n\n if (line.trim() !== FRONTMATTER_DELIMITER) {\n return null;\n }\n\n const openStart = cursor;\n const openEnd = newlineIndex === -1 ? content.length : newlineIndex + 1;\n\n let search = openEnd;\n while (search <= content.length) {\n const nextNewline = content.indexOf(\"\\n\", search);\n const segmentEnd = nextNewline === -1 ? content.length : nextNewline;\n const candidate = content.slice(search, segmentEnd).trim();\n\n if (candidate === FRONTMATTER_DELIMITER) {\n const closingStart = search;\n const closingEnd = nextNewline === -1 ? segmentEnd : nextNewline + 1;\n return {\n start: openStart,\n openEnd,\n closingStart,\n closingEnd,\n };\n }\n\n if (nextNewline === -1) {\n break;\n }\n\n search = nextNewline + 1;\n }\n\n return null;\n }\n\n return null;\n}\n\nfunction parseYamlMetadata(source: string): DocScribeMetadata {\n const document = parseDocument(source, { prettyErrors: true });\n\n if (document.errors.length > 0) {\n const error = document.errors[0];\n const location = error.linePos && error.linePos.length > 0 ? error.linePos[0] : null;\n const position = location ? ` (line ${location.line + 1}, column ${location.col + 1})` : \"\";\n throw new DocScribeParseError(`Invalid YAML frontmatter${position}: ${error.message}`, {\n cause: error,\n });\n }\n\n let raw: unknown;\n try {\n raw = document.toJS({ mapAsMap: false });\n } catch (error) {\n throw new DocScribeParseError(\"Failed to parse YAML frontmatter\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n if (raw == null) {\n return {} as DocScribeMetadata;\n }\n\n if (typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new DocScribeParseError(\"YAML frontmatter must be a mapping at the top level\");\n }\n\n return normalizeMetadata(raw as Record<string, unknown>);\n}\n\nfunction normalizeMetadata(raw: Record<string, unknown>): DocScribeMetadata {\n const normalized: Record<string, DocScribeMetadataValue | undefined> = {};\n\n for (const [key, value] of Object.entries(raw)) {\n normalized[key] = normalizeMetadataValue(value);\n }\n\n const base: Record<string, DocScribeMetadataValue | undefined> = {};\n for (const [key, value] of Object.entries(normalized)) {\n if (STRING_KEYS.has(key) || key === \"tags\" || key === \"relatedDocs\") {\n continue;\n }\n base[key] = value;\n }\n\n const metadata: DocScribeMetadata = {\n ...base,\n ...(normalized.title !== undefined ? { title: ensureStringValue(normalized.title) } : {}),\n ...(normalized.description !== undefined\n ? { description: ensureStringValue(normalized.description) }\n : {}),\n ...(normalized.author !== undefined ? { author: ensureStringValue(normalized.author) } : {}),\n ...(normalized.date !== undefined ? { date: ensureStringValue(normalized.date) } : {}),\n ...(normalized.lastUpdated !== undefined\n ? { lastUpdated: ensureStringValue(normalized.lastUpdated) }\n : {}),\n ...(normalized.status !== undefined ? { status: ensureStringValue(normalized.status) } : {}),\n ...(normalized.version !== undefined ? { version: ensureStringValue(normalized.version) } : {}),\n ...(normalized.tags !== undefined\n ? (() => {\n const tags = ensureStringArray(normalized.tags);\n return tags.length > 0 ? { tags } : {};\n })()\n : {}),\n ...(normalized.relatedDocs !== undefined\n ? (() => {\n const related = ensureStringArray(normalized.relatedDocs);\n return related.length > 0 ? { relatedDocs: related } : {};\n })()\n : {}),\n };\n\n return metadata;\n}\n\nfunction normalizeMetadataValue(value: unknown): DocScribeMetadataValue {\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (Array.isArray(value)) {\n return value.map((item) =>\n normalizeMetadataValue(item),\n ) as ReadonlyArray<DocScribeMetadataValue>;\n }\n\n if (typeof value === \"object\") {\n const result: Record<string, DocScribeMetadataValue> = {};\n for (const [key, nested] of Object.entries(value as Record<string, unknown>)) {\n result[key] = normalizeMetadataValue(nested);\n }\n return result as { readonly [key: string]: DocScribeMetadataValue };\n }\n\n return String(value);\n}\n\nfunction ensureStringValue(value: DocScribeMetadataValue): string {\n if (value === null) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => ensureStringArrayItem(item)).join(\", \");\n }\n\n return JSON.stringify(value);\n}\n\nfunction ensureStringArray(value: DocScribeMetadataValue): ReadonlyArray<string> {\n return ensureStringArrayItem(value);\n}\n\nfunction ensureStringArrayItem(value: DocScribeMetadataValue): string[] {\n if (value === null) {\n return [];\n }\n\n if (typeof value === \"string\") {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return [String(value)];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => ensureStringArrayItem(item));\n }\n\n return [JSON.stringify(value)];\n}\n","import { parseFrontmatter } from \"./frontmatter.js\";\nimport { normalizeInput } from \"./normalize.js\";\nimport type { DocScribeHeader, DocScribeOptions } from \"./types.js\";\n\nconst ATX_PATTERN = /^ {0,3}(#{1,6})(?:[ \\t]+|$)(.*)$/;\nconst SETEXT_PATTERN = /^ {0,3}(=+|-+)\\s*$/;\n\nexport function extractHeaders(\n input: string | Uint8Array | ArrayBufferLike,\n options?: DocScribeOptions,\n): DocScribeHeader[] {\n const { content } = normalizeInput(input);\n const parsed = parseFrontmatter(content);\n const body = parsed.body;\n const lineOffset = parsed.bodyStartLine;\n\n const slugify = options?.slugify ?? defaultSlugify;\n const maxDepth = options?.maxDepth ?? 6;\n\n const lines = body.split(\"\\n\");\n const headers: DocScribeHeader[] = [];\n\n let inFence = false;\n let fenceMarker: \"`\" | \"~\" | null = null;\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n const trimmed = line.trimEnd();\n const lineNumber = lineOffset + index;\n\n const fenceMatch = line.match(/^ {0,3}(```+|~~~+)/);\n if (fenceMatch) {\n const marker = fenceMatch[1][0] as \"`\" | \"~\";\n if (!inFence) {\n inFence = true;\n fenceMarker = marker;\n } else if (fenceMarker === marker) {\n inFence = false;\n fenceMarker = null;\n }\n continue;\n }\n\n if (inFence) {\n continue;\n }\n\n if (/^( {4}|\\t)/.test(line)) {\n continue;\n }\n\n const atxMatch = trimmed.match(ATX_PATTERN);\n if (atxMatch) {\n const level = atxMatch[1].length;\n if (level <= maxDepth) {\n const rawText = atxMatch[2].replace(/#+\\s*$/, \"\").trim();\n const text = rawText.length > 0 ? rawText : \"\";\n const slug = ensureSlug(slugify, text, lineNumber);\n headers.push({ level, text, slug, line: lineNumber });\n }\n continue;\n }\n\n if (trimmed.length === 0) {\n continue;\n }\n\n if (index + 1 >= lines.length) {\n continue;\n }\n\n const nextLine = lines[index + 1];\n const setextMatch = SETEXT_PATTERN.exec(nextLine.trimEnd());\n if (setextMatch) {\n const underline = setextMatch[1];\n const level = underline.startsWith(\"=\") ? 1 : 2;\n if (level <= maxDepth) {\n const text = trimmed.trim();\n if (text.length > 0 && !/^ {0,3}(```|~~~)/.test(text)) {\n const slug = ensureSlug(slugify, text, lineNumber);\n headers.push({ level, text, slug, line: lineNumber });\n }\n }\n index += 1;\n }\n }\n\n return headers;\n}\n\nfunction defaultSlugify(value: string): string {\n return value\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .trim()\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\");\n}\n\nfunction ensureSlug(slugify: (header: string) => string, text: string, lineNumber: number): string {\n const candidate = slugify(text);\n if (candidate && candidate.trim().length > 0) {\n return candidate;\n }\n return `section-${lineNumber}`;\n}\n","import { parseFrontmatter } from \"./frontmatter.js\";\nimport { extractHeaders } from \"./headers.js\";\nimport { normalizeInput } from \"./normalize.js\";\nimport type { DocScribeFormat, DocScribeInfo, DocScribeOptions } from \"./types.js\";\n\nconst JSON_PATTERN = /^[\\s\\t]*[[{]/;\nconst TOML_ASSIGNMENT = /^[A-Za-z0-9_\"'\\-.]+\\s*=\\s*.+$/;\nconst TOML_TABLE = /^\\s*\\[[^\\]]+\\]\\s*$/;\nconst YAML_KEY_PATTERN = /^\\s*[\\w\"'-]+\\s*:\\s*.+$/;\nconst MARKDOWN_HEADING = /(\\n|^)\\s{0,3}#{1,6}\\s+/;\nconst MARKDOWN_LIST = /(\\n|^)\\s{0,3}(?:-|\\*|\\+)\\s+/;\nconst MARKDOWN_SETEXT = /(\\n|^).+\\n\\s{0,3}(?:=+|-+)\\s*(\\n|$)/;\n\nexport function detectFormat(input: string | Uint8Array | ArrayBufferLike): DocScribeFormat {\n const { content } = normalizeInput(input);\n return detectFormatFromContent(content);\n}\n\nexport function inspectDocument(\n input: string | Uint8Array | ArrayBufferLike,\n options?: DocScribeOptions,\n): DocScribeInfo {\n const { content } = normalizeInput(input);\n const format = detectFormatFromContent(content);\n const frontmatter = parseFrontmatter(content);\n const headers = extractHeaders(content, options);\n const headerCount = headers.length;\n const estimatedSections =\n headerCount > 0 ? headerCount : frontmatter.body.trim().length > 0 ? 1 : 0;\n const lineCount = content.length === 0 ? 0 : content.split(\"\\n\").length;\n const size = content.length;\n\n return {\n format,\n hasFrontmatter: frontmatter.metadata !== null,\n frontmatterRange: frontmatter.range,\n metadata: frontmatter.metadata,\n headerCount,\n estimatedSections,\n bodyStartLine: frontmatter.bodyStartLine,\n lineCount,\n size,\n headers,\n };\n}\n\nfunction detectFormatFromContent(content: string): DocScribeFormat {\n const trimmed = content.trim();\n if (trimmed.length === 0) {\n return \"plain\";\n }\n\n if (looksLikeJson(trimmed)) {\n return \"json\";\n }\n\n if (looksLikeToml(trimmed)) {\n return \"toml\";\n }\n\n const yamlSeparatorCount = countYamlSeparators(content);\n if (yamlSeparatorCount >= 1 && isLikelyYamlStream(content)) {\n return \"yaml-stream\";\n }\n\n const markdownIndicators = hasMarkdownIndicators(content);\n\n if (looksLikeYaml(trimmed) && !markdownIndicators) {\n return \"yaml\";\n }\n\n const frontmatter = parseFrontmatter(content);\n if (frontmatter.metadata !== null) {\n const body = frontmatter.body.trim();\n if (markdownIndicators || MARKDOWN_HEADING.test(body) || MARKDOWN_LIST.test(body)) {\n return \"markdown\";\n }\n if (!body) {\n return \"markdown\";\n }\n }\n\n if (markdownIndicators) {\n return \"markdown\";\n }\n\n return \"plain\";\n}\n\nfunction looksLikeJson(trimmed: string): boolean {\n if (!JSON_PATTERN.test(trimmed)) {\n return false;\n }\n try {\n JSON.parse(trimmed);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nfunction looksLikeToml(content: string): boolean {\n const lines = content.split(\"\\n\");\n let tableCount = 0;\n let assignmentCount = 0;\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (line === \"\" || line.startsWith(\"#\")) {\n continue;\n }\n if (TOML_TABLE.test(line)) {\n tableCount += 1;\n continue;\n }\n if (TOML_ASSIGNMENT.test(line)) {\n assignmentCount += 1;\n }\n }\n return tableCount > 0 || assignmentCount >= 3;\n}\n\nfunction looksLikeYaml(trimmed: string): boolean {\n if (trimmed.startsWith(\"%YAML\")) {\n return true;\n }\n const lines = trimmed.split(\"\\n\");\n let signal = 0;\n for (const raw of lines.slice(0, 20)) {\n const line = raw.trim();\n if (line === \"\" || line.startsWith(\"#\")) {\n continue;\n }\n if (line === \"---\") {\n signal += 1;\n continue;\n }\n if (YAML_KEY_PATTERN.test(line) || /^-\\s/.test(line)) {\n signal += 1;\n }\n }\n return signal >= 2;\n}\n\nfunction countYamlSeparators(content: string): number {\n const matches = content.match(/(^|\\n)---\\s*(\\n|$)/g);\n return matches ? matches.length : 0;\n}\n\nfunction isLikelyYamlStream(content: string): boolean {\n const lines = content.split(\"\\n\");\n let yamlSignals = 0;\n let markdownSignals = 0;\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (line === \"\" || line === \"---\") {\n continue;\n }\n\n if (\n /^#/.test(line) ||\n /^\\s{0,3}(?:-|\\*|\\+)\\s+/.test(line) ||\n /(\\[[^\\]]+\\]\\([^)]+\\))/.test(line)\n ) {\n markdownSignals += 1;\n }\n\n if (/:\\s/.test(line) || /^-\\s/.test(line)) {\n yamlSignals += 1;\n }\n }\n\n return yamlSignals >= 2 && markdownSignals === 0;\n}\n\nfunction hasMarkdownIndicators(content: string): boolean {\n return (\n MARKDOWN_HEADING.test(content) ||\n MARKDOWN_LIST.test(content) ||\n MARKDOWN_SETEXT.test(content) ||\n /(\\n|^)\\s{0,3}>\\s+/.test(content) ||\n /(\\[[^\\]]+\\]\\([^)]+\\))/.test(content)\n );\n}\n\n// Internal helper exported for testing or reuse\nexport const __internal = {\n detectFormatFromContent,\n looksLikeJson,\n looksLikeToml,\n looksLikeYaml,\n isLikelyYamlStream,\n};\n","import { detectFormat } from \"./format.js\";\nimport { parseFrontmatter } from \"./frontmatter.js\";\nimport { normalizeInput } from \"./normalize.js\";\nimport type { DocScribeFormat, DocScribeOptions, DocScribeSplit } from \"./types.js\";\n\ntype RawSplit = Omit<DocScribeSplit, \"index\">;\n\ntype LineInfo = { line: string; lineNumber: number };\n\ntype AccumulatedDoc = { lines: string[]; startLine: number };\n\nexport function splitDocuments(\n input: string | Uint8Array | ArrayBufferLike,\n options?: DocScribeOptions,\n): DocScribeSplit[] {\n const { content } = normalizeInput(input);\n const trimmed = content.trim();\n\n if (trimmed.length === 0) {\n return [];\n }\n\n const maxDocuments = options?.maxDocuments ?? Number.POSITIVE_INFINITY;\n const format = detectFormat(content);\n\n let splits: DocScribeSplit[];\n if (format === \"yaml-stream\") {\n splits = withIndices(splitYamlStream(content));\n } else if (format === \"markdown\") {\n const markdownSplits = splitMarkdownDocuments(content);\n splits =\n markdownSplits.length > 0\n ? withIndices(markdownSplits)\n : [withIndex(buildSingleSplit(content, format, 1), 0)];\n } else {\n splits = [withIndex(buildSingleSplit(content, format, 1), 0)];\n }\n\n return applyDocumentLimit(splits, maxDocuments);\n}\n\nfunction splitYamlStream(content: string): RawSplit[] {\n const lines = content.split(\"\\n\");\n const docs: AccumulatedDoc[] = [];\n let current: AccumulatedDoc = { lines: [], startLine: 1 };\n let delimiterCount = 0;\n\n const flush = () => {\n if (current.lines.join(\"\\n\").trim().length === 0) {\n current = { lines: [], startLine: current.startLine };\n return;\n }\n docs.push({ ...current, lines: [...current.lines] });\n current = { lines: [], startLine: current.startLine };\n };\n\n for (let index = 0; index < lines.length; index += 1) {\n const lineNumber = index + 1;\n const line = lines[index];\n const trimmed = line.trim();\n\n if (trimmed === \"---\") {\n delimiterCount += 1;\n flush();\n current = { lines: [], startLine: lineNumber + 1 };\n continue;\n }\n\n if (delimiterCount === 0) {\n current.startLine = 1;\n }\n\n current.lines.push(line);\n }\n\n flush();\n\n if (docs.length === 0) {\n return [buildRawSplit(content, \"yaml\", null, 1, content.split(\"\\n\").length)];\n }\n\n return docs\n .map((doc) => {\n const joined = doc.lines.join(\"\\n\");\n const lineCount = doc.lines.length;\n return buildRawSplit(\n joined,\n \"yaml\",\n null,\n doc.startLine,\n doc.startLine + Math.max(lineCount - 1, 0),\n );\n })\n .filter((split) => split.content.trim().length > 0);\n}\n\nfunction splitMarkdownDocuments(content: string): RawSplit[] {\n const frontmatter = parseFrontmatter(content);\n const lines = content.split(\"\\n\");\n const docs: AccumulatedDoc[] = [];\n const frontmatterLimit = frontmatter.metadata ? Math.max(frontmatter.bodyStartLine - 1, 0) : 0;\n\n let current: AccumulatedDoc = { lines: [], startLine: 1 };\n let inFence = false;\n let fenceMarker: \"`\" | \"~\" | null = null;\n\n const flush = () => {\n if (current.lines.join(\"\\n\").trim().length === 0) {\n current = { lines: [], startLine: current.startLine };\n return;\n }\n docs.push({ ...current, lines: [...current.lines] });\n current = { lines: [], startLine: current.startLine };\n };\n\n for (let index = 0; index < lines.length; index += 1) {\n const lineNumber = index + 1;\n const line = lines[index];\n const trimmed = line.trimEnd();\n\n const fenceMatch = line.match(/^ {0,3}(```+|~~~+)/);\n if (fenceMatch) {\n const marker = fenceMatch[1][0] as \"`\" | \"~\";\n if (!inFence) {\n inFence = true;\n fenceMarker = marker;\n } else if (fenceMarker === marker) {\n inFence = false;\n fenceMarker = null;\n }\n }\n\n const isPrimaryFrontmatter = frontmatterLimit > 0 && lineNumber <= frontmatterLimit;\n\n if (!inFence && !isPrimaryFrontmatter && trimmed === \"---\") {\n const prev = findPrevNonEmpty(lines, index - 1);\n const next = findNextNonEmpty(lines, index + 1);\n const prevLooksLikeMetadata = prev ? /:\\s*/.test(prev.line) : false;\n const nextIsHeading = next ? next.line.trim().startsWith(\"#\") : false;\n\n if (next && !prevLooksLikeMetadata && nextIsHeading) {\n flush();\n current = { lines: [], startLine: next.lineNumber };\n continue;\n }\n }\n\n current.lines.push(line);\n }\n\n flush();\n\n return docs\n .map((doc) => {\n const contentValue = doc.lines.join(\"\\n\");\n const parsed = parseFrontmatter(contentValue);\n const lineCount = doc.lines.length;\n return buildRawSplit(\n contentValue,\n \"markdown\",\n parsed.metadata,\n doc.startLine,\n doc.startLine + Math.max(lineCount - 1, 0),\n parsed.metadata !== null,\n );\n })\n .filter((split) => split.content.trim().length > 0);\n}\n\nfunction buildSingleSplit(content: string, format: DocScribeFormat, startLine: number): RawSplit {\n const parsed = parseFrontmatter(content);\n const lineCount = content.length === 0 ? 0 : content.split(\"\\n\").length;\n return buildRawSplit(\n content,\n format,\n parsed.metadata,\n startLine,\n startLine + Math.max(lineCount - 1, 0),\n parsed.metadata !== null,\n );\n}\n\nfunction buildRawSplit(\n content: string,\n format: DocScribeFormat,\n metadata: ReturnType<typeof parseFrontmatter>[\"metadata\"],\n startLine: number,\n endLine: number,\n hasFrontmatter = false,\n): RawSplit {\n return {\n content,\n format,\n hasFrontmatter,\n metadata: metadata ?? null,\n startLine,\n endLine,\n };\n}\n\nfunction applyDocumentLimit(splits: DocScribeSplit[], maxDocuments: number): DocScribeSplit[] {\n if (maxDocuments <= 0) {\n return [];\n }\n\n if (splits.length <= maxDocuments) {\n return splits.map((split, idx) => ({ ...split, index: idx }));\n }\n\n const cutoff = Math.max(maxDocuments - 1, 0);\n const allowed = splits.slice(0, cutoff);\n const remaining = splits.slice(cutoff);\n const merged = mergeSplitGroup(remaining);\n const combined = cutoff === 0 ? [merged] : [...allowed, merged];\n return combined.map((split, idx) => ({ ...split, index: idx }));\n}\n\nfunction mergeSplitGroup(splits: DocScribeSplit[]): DocScribeSplit {\n const first = splits[0];\n const last = splits[splits.length - 1];\n const combinedContent = splits.map((split) => split.content).join(\"\\n---\\n\");\n return {\n content: combinedContent,\n format: first.format,\n hasFrontmatter: first.hasFrontmatter,\n metadata: first.metadata,\n startLine: first.startLine,\n endLine: last.endLine,\n index: 0,\n };\n}\n\nfunction withIndices(rawSplits: RawSplit[]): DocScribeSplit[] {\n return rawSplits.map((split, idx) => withIndex(split, idx));\n}\n\nfunction withIndex(split: RawSplit, index: number): DocScribeSplit {\n return { ...split, index };\n}\n\nfunction findNextNonEmpty(lines: readonly string[], startIndex: number): LineInfo | null {\n for (let index = startIndex; index < lines.length; index += 1) {\n const candidate = lines[index];\n if (candidate.trim().length === 0) {\n continue;\n }\n return { line: candidate, lineNumber: index + 1 };\n }\n return null;\n}\n\nfunction findPrevNonEmpty(lines: readonly string[], startIndex: number): LineInfo | null {\n for (let index = startIndex; index >= 0; index -= 1) {\n const candidate = lines[index];\n if (candidate.trim().length === 0) {\n continue;\n }\n return { line: candidate, lineNumber: index + 1 };\n }\n return null;\n}\n"]}
@@ -0,0 +1,410 @@
1
+ import { compileSchemaById } from './chunk-SNV5WG5V.js';
2
+ import { randomUUID } from 'crypto';
3
+
4
+ var 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;
5
+ function generateCorrelationId() {
6
+ return randomUUID();
7
+ }
8
+ function isValidCorrelationId(id) {
9
+ return UUID_V4_PATTERN.test(id);
10
+ }
11
+ function normalizeCorrelationId(id) {
12
+ return id.trim().toLowerCase();
13
+ }
14
+ function isCorrelationId(value) {
15
+ return typeof value === "string" && isValidCorrelationId(value);
16
+ }
17
+
18
+ // src/errors/severity.ts
19
+ var Severity = {
20
+ INFO: "info",
21
+ LOW: "low",
22
+ MEDIUM: "medium",
23
+ HIGH: "high",
24
+ CRITICAL: "critical"
25
+ };
26
+ var SEVERITY_LEVELS = {
27
+ info: 0,
28
+ low: 1,
29
+ medium: 2,
30
+ high: 3,
31
+ critical: 4
32
+ };
33
+ var LEVEL_TO_SEVERITY = {
34
+ 0: "info",
35
+ 1: "low",
36
+ 2: "medium",
37
+ 3: "high",
38
+ 4: "critical"
39
+ };
40
+ function severityToLevel(name) {
41
+ if (!isSeverityName(name)) {
42
+ throw new Error(
43
+ `Invalid severity name: "${name}". Must be one of: ${Object.values(Severity).join(", ")}`
44
+ );
45
+ }
46
+ return SEVERITY_LEVELS[name];
47
+ }
48
+ function levelToSeverity(level) {
49
+ if (!isSeverityLevel(level)) {
50
+ throw new Error(`Invalid severity level: ${level}. Must be 0-4`);
51
+ }
52
+ return LEVEL_TO_SEVERITY[level];
53
+ }
54
+ function isSeverityName(value) {
55
+ return typeof value === "string" && Object.values(Severity).includes(value);
56
+ }
57
+ function isSeverityLevel(value) {
58
+ return typeof value === "number" && value >= 0 && value <= 4 && Number.isInteger(value);
59
+ }
60
+ function getDefaultSeverity() {
61
+ return {
62
+ name: Severity.MEDIUM,
63
+ level: 2
64
+ };
65
+ }
66
+ function compareSeverity(a, b) {
67
+ const levelA = typeof a === "string" ? severityToLevel(a) : a;
68
+ const levelB = typeof b === "string" ? severityToLevel(b) : b;
69
+ return levelA - levelB;
70
+ }
71
+
72
+ // src/errors/serialization.ts
73
+ function serializeError(error, code = "UNKNOWN_ERROR", severity = Severity.MEDIUM) {
74
+ if (error instanceof Error) {
75
+ return {
76
+ code,
77
+ message: error.message,
78
+ severity,
79
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
80
+ context: {
81
+ name: error.name,
82
+ stack: error.stack
83
+ },
84
+ original: error.stack || error.message
85
+ };
86
+ }
87
+ if (isErrorLike(error)) {
88
+ return {
89
+ code,
90
+ message: error.message,
91
+ severity,
92
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
93
+ details: error.details,
94
+ context: error.context,
95
+ original: JSON.stringify(error)
96
+ };
97
+ }
98
+ if (typeof error === "string") {
99
+ return {
100
+ code,
101
+ message: error,
102
+ severity,
103
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
104
+ };
105
+ }
106
+ return {
107
+ code,
108
+ message: String(error),
109
+ severity,
110
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
111
+ original: typeof error === "object" ? JSON.stringify(error) : String(error)
112
+ };
113
+ }
114
+ function extractErrorMessage(error) {
115
+ if (error instanceof Error) {
116
+ return error.message;
117
+ }
118
+ if (isErrorLike(error)) {
119
+ return error.message;
120
+ }
121
+ if (typeof error === "string") {
122
+ return error;
123
+ }
124
+ return String(error);
125
+ }
126
+ function extractStackTrace(error) {
127
+ if (error instanceof Error) {
128
+ return error.stack;
129
+ }
130
+ if (isErrorLike(error) && typeof error.stack === "string") {
131
+ return error.stack;
132
+ }
133
+ return void 0;
134
+ }
135
+ function isErrorLike(value) {
136
+ return typeof value === "object" && value !== null && "message" in value && typeof value.message === "string";
137
+ }
138
+
139
+ // src/errors/validators.ts
140
+ var ErrorValidator = class _ErrorValidator {
141
+ static instance;
142
+ validateFn = null;
143
+ initPromise = null;
144
+ initError = null;
145
+ constructor() {
146
+ }
147
+ /**
148
+ * Get singleton instance
149
+ */
150
+ static getInstance() {
151
+ if (!_ErrorValidator.instance) {
152
+ _ErrorValidator.instance = new _ErrorValidator();
153
+ }
154
+ return _ErrorValidator.instance;
155
+ }
156
+ /**
157
+ * Initialize validator (lazy load, async)
158
+ */
159
+ async init() {
160
+ if (this.validateFn !== null || this.initError !== null) {
161
+ return;
162
+ }
163
+ if (this.initPromise) {
164
+ return this.initPromise;
165
+ }
166
+ this.initPromise = (async () => {
167
+ try {
168
+ await compileSchemaById("pathfinder/v1.0.0/error-response");
169
+ await compileSchemaById("assessment/v1.0.0/severity-definitions");
170
+ this.validateFn = await compileSchemaById("error-handling/v1.0.0/error-response");
171
+ } catch (err) {
172
+ this.initError = err instanceof Error ? err : new Error(String(err));
173
+ throw new Error(`Failed to initialize error validator: ${this.initError.message}`);
174
+ }
175
+ })();
176
+ return this.initPromise;
177
+ }
178
+ /**
179
+ * Validate error data against schema
180
+ *
181
+ * @param data - Data to validate
182
+ * @returns Promise resolving to true if valid, false otherwise
183
+ * @throws {Error} If validator failed to initialize
184
+ */
185
+ async validate(data) {
186
+ if (this.validateFn === null) {
187
+ await this.init();
188
+ }
189
+ if (this.initError) {
190
+ throw this.initError;
191
+ }
192
+ if (!this.validateFn) {
193
+ throw new Error("Validator not initialized");
194
+ }
195
+ return this.validateFn(data);
196
+ }
197
+ /**
198
+ * Get validation errors from last validation
199
+ *
200
+ * @returns Validation errors or null
201
+ */
202
+ getErrors() {
203
+ if (!this.validateFn) {
204
+ return null;
205
+ }
206
+ return this.validateFn.errors;
207
+ }
208
+ /**
209
+ * Reset validator state (for testing)
210
+ * @internal
211
+ */
212
+ static _reset() {
213
+ _ErrorValidator.instance = new _ErrorValidator();
214
+ }
215
+ };
216
+ async function validateErrorData(data) {
217
+ return ErrorValidator.getInstance().validate(data);
218
+ }
219
+ function getValidationErrors() {
220
+ return ErrorValidator.getInstance().getErrors();
221
+ }
222
+ function formatValidationErrors(errors) {
223
+ return errors.map((err) => {
224
+ const path = err.instancePath || "(root)";
225
+ const message = err.message || "validation failed";
226
+ return `${path}: ${message}`;
227
+ }).join("; ");
228
+ }
229
+ async function assertValidErrorData(data) {
230
+ if (!await validateErrorData(data)) {
231
+ const errors = getValidationErrors();
232
+ const message = errors ? formatValidationErrors(errors) : "Error data validation failed";
233
+ throw new Error(`Invalid error data: ${message}`);
234
+ }
235
+ }
236
+
237
+ // src/errors/fulmen-error.ts
238
+ var FulmenError = class _FulmenError extends Error {
239
+ data;
240
+ constructor(data) {
241
+ super(data.message);
242
+ this.name = "FulmenError";
243
+ this.data = Object.freeze({ ...data });
244
+ Error.captureStackTrace(this, _FulmenError);
245
+ }
246
+ /**
247
+ * Serialize to JSON (schema-compliant)
248
+ */
249
+ toJSON() {
250
+ return this.data;
251
+ }
252
+ /**
253
+ * Check equality with another FulmenError
254
+ */
255
+ equals(other) {
256
+ return JSON.stringify(this.data) === JSON.stringify(other.data);
257
+ }
258
+ /**
259
+ * Get severity level for comparison
260
+ */
261
+ getSeverityLevel() {
262
+ return this.data.severity_level ?? SEVERITY_LEVELS[this.data.severity ?? "medium"];
263
+ }
264
+ /**
265
+ * Wrap an existing error with FulmenError structure
266
+ *
267
+ * @param error - Error to wrap (Error instance or FulmenErrorData)
268
+ * @param options - Additional error options
269
+ * @returns New FulmenError instance
270
+ *
271
+ * @example
272
+ * ```typescript
273
+ * try {
274
+ * throw new Error('Config invalid');
275
+ * } catch (err) {
276
+ * const fulmenErr = FulmenError.wrap(err, {
277
+ * code: 'CONFIG_INVALID',
278
+ * severity: 'high',
279
+ * exit_code: 2
280
+ * });
281
+ * throw fulmenErr;
282
+ * }
283
+ * ```
284
+ */
285
+ static wrap(error, options = {}) {
286
+ if (error instanceof _FulmenError) {
287
+ const effectiveSeverity = options.severity ?? error.data.severity ?? Severity.MEDIUM;
288
+ const effectiveSeverityLevel = SEVERITY_LEVELS[effectiveSeverity];
289
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
290
+ return new _FulmenError({
291
+ ...error.data,
292
+ ...options,
293
+ code: options.code ?? error.data.code,
294
+ message: error.data.message,
295
+ severity: effectiveSeverity,
296
+ // Consistent severity
297
+ severity_level: effectiveSeverityLevel,
298
+ // Recomputed level
299
+ timestamp
300
+ // Updated timestamp
301
+ });
302
+ }
303
+ if (isFulmenErrorData(error)) {
304
+ const defaultSeverity = getDefaultSeverity();
305
+ const effectiveSeverity = options.severity ?? error.severity ?? defaultSeverity.name;
306
+ const effectiveSeverityLevel = SEVERITY_LEVELS[effectiveSeverity];
307
+ return new _FulmenError({
308
+ ...error,
309
+ ...options,
310
+ severity: effectiveSeverity,
311
+ severity_level: effectiveSeverityLevel,
312
+ // Recomputed, not from error.severity_level
313
+ timestamp: error.timestamp ?? (/* @__PURE__ */ new Date()).toISOString()
314
+ });
315
+ }
316
+ return _FulmenError.fromError(error, options);
317
+ }
318
+ /**
319
+ * Create FulmenError from native Error object
320
+ *
321
+ * @param err - Native Error instance
322
+ * @param options - Error options
323
+ * @returns New FulmenError instance
324
+ *
325
+ * @example
326
+ * ```typescript
327
+ * const err = new TypeError('Invalid type');
328
+ * const fulmenErr = FulmenError.fromError(err, {
329
+ * code: 'TYPE_ERROR',
330
+ * severity: 'medium'
331
+ * });
332
+ * ```
333
+ */
334
+ static fromError(err, options = {}) {
335
+ const code = options.code ?? "UNKNOWN_ERROR";
336
+ const severity = options.severity ?? Severity.MEDIUM;
337
+ const severityLevel = SEVERITY_LEVELS[severity];
338
+ const message = extractErrorMessage(err);
339
+ const stack = extractStackTrace(err);
340
+ const data = {
341
+ code,
342
+ message,
343
+ severity,
344
+ severity_level: severityLevel,
345
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
346
+ ...options,
347
+ context: {
348
+ ...options.context,
349
+ originalName: err instanceof Error ? err.name : typeof err,
350
+ stack
351
+ },
352
+ original: stack || message
353
+ };
354
+ return new _FulmenError(data);
355
+ }
356
+ /**
357
+ * Validate error data against schema
358
+ *
359
+ * @param data - Error data to validate
360
+ * @returns Promise resolving to true if valid
361
+ *
362
+ * @example
363
+ * ```typescript
364
+ * const data = { code: 'TEST', message: 'Test error' };
365
+ * if (await FulmenError.validate(data)) {
366
+ * const err = new FulmenError(data);
367
+ * }
368
+ * ```
369
+ */
370
+ static async validate(data) {
371
+ return validateErrorData(data);
372
+ }
373
+ /**
374
+ * Exit process with structured error
375
+ *
376
+ * Logs error as JSON and exits with specified exit code.
377
+ * Mockable for testing (override process.exit).
378
+ *
379
+ * @param error - FulmenError instance
380
+ * @param options - Exit options
381
+ *
382
+ * @example
383
+ * ```typescript
384
+ * const err = FulmenError.fromError(new Error('Fatal'), {
385
+ * code: 'FATAL_ERROR',
386
+ * exit_code: 1
387
+ * });
388
+ * FulmenError.exitWithError(err); // Exits with code 1
389
+ * ```
390
+ */
391
+ static exitWithError(error, options = {}) {
392
+ const logger = options.logger ?? console.error;
393
+ const exitCode = error.data.exit_code ?? 1;
394
+ logger(JSON.stringify(error.toJSON(), null, 2));
395
+ process.exit(exitCode);
396
+ }
397
+ };
398
+ function isFulmenError(value) {
399
+ return value instanceof FulmenError;
400
+ }
401
+ function isFulmenErrorData(value) {
402
+ return typeof value === "object" && value !== null && "code" in value && typeof value.code === "string" && "message" in value && typeof value.message === "string";
403
+ }
404
+
405
+ // src/errors/index.ts
406
+ var VERSION = "0.2.0";
407
+
408
+ export { FulmenError, LEVEL_TO_SEVERITY, SEVERITY_LEVELS, Severity, VERSION, assertValidErrorData, compareSeverity, extractErrorMessage, extractStackTrace, formatValidationErrors, generateCorrelationId, getDefaultSeverity, getValidationErrors, isCorrelationId, isFulmenError, isFulmenErrorData, isSeverityLevel, isSeverityName, isValidCorrelationId, levelToSeverity, normalizeCorrelationId, serializeError, severityToLevel, validateErrorData };
409
+ //# sourceMappingURL=chunk-GOTEQYAD.js.map
410
+ //# sourceMappingURL=chunk-GOTEQYAD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors/correlation.ts","../src/errors/severity.ts","../src/errors/serialization.ts","../src/errors/validators.ts","../src/errors/fulmen-error.ts","../src/errors/index.ts"],"names":[],"mappings":"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","file":"chunk-GOTEQYAD.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 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"]}
@@ -0,0 +1,32 @@
1
+ // src/appidentity/runtime.ts
2
+ function detectRuntime() {
3
+ const versions = process.versions;
4
+ if (typeof versions.bun === "string" && versions.bun.length > 0) {
5
+ return { name: "bun", version: versions.bun };
6
+ }
7
+ if (typeof versions.node === "string" && versions.node.length > 0) {
8
+ return { name: "node", version: versions.node };
9
+ }
10
+ return { name: "unknown" };
11
+ }
12
+ function buildRuntimeInfo(options = {}) {
13
+ const runtime = detectRuntime();
14
+ const serviceName = options.serviceName ?? options.identity?.app.binary_name ?? "unknown-service";
15
+ const vendor = options.vendor ?? options.identity?.app.vendor;
16
+ return {
17
+ service: {
18
+ name: serviceName,
19
+ vendor,
20
+ version: options.version
21
+ },
22
+ runtime,
23
+ platform: {
24
+ os: process.platform,
25
+ arch: process.arch
26
+ }
27
+ };
28
+ }
29
+
30
+ export { buildRuntimeInfo };
31
+ //# sourceMappingURL=chunk-HY6JQOFN.js.map
32
+ //# sourceMappingURL=chunk-HY6JQOFN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/appidentity/runtime.ts"],"names":[],"mappings":";AA2BA,SAAS,aAAA,GAAyD;AAChE,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AAEzB,EAAA,IAAI,OAAO,QAAA,CAAS,GAAA,KAAQ,YAAY,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAC/D,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,SAAS,GAAA,EAAI;AAAA,EAC9C;AAEA,EAAA,IAAI,OAAO,QAAA,CAAS,IAAA,KAAS,YAAY,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,EAAG;AACjE,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,IAAA,EAAK;AAAA,EAChD;AAEA,EAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAC3B;AAKO,SAAS,gBAAA,CAAiB,OAAA,GAAmC,EAAC,EAAgB;AACnF,EAAA,MAAM,UAAU,aAAA,EAAc;AAE9B,EAAA,MAAM,cAAc,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,QAAA,EAAU,IAAI,WAAA,IAAe,iBAAA;AAChF,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,UAAU,GAAA,CAAI,MAAA;AAEvD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,WAAA;AAAA,MACN,MAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KACnB;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAI,OAAA,CAAQ,QAAA;AAAA,MACZ,MAAM,OAAA,CAAQ;AAAA;AAChB,GACF;AACF","file":"chunk-HY6JQOFN.js","sourcesContent":["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"]}