@tiangong-lca/cli 0.0.32 → 0.1.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 (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -12
  3. package/assets/import-smoke/simapro.csv +20 -0
  4. package/bin/tiangong-lca.js +1 -1
  5. package/dist/src/cli.js +103 -65
  6. package/dist/src/cli.js.map +1 -1
  7. package/dist/src/lib/dataset-bilingual.js.map +1 -1
  8. package/dist/src/lib/dataset-classification.js.map +1 -1
  9. package/dist/src/lib/dataset-contract.js.map +1 -1
  10. package/dist/src/lib/dataset-evidence-search.js.map +1 -1
  11. package/dist/src/lib/dataset-import-lca.js +302 -131
  12. package/dist/src/lib/dataset-import-lca.js.map +1 -1
  13. package/dist/src/lib/dataset-maintenance-apply.js +916 -43
  14. package/dist/src/lib/dataset-maintenance-apply.js.map +1 -1
  15. package/dist/src/lib/dataset-maintenance-clear-account.js +10 -4
  16. package/dist/src/lib/dataset-maintenance-clear-account.js.map +1 -1
  17. package/dist/src/lib/dataset-maintenance-contract.js +1 -6
  18. package/dist/src/lib/dataset-maintenance-contract.js.map +1 -1
  19. package/dist/src/lib/dataset-maintenance-derivatives.js +0 -1
  20. package/dist/src/lib/dataset-maintenance-derivatives.js.map +1 -1
  21. package/dist/src/lib/dataset-maintenance-flow-identity-capture.js +1 -0
  22. package/dist/src/lib/dataset-maintenance-flow-identity-capture.js.map +1 -1
  23. package/dist/src/lib/dataset-maintenance-pagination.js.map +1 -1
  24. package/dist/src/lib/dataset-maintenance-protected-before.js.map +1 -1
  25. package/dist/src/lib/dataset-maintenance-protected-contract.js +0 -1
  26. package/dist/src/lib/dataset-maintenance-protected-contract.js.map +1 -1
  27. package/dist/src/lib/dataset-maintenance-protected-freeze.js.map +1 -1
  28. package/dist/src/lib/dataset-maintenance-protected-preparation.js +0 -2
  29. package/dist/src/lib/dataset-maintenance-protected-preparation.js.map +1 -1
  30. package/dist/src/lib/dataset-maintenance-protected-seal.js.map +1 -1
  31. package/dist/src/lib/dataset-maintenance-protected-verify.js +0 -3
  32. package/dist/src/lib/dataset-maintenance-protected-verify.js.map +1 -1
  33. package/dist/src/lib/dataset-maintenance-remote.js +68 -12
  34. package/dist/src/lib/dataset-maintenance-remote.js.map +1 -1
  35. package/dist/src/lib/dataset-maintenance-verify.js +1 -2
  36. package/dist/src/lib/dataset-maintenance-verify.js.map +1 -1
  37. package/dist/src/lib/dataset-remote-refresh.js.map +1 -1
  38. package/dist/src/lib/dataset-remote-verify.js +2 -0
  39. package/dist/src/lib/dataset-remote-verify.js.map +1 -1
  40. package/dist/src/lib/dataset-save-draft-run.js +2 -0
  41. package/dist/src/lib/dataset-save-draft-run.js.map +1 -1
  42. package/dist/src/lib/flow-build-alias-map.js.map +1 -1
  43. package/dist/src/lib/flow-fetch-rows.js.map +1 -1
  44. package/dist/src/lib/flow-get.js.map +1 -1
  45. package/dist/src/lib/flow-governance.js.map +1 -1
  46. package/dist/src/lib/flow-list.js +1 -0
  47. package/dist/src/lib/flow-list.js.map +1 -1
  48. package/dist/src/lib/flow-payload-validation.js.map +1 -1
  49. package/dist/src/lib/flow-publish-version.js +1 -0
  50. package/dist/src/lib/flow-publish-version.js.map +1 -1
  51. package/dist/src/lib/flow-read.js +1 -0
  52. package/dist/src/lib/flow-read.js.map +1 -1
  53. package/dist/src/lib/flow-regen-product.js.map +1 -1
  54. package/dist/src/lib/flow-remediate.js.map +1 -1
  55. package/dist/src/lib/identity-preflight.js +4 -10
  56. package/dist/src/lib/identity-preflight.js.map +1 -1
  57. package/dist/src/lib/lifecyclemodel-bundle-save.js +1 -0
  58. package/dist/src/lib/lifecyclemodel-bundle-save.js.map +1 -1
  59. package/dist/src/lib/lifecyclemodel-orchestrate.js.map +1 -1
  60. package/dist/src/lib/lifecyclemodel-publish-resulting-process.js.map +1 -1
  61. package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -1
  62. package/dist/src/lib/lifecyclemodel-save-draft-run.js.map +1 -1
  63. package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -1
  64. package/dist/src/lib/package-version.js.map +1 -1
  65. package/dist/src/lib/process-auto-build.js.map +1 -1
  66. package/dist/src/lib/process-dedup-review.js +14 -7
  67. package/dist/src/lib/process-dedup-review.js.map +1 -1
  68. package/dist/src/lib/process-flow-build-plan.js +111 -30
  69. package/dist/src/lib/process-flow-build-plan.js.map +1 -1
  70. package/dist/src/lib/process-get.js +1 -0
  71. package/dist/src/lib/process-get.js.map +1 -1
  72. package/dist/src/lib/process-list.js +1 -0
  73. package/dist/src/lib/process-list.js.map +1 -1
  74. package/dist/src/lib/process-payload-validation.js.map +1 -1
  75. package/dist/src/lib/process-qa.js.map +1 -1
  76. package/dist/src/lib/process-refresh-references.js +15 -10
  77. package/dist/src/lib/process-refresh-references.js.map +1 -1
  78. package/dist/src/lib/process-save-draft.js +9 -3
  79. package/dist/src/lib/process-save-draft.js.map +1 -1
  80. package/dist/src/lib/process-scope-statistics.js +11 -4
  81. package/dist/src/lib/process-scope-statistics.js.map +1 -1
  82. package/dist/src/lib/process-verify-rows.js.map +1 -1
  83. package/dist/src/lib/publish.js.map +1 -1
  84. package/dist/src/lib/run.js.map +1 -1
  85. package/dist/src/lib/supabase-client.js +13 -1
  86. package/dist/src/lib/supabase-client.js.map +1 -1
  87. package/dist/src/lib/supabase-data-api-contract.js +328 -0
  88. package/dist/src/lib/supabase-data-api-contract.js.map +1 -0
  89. package/dist/src/lib/supabase-data-api-replay.js +69 -0
  90. package/dist/src/lib/supabase-data-api-replay.js.map +1 -0
  91. package/dist/src/lib/supabase-json-ordered-write.js +2 -0
  92. package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
  93. package/dist/src/lib/supabase-rest.js +1 -0
  94. package/dist/src/lib/supabase-rest.js.map +1 -1
  95. package/dist/src/lib/tidas-sdk-package-validator.js +5 -5
  96. package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -1
  97. package/dist/src/lib/validation.js.map +1 -1
  98. package/dist/src/main.js.map +1 -1
  99. package/package.json +40 -40
  100. package/dist/scripts/assert-full-coverage.js +0 -77
  101. package/dist/scripts/assert-full-coverage.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-classification.js","sourceRoot":"","sources":["../../../src/lib/dataset-classification.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport {\n cloneJson,\n firstNonEmpty,\n isRecord,\n readDatasetRowsInput,\n trimToken,\n unwrapDatasetPayload,\n type JsonObject,\n} from './dataset-local.js';\nimport { CliError } from './errors.js';\nimport { readJsonInput } from './io.js';\n\nexport type DatasetClassificationType =\n | 'contact'\n | 'flow-elementary'\n | 'flow-product'\n | 'flowproperty'\n | 'lciamethod'\n | 'location'\n | 'process'\n | 'source'\n | 'unitgroup';\n\ntype ClassificationValueKey = '@catId' | '@classId' | '@code';\n\nexport type ClassificationEntry = {\n level: number;\n code: string;\n text: string;\n value_key: ClassificationValueKey;\n};\n\nexport type ClassificationPathEntry = {\n '@level': string;\n '@classId'?: string;\n '@catId'?: string;\n '@code'?: string;\n '#text': string;\n};\n\nexport type DatasetClassificationChildrenReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed' | 'blocked';\n command: 'dataset classification children';\n category_type: DatasetClassificationType;\n schema_file: string;\n parent_code: string | null;\n query: string | null;\n counts: {\n children: number;\n returned: number;\n };\n children: Array<ClassificationEntry & { path: ClassificationPathEntry[] }>;\n blockers: Array<{ code: string; message: string }>;\n files?: {\n report: string;\n };\n};\n\nexport type DatasetClassificationPathReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed' | 'blocked';\n command: 'dataset classification path';\n category_type: DatasetClassificationType;\n schema_file: string;\n code: string;\n path: ClassificationPathEntry[];\n blockers: Array<{ code: string; message: string }>;\n files?: {\n report: string;\n };\n};\n\nexport type DatasetClassificationApplyReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed' | 'blocked';\n command: 'dataset classification apply';\n input_path: string;\n decisions_path: string;\n out_path: string;\n default_category_type: DatasetClassificationType | null;\n counts: {\n rows: number;\n decisions: number;\n applied: number;\n blockers: number;\n };\n blockers: DatasetClassificationBlocker[];\n files: {\n classified_rows: string;\n evidence: string;\n report: string;\n };\n};\n\nexport type DatasetClassificationAuditFinding = {\n row_index: number;\n dataset_id: string | null;\n dataset_version: string | null;\n path: string;\n value: string;\n status: 'valid' | 'invalid';\n description: string | null;\n};\n\nexport type DatasetClassificationAuditReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed' | 'blocked';\n command: 'dataset classification audit';\n category_type: DatasetClassificationType;\n schema_file: string;\n input_path: string;\n counts: {\n rows: number;\n location_targets: number;\n valid: number;\n invalid: number;\n };\n findings: DatasetClassificationAuditFinding[];\n blockers: DatasetClassificationBlocker[];\n files?: {\n findings: string;\n report: string;\n };\n};\n\nexport type DatasetClassificationBlocker = {\n code: string;\n message: string;\n decision_index?: number;\n row_index?: number;\n dataset_id?: string | null;\n dataset_version?: string | null;\n};\n\nexport type RunDatasetClassificationChildrenOptions = {\n type: string;\n parent?: string | null;\n query?: string | null;\n limit?: number | null;\n outDir?: string | null;\n now?: Date;\n};\n\nexport type RunDatasetClassificationPathOptions = {\n type: string;\n code: string;\n outDir?: string | null;\n now?: Date;\n};\n\nexport type RunDatasetClassificationAuditOptions = {\n inputPath: string;\n type: string;\n outDir?: string | null;\n rawInput?: unknown;\n now?: Date;\n};\n\nexport type RunDatasetClassificationApplyOptions = {\n inputPath: string;\n decisionsPath: string;\n outPath: string;\n type?: string | null;\n outDir?: string | null;\n rawInput?: unknown;\n rawDecisions?: unknown;\n now?: Date;\n};\n\ntype CategoryConfig = {\n type: DatasetClassificationType;\n schemaFile: string;\n defaultValueKey: ClassificationValueKey;\n target: 'common:category' | 'common:class' | 'location';\n};\n\ntype ClassificationNavigator = {\n entries: ClassificationEntry[];\n entriesByCode: Map<string, ClassificationEntry>;\n childMap: Map<string, ClassificationEntry[]>;\n parentMap: Map<string, ClassificationEntry | null>;\n};\n\ntype NormalizedDecision = {\n decisionIndex: number;\n rowIndex: number | null;\n datasetId: string | null;\n datasetVersion: string | null;\n categoryType: DatasetClassificationType;\n path: ClassificationPathEntry[];\n targetPath: string | null;\n basis: string | null;\n evidence: unknown;\n};\n\ntype LocationTarget = {\n path: string;\n parentPath: string;\n parent: JsonObject;\n key: string;\n value: string;\n};\n\ntype PreparedClassificationRow = {\n index: number;\n row: JsonObject;\n payload: JsonObject;\n rootKey: string | null;\n informationKey: string | null;\n id: string | null;\n version: string | null;\n};\n\nconst CATEGORY_CONFIGS: Record<DatasetClassificationType, CategoryConfig> = {\n contact: {\n type: 'contact',\n schemaFile: 'tidas_contacts_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n 'flow-elementary': {\n type: 'flow-elementary',\n schemaFile: 'tidas_flows_elementary_category.json',\n defaultValueKey: '@catId',\n target: 'common:category',\n },\n 'flow-product': {\n type: 'flow-product',\n schemaFile: 'tidas_flows_product_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n flowproperty: {\n type: 'flowproperty',\n schemaFile: 'tidas_flowproperties_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n lciamethod: {\n type: 'lciamethod',\n schemaFile: 'tidas_lciamethods_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n location: {\n type: 'location',\n schemaFile: 'tidas_locations_category.json',\n defaultValueKey: '@code',\n target: 'location',\n },\n process: {\n type: 'process',\n schemaFile: 'tidas_processes_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n source: {\n type: 'source',\n schemaFile: 'tidas_sources_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n unitgroup: {\n type: 'unitgroup',\n schemaFile: 'tidas_unitgroups_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n};\n\nconst DATASET_ROOTS = [\n { rootKey: 'contactDataSet', informationKey: 'contactInformation', type: 'contact' },\n { rootKey: 'flowDataSet', informationKey: 'flowInformation', type: 'flow-product' },\n {\n rootKey: 'flowPropertyDataSet',\n informationKey: 'flowPropertiesInformation',\n type: 'flowproperty',\n },\n { rootKey: 'LCIAMethodDataSet', informationKey: 'LCIAMethodInformation', type: 'lciamethod' },\n {\n rootKey: 'lifeCycleModelDataSet',\n informationKey: 'lifeCycleModelInformation',\n type: 'lifecyclemodel',\n },\n { rootKey: 'processDataSet', informationKey: 'processInformation', type: 'process' },\n { rootKey: 'sourceDataSet', informationKey: 'sourceInformation', type: 'source' },\n { rootKey: 'unitGroupDataSet', informationKey: 'unitGroupInformation', type: 'unitgroup' },\n] as const;\n\nconst TYPE_ALIASES: Record<string, DatasetClassificationType> = {\n contact: 'contact',\n contacts: 'contact',\n elementary: 'flow-elementary',\n elementaryflow: 'flow-elementary',\n elementaryflows: 'flow-elementary',\n 'elementary-flow': 'flow-elementary',\n 'elementary-flows': 'flow-elementary',\n flowelementary: 'flow-elementary',\n 'flow-elementary': 'flow-elementary',\n flowproduct: 'flow-product',\n flowproducts: 'flow-product',\n 'flow-product': 'flow-product',\n 'flow-products': 'flow-product',\n flows: 'flow-product',\n product: 'flow-product',\n productflow: 'flow-product',\n productflows: 'flow-product',\n 'product-flow': 'flow-product',\n 'product-flows': 'flow-product',\n flowproperties: 'flowproperty',\n flowproperty: 'flowproperty',\n lcia: 'lciamethod',\n lciamethod: 'lciamethod',\n lciamethods: 'lciamethod',\n location: 'location',\n locations: 'location',\n process: 'process',\n processes: 'process',\n source: 'source',\n sources: 'source',\n unitgroup: 'unitgroup',\n unitgroups: 'unitgroup',\n};\n\nfunction normalizeType(value: unknown): DatasetClassificationType {\n const token = trimToken(value)\n ?.toLowerCase()\n .replace(/[_\\s]+/gu, '-');\n const normalized = token ? (TYPE_ALIASES[token] ?? TYPE_ALIASES[token.replace(/-/gu, '')]) : null;\n if (!normalized) {\n throw new CliError(`Unsupported classification type: ${String(value ?? '')}`, {\n code: 'CLASSIFICATION_TYPE_UNSUPPORTED',\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction schemasDir(candidatesOverride?: string[]): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = candidatesOverride ?? [\n path.resolve(here, '../../assets/tidas-schemas'),\n path.resolve(here, '../../../assets/tidas-schemas'),\n path.resolve(process.cwd(), 'assets/tidas-schemas'),\n ];\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new CliError('Bundled TIDAS schemas were not found under assets/tidas-schemas.', {\n code: 'TIDAS_SCHEMAS_NOT_FOUND',\n exitCode: 2,\n });\n }\n return found;\n}\n\nfunction schemaPath(config: CategoryConfig): string {\n return path.join(schemasDir(), config.schemaFile);\n}\n\nconst FALLBACK_LOCATION_TARGET_KEYS = new Set([\n '@location',\n '@subLocation',\n 'impactLocation',\n 'impactSubLocation',\n 'interventionLocation',\n 'interventionSubLocation',\n 'intervensionSubLocation',\n 'location',\n 'locationOfSupply',\n 'subLocation',\n]);\nlet cachedLocationTargetKeys: Set<string> | null = null;\n\nfunction lastSchemaPropertyName(schemaPathSegments: string[]): string | null {\n let propertyName: string | null = null;\n for (let index = 0; index < schemaPathSegments.length - 1; index += 1) {\n if (schemaPathSegments[index] === 'properties') {\n propertyName = schemaPathSegments[index + 1]!;\n }\n }\n return propertyName;\n}\n\nfunction collectLocationRefKeysFromSchema(\n value: unknown,\n schemaPathSegments: string[],\n keys: Set<string>,\n): void {\n if (Array.isArray(value)) {\n value.forEach((item, index) =>\n collectLocationRefKeysFromSchema(item, [...schemaPathSegments, String(index)], keys),\n );\n return;\n }\n if (!isRecord(value)) return;\n\n if (value.$ref === 'tidas_locations_category.json') {\n const propertyName = lastSchemaPropertyName(schemaPathSegments);\n if (propertyName) keys.add(propertyName);\n }\n for (const [key, child] of Object.entries(value)) {\n collectLocationRefKeysFromSchema(child, [...schemaPathSegments, key], keys);\n }\n}\n\nfunction locationTargetKeys(): Set<string> {\n if (cachedLocationTargetKeys) return cachedLocationTargetKeys;\n const keys = new Set<string>();\n const dir = schemasDir();\n for (const fileName of readdirSync(dir).filter(isJsonSchemaFileName)) {\n const document = JSON.parse(readFileSync(path.join(dir, fileName), 'utf8')) as unknown;\n collectLocationRefKeysFromSchema(document, [], keys);\n }\n cachedLocationTargetKeys = new Set([...FALLBACK_LOCATION_TARGET_KEYS, ...keys]);\n return cachedLocationTargetKeys;\n}\n\nfunction isJsonSchemaFileName(fileName: string): boolean {\n return fileName.endsWith('.json');\n}\n\nfunction constText(value: unknown): string | null {\n return isRecord(value) ? firstNonEmpty(value.const) : null;\n}\n\nfunction collectEntriesFromNode(\n node: unknown,\n defaultValueKey: ClassificationValueKey,\n entries: ClassificationEntry[],\n): void {\n if (Array.isArray(node)) {\n node.forEach((entry) => collectEntriesFromNode(entry, defaultValueKey, entries));\n return;\n }\n if (!isRecord(node)) return;\n\n if (isRecord(node.properties)) {\n const properties = node.properties;\n const level = firstNonEmpty(constText(properties['@level']), '0');\n const valueKey =\n (['@classId', '@catId', '@code'] as const).find((key) => constText(properties[key])) ??\n defaultValueKey;\n const code = constText(properties[valueKey]);\n const text = constText(properties['#text']);\n if (level && code && text) {\n const parsedLevel = Number(level);\n if (Number.isInteger(parsedLevel)) {\n entries.push({ level: parsedLevel, code, text, value_key: valueKey });\n }\n }\n } else if (node.const !== undefined && typeof node.description === 'string') {\n entries.push({\n level: 0,\n code: String(node.const),\n text: node.description,\n value_key: '@code',\n });\n }\n\n for (const value of Object.values(node)) {\n if (isRecord(value) || Array.isArray(value)) {\n collectEntriesFromNode(value, defaultValueKey, entries);\n }\n }\n}\n\nfunction loadEntries(type: DatasetClassificationType): {\n config: CategoryConfig;\n schema: string;\n entries: ClassificationEntry[];\n} {\n const config = CATEGORY_CONFIGS[type];\n const schema = schemaPath(config);\n const document = JSON.parse(readFileSync(schema, 'utf8')) as unknown;\n const entries: ClassificationEntry[] = [];\n collectEntriesFromNode(document, config.defaultValueKey, entries);\n return { config, schema, entries };\n}\n\nfunction buildNavigator(entries: ClassificationEntry[]): ClassificationNavigator {\n const childMap = new Map<string, ClassificationEntry[]>();\n const parentMap = new Map<string, ClassificationEntry | null>();\n const entriesByCode = new Map<string, ClassificationEntry>();\n const lastPerLevel = new Map<number, ClassificationEntry>();\n\n for (const entry of entries) {\n entriesByCode.set(entry.code, entry);\n if (entry.level === 0) {\n const roots = childMap.get('') ?? [];\n roots.push(entry);\n childMap.set('', roots);\n parentMap.set(entry.code, null);\n } else {\n let parent: ClassificationEntry | null = null;\n for (let level = entry.level - 1; level >= 0; level -= 1) {\n parent = lastPerLevel.get(level) ?? null;\n if (parent) break;\n }\n if (parent) {\n const children = childMap.get(parent.code) ?? [];\n children.push(entry);\n childMap.set(parent.code, children);\n parentMap.set(entry.code, parent);\n }\n }\n lastPerLevel.set(entry.level, entry);\n }\n return { entries, entriesByCode, childMap, parentMap };\n}\n\nfunction navigatorFor(type: DatasetClassificationType): {\n config: CategoryConfig;\n schema: string;\n navigator: ClassificationNavigator;\n} {\n const { config, schema, entries } = loadEntries(type);\n return { config, schema, navigator: buildNavigator(entries) };\n}\n\nfunction pathForCode(navigator: ClassificationNavigator, code: string): ClassificationEntry[] {\n const entry = navigator.entriesByCode.get(code);\n if (!entry) return [];\n const pathEntries = [entry];\n let current = entry;\n while (true) {\n const parent = navigator.parentMap.get(current.code);\n if (!parent) break;\n pathEntries.push(parent);\n current = parent;\n }\n return pathEntries.reverse();\n}\n\nfunction toPathEntry(entry: ClassificationEntry): ClassificationPathEntry {\n return {\n '@level': String(entry.level),\n [entry.value_key]: entry.code,\n '#text': entry.text,\n } as ClassificationPathEntry;\n}\n\nfunction classCode(value: unknown): string | null {\n return isRecord(value)\n ? firstNonEmpty(\n value['@classId'],\n value['@catId'],\n value['@code'],\n value.class_id,\n value.classId,\n value.cat_id,\n value.catId,\n value.code,\n )\n : null;\n}\n\nfunction pathExpression(pathSegments: Array<string | number>): string {\n return pathSegments.map(String).join('.');\n}\n\nfunction normalizeTargetPath(value: unknown): string | null {\n const raw = firstNonEmpty(value);\n if (!raw) return null;\n if (raw.startsWith('/')) {\n return raw\n .split('/')\n .slice(1)\n .map((segment) => segment.replace(/~1/gu, '/').replace(/~0/gu, '~'))\n .join('.');\n }\n return raw;\n}\n\nfunction decisionTargetPath(decision: JsonObject): string | null {\n return normalizeTargetPath(\n decision.target_path ??\n decision.targetPath ??\n decision.field_path ??\n decision.fieldPath ??\n decision.location_path ??\n decision.locationPath ??\n decision.json_pointer ??\n decision.jsonPointer,\n );\n}\n\nfunction normalizePathFromClasses(\n type: DatasetClassificationType,\n classes: unknown,\n): ClassificationPathEntry[] {\n const { navigator } = navigatorFor(type);\n const rawClasses = Array.isArray(classes) ? classes : isRecord(classes) ? [classes] : [];\n if (rawClasses.length === 0) return [];\n const leafCode = classCode(rawClasses[rawClasses.length - 1]);\n if (!leafCode) return [];\n const canonical = pathForCode(navigator, leafCode);\n const rawCodes = rawClasses.map(classCode).filter(Boolean);\n const canonicalCodes = canonical.map((entry) => entry.code);\n if (\n rawCodes.length > 0 &&\n rawCodes.join('/') !== canonicalCodes.slice(0, rawCodes.length).join('/')\n ) {\n return [];\n }\n return canonical.map(toPathEntry);\n}\n\nfunction normalizePathFromDecision(\n type: DatasetClassificationType,\n decision: JsonObject,\n): ClassificationPathEntry[] {\n const explicit =\n decision.classes ??\n decision.classification_classes ??\n (isRecord(decision.classification)\n ? (decision.classification['common:class'] ??\n decision.classification['common:category'] ??\n decision.classification.classes)\n : null);\n const explicitPath = normalizePathFromClasses(type, explicit);\n if (explicitPath.length > 0) return explicitPath;\n\n const directCode = firstNonEmpty(\n decision.code,\n decision.class_id,\n decision.classId,\n decision.cat_id,\n decision.catId,\n decision.leaf_code,\n decision.leafCode,\n );\n if (directCode) {\n const { navigator } = navigatorFor(type);\n return pathForCode(navigator, directCode).map(toPathEntry);\n }\n\n const rawLabels = decision.classification_path ?? decision.classificationPath;\n const rawIds = decision.class_ids ?? decision.classIds;\n const labels: unknown[] = Array.isArray(rawLabels) ? rawLabels : [];\n const ids: unknown[] = Array.isArray(rawIds) ? rawIds : [];\n if (labels.length > 0 && labels.length === ids.length) {\n return normalizePathFromClasses(\n type,\n labels.map((label, index) => ({\n '@level': String(index),\n '@classId': ids[index],\n '#text': label,\n })),\n );\n }\n\n return [];\n}\n\nfunction normalizeDecisionType(\n decision: JsonObject,\n fallbackType: DatasetClassificationType | null,\n): DatasetClassificationType | null {\n const raw = firstNonEmpty(\n decision.category_type,\n decision.categoryType,\n decision.classification_type,\n decision.classificationType,\n decision.type,\n );\n return raw ? normalizeType(raw) : fallbackType;\n}\n\nfunction readJsonLines(filePath: string): JsonObject[] {\n return readFileSync(filePath, 'utf8')\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed)) {\n throw new CliError(`Classification decision line ${index + 1} is not an object.`, {\n code: 'CLASSIFICATION_DECISION_INVALID',\n exitCode: 2,\n });\n }\n return parsed;\n });\n}\n\nfunction normalizeStructuredDecisions(value: unknown): JsonObject[] {\n if (Array.isArray(value)) return value.filter(isRecord);\n if (isRecord(value) && Array.isArray(value.decisions)) return value.decisions.filter(isRecord);\n if (isRecord(value) && Array.isArray(value.rows)) return value.rows.filter(isRecord);\n return isRecord(value) ? [value] : [];\n}\n\nfunction readDecisions(pathValue: string, rawInput?: unknown): JsonObject[] {\n if (!pathValue) {\n throw new CliError('Missing required --decisions value.', {\n code: 'CLASSIFICATION_DECISIONS_REQUIRED',\n exitCode: 2,\n });\n }\n if (rawInput !== undefined) return normalizeStructuredDecisions(rawInput);\n const resolved = path.resolve(pathValue);\n if (!existsSync(resolved)) {\n throw new CliError(`Classification decisions file not found: ${resolved}`, {\n code: 'CLASSIFICATION_DECISIONS_NOT_FOUND',\n exitCode: 2,\n });\n }\n return resolved.toLowerCase().endsWith('.jsonl')\n ? readJsonLines(resolved)\n : normalizeStructuredDecisions(readJsonInput(resolved));\n}\n\nfunction prepareRows(inputPath: string, rawInput?: unknown): PreparedClassificationRow[] {\n return readDatasetRowsInput(inputPath, rawInput).map((row, index) => {\n const clonedRow = cloneJson(row);\n const payload = unwrapDatasetPayload(clonedRow);\n const descriptor = DATASET_ROOTS.find((candidate) => isRecord(payload[candidate.rootKey]));\n const root = descriptor ? (payload[descriptor.rootKey] as JsonObject) : {};\n const info =\n descriptor && isRecord(root[descriptor.informationKey])\n ? (root[descriptor.informationKey] as JsonObject)\n : {};\n const dataSetInformation = isRecord(info.dataSetInformation)\n ? (info.dataSetInformation as JsonObject)\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? (root.administrativeInformation as JsonObject)\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? (administrativeInformation.publicationAndOwnership as JsonObject)\n : {};\n return {\n index,\n row: clonedRow,\n payload,\n rootKey: descriptor?.rootKey ?? null,\n informationKey: descriptor?.informationKey ?? null,\n id: firstNonEmpty(clonedRow.id, dataSetInformation['common:UUID']),\n version: firstNonEmpty(clonedRow.version, publicationAndOwnership['common:dataSetVersion']),\n };\n });\n}\n\nfunction classificationContainer(\n row: PreparedClassificationRow,\n type: DatasetClassificationType,\n): JsonObject | null {\n if (CATEGORY_CONFIGS[type].target === 'location') return null;\n if (!row.rootKey || !row.informationKey) return null;\n const root = row.payload[row.rootKey];\n if (!isRecord(root)) return null;\n const info = root[row.informationKey];\n if (!isRecord(info)) return null;\n if (!isRecord(info.dataSetInformation)) info.dataSetInformation = {};\n const dataSetInformation = info.dataSetInformation as JsonObject;\n if (!isRecord(dataSetInformation.classificationInformation)) {\n dataSetInformation.classificationInformation = {};\n }\n const classificationInformation = dataSetInformation.classificationInformation as JsonObject;\n const target = CATEGORY_CONFIGS[type].target;\n if (target === 'common:category') {\n if (!isRecord(classificationInformation['common:elementaryFlowCategorization'])) {\n classificationInformation['common:elementaryFlowCategorization'] = {};\n }\n return classificationInformation['common:elementaryFlowCategorization'] as JsonObject;\n }\n if (!isRecord(classificationInformation['common:classification'])) {\n classificationInformation['common:classification'] = {};\n }\n return classificationInformation['common:classification'] as JsonObject;\n}\n\nfunction currentClassification(\n row: PreparedClassificationRow,\n type: DatasetClassificationType,\n): unknown {\n const container = classificationContainer(row, type);\n if (!container) return null;\n return CATEGORY_CONFIGS[type].target === 'common:category'\n ? container['common:category']\n : container['common:class'];\n}\n\nfunction setClassification(\n row: PreparedClassificationRow,\n type: DatasetClassificationType,\n classificationPath: ClassificationPathEntry[],\n): boolean {\n const container = classificationContainer(row, type);\n if (!container) return false;\n if (CATEGORY_CONFIGS[type].target === 'common:category') {\n container['common:category'] = cloneJson(classificationPath);\n } else {\n container['common:class'] = cloneJson(classificationPath);\n }\n return true;\n}\n\nfunction isLocationTargetKey(key: string): boolean {\n return locationTargetKeys().has(key);\n}\n\nfunction locationTargetStringValue(value: unknown): {\n parent: JsonObject | null;\n key: string | null;\n pathSuffix: Array<string | number>;\n value: string;\n} | null {\n if (typeof value === 'string') {\n return {\n parent: null,\n key: null,\n pathSuffix: [],\n value: value.trim(),\n };\n }\n if (isRecord(value) && typeof value['#text'] === 'string') {\n return {\n parent: value,\n key: '#text',\n pathSuffix: ['#text'],\n value: value['#text'].trim(),\n };\n }\n return null;\n}\n\nfunction collectLocationTargets(\n value: unknown,\n pathSegments: Array<string | number> = [],\n targets: LocationTarget[] = [],\n): LocationTarget[] {\n if (!isRecord(value)) {\n if (Array.isArray(value)) {\n value.forEach((item, index) =>\n collectLocationTargets(item, [...pathSegments, index], targets),\n );\n }\n return targets;\n }\n\n for (const [key, child] of Object.entries(value)) {\n const childPath = [...pathSegments, key];\n if (isLocationTargetKey(key)) {\n const targetValue = locationTargetStringValue(child);\n if (targetValue) {\n const leafPath = [...childPath, ...targetValue.pathSuffix];\n const parent = targetValue.pathSuffix.length > 0 ? targetValue.parent : value;\n const targetKey = targetValue.pathSuffix.length > 0 ? targetValue.key : key;\n targets.push({\n path: pathExpression(leafPath),\n parentPath: pathExpression(targetValue.pathSuffix.length > 0 ? childPath : pathSegments),\n parent: parent as JsonObject,\n key: targetKey as string,\n value: targetValue.value,\n });\n }\n }\n collectLocationTargets(child, childPath, targets);\n }\n return targets;\n}\n\nfunction locationCodeFromPath(classificationPath: ClassificationPathEntry[]): string | null {\n const leaf = classificationPath.at(-1);\n return classCode(leaf);\n}\n\nfunction resolveLocationTarget(\n row: PreparedClassificationRow,\n decision: NormalizedDecision,\n): LocationTarget[] {\n const targets = collectLocationTargets(row.payload);\n if (!decision.targetPath) return targets;\n const matchingTargets = targets.filter(\n (target) => target.path === decision.targetPath || target.parentPath === decision.targetPath,\n );\n if (matchingTargets.length > 0) return matchingTargets;\n const createdTarget = createMissingLocationTarget(row, decision.targetPath);\n return createdTarget ? [createdTarget] : [];\n}\n\nfunction targetPathSegments(targetPath: string): string[] {\n return targetPath\n .split('.')\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0);\n}\n\nfunction createMissingLocationTarget(\n row: PreparedClassificationRow,\n targetPath: string,\n): LocationTarget | null {\n const segments = targetPathSegments(targetPath);\n const key = segments.at(-1);\n if (!key || !isLocationTargetKey(key)) return null;\n let cursor: unknown = row.payload;\n for (const segment of segments.slice(0, -1)) {\n if (!isRecord(cursor)) return null;\n const existing = cursor[segment];\n if (existing === undefined || existing === null) {\n cursor[segment] = {};\n cursor = cursor[segment];\n continue;\n }\n if (!isRecord(existing)) return null;\n cursor = existing;\n }\n if (!isRecord(cursor)) return null;\n const existing = cursor[key];\n if (existing !== undefined && existing !== null && existing !== '') return null;\n return {\n path: targetPath,\n parentPath: pathExpression(segments.slice(0, -1)),\n parent: cursor,\n key,\n value: typeof existing === 'string' ? existing : '',\n };\n}\n\nfunction decisionMatchesRow(decision: NormalizedDecision, row: PreparedClassificationRow): boolean {\n if (decision.rowIndex !== null) return decision.rowIndex === row.index;\n if (!decision.datasetId || decision.datasetId !== row.id) return false;\n return !decision.datasetVersion || decision.datasetVersion === row.version;\n}\n\nfunction normalizeDecision(\n decision: JsonObject,\n decisionIndex: number,\n fallbackType: DatasetClassificationType | null,\n blockers: DatasetClassificationBlocker[],\n): NormalizedDecision | null {\n const rawRowIndex = decision.row_index ?? decision.rowIndex;\n const rowIndexText = firstNonEmpty(rawRowIndex);\n const rowIndex =\n typeof rawRowIndex === 'number'\n ? rawRowIndex\n : rowIndexText === null\n ? null\n : Number(rowIndexText);\n const validRowIndex =\n typeof rowIndex === 'number' && Number.isInteger(rowIndex) ? rowIndex : null;\n const datasetId = firstNonEmpty(\n decision.dataset_id,\n decision.datasetId,\n decision.id,\n decision.uuid,\n );\n const datasetVersion = firstNonEmpty(\n decision.dataset_version,\n decision.datasetVersion,\n decision.version,\n );\n const categoryType = normalizeDecisionType(decision, fallbackType);\n if (validRowIndex === null && !datasetId) {\n blockers.push({\n code: 'classification_decision_target_missing',\n message: 'Classification decision must target row_index or dataset_id.',\n decision_index: decisionIndex,\n });\n return null;\n }\n if (!categoryType) {\n blockers.push({\n code: 'classification_decision_type_missing',\n message:\n 'Classification decision must provide a category_type or the command must pass --type.',\n decision_index: decisionIndex,\n row_index: validRowIndex ?? undefined,\n dataset_id: datasetId,\n dataset_version: datasetVersion,\n });\n return null;\n }\n const classificationPath = normalizePathFromDecision(categoryType, decision);\n if (classificationPath.length === 0) {\n blockers.push({\n code: 'classification_decision_path_invalid',\n message:\n 'Classification decision must resolve to a valid path in the bundled TIDAS category schema.',\n decision_index: decisionIndex,\n row_index: validRowIndex ?? undefined,\n dataset_id: datasetId,\n dataset_version: datasetVersion,\n });\n return null;\n }\n return {\n decisionIndex,\n rowIndex: validRowIndex,\n datasetId,\n datasetVersion,\n categoryType,\n path: classificationPath,\n targetPath: decisionTargetPath(decision),\n basis: firstNonEmpty(decision.basis),\n evidence: decision.evidence ?? null,\n };\n}\n\nfunction maybeWriteReport<T extends { files?: { report: string } }>(\n report: T,\n outDir: string | null | undefined,\n filename: string,\n): T {\n if (!outDir) return report;\n const reportPath = path.join(path.resolve(outDir), 'outputs', filename);\n const finalReport = { ...report, files: { report: reportPath } };\n writeJsonArtifact(reportPath, finalReport);\n return finalReport;\n}\n\nexport async function runDatasetClassificationChildren(\n options: RunDatasetClassificationChildrenOptions,\n): Promise<DatasetClassificationChildrenReport> {\n const type = normalizeType(options.type);\n const { config, navigator } = navigatorFor(type);\n const parentCode = firstNonEmpty(options.parent);\n const rawChildren = navigator.childMap.get(parentCode ?? '') ?? [];\n const parentKnown = !parentCode || navigator.entriesByCode.has(parentCode);\n const query = firstNonEmpty(options.query)?.toLowerCase() ?? null;\n const filtered = query\n ? rawChildren.filter(\n (entry) =>\n entry.code.toLowerCase().includes(query) || entry.text.toLowerCase().includes(query),\n )\n : rawChildren;\n const limit = options.limit && options.limit > 0 ? options.limit : null;\n const returned = limit ? filtered.slice(0, limit) : filtered;\n const report: DatasetClassificationChildrenReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: parentKnown ? 'completed' : 'blocked',\n command: 'dataset classification children',\n category_type: type,\n schema_file: config.schemaFile,\n parent_code: parentCode,\n query,\n counts: {\n children: rawChildren.length,\n returned: returned.length,\n },\n children: returned.map((entry) => ({\n ...entry,\n path: pathForCode(navigator, entry.code).map(toPathEntry),\n })),\n blockers: parentKnown\n ? []\n : [{ code: 'classification_parent_unknown', message: `Unknown parent code: ${parentCode}` }],\n };\n return maybeWriteReport(report, options.outDir, 'classification-children-report.json');\n}\n\nexport async function runDatasetClassificationPath(\n options: RunDatasetClassificationPathOptions,\n): Promise<DatasetClassificationPathReport> {\n const type = normalizeType(options.type);\n const { config, navigator } = navigatorFor(type);\n const code = firstNonEmpty(options.code);\n if (!code) {\n throw new CliError('Missing required --code value.', {\n code: 'CLASSIFICATION_CODE_REQUIRED',\n exitCode: 2,\n });\n }\n const pathEntries = pathForCode(navigator, code).map(toPathEntry);\n const report: DatasetClassificationPathReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: pathEntries.length > 0 ? 'completed' : 'blocked',\n command: 'dataset classification path',\n category_type: type,\n schema_file: config.schemaFile,\n code,\n path: pathEntries,\n blockers:\n pathEntries.length > 0\n ? []\n : [\n {\n code: 'classification_code_unknown',\n message: `Unknown classification code: ${code}`,\n },\n ],\n };\n return maybeWriteReport(report, options.outDir, 'classification-path-report.json');\n}\n\nexport async function runDatasetClassificationAudit(\n options: RunDatasetClassificationAuditOptions,\n): Promise<DatasetClassificationAuditReport> {\n if (!options.inputPath) {\n throw new CliError('Missing required --input value.', {\n code: 'CLASSIFICATION_AUDIT_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n const type = normalizeType(options.type);\n if (type !== 'location') {\n throw new CliError('dataset classification audit currently supports only --type location.', {\n code: 'CLASSIFICATION_AUDIT_TYPE_UNSUPPORTED',\n exitCode: 2,\n });\n }\n const { config, navigator } = navigatorFor(type);\n const rows = prepareRows(options.inputPath, options.rawInput);\n const findings: DatasetClassificationAuditFinding[] = [];\n const blockers: DatasetClassificationBlocker[] = [];\n for (const row of rows) {\n for (const target of collectLocationTargets(row.payload)) {\n const entry = navigator.entriesByCode.get(target.value);\n const status = entry ? 'valid' : 'invalid';\n findings.push({\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n path: target.path,\n value: target.value,\n status,\n description: entry?.text ?? null,\n });\n if (!entry) {\n blockers.push({\n code: 'location_code_invalid',\n message: 'Location value is not a code from the bundled TIDAS location schema.',\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n });\n }\n }\n }\n const invalid = findings.filter((finding) => finding.status === 'invalid').length;\n const outDir = options.outDir ? path.resolve(options.outDir) : null;\n const findingsPath = outDir\n ? path.join(outDir, 'outputs', 'location-audit-findings.jsonl')\n : null;\n const reportPath = outDir ? path.join(outDir, 'outputs', 'location-audit-report.json') : null;\n const report: DatasetClassificationAuditReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: invalid > 0 ? 'blocked' : 'completed',\n command: 'dataset classification audit',\n category_type: type,\n schema_file: config.schemaFile,\n input_path: path.resolve(options.inputPath),\n counts: {\n rows: rows.length,\n location_targets: findings.length,\n valid: findings.length - invalid,\n invalid,\n },\n findings,\n blockers,\n ...(findingsPath && reportPath\n ? {\n files: {\n findings: findingsPath,\n report: reportPath,\n },\n }\n : {}),\n };\n if (findingsPath && reportPath) {\n writeJsonLinesArtifact(findingsPath, findings);\n writeJsonArtifact(reportPath, report);\n }\n return report;\n}\n\nexport async function runDatasetClassificationApply(\n options: RunDatasetClassificationApplyOptions,\n): Promise<DatasetClassificationApplyReport> {\n if (!options.inputPath) {\n throw new CliError('Missing required --input value.', {\n code: 'CLASSIFICATION_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n if (!options.outPath) {\n throw new CliError('Missing required --out value.', {\n code: 'CLASSIFICATION_OUT_REQUIRED',\n exitCode: 2,\n });\n }\n const fallbackType = options.type ? normalizeType(options.type) : null;\n const rows = prepareRows(options.inputPath, options.rawInput);\n const rawDecisions = readDecisions(options.decisionsPath, options.rawDecisions);\n const blockers: DatasetClassificationBlocker[] = [];\n const decisions = rawDecisions\n .map((decision, index) => normalizeDecision(decision, index, fallbackType, blockers))\n .filter((decision): decision is NormalizedDecision => Boolean(decision));\n const evidence = [];\n\n for (const decision of decisions) {\n const matches = rows.filter((row) => decisionMatchesRow(decision, row));\n if (matches.length !== 1) {\n blockers.push({\n code:\n matches.length === 0\n ? 'classification_target_not_found'\n : 'classification_target_ambiguous',\n message:\n matches.length === 0\n ? 'Classification decision did not match an input row.'\n : 'Classification decision matched more than one input row.',\n decision_index: decision.decisionIndex,\n row_index: decision.rowIndex ?? undefined,\n dataset_id: decision.datasetId,\n dataset_version: decision.datasetVersion,\n });\n continue;\n }\n const row = matches[0] as PreparedClassificationRow;\n if (decision.categoryType === 'location') {\n const code = locationCodeFromPath(decision.path);\n const targetMatches = resolveLocationTarget(row, decision);\n if (!code || targetMatches.length !== 1) {\n blockers.push({\n code:\n targetMatches.length === 0 ? 'location_target_not_found' : 'location_target_ambiguous',\n message:\n targetMatches.length === 0\n ? 'Location decision did not match a location field in the input row.'\n : 'Location decision matched more than one location field; provide target_path.',\n decision_index: decision.decisionIndex,\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n });\n continue;\n }\n const target = targetMatches[0] as LocationTarget;\n const previous = target.value;\n target.parent[target.key] = code;\n evidence.push({\n decision_index: decision.decisionIndex,\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n category_type: decision.categoryType,\n target_path: target.path,\n previous_location: previous,\n applied_location: code,\n applied_location_path: cloneJson(decision.path),\n basis: decision.basis,\n evidence: decision.evidence,\n });\n continue;\n }\n const previous = currentClassification(row, decision.categoryType);\n if (!setClassification(row, decision.categoryType, decision.path)) {\n blockers.push({\n code: 'classification_container_missing',\n message: 'Input row does not contain a supported classification container for this type.',\n decision_index: decision.decisionIndex,\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n });\n continue;\n }\n evidence.push({\n decision_index: decision.decisionIndex,\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n category_type: decision.categoryType,\n previous_classification: previous,\n applied_classification: cloneJson(decision.path),\n basis: decision.basis,\n evidence: decision.evidence,\n });\n }\n\n const outDir = options.outDir\n ? path.resolve(options.outDir)\n : path.dirname(path.resolve(options.outPath));\n const evidencePath = path.join(outDir, 'outputs', 'classification-apply-evidence.jsonl');\n const reportPath = path.join(outDir, 'outputs', 'classification-apply-report.json');\n writeJsonLinesArtifact(\n options.outPath,\n rows.map((row) => row.payload),\n );\n writeJsonLinesArtifact(evidencePath, evidence);\n const report: DatasetClassificationApplyReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: blockers.length > 0 ? 'blocked' : 'completed',\n command: 'dataset classification apply',\n input_path: path.resolve(options.inputPath),\n decisions_path: path.resolve(options.decisionsPath),\n out_path: path.resolve(options.outPath),\n default_category_type: fallbackType,\n counts: {\n rows: rows.length,\n decisions: rawDecisions.length,\n applied: evidence.length,\n blockers: blockers.length,\n },\n blockers,\n files: {\n classified_rows: path.resolve(options.outPath),\n evidence: evidencePath,\n report: reportPath,\n },\n };\n writeJsonArtifact(reportPath, report);\n return report;\n}\n\nexport const __testInternals = {\n buildNavigator,\n classCode,\n classificationContainer,\n collectEntriesFromNode,\n collectLocationRefKeysFromSchema,\n collectLocationTargets,\n constText,\n createMissingLocationTarget,\n currentClassification,\n decisionMatchesRow,\n decisionTargetPath,\n isJsonSchemaFileName,\n lastSchemaPropertyName,\n loadEntries,\n locationCodeFromPath,\n locationTargetStringValue,\n locationTargetKeys,\n maybeWriteReport,\n navigatorFor,\n normalizeDecision,\n normalizeDecisionType,\n normalizePathFromClasses,\n normalizePathFromDecision,\n normalizeStructuredDecisions,\n normalizeTargetPath,\n normalizeType,\n pathForCode,\n prepareRows,\n readDecisions,\n resolveLocationTarget,\n schemasDir,\n setClassification,\n targetPathSegments,\n toPathEntry,\n};\n"]}
1
+ {"version":3,"file":"dataset-classification.js","sourceRoot":"","sources":["../../../src/lib/dataset-classification.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport {\n cloneJson,\n firstNonEmpty,\n isRecord,\n readDatasetRowsInput,\n trimToken,\n unwrapDatasetPayload,\n type JsonObject,\n} from './dataset-local.js';\nimport { CliError } from './errors.js';\nimport { readJsonInput } from './io.js';\n\nexport type DatasetClassificationType =\n | 'contact'\n | 'flow-elementary'\n | 'flow-product'\n | 'flowproperty'\n | 'lciamethod'\n | 'location'\n | 'process'\n | 'source'\n | 'unitgroup';\n\ntype ClassificationValueKey = '@catId' | '@classId' | '@code';\n\nexport type ClassificationEntry = {\n level: number;\n code: string;\n text: string;\n value_key: ClassificationValueKey;\n};\n\nexport type ClassificationPathEntry = {\n '@level': string;\n '@classId'?: string;\n '@catId'?: string;\n '@code'?: string;\n '#text': string;\n};\n\nexport type DatasetClassificationChildrenReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed' | 'blocked';\n command: 'dataset classification children';\n category_type: DatasetClassificationType;\n schema_file: string;\n parent_code: string | null;\n query: string | null;\n counts: {\n children: number;\n returned: number;\n };\n children: Array<ClassificationEntry & { path: ClassificationPathEntry[] }>;\n blockers: Array<{ code: string; message: string }>;\n files?: {\n report: string;\n };\n};\n\nexport type DatasetClassificationPathReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed' | 'blocked';\n command: 'dataset classification path';\n category_type: DatasetClassificationType;\n schema_file: string;\n code: string;\n path: ClassificationPathEntry[];\n blockers: Array<{ code: string; message: string }>;\n files?: {\n report: string;\n };\n};\n\nexport type DatasetClassificationApplyReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed' | 'blocked';\n command: 'dataset classification apply';\n input_path: string;\n decisions_path: string;\n out_path: string;\n default_category_type: DatasetClassificationType | null;\n counts: {\n rows: number;\n decisions: number;\n applied: number;\n blockers: number;\n };\n blockers: DatasetClassificationBlocker[];\n files: {\n classified_rows: string;\n evidence: string;\n report: string;\n };\n};\n\nexport type DatasetClassificationAuditFinding = {\n row_index: number;\n dataset_id: string | null;\n dataset_version: string | null;\n path: string;\n value: string;\n status: 'valid' | 'invalid';\n description: string | null;\n};\n\nexport type DatasetClassificationAuditReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed' | 'blocked';\n command: 'dataset classification audit';\n category_type: DatasetClassificationType;\n schema_file: string;\n input_path: string;\n counts: {\n rows: number;\n location_targets: number;\n valid: number;\n invalid: number;\n };\n findings: DatasetClassificationAuditFinding[];\n blockers: DatasetClassificationBlocker[];\n files?: {\n findings: string;\n report: string;\n };\n};\n\nexport type DatasetClassificationBlocker = {\n code: string;\n message: string;\n decision_index?: number;\n row_index?: number;\n dataset_id?: string | null;\n dataset_version?: string | null;\n};\n\nexport type RunDatasetClassificationChildrenOptions = {\n type: string;\n parent?: string | null;\n query?: string | null;\n limit?: number | null;\n outDir?: string | null;\n now?: Date;\n};\n\nexport type RunDatasetClassificationPathOptions = {\n type: string;\n code: string;\n outDir?: string | null;\n now?: Date;\n};\n\nexport type RunDatasetClassificationAuditOptions = {\n inputPath: string;\n type: string;\n outDir?: string | null;\n rawInput?: unknown;\n now?: Date;\n};\n\nexport type RunDatasetClassificationApplyOptions = {\n inputPath: string;\n decisionsPath: string;\n outPath: string;\n type?: string | null;\n outDir?: string | null;\n rawInput?: unknown;\n rawDecisions?: unknown;\n now?: Date;\n};\n\ntype CategoryConfig = {\n type: DatasetClassificationType;\n schemaFile: string;\n defaultValueKey: ClassificationValueKey;\n target: 'common:category' | 'common:class' | 'location';\n};\n\ntype ClassificationNavigator = {\n entries: ClassificationEntry[];\n entriesByCode: Map<string, ClassificationEntry>;\n childMap: Map<string, ClassificationEntry[]>;\n parentMap: Map<string, ClassificationEntry | null>;\n};\n\ntype NormalizedDecision = {\n decisionIndex: number;\n rowIndex: number | null;\n datasetId: string | null;\n datasetVersion: string | null;\n categoryType: DatasetClassificationType;\n path: ClassificationPathEntry[];\n targetPath: string | null;\n basis: string | null;\n evidence: unknown;\n};\n\ntype LocationTarget = {\n path: string;\n parentPath: string;\n parent: JsonObject;\n key: string;\n value: string;\n};\n\ntype PreparedClassificationRow = {\n index: number;\n row: JsonObject;\n payload: JsonObject;\n rootKey: string | null;\n informationKey: string | null;\n id: string | null;\n version: string | null;\n};\n\nconst CATEGORY_CONFIGS: Record<DatasetClassificationType, CategoryConfig> = {\n contact: {\n type: 'contact',\n schemaFile: 'tidas_contacts_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n 'flow-elementary': {\n type: 'flow-elementary',\n schemaFile: 'tidas_flows_elementary_category.json',\n defaultValueKey: '@catId',\n target: 'common:category',\n },\n 'flow-product': {\n type: 'flow-product',\n schemaFile: 'tidas_flows_product_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n flowproperty: {\n type: 'flowproperty',\n schemaFile: 'tidas_flowproperties_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n lciamethod: {\n type: 'lciamethod',\n schemaFile: 'tidas_lciamethods_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n location: {\n type: 'location',\n schemaFile: 'tidas_locations_category.json',\n defaultValueKey: '@code',\n target: 'location',\n },\n process: {\n type: 'process',\n schemaFile: 'tidas_processes_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n source: {\n type: 'source',\n schemaFile: 'tidas_sources_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n unitgroup: {\n type: 'unitgroup',\n schemaFile: 'tidas_unitgroups_category.json',\n defaultValueKey: '@classId',\n target: 'common:class',\n },\n};\n\nconst DATASET_ROOTS = [\n { rootKey: 'contactDataSet', informationKey: 'contactInformation', type: 'contact' },\n { rootKey: 'flowDataSet', informationKey: 'flowInformation', type: 'flow-product' },\n {\n rootKey: 'flowPropertyDataSet',\n informationKey: 'flowPropertiesInformation',\n type: 'flowproperty',\n },\n { rootKey: 'LCIAMethodDataSet', informationKey: 'LCIAMethodInformation', type: 'lciamethod' },\n {\n rootKey: 'lifeCycleModelDataSet',\n informationKey: 'lifeCycleModelInformation',\n type: 'lifecyclemodel',\n },\n { rootKey: 'processDataSet', informationKey: 'processInformation', type: 'process' },\n { rootKey: 'sourceDataSet', informationKey: 'sourceInformation', type: 'source' },\n { rootKey: 'unitGroupDataSet', informationKey: 'unitGroupInformation', type: 'unitgroup' },\n] as const;\n\nconst TYPE_ALIASES: Record<string, DatasetClassificationType> = {\n contact: 'contact',\n contacts: 'contact',\n elementary: 'flow-elementary',\n elementaryflow: 'flow-elementary',\n elementaryflows: 'flow-elementary',\n 'elementary-flow': 'flow-elementary',\n 'elementary-flows': 'flow-elementary',\n flowelementary: 'flow-elementary',\n 'flow-elementary': 'flow-elementary',\n flowproduct: 'flow-product',\n flowproducts: 'flow-product',\n 'flow-product': 'flow-product',\n 'flow-products': 'flow-product',\n flows: 'flow-product',\n product: 'flow-product',\n productflow: 'flow-product',\n productflows: 'flow-product',\n 'product-flow': 'flow-product',\n 'product-flows': 'flow-product',\n flowproperties: 'flowproperty',\n flowproperty: 'flowproperty',\n lcia: 'lciamethod',\n lciamethod: 'lciamethod',\n lciamethods: 'lciamethod',\n location: 'location',\n locations: 'location',\n process: 'process',\n processes: 'process',\n source: 'source',\n sources: 'source',\n unitgroup: 'unitgroup',\n unitgroups: 'unitgroup',\n};\n\nfunction normalizeType(value: unknown): DatasetClassificationType {\n const token = trimToken(value)\n ?.toLowerCase()\n .replace(/[_\\s]+/gu, '-');\n const normalized = token ? (TYPE_ALIASES[token] ?? TYPE_ALIASES[token.replace(/-/gu, '')]) : null;\n if (!normalized) {\n throw new CliError(`Unsupported classification type: ${String(value ?? '')}`, {\n code: 'CLASSIFICATION_TYPE_UNSUPPORTED',\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction schemasDir(candidatesOverride?: string[]): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = candidatesOverride ?? [\n path.resolve(here, '../../assets/tidas-schemas'),\n path.resolve(here, '../../../assets/tidas-schemas'),\n path.resolve(process.cwd(), 'assets/tidas-schemas'),\n ];\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new CliError('Bundled TIDAS schemas were not found under assets/tidas-schemas.', {\n code: 'TIDAS_SCHEMAS_NOT_FOUND',\n exitCode: 2,\n });\n }\n return found;\n}\n\nfunction schemaPath(config: CategoryConfig): string {\n return path.join(schemasDir(), config.schemaFile);\n}\n\nconst FALLBACK_LOCATION_TARGET_KEYS = new Set([\n '@location',\n '@subLocation',\n 'impactLocation',\n 'impactSubLocation',\n 'interventionLocation',\n 'interventionSubLocation',\n 'intervensionSubLocation',\n 'location',\n 'locationOfSupply',\n 'subLocation',\n]);\nlet cachedLocationTargetKeys: Set<string> | null = null;\n\nfunction lastSchemaPropertyName(schemaPathSegments: string[]): string | null {\n let propertyName: string | null = null;\n for (let index = 0; index < schemaPathSegments.length - 1; index += 1) {\n if (schemaPathSegments[index] === 'properties') {\n propertyName = schemaPathSegments[index + 1]!;\n }\n }\n return propertyName;\n}\n\nfunction collectLocationRefKeysFromSchema(\n value: unknown,\n schemaPathSegments: string[],\n keys: Set<string>,\n): void {\n if (Array.isArray(value)) {\n value.forEach((item, index) =>\n collectLocationRefKeysFromSchema(item, [...schemaPathSegments, String(index)], keys),\n );\n return;\n }\n if (!isRecord(value)) return;\n\n if (value.$ref === 'tidas_locations_category.json') {\n const propertyName = lastSchemaPropertyName(schemaPathSegments);\n if (propertyName) keys.add(propertyName);\n }\n for (const [key, child] of Object.entries(value)) {\n collectLocationRefKeysFromSchema(child, [...schemaPathSegments, key], keys);\n }\n}\n\nfunction locationTargetKeys(): Set<string> {\n if (cachedLocationTargetKeys) return cachedLocationTargetKeys;\n const keys = new Set<string>();\n const dir = schemasDir();\n for (const fileName of readdirSync(dir).filter(isJsonSchemaFileName)) {\n const document = JSON.parse(readFileSync(path.join(dir, fileName), 'utf8')) as unknown;\n collectLocationRefKeysFromSchema(document, [], keys);\n }\n cachedLocationTargetKeys = new Set([...FALLBACK_LOCATION_TARGET_KEYS, ...keys]);\n return cachedLocationTargetKeys;\n}\n\nfunction isJsonSchemaFileName(fileName: string): boolean {\n return fileName.endsWith('.json');\n}\n\nfunction constText(value: unknown): string | null {\n return isRecord(value) ? firstNonEmpty(value.const) : null;\n}\n\nfunction collectEntriesFromNode(\n node: unknown,\n defaultValueKey: ClassificationValueKey,\n entries: ClassificationEntry[],\n): void {\n if (Array.isArray(node)) {\n node.forEach((entry) => collectEntriesFromNode(entry, defaultValueKey, entries));\n return;\n }\n if (!isRecord(node)) return;\n\n if (isRecord(node.properties)) {\n const properties = node.properties;\n const level = firstNonEmpty(constText(properties['@level']), '0');\n const valueKey =\n (['@classId', '@catId', '@code'] as const).find((key) => constText(properties[key])) ??\n defaultValueKey;\n const code = constText(properties[valueKey]);\n const text = constText(properties['#text']);\n if (level && code && text) {\n const parsedLevel = Number(level);\n if (Number.isInteger(parsedLevel)) {\n entries.push({ level: parsedLevel, code, text, value_key: valueKey });\n }\n }\n } else if (node.const !== undefined && typeof node.description === 'string') {\n entries.push({\n level: 0,\n code: String(node.const),\n text: node.description,\n value_key: '@code',\n });\n }\n\n for (const value of Object.values(node)) {\n if (isRecord(value) || Array.isArray(value)) {\n collectEntriesFromNode(value, defaultValueKey, entries);\n }\n }\n}\n\nfunction loadEntries(type: DatasetClassificationType): {\n config: CategoryConfig;\n schema: string;\n entries: ClassificationEntry[];\n} {\n const config = CATEGORY_CONFIGS[type];\n const schema = schemaPath(config);\n const document = JSON.parse(readFileSync(schema, 'utf8')) as unknown;\n const entries: ClassificationEntry[] = [];\n collectEntriesFromNode(document, config.defaultValueKey, entries);\n return { config, schema, entries };\n}\n\nfunction buildNavigator(entries: ClassificationEntry[]): ClassificationNavigator {\n const childMap = new Map<string, ClassificationEntry[]>();\n const parentMap = new Map<string, ClassificationEntry | null>();\n const entriesByCode = new Map<string, ClassificationEntry>();\n const lastPerLevel = new Map<number, ClassificationEntry>();\n\n for (const entry of entries) {\n entriesByCode.set(entry.code, entry);\n if (entry.level === 0) {\n const roots = childMap.get('') ?? [];\n roots.push(entry);\n childMap.set('', roots);\n parentMap.set(entry.code, null);\n } else {\n let parent: ClassificationEntry | null = null;\n for (let level = entry.level - 1; level >= 0; level -= 1) {\n parent = lastPerLevel.get(level) ?? null;\n if (parent) break;\n }\n if (parent) {\n const children = childMap.get(parent.code) ?? [];\n children.push(entry);\n childMap.set(parent.code, children);\n parentMap.set(entry.code, parent);\n }\n }\n lastPerLevel.set(entry.level, entry);\n }\n return { entries, entriesByCode, childMap, parentMap };\n}\n\nfunction navigatorFor(type: DatasetClassificationType): {\n config: CategoryConfig;\n schema: string;\n navigator: ClassificationNavigator;\n} {\n const { config, schema, entries } = loadEntries(type);\n return { config, schema, navigator: buildNavigator(entries) };\n}\n\nfunction pathForCode(navigator: ClassificationNavigator, code: string): ClassificationEntry[] {\n const entry = navigator.entriesByCode.get(code);\n if (!entry) return [];\n const pathEntries = [entry];\n let current = entry;\n while (true) {\n const parent = navigator.parentMap.get(current.code);\n if (!parent) break;\n pathEntries.push(parent);\n current = parent;\n }\n return pathEntries.reverse();\n}\n\nfunction toPathEntry(entry: ClassificationEntry): ClassificationPathEntry {\n return {\n '@level': String(entry.level),\n [entry.value_key]: entry.code,\n '#text': entry.text,\n } as ClassificationPathEntry;\n}\n\nfunction classCode(value: unknown): string | null {\n return isRecord(value)\n ? firstNonEmpty(\n value['@classId'],\n value['@catId'],\n value['@code'],\n value.class_id,\n value.classId,\n value.cat_id,\n value.catId,\n value.code,\n )\n : null;\n}\n\nfunction pathExpression(pathSegments: Array<string | number>): string {\n return pathSegments.map(String).join('.');\n}\n\nfunction normalizeTargetPath(value: unknown): string | null {\n const raw = firstNonEmpty(value);\n if (!raw) return null;\n if (raw.startsWith('/')) {\n return raw\n .split('/')\n .slice(1)\n .map((segment) => segment.replace(/~1/gu, '/').replace(/~0/gu, '~'))\n .join('.');\n }\n return raw;\n}\n\nfunction decisionTargetPath(decision: JsonObject): string | null {\n return normalizeTargetPath(\n decision.target_path ??\n decision.targetPath ??\n decision.field_path ??\n decision.fieldPath ??\n decision.location_path ??\n decision.locationPath ??\n decision.json_pointer ??\n decision.jsonPointer,\n );\n}\n\nfunction normalizePathFromClasses(\n type: DatasetClassificationType,\n classes: unknown,\n): ClassificationPathEntry[] {\n const { navigator } = navigatorFor(type);\n const rawClasses = Array.isArray(classes) ? classes : isRecord(classes) ? [classes] : [];\n if (rawClasses.length === 0) return [];\n const leafCode = classCode(rawClasses[rawClasses.length - 1]);\n if (!leafCode) return [];\n const canonical = pathForCode(navigator, leafCode);\n const rawCodes = rawClasses.map(classCode).filter(Boolean);\n const canonicalCodes = canonical.map((entry) => entry.code);\n if (\n rawCodes.length > 0 &&\n rawCodes.join('/') !== canonicalCodes.slice(0, rawCodes.length).join('/')\n ) {\n return [];\n }\n return canonical.map(toPathEntry);\n}\n\nfunction normalizePathFromDecision(\n type: DatasetClassificationType,\n decision: JsonObject,\n): ClassificationPathEntry[] {\n const explicit =\n decision.classes ??\n decision.classification_classes ??\n (isRecord(decision.classification)\n ? (decision.classification['common:class'] ??\n decision.classification['common:category'] ??\n decision.classification.classes)\n : null);\n const explicitPath = normalizePathFromClasses(type, explicit);\n if (explicitPath.length > 0) return explicitPath;\n\n const directCode = firstNonEmpty(\n decision.code,\n decision.class_id,\n decision.classId,\n decision.cat_id,\n decision.catId,\n decision.leaf_code,\n decision.leafCode,\n );\n if (directCode) {\n const { navigator } = navigatorFor(type);\n return pathForCode(navigator, directCode).map(toPathEntry);\n }\n\n const rawLabels = decision.classification_path ?? decision.classificationPath;\n const rawIds = decision.class_ids ?? decision.classIds;\n const labels: unknown[] = Array.isArray(rawLabels) ? rawLabels : [];\n const ids: unknown[] = Array.isArray(rawIds) ? rawIds : [];\n if (labels.length > 0 && labels.length === ids.length) {\n return normalizePathFromClasses(\n type,\n labels.map((label, index) => ({\n '@level': String(index),\n '@classId': ids[index],\n '#text': label,\n })),\n );\n }\n\n return [];\n}\n\nfunction normalizeDecisionType(\n decision: JsonObject,\n fallbackType: DatasetClassificationType | null,\n): DatasetClassificationType | null {\n const raw = firstNonEmpty(\n decision.category_type,\n decision.categoryType,\n decision.classification_type,\n decision.classificationType,\n decision.type,\n );\n return raw ? normalizeType(raw) : fallbackType;\n}\n\nfunction readJsonLines(filePath: string): JsonObject[] {\n return readFileSync(filePath, 'utf8')\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed)) {\n throw new CliError(`Classification decision line ${index + 1} is not an object.`, {\n code: 'CLASSIFICATION_DECISION_INVALID',\n exitCode: 2,\n });\n }\n return parsed;\n });\n}\n\nfunction normalizeStructuredDecisions(value: unknown): JsonObject[] {\n if (Array.isArray(value)) return value.filter(isRecord);\n if (isRecord(value) && Array.isArray(value.decisions)) return value.decisions.filter(isRecord);\n if (isRecord(value) && Array.isArray(value.rows)) return value.rows.filter(isRecord);\n return isRecord(value) ? [value] : [];\n}\n\nfunction readDecisions(pathValue: string, rawInput?: unknown): JsonObject[] {\n if (!pathValue) {\n throw new CliError('Missing required --decisions value.', {\n code: 'CLASSIFICATION_DECISIONS_REQUIRED',\n exitCode: 2,\n });\n }\n if (rawInput !== undefined) return normalizeStructuredDecisions(rawInput);\n const resolved = path.resolve(pathValue);\n if (!existsSync(resolved)) {\n throw new CliError(`Classification decisions file not found: ${resolved}`, {\n code: 'CLASSIFICATION_DECISIONS_NOT_FOUND',\n exitCode: 2,\n });\n }\n return resolved.toLowerCase().endsWith('.jsonl')\n ? readJsonLines(resolved)\n : normalizeStructuredDecisions(readJsonInput(resolved));\n}\n\nfunction prepareRows(inputPath: string, rawInput?: unknown): PreparedClassificationRow[] {\n return readDatasetRowsInput(inputPath, rawInput).map((row, index) => {\n const clonedRow = cloneJson(row);\n const payload = unwrapDatasetPayload(clonedRow);\n const descriptor = DATASET_ROOTS.find((candidate) => isRecord(payload[candidate.rootKey]));\n const root = descriptor ? (payload[descriptor.rootKey] as JsonObject) : {};\n const info =\n descriptor && isRecord(root[descriptor.informationKey])\n ? (root[descriptor.informationKey] as JsonObject)\n : {};\n const dataSetInformation = isRecord(info.dataSetInformation)\n ? (info.dataSetInformation as JsonObject)\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? (root.administrativeInformation as JsonObject)\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? (administrativeInformation.publicationAndOwnership as JsonObject)\n : {};\n return {\n index,\n row: clonedRow,\n payload,\n rootKey: descriptor?.rootKey ?? null,\n informationKey: descriptor?.informationKey ?? null,\n id: firstNonEmpty(clonedRow.id, dataSetInformation['common:UUID']),\n version: firstNonEmpty(clonedRow.version, publicationAndOwnership['common:dataSetVersion']),\n };\n });\n}\n\nfunction classificationContainer(\n row: PreparedClassificationRow,\n type: DatasetClassificationType,\n): JsonObject | null {\n if (CATEGORY_CONFIGS[type].target === 'location') return null;\n if (!row.rootKey || !row.informationKey) return null;\n const root = row.payload[row.rootKey];\n if (!isRecord(root)) return null;\n const info = root[row.informationKey];\n if (!isRecord(info)) return null;\n if (!isRecord(info.dataSetInformation)) info.dataSetInformation = {};\n const dataSetInformation = info.dataSetInformation as JsonObject;\n if (!isRecord(dataSetInformation.classificationInformation)) {\n dataSetInformation.classificationInformation = {};\n }\n const classificationInformation = dataSetInformation.classificationInformation as JsonObject;\n const target = CATEGORY_CONFIGS[type].target;\n if (target === 'common:category') {\n if (!isRecord(classificationInformation['common:elementaryFlowCategorization'])) {\n classificationInformation['common:elementaryFlowCategorization'] = {};\n }\n return classificationInformation['common:elementaryFlowCategorization'] as JsonObject;\n }\n if (!isRecord(classificationInformation['common:classification'])) {\n classificationInformation['common:classification'] = {};\n }\n return classificationInformation['common:classification'] as JsonObject;\n}\n\nfunction currentClassification(\n row: PreparedClassificationRow,\n type: DatasetClassificationType,\n): unknown {\n const container = classificationContainer(row, type);\n if (!container) return null;\n return CATEGORY_CONFIGS[type].target === 'common:category'\n ? container['common:category']\n : container['common:class'];\n}\n\nfunction setClassification(\n row: PreparedClassificationRow,\n type: DatasetClassificationType,\n classificationPath: ClassificationPathEntry[],\n): boolean {\n const container = classificationContainer(row, type);\n if (!container) return false;\n if (CATEGORY_CONFIGS[type].target === 'common:category') {\n container['common:category'] = cloneJson(classificationPath);\n } else {\n container['common:class'] = cloneJson(classificationPath);\n }\n return true;\n}\n\nfunction isLocationTargetKey(key: string): boolean {\n return locationTargetKeys().has(key);\n}\n\nfunction locationTargetStringValue(value: unknown): {\n parent: JsonObject | null;\n key: string | null;\n pathSuffix: Array<string | number>;\n value: string;\n} | null {\n if (typeof value === 'string') {\n return {\n parent: null,\n key: null,\n pathSuffix: [],\n value: value.trim(),\n };\n }\n if (isRecord(value) && typeof value['#text'] === 'string') {\n return {\n parent: value,\n key: '#text',\n pathSuffix: ['#text'],\n value: value['#text'].trim(),\n };\n }\n return null;\n}\n\nfunction collectLocationTargets(\n value: unknown,\n pathSegments: Array<string | number> = [],\n targets: LocationTarget[] = [],\n): LocationTarget[] {\n if (!isRecord(value)) {\n if (Array.isArray(value)) {\n value.forEach((item, index) =>\n collectLocationTargets(item, [...pathSegments, index], targets),\n );\n }\n return targets;\n }\n\n for (const [key, child] of Object.entries(value)) {\n const childPath = [...pathSegments, key];\n if (isLocationTargetKey(key)) {\n const targetValue = locationTargetStringValue(child);\n if (targetValue) {\n const leafPath = [...childPath, ...targetValue.pathSuffix];\n const parent = targetValue.pathSuffix.length > 0 ? targetValue.parent : value;\n const targetKey = targetValue.pathSuffix.length > 0 ? targetValue.key : key;\n targets.push({\n path: pathExpression(leafPath),\n parentPath: pathExpression(targetValue.pathSuffix.length > 0 ? childPath : pathSegments),\n parent: parent as JsonObject,\n key: targetKey as string,\n value: targetValue.value,\n });\n }\n }\n collectLocationTargets(child, childPath, targets);\n }\n return targets;\n}\n\nfunction locationCodeFromPath(classificationPath: ClassificationPathEntry[]): string | null {\n const leaf = classificationPath.at(-1);\n return classCode(leaf);\n}\n\nfunction resolveLocationTarget(\n row: PreparedClassificationRow,\n decision: NormalizedDecision,\n): LocationTarget[] {\n const targets = collectLocationTargets(row.payload);\n if (!decision.targetPath) return targets;\n const matchingTargets = targets.filter(\n (target) => target.path === decision.targetPath || target.parentPath === decision.targetPath,\n );\n if (matchingTargets.length > 0) return matchingTargets;\n const createdTarget = createMissingLocationTarget(row, decision.targetPath);\n return createdTarget ? [createdTarget] : [];\n}\n\nfunction targetPathSegments(targetPath: string): string[] {\n return targetPath\n .split('.')\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0);\n}\n\nfunction createMissingLocationTarget(\n row: PreparedClassificationRow,\n targetPath: string,\n): LocationTarget | null {\n const segments = targetPathSegments(targetPath);\n const key = segments.at(-1);\n if (!key || !isLocationTargetKey(key)) return null;\n let cursor: unknown = row.payload;\n for (const segment of segments.slice(0, -1)) {\n if (!isRecord(cursor)) return null;\n const existing = cursor[segment];\n if (existing === undefined || existing === null) {\n cursor[segment] = {};\n cursor = cursor[segment];\n continue;\n }\n if (!isRecord(existing)) return null;\n cursor = existing;\n }\n if (!isRecord(cursor)) return null;\n const existing = cursor[key];\n if (existing !== undefined && existing !== null && existing !== '') return null;\n return {\n path: targetPath,\n parentPath: pathExpression(segments.slice(0, -1)),\n parent: cursor,\n key,\n value: typeof existing === 'string' ? existing : '',\n };\n}\n\nfunction decisionMatchesRow(decision: NormalizedDecision, row: PreparedClassificationRow): boolean {\n if (decision.rowIndex !== null) return decision.rowIndex === row.index;\n if (!decision.datasetId || decision.datasetId !== row.id) return false;\n return !decision.datasetVersion || decision.datasetVersion === row.version;\n}\n\nfunction normalizeDecision(\n decision: JsonObject,\n decisionIndex: number,\n fallbackType: DatasetClassificationType | null,\n blockers: DatasetClassificationBlocker[],\n): NormalizedDecision | null {\n const rawRowIndex = decision.row_index ?? decision.rowIndex;\n const rowIndexText = firstNonEmpty(rawRowIndex);\n const rowIndex =\n typeof rawRowIndex === 'number'\n ? rawRowIndex\n : rowIndexText === null\n ? null\n : Number(rowIndexText);\n const validRowIndex =\n typeof rowIndex === 'number' && Number.isInteger(rowIndex) ? rowIndex : null;\n const datasetId = firstNonEmpty(\n decision.dataset_id,\n decision.datasetId,\n decision.id,\n decision.uuid,\n );\n const datasetVersion = firstNonEmpty(\n decision.dataset_version,\n decision.datasetVersion,\n decision.version,\n );\n const categoryType = normalizeDecisionType(decision, fallbackType);\n if (validRowIndex === null && !datasetId) {\n blockers.push({\n code: 'classification_decision_target_missing',\n message: 'Classification decision must target row_index or dataset_id.',\n decision_index: decisionIndex,\n });\n return null;\n }\n if (!categoryType) {\n blockers.push({\n code: 'classification_decision_type_missing',\n message:\n 'Classification decision must provide a category_type or the command must pass --type.',\n decision_index: decisionIndex,\n row_index: validRowIndex ?? undefined,\n dataset_id: datasetId,\n dataset_version: datasetVersion,\n });\n return null;\n }\n const classificationPath = normalizePathFromDecision(categoryType, decision);\n if (classificationPath.length === 0) {\n blockers.push({\n code: 'classification_decision_path_invalid',\n message:\n 'Classification decision must resolve to a valid path in the bundled TIDAS category schema.',\n decision_index: decisionIndex,\n row_index: validRowIndex ?? undefined,\n dataset_id: datasetId,\n dataset_version: datasetVersion,\n });\n return null;\n }\n return {\n decisionIndex,\n rowIndex: validRowIndex,\n datasetId,\n datasetVersion,\n categoryType,\n path: classificationPath,\n targetPath: decisionTargetPath(decision),\n basis: firstNonEmpty(decision.basis),\n evidence: decision.evidence ?? null,\n };\n}\n\nfunction maybeWriteReport<T extends { files?: { report: string } }>(\n report: T,\n outDir: string | null | undefined,\n filename: string,\n): T {\n if (!outDir) return report;\n const reportPath = path.join(path.resolve(outDir), 'outputs', filename);\n const finalReport = { ...report, files: { report: reportPath } };\n writeJsonArtifact(reportPath, finalReport);\n return finalReport;\n}\n\nexport async function runDatasetClassificationChildren(\n options: RunDatasetClassificationChildrenOptions,\n): Promise<DatasetClassificationChildrenReport> {\n const type = normalizeType(options.type);\n const { config, navigator } = navigatorFor(type);\n const parentCode = firstNonEmpty(options.parent);\n const rawChildren = navigator.childMap.get(parentCode ?? '') ?? [];\n const parentKnown = !parentCode || navigator.entriesByCode.has(parentCode);\n const query = firstNonEmpty(options.query)?.toLowerCase() ?? null;\n const filtered = query\n ? rawChildren.filter(\n (entry) =>\n entry.code.toLowerCase().includes(query) || entry.text.toLowerCase().includes(query),\n )\n : rawChildren;\n const limit = options.limit && options.limit > 0 ? options.limit : null;\n const returned = limit ? filtered.slice(0, limit) : filtered;\n const report: DatasetClassificationChildrenReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: parentKnown ? 'completed' : 'blocked',\n command: 'dataset classification children',\n category_type: type,\n schema_file: config.schemaFile,\n parent_code: parentCode,\n query,\n counts: {\n children: rawChildren.length,\n returned: returned.length,\n },\n children: returned.map((entry) => ({\n ...entry,\n path: pathForCode(navigator, entry.code).map(toPathEntry),\n })),\n blockers: parentKnown\n ? []\n : [{ code: 'classification_parent_unknown', message: `Unknown parent code: ${parentCode}` }],\n };\n return maybeWriteReport(report, options.outDir, 'classification-children-report.json');\n}\n\nexport async function runDatasetClassificationPath(\n options: RunDatasetClassificationPathOptions,\n): Promise<DatasetClassificationPathReport> {\n const type = normalizeType(options.type);\n const { config, navigator } = navigatorFor(type);\n const code = firstNonEmpty(options.code);\n if (!code) {\n throw new CliError('Missing required --code value.', {\n code: 'CLASSIFICATION_CODE_REQUIRED',\n exitCode: 2,\n });\n }\n const pathEntries = pathForCode(navigator, code).map(toPathEntry);\n const report: DatasetClassificationPathReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: pathEntries.length > 0 ? 'completed' : 'blocked',\n command: 'dataset classification path',\n category_type: type,\n schema_file: config.schemaFile,\n code,\n path: pathEntries,\n blockers:\n pathEntries.length > 0\n ? []\n : [\n {\n code: 'classification_code_unknown',\n message: `Unknown classification code: ${code}`,\n },\n ],\n };\n return maybeWriteReport(report, options.outDir, 'classification-path-report.json');\n}\n\nexport async function runDatasetClassificationAudit(\n options: RunDatasetClassificationAuditOptions,\n): Promise<DatasetClassificationAuditReport> {\n if (!options.inputPath) {\n throw new CliError('Missing required --input value.', {\n code: 'CLASSIFICATION_AUDIT_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n const type = normalizeType(options.type);\n if (type !== 'location') {\n throw new CliError('dataset classification audit currently supports only --type location.', {\n code: 'CLASSIFICATION_AUDIT_TYPE_UNSUPPORTED',\n exitCode: 2,\n });\n }\n const { config, navigator } = navigatorFor(type);\n const rows = prepareRows(options.inputPath, options.rawInput);\n const findings: DatasetClassificationAuditFinding[] = [];\n const blockers: DatasetClassificationBlocker[] = [];\n for (const row of rows) {\n for (const target of collectLocationTargets(row.payload)) {\n const entry = navigator.entriesByCode.get(target.value);\n const status = entry ? 'valid' : 'invalid';\n findings.push({\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n path: target.path,\n value: target.value,\n status,\n description: entry?.text ?? null,\n });\n if (!entry) {\n blockers.push({\n code: 'location_code_invalid',\n message: 'Location value is not a code from the bundled TIDAS location schema.',\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n });\n }\n }\n }\n const invalid = findings.filter((finding) => finding.status === 'invalid').length;\n const outDir = options.outDir ? path.resolve(options.outDir) : null;\n const findingsPath = outDir\n ? path.join(outDir, 'outputs', 'location-audit-findings.jsonl')\n : null;\n const reportPath = outDir ? path.join(outDir, 'outputs', 'location-audit-report.json') : null;\n const report: DatasetClassificationAuditReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: invalid > 0 ? 'blocked' : 'completed',\n command: 'dataset classification audit',\n category_type: type,\n schema_file: config.schemaFile,\n input_path: path.resolve(options.inputPath),\n counts: {\n rows: rows.length,\n location_targets: findings.length,\n valid: findings.length - invalid,\n invalid,\n },\n findings,\n blockers,\n ...(findingsPath && reportPath\n ? {\n files: {\n findings: findingsPath,\n report: reportPath,\n },\n }\n : {}),\n };\n if (findingsPath && reportPath) {\n writeJsonLinesArtifact(findingsPath, findings);\n writeJsonArtifact(reportPath, report);\n }\n return report;\n}\n\nexport async function runDatasetClassificationApply(\n options: RunDatasetClassificationApplyOptions,\n): Promise<DatasetClassificationApplyReport> {\n if (!options.inputPath) {\n throw new CliError('Missing required --input value.', {\n code: 'CLASSIFICATION_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n if (!options.outPath) {\n throw new CliError('Missing required --out value.', {\n code: 'CLASSIFICATION_OUT_REQUIRED',\n exitCode: 2,\n });\n }\n const fallbackType = options.type ? normalizeType(options.type) : null;\n const rows = prepareRows(options.inputPath, options.rawInput);\n const rawDecisions = readDecisions(options.decisionsPath, options.rawDecisions);\n const blockers: DatasetClassificationBlocker[] = [];\n const decisions = rawDecisions\n .map((decision, index) => normalizeDecision(decision, index, fallbackType, blockers))\n .filter((decision): decision is NormalizedDecision => Boolean(decision));\n const evidence = [];\n\n for (const decision of decisions) {\n const matches = rows.filter((row) => decisionMatchesRow(decision, row));\n if (matches.length !== 1) {\n blockers.push({\n code:\n matches.length === 0\n ? 'classification_target_not_found'\n : 'classification_target_ambiguous',\n message:\n matches.length === 0\n ? 'Classification decision did not match an input row.'\n : 'Classification decision matched more than one input row.',\n decision_index: decision.decisionIndex,\n row_index: decision.rowIndex ?? undefined,\n dataset_id: decision.datasetId,\n dataset_version: decision.datasetVersion,\n });\n continue;\n }\n const row = matches[0] as PreparedClassificationRow;\n if (decision.categoryType === 'location') {\n const code = locationCodeFromPath(decision.path);\n const targetMatches = resolveLocationTarget(row, decision);\n if (!code || targetMatches.length !== 1) {\n blockers.push({\n code:\n targetMatches.length === 0 ? 'location_target_not_found' : 'location_target_ambiguous',\n message:\n targetMatches.length === 0\n ? 'Location decision did not match a location field in the input row.'\n : 'Location decision matched more than one location field; provide target_path.',\n decision_index: decision.decisionIndex,\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n });\n continue;\n }\n const target = targetMatches[0] as LocationTarget;\n const previous = target.value;\n target.parent[target.key] = code;\n evidence.push({\n decision_index: decision.decisionIndex,\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n category_type: decision.categoryType,\n target_path: target.path,\n previous_location: previous,\n applied_location: code,\n applied_location_path: cloneJson(decision.path),\n basis: decision.basis,\n evidence: decision.evidence,\n });\n continue;\n }\n const previous = currentClassification(row, decision.categoryType);\n if (!setClassification(row, decision.categoryType, decision.path)) {\n blockers.push({\n code: 'classification_container_missing',\n message: 'Input row does not contain a supported classification container for this type.',\n decision_index: decision.decisionIndex,\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n });\n continue;\n }\n evidence.push({\n decision_index: decision.decisionIndex,\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n category_type: decision.categoryType,\n previous_classification: previous,\n applied_classification: cloneJson(decision.path),\n basis: decision.basis,\n evidence: decision.evidence,\n });\n }\n\n const outDir = options.outDir\n ? path.resolve(options.outDir)\n : path.dirname(path.resolve(options.outPath));\n const evidencePath = path.join(outDir, 'outputs', 'classification-apply-evidence.jsonl');\n const reportPath = path.join(outDir, 'outputs', 'classification-apply-report.json');\n writeJsonLinesArtifact(\n options.outPath,\n rows.map((row) => row.payload),\n );\n writeJsonLinesArtifact(evidencePath, evidence);\n const report: DatasetClassificationApplyReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: blockers.length > 0 ? 'blocked' : 'completed',\n command: 'dataset classification apply',\n input_path: path.resolve(options.inputPath),\n decisions_path: path.resolve(options.decisionsPath),\n out_path: path.resolve(options.outPath),\n default_category_type: fallbackType,\n counts: {\n rows: rows.length,\n decisions: rawDecisions.length,\n applied: evidence.length,\n blockers: blockers.length,\n },\n blockers,\n files: {\n classified_rows: path.resolve(options.outPath),\n evidence: evidencePath,\n report: reportPath,\n },\n };\n writeJsonArtifact(reportPath, report);\n return report;\n}\n\nexport const __testInternals = {\n buildNavigator,\n classCode,\n classificationContainer,\n collectEntriesFromNode,\n collectLocationRefKeysFromSchema,\n collectLocationTargets,\n constText,\n createMissingLocationTarget,\n currentClassification,\n decisionMatchesRow,\n decisionTargetPath,\n isJsonSchemaFileName,\n lastSchemaPropertyName,\n loadEntries,\n locationCodeFromPath,\n locationTargetStringValue,\n locationTargetKeys,\n maybeWriteReport,\n navigatorFor,\n normalizeDecision,\n normalizeDecisionType,\n normalizePathFromClasses,\n normalizePathFromDecision,\n normalizeStructuredDecisions,\n normalizeTargetPath,\n normalizeType,\n pathForCode,\n prepareRows,\n readDecisions,\n resolveLocationTarget,\n schemasDir,\n setClassification,\n targetPathSegments,\n toPathEntry,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-contract.js","sourceRoot":"","sources":["../../../src/lib/dataset-contract.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport { writeJsonArtifact, writeTextArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\n\nexport type DatasetContractInclude = 'schema' | 'methodology' | 'ruleset';\nexport type DatasetContractProfile = 'default' | 'ai-import';\nexport type DatasetContractMode = 'contract' | 'context-pack';\n\nexport type DatasetContractReport = {\n schema_version: 1;\n status: 'completed';\n generated_at_utc: string;\n mode: DatasetContractMode;\n requested_type: string;\n type: string;\n profile: DatasetContractProfile;\n includes: DatasetContractInclude[];\n source: 'sdk-contract-api' | 'sdk-runtime-assets';\n manifest: unknown;\n files: {\n manifest: string;\n schema: string | null;\n methodology: string | null;\n ruleset: string | null;\n ai_context_json: string | null;\n ai_context_markdown: string | null;\n report: string;\n };\n};\n\nexport type RunDatasetContractOptions = {\n type: string | undefined;\n include?: string | string[] | undefined;\n profile?: string | undefined;\n outDir: string | null | undefined;\n mode: DatasetContractMode;\n now?: Date;\n sdkModule?: Record<string, unknown>;\n runtimeAssetsRoot?: string;\n};\n\ntype ContractPack = {\n manifest: unknown;\n schemaText?: string;\n methodologyText?: string;\n runtimeRuleset?: unknown;\n aiContext?: unknown;\n};\n\ntype CanonicalKind =\n | 'contact'\n | 'flow'\n | 'flowproperty'\n | 'lciamethod'\n | 'lifecyclemodel'\n | 'process'\n | 'source'\n | 'unitgroup';\n\nconst requireFromHere = createRequire(import.meta.url);\n\nconst aliases: Record<string, CanonicalKind> = {\n contact: 'contact',\n contacts: 'contact',\n flow: 'flow',\n flows: 'flow',\n flowproperty: 'flowproperty',\n flowproperties: 'flowproperty',\n lciamethod: 'lciamethod',\n lciamethods: 'lciamethod',\n lifecyclemodel: 'lifecyclemodel',\n lifecyclemodels: 'lifecyclemodel',\n process: 'process',\n processes: 'process',\n source: 'source',\n sources: 'source',\n unitgroup: 'unitgroup',\n unitgroups: 'unitgroup',\n};\n\nconst schemaFiles: Record<CanonicalKind, string> = {\n contact: 'tidas_contacts.json',\n flow: 'tidas_flows.json',\n flowproperty: 'tidas_flowproperties.json',\n lciamethod: 'tidas_lciamethods.json',\n lifecyclemodel: 'tidas_lifecyclemodels.json',\n process: 'tidas_processes.json',\n source: 'tidas_sources.json',\n unitgroup: 'tidas_unitgroups.json',\n};\n\nconst methodologyFiles: Partial<Record<CanonicalKind, string>> = {\n flow: 'tidas_flows.yaml',\n process: 'tidas_processes.yaml',\n};\n\nconst allowedIncludes = new Set<DatasetContractInclude>(['schema', 'methodology', 'ruleset']);\n\nexport async function runDatasetContract(\n options: RunDatasetContractOptions,\n): Promise<DatasetContractReport> {\n const type = normalizeType(options.type);\n const includes = normalizeIncludes(options.include);\n const profile = normalizeProfile(options.profile ?? defaultProfile(options.mode));\n const outDir = requireOutDir(options.outDir);\n const includeAiContext = options.mode === 'context-pack';\n const loaded = await loadContractPack({\n type,\n includes,\n profile,\n includeAiContext,\n sdkModule: options.sdkModule,\n runtimeAssetsRoot: options.runtimeAssetsRoot,\n });\n const files = buildFiles(outDir, loaded.pack, includeAiContext);\n\n writeJsonArtifact(files.manifest, loaded.pack.manifest);\n if (loaded.pack.schemaText && files.schema) {\n writeTextArtifact(files.schema, `${loaded.pack.schemaText.trimEnd()}\\n`);\n }\n if (loaded.pack.methodologyText && files.methodology) {\n writeTextArtifact(files.methodology, `${loaded.pack.methodologyText.trimEnd()}\\n`);\n }\n if (loaded.pack.runtimeRuleset && files.ruleset) {\n writeJsonArtifact(files.ruleset, loaded.pack.runtimeRuleset);\n }\n if (loaded.pack.aiContext && files.ai_context_json) {\n writeJsonArtifact(files.ai_context_json, loaded.pack.aiContext);\n }\n if (includeAiContext && files.ai_context_markdown) {\n writeTextArtifact(files.ai_context_markdown, renderAiContextMarkdown(type, loaded.pack));\n }\n\n const report: DatasetContractReport = {\n schema_version: 1,\n status: 'completed',\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n mode: options.mode,\n requested_type: String(options.type),\n type,\n profile,\n includes,\n source: loaded.source,\n manifest: loaded.pack.manifest,\n files,\n };\n writeJsonArtifact(files.report, report);\n\n return report;\n}\n\nfunction normalizeType(value: string | undefined): CanonicalKind {\n const raw = value?.trim();\n if (!raw) {\n throw new CliError('Missing required --type value.', {\n code: 'DATASET_CONTRACT_TYPE_REQUIRED',\n exitCode: 2,\n });\n }\n const normalized = raw.toLowerCase().replace(/[-_]/gu, '');\n const type = aliases[normalized];\n if (!type) {\n throw new CliError(\n `Unsupported dataset contract type '${value}'. Supported types: ${Object.keys(aliases)\n .sort()\n .join(', ')}.`,\n {\n code: 'DATASET_CONTRACT_TYPE_INVALID',\n exitCode: 2,\n },\n );\n }\n return type;\n}\n\nfunction normalizeIncludes(value: string | string[] | undefined): DatasetContractInclude[] {\n const rawValues =\n Array.isArray(value) && value.length > 0\n ? value\n : value && !Array.isArray(value)\n ? [value]\n : ['schema,methodology,ruleset'];\n const includes = rawValues.flatMap((raw) =>\n raw\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean),\n );\n\n if (!includes.length) {\n throw new CliError('At least one --include value is required.', {\n code: 'DATASET_CONTRACT_INCLUDE_REQUIRED',\n exitCode: 2,\n });\n }\n\n for (const include of includes) {\n if (!allowedIncludes.has(include as DatasetContractInclude)) {\n throw new CliError('--include values must be schema, methodology, or ruleset.', {\n code: 'DATASET_CONTRACT_INCLUDE_INVALID',\n exitCode: 2,\n });\n }\n }\n\n return Array.from(new Set(includes)) as DatasetContractInclude[];\n}\n\nfunction normalizeProfile(value: string): DatasetContractProfile {\n if (value === 'default' || value === 'ai-import') {\n return value;\n }\n throw new CliError(\"--profile must be 'default' or 'ai-import'.\", {\n code: 'DATASET_CONTRACT_PROFILE_INVALID',\n exitCode: 2,\n });\n}\n\nfunction defaultProfile(mode: DatasetContractMode): DatasetContractProfile {\n return mode === 'context-pack' ? 'ai-import' : 'default';\n}\n\nfunction requireOutDir(value: string | null | undefined): string {\n if (!value?.trim()) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'DATASET_CONTRACT_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n return path.resolve(value);\n}\n\nasync function loadContractPack(options: {\n type: CanonicalKind;\n includes: DatasetContractInclude[];\n profile: DatasetContractProfile;\n includeAiContext: boolean;\n sdkModule?: Record<string, unknown>;\n runtimeAssetsRoot?: string;\n}): Promise<{ source: DatasetContractReport['source']; pack: ContractPack }> {\n let sdkModule = options.sdkModule;\n if (!sdkModule) {\n sdkModule = requireFromHere('@tiangong-lca/tidas-sdk') as Record<string, unknown>;\n }\n const getTidasContractPack = sdkModule.getTidasContractPack;\n if (typeof getTidasContractPack === 'function') {\n return {\n source: 'sdk-contract-api',\n pack: getTidasContractPack(options.type, {\n include: options.includes,\n profile: options.profile,\n includeAiContext: options.includeAiContext,\n }) as ContractPack,\n };\n }\n\n return {\n source: 'sdk-runtime-assets',\n pack: loadFallbackContractPack(options),\n };\n}\n\nfunction loadFallbackContractPack(options: {\n type: CanonicalKind;\n includes: DatasetContractInclude[];\n profile: DatasetContractProfile;\n includeAiContext: boolean;\n runtimeAssetsRoot?: string;\n}): ContractPack {\n const runtimeRoot = options.runtimeAssetsRoot ?? resolveSdkRuntimeAssetsRoot();\n const schemaText = options.includes.includes('schema')\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'schemas', schemaFiles[options.type]))\n : undefined;\n const methodologyFile = methodologyFiles[options.type];\n const methodologyText =\n options.includes.includes('methodology') && methodologyFile\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', methodologyFile))\n : undefined;\n const rulesetText = options.includes.includes('ruleset')\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', 'runtime_rulesets.json'))\n : undefined;\n const runtimeRuleset = rulesetText\n ? filterRuntimeRuleset(JSON.parse(rulesetText) as Record<string, unknown>, options.type)\n : undefined;\n const aiContext = options.includeAiContext\n ? buildAiContext({\n type: options.type,\n profile: options.profile,\n schemaText,\n methodologyText,\n runtimeRuleset,\n })\n : undefined;\n\n return {\n manifest: {\n schema_version: 1,\n kind: options.type,\n profile: options.profile,\n includes: options.includes,\n sdk_package: '@tiangong-lca/tidas-sdk',\n schema: schemaText ? artifactManifest(schemaFiles[options.type], schemaText) : null,\n methodology:\n methodologyText && methodologyFile\n ? artifactManifest(methodologyFile, methodologyText)\n : null,\n ruleset: runtimeRuleset\n ? artifactManifest('runtime_rulesets.json', JSON.stringify(runtimeRuleset, null, 2))\n : null,\n },\n schemaText,\n methodologyText,\n runtimeRuleset,\n aiContext,\n };\n}\n\nfunction resolveSdkRuntimeAssetsRoot(\n candidatesOverride?: string[],\n sdkEntryOverride?: string,\n): string {\n const sdkEntry = sdkEntryOverride ?? requireFromHere.resolve('@tiangong-lca/tidas-sdk');\n const candidates =\n candidatesOverride ??\n (() => {\n const distRoot = path.dirname(sdkEntry);\n const packagedRoot = path.join(distRoot, 'runtime-assets');\n const cliRepoRoot = resolveCliRepoRoot();\n const siblingSdkRoot = path.resolve(\n cliRepoRoot,\n '../tidas-sdk/sdks/typescript/src/runtime-assets',\n );\n return [siblingSdkRoot, packagedRoot];\n })();\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new CliError('Could not resolve @tiangong-lca/tidas-sdk runtime assets.', {\n code: 'DATASET_CONTRACT_SDK_ASSETS_NOT_FOUND',\n exitCode: 1,\n details: { sdkEntry },\n });\n}\n\nfunction resolveCliRepoRoot(candidatesOverride?: string[]): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = candidatesOverride ?? [\n path.resolve(moduleDir, '../..'),\n path.resolve(moduleDir, '../../..'),\n ];\n return (\n candidates.find(\n (candidate) =>\n existsSync(path.join(candidate, 'package.json')) &&\n existsSync(path.join(candidate, 'src/cli.ts')),\n ) ?? candidates[0]\n );\n}\n\nfunction readOptionalText(filePath: string): string | undefined {\n if (!existsSync(filePath)) {\n return undefined;\n }\n return readFileSync(filePath, 'utf8');\n}\n\nfunction filterRuntimeRuleset(\n source: Record<string, unknown>,\n type: CanonicalKind,\n): unknown | undefined {\n const rulesets = Array.isArray(source.rulesets)\n ? source.rulesets.filter((entry) => isRulesetForType(entry, type))\n : [];\n const rules = Array.isArray(source.rules)\n ? source.rules.filter((entry) => isRulesetForType(entry, type))\n : [];\n if (!rulesets.length && !rules.length) {\n return undefined;\n }\n return {\n $schema: source.$schema,\n schema_version: source.schema_version,\n ruleset_version: source.ruleset_version,\n purpose: source.purpose,\n rulesets,\n rules,\n };\n}\n\nfunction isRulesetForType(entry: unknown, type: CanonicalKind): boolean {\n return (\n typeof entry === 'object' &&\n entry !== null &&\n 'dataset_type' in entry &&\n (entry as { dataset_type?: unknown }).dataset_type === type\n );\n}\n\nfunction artifactManifest(\n name: string,\n content: string,\n): { name: string; sha256: string; bytes: number } {\n return {\n name,\n sha256: createHash('sha256').update(content).digest('hex'),\n bytes: Buffer.byteLength(content, 'utf8'),\n };\n}\n\nfunction buildAiContext(options: {\n type: CanonicalKind;\n profile: DatasetContractProfile;\n schemaText?: string;\n methodologyText?: string;\n runtimeRuleset?: unknown;\n}): unknown {\n return {\n schema_version: 1,\n kind: options.type,\n profile: options.profile,\n instructions: [\n `Generate or repair only canonical TIDAS ${options.type} data.`,\n 'Use the JSON schema as the structural contract.',\n 'Use the methodology YAML as the semantic authoring contract when present.',\n 'Treat runtime ruleset blocker rules as gate requirements.',\n 'Return candidate data only; do not claim that database writes have happened.',\n 'Preserve source provenance and unresolved assumptions so Foundry can build evidence and repair queues.',\n ],\n schema_text: options.schemaText,\n methodology_text: options.methodologyText,\n runtime_ruleset: options.runtimeRuleset,\n };\n}\n\nfunction buildFiles(\n outDir: string,\n pack: ContractPack,\n includeAiContext: boolean,\n): DatasetContractReport['files'] {\n const outputsDir = path.join(outDir, 'outputs');\n return {\n manifest: path.join(outputsDir, 'contract-manifest.json'),\n schema: pack.schemaText ? path.join(outputsDir, 'schema.json') : null,\n methodology: pack.methodologyText ? path.join(outputsDir, 'methodology.yaml') : null,\n ruleset: pack.runtimeRuleset ? path.join(outputsDir, 'runtime-ruleset.json') : null,\n ai_context_json:\n includeAiContext && pack.aiContext ? path.join(outputsDir, 'ai-context.json') : null,\n ai_context_markdown: includeAiContext ? path.join(outputsDir, 'ai-context.md') : null,\n report: path.join(outputsDir, 'contract-report.json'),\n };\n}\n\nfunction renderAiContextMarkdown(type: CanonicalKind, pack: ContractPack): string {\n const aiContext = isRecord(pack.aiContext) ? pack.aiContext : {};\n const instructions = Array.isArray(aiContext.instructions)\n ? aiContext.instructions.map((item) => `- ${String(item)}`).join('\\n')\n : '';\n const sections = [`# TIDAS ${type} AI Context`, '', '## Instructions', instructions];\n if (pack.methodologyText) {\n sections.push('', '## Methodology YAML', '```yaml', pack.methodologyText.trimEnd(), '```');\n }\n if (pack.schemaText) {\n sections.push('', '## JSON Schema', '```json', pack.schemaText.trimEnd(), '```');\n }\n if (pack.runtimeRuleset) {\n sections.push(\n '',\n '## Runtime Ruleset',\n '```json',\n JSON.stringify(pack.runtimeRuleset, null, 2),\n '```',\n );\n }\n return `${sections.join('\\n')}\\n`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const __testInternals = {\n artifactManifest,\n buildAiContext,\n filterRuntimeRuleset,\n loadFallbackContractPack,\n renderAiContextMarkdown,\n resolveCliRepoRoot,\n resolveSdkRuntimeAssetsRoot,\n normalizeIncludes,\n normalizeProfile,\n normalizeType,\n};\n"]}
1
+ {"version":3,"file":"dataset-contract.js","sourceRoot":"","sources":["../../../src/lib/dataset-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAyDvC,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAEvD,MAAM,OAAO,GAAkC;IAC7C,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,MAAM;IACb,YAAY,EAAE,cAAc;IAC5B,cAAc,EAAE,cAAc;IAC9B,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,YAAY;IACzB,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,gBAAgB;IACjC,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,QAAQ;IACjB,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,WAAW;CACxB,CAAC;AAEF,MAAM,WAAW,GAAkC;IACjD,OAAO,EAAE,qBAAqB;IAC9B,IAAI,EAAE,kBAAkB;IACxB,YAAY,EAAE,2BAA2B;IACzC,UAAU,EAAE,wBAAwB;IACpC,cAAc,EAAE,4BAA4B;IAC5C,OAAO,EAAE,sBAAsB;IAC/B,MAAM,EAAE,oBAAoB;IAC5B,SAAS,EAAE,uBAAuB;CACnC,CAAC;AAEF,MAAM,gBAAgB,GAA2C;IAC/D,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,sBAAsB;CAChC,CAAC;AAEF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAyB,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;AAE9F,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAkC;IAElC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;QACpC,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,gBAAgB;QAChB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;KAC7C,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAEhE,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3C,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACrD,iBAAiB,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAChD,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QACnD,iBAAiB,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,gBAAgB,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAClD,iBAAiB,CAAC,KAAK,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,MAAM,GAA0B;QACpC,cAAc,EAAE,CAAC;QACjB,MAAM,EAAE,WAAW;QACnB,gBAAgB,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;QAC3D,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QACpC,IAAI;QACJ,OAAO;QACP,QAAQ;QACR,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;QAC9B,KAAK;KACN,CAAC;IACF,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAyB;IAC9C,MAAM,GAAG,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,QAAQ,CAAC,gCAAgC,EAAE;YACnD,IAAI,EAAE,gCAAgC;YACtC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,QAAQ,CAChB,sCAAsC,KAAK,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;aACnF,IAAI,EAAE;aACN,IAAI,CAAC,IAAI,CAAC,GAAG,EAChB;YACE,IAAI,EAAE,+BAA+B;YACrC,QAAQ,EAAE,CAAC;SACZ,CACF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAoC;IAC7D,MAAM,SAAS,GACb,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QACtC,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAC9B,CAAC,CAAC,CAAC,KAAK,CAAC;YACT,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CACzC,GAAG;SACA,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SACxC,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,QAAQ,CAAC,2CAA2C,EAAE;YAC9D,IAAI,EAAE,mCAAmC;YACzC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAiC,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,QAAQ,CAAC,2DAA2D,EAAE;gBAC9E,IAAI,EAAE,kCAAkC;gBACxC,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAA6B,CAAC;AACnE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,QAAQ,CAAC,6CAA6C,EAAE;QAChE,IAAI,EAAE,kCAAkC;QACxC,QAAQ,EAAE,CAAC;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,IAAyB;IAC/C,OAAO,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,SAAS,aAAa,CAAC,KAAgC;IACrD,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,QAAQ,CAAC,mCAAmC,EAAE;YACtD,IAAI,EAAE,mCAAmC;YACzC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAO/B;IACC,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,eAAe,CAAC,yBAAyB,CAA4B,CAAC;IACpF,CAAC;IACD,MAAM,oBAAoB,GAAG,SAAS,CAAC,oBAAoB,CAAC;IAC5D,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE,CAAC;QAC/C,OAAO;YACL,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE;gBACvC,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;aAC3C,CAAiB;SACnB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,oBAAoB;QAC5B,IAAI,EAAE,wBAAwB,CAAC,OAAO,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,OAMjC;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,IAAI,2BAA2B,EAAE,CAAC;IAC/E,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACpD,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzF,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,eAAe,GACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,eAAe;QACzD,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;QACrF,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtD,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,uBAAuB,CAAC,CAAC;QAC7F,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,cAAc,GAAG,WAAW;QAChC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAA4B,EAAE,OAAO,CAAC,IAAI,CAAC;QACxF,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB;QACxC,CAAC,CAAC,cAAc,CAAC;YACb,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU;YACV,eAAe;YACf,cAAc;SACf,CAAC;QACJ,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,QAAQ,EAAE;YACR,cAAc,EAAE,CAAC;YACjB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,yBAAyB;YACtC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;YACnF,WAAW,EACT,eAAe,IAAI,eAAe;gBAChC,CAAC,CAAC,gBAAgB,CAAC,eAAe,EAAE,eAAe,CAAC;gBACpD,CAAC,CAAC,IAAI;YACV,OAAO,EAAE,cAAc;gBACrB,CAAC,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACpF,CAAC,CAAC,IAAI;SACT;QACD,UAAU;QACV,eAAe;QACf,cAAc;QACd,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAClC,kBAA6B,EAC7B,gBAAyB;IAEzB,MAAM,QAAQ,GAAG,gBAAgB,IAAI,eAAe,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACxF,MAAM,UAAU,GACd,kBAAkB;QAClB,CAAC,GAAG,EAAE;YACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAC3D,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;YACzC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CACjC,WAAW,EACX,iDAAiD,CAClD,CAAC;YACF,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QACxC,CAAC,CAAC,EAAE,CAAC;IAEP,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,QAAQ,CAAC,2DAA2D,EAAE;QAC9E,IAAI,EAAE,uCAAuC;QAC7C,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,QAAQ,EAAE;KACtB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,kBAA6B;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,kBAAkB,IAAI;QACvC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC;KACpC,CAAC;IACF,OAAO,CACL,UAAU,CAAC,IAAI,CACb,CAAC,SAAS,EAAE,EAAE,CACZ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAChD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CACjD,IAAI,UAAU,CAAC,CAAC,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,oBAAoB,CAC3B,MAA+B,EAC/B,IAAmB;IAEnB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC7C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACvC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/D,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,IAAmB;IAC3D,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,cAAc,IAAI,KAAK;QACtB,KAAoC,CAAC,YAAY,KAAK,IAAI,CAC5D,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAY,EACZ,OAAe;IAEf,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC1D,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAMvB;IACC,OAAO;QACL,cAAc,EAAE,CAAC;QACjB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY,EAAE;YACZ,2CAA2C,OAAO,CAAC,IAAI,QAAQ;YAC/D,iDAAiD;YACjD,2EAA2E;YAC3E,2DAA2D;YAC3D,8EAA8E;YAC9E,wGAAwG;SACzG;QACD,WAAW,EAAE,OAAO,CAAC,UAAU;QAC/B,gBAAgB,EAAE,OAAO,CAAC,eAAe;QACzC,eAAe,EAAE,OAAO,CAAC,cAAc;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,MAAc,EACd,IAAkB,EAClB,gBAAyB;IAEzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,wBAAwB,CAAC;QACzD,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;QACrE,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI;QACpF,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI;QACnF,eAAe,EACb,gBAAgB,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtF,mBAAmB,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI;QACrF,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAmB,EAAE,IAAkB;IACtE,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC;QACxD,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACtE,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GAAG,CAAC,WAAW,IAAI,aAAa,EAAE,EAAE,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;IACrF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CACX,EAAE,EACF,oBAAoB,EACpB,SAAS,EACT,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,EAC5C,KAAK,CACN,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACpC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,gBAAgB;IAChB,cAAc;IACd,oBAAoB;IACpB,wBAAwB;IACxB,uBAAuB;IACvB,kBAAkB;IAClB,2BAA2B;IAC3B,iBAAiB;IACjB,gBAAgB;IAChB,aAAa;CACd,CAAC","sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport { writeJsonArtifact, writeTextArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\n\nexport type DatasetContractInclude = 'schema' | 'methodology' | 'ruleset';\nexport type DatasetContractProfile = 'default' | 'ai-import';\nexport type DatasetContractMode = 'contract' | 'context-pack';\n\nexport type DatasetContractReport = {\n schema_version: 1;\n status: 'completed';\n generated_at_utc: string;\n mode: DatasetContractMode;\n requested_type: string;\n type: string;\n profile: DatasetContractProfile;\n includes: DatasetContractInclude[];\n source: 'sdk-contract-api' | 'sdk-runtime-assets';\n manifest: unknown;\n files: {\n manifest: string;\n schema: string | null;\n methodology: string | null;\n ruleset: string | null;\n ai_context_json: string | null;\n ai_context_markdown: string | null;\n report: string;\n };\n};\n\nexport type RunDatasetContractOptions = {\n type: string | undefined;\n include?: string | string[] | undefined;\n profile?: string | undefined;\n outDir: string | null | undefined;\n mode: DatasetContractMode;\n now?: Date;\n sdkModule?: Record<string, unknown>;\n runtimeAssetsRoot?: string;\n};\n\ntype ContractPack = {\n manifest: unknown;\n schemaText?: string;\n methodologyText?: string;\n runtimeRuleset?: unknown;\n aiContext?: unknown;\n};\n\ntype CanonicalKind =\n | 'contact'\n | 'flow'\n | 'flowproperty'\n | 'lciamethod'\n | 'lifecyclemodel'\n | 'process'\n | 'source'\n | 'unitgroup';\n\nconst requireFromHere = createRequire(import.meta.url);\n\nconst aliases: Record<string, CanonicalKind> = {\n contact: 'contact',\n contacts: 'contact',\n flow: 'flow',\n flows: 'flow',\n flowproperty: 'flowproperty',\n flowproperties: 'flowproperty',\n lciamethod: 'lciamethod',\n lciamethods: 'lciamethod',\n lifecyclemodel: 'lifecyclemodel',\n lifecyclemodels: 'lifecyclemodel',\n process: 'process',\n processes: 'process',\n source: 'source',\n sources: 'source',\n unitgroup: 'unitgroup',\n unitgroups: 'unitgroup',\n};\n\nconst schemaFiles: Record<CanonicalKind, string> = {\n contact: 'tidas_contacts.json',\n flow: 'tidas_flows.json',\n flowproperty: 'tidas_flowproperties.json',\n lciamethod: 'tidas_lciamethods.json',\n lifecyclemodel: 'tidas_lifecyclemodels.json',\n process: 'tidas_processes.json',\n source: 'tidas_sources.json',\n unitgroup: 'tidas_unitgroups.json',\n};\n\nconst methodologyFiles: Partial<Record<CanonicalKind, string>> = {\n flow: 'tidas_flows.yaml',\n process: 'tidas_processes.yaml',\n};\n\nconst allowedIncludes = new Set<DatasetContractInclude>(['schema', 'methodology', 'ruleset']);\n\nexport async function runDatasetContract(\n options: RunDatasetContractOptions,\n): Promise<DatasetContractReport> {\n const type = normalizeType(options.type);\n const includes = normalizeIncludes(options.include);\n const profile = normalizeProfile(options.profile ?? defaultProfile(options.mode));\n const outDir = requireOutDir(options.outDir);\n const includeAiContext = options.mode === 'context-pack';\n const loaded = await loadContractPack({\n type,\n includes,\n profile,\n includeAiContext,\n sdkModule: options.sdkModule,\n runtimeAssetsRoot: options.runtimeAssetsRoot,\n });\n const files = buildFiles(outDir, loaded.pack, includeAiContext);\n\n writeJsonArtifact(files.manifest, loaded.pack.manifest);\n if (loaded.pack.schemaText && files.schema) {\n writeTextArtifact(files.schema, `${loaded.pack.schemaText.trimEnd()}\\n`);\n }\n if (loaded.pack.methodologyText && files.methodology) {\n writeTextArtifact(files.methodology, `${loaded.pack.methodologyText.trimEnd()}\\n`);\n }\n if (loaded.pack.runtimeRuleset && files.ruleset) {\n writeJsonArtifact(files.ruleset, loaded.pack.runtimeRuleset);\n }\n if (loaded.pack.aiContext && files.ai_context_json) {\n writeJsonArtifact(files.ai_context_json, loaded.pack.aiContext);\n }\n if (includeAiContext && files.ai_context_markdown) {\n writeTextArtifact(files.ai_context_markdown, renderAiContextMarkdown(type, loaded.pack));\n }\n\n const report: DatasetContractReport = {\n schema_version: 1,\n status: 'completed',\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n mode: options.mode,\n requested_type: String(options.type),\n type,\n profile,\n includes,\n source: loaded.source,\n manifest: loaded.pack.manifest,\n files,\n };\n writeJsonArtifact(files.report, report);\n\n return report;\n}\n\nfunction normalizeType(value: string | undefined): CanonicalKind {\n const raw = value?.trim();\n if (!raw) {\n throw new CliError('Missing required --type value.', {\n code: 'DATASET_CONTRACT_TYPE_REQUIRED',\n exitCode: 2,\n });\n }\n const normalized = raw.toLowerCase().replace(/[-_]/gu, '');\n const type = aliases[normalized];\n if (!type) {\n throw new CliError(\n `Unsupported dataset contract type '${value}'. Supported types: ${Object.keys(aliases)\n .sort()\n .join(', ')}.`,\n {\n code: 'DATASET_CONTRACT_TYPE_INVALID',\n exitCode: 2,\n },\n );\n }\n return type;\n}\n\nfunction normalizeIncludes(value: string | string[] | undefined): DatasetContractInclude[] {\n const rawValues =\n Array.isArray(value) && value.length > 0\n ? value\n : value && !Array.isArray(value)\n ? [value]\n : ['schema,methodology,ruleset'];\n const includes = rawValues.flatMap((raw) =>\n raw\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean),\n );\n\n if (!includes.length) {\n throw new CliError('At least one --include value is required.', {\n code: 'DATASET_CONTRACT_INCLUDE_REQUIRED',\n exitCode: 2,\n });\n }\n\n for (const include of includes) {\n if (!allowedIncludes.has(include as DatasetContractInclude)) {\n throw new CliError('--include values must be schema, methodology, or ruleset.', {\n code: 'DATASET_CONTRACT_INCLUDE_INVALID',\n exitCode: 2,\n });\n }\n }\n\n return Array.from(new Set(includes)) as DatasetContractInclude[];\n}\n\nfunction normalizeProfile(value: string): DatasetContractProfile {\n if (value === 'default' || value === 'ai-import') {\n return value;\n }\n throw new CliError(\"--profile must be 'default' or 'ai-import'.\", {\n code: 'DATASET_CONTRACT_PROFILE_INVALID',\n exitCode: 2,\n });\n}\n\nfunction defaultProfile(mode: DatasetContractMode): DatasetContractProfile {\n return mode === 'context-pack' ? 'ai-import' : 'default';\n}\n\nfunction requireOutDir(value: string | null | undefined): string {\n if (!value?.trim()) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'DATASET_CONTRACT_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n return path.resolve(value);\n}\n\nasync function loadContractPack(options: {\n type: CanonicalKind;\n includes: DatasetContractInclude[];\n profile: DatasetContractProfile;\n includeAiContext: boolean;\n sdkModule?: Record<string, unknown>;\n runtimeAssetsRoot?: string;\n}): Promise<{ source: DatasetContractReport['source']; pack: ContractPack }> {\n let sdkModule = options.sdkModule;\n if (!sdkModule) {\n sdkModule = requireFromHere('@tiangong-lca/tidas-sdk') as Record<string, unknown>;\n }\n const getTidasContractPack = sdkModule.getTidasContractPack;\n if (typeof getTidasContractPack === 'function') {\n return {\n source: 'sdk-contract-api',\n pack: getTidasContractPack(options.type, {\n include: options.includes,\n profile: options.profile,\n includeAiContext: options.includeAiContext,\n }) as ContractPack,\n };\n }\n\n return {\n source: 'sdk-runtime-assets',\n pack: loadFallbackContractPack(options),\n };\n}\n\nfunction loadFallbackContractPack(options: {\n type: CanonicalKind;\n includes: DatasetContractInclude[];\n profile: DatasetContractProfile;\n includeAiContext: boolean;\n runtimeAssetsRoot?: string;\n}): ContractPack {\n const runtimeRoot = options.runtimeAssetsRoot ?? resolveSdkRuntimeAssetsRoot();\n const schemaText = options.includes.includes('schema')\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'schemas', schemaFiles[options.type]))\n : undefined;\n const methodologyFile = methodologyFiles[options.type];\n const methodologyText =\n options.includes.includes('methodology') && methodologyFile\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', methodologyFile))\n : undefined;\n const rulesetText = options.includes.includes('ruleset')\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', 'runtime_rulesets.json'))\n : undefined;\n const runtimeRuleset = rulesetText\n ? filterRuntimeRuleset(JSON.parse(rulesetText) as Record<string, unknown>, options.type)\n : undefined;\n const aiContext = options.includeAiContext\n ? buildAiContext({\n type: options.type,\n profile: options.profile,\n schemaText,\n methodologyText,\n runtimeRuleset,\n })\n : undefined;\n\n return {\n manifest: {\n schema_version: 1,\n kind: options.type,\n profile: options.profile,\n includes: options.includes,\n sdk_package: '@tiangong-lca/tidas-sdk',\n schema: schemaText ? artifactManifest(schemaFiles[options.type], schemaText) : null,\n methodology:\n methodologyText && methodologyFile\n ? artifactManifest(methodologyFile, methodologyText)\n : null,\n ruleset: runtimeRuleset\n ? artifactManifest('runtime_rulesets.json', JSON.stringify(runtimeRuleset, null, 2))\n : null,\n },\n schemaText,\n methodologyText,\n runtimeRuleset,\n aiContext,\n };\n}\n\nfunction resolveSdkRuntimeAssetsRoot(\n candidatesOverride?: string[],\n sdkEntryOverride?: string,\n): string {\n const sdkEntry = sdkEntryOverride ?? requireFromHere.resolve('@tiangong-lca/tidas-sdk');\n const candidates =\n candidatesOverride ??\n (() => {\n const distRoot = path.dirname(sdkEntry);\n const packagedRoot = path.join(distRoot, 'runtime-assets');\n const cliRepoRoot = resolveCliRepoRoot();\n const siblingSdkRoot = path.resolve(\n cliRepoRoot,\n '../tidas-sdk/sdks/typescript/src/runtime-assets',\n );\n return [siblingSdkRoot, packagedRoot];\n })();\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new CliError('Could not resolve @tiangong-lca/tidas-sdk runtime assets.', {\n code: 'DATASET_CONTRACT_SDK_ASSETS_NOT_FOUND',\n exitCode: 1,\n details: { sdkEntry },\n });\n}\n\nfunction resolveCliRepoRoot(candidatesOverride?: string[]): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = candidatesOverride ?? [\n path.resolve(moduleDir, '../..'),\n path.resolve(moduleDir, '../../..'),\n ];\n return (\n candidates.find(\n (candidate) =>\n existsSync(path.join(candidate, 'package.json')) &&\n existsSync(path.join(candidate, 'src/cli.ts')),\n ) ?? candidates[0]\n );\n}\n\nfunction readOptionalText(filePath: string): string | undefined {\n if (!existsSync(filePath)) {\n return undefined;\n }\n return readFileSync(filePath, 'utf8');\n}\n\nfunction filterRuntimeRuleset(\n source: Record<string, unknown>,\n type: CanonicalKind,\n): unknown | undefined {\n const rulesets = Array.isArray(source.rulesets)\n ? source.rulesets.filter((entry) => isRulesetForType(entry, type))\n : [];\n const rules = Array.isArray(source.rules)\n ? source.rules.filter((entry) => isRulesetForType(entry, type))\n : [];\n if (!rulesets.length && !rules.length) {\n return undefined;\n }\n return {\n $schema: source.$schema,\n schema_version: source.schema_version,\n ruleset_version: source.ruleset_version,\n purpose: source.purpose,\n rulesets,\n rules,\n };\n}\n\nfunction isRulesetForType(entry: unknown, type: CanonicalKind): boolean {\n return (\n typeof entry === 'object' &&\n entry !== null &&\n 'dataset_type' in entry &&\n (entry as { dataset_type?: unknown }).dataset_type === type\n );\n}\n\nfunction artifactManifest(\n name: string,\n content: string,\n): { name: string; sha256: string; bytes: number } {\n return {\n name,\n sha256: createHash('sha256').update(content).digest('hex'),\n bytes: Buffer.byteLength(content, 'utf8'),\n };\n}\n\nfunction buildAiContext(options: {\n type: CanonicalKind;\n profile: DatasetContractProfile;\n schemaText?: string;\n methodologyText?: string;\n runtimeRuleset?: unknown;\n}): unknown {\n return {\n schema_version: 1,\n kind: options.type,\n profile: options.profile,\n instructions: [\n `Generate or repair only canonical TIDAS ${options.type} data.`,\n 'Use the JSON schema as the structural contract.',\n 'Use the methodology YAML as the semantic authoring contract when present.',\n 'Treat runtime ruleset blocker rules as gate requirements.',\n 'Return candidate data only; do not claim that database writes have happened.',\n 'Preserve source provenance and unresolved assumptions so Foundry can build evidence and repair queues.',\n ],\n schema_text: options.schemaText,\n methodology_text: options.methodologyText,\n runtime_ruleset: options.runtimeRuleset,\n };\n}\n\nfunction buildFiles(\n outDir: string,\n pack: ContractPack,\n includeAiContext: boolean,\n): DatasetContractReport['files'] {\n const outputsDir = path.join(outDir, 'outputs');\n return {\n manifest: path.join(outputsDir, 'contract-manifest.json'),\n schema: pack.schemaText ? path.join(outputsDir, 'schema.json') : null,\n methodology: pack.methodologyText ? path.join(outputsDir, 'methodology.yaml') : null,\n ruleset: pack.runtimeRuleset ? path.join(outputsDir, 'runtime-ruleset.json') : null,\n ai_context_json:\n includeAiContext && pack.aiContext ? path.join(outputsDir, 'ai-context.json') : null,\n ai_context_markdown: includeAiContext ? path.join(outputsDir, 'ai-context.md') : null,\n report: path.join(outputsDir, 'contract-report.json'),\n };\n}\n\nfunction renderAiContextMarkdown(type: CanonicalKind, pack: ContractPack): string {\n const aiContext = isRecord(pack.aiContext) ? pack.aiContext : {};\n const instructions = Array.isArray(aiContext.instructions)\n ? aiContext.instructions.map((item) => `- ${String(item)}`).join('\\n')\n : '';\n const sections = [`# TIDAS ${type} AI Context`, '', '## Instructions', instructions];\n if (pack.methodologyText) {\n sections.push('', '## Methodology YAML', '```yaml', pack.methodologyText.trimEnd(), '```');\n }\n if (pack.schemaText) {\n sections.push('', '## JSON Schema', '```json', pack.schemaText.trimEnd(), '```');\n }\n if (pack.runtimeRuleset) {\n sections.push(\n '',\n '## Runtime Ruleset',\n '```json',\n JSON.stringify(pack.runtimeRuleset, null, 2),\n '```',\n );\n }\n return `${sections.join('\\n')}\\n`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const __testInternals = {\n artifactManifest,\n buildAiContext,\n filterRuntimeRuleset,\n loadFallbackContractPack,\n renderAiContextMarkdown,\n resolveCliRepoRoot,\n resolveSdkRuntimeAssetsRoot,\n normalizeIncludes,\n normalizeProfile,\n normalizeType,\n};\n"]}