@tiangong-lca/cli 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +18 -7
  2. package/assets/tidas-schemas/tidas_contacts.json +312 -0
  3. package/assets/tidas-schemas/tidas_contacts_category.json +126 -0
  4. package/assets/tidas-schemas/tidas_data_types.json +359 -0
  5. package/assets/tidas-schemas/tidas_flowproperties.json +303 -0
  6. package/assets/tidas-schemas/tidas_flowproperties_category.json +61 -0
  7. package/assets/tidas-schemas/tidas_flows.json +809 -0
  8. package/assets/tidas-schemas/tidas_flows_elementary_category.json +720 -0
  9. package/assets/tidas-schemas/tidas_flows_product_category.json +59623 -0
  10. package/assets/tidas-schemas/tidas_lciamethods.json +1326 -0
  11. package/assets/tidas-schemas/tidas_lciamethods_category.json +685 -0
  12. package/assets/tidas-schemas/tidas_lifecyclemodels.json +1374 -0
  13. package/assets/tidas-schemas/tidas_locations_category.json +2593 -0
  14. package/assets/tidas-schemas/tidas_processes.json +1646 -0
  15. package/assets/tidas-schemas/tidas_processes_category.json +10795 -0
  16. package/assets/tidas-schemas/tidas_sources.json +228 -0
  17. package/assets/tidas-schemas/tidas_sources_category.json +100 -0
  18. package/assets/tidas-schemas/tidas_unitgroups.json +338 -0
  19. package/assets/tidas-schemas/tidas_unitgroups_category.json +61 -0
  20. package/dist/src/cli.js +847 -13
  21. package/dist/src/cli.js.map +1 -1
  22. package/dist/src/lib/dataset-classification.js +947 -0
  23. package/dist/src/lib/dataset-classification.js.map +1 -0
  24. package/dist/src/lib/dataset-command.js +11 -0
  25. package/dist/src/lib/dataset-command.js.map +1 -1
  26. package/dist/src/lib/dataset-contract.js +2 -0
  27. package/dist/src/lib/dataset-contract.js.map +1 -1
  28. package/dist/src/lib/dataset-curation-queue.js +359 -2
  29. package/dist/src/lib/dataset-curation-queue.js.map +1 -1
  30. package/dist/src/lib/dataset-import-lca.js +18 -0
  31. package/dist/src/lib/dataset-import-lca.js.map +1 -1
  32. package/dist/src/lib/dataset-local.js +94 -1
  33. package/dist/src/lib/dataset-local.js.map +1 -1
  34. package/dist/src/lib/dataset-maintenance-clear-account.js +506 -0
  35. package/dist/src/lib/dataset-maintenance-clear-account.js.map +1 -0
  36. package/dist/src/lib/dataset-patch.js +797 -0
  37. package/dist/src/lib/dataset-patch.js.map +1 -0
  38. package/dist/src/lib/dataset-remote-verify.js +188 -3
  39. package/dist/src/lib/dataset-remote-verify.js.map +1 -1
  40. package/dist/src/lib/dataset-save-draft-run.js +725 -0
  41. package/dist/src/lib/dataset-save-draft-run.js.map +1 -0
  42. package/dist/src/lib/dataset-validate.js +32 -2
  43. package/dist/src/lib/dataset-validate.js.map +1 -1
  44. package/dist/src/lib/flow-publish-version.js +7 -2
  45. package/dist/src/lib/flow-publish-version.js.map +1 -1
  46. package/dist/src/lib/flow-qa.js +8 -0
  47. package/dist/src/lib/flow-qa.js.map +1 -1
  48. package/dist/src/lib/identity-preflight.js +895 -117
  49. package/dist/src/lib/identity-preflight.js.map +1 -1
  50. package/dist/src/lib/lifecyclemodel-qa.js +159 -34
  51. package/dist/src/lib/lifecyclemodel-qa.js.map +1 -1
  52. package/dist/src/lib/process-required-fields.js +62 -12
  53. package/dist/src/lib/process-required-fields.js.map +1 -1
  54. package/dist/src/lib/process-save-draft-run.js +10 -0
  55. package/dist/src/lib/process-save-draft-run.js.map +1 -1
  56. package/dist/src/lib/process-save-draft.js +59 -3
  57. package/dist/src/lib/process-save-draft.js.map +1 -1
  58. package/dist/src/lib/supabase-client.js +19 -8
  59. package/dist/src/lib/supabase-client.js.map +1 -1
  60. package/package.json +2 -1
@@ -0,0 +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"]}
@@ -133,6 +133,17 @@ export async function saveDraftDatasetRecord(options) {
133
133
  body,
134
134
  });
135
135
  }
136
+ export async function deleteDatasetRecord(options) {
137
+ return invokeDatasetCommand({
138
+ transport: options.transport,
139
+ commandName: 'app_dataset_delete',
140
+ body: {
141
+ table: options.table,
142
+ id: options.id,
143
+ version: options.version,
144
+ },
145
+ });
146
+ }
136
147
  export const __testInternals = {
137
148
  deriveSupabaseFunctionsBaseUrl,
138
149
  readOptionalModelId,
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-command.js","sourceRoot":"","sources":["../../../src/lib/dataset-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { postJson, requireRemoteOkPayload } from './http.js';\nimport {\n buildSupabaseAuthHeaders,\n deriveSupabaseProjectBaseUrl,\n requireSupabaseRestRuntime,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type DatasetCommandTable =\n | 'contacts'\n | 'sources'\n | 'unitgroups'\n | 'flowproperties'\n | 'flows'\n | 'processes'\n | 'lifecyclemodels';\n\nexport type DatasetCommandTransport = {\n functionsBaseUrl: string;\n publishableKey: string;\n accessToken: string;\n fetchImpl: FetchLike;\n timeoutMs: number;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction readOptionalRuleVerification(extraData?: JsonObject): boolean | null | undefined {\n if (!extraData) {\n return undefined;\n }\n\n if ('ruleVerification' in extraData) {\n const value = extraData.ruleVerification;\n if (typeof value === 'boolean' || value === null) {\n return value;\n }\n return undefined;\n }\n\n if ('rule_verification' in extraData) {\n const value = extraData.rule_verification;\n if (typeof value === 'boolean' || value === null) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction readOptionalModelId(\n extraData: JsonObject | undefined,\n allowNull: boolean,\n): string | null | undefined {\n if (!extraData) {\n return undefined;\n }\n\n const value = extraData.modelId ?? extraData.model_id;\n const trimmed = trimToken(value);\n if (trimmed) {\n return trimmed;\n }\n\n if (allowNull && value === null) {\n return null;\n }\n\n return undefined;\n}\n\nfunction requireCommandSuccessPayload(payload: unknown, url: string): JsonObject {\n const normalized = requireRemoteOkPayload(payload, url);\n if (!isRecord(normalized) || normalized.ok !== true) {\n throw new CliError(`Dataset command returned an unexpected payload for ${url}`, {\n code: 'REMOTE_RESPONSE_INVALID',\n exitCode: 1,\n details: normalized,\n });\n }\n\n return normalized;\n}\n\nasync function invokeDatasetCommand(options: {\n transport: DatasetCommandTransport;\n commandName: 'app_dataset_create' | 'app_dataset_save_draft';\n body: JsonObject;\n}): Promise<JsonObject> {\n const url = `${options.transport.functionsBaseUrl}/${options.commandName}`;\n return requireCommandSuccessPayload(\n await postJson({\n url,\n headers: {\n ...buildSupabaseAuthHeaders(\n options.transport.publishableKey,\n options.transport.accessToken,\n ),\n 'Content-Type': 'application/json',\n },\n body: options.body,\n timeoutMs: options.transport.timeoutMs,\n fetchImpl: options.transport.fetchImpl,\n }),\n url,\n );\n}\n\nexport function deriveSupabaseFunctionsBaseUrl(apiBaseUrl: string): string {\n return `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/functions/v1`;\n}\n\nexport async function buildDatasetCommandTransport(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<DatasetCommandTransport> {\n return {\n functionsBaseUrl: deriveSupabaseFunctionsBaseUrl(options.runtime.apiBaseUrl),\n publishableKey: options.runtime.publishableKey,\n accessToken: await options.runtime.getAccessToken(),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n };\n}\n\nexport async function resolveDatasetCommandTransport(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<DatasetCommandTransport> {\n return buildDatasetCommandTransport({\n runtime: createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n }),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n}\n\nexport async function createDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<JsonObject> {\n const body: JsonObject = {\n table: options.table,\n id: options.id,\n jsonOrdered: options.payload,\n };\n const modelId = readOptionalModelId(options.extraData, true);\n if (modelId !== undefined) {\n body.modelId = modelId;\n }\n const ruleVerification = readOptionalRuleVerification(options.extraData);\n if (ruleVerification !== undefined) {\n body.ruleVerification = ruleVerification;\n }\n\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_create',\n body,\n });\n}\n\nexport async function saveDraftDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n version: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<JsonObject> {\n const body: JsonObject = {\n table: options.table,\n id: options.id,\n version: options.version,\n jsonOrdered: options.payload,\n };\n const modelId = readOptionalModelId(options.extraData, false);\n if (modelId !== undefined) {\n body.modelId = modelId;\n }\n const ruleVerification = readOptionalRuleVerification(options.extraData);\n if (ruleVerification !== undefined) {\n body.ruleVerification = ruleVerification;\n }\n\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_save_draft',\n body,\n });\n}\n\nexport const __testInternals = {\n deriveSupabaseFunctionsBaseUrl,\n readOptionalModelId,\n readOptionalRuleVerification,\n};\n"]}
1
+ {"version":3,"file":"dataset-command.js","sourceRoot":"","sources":["../../../src/lib/dataset-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { postJson, requireRemoteOkPayload } from './http.js';\nimport {\n buildSupabaseAuthHeaders,\n deriveSupabaseProjectBaseUrl,\n requireSupabaseRestRuntime,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type DatasetCommandTable =\n | 'contacts'\n | 'sources'\n | 'unitgroups'\n | 'flowproperties'\n | 'flows'\n | 'processes'\n | 'lifecyclemodels';\n\nexport type DatasetCommandTransport = {\n functionsBaseUrl: string;\n publishableKey: string;\n accessToken: string;\n fetchImpl: FetchLike;\n timeoutMs: number;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction readOptionalRuleVerification(extraData?: JsonObject): boolean | null | undefined {\n if (!extraData) {\n return undefined;\n }\n\n if ('ruleVerification' in extraData) {\n const value = extraData.ruleVerification;\n if (typeof value === 'boolean' || value === null) {\n return value;\n }\n return undefined;\n }\n\n if ('rule_verification' in extraData) {\n const value = extraData.rule_verification;\n if (typeof value === 'boolean' || value === null) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction readOptionalModelId(\n extraData: JsonObject | undefined,\n allowNull: boolean,\n): string | null | undefined {\n if (!extraData) {\n return undefined;\n }\n\n const value = extraData.modelId ?? extraData.model_id;\n const trimmed = trimToken(value);\n if (trimmed) {\n return trimmed;\n }\n\n if (allowNull && value === null) {\n return null;\n }\n\n return undefined;\n}\n\nfunction requireCommandSuccessPayload(payload: unknown, url: string): JsonObject {\n const normalized = requireRemoteOkPayload(payload, url);\n if (!isRecord(normalized) || normalized.ok !== true) {\n throw new CliError(`Dataset command returned an unexpected payload for ${url}`, {\n code: 'REMOTE_RESPONSE_INVALID',\n exitCode: 1,\n details: normalized,\n });\n }\n\n return normalized;\n}\n\nasync function invokeDatasetCommand(options: {\n transport: DatasetCommandTransport;\n commandName: 'app_dataset_create' | 'app_dataset_save_draft' | 'app_dataset_delete';\n body: JsonObject;\n}): Promise<JsonObject> {\n const url = `${options.transport.functionsBaseUrl}/${options.commandName}`;\n return requireCommandSuccessPayload(\n await postJson({\n url,\n headers: {\n ...buildSupabaseAuthHeaders(\n options.transport.publishableKey,\n options.transport.accessToken,\n ),\n 'Content-Type': 'application/json',\n },\n body: options.body,\n timeoutMs: options.transport.timeoutMs,\n fetchImpl: options.transport.fetchImpl,\n }),\n url,\n );\n}\n\nexport function deriveSupabaseFunctionsBaseUrl(apiBaseUrl: string): string {\n return `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/functions/v1`;\n}\n\nexport async function buildDatasetCommandTransport(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<DatasetCommandTransport> {\n return {\n functionsBaseUrl: deriveSupabaseFunctionsBaseUrl(options.runtime.apiBaseUrl),\n publishableKey: options.runtime.publishableKey,\n accessToken: await options.runtime.getAccessToken(),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n };\n}\n\nexport async function resolveDatasetCommandTransport(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<DatasetCommandTransport> {\n return buildDatasetCommandTransport({\n runtime: createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n }),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n}\n\nexport async function createDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<JsonObject> {\n const body: JsonObject = {\n table: options.table,\n id: options.id,\n jsonOrdered: options.payload,\n };\n const modelId = readOptionalModelId(options.extraData, true);\n if (modelId !== undefined) {\n body.modelId = modelId;\n }\n const ruleVerification = readOptionalRuleVerification(options.extraData);\n if (ruleVerification !== undefined) {\n body.ruleVerification = ruleVerification;\n }\n\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_create',\n body,\n });\n}\n\nexport async function saveDraftDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n version: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<JsonObject> {\n const body: JsonObject = {\n table: options.table,\n id: options.id,\n version: options.version,\n jsonOrdered: options.payload,\n };\n const modelId = readOptionalModelId(options.extraData, false);\n if (modelId !== undefined) {\n body.modelId = modelId;\n }\n const ruleVerification = readOptionalRuleVerification(options.extraData);\n if (ruleVerification !== undefined) {\n body.ruleVerification = ruleVerification;\n }\n\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_save_draft',\n body,\n });\n}\n\nexport async function deleteDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n version: string;\n}): Promise<JsonObject> {\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_delete',\n body: {\n table: options.table,\n id: options.id,\n version: options.version,\n },\n });\n}\n\nexport const __testInternals = {\n deriveSupabaseFunctionsBaseUrl,\n readOptionalModelId,\n readOptionalRuleVerification,\n};\n"]}
@@ -338,6 +338,8 @@ function isRecord(value) {
338
338
  return typeof value === 'object' && value !== null && !Array.isArray(value);
339
339
  }
340
340
  export const __testInternals = {
341
+ artifactManifest,
342
+ buildAiContext,
341
343
  filterRuntimeRuleset,
342
344
  loadFallbackContractPack,
343
345
  renderAiContextMarkdown,
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-contract.js","sourceRoot":"","sources":["../../../src/lib/dataset-contract.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport { writeJsonArtifact, writeTextArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\n\nexport type DatasetContractInclude = 'schema' | 'methodology' | 'ruleset';\nexport type DatasetContractProfile = 'default' | 'ai-import';\nexport type DatasetContractMode = 'contract' | 'context-pack';\n\nexport type DatasetContractReport = {\n schema_version: 1;\n status: 'completed';\n generated_at_utc: string;\n mode: DatasetContractMode;\n requested_type: string;\n type: string;\n profile: DatasetContractProfile;\n includes: DatasetContractInclude[];\n source: 'sdk-contract-api' | 'sdk-runtime-assets';\n manifest: unknown;\n files: {\n manifest: string;\n schema: string | null;\n methodology: string | null;\n ruleset: string | null;\n ai_context_json: string | null;\n ai_context_markdown: string | null;\n report: string;\n };\n};\n\nexport type RunDatasetContractOptions = {\n type: string | undefined;\n include?: string | string[] | undefined;\n profile?: string | undefined;\n outDir: string | null | undefined;\n mode: DatasetContractMode;\n now?: Date;\n sdkModule?: Record<string, unknown>;\n runtimeAssetsRoot?: string;\n};\n\ntype ContractPack = {\n manifest: unknown;\n schemaText?: string;\n methodologyText?: string;\n runtimeRuleset?: unknown;\n aiContext?: unknown;\n};\n\ntype CanonicalKind =\n | 'contact'\n | 'flow'\n | 'flowproperty'\n | 'lciamethod'\n | 'lifecyclemodel'\n | 'process'\n | 'source'\n | 'unitgroup';\n\nconst requireFromHere = createRequire(import.meta.url);\n\nconst aliases: Record<string, CanonicalKind> = {\n contact: 'contact',\n contacts: 'contact',\n flow: 'flow',\n flows: 'flow',\n flowproperty: 'flowproperty',\n flowproperties: 'flowproperty',\n lciamethod: 'lciamethod',\n lciamethods: 'lciamethod',\n lifecyclemodel: 'lifecyclemodel',\n lifecyclemodels: 'lifecyclemodel',\n process: 'process',\n processes: 'process',\n source: 'source',\n sources: 'source',\n unitgroup: 'unitgroup',\n unitgroups: 'unitgroup',\n};\n\nconst schemaFiles: Record<CanonicalKind, string> = {\n contact: 'tidas_contacts.json',\n flow: 'tidas_flows.json',\n flowproperty: 'tidas_flowproperties.json',\n lciamethod: 'tidas_lciamethods.json',\n lifecyclemodel: 'tidas_lifecyclemodels.json',\n process: 'tidas_processes.json',\n source: 'tidas_sources.json',\n unitgroup: 'tidas_unitgroups.json',\n};\n\nconst methodologyFiles: Partial<Record<CanonicalKind, string>> = {\n flow: 'tidas_flows.yaml',\n process: 'tidas_processes.yaml',\n};\n\nconst allowedIncludes = new Set<DatasetContractInclude>(['schema', 'methodology', 'ruleset']);\n\nexport async function runDatasetContract(\n options: RunDatasetContractOptions,\n): Promise<DatasetContractReport> {\n const type = normalizeType(options.type);\n const includes = normalizeIncludes(options.include);\n const profile = normalizeProfile(options.profile ?? defaultProfile(options.mode));\n const outDir = requireOutDir(options.outDir);\n const includeAiContext = options.mode === 'context-pack';\n const loaded = await loadContractPack({\n type,\n includes,\n profile,\n includeAiContext,\n sdkModule: options.sdkModule,\n runtimeAssetsRoot: options.runtimeAssetsRoot,\n });\n const files = buildFiles(outDir, loaded.pack, includeAiContext);\n\n writeJsonArtifact(files.manifest, loaded.pack.manifest);\n if (loaded.pack.schemaText && files.schema) {\n writeTextArtifact(files.schema, `${loaded.pack.schemaText.trimEnd()}\\n`);\n }\n if (loaded.pack.methodologyText && files.methodology) {\n writeTextArtifact(files.methodology, `${loaded.pack.methodologyText.trimEnd()}\\n`);\n }\n if (loaded.pack.runtimeRuleset && files.ruleset) {\n writeJsonArtifact(files.ruleset, loaded.pack.runtimeRuleset);\n }\n if (loaded.pack.aiContext && files.ai_context_json) {\n writeJsonArtifact(files.ai_context_json, loaded.pack.aiContext);\n }\n if (includeAiContext && files.ai_context_markdown) {\n writeTextArtifact(files.ai_context_markdown, renderAiContextMarkdown(type, loaded.pack));\n }\n\n const report: DatasetContractReport = {\n schema_version: 1,\n status: 'completed',\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n mode: options.mode,\n requested_type: String(options.type),\n type,\n profile,\n includes,\n source: loaded.source,\n manifest: loaded.pack.manifest,\n files,\n };\n writeJsonArtifact(files.report, report);\n\n return report;\n}\n\nfunction normalizeType(value: string | undefined): CanonicalKind {\n const raw = value?.trim();\n if (!raw) {\n throw new CliError('Missing required --type value.', {\n code: 'DATASET_CONTRACT_TYPE_REQUIRED',\n exitCode: 2,\n });\n }\n const normalized = raw.toLowerCase().replace(/[-_]/gu, '');\n const type = aliases[normalized];\n if (!type) {\n throw new CliError(\n `Unsupported dataset contract type '${value}'. Supported types: ${Object.keys(aliases)\n .sort()\n .join(', ')}.`,\n {\n code: 'DATASET_CONTRACT_TYPE_INVALID',\n exitCode: 2,\n },\n );\n }\n return type;\n}\n\nfunction normalizeIncludes(value: string | string[] | undefined): DatasetContractInclude[] {\n const rawValues =\n Array.isArray(value) && value.length > 0\n ? value\n : value && !Array.isArray(value)\n ? [value]\n : ['schema,methodology,ruleset'];\n const includes = rawValues.flatMap((raw) =>\n raw\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean),\n );\n\n if (!includes.length) {\n throw new CliError('At least one --include value is required.', {\n code: 'DATASET_CONTRACT_INCLUDE_REQUIRED',\n exitCode: 2,\n });\n }\n\n for (const include of includes) {\n if (!allowedIncludes.has(include as DatasetContractInclude)) {\n throw new CliError('--include values must be schema, methodology, or ruleset.', {\n code: 'DATASET_CONTRACT_INCLUDE_INVALID',\n exitCode: 2,\n });\n }\n }\n\n return Array.from(new Set(includes)) as DatasetContractInclude[];\n}\n\nfunction normalizeProfile(value: string): DatasetContractProfile {\n if (value === 'default' || value === 'ai-import') {\n return value;\n }\n throw new CliError(\"--profile must be 'default' or 'ai-import'.\", {\n code: 'DATASET_CONTRACT_PROFILE_INVALID',\n exitCode: 2,\n });\n}\n\nfunction defaultProfile(mode: DatasetContractMode): DatasetContractProfile {\n return mode === 'context-pack' ? 'ai-import' : 'default';\n}\n\nfunction requireOutDir(value: string | null | undefined): string {\n if (!value?.trim()) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'DATASET_CONTRACT_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n return path.resolve(value);\n}\n\nasync function loadContractPack(options: {\n type: CanonicalKind;\n includes: DatasetContractInclude[];\n profile: DatasetContractProfile;\n includeAiContext: boolean;\n sdkModule?: Record<string, unknown>;\n runtimeAssetsRoot?: string;\n}): Promise<{ source: DatasetContractReport['source']; pack: ContractPack }> {\n let sdkModule = options.sdkModule;\n if (!sdkModule) {\n sdkModule = requireFromHere('@tiangong-lca/tidas-sdk') as Record<string, unknown>;\n }\n const getTidasContractPack = sdkModule.getTidasContractPack;\n if (typeof getTidasContractPack === 'function') {\n return {\n source: 'sdk-contract-api',\n pack: getTidasContractPack(options.type, {\n include: options.includes,\n profile: options.profile,\n includeAiContext: options.includeAiContext,\n }) as ContractPack,\n };\n }\n\n return {\n source: 'sdk-runtime-assets',\n pack: loadFallbackContractPack(options),\n };\n}\n\nfunction loadFallbackContractPack(options: {\n type: CanonicalKind;\n includes: DatasetContractInclude[];\n profile: DatasetContractProfile;\n includeAiContext: boolean;\n runtimeAssetsRoot?: string;\n}): ContractPack {\n const runtimeRoot = options.runtimeAssetsRoot ?? resolveSdkRuntimeAssetsRoot();\n const schemaText = options.includes.includes('schema')\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'schemas', schemaFiles[options.type]))\n : undefined;\n const methodologyFile = methodologyFiles[options.type];\n const methodologyText =\n options.includes.includes('methodology') && methodologyFile\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', methodologyFile))\n : undefined;\n const rulesetText = options.includes.includes('ruleset')\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', 'runtime_rulesets.json'))\n : undefined;\n const runtimeRuleset = rulesetText\n ? filterRuntimeRuleset(JSON.parse(rulesetText) as Record<string, unknown>, options.type)\n : undefined;\n const aiContext = options.includeAiContext\n ? buildAiContext({\n type: options.type,\n profile: options.profile,\n schemaText,\n methodologyText,\n runtimeRuleset,\n })\n : undefined;\n\n return {\n manifest: {\n schema_version: 1,\n kind: options.type,\n profile: options.profile,\n includes: options.includes,\n sdk_package: '@tiangong-lca/tidas-sdk',\n schema: schemaText ? artifactManifest(schemaFiles[options.type], schemaText) : null,\n methodology:\n methodologyText && methodologyFile\n ? artifactManifest(methodologyFile, methodologyText)\n : null,\n ruleset: runtimeRuleset\n ? artifactManifest('runtime_rulesets.json', JSON.stringify(runtimeRuleset, null, 2))\n : null,\n },\n schemaText,\n methodologyText,\n runtimeRuleset,\n aiContext,\n };\n}\n\nfunction resolveSdkRuntimeAssetsRoot(\n candidatesOverride?: string[],\n sdkEntryOverride?: string,\n): string {\n const sdkEntry = sdkEntryOverride ?? requireFromHere.resolve('@tiangong-lca/tidas-sdk');\n const candidates =\n candidatesOverride ??\n (() => {\n const distRoot = path.dirname(sdkEntry);\n const packagedRoot = path.join(distRoot, 'runtime-assets');\n const cliRepoRoot = resolveCliRepoRoot();\n const siblingSdkRoot = path.resolve(\n cliRepoRoot,\n '../tidas-sdk/sdks/typescript/src/runtime-assets',\n );\n return [siblingSdkRoot, packagedRoot];\n })();\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new CliError('Could not resolve @tiangong-lca/tidas-sdk runtime assets.', {\n code: 'DATASET_CONTRACT_SDK_ASSETS_NOT_FOUND',\n exitCode: 1,\n details: { sdkEntry },\n });\n}\n\nfunction resolveCliRepoRoot(candidatesOverride?: string[]): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = candidatesOverride ?? [\n path.resolve(moduleDir, '../..'),\n path.resolve(moduleDir, '../../..'),\n ];\n return (\n candidates.find(\n (candidate) =>\n existsSync(path.join(candidate, 'package.json')) &&\n existsSync(path.join(candidate, 'src/cli.ts')),\n ) ?? candidates[0]\n );\n}\n\nfunction readOptionalText(filePath: string): string | undefined {\n if (!existsSync(filePath)) {\n return undefined;\n }\n return readFileSync(filePath, 'utf8');\n}\n\nfunction filterRuntimeRuleset(\n source: Record<string, unknown>,\n type: CanonicalKind,\n): unknown | undefined {\n const rulesets = Array.isArray(source.rulesets)\n ? source.rulesets.filter((entry) => isRulesetForType(entry, type))\n : [];\n const rules = Array.isArray(source.rules)\n ? source.rules.filter((entry) => isRulesetForType(entry, type))\n : [];\n if (!rulesets.length && !rules.length) {\n return undefined;\n }\n return {\n $schema: source.$schema,\n schema_version: source.schema_version,\n ruleset_version: source.ruleset_version,\n purpose: source.purpose,\n rulesets,\n rules,\n };\n}\n\nfunction isRulesetForType(entry: unknown, type: CanonicalKind): boolean {\n return (\n typeof entry === 'object' &&\n entry !== null &&\n 'dataset_type' in entry &&\n (entry as { dataset_type?: unknown }).dataset_type === type\n );\n}\n\nfunction artifactManifest(\n name: string,\n content: string,\n): { name: string; sha256: string; bytes: number } {\n return {\n name,\n sha256: createHash('sha256').update(content).digest('hex'),\n bytes: Buffer.byteLength(content, 'utf8'),\n };\n}\n\nfunction buildAiContext(options: {\n type: CanonicalKind;\n profile: DatasetContractProfile;\n schemaText?: string;\n methodologyText?: string;\n runtimeRuleset?: unknown;\n}): unknown {\n return {\n schema_version: 1,\n kind: options.type,\n profile: options.profile,\n instructions: [\n `Generate or repair only canonical TIDAS ${options.type} data.`,\n 'Use the JSON schema as the structural contract.',\n 'Use the methodology YAML as the semantic authoring contract when present.',\n 'Treat runtime ruleset blocker rules as gate requirements.',\n 'Return candidate data only; do not claim that database writes have happened.',\n 'Preserve source provenance and unresolved assumptions so Foundry can build evidence and repair queues.',\n ],\n schema_text: options.schemaText,\n methodology_text: options.methodologyText,\n runtime_ruleset: options.runtimeRuleset,\n };\n}\n\nfunction buildFiles(\n outDir: string,\n pack: ContractPack,\n includeAiContext: boolean,\n): DatasetContractReport['files'] {\n const outputsDir = path.join(outDir, 'outputs');\n return {\n manifest: path.join(outputsDir, 'contract-manifest.json'),\n schema: pack.schemaText ? path.join(outputsDir, 'schema.json') : null,\n methodology: pack.methodologyText ? path.join(outputsDir, 'methodology.yaml') : null,\n ruleset: pack.runtimeRuleset ? path.join(outputsDir, 'runtime-ruleset.json') : null,\n ai_context_json:\n includeAiContext && pack.aiContext ? path.join(outputsDir, 'ai-context.json') : null,\n ai_context_markdown: includeAiContext ? path.join(outputsDir, 'ai-context.md') : null,\n report: path.join(outputsDir, 'contract-report.json'),\n };\n}\n\nfunction renderAiContextMarkdown(type: CanonicalKind, pack: ContractPack): string {\n const aiContext = isRecord(pack.aiContext) ? pack.aiContext : {};\n const instructions = Array.isArray(aiContext.instructions)\n ? aiContext.instructions.map((item) => `- ${String(item)}`).join('\\n')\n : '';\n const sections = [`# TIDAS ${type} AI Context`, '', '## Instructions', instructions];\n if (pack.methodologyText) {\n sections.push('', '## Methodology YAML', '```yaml', pack.methodologyText.trimEnd(), '```');\n }\n if (pack.schemaText) {\n sections.push('', '## JSON Schema', '```json', pack.schemaText.trimEnd(), '```');\n }\n if (pack.runtimeRuleset) {\n sections.push(\n '',\n '## Runtime Ruleset',\n '```json',\n JSON.stringify(pack.runtimeRuleset, null, 2),\n '```',\n );\n }\n return `${sections.join('\\n')}\\n`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const __testInternals = {\n filterRuntimeRuleset,\n loadFallbackContractPack,\n renderAiContextMarkdown,\n resolveCliRepoRoot,\n resolveSdkRuntimeAssetsRoot,\n normalizeIncludes,\n normalizeProfile,\n normalizeType,\n};\n"]}
1
+ {"version":3,"file":"dataset-contract.js","sourceRoot":"","sources":["../../../src/lib/dataset-contract.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport { writeJsonArtifact, writeTextArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\n\nexport type DatasetContractInclude = 'schema' | 'methodology' | 'ruleset';\nexport type DatasetContractProfile = 'default' | 'ai-import';\nexport type DatasetContractMode = 'contract' | 'context-pack';\n\nexport type DatasetContractReport = {\n schema_version: 1;\n status: 'completed';\n generated_at_utc: string;\n mode: DatasetContractMode;\n requested_type: string;\n type: string;\n profile: DatasetContractProfile;\n includes: DatasetContractInclude[];\n source: 'sdk-contract-api' | 'sdk-runtime-assets';\n manifest: unknown;\n files: {\n manifest: string;\n schema: string | null;\n methodology: string | null;\n ruleset: string | null;\n ai_context_json: string | null;\n ai_context_markdown: string | null;\n report: string;\n };\n};\n\nexport type RunDatasetContractOptions = {\n type: string | undefined;\n include?: string | string[] | undefined;\n profile?: string | undefined;\n outDir: string | null | undefined;\n mode: DatasetContractMode;\n now?: Date;\n sdkModule?: Record<string, unknown>;\n runtimeAssetsRoot?: string;\n};\n\ntype ContractPack = {\n manifest: unknown;\n schemaText?: string;\n methodologyText?: string;\n runtimeRuleset?: unknown;\n aiContext?: unknown;\n};\n\ntype CanonicalKind =\n | 'contact'\n | 'flow'\n | 'flowproperty'\n | 'lciamethod'\n | 'lifecyclemodel'\n | 'process'\n | 'source'\n | 'unitgroup';\n\nconst requireFromHere = createRequire(import.meta.url);\n\nconst aliases: Record<string, CanonicalKind> = {\n contact: 'contact',\n contacts: 'contact',\n flow: 'flow',\n flows: 'flow',\n flowproperty: 'flowproperty',\n flowproperties: 'flowproperty',\n lciamethod: 'lciamethod',\n lciamethods: 'lciamethod',\n lifecyclemodel: 'lifecyclemodel',\n lifecyclemodels: 'lifecyclemodel',\n process: 'process',\n processes: 'process',\n source: 'source',\n sources: 'source',\n unitgroup: 'unitgroup',\n unitgroups: 'unitgroup',\n};\n\nconst schemaFiles: Record<CanonicalKind, string> = {\n contact: 'tidas_contacts.json',\n flow: 'tidas_flows.json',\n flowproperty: 'tidas_flowproperties.json',\n lciamethod: 'tidas_lciamethods.json',\n lifecyclemodel: 'tidas_lifecyclemodels.json',\n process: 'tidas_processes.json',\n source: 'tidas_sources.json',\n unitgroup: 'tidas_unitgroups.json',\n};\n\nconst methodologyFiles: Partial<Record<CanonicalKind, string>> = {\n flow: 'tidas_flows.yaml',\n process: 'tidas_processes.yaml',\n};\n\nconst allowedIncludes = new Set<DatasetContractInclude>(['schema', 'methodology', 'ruleset']);\n\nexport async function runDatasetContract(\n options: RunDatasetContractOptions,\n): Promise<DatasetContractReport> {\n const type = normalizeType(options.type);\n const includes = normalizeIncludes(options.include);\n const profile = normalizeProfile(options.profile ?? defaultProfile(options.mode));\n const outDir = requireOutDir(options.outDir);\n const includeAiContext = options.mode === 'context-pack';\n const loaded = await loadContractPack({\n type,\n includes,\n profile,\n includeAiContext,\n sdkModule: options.sdkModule,\n runtimeAssetsRoot: options.runtimeAssetsRoot,\n });\n const files = buildFiles(outDir, loaded.pack, includeAiContext);\n\n writeJsonArtifact(files.manifest, loaded.pack.manifest);\n if (loaded.pack.schemaText && files.schema) {\n writeTextArtifact(files.schema, `${loaded.pack.schemaText.trimEnd()}\\n`);\n }\n if (loaded.pack.methodologyText && files.methodology) {\n writeTextArtifact(files.methodology, `${loaded.pack.methodologyText.trimEnd()}\\n`);\n }\n if (loaded.pack.runtimeRuleset && files.ruleset) {\n writeJsonArtifact(files.ruleset, loaded.pack.runtimeRuleset);\n }\n if (loaded.pack.aiContext && files.ai_context_json) {\n writeJsonArtifact(files.ai_context_json, loaded.pack.aiContext);\n }\n if (includeAiContext && files.ai_context_markdown) {\n writeTextArtifact(files.ai_context_markdown, renderAiContextMarkdown(type, loaded.pack));\n }\n\n const report: DatasetContractReport = {\n schema_version: 1,\n status: 'completed',\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n mode: options.mode,\n requested_type: String(options.type),\n type,\n profile,\n includes,\n source: loaded.source,\n manifest: loaded.pack.manifest,\n files,\n };\n writeJsonArtifact(files.report, report);\n\n return report;\n}\n\nfunction normalizeType(value: string | undefined): CanonicalKind {\n const raw = value?.trim();\n if (!raw) {\n throw new CliError('Missing required --type value.', {\n code: 'DATASET_CONTRACT_TYPE_REQUIRED',\n exitCode: 2,\n });\n }\n const normalized = raw.toLowerCase().replace(/[-_]/gu, '');\n const type = aliases[normalized];\n if (!type) {\n throw new CliError(\n `Unsupported dataset contract type '${value}'. Supported types: ${Object.keys(aliases)\n .sort()\n .join(', ')}.`,\n {\n code: 'DATASET_CONTRACT_TYPE_INVALID',\n exitCode: 2,\n },\n );\n }\n return type;\n}\n\nfunction normalizeIncludes(value: string | string[] | undefined): DatasetContractInclude[] {\n const rawValues =\n Array.isArray(value) && value.length > 0\n ? value\n : value && !Array.isArray(value)\n ? [value]\n : ['schema,methodology,ruleset'];\n const includes = rawValues.flatMap((raw) =>\n raw\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean),\n );\n\n if (!includes.length) {\n throw new CliError('At least one --include value is required.', {\n code: 'DATASET_CONTRACT_INCLUDE_REQUIRED',\n exitCode: 2,\n });\n }\n\n for (const include of includes) {\n if (!allowedIncludes.has(include as DatasetContractInclude)) {\n throw new CliError('--include values must be schema, methodology, or ruleset.', {\n code: 'DATASET_CONTRACT_INCLUDE_INVALID',\n exitCode: 2,\n });\n }\n }\n\n return Array.from(new Set(includes)) as DatasetContractInclude[];\n}\n\nfunction normalizeProfile(value: string): DatasetContractProfile {\n if (value === 'default' || value === 'ai-import') {\n return value;\n }\n throw new CliError(\"--profile must be 'default' or 'ai-import'.\", {\n code: 'DATASET_CONTRACT_PROFILE_INVALID',\n exitCode: 2,\n });\n}\n\nfunction defaultProfile(mode: DatasetContractMode): DatasetContractProfile {\n return mode === 'context-pack' ? 'ai-import' : 'default';\n}\n\nfunction requireOutDir(value: string | null | undefined): string {\n if (!value?.trim()) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'DATASET_CONTRACT_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n return path.resolve(value);\n}\n\nasync function loadContractPack(options: {\n type: CanonicalKind;\n includes: DatasetContractInclude[];\n profile: DatasetContractProfile;\n includeAiContext: boolean;\n sdkModule?: Record<string, unknown>;\n runtimeAssetsRoot?: string;\n}): Promise<{ source: DatasetContractReport['source']; pack: ContractPack }> {\n let sdkModule = options.sdkModule;\n if (!sdkModule) {\n sdkModule = requireFromHere('@tiangong-lca/tidas-sdk') as Record<string, unknown>;\n }\n const getTidasContractPack = sdkModule.getTidasContractPack;\n if (typeof getTidasContractPack === 'function') {\n return {\n source: 'sdk-contract-api',\n pack: getTidasContractPack(options.type, {\n include: options.includes,\n profile: options.profile,\n includeAiContext: options.includeAiContext,\n }) as ContractPack,\n };\n }\n\n return {\n source: 'sdk-runtime-assets',\n pack: loadFallbackContractPack(options),\n };\n}\n\nfunction loadFallbackContractPack(options: {\n type: CanonicalKind;\n includes: DatasetContractInclude[];\n profile: DatasetContractProfile;\n includeAiContext: boolean;\n runtimeAssetsRoot?: string;\n}): ContractPack {\n const runtimeRoot = options.runtimeAssetsRoot ?? resolveSdkRuntimeAssetsRoot();\n const schemaText = options.includes.includes('schema')\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'schemas', schemaFiles[options.type]))\n : undefined;\n const methodologyFile = methodologyFiles[options.type];\n const methodologyText =\n options.includes.includes('methodology') && methodologyFile\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', methodologyFile))\n : undefined;\n const rulesetText = options.includes.includes('ruleset')\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', 'runtime_rulesets.json'))\n : undefined;\n const runtimeRuleset = rulesetText\n ? filterRuntimeRuleset(JSON.parse(rulesetText) as Record<string, unknown>, options.type)\n : undefined;\n const aiContext = options.includeAiContext\n ? buildAiContext({\n type: options.type,\n profile: options.profile,\n schemaText,\n methodologyText,\n runtimeRuleset,\n })\n : undefined;\n\n return {\n manifest: {\n schema_version: 1,\n kind: options.type,\n profile: options.profile,\n includes: options.includes,\n sdk_package: '@tiangong-lca/tidas-sdk',\n schema: schemaText ? artifactManifest(schemaFiles[options.type], schemaText) : null,\n methodology:\n methodologyText && methodologyFile\n ? artifactManifest(methodologyFile, methodologyText)\n : null,\n ruleset: runtimeRuleset\n ? artifactManifest('runtime_rulesets.json', JSON.stringify(runtimeRuleset, null, 2))\n : null,\n },\n schemaText,\n methodologyText,\n runtimeRuleset,\n aiContext,\n };\n}\n\nfunction resolveSdkRuntimeAssetsRoot(\n candidatesOverride?: string[],\n sdkEntryOverride?: string,\n): string {\n const sdkEntry = sdkEntryOverride ?? requireFromHere.resolve('@tiangong-lca/tidas-sdk');\n const candidates =\n candidatesOverride ??\n (() => {\n const distRoot = path.dirname(sdkEntry);\n const packagedRoot = path.join(distRoot, 'runtime-assets');\n const cliRepoRoot = resolveCliRepoRoot();\n const siblingSdkRoot = path.resolve(\n cliRepoRoot,\n '../tidas-sdk/sdks/typescript/src/runtime-assets',\n );\n return [siblingSdkRoot, packagedRoot];\n })();\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new CliError('Could not resolve @tiangong-lca/tidas-sdk runtime assets.', {\n code: 'DATASET_CONTRACT_SDK_ASSETS_NOT_FOUND',\n exitCode: 1,\n details: { sdkEntry },\n });\n}\n\nfunction resolveCliRepoRoot(candidatesOverride?: string[]): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = candidatesOverride ?? [\n path.resolve(moduleDir, '../..'),\n path.resolve(moduleDir, '../../..'),\n ];\n return (\n candidates.find(\n (candidate) =>\n existsSync(path.join(candidate, 'package.json')) &&\n existsSync(path.join(candidate, 'src/cli.ts')),\n ) ?? candidates[0]\n );\n}\n\nfunction readOptionalText(filePath: string): string | undefined {\n if (!existsSync(filePath)) {\n return undefined;\n }\n return readFileSync(filePath, 'utf8');\n}\n\nfunction filterRuntimeRuleset(\n source: Record<string, unknown>,\n type: CanonicalKind,\n): unknown | undefined {\n const rulesets = Array.isArray(source.rulesets)\n ? source.rulesets.filter((entry) => isRulesetForType(entry, type))\n : [];\n const rules = Array.isArray(source.rules)\n ? source.rules.filter((entry) => isRulesetForType(entry, type))\n : [];\n if (!rulesets.length && !rules.length) {\n return undefined;\n }\n return {\n $schema: source.$schema,\n schema_version: source.schema_version,\n ruleset_version: source.ruleset_version,\n purpose: source.purpose,\n rulesets,\n rules,\n };\n}\n\nfunction isRulesetForType(entry: unknown, type: CanonicalKind): boolean {\n return (\n typeof entry === 'object' &&\n entry !== null &&\n 'dataset_type' in entry &&\n (entry as { dataset_type?: unknown }).dataset_type === type\n );\n}\n\nfunction artifactManifest(\n name: string,\n content: string,\n): { name: string; sha256: string; bytes: number } {\n return {\n name,\n sha256: createHash('sha256').update(content).digest('hex'),\n bytes: Buffer.byteLength(content, 'utf8'),\n };\n}\n\nfunction buildAiContext(options: {\n type: CanonicalKind;\n profile: DatasetContractProfile;\n schemaText?: string;\n methodologyText?: string;\n runtimeRuleset?: unknown;\n}): unknown {\n return {\n schema_version: 1,\n kind: options.type,\n profile: options.profile,\n instructions: [\n `Generate or repair only canonical TIDAS ${options.type} data.`,\n 'Use the JSON schema as the structural contract.',\n 'Use the methodology YAML as the semantic authoring contract when present.',\n 'Treat runtime ruleset blocker rules as gate requirements.',\n 'Return candidate data only; do not claim that database writes have happened.',\n 'Preserve source provenance and unresolved assumptions so Foundry can build evidence and repair queues.',\n ],\n schema_text: options.schemaText,\n methodology_text: options.methodologyText,\n runtime_ruleset: options.runtimeRuleset,\n };\n}\n\nfunction buildFiles(\n outDir: string,\n pack: ContractPack,\n includeAiContext: boolean,\n): DatasetContractReport['files'] {\n const outputsDir = path.join(outDir, 'outputs');\n return {\n manifest: path.join(outputsDir, 'contract-manifest.json'),\n schema: pack.schemaText ? path.join(outputsDir, 'schema.json') : null,\n methodology: pack.methodologyText ? path.join(outputsDir, 'methodology.yaml') : null,\n ruleset: pack.runtimeRuleset ? path.join(outputsDir, 'runtime-ruleset.json') : null,\n ai_context_json:\n includeAiContext && pack.aiContext ? path.join(outputsDir, 'ai-context.json') : null,\n ai_context_markdown: includeAiContext ? path.join(outputsDir, 'ai-context.md') : null,\n report: path.join(outputsDir, 'contract-report.json'),\n };\n}\n\nfunction renderAiContextMarkdown(type: CanonicalKind, pack: ContractPack): string {\n const aiContext = isRecord(pack.aiContext) ? pack.aiContext : {};\n const instructions = Array.isArray(aiContext.instructions)\n ? aiContext.instructions.map((item) => `- ${String(item)}`).join('\\n')\n : '';\n const sections = [`# TIDAS ${type} AI Context`, '', '## Instructions', instructions];\n if (pack.methodologyText) {\n sections.push('', '## Methodology YAML', '```yaml', pack.methodologyText.trimEnd(), '```');\n }\n if (pack.schemaText) {\n sections.push('', '## JSON Schema', '```json', pack.schemaText.trimEnd(), '```');\n }\n if (pack.runtimeRuleset) {\n sections.push(\n '',\n '## Runtime Ruleset',\n '```json',\n JSON.stringify(pack.runtimeRuleset, null, 2),\n '```',\n );\n }\n return `${sections.join('\\n')}\\n`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const __testInternals = {\n artifactManifest,\n buildAiContext,\n filterRuntimeRuleset,\n loadFallbackContractPack,\n renderAiContextMarkdown,\n resolveCliRepoRoot,\n resolveSdkRuntimeAssetsRoot,\n normalizeIncludes,\n normalizeProfile,\n normalizeType,\n};\n"]}