@tiangong-lca/cli 0.0.13 → 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.
package/README.md
CHANGED
|
@@ -310,7 +310,7 @@ For `lifecyclemodel save-draft`, canonical lifecyclemodel payloads are validated
|
|
|
310
310
|
|
|
311
311
|
For `dataset evidence-search`, `plan` creates the field-level query matrix and search budget. `run` accepts normalized external search results from browser/web-search tools or a generic JSON provider endpoint, then writes `outputs/evidence-search-plan.json`, `outputs/evidence-search-results.jsonl`, `outputs/evidence-search-report.json`, and `outputs/evidence-search-declaration.json` when evidence is absent or only partial. The CLI records scope and normalization; Codex/skills still own semantic judgement and source selection.
|
|
312
312
|
|
|
313
|
-
For `dataset validate`, `--type auto` supports mixed support scopes containing contact/source/unitgroup/flowproperty rows as well as flow/process/lifecyclemodel rows. For `dataset classification`, `children` and `path` navigate the bundled TIDAS category schemas copied from `tidas-tools`. `audit --type location` scans local rows for schema-derived location-code fields, plus TIDAS LCIA geography and lifecyclemodel connection location fields, whose values are not in `tidas_locations_category.json`; `apply --type location` applies structured decisions to a specific `target_path` when a row has multiple location fields.
|
|
313
|
+
For `dataset validate`, `--type auto` supports mixed support scopes containing contact/source/unitgroup/flowproperty rows as well as flow/process/lifecyclemodel rows. For `dataset classification`, `children` and `path` navigate the bundled TIDAS category schemas copied from `tidas-tools`. `audit --type location` scans local rows for schema-derived location-code fields, plus TIDAS LCIA geography and lifecyclemodel connection location fields, whose values are not in `tidas_locations_category.json`; `apply --type location` applies structured decisions to a specific `target_path` when a row has multiple location fields. When `target_path` explicitly points at a schema-derived location field such as `flowDataSet.flowInformation.geography.locationOfSupply`, location apply may create the missing parent object and field; ambiguous or non-location paths still block.
|
|
314
314
|
|
|
315
315
|
For `dataset curation-queue build/next/verify`, the CLI owns entity-level Foundry import queue state. `build` writes `outputs/curation-queue-manifest.json`, `outputs/curation-queue-tasks.jsonl`, `outputs/curation-queue-locks.json`, `outputs/curation-queue-blockers.jsonl`, and per-entity `input.jsonl`, `closure.json`, and `entity-run-plan.json`. `next` returns one runnable support/flow/process task based on checkpoint state. `verify` passes only when scoped checkpoints are complete and build blockers are absent. AI authoring must return structured patches or build plans, and remote writes remain gated by deterministic apply, schema/QA, prewrite verify, and readback.
|
|
316
316
|
|
|
@@ -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
|
-
|
|
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"]}
|