@tiangong-lca/cli 0.0.12 → 0.0.14

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.
@@ -564,7 +564,49 @@ function resolveLocationTarget(row, decision) {
564
564
  const targets = collectLocationTargets(row.payload);
565
565
  if (!decision.targetPath)
566
566
  return targets;
567
- return targets.filter((target) => target.path === decision.targetPath || target.parentPath === decision.targetPath);
567
+ const matchingTargets = targets.filter((target) => target.path === decision.targetPath || target.parentPath === decision.targetPath);
568
+ if (matchingTargets.length > 0)
569
+ return matchingTargets;
570
+ const createdTarget = createMissingLocationTarget(row, decision.targetPath);
571
+ return createdTarget ? [createdTarget] : [];
572
+ }
573
+ function targetPathSegments(targetPath) {
574
+ return targetPath
575
+ .split('.')
576
+ .map((segment) => segment.trim())
577
+ .filter((segment) => segment.length > 0);
578
+ }
579
+ function createMissingLocationTarget(row, targetPath) {
580
+ const segments = targetPathSegments(targetPath);
581
+ const key = segments.at(-1);
582
+ if (!key || !isLocationTargetKey(key))
583
+ return null;
584
+ let cursor = row.payload;
585
+ for (const segment of segments.slice(0, -1)) {
586
+ if (!isRecord(cursor))
587
+ return null;
588
+ const existing = cursor[segment];
589
+ if (existing === undefined || existing === null) {
590
+ cursor[segment] = {};
591
+ cursor = cursor[segment];
592
+ continue;
593
+ }
594
+ if (!isRecord(existing))
595
+ return null;
596
+ cursor = existing;
597
+ }
598
+ if (!isRecord(cursor))
599
+ return null;
600
+ const existing = cursor[key];
601
+ if (existing !== undefined && existing !== null && existing !== '')
602
+ return null;
603
+ return {
604
+ path: targetPath,
605
+ parentPath: pathExpression(segments.slice(0, -1)),
606
+ parent: cursor,
607
+ key,
608
+ value: typeof existing === 'string' ? existing : '',
609
+ };
568
610
  }
569
611
  function decisionMatchesRow(decision, row) {
570
612
  if (decision.rowIndex !== null)
@@ -918,6 +960,7 @@ export const __testInternals = {
918
960
  collectLocationRefKeysFromSchema,
919
961
  collectLocationTargets,
920
962
  constText,
963
+ createMissingLocationTarget,
921
964
  currentClassification,
922
965
  decisionMatchesRow,
923
966
  decisionTargetPath,
@@ -942,6 +985,7 @@ export const __testInternals = {
942
985
  resolveLocationTarget,
943
986
  schemasDir,
944
987
  setClassification,
988
+ targetPathSegments,
945
989
  toPathEntry,
946
990
  };
947
991
  //# sourceMappingURL=dataset-classification.js.map
@@ -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 return targets.filter(\n (target) => target.path === decision.targetPath || target.parentPath === decision.targetPath,\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 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 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"]}
@@ -266,6 +266,7 @@ export async function runProcessSaveDraft(options) {
266
266
  const now = options.now ?? new Date();
267
267
  const inputPath = path.resolve(options.inputPath);
268
268
  const commit = options.commit === true;
269
+ const targetUserId = first_non_empty(options.targetUserId);
269
270
  const rawInput = options.rawInput ?? readStructuredInput(inputPath);
270
271
  const validateProcessPayloadImpl = options.validateProcessPayloadImpl ?? validateProcessPayload;
271
272
  const prepared = prepareProcessSaveDraftInput(inputPath, rawInput, commit, now, validateProcessPayloadImpl);
@@ -307,10 +308,12 @@ export async function runProcessSaveDraft(options) {
307
308
  env: options.env,
308
309
  fetchImpl: options.fetchImpl,
309
310
  timeoutMs: options.timeoutMs,
311
+ targetUserId,
310
312
  audit: {
311
313
  command: 'tiangong-lca process save-draft',
312
314
  source: candidate.source,
313
315
  bundle_path: candidate.bundle_path,
316
+ target_user_id: targetUserId,
314
317
  },
315
318
  });
316
319
  report.status = 'executed';
@@ -331,6 +334,13 @@ export async function runProcessSaveDraft(options) {
331
334
  out_dir: outDir,
332
335
  commit,
333
336
  mode: commit ? 'commit' : 'dry_run',
337
+ target_user_id: targetUserId,
338
+ account_guard: {
339
+ target_user_id_required: Boolean(targetUserId),
340
+ target_user_id: targetUserId,
341
+ commit_account_binding: 'current_cli_auth_session',
342
+ post_write_verify_required: Boolean(targetUserId),
343
+ },
334
344
  status: failedReports.length > 0 ? 'completed_with_failures' : 'completed',
335
345
  counts: {
336
346
  selected: prepared.processes.length,