@fulmenhq/tsfulmen 0.3.2 → 0.4.0

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 (128) hide show
  1. package/CHANGELOG.md +65 -1
  2. package/README.md +30 -1
  3. package/config/crucible-ts/taxonomy/metrics.yaml +1 -1
  4. package/dist/appidentity/index.d.ts +15 -5
  5. package/dist/appidentity/index.js +9 -2204
  6. package/dist/appidentity/index.js.map +1 -1
  7. package/dist/assets/index.d.ts +179 -0
  8. package/dist/assets/index.js +4 -0
  9. package/dist/assets/index.js.map +1 -0
  10. package/dist/bin/prometheus-cli.js +15 -9134
  11. package/dist/bin/prometheus-cli.js.map +1 -1
  12. package/dist/bin/schema-cli.js +4 -6098
  13. package/dist/bin/schema-cli.js.map +1 -1
  14. package/dist/bin/signals-cli.js +15 -1910
  15. package/dist/bin/signals-cli.js.map +1 -1
  16. package/dist/chunk-3HISR2XI.js +36 -0
  17. package/dist/chunk-3HISR2XI.js.map +1 -0
  18. package/dist/chunk-5HZEJGZ5.js +725 -0
  19. package/dist/chunk-5HZEJGZ5.js.map +1 -0
  20. package/dist/chunk-7SVYOPJ3.js +9412 -0
  21. package/dist/chunk-7SVYOPJ3.js.map +1 -0
  22. package/dist/chunk-BCO3FUUO.js +682 -0
  23. package/dist/chunk-BCO3FUUO.js.map +1 -0
  24. package/dist/chunk-BJDL6JEX.js +208 -0
  25. package/dist/chunk-BJDL6JEX.js.map +1 -0
  26. package/dist/chunk-BTUS6PZZ.js +302 -0
  27. package/dist/chunk-BTUS6PZZ.js.map +1 -0
  28. package/dist/chunk-CW4CSNVF.js +410 -0
  29. package/dist/chunk-CW4CSNVF.js.map +1 -0
  30. package/dist/chunk-HIBZ2AY7.js +194 -0
  31. package/dist/chunk-HIBZ2AY7.js.map +1 -0
  32. package/dist/chunk-HS4F3BRR.js +985 -0
  33. package/dist/chunk-HS4F3BRR.js.map +1 -0
  34. package/dist/chunk-HY6JQOFN.js +32 -0
  35. package/dist/chunk-HY6JQOFN.js.map +1 -0
  36. package/dist/chunk-K2FYT43R.js +837 -0
  37. package/dist/chunk-K2FYT43R.js.map +1 -0
  38. package/dist/chunk-K7BMFGQP.js +43 -0
  39. package/dist/chunk-K7BMFGQP.js.map +1 -0
  40. package/dist/chunk-LWAH2UG7.js +103 -0
  41. package/dist/chunk-LWAH2UG7.js.map +1 -0
  42. package/dist/chunk-OHE2AOH4.js +273 -0
  43. package/dist/chunk-OHE2AOH4.js.map +1 -0
  44. package/dist/chunk-P3DNOZOG.js +1488 -0
  45. package/dist/chunk-P3DNOZOG.js.map +1 -0
  46. package/dist/chunk-PQ6TKPUN.js +27 -0
  47. package/dist/chunk-PQ6TKPUN.js.map +1 -0
  48. package/dist/chunk-QCCN6POA.js +211 -0
  49. package/dist/chunk-QCCN6POA.js.map +1 -0
  50. package/dist/chunk-RSLFR4TO.js +631 -0
  51. package/dist/chunk-RSLFR4TO.js.map +1 -0
  52. package/dist/chunk-UP2VWCW5.js +33 -0
  53. package/dist/chunk-UP2VWCW5.js.map +1 -0
  54. package/dist/chunk-W6TQFTTY.js +130 -0
  55. package/dist/chunk-W6TQFTTY.js.map +1 -0
  56. package/dist/chunk-WSMVLWLB.js +269 -0
  57. package/dist/chunk-WSMVLWLB.js.map +1 -0
  58. package/dist/config/index.d.ts +69 -11
  59. package/dist/config/index.js +24 -1227
  60. package/dist/config/index.js.map +1 -1
  61. package/dist/crucible/fulpack/index.js +2 -25
  62. package/dist/crucible/fulpack/index.js.map +1 -1
  63. package/dist/crucible/index.js +13 -1129
  64. package/dist/crucible/index.js.map +1 -1
  65. package/dist/docscribe/index.js +2 -680
  66. package/dist/docscribe/index.js.map +1 -1
  67. package/dist/errors/index.js +5 -1831
  68. package/dist/errors/index.js.map +1 -1
  69. package/dist/errors-D7KXV3QW.js +4 -0
  70. package/dist/errors-D7KXV3QW.js.map +1 -0
  71. package/dist/errors-RBJX6ETJ.js +8 -0
  72. package/dist/errors-RBJX6ETJ.js.map +1 -0
  73. package/dist/export-BWRETGYS.js +6 -0
  74. package/dist/export-BWRETGYS.js.map +1 -0
  75. package/dist/foundry/index.d.ts +1 -1
  76. package/dist/foundry/index.js +340 -3949
  77. package/dist/foundry/index.js.map +1 -1
  78. package/dist/foundry/similarity/index.js +3 -134
  79. package/dist/foundry/similarity/index.js.map +1 -1
  80. package/dist/fulencode/index.js +3 -319
  81. package/dist/fulencode/index.js.map +1 -1
  82. package/dist/fulhash/index.js +3 -611
  83. package/dist/fulhash/index.js.map +1 -1
  84. package/dist/fulpack/index.js +3 -1515
  85. package/dist/fulpack/index.js.map +1 -1
  86. package/dist/hash-YOJYVOWH.js +4 -0
  87. package/dist/hash-YOJYVOWH.js.map +1 -0
  88. package/dist/index.d.ts +2 -2
  89. package/dist/index.js +14 -4390
  90. package/dist/index.js.map +1 -1
  91. package/dist/loader-H5K7HSO5.js +9 -0
  92. package/dist/loader-H5K7HSO5.js.map +1 -0
  93. package/dist/logging/index.js +2 -723
  94. package/dist/logging/index.js.map +1 -1
  95. package/dist/pathfinder/index.js +18 -2341
  96. package/dist/pathfinder/index.js.map +1 -1
  97. package/dist/prom-client-PNEBGD3G.js +4801 -0
  98. package/dist/prom-client-PNEBGD3G.js.map +1 -0
  99. package/dist/reports/license-inventory.csv +1 -1
  100. package/dist/schema/index.d.ts +19 -6
  101. package/dist/schema/index.js +4 -6148
  102. package/dist/schema/index.js.map +1 -1
  103. package/dist/signals/index.d.ts +1 -1
  104. package/dist/signals/index.js +8 -2767
  105. package/dist/signals/index.js.map +1 -1
  106. package/dist/similarity/index.js +3 -134
  107. package/dist/similarity/index.js.map +1 -1
  108. package/dist/telemetry/http/index.js +9 -930
  109. package/dist/telemetry/http/index.js.map +1 -1
  110. package/dist/telemetry/index.js +4 -1561
  111. package/dist/telemetry/index.js.map +1 -1
  112. package/dist/telemetry/prometheus/index.js +7 -8417
  113. package/dist/telemetry/prometheus/index.js.map +1 -1
  114. package/dist/{types-Dv5TERCM.d.ts → types-CHDvDRCf.d.ts} +17 -1
  115. package/dist/validator-U4CKD2Y3.js +6 -0
  116. package/dist/validator-U4CKD2Y3.js.map +1 -0
  117. package/package.json +5 -1
  118. package/schemas/crucible-ts/library/module-manifest/v1.0.0/module-manifest.schema.json +1 -1
  119. package/schemas/crucible-ts/observability/logging/v1.0.0/definitions.schema.json +1 -1
  120. package/schemas/crucible-ts/observability/logging/v1.0.0/log-event.schema.json +13 -13
  121. package/schemas/crucible-ts/observability/logging/v1.0.0/logger-config.schema.json +2 -2
  122. package/schemas/crucible-ts/observability/logging/v1.0.0/logging-policy.schema.json +1 -1
  123. package/schemas/crucible-ts/observability/logging/v1.0.0/middleware-config.schema.json +2 -2
  124. package/schemas/crucible-ts/observability/logging/v1.0.0/severity-filter.schema.json +3 -3
  125. package/schemas/crucible-ts/upstream/3leaps/crucible/PROVENANCE.md +3 -3
  126. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/catalog/classifiers/README.md +1 -1
  127. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/classifiers-framework.md +1 -1
  128. 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,208 @@
1
+ import { AppIdentityError } from './chunk-W6TQFTTY.js';
2
+ import { validateDataBySchemaId } from './chunk-7SVYOPJ3.js';
3
+ import { readFile, access } from 'fs/promises';
4
+ import { parse } from 'yaml';
5
+ import { join, dirname } from 'path';
6
+
7
+ // src/appidentity/cache.ts
8
+ var cachedIdentity = null;
9
+ function getCachedIdentity() {
10
+ return cachedIdentity;
11
+ }
12
+ function setCachedIdentity(identity) {
13
+ cachedIdentity = identity;
14
+ }
15
+ function clearIdentityCache() {
16
+ cachedIdentity = null;
17
+ }
18
+
19
+ // src/appidentity/constants.ts
20
+ var APP_IDENTITY_FILENAME = "app.yaml";
21
+ var APP_IDENTITY_DIR = ".fulmen";
22
+ var APP_IDENTITY_ENV_VAR = "FULMEN_APP_IDENTITY_PATH";
23
+ var APP_IDENTITY_SCHEMA_ID = "config/repository/app-identity/v1.0.0/app-identity";
24
+ var MAX_ANCESTOR_SEARCH_DEPTH = 20;
25
+ async function discoverIdentityPath(options) {
26
+ if (options?.path) {
27
+ const exists = await fileExists(options.path);
28
+ if (!exists) {
29
+ throw AppIdentityError.notFound([options.path]);
30
+ }
31
+ return { path: options.path, source: "explicit" };
32
+ }
33
+ const envPath = process.env[APP_IDENTITY_ENV_VAR];
34
+ if (envPath) {
35
+ const exists = await fileExists(envPath);
36
+ if (!exists) {
37
+ throw AppIdentityError.envOverrideMissing(envPath);
38
+ }
39
+ return { path: envPath, source: "env" };
40
+ }
41
+ const startDir = options?.startDir || process.cwd();
42
+ const result = await searchAncestors(startDir);
43
+ if (result) {
44
+ return { path: result, source: "ancestor" };
45
+ }
46
+ return null;
47
+ }
48
+ async function searchAncestors(startDir) {
49
+ let currentDir = startDir;
50
+ const searchedPaths = [];
51
+ for (let i = 0; i < MAX_ANCESTOR_SEARCH_DEPTH; i++) {
52
+ const candidatePath = join(currentDir, APP_IDENTITY_DIR, APP_IDENTITY_FILENAME);
53
+ searchedPaths.push(candidatePath);
54
+ if (await fileExists(candidatePath)) {
55
+ return candidatePath;
56
+ }
57
+ const parentDir = dirname(currentDir);
58
+ if (parentDir === currentDir) {
59
+ throw AppIdentityError.notFound(searchedPaths);
60
+ }
61
+ currentDir = parentDir;
62
+ }
63
+ throw AppIdentityError.notFound(searchedPaths);
64
+ }
65
+ async function fileExists(path) {
66
+ try {
67
+ await access(path);
68
+ return true;
69
+ } catch {
70
+ return false;
71
+ }
72
+ }
73
+ var embeddedIdentity = null;
74
+ var isRegistered = false;
75
+ function deepFreeze(obj) {
76
+ Object.freeze(obj);
77
+ Object.getOwnPropertyNames(obj).forEach((prop) => {
78
+ const value = obj[prop];
79
+ if (value !== null && (typeof value === "object" || typeof value === "function") && !Object.isFrozen(value)) {
80
+ deepFreeze(value);
81
+ }
82
+ });
83
+ return obj;
84
+ }
85
+ async function registerEmbeddedIdentity(data, options) {
86
+ if (isRegistered) {
87
+ throw AppIdentityError.alreadyRegistered();
88
+ }
89
+ const skipValidation = options?.skipValidation ?? false;
90
+ let identity;
91
+ if (typeof data === "string") {
92
+ let parsed;
93
+ try {
94
+ parsed = parse(data);
95
+ } catch (error) {
96
+ throw AppIdentityError.embeddedParseFailed(
97
+ error instanceof Error ? error : new Error(String(error))
98
+ );
99
+ }
100
+ if (!skipValidation) {
101
+ const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);
102
+ if (!result.valid) {
103
+ throw AppIdentityError.embeddedValidationFailed(result.diagnostics);
104
+ }
105
+ }
106
+ identity = parsed;
107
+ } else {
108
+ if (!skipValidation) {
109
+ const result = await validateDataBySchemaId(data, APP_IDENTITY_SCHEMA_ID);
110
+ if (!result.valid) {
111
+ throw AppIdentityError.embeddedValidationFailed(result.diagnostics);
112
+ }
113
+ }
114
+ identity = data;
115
+ }
116
+ embeddedIdentity = deepFreeze(structuredClone(identity));
117
+ isRegistered = true;
118
+ }
119
+ function hasEmbeddedIdentity() {
120
+ return isRegistered;
121
+ }
122
+ function getEmbeddedIdentity() {
123
+ return embeddedIdentity;
124
+ }
125
+ function clearEmbeddedIdentity() {
126
+ embeddedIdentity = null;
127
+ isRegistered = false;
128
+ }
129
+
130
+ // src/appidentity/loader.ts
131
+ function deepFreeze2(obj) {
132
+ Object.freeze(obj);
133
+ Object.getOwnPropertyNames(obj).forEach((prop) => {
134
+ const value = obj[prop];
135
+ if (value !== null && (typeof value === "object" || typeof value === "function") && !Object.isFrozen(value)) {
136
+ deepFreeze2(value);
137
+ }
138
+ });
139
+ return obj;
140
+ }
141
+ async function loadIdentity(options) {
142
+ if (options?.identity) {
143
+ return deepFreeze2(structuredClone(options.identity));
144
+ }
145
+ if (!options?.skipCache) {
146
+ const cached = getCachedIdentity();
147
+ if (cached) {
148
+ return cached;
149
+ }
150
+ }
151
+ let discovery;
152
+ try {
153
+ discovery = await discoverIdentityPath({
154
+ path: options?.path,
155
+ startDir: options?.startDir
156
+ });
157
+ } catch (error) {
158
+ const hasExplicitPath = Boolean(options?.path);
159
+ const hasEnvOverride = Boolean(process.env[APP_IDENTITY_ENV_VAR]);
160
+ if (!hasExplicitPath && !hasEnvOverride && error instanceof AppIdentityError) {
161
+ const embedded = getEmbeddedIdentity();
162
+ if (embedded) {
163
+ setCachedIdentity(embedded);
164
+ return embedded;
165
+ }
166
+ }
167
+ throw error;
168
+ }
169
+ if (!discovery) {
170
+ const embedded = getEmbeddedIdentity();
171
+ if (embedded) {
172
+ setCachedIdentity(embedded);
173
+ return embedded;
174
+ }
175
+ throw AppIdentityError.notFound([]);
176
+ }
177
+ let content;
178
+ try {
179
+ content = await readFile(discovery.path, "utf-8");
180
+ } catch (error) {
181
+ throw AppIdentityError.readFailed(
182
+ discovery.path,
183
+ error instanceof Error ? error : new Error(String(error))
184
+ );
185
+ }
186
+ let parsed;
187
+ try {
188
+ parsed = parse(content);
189
+ } catch (error) {
190
+ throw AppIdentityError.parseFailed(
191
+ discovery.path,
192
+ error instanceof Error ? error : new Error(String(error))
193
+ );
194
+ }
195
+ if (!options?.skipValidation) {
196
+ const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);
197
+ if (!result.valid) {
198
+ throw AppIdentityError.validationFailed(discovery.path, result.diagnostics);
199
+ }
200
+ }
201
+ const identity = deepFreeze2(structuredClone(parsed));
202
+ setCachedIdentity(identity);
203
+ return identity;
204
+ }
205
+
206
+ export { APP_IDENTITY_DIR, APP_IDENTITY_ENV_VAR, APP_IDENTITY_FILENAME, APP_IDENTITY_SCHEMA_ID, MAX_ANCESTOR_SEARCH_DEPTH, clearEmbeddedIdentity, clearIdentityCache, getCachedIdentity, getEmbeddedIdentity, hasEmbeddedIdentity, loadIdentity, registerEmbeddedIdentity };
207
+ //# sourceMappingURL=chunk-BJDL6JEX.js.map
208
+ //# sourceMappingURL=chunk-BJDL6JEX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/appidentity/cache.ts","../src/appidentity/constants.ts","../src/appidentity/discovery.ts","../src/appidentity/embedded.ts","../src/appidentity/loader.ts"],"names":["parseYAML","deepFreeze"],"mappings":"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","file":"chunk-BJDL6JEX.js","sourcesContent":["/**\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 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, RegisterEmbeddedIdentityOptions } 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 (unless `skipValidation`)\n * - Stores as immutable process-level fallback\n *\n * @param data - YAML string or pre-parsed Identity object\n * @param options - Optional registration options (see {@link RegisterEmbeddedIdentityOptions})\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 *\n * @example\n * ```typescript\n * // In a `bun --compile` single-file binary, the FS-backed schema registry\n * // is unavailable. Register a build-time-embedded, CI-validated identity\n * // without re-validating against the (absent) schema registry:\n * import embeddedYaml from \"./app-identity.embedded.js\"; // inlined at build\n * registerEmbeddedIdentity(embeddedYaml, { skipValidation: true });\n * ```\n */\nexport async function registerEmbeddedIdentity(\n data: string | Identity,\n options?: RegisterEmbeddedIdentityOptions,\n): Promise<void> {\n // First-wins semantics\n if (isRegistered) {\n throw AppIdentityError.alreadyRegistered();\n }\n\n const skipValidation = options?.skipValidation ?? false;\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 (unless skipValidation)\n if (!skipValidation) {\n const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\n }\n\n identity = parsed as Identity;\n } else {\n // Pre-parsed object - still validate (unless skipValidation)\n if (!skipValidation) {\n const result = await validateDataBySchemaId(data, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\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 */\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport { clearIdentityCache, getCachedIdentity };\n"]}