@tiangong-lca/cli 0.1.3 → 0.1.6

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 (54) hide show
  1. package/README.md +47 -11
  2. package/dist/src/cli.d.ts +4 -0
  3. package/dist/src/cli.js +264 -7
  4. package/dist/src/cli.js.map +1 -1
  5. package/dist/src/lib/auth-identity-receipt.d.ts +2 -2
  6. package/dist/src/lib/auth-identity-receipt.js +20 -12
  7. package/dist/src/lib/auth-identity-receipt.js.map +1 -1
  8. package/dist/src/lib/batch/types.js.map +1 -1
  9. package/dist/src/lib/dataset-bilingual.js.map +1 -1
  10. package/dist/src/lib/dataset-curation-queue.js.map +1 -1
  11. package/dist/src/lib/dataset-local.js.map +1 -1
  12. package/dist/src/lib/dataset-maintenance-apply.js.map +1 -1
  13. package/dist/src/lib/dataset-maintenance-clear-account.js.map +1 -1
  14. package/dist/src/lib/dataset-maintenance-contract.js.map +1 -1
  15. package/dist/src/lib/dataset-maintenance-verify.js.map +1 -1
  16. package/dist/src/lib/dataset-save-draft-run.js.map +1 -1
  17. package/dist/src/lib/env.d.ts +8 -0
  18. package/dist/src/lib/env.js +36 -3
  19. package/dist/src/lib/env.js.map +1 -1
  20. package/dist/src/lib/flow-fetch-rows.js.map +1 -1
  21. package/dist/src/lib/flow-read.js.map +1 -1
  22. package/dist/src/lib/identity-preflight.js.map +1 -1
  23. package/dist/src/lib/lca-release.d.ts +1 -1
  24. package/dist/src/lib/lca-release.js +3 -4
  25. package/dist/src/lib/lca-release.js.map +1 -1
  26. package/dist/src/lib/lifecyclemodel-resulting-process.js +6 -2
  27. package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -1
  28. package/dist/src/lib/oauth-loopback.d.ts +52 -0
  29. package/dist/src/lib/oauth-loopback.js +229 -0
  30. package/dist/src/lib/oauth-loopback.js.map +1 -0
  31. package/dist/src/lib/oauth-pkce.d.ts +63 -0
  32. package/dist/src/lib/oauth-pkce.js +268 -0
  33. package/dist/src/lib/oauth-pkce.js.map +1 -0
  34. package/dist/src/lib/process-dedup-review.js.map +1 -1
  35. package/dist/src/lib/process-flow-build-plan.js.map +1 -1
  36. package/dist/src/lib/process-refresh-references.js +2 -2
  37. package/dist/src/lib/process-refresh-references.js.map +1 -1
  38. package/dist/src/lib/process-scope-statistics.js +8 -3
  39. package/dist/src/lib/process-scope-statistics.js.map +1 -1
  40. package/dist/src/lib/process-verify-rows.js.map +1 -1
  41. package/dist/src/lib/publish.js.map +1 -1
  42. package/dist/src/lib/state-lock.js +10 -4
  43. package/dist/src/lib/state-lock.js.map +1 -1
  44. package/dist/src/lib/supabase-client.d.ts +13 -1
  45. package/dist/src/lib/supabase-client.js +64 -3
  46. package/dist/src/lib/supabase-client.js.map +1 -1
  47. package/dist/src/lib/supabase-json-ordered-write.js +7 -3
  48. package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
  49. package/dist/src/lib/supabase-rest.js.map +1 -1
  50. package/dist/src/lib/supabase-session.d.ts +63 -8
  51. package/dist/src/lib/supabase-session.js +315 -21
  52. package/dist/src/lib/supabase-session.js.map +1 -1
  53. package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -1
  54. package/package.json +8 -7
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-bilingual.js","sourceRoot":"","sources":["../../../src/lib/dataset-bilingual.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n cloneJson,\n isRecord,\n materializeDatasetRows,\n readDatasetRowsInput,\n trimToken,\n type DatasetKind,\n type JsonObject,\n} from './dataset-local.js';\nimport {\n runDatasetValidate,\n type DatasetValidateReport,\n type RunDatasetValidateOptions,\n} from './dataset-validate.js';\nimport { runFlowQa, type FlowQaReport, type RunFlowQaOptions } from './flow-qa.js';\nimport { TIDAS_LANGUAGE_CODE_SET } from './tidas-languages.js';\nimport { runProcessQa, type ProcessQaReport, type RunProcessQaOptions } from './process-qa.js';\n\ntype BilingualDatasetType = 'auto' | DatasetKind;\ntype BilingualStatus = 'completed' | 'blocked';\ntype ScanSeverity = 'warning' | 'blocker';\n\nexport type BilingualTranslationUnit = {\n schema_version: 1;\n unit_id: string;\n row_index: number;\n dataset_type: DatasetKind | null;\n dataset_id: string | null;\n dataset_version: string | null;\n field_path: string;\n source_lang: string;\n target_lang: string;\n source_text: string;\n current_target_text: string | null;\n context: {\n root_field: string | null;\n sibling_keys: string[];\n };\n};\n\nexport type DatasetBilingualExtractReport = {\n schema_version: 1;\n generated_at_utc: string;\n input_path: string;\n requested_type: BilingualDatasetType;\n source_lang: string;\n target_lang: string;\n unit_count: number;\n row_count: number;\n files: {\n translation_units: string | null;\n report: string | null;\n };\n};\n\nexport type TranslationEvidenceEntry = {\n unit_id: string;\n row_index: number;\n dataset_type: DatasetKind | null;\n dataset_id: string | null;\n dataset_version: string | null;\n field_path: string;\n source_lang: string;\n target_lang: string;\n source_text: string;\n translated_text: string;\n basis: string | null;\n review_status: string | null;\n reviewer: string | null;\n};\n\nexport type DatasetBilingualApplyReport = {\n schema_version: 1;\n generated_at_utc: string;\n input_path: string;\n translations_path: string;\n out_path: string;\n target_lang: string;\n status: BilingualStatus;\n row_count: number;\n translation_count: number;\n applied_count: number;\n skipped_count: number;\n blockers: Array<{ code: string; message: string; unit_id?: string }>;\n files: {\n translated_rows: string;\n translation_evidence: string | null;\n report: string | null;\n };\n};\n\nexport type BilingualScanFinding = {\n code: string;\n severity: ScanSeverity;\n row_index: number;\n dataset_type: DatasetKind | null;\n dataset_id: string | null;\n dataset_version: string | null;\n field_path: string;\n lang: string | null;\n message: string;\n text_preview: string;\n};\n\nexport type DatasetBilingualValidateReport = {\n schema_version: 1;\n generated_at_utc: string;\n input_path: string;\n requested_type: BilingualDatasetType;\n status: BilingualStatus;\n row_count: number;\n scan: {\n finding_count: number;\n blocker_count: number;\n warning_count: number;\n findings: BilingualScanFinding[];\n };\n schema_gate: {\n status: DatasetValidateReport['status'];\n valid: number;\n invalid: number;\n report_file: string | null;\n };\n qa_gate: {\n status: 'completed' | 'not_run';\n process_report_file: string | null;\n flow_report_file: string | null;\n };\n files: {\n report: string | null;\n findings: string | null;\n };\n};\n\nexport type RunDatasetBilingualExtractOptions = {\n inputPath: string;\n type?: string | null;\n outDir?: string | null;\n sourceLang?: string | null;\n targetLang?: string | null;\n rawInput?: unknown;\n now?: Date;\n};\n\nexport type RunDatasetBilingualApplyOptions = {\n inputPath: string;\n translationsPath: string;\n outPath: string;\n outDir?: string | null;\n targetLang?: string | null;\n rawInput?: unknown;\n rawTranslations?: unknown;\n now?: Date;\n};\n\nexport type RunDatasetBilingualValidateOptions = {\n inputPath: string;\n type?: string | null;\n outDir?: string | null;\n rawInput?: unknown;\n now?: Date;\n datasetValidateImpl?: (options: RunDatasetValidateOptions) => Promise<DatasetValidateReport>;\n processQaImpl?: (options: RunProcessQaOptions) => Promise<ProcessQaReport>;\n flowQaImpl?: (options: RunFlowQaOptions) => Promise<FlowQaReport>;\n schemas?: RunDatasetValidateOptions['schemas'];\n};\n\ntype LangRecord = JsonObject & {\n '#text'?: unknown;\n '@xml:lang'?: unknown;\n};\n\ntype TranslationInput = {\n unit_id: string | null;\n row_index: number | null;\n field_path: string | null;\n source_lang: string | null;\n target_lang: string | null;\n source_text: string | null;\n translated_text: string | null;\n basis: string | null;\n review_status: string | null;\n reviewer: string | null;\n};\n\ntype ApplyTranslationResult =\n | { applied: true; evidence: TranslationEvidenceEntry }\n | { applied: false; blocker: string };\n\ntype PathVisit = {\n rowIndex: number;\n row: JsonObject;\n kind: DatasetKind | null;\n id: string | null;\n version: string | null;\n};\n\nconst DEFAULT_SOURCE_LANG = 'en';\nconst DEFAULT_TARGET_LANG = 'zh';\nconst PLACEHOLDER_RE = /\\b(?:TODO|TBD|FIXME|REPLACE_ME)\\b|待补充|占位/u;\nconst CJK_RE = /[\\u3400-\\u9fff]/u;\nconst LATIN_WORD_RE = /[A-Za-z]{3,}/gu;\nconst CJK_PLURAL_SUFFIX_RE = /[\\u3400-\\u9fff]+s\\b/u;\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction normalizeType(value: string | null | undefined): BilingualDatasetType {\n const normalized = value?.trim().toLowerCase();\n if (!normalized || normalized === 'auto') {\n return 'auto';\n }\n if (normalized === 'flow' || normalized === 'flows') {\n return 'flow';\n }\n if (normalized === 'process' || normalized === 'processes') {\n return 'process';\n }\n if (\n normalized === 'lifecyclemodel' ||\n normalized === 'lifecyclemodels' ||\n normalized === 'model' ||\n normalized === 'models'\n ) {\n return 'lifecyclemodel';\n }\n throw new CliError('Expected --type to be auto, flow, process, or lifecyclemodel.', {\n code: 'DATASET_BILINGUAL_TYPE_INVALID',\n exitCode: 2,\n details: value,\n });\n}\n\nfunction normalizeLang(value: string | null | undefined, fallback: string): string {\n const normalized = value?.trim().toLowerCase();\n const lang = normalized || fallback;\n if (!TIDAS_LANGUAGE_CODE_SET.has(lang)) {\n throw new CliError(\n `Expected language to use a TIDAS Languages enumeration value, got: ${lang}`,\n {\n code: 'DATASET_BILINGUAL_LANGUAGE_NOT_IN_TIDAS_ENUM',\n exitCode: 2,\n },\n );\n }\n return lang;\n}\n\nfunction pointerEscape(segment: string): string {\n return segment.replace(/~/gu, '~0').replace(/\\//gu, '~1');\n}\n\nfunction pointerUnescape(segment: string): string {\n return segment.replace(/~1/gu, '/').replace(/~0/gu, '~');\n}\n\nfunction pointerFromSegments(segments: string[]): string {\n return `/${segments.map(pointerEscape).join('/')}`;\n}\n\nfunction segmentsFromPointer(pointer: string): string[] {\n if (!pointer.startsWith('/')) {\n throw new CliError(`Expected JSON pointer field_path, got: ${pointer}`, {\n code: 'DATASET_BILINGUAL_FIELD_PATH_INVALID',\n exitCode: 2,\n });\n }\n return pointer.slice(1).split('/').map(pointerUnescape);\n}\n\nfunction textPreview(value: string): string {\n return value.length > 180 ? `${value.slice(0, 177)}...` : value;\n}\n\nfunction langOf(value: unknown): string | null {\n return trimToken(isRecord(value) ? value['@xml:lang'] : null)?.toLowerCase() ?? null;\n}\n\nfunction rawLangOf(value: unknown): string | null {\n return trimToken(isRecord(value) ? value['@xml:lang'] : null) ?? null;\n}\n\nfunction textOf(value: unknown): string | null {\n return trimToken(isRecord(value) ? value['#text'] : null);\n}\n\nfunction isLangRecord(value: unknown): value is LangRecord {\n return isRecord(value) && (typeof value['@xml:lang'] === 'string' || '#text' in value);\n}\n\nfunction isLangRecordArray(value: unknown): value is LangRecord[] {\n return Array.isArray(value) && value.some((item) => isLangRecord(item));\n}\n\nfunction hashUnit(parts: unknown[]): string {\n const hash = createHash('sha256');\n for (const part of parts) {\n hash.update(String(part ?? ''));\n hash.update('\\n');\n }\n return hash.digest('hex').slice(0, 24);\n}\n\nfunction filterRowsByType(\n rows: ReturnType<typeof materializeDatasetRows>,\n requestedType: BilingualDatasetType,\n): ReturnType<typeof materializeDatasetRows> {\n if (requestedType === 'auto') {\n return rows;\n }\n return rows.filter((row) => row.kind === requestedType);\n}\n\nfunction rootFieldFromPath(pathSegments: string[]): string | null {\n return pathSegments.find((segment) => !/^\\d+$/u.test(segment)) ?? null;\n}\n\nfunction siblingKeys(parent: unknown): string[] {\n if (!isRecord(parent)) {\n return [];\n }\n return Object.keys(parent).sort().slice(0, 20);\n}\n\nfunction collectTranslationUnitsFromNode(\n node: unknown,\n pathSegments: string[],\n parent: unknown,\n visit: PathVisit,\n sourceLang: string,\n targetLang: string,\n units: BilingualTranslationUnit[],\n): void {\n if (isLangRecordArray(node)) {\n const source = node.find((item) => langOf(item) === sourceLang);\n const target = node.find((item) => langOf(item) === targetLang);\n const sourceText = textOf(source);\n if (sourceText) {\n const fieldPath = pointerFromSegments(pathSegments);\n units.push({\n schema_version: 1,\n unit_id: hashUnit([\n visit.rowIndex,\n visit.id,\n visit.version,\n fieldPath,\n sourceLang,\n targetLang,\n sourceText,\n ]),\n row_index: visit.rowIndex,\n dataset_type: visit.kind,\n dataset_id: visit.id,\n dataset_version: visit.version,\n field_path: fieldPath,\n source_lang: sourceLang,\n target_lang: targetLang,\n source_text: sourceText,\n current_target_text: textOf(target),\n context: {\n root_field: rootFieldFromPath(pathSegments),\n sibling_keys: siblingKeys(parent),\n },\n });\n }\n return;\n }\n\n if (Array.isArray(node)) {\n node.forEach((item, index) =>\n collectTranslationUnitsFromNode(\n item,\n [...pathSegments, String(index)],\n node,\n visit,\n sourceLang,\n targetLang,\n units,\n ),\n );\n return;\n }\n\n if (isRecord(node)) {\n for (const [key, value] of Object.entries(node)) {\n collectTranslationUnitsFromNode(\n value,\n [...pathSegments, key],\n node,\n visit,\n sourceLang,\n targetLang,\n units,\n );\n }\n }\n}\n\nfunction collectTranslationUnits(\n rows: ReturnType<typeof materializeDatasetRows>,\n sourceLang: string,\n targetLang: string,\n): BilingualTranslationUnit[] {\n const units: BilingualTranslationUnit[] = [];\n for (const row of rows) {\n collectTranslationUnitsFromNode(\n row.row,\n [],\n null,\n {\n rowIndex: row.index,\n row: row.row,\n kind: row.kind,\n id: row.id,\n version: row.version,\n },\n sourceLang,\n targetLang,\n units,\n );\n }\n return units;\n}\n\nfunction outFiles(outDir: string | null | undefined): DatasetBilingualExtractReport['files'] {\n if (!outDir) {\n return {\n translation_units: null,\n report: null,\n };\n }\n const resolved = path.resolve(outDir);\n return {\n translation_units: path.join(resolved, 'outputs', 'trans-units.jsonl'),\n report: path.join(resolved, 'outputs', 'extract-report.json'),\n };\n}\n\nfunction readTranslationInputs(inputPath: string, rawInput?: unknown): TranslationInput[] {\n return readDatasetRowsInput(inputPath, rawInput).map((row) => {\n const translatedText =\n trimToken(row.translated_text) ??\n trimToken(row.translatedText) ??\n trimToken(row.translation) ??\n trimToken(row.target_text) ??\n trimToken(row.targetText);\n return {\n unit_id: trimToken(row.unit_id) ?? trimToken(row.unitId),\n row_index:\n typeof row.row_index === 'number'\n ? row.row_index\n : typeof row.rowIndex === 'number'\n ? row.rowIndex\n : null,\n field_path: trimToken(row.field_path) ?? trimToken(row.fieldPath),\n source_lang: trimToken(row.source_lang) ?? trimToken(row.sourceLang),\n target_lang: trimToken(row.target_lang) ?? trimToken(row.targetLang),\n source_text: trimToken(row.source_text) ?? trimToken(row.sourceText),\n translated_text: translatedText,\n basis: trimToken(row.basis) ?? trimToken(row.rationale),\n review_status: trimToken(row.review_status) ?? trimToken(row.reviewStatus),\n reviewer: trimToken(row.reviewer),\n };\n });\n}\n\nfunction resolvePointer(root: unknown, pointer: string): unknown {\n let current = root;\n for (const segment of segmentsFromPointer(pointer)) {\n if (Array.isArray(current)) {\n current = current[Number(segment)];\n } else if (isRecord(current)) {\n current = current[segment];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction cloneSourceLangRecord(container: LangRecord[], sourceLang: string): LangRecord {\n const source = container.find((item) => langOf(item) === sourceLang);\n const cloned = isRecord(source) ? cloneJson(source) : {};\n cloned['@xml:lang'] = '';\n cloned['#text'] = '';\n return cloned;\n}\n\nfunction applyTranslationToRows(options: {\n rows: JsonObject[];\n translation: TranslationInput;\n targetLang: string;\n}): ApplyTranslationResult {\n const translation = options.translation;\n if (translation.row_index === null || translation.row_index < 0) {\n return { applied: false, blocker: 'Translation is missing row_index.' };\n }\n if (!translation.field_path) {\n return { applied: false, blocker: 'Translation is missing field_path.' };\n }\n if (!translation.translated_text) {\n return { applied: false, blocker: 'Translation is missing translated_text.' };\n }\n\n const row = options.rows[translation.row_index];\n if (!row) {\n return { applied: false, blocker: `No input row exists at index ${translation.row_index}.` };\n }\n\n const container = resolvePointer(row, translation.field_path);\n if (!Array.isArray(container)) {\n return { applied: false, blocker: `field_path does not point to a language array.` };\n }\n\n let target = container.find((item) => isRecord(item) && langOf(item) === options.targetLang);\n if (!target) {\n target = cloneSourceLangRecord(container as LangRecord[], translation.source_lang ?? 'en');\n container.push(target);\n }\n target['@xml:lang'] = options.targetLang;\n target['#text'] = translation.translated_text;\n\n const materializedRows = materializeDatasetRows('memory', { rows: [row] });\n const materialized = materializedRows[0];\n return {\n applied: true,\n evidence: {\n unit_id:\n translation.unit_id ??\n hashUnit([\n translation.row_index,\n translation.field_path,\n translation.source_lang,\n options.targetLang,\n translation.source_text,\n ]),\n row_index: translation.row_index,\n dataset_type: materialized?.kind ?? null,\n dataset_id: materialized?.id ?? null,\n dataset_version: materialized?.version ?? null,\n field_path: translation.field_path,\n source_lang: translation.source_lang ?? 'en',\n target_lang: options.targetLang,\n source_text: translation.source_text ?? '',\n translated_text: translation.translated_text,\n basis: translation.basis,\n review_status: translation.review_status,\n reviewer: translation.reviewer,\n },\n };\n}\n\nfunction writeRowsJsonl(filePath: string, rows: JsonObject[]): string {\n return writeJsonLinesArtifact(filePath, rows);\n}\n\nfunction scanText(node: unknown, pathSegments: string[], visit: PathVisit): BilingualScanFinding[] {\n const findings: BilingualScanFinding[] = [];\n\n if (isLangRecord(node)) {\n const rawLang = rawLangOf(node);\n const lang = langOf(node);\n const text = textOf(node);\n if (!text) {\n return findings;\n }\n const fieldPath = pointerFromSegments(pathSegments);\n const base = {\n row_index: visit.rowIndex,\n dataset_type: visit.kind,\n dataset_id: visit.id,\n dataset_version: visit.version,\n field_path: fieldPath,\n lang,\n text_preview: textPreview(text),\n };\n if (rawLang && !TIDAS_LANGUAGE_CODE_SET.has(rawLang)) {\n findings.push({\n ...base,\n code: 'localized_text_language_not_in_tidas_enum',\n severity: 'blocker',\n message: 'Localized text @xml:lang is not a TIDAS Languages enumeration value.',\n });\n }\n if (PLACEHOLDER_RE.test(text)) {\n findings.push({\n ...base,\n code: 'placeholder_text',\n severity: 'blocker',\n message: 'Text contains placeholder markers.',\n });\n }\n if (lang === 'en' && CJK_RE.test(text)) {\n findings.push({\n ...base,\n code: 'english_contains_cjk',\n severity: 'blocker',\n message: 'English text contains CJK characters.',\n });\n }\n if (lang === 'zh' && CJK_PLURAL_SUFFIX_RE.test(text)) {\n findings.push({\n ...base,\n code: 'mechanical_plural_suffix',\n severity: 'blocker',\n message: 'Chinese text contains mechanical mixed-language plural suffixes.',\n });\n }\n if (lang === 'zh') {\n const latinWords = text.match(LATIN_WORD_RE) ?? [];\n if (latinWords.length >= 8) {\n findings.push({\n ...base,\n code: 'zh_latin_word_density',\n severity: 'warning',\n message:\n 'Chinese text contains many Latin words; review for machine-translation residue.',\n });\n }\n }\n return findings;\n }\n\n if (Array.isArray(node)) {\n node.forEach((item, index) => {\n findings.push(...scanText(item, [...pathSegments, String(index)], visit));\n });\n return findings;\n }\n\n if (isRecord(node)) {\n for (const [key, value] of Object.entries(node)) {\n findings.push(...scanText(value, [...pathSegments, key], visit));\n }\n }\n\n return findings;\n}\n\nfunction scanRows(rows: ReturnType<typeof materializeDatasetRows>): BilingualScanFinding[] {\n return rows.flatMap((row) =>\n scanText(row.row, [], {\n rowIndex: row.index,\n row: row.row,\n kind: row.kind,\n id: row.id,\n version: row.version,\n }),\n );\n}\n\nfunction validateFiles(outDir: string | null | undefined): DatasetBilingualValidateReport['files'] {\n if (!outDir) {\n return {\n report: null,\n findings: null,\n };\n }\n const resolved = path.resolve(outDir);\n return {\n report: path.join(resolved, 'outputs', 'bilingual-validate-report.json'),\n findings: path.join(resolved, 'outputs', 'bilingual-findings.jsonl'),\n };\n}\n\nexport async function runDatasetBilingualExtract(\n options: RunDatasetBilingualExtractOptions,\n): Promise<DatasetBilingualExtractReport> {\n const requestedType = normalizeType(options.type);\n const sourceLang = normalizeLang(options.sourceLang, DEFAULT_SOURCE_LANG);\n const targetLang = normalizeLang(options.targetLang, DEFAULT_TARGET_LANG);\n const rows = filterRowsByType(\n materializeDatasetRows(options.inputPath, options.rawInput),\n requestedType,\n );\n const units = collectTranslationUnits(rows, sourceLang, targetLang);\n const files = outFiles(options.outDir);\n const report: DatasetBilingualExtractReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n input_path: options.inputPath,\n requested_type: requestedType,\n source_lang: sourceLang,\n target_lang: targetLang,\n unit_count: units.length,\n row_count: rows.length,\n files,\n };\n\n if (files.translation_units) {\n writeJsonLinesArtifact(files.translation_units, units);\n }\n if (files.report) {\n writeJsonArtifact(files.report, report);\n }\n return report;\n}\n\nexport async function runDatasetBilingualApply(\n options: RunDatasetBilingualApplyOptions,\n): Promise<DatasetBilingualApplyReport> {\n const targetLang = normalizeLang(options.targetLang, DEFAULT_TARGET_LANG);\n if (!options.outPath) {\n throw new CliError('Missing required --out value.', {\n code: 'DATASET_BILINGUAL_OUT_REQUIRED',\n exitCode: 2,\n });\n }\n if (!options.translationsPath) {\n throw new CliError('Missing required --translations value.', {\n code: 'DATASET_BILINGUAL_TRANSLATIONS_REQUIRED',\n exitCode: 2,\n });\n }\n\n const rows = readDatasetRowsInput(options.inputPath, options.rawInput).map((row) =>\n cloneJson(row),\n );\n const translations = readTranslationInputs(options.translationsPath, options.rawTranslations);\n const blockers: DatasetBilingualApplyReport['blockers'] = [];\n const evidence: TranslationEvidenceEntry[] = [];\n let appliedCount = 0;\n let skippedCount = 0;\n\n for (const translation of translations) {\n const result = applyTranslationToRows({ rows, translation, targetLang });\n if (result.applied) {\n appliedCount += 1;\n evidence.push(result.evidence);\n } else {\n skippedCount += 1;\n blockers.push({\n code: 'translation_not_applied',\n message: result.blocker,\n unit_id: translation.unit_id ?? undefined,\n });\n }\n }\n\n const resolvedOut = path.resolve(options.outPath);\n const resolvedOutDir = options.outDir ? path.resolve(options.outDir) : path.dirname(resolvedOut);\n const evidenceFile = path.join(resolvedOutDir, 'outputs', 'translation-evidence.json');\n const reportFile = path.join(resolvedOutDir, 'outputs', 'bilingual-apply-report.json');\n writeRowsJsonl(resolvedOut, rows);\n writeJsonArtifact(evidenceFile, {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n entries: evidence,\n });\n\n const report: DatasetBilingualApplyReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n input_path: options.inputPath,\n translations_path: options.translationsPath,\n out_path: resolvedOut,\n target_lang: targetLang,\n status: blockers.length > 0 ? 'blocked' : 'completed',\n row_count: rows.length,\n translation_count: translations.length,\n applied_count: appliedCount,\n skipped_count: skippedCount,\n blockers,\n files: {\n translated_rows: resolvedOut,\n translation_evidence: evidenceFile,\n report: reportFile,\n },\n };\n writeJsonArtifact(reportFile, report);\n return report;\n}\n\nexport async function runDatasetBilingualValidate(\n options: RunDatasetBilingualValidateOptions,\n): Promise<DatasetBilingualValidateReport> {\n const requestedType = normalizeType(options.type);\n const rows = filterRowsByType(\n materializeDatasetRows(options.inputPath, options.rawInput),\n requestedType,\n );\n const findings = scanRows(rows);\n const files = validateFiles(options.outDir);\n const datasetValidateImpl = options.datasetValidateImpl ?? runDatasetValidate;\n const schemaGateOutDir = options.outDir\n ? path.join(path.resolve(options.outDir), 'schema')\n : null;\n const schemaReport = await datasetValidateImpl({\n inputPath: options.inputPath,\n type: requestedType,\n outDir: schemaGateOutDir,\n rawInput: { rows: rows.map((row) => row.row) },\n now: options.now,\n schemas: options.schemas,\n });\n\n let processReport: ProcessQaReport | null = null;\n let flowReport: FlowQaReport | null = null;\n if (options.outDir && (requestedType === 'process' || requestedType === 'auto')) {\n const processRows = rows.filter((row) => row.kind === 'process').map((row) => row.row);\n if (processRows.length > 0) {\n const processRowsFile = path.join(path.resolve(options.outDir), 'qa-input-processes.jsonl');\n writeJsonLinesArtifact(processRowsFile, processRows);\n processReport = await (options.processQaImpl ?? runProcessQa)({\n rowsFile: processRowsFile,\n outDir: path.join(path.resolve(options.outDir), 'qa', 'process'),\n now: () => options.now ?? new Date(),\n });\n }\n }\n if (options.outDir && (requestedType === 'flow' || requestedType === 'auto')) {\n const flowRows = rows.filter((row) => row.kind === 'flow').map((row) => row.row);\n if (flowRows.length > 0) {\n const flowRowsFile = path.join(path.resolve(options.outDir), 'qa-input-flows.jsonl');\n writeJsonLinesArtifact(flowRowsFile, flowRows);\n flowReport = await (options.flowQaImpl ?? runFlowQa)({\n rowsFile: flowRowsFile,\n outDir: path.join(path.resolve(options.outDir), 'qa', 'flow'),\n now: () => options.now ?? new Date(),\n });\n }\n }\n\n const blockerCount = findings.filter((finding) => finding.severity === 'blocker').length;\n const warningCount = findings.filter((finding) => finding.severity === 'warning').length;\n const report: DatasetBilingualValidateReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n input_path: options.inputPath,\n requested_type: requestedType,\n status: blockerCount > 0 || schemaReport.counts.invalid > 0 ? 'blocked' : 'completed',\n row_count: rows.length,\n scan: {\n finding_count: findings.length,\n blocker_count: blockerCount,\n warning_count: warningCount,\n findings,\n },\n schema_gate: {\n status: schemaReport.status,\n valid: schemaReport.counts.valid,\n invalid: schemaReport.counts.invalid,\n report_file: schemaReport.files.report,\n },\n qa_gate: {\n status: processReport || flowReport ? 'completed' : 'not_run',\n process_report_file: processReport?.files.report ?? null,\n flow_report_file: flowReport?.files.report ?? null,\n },\n files,\n };\n\n if (files.findings) {\n writeJsonLinesArtifact(files.findings, findings);\n }\n if (files.report) {\n writeJsonArtifact(files.report, report);\n }\n return report;\n}\n\nexport const __testInternals = {\n collectTranslationUnits,\n normalizeType,\n pointerFromSegments,\n rawLangOf,\n segmentsFromPointer,\n scanRows,\n};\n"]}
1
+ {"version":3,"file":"dataset-bilingual.js","sourceRoot":"","sources":["../../../src/lib/dataset-bilingual.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n cloneJson,\n isRecord,\n materializeDatasetRows,\n readDatasetRowsInput,\n trimToken,\n type DatasetKind,\n type JsonObject,\n} from './dataset-local.js';\nimport {\n runDatasetValidate,\n type DatasetValidateReport,\n type RunDatasetValidateOptions,\n} from './dataset-validate.js';\nimport { runFlowQa, type FlowQaReport, type RunFlowQaOptions } from './flow-qa.js';\nimport { TIDAS_LANGUAGE_CODE_SET } from './tidas-languages.js';\nimport { runProcessQa, type ProcessQaReport, type RunProcessQaOptions } from './process-qa.js';\n\ntype BilingualDatasetType = 'auto' | DatasetKind;\ntype BilingualStatus = 'completed' | 'blocked';\ntype ScanSeverity = 'warning' | 'blocker';\n\nexport type BilingualTranslationUnit = {\n schema_version: 1;\n unit_id: string;\n row_index: number;\n dataset_type: DatasetKind | null;\n dataset_id: string | null;\n dataset_version: string | null;\n field_path: string;\n source_lang: string;\n target_lang: string;\n source_text: string;\n current_target_text: string | null;\n context: {\n root_field: string | null;\n sibling_keys: string[];\n };\n};\n\nexport type DatasetBilingualExtractReport = {\n schema_version: 1;\n generated_at_utc: string;\n input_path: string;\n requested_type: BilingualDatasetType;\n source_lang: string;\n target_lang: string;\n unit_count: number;\n row_count: number;\n files: {\n translation_units: string | null;\n report: string | null;\n };\n};\n\nexport type TranslationEvidenceEntry = {\n unit_id: string;\n row_index: number;\n dataset_type: DatasetKind | null;\n dataset_id: string | null;\n dataset_version: string | null;\n field_path: string;\n source_lang: string;\n target_lang: string;\n source_text: string;\n translated_text: string;\n basis: string | null;\n review_status: string | null;\n reviewer: string | null;\n};\n\nexport type DatasetBilingualApplyReport = {\n schema_version: 1;\n generated_at_utc: string;\n input_path: string;\n translations_path: string;\n out_path: string;\n target_lang: string;\n status: BilingualStatus;\n row_count: number;\n translation_count: number;\n applied_count: number;\n skipped_count: number;\n blockers: Array<{ code: string; message: string; unit_id?: string }>;\n files: {\n translated_rows: string;\n translation_evidence: string | null;\n report: string | null;\n };\n};\n\nexport type BilingualScanFinding = {\n code: string;\n severity: ScanSeverity;\n row_index: number;\n dataset_type: DatasetKind | null;\n dataset_id: string | null;\n dataset_version: string | null;\n field_path: string;\n lang: string | null;\n message: string;\n text_preview: string;\n};\n\nexport type DatasetBilingualValidateReport = {\n schema_version: 1;\n generated_at_utc: string;\n input_path: string;\n requested_type: BilingualDatasetType;\n status: BilingualStatus;\n row_count: number;\n scan: {\n finding_count: number;\n blocker_count: number;\n warning_count: number;\n findings: BilingualScanFinding[];\n };\n schema_gate: {\n status: DatasetValidateReport['status'];\n valid: number;\n invalid: number;\n report_file: string | null;\n };\n qa_gate: {\n status: 'completed' | 'not_run';\n process_report_file: string | null;\n flow_report_file: string | null;\n };\n files: {\n report: string | null;\n findings: string | null;\n };\n};\n\nexport type RunDatasetBilingualExtractOptions = {\n inputPath: string;\n type?: string | null;\n outDir?: string | null;\n sourceLang?: string | null;\n targetLang?: string | null;\n rawInput?: unknown;\n now?: Date;\n};\n\nexport type RunDatasetBilingualApplyOptions = {\n inputPath: string;\n translationsPath: string;\n outPath: string;\n outDir?: string | null;\n targetLang?: string | null;\n rawInput?: unknown;\n rawTranslations?: unknown;\n now?: Date;\n};\n\nexport type RunDatasetBilingualValidateOptions = {\n inputPath: string;\n type?: string | null;\n outDir?: string | null;\n rawInput?: unknown;\n now?: Date;\n datasetValidateImpl?: (options: RunDatasetValidateOptions) => Promise<DatasetValidateReport>;\n processQaImpl?: (options: RunProcessQaOptions) => Promise<ProcessQaReport>;\n flowQaImpl?: (options: RunFlowQaOptions) => Promise<FlowQaReport>;\n schemas?: RunDatasetValidateOptions['schemas'];\n};\n\ntype LangRecord = JsonObject & {\n '#text'?: unknown;\n '@xml:lang'?: unknown;\n};\n\ntype TranslationInput = {\n unit_id: string | null;\n row_index: number | null;\n field_path: string | null;\n source_lang: string | null;\n target_lang: string | null;\n source_text: string | null;\n translated_text: string | null;\n basis: string | null;\n review_status: string | null;\n reviewer: string | null;\n};\n\ntype ApplyTranslationResult =\n { applied: true; evidence: TranslationEvidenceEntry } | { applied: false; blocker: string };\n\ntype PathVisit = {\n rowIndex: number;\n row: JsonObject;\n kind: DatasetKind | null;\n id: string | null;\n version: string | null;\n};\n\nconst DEFAULT_SOURCE_LANG = 'en';\nconst DEFAULT_TARGET_LANG = 'zh';\nconst PLACEHOLDER_RE = /\\b(?:TODO|TBD|FIXME|REPLACE_ME)\\b|待补充|占位/u;\nconst CJK_RE = /[\\u3400-\\u9fff]/u;\nconst LATIN_WORD_RE = /[A-Za-z]{3,}/gu;\nconst CJK_PLURAL_SUFFIX_RE = /[\\u3400-\\u9fff]+s\\b/u;\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction normalizeType(value: string | null | undefined): BilingualDatasetType {\n const normalized = value?.trim().toLowerCase();\n if (!normalized || normalized === 'auto') {\n return 'auto';\n }\n if (normalized === 'flow' || normalized === 'flows') {\n return 'flow';\n }\n if (normalized === 'process' || normalized === 'processes') {\n return 'process';\n }\n if (\n normalized === 'lifecyclemodel' ||\n normalized === 'lifecyclemodels' ||\n normalized === 'model' ||\n normalized === 'models'\n ) {\n return 'lifecyclemodel';\n }\n throw new CliError('Expected --type to be auto, flow, process, or lifecyclemodel.', {\n code: 'DATASET_BILINGUAL_TYPE_INVALID',\n exitCode: 2,\n details: value,\n });\n}\n\nfunction normalizeLang(value: string | null | undefined, fallback: string): string {\n const normalized = value?.trim().toLowerCase();\n const lang = normalized || fallback;\n if (!TIDAS_LANGUAGE_CODE_SET.has(lang)) {\n throw new CliError(\n `Expected language to use a TIDAS Languages enumeration value, got: ${lang}`,\n {\n code: 'DATASET_BILINGUAL_LANGUAGE_NOT_IN_TIDAS_ENUM',\n exitCode: 2,\n },\n );\n }\n return lang;\n}\n\nfunction pointerEscape(segment: string): string {\n return segment.replace(/~/gu, '~0').replace(/\\//gu, '~1');\n}\n\nfunction pointerUnescape(segment: string): string {\n return segment.replace(/~1/gu, '/').replace(/~0/gu, '~');\n}\n\nfunction pointerFromSegments(segments: string[]): string {\n return `/${segments.map(pointerEscape).join('/')}`;\n}\n\nfunction segmentsFromPointer(pointer: string): string[] {\n if (!pointer.startsWith('/')) {\n throw new CliError(`Expected JSON pointer field_path, got: ${pointer}`, {\n code: 'DATASET_BILINGUAL_FIELD_PATH_INVALID',\n exitCode: 2,\n });\n }\n return pointer.slice(1).split('/').map(pointerUnescape);\n}\n\nfunction textPreview(value: string): string {\n return value.length > 180 ? `${value.slice(0, 177)}...` : value;\n}\n\nfunction langOf(value: unknown): string | null {\n return trimToken(isRecord(value) ? value['@xml:lang'] : null)?.toLowerCase() ?? null;\n}\n\nfunction rawLangOf(value: unknown): string | null {\n return trimToken(isRecord(value) ? value['@xml:lang'] : null) ?? null;\n}\n\nfunction textOf(value: unknown): string | null {\n return trimToken(isRecord(value) ? value['#text'] : null);\n}\n\nfunction isLangRecord(value: unknown): value is LangRecord {\n return isRecord(value) && (typeof value['@xml:lang'] === 'string' || '#text' in value);\n}\n\nfunction isLangRecordArray(value: unknown): value is LangRecord[] {\n return Array.isArray(value) && value.some((item) => isLangRecord(item));\n}\n\nfunction hashUnit(parts: unknown[]): string {\n const hash = createHash('sha256');\n for (const part of parts) {\n hash.update(String(part ?? ''));\n hash.update('\\n');\n }\n return hash.digest('hex').slice(0, 24);\n}\n\nfunction filterRowsByType(\n rows: ReturnType<typeof materializeDatasetRows>,\n requestedType: BilingualDatasetType,\n): ReturnType<typeof materializeDatasetRows> {\n if (requestedType === 'auto') {\n return rows;\n }\n return rows.filter((row) => row.kind === requestedType);\n}\n\nfunction rootFieldFromPath(pathSegments: string[]): string | null {\n return pathSegments.find((segment) => !/^\\d+$/u.test(segment)) ?? null;\n}\n\nfunction siblingKeys(parent: unknown): string[] {\n if (!isRecord(parent)) {\n return [];\n }\n return Object.keys(parent).sort().slice(0, 20);\n}\n\nfunction collectTranslationUnitsFromNode(\n node: unknown,\n pathSegments: string[],\n parent: unknown,\n visit: PathVisit,\n sourceLang: string,\n targetLang: string,\n units: BilingualTranslationUnit[],\n): void {\n if (isLangRecordArray(node)) {\n const source = node.find((item) => langOf(item) === sourceLang);\n const target = node.find((item) => langOf(item) === targetLang);\n const sourceText = textOf(source);\n if (sourceText) {\n const fieldPath = pointerFromSegments(pathSegments);\n units.push({\n schema_version: 1,\n unit_id: hashUnit([\n visit.rowIndex,\n visit.id,\n visit.version,\n fieldPath,\n sourceLang,\n targetLang,\n sourceText,\n ]),\n row_index: visit.rowIndex,\n dataset_type: visit.kind,\n dataset_id: visit.id,\n dataset_version: visit.version,\n field_path: fieldPath,\n source_lang: sourceLang,\n target_lang: targetLang,\n source_text: sourceText,\n current_target_text: textOf(target),\n context: {\n root_field: rootFieldFromPath(pathSegments),\n sibling_keys: siblingKeys(parent),\n },\n });\n }\n return;\n }\n\n if (Array.isArray(node)) {\n node.forEach((item, index) =>\n collectTranslationUnitsFromNode(\n item,\n [...pathSegments, String(index)],\n node,\n visit,\n sourceLang,\n targetLang,\n units,\n ),\n );\n return;\n }\n\n if (isRecord(node)) {\n for (const [key, value] of Object.entries(node)) {\n collectTranslationUnitsFromNode(\n value,\n [...pathSegments, key],\n node,\n visit,\n sourceLang,\n targetLang,\n units,\n );\n }\n }\n}\n\nfunction collectTranslationUnits(\n rows: ReturnType<typeof materializeDatasetRows>,\n sourceLang: string,\n targetLang: string,\n): BilingualTranslationUnit[] {\n const units: BilingualTranslationUnit[] = [];\n for (const row of rows) {\n collectTranslationUnitsFromNode(\n row.row,\n [],\n null,\n {\n rowIndex: row.index,\n row: row.row,\n kind: row.kind,\n id: row.id,\n version: row.version,\n },\n sourceLang,\n targetLang,\n units,\n );\n }\n return units;\n}\n\nfunction outFiles(outDir: string | null | undefined): DatasetBilingualExtractReport['files'] {\n if (!outDir) {\n return {\n translation_units: null,\n report: null,\n };\n }\n const resolved = path.resolve(outDir);\n return {\n translation_units: path.join(resolved, 'outputs', 'trans-units.jsonl'),\n report: path.join(resolved, 'outputs', 'extract-report.json'),\n };\n}\n\nfunction readTranslationInputs(inputPath: string, rawInput?: unknown): TranslationInput[] {\n return readDatasetRowsInput(inputPath, rawInput).map((row) => {\n const translatedText =\n trimToken(row.translated_text) ??\n trimToken(row.translatedText) ??\n trimToken(row.translation) ??\n trimToken(row.target_text) ??\n trimToken(row.targetText);\n return {\n unit_id: trimToken(row.unit_id) ?? trimToken(row.unitId),\n row_index:\n typeof row.row_index === 'number'\n ? row.row_index\n : typeof row.rowIndex === 'number'\n ? row.rowIndex\n : null,\n field_path: trimToken(row.field_path) ?? trimToken(row.fieldPath),\n source_lang: trimToken(row.source_lang) ?? trimToken(row.sourceLang),\n target_lang: trimToken(row.target_lang) ?? trimToken(row.targetLang),\n source_text: trimToken(row.source_text) ?? trimToken(row.sourceText),\n translated_text: translatedText,\n basis: trimToken(row.basis) ?? trimToken(row.rationale),\n review_status: trimToken(row.review_status) ?? trimToken(row.reviewStatus),\n reviewer: trimToken(row.reviewer),\n };\n });\n}\n\nfunction resolvePointer(root: unknown, pointer: string): unknown {\n let current = root;\n for (const segment of segmentsFromPointer(pointer)) {\n if (Array.isArray(current)) {\n current = current[Number(segment)];\n } else if (isRecord(current)) {\n current = current[segment];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction cloneSourceLangRecord(container: LangRecord[], sourceLang: string): LangRecord {\n const source = container.find((item) => langOf(item) === sourceLang);\n const cloned = isRecord(source) ? cloneJson(source) : {};\n cloned['@xml:lang'] = '';\n cloned['#text'] = '';\n return cloned;\n}\n\nfunction applyTranslationToRows(options: {\n rows: JsonObject[];\n translation: TranslationInput;\n targetLang: string;\n}): ApplyTranslationResult {\n const translation = options.translation;\n if (translation.row_index === null || translation.row_index < 0) {\n return { applied: false, blocker: 'Translation is missing row_index.' };\n }\n if (!translation.field_path) {\n return { applied: false, blocker: 'Translation is missing field_path.' };\n }\n if (!translation.translated_text) {\n return { applied: false, blocker: 'Translation is missing translated_text.' };\n }\n\n const row = options.rows[translation.row_index];\n if (!row) {\n return { applied: false, blocker: `No input row exists at index ${translation.row_index}.` };\n }\n\n const container = resolvePointer(row, translation.field_path);\n if (!Array.isArray(container)) {\n return { applied: false, blocker: `field_path does not point to a language array.` };\n }\n\n let target = container.find((item) => isRecord(item) && langOf(item) === options.targetLang);\n if (!target) {\n target = cloneSourceLangRecord(container as LangRecord[], translation.source_lang ?? 'en');\n container.push(target);\n }\n target['@xml:lang'] = options.targetLang;\n target['#text'] = translation.translated_text;\n\n const materializedRows = materializeDatasetRows('memory', { rows: [row] });\n const materialized = materializedRows[0];\n return {\n applied: true,\n evidence: {\n unit_id:\n translation.unit_id ??\n hashUnit([\n translation.row_index,\n translation.field_path,\n translation.source_lang,\n options.targetLang,\n translation.source_text,\n ]),\n row_index: translation.row_index,\n dataset_type: materialized?.kind ?? null,\n dataset_id: materialized?.id ?? null,\n dataset_version: materialized?.version ?? null,\n field_path: translation.field_path,\n source_lang: translation.source_lang ?? 'en',\n target_lang: options.targetLang,\n source_text: translation.source_text ?? '',\n translated_text: translation.translated_text,\n basis: translation.basis,\n review_status: translation.review_status,\n reviewer: translation.reviewer,\n },\n };\n}\n\nfunction writeRowsJsonl(filePath: string, rows: JsonObject[]): string {\n return writeJsonLinesArtifact(filePath, rows);\n}\n\nfunction scanText(node: unknown, pathSegments: string[], visit: PathVisit): BilingualScanFinding[] {\n const findings: BilingualScanFinding[] = [];\n\n if (isLangRecord(node)) {\n const rawLang = rawLangOf(node);\n const lang = langOf(node);\n const text = textOf(node);\n if (!text) {\n return findings;\n }\n const fieldPath = pointerFromSegments(pathSegments);\n const base = {\n row_index: visit.rowIndex,\n dataset_type: visit.kind,\n dataset_id: visit.id,\n dataset_version: visit.version,\n field_path: fieldPath,\n lang,\n text_preview: textPreview(text),\n };\n if (rawLang && !TIDAS_LANGUAGE_CODE_SET.has(rawLang)) {\n findings.push({\n ...base,\n code: 'localized_text_language_not_in_tidas_enum',\n severity: 'blocker',\n message: 'Localized text @xml:lang is not a TIDAS Languages enumeration value.',\n });\n }\n if (PLACEHOLDER_RE.test(text)) {\n findings.push({\n ...base,\n code: 'placeholder_text',\n severity: 'blocker',\n message: 'Text contains placeholder markers.',\n });\n }\n if (lang === 'en' && CJK_RE.test(text)) {\n findings.push({\n ...base,\n code: 'english_contains_cjk',\n severity: 'blocker',\n message: 'English text contains CJK characters.',\n });\n }\n if (lang === 'zh' && CJK_PLURAL_SUFFIX_RE.test(text)) {\n findings.push({\n ...base,\n code: 'mechanical_plural_suffix',\n severity: 'blocker',\n message: 'Chinese text contains mechanical mixed-language plural suffixes.',\n });\n }\n if (lang === 'zh') {\n const latinWords = text.match(LATIN_WORD_RE) ?? [];\n if (latinWords.length >= 8) {\n findings.push({\n ...base,\n code: 'zh_latin_word_density',\n severity: 'warning',\n message:\n 'Chinese text contains many Latin words; review for machine-translation residue.',\n });\n }\n }\n return findings;\n }\n\n if (Array.isArray(node)) {\n node.forEach((item, index) => {\n findings.push(...scanText(item, [...pathSegments, String(index)], visit));\n });\n return findings;\n }\n\n if (isRecord(node)) {\n for (const [key, value] of Object.entries(node)) {\n findings.push(...scanText(value, [...pathSegments, key], visit));\n }\n }\n\n return findings;\n}\n\nfunction scanRows(rows: ReturnType<typeof materializeDatasetRows>): BilingualScanFinding[] {\n return rows.flatMap((row) =>\n scanText(row.row, [], {\n rowIndex: row.index,\n row: row.row,\n kind: row.kind,\n id: row.id,\n version: row.version,\n }),\n );\n}\n\nfunction validateFiles(outDir: string | null | undefined): DatasetBilingualValidateReport['files'] {\n if (!outDir) {\n return {\n report: null,\n findings: null,\n };\n }\n const resolved = path.resolve(outDir);\n return {\n report: path.join(resolved, 'outputs', 'bilingual-validate-report.json'),\n findings: path.join(resolved, 'outputs', 'bilingual-findings.jsonl'),\n };\n}\n\nexport async function runDatasetBilingualExtract(\n options: RunDatasetBilingualExtractOptions,\n): Promise<DatasetBilingualExtractReport> {\n const requestedType = normalizeType(options.type);\n const sourceLang = normalizeLang(options.sourceLang, DEFAULT_SOURCE_LANG);\n const targetLang = normalizeLang(options.targetLang, DEFAULT_TARGET_LANG);\n const rows = filterRowsByType(\n materializeDatasetRows(options.inputPath, options.rawInput),\n requestedType,\n );\n const units = collectTranslationUnits(rows, sourceLang, targetLang);\n const files = outFiles(options.outDir);\n const report: DatasetBilingualExtractReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n input_path: options.inputPath,\n requested_type: requestedType,\n source_lang: sourceLang,\n target_lang: targetLang,\n unit_count: units.length,\n row_count: rows.length,\n files,\n };\n\n if (files.translation_units) {\n writeJsonLinesArtifact(files.translation_units, units);\n }\n if (files.report) {\n writeJsonArtifact(files.report, report);\n }\n return report;\n}\n\nexport async function runDatasetBilingualApply(\n options: RunDatasetBilingualApplyOptions,\n): Promise<DatasetBilingualApplyReport> {\n const targetLang = normalizeLang(options.targetLang, DEFAULT_TARGET_LANG);\n if (!options.outPath) {\n throw new CliError('Missing required --out value.', {\n code: 'DATASET_BILINGUAL_OUT_REQUIRED',\n exitCode: 2,\n });\n }\n if (!options.translationsPath) {\n throw new CliError('Missing required --translations value.', {\n code: 'DATASET_BILINGUAL_TRANSLATIONS_REQUIRED',\n exitCode: 2,\n });\n }\n\n const rows = readDatasetRowsInput(options.inputPath, options.rawInput).map((row) =>\n cloneJson(row),\n );\n const translations = readTranslationInputs(options.translationsPath, options.rawTranslations);\n const blockers: DatasetBilingualApplyReport['blockers'] = [];\n const evidence: TranslationEvidenceEntry[] = [];\n let appliedCount = 0;\n let skippedCount = 0;\n\n for (const translation of translations) {\n const result = applyTranslationToRows({ rows, translation, targetLang });\n if (result.applied) {\n appliedCount += 1;\n evidence.push(result.evidence);\n } else {\n skippedCount += 1;\n blockers.push({\n code: 'translation_not_applied',\n message: result.blocker,\n unit_id: translation.unit_id ?? undefined,\n });\n }\n }\n\n const resolvedOut = path.resolve(options.outPath);\n const resolvedOutDir = options.outDir ? path.resolve(options.outDir) : path.dirname(resolvedOut);\n const evidenceFile = path.join(resolvedOutDir, 'outputs', 'translation-evidence.json');\n const reportFile = path.join(resolvedOutDir, 'outputs', 'bilingual-apply-report.json');\n writeRowsJsonl(resolvedOut, rows);\n writeJsonArtifact(evidenceFile, {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n entries: evidence,\n });\n\n const report: DatasetBilingualApplyReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n input_path: options.inputPath,\n translations_path: options.translationsPath,\n out_path: resolvedOut,\n target_lang: targetLang,\n status: blockers.length > 0 ? 'blocked' : 'completed',\n row_count: rows.length,\n translation_count: translations.length,\n applied_count: appliedCount,\n skipped_count: skippedCount,\n blockers,\n files: {\n translated_rows: resolvedOut,\n translation_evidence: evidenceFile,\n report: reportFile,\n },\n };\n writeJsonArtifact(reportFile, report);\n return report;\n}\n\nexport async function runDatasetBilingualValidate(\n options: RunDatasetBilingualValidateOptions,\n): Promise<DatasetBilingualValidateReport> {\n const requestedType = normalizeType(options.type);\n const rows = filterRowsByType(\n materializeDatasetRows(options.inputPath, options.rawInput),\n requestedType,\n );\n const findings = scanRows(rows);\n const files = validateFiles(options.outDir);\n const datasetValidateImpl = options.datasetValidateImpl ?? runDatasetValidate;\n const schemaGateOutDir = options.outDir\n ? path.join(path.resolve(options.outDir), 'schema')\n : null;\n const schemaReport = await datasetValidateImpl({\n inputPath: options.inputPath,\n type: requestedType,\n outDir: schemaGateOutDir,\n rawInput: { rows: rows.map((row) => row.row) },\n now: options.now,\n schemas: options.schemas,\n });\n\n let processReport: ProcessQaReport | null = null;\n let flowReport: FlowQaReport | null = null;\n if (options.outDir && (requestedType === 'process' || requestedType === 'auto')) {\n const processRows = rows.filter((row) => row.kind === 'process').map((row) => row.row);\n if (processRows.length > 0) {\n const processRowsFile = path.join(path.resolve(options.outDir), 'qa-input-processes.jsonl');\n writeJsonLinesArtifact(processRowsFile, processRows);\n processReport = await (options.processQaImpl ?? runProcessQa)({\n rowsFile: processRowsFile,\n outDir: path.join(path.resolve(options.outDir), 'qa', 'process'),\n now: () => options.now ?? new Date(),\n });\n }\n }\n if (options.outDir && (requestedType === 'flow' || requestedType === 'auto')) {\n const flowRows = rows.filter((row) => row.kind === 'flow').map((row) => row.row);\n if (flowRows.length > 0) {\n const flowRowsFile = path.join(path.resolve(options.outDir), 'qa-input-flows.jsonl');\n writeJsonLinesArtifact(flowRowsFile, flowRows);\n flowReport = await (options.flowQaImpl ?? runFlowQa)({\n rowsFile: flowRowsFile,\n outDir: path.join(path.resolve(options.outDir), 'qa', 'flow'),\n now: () => options.now ?? new Date(),\n });\n }\n }\n\n const blockerCount = findings.filter((finding) => finding.severity === 'blocker').length;\n const warningCount = findings.filter((finding) => finding.severity === 'warning').length;\n const report: DatasetBilingualValidateReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n input_path: options.inputPath,\n requested_type: requestedType,\n status: blockerCount > 0 || schemaReport.counts.invalid > 0 ? 'blocked' : 'completed',\n row_count: rows.length,\n scan: {\n finding_count: findings.length,\n blocker_count: blockerCount,\n warning_count: warningCount,\n findings,\n },\n schema_gate: {\n status: schemaReport.status,\n valid: schemaReport.counts.valid,\n invalid: schemaReport.counts.invalid,\n report_file: schemaReport.files.report,\n },\n qa_gate: {\n status: processReport || flowReport ? 'completed' : 'not_run',\n process_report_file: processReport?.files.report ?? null,\n flow_report_file: flowReport?.files.report ?? null,\n },\n files,\n };\n\n if (files.findings) {\n writeJsonLinesArtifact(files.findings, findings);\n }\n if (files.report) {\n writeJsonArtifact(files.report, report);\n }\n return report;\n}\n\nexport const __testInternals = {\n collectTranslationUnits,\n normalizeType,\n pointerFromSegments,\n rawLangOf,\n segmentsFromPointer,\n scanRows,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-curation-queue.js","sourceRoot":"","sources":["../../../src/lib/dataset-curation-queue.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\nimport {\n firstNonEmpty,\n isRecord,\n materializeDatasetRows,\n type DatasetRowInput,\n type JsonObject,\n} from './dataset-local.js';\n\nexport type DatasetCurationQueueEntityType = 'support' | 'flow' | 'process';\n\nexport type RunDatasetCurationQueueBuildOptions = {\n processesPath: string;\n flowsPath?: string;\n supportPaths?: string[];\n externalFlowRefPaths?: string[];\n outDir: string;\n excludeProcessIds?: string[];\n processLimit?: number;\n};\n\nexport type RunDatasetCurationQueueNextOptions = {\n queueDir: string;\n entityType?: DatasetCurationQueueEntityType;\n taskId?: string;\n};\n\nexport type RunDatasetCurationQueueVerifyOptions = {\n queueDir: string;\n entityType?: DatasetCurationQueueEntityType;\n taskId?: string;\n};\n\nexport type DatasetCurationQueueTask = {\n schema_version: 1;\n entity_type: DatasetCurationQueueEntityType;\n task_id: string;\n entity_id: string;\n version: string;\n lock_key: string;\n depends_on: string[];\n input_rows_file: string;\n work_dir: string;\n checkpoint_file: string;\n run_plan_file: string;\n closure_file: string;\n};\n\ntype DatasetCurationQueueBlocker = {\n schema_version: 1;\n code: string;\n severity: 'blocker';\n entity_type: DatasetCurationQueueEntityType;\n entity_id: string | null;\n version: string | null;\n message: string;\n details?: unknown;\n};\n\nexport type DatasetCurationQueueBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'ready' | 'blocked';\n out_dir: string;\n inputs: {\n processes: string;\n flows: string | null;\n support: string[];\n external_flow_refs: string[];\n };\n counts: {\n support_rows: number;\n flow_rows: number;\n process_rows: number;\n external_flow_refs: number;\n tasks: number;\n blockers: number;\n };\n hashes: {\n inputs: Record<string, string>;\n task_order: string;\n };\n files: {\n manifest: string;\n tasks: string;\n locks: string;\n blockers: string;\n };\n tasks: DatasetCurationQueueTask[];\n blockers: DatasetCurationQueueBlocker[];\n};\n\nexport type DatasetCurationQueueTaskRuntimeStatus =\n | 'complete'\n | 'pending'\n | 'waiting_dependencies'\n | 'blocked';\n\nexport type DatasetCurationQueueTaskState = {\n task_id: string;\n entity_type: DatasetCurationQueueEntityType;\n entity_id: string;\n version: string;\n status: DatasetCurationQueueTaskRuntimeStatus;\n checkpoint_status: string | null;\n checkpoint_file: string;\n depends_on: string[];\n incomplete_dependencies: string[];\n reason: string | null;\n};\n\nexport type DatasetCurationQueueNextReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'ready' | 'complete' | 'blocked';\n queue_dir: string;\n scope: {\n entity_type: DatasetCurationQueueEntityType | null;\n task_id: string | null;\n };\n counts: {\n total: number;\n complete: number;\n pending: number;\n waiting_dependencies: number;\n blocked: number;\n runnable: number;\n };\n next_task:\n | (DatasetCurationQueueTask & {\n action: {\n kind: 'entity_curation_task';\n input_artifact: string;\n output_artifacts: string[];\n };\n })\n | null;\n task_states: DatasetCurationQueueTaskState[];\n blockers: DatasetCurationQueueBlocker[];\n};\n\nexport type DatasetCurationQueueVerifyReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'passed' | 'blocked';\n queue_dir: string;\n scope: {\n entity_type: DatasetCurationQueueEntityType | null;\n task_id: string | null;\n };\n counts: {\n total: number;\n complete: number;\n pending: number;\n waiting_dependencies: number;\n blocked: number;\n };\n task_states: DatasetCurationQueueTaskState[];\n blockers: DatasetCurationQueueBlocker[];\n};\n\ntype QueueRow = {\n entityType: DatasetCurationQueueEntityType;\n sourcePath: string;\n sourceIndex: number;\n row: JsonObject;\n payload: JsonObject;\n id: string;\n version: string;\n};\n\ntype FlowRef = {\n id: string;\n version: string | null;\n path: string;\n};\n\ntype DeferredFlowRef = FlowRef & {\n actionItemCode: string | null;\n reason: string | null;\n};\n\nconst DEFAULT_VERSION = 'unversioned';\n\nexport async function runDatasetCurationQueueBuild(\n options: RunDatasetCurationQueueBuildOptions,\n): Promise<DatasetCurationQueueBuildReport> {\n const outDir = requirePath(options.outDir, '--out-dir');\n const processesPath = requireExistingPath(options.processesPath, '--processes');\n const flowsPath = options.flowsPath ? requireExistingPath(options.flowsPath, '--flows') : null;\n const supportPaths = (options.supportPaths ?? []).map((inputPath) =>\n requireExistingPath(inputPath, '--support'),\n );\n const externalFlowRefPaths = (options.externalFlowRefPaths ?? []).map((inputPath) =>\n requireExistingPath(inputPath, '--external-flow-ref'),\n );\n const processLimit = normalizeProcessLimit(options.processLimit);\n const excludedProcessIds = new Set((options.excludeProcessIds ?? []).map((id) => id.trim()));\n\n const supportRows = supportPaths.flatMap((inputPath) => readQueueRows(inputPath, 'support'));\n const flowRows = flowsPath ? readQueueRows(flowsPath, 'flow') : [];\n const processRows = readQueueRows(processesPath, 'process')\n .filter((row) => !excludedProcessIds.has(row.id))\n .slice(0, processLimit ?? undefined);\n const externalFlowRefs = externalFlowRefPaths.flatMap((inputPath) =>\n readExternalFlowRefs(inputPath),\n );\n\n mkdirSync(outDir, { recursive: true });\n\n const localFlowTasks = new Map<string, string>();\n const flowRowsById = new Map<string, QueueRow>();\n for (const row of flowRows) {\n const taskId = taskIdFor(row.entityType, row.id, row.version);\n localFlowTasks.set(row.id, taskId);\n flowRowsById.set(row.id, row);\n }\n\n const externalFlowIds = new Set(externalFlowRefs.map((ref) => ref.id));\n const blockers: DatasetCurationQueueBlocker[] = [];\n const supportTasks = supportRows.map((row) => buildTask(outDir, row, []));\n const flowTasks = flowRows.map((row) => buildTask(outDir, row, []));\n const processTasks = processRows.map((row) => {\n const refs = extractProcessFlowRefs(row.payload);\n const deferredRefs = extractDeferredProcessFlowRefs(row.payload);\n const deferredRefKeys = deferredProcessFlowRefKeys(deferredRefs);\n const dependsOn = new Set<string>();\n const missingRefs: FlowRef[] = [];\n for (const ref of refs) {\n const taskId = localFlowTasks.get(ref.id);\n if (taskId) {\n dependsOn.add(taskId);\n } else if (!externalFlowIds.has(ref.id) && !deferredRefKeys.has(flowRefKey(ref))) {\n missingRefs.push(ref);\n }\n }\n if (missingRefs.length > 0) {\n blockers.push({\n schema_version: 1,\n code: 'process_flow_reference_unresolved',\n severity: 'blocker',\n entity_type: 'process',\n entity_id: row.id,\n version: row.version,\n message:\n 'Process references flows that are neither present in local flow rows nor declared as external flow refs.',\n details: { missing_flow_refs: missingRefs },\n });\n }\n return buildTask(outDir, row, [...dependsOn].sort());\n });\n const tasks = [...supportTasks, ...flowTasks, ...processTasks];\n const taskRows = [\n ...supportRows.map((row, index) => ({ row, task: supportTasks[index] })),\n ...flowRows.map((row, index) => ({ row, task: flowTasks[index] })),\n ...processRows.map((row, index) => ({ row, task: processTasks[index] })),\n ];\n\n for (const { row, task } of taskRows) {\n writeEntityArtifacts({\n row,\n task,\n flowRefs: row.entityType === 'process' ? extractProcessFlowRefs(row.payload) : [],\n deferredFlowRefs:\n row.entityType === 'process' ? extractDeferredProcessFlowRefs(row.payload) : [],\n externalFlowIds,\n flowRowsById,\n });\n }\n\n const outputsDir = path.join(outDir, 'outputs');\n mkdirSync(outputsDir, { recursive: true });\n const manifestPath = path.join(outputsDir, 'curation-queue-manifest.json');\n const tasksPath = path.join(outputsDir, 'curation-queue-tasks.jsonl');\n const locksPath = path.join(outputsDir, 'curation-queue-locks.json');\n const blockersPath = path.join(outputsDir, 'curation-queue-blockers.jsonl');\n const inputHashes = buildInputHashes([\n processesPath,\n ...(flowsPath ? [flowsPath] : []),\n ...supportPaths,\n ...externalFlowRefPaths,\n ]);\n const locks = {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n locks: tasks.map((task) => ({\n lock_key: task.lock_key,\n task_id: task.task_id,\n entity_type: task.entity_type,\n entity_id: task.entity_id,\n version: task.version,\n status: 'available',\n })),\n };\n const report: DatasetCurationQueueBuildReport = {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n status: blockers.length > 0 ? 'blocked' : 'ready',\n out_dir: path.resolve(outDir),\n inputs: {\n processes: path.resolve(processesPath),\n flows: flowsPath ? path.resolve(flowsPath) : null,\n support: supportPaths.map((inputPath) => path.resolve(inputPath)),\n external_flow_refs: externalFlowRefPaths.map((inputPath) => path.resolve(inputPath)),\n },\n counts: {\n support_rows: supportRows.length,\n flow_rows: flowRows.length,\n process_rows: processRows.length,\n external_flow_refs: externalFlowRefs.length,\n tasks: tasks.length,\n blockers: blockers.length,\n },\n hashes: {\n inputs: inputHashes,\n task_order: sha256(tasks.map((task) => task.task_id).join('\\n')),\n },\n files: {\n manifest: manifestPath,\n tasks: tasksPath,\n locks: locksPath,\n blockers: blockersPath,\n },\n tasks,\n blockers,\n };\n\n writeJson(manifestPath, report);\n writeText(tasksPath, jsonLines(tasks));\n writeJson(locksPath, locks);\n writeText(blockersPath, jsonLines(blockers));\n return report;\n}\n\nexport async function runDatasetCurationQueueNext(\n options: RunDatasetCurationQueueNextOptions,\n): Promise<DatasetCurationQueueNextReport> {\n const queue = readQueueRuntime(options.queueDir);\n const scope = normalizeQueueScope(options);\n const taskStates = buildTaskStates(queue.tasks).filter((state) => taskMatchesScope(state, scope));\n const scopedTasks = queue.tasks.filter((task) => taskMatchesScope(task, scope));\n const stateByTaskId = new Map(taskStates.map((state) => [state.task_id, state]));\n const runnable = scopedTasks.filter(\n (task) => stateByTaskId.get(task.task_id)?.status === 'pending',\n );\n const counts = countTaskStates(taskStates);\n const status =\n queue.blockers.length > 0 ||\n (taskStates.length > 0 && runnable.length === 0 && counts.complete < taskStates.length)\n ? 'blocked'\n : counts.complete === taskStates.length\n ? 'complete'\n : 'ready';\n const nextTask = status === 'ready' && runnable[0] ? withQueueAction(runnable[0]) : null;\n return {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n status,\n queue_dir: queue.queueDir,\n scope,\n counts: {\n ...counts,\n runnable: runnable.length,\n },\n next_task: nextTask,\n task_states: taskStates,\n blockers: queue.blockers,\n };\n}\n\nexport async function runDatasetCurationQueueVerify(\n options: RunDatasetCurationQueueVerifyOptions,\n): Promise<DatasetCurationQueueVerifyReport> {\n const queue = readQueueRuntime(options.queueDir);\n const scope = normalizeQueueScope(options);\n const taskStates = buildTaskStates(queue.tasks).filter((state) => taskMatchesScope(state, scope));\n const counts = countTaskStates(taskStates);\n return {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n status:\n queue.blockers.length === 0 && counts.complete === taskStates.length ? 'passed' : 'blocked',\n queue_dir: queue.queueDir,\n scope,\n counts,\n task_states: taskStates,\n blockers: queue.blockers,\n };\n}\n\nfunction readQueueRuntime(queueDirInput: string): {\n queueDir: string;\n tasks: DatasetCurationQueueTask[];\n blockers: DatasetCurationQueueBlocker[];\n} {\n const queueDir = requireExistingPath(queueDirInput, '--queue-dir');\n const outputsDir = path.join(queueDir, 'outputs');\n const tasksPath = path.join(outputsDir, 'curation-queue-tasks.jsonl');\n const blockersPath = path.join(outputsDir, 'curation-queue-blockers.jsonl');\n if (!existsSync(tasksPath)) {\n throw new CliError(`curation queue tasks file does not exist: ${tasksPath}`, {\n code: 'CURATION_QUEUE_TASKS_NOT_FOUND',\n exitCode: 2,\n });\n }\n if (!existsSync(blockersPath)) {\n throw new CliError(`curation queue blockers file does not exist: ${blockersPath}`, {\n code: 'CURATION_QUEUE_BLOCKERS_NOT_FOUND',\n exitCode: 2,\n });\n }\n return {\n queueDir: path.resolve(queueDir),\n tasks: readJsonlFile(tasksPath).map((value, index) => parseQueueTask(value, tasksPath, index)),\n blockers: readJsonlFile(blockersPath).map((value, index) =>\n parseQueueBlocker(value, blockersPath, index),\n ),\n };\n}\n\nfunction normalizeQueueScope(options: {\n entityType?: DatasetCurationQueueEntityType;\n taskId?: string;\n}): { entity_type: DatasetCurationQueueEntityType | null; task_id: string | null } {\n return {\n entity_type: options.entityType ?? null,\n task_id: options.taskId?.trim() || null,\n };\n}\n\nfunction buildTaskStates(tasks: DatasetCurationQueueTask[]): DatasetCurationQueueTaskState[] {\n const completeTaskIds = new Set(\n tasks\n .filter((task) => isCompleteCheckpointStatus(readCheckpointStatus(task.checkpoint_file)))\n .map((task) => task.task_id),\n );\n return tasks.map((task) => {\n const checkpointStatus = readCheckpointStatus(task.checkpoint_file);\n const incompleteDependencies = task.depends_on.filter((taskId) => !completeTaskIds.has(taskId));\n const status = taskRuntimeStatus(checkpointStatus, incompleteDependencies);\n return {\n task_id: task.task_id,\n entity_type: task.entity_type,\n entity_id: task.entity_id,\n version: task.version,\n status,\n checkpoint_status: checkpointStatus,\n checkpoint_file: task.checkpoint_file,\n depends_on: task.depends_on,\n incomplete_dependencies: incompleteDependencies,\n reason:\n status === 'waiting_dependencies'\n ? 'dependency checkpoints are not complete'\n : status === 'blocked'\n ? 'checkpoint status is blocked or failed'\n : null,\n };\n });\n}\n\nfunction taskRuntimeStatus(\n checkpointStatus: string | null,\n incompleteDependencies: string[],\n): DatasetCurationQueueTaskRuntimeStatus {\n if (isCompleteCheckpointStatus(checkpointStatus)) {\n return 'complete';\n }\n if (checkpointStatus === 'blocked' || checkpointStatus === 'failed') {\n return 'blocked';\n }\n if (incompleteDependencies.length > 0) {\n return 'waiting_dependencies';\n }\n return 'pending';\n}\n\nfunction isCompleteCheckpointStatus(status: string | null): boolean {\n return (\n status === 'passed' || status === 'complete' || status === 'completed' || status === 'waived'\n );\n}\n\nfunction readCheckpointStatus(checkpointFile: string): string | null {\n const resolvedPath = path.resolve(checkpointFile);\n if (!existsSync(resolvedPath)) {\n return null;\n }\n try {\n const value = JSON.parse(readFileSync(resolvedPath, 'utf8')) as unknown;\n if (!isRecord(value)) {\n return 'blocked';\n }\n const status = firstNonEmpty(value.status, value.state);\n return status ? status.toLowerCase() : 'blocked';\n } catch {\n return 'blocked';\n }\n}\n\nfunction taskMatchesScope(\n task: Pick<DatasetCurationQueueTask, 'entity_type' | 'task_id'>,\n scope: { entity_type: DatasetCurationQueueEntityType | null; task_id: string | null },\n): boolean {\n if (scope.entity_type && task.entity_type !== scope.entity_type) {\n return false;\n }\n if (scope.task_id && task.task_id !== scope.task_id) {\n return false;\n }\n return true;\n}\n\nfunction countTaskStates(taskStates: DatasetCurationQueueTaskState[]): {\n total: number;\n complete: number;\n pending: number;\n waiting_dependencies: number;\n blocked: number;\n} {\n return {\n total: taskStates.length,\n complete: taskStates.filter((state) => state.status === 'complete').length,\n pending: taskStates.filter((state) => state.status === 'pending').length,\n waiting_dependencies: taskStates.filter((state) => state.status === 'waiting_dependencies')\n .length,\n blocked: taskStates.filter((state) => state.status === 'blocked').length,\n };\n}\n\nfunction withQueueAction(task: DatasetCurationQueueTask): DatasetCurationQueueTask & {\n action: {\n kind: 'entity_curation_task';\n input_artifact: string;\n output_artifacts: string[];\n };\n} {\n return {\n ...task,\n action: {\n kind: 'entity_curation_task',\n input_artifact: task.input_rows_file,\n output_artifacts: [task.checkpoint_file],\n },\n };\n}\n\nfunction readJsonlFile(inputPath: string): unknown[] {\n const text = readFileSync(inputPath, 'utf8').trim();\n if (!text) {\n return [];\n }\n return text.split(/\\r?\\n/u).map((line, index) => {\n try {\n return JSON.parse(line) as unknown;\n } catch (error) {\n throw new CliError(`Invalid JSONL in ${inputPath} at line ${index + 1}: ${String(error)}`, {\n code: 'CURATION_QUEUE_JSONL_INVALID',\n exitCode: 2,\n });\n }\n });\n}\n\nfunction parseQueueTask(\n value: unknown,\n inputPath: string,\n index: number,\n): DatasetCurationQueueTask {\n if (!isRecord(value)) {\n throw new CliError(`Invalid queue task in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_TASK_INVALID',\n exitCode: 2,\n });\n }\n const entityType = value.entity_type;\n if (entityType !== 'support' && entityType !== 'flow' && entityType !== 'process') {\n throw new CliError(`Invalid queue task entity_type in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_TASK_INVALID',\n exitCode: 2,\n });\n }\n return {\n schema_version: 1,\n entity_type: entityType,\n task_id: requireString(value.task_id, inputPath, index, 'task_id'),\n entity_id: requireString(value.entity_id, inputPath, index, 'entity_id'),\n version: requireString(value.version, inputPath, index, 'version'),\n lock_key: requireString(value.lock_key, inputPath, index, 'lock_key'),\n depends_on: Array.isArray(value.depends_on)\n ? value.depends_on.filter((item): item is string => typeof item === 'string')\n : [],\n input_rows_file: requireString(value.input_rows_file, inputPath, index, 'input_rows_file'),\n work_dir: requireString(value.work_dir, inputPath, index, 'work_dir'),\n checkpoint_file: requireString(value.checkpoint_file, inputPath, index, 'checkpoint_file'),\n run_plan_file: requireString(value.run_plan_file, inputPath, index, 'run_plan_file'),\n closure_file: requireString(value.closure_file, inputPath, index, 'closure_file'),\n };\n}\n\nfunction parseQueueBlocker(\n value: unknown,\n inputPath: string,\n index: number,\n): DatasetCurationQueueBlocker {\n if (!isRecord(value)) {\n throw new CliError(`Invalid queue blocker in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_BLOCKER_INVALID',\n exitCode: 2,\n });\n }\n const entityType = value.entity_type;\n if (entityType !== 'support' && entityType !== 'flow' && entityType !== 'process') {\n throw new CliError(`Invalid queue blocker entity_type in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_BLOCKER_INVALID',\n exitCode: 2,\n });\n }\n return {\n schema_version: 1,\n code: requireString(value.code, inputPath, index, 'code'),\n severity: 'blocker',\n entity_type: entityType,\n entity_id: typeof value.entity_id === 'string' ? value.entity_id : null,\n version: typeof value.version === 'string' ? value.version : null,\n message: requireString(value.message, inputPath, index, 'message'),\n details: value.details,\n };\n}\n\nfunction requireString(value: unknown, inputPath: string, index: number, field: string): string {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n throw new CliError(`Invalid or missing ${field} in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_TASK_INVALID',\n exitCode: 2,\n });\n}\n\nfunction readQueueRows(inputPath: string, entityType: DatasetCurationQueueEntityType): QueueRow[] {\n const rows = materializeDatasetRows(inputPath);\n return rows.map((row) => queueRowFromDatasetRow(inputPath, entityType, row));\n}\n\nfunction queueRowFromDatasetRow(\n inputPath: string,\n entityType: DatasetCurationQueueEntityType,\n row: DatasetRowInput,\n): QueueRow {\n const tidasIdentity = genericTidasDatasetIdentity(row.payload);\n const id = firstNonEmpty(row.id, row.row.id, row.row.dataset_id, row.row.uuid, tidasIdentity.id);\n if (!id) {\n throw new CliError(\n `${entityType} row is missing a stable id in ${inputPath} at index ${row.index}.`,\n {\n code: 'CURATION_QUEUE_ROW_ID_MISSING',\n exitCode: 2,\n },\n );\n }\n return {\n entityType,\n sourcePath: inputPath,\n sourceIndex: row.index,\n row: row.row,\n payload: row.payload,\n id,\n version: firstNonEmpty(row.version, row.row.version, tidasIdentity.version) ?? DEFAULT_VERSION,\n };\n}\n\nfunction genericTidasDatasetIdentity(payload: JsonObject): {\n id: string | null;\n version: string | null;\n} {\n const root = genericTidasDatasetRoot(payload);\n const information = Object.values(root).find(\n (value) => isRecord(value) && isRecord(value.dataSetInformation),\n );\n const dataSetInformation =\n isRecord(information) && isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n\n return {\n id: firstNonEmpty(dataSetInformation['common:UUID']),\n version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),\n };\n}\n\nfunction genericTidasDatasetRoot(payload: JsonObject): JsonObject {\n const datasetRoots: JsonObject[] = [];\n for (const [key, value] of Object.entries(payload)) {\n if (key.endsWith('DataSet') && isRecord(value)) {\n datasetRoots.push(value);\n }\n }\n return datasetRoots.length === 1 ? datasetRoots[0] : payload;\n}\n\nfunction buildTask(outDir: string, row: QueueRow, dependsOn: string[]): DatasetCurationQueueTask {\n const taskId = taskIdFor(row.entityType, row.id, row.version);\n const workDir = path.join(\n outDir,\n 'entities',\n entityDirPlural(row.entityType),\n entityDirName(row.id, row.version),\n );\n return {\n schema_version: 1,\n entity_type: row.entityType,\n task_id: taskId,\n entity_id: row.id,\n version: row.version,\n lock_key: taskId,\n depends_on: dependsOn,\n input_rows_file: path.join(workDir, 'input.jsonl'),\n work_dir: workDir,\n checkpoint_file: path.join(workDir, 'checkpoint.json'),\n run_plan_file: path.join(workDir, 'entity-run-plan.json'),\n closure_file: path.join(workDir, 'closure.json'),\n };\n}\n\nfunction writeEntityArtifacts(options: {\n row: QueueRow;\n task: DatasetCurationQueueTask;\n flowRefs: FlowRef[];\n deferredFlowRefs: DeferredFlowRef[];\n externalFlowIds: Set<string>;\n flowRowsById: Map<string, QueueRow>;\n}): void {\n mkdirSync(path.join(options.task.work_dir, 'checkpoints'), { recursive: true });\n writeText(options.task.input_rows_file, jsonLines([options.row.row]));\n writeJson(options.task.closure_file, {\n schema_version: 1,\n entity_type: options.row.entityType,\n entity_id: options.row.id,\n version: options.row.version,\n source: {\n file: path.resolve(options.row.sourcePath),\n index: options.row.sourceIndex,\n },\n dependencies: buildDependencyClosure(options),\n });\n writeJson(options.task.run_plan_file, buildRunPlan(options.task));\n}\n\nfunction buildDependencyClosure(options: {\n row: QueueRow;\n task: DatasetCurationQueueTask;\n flowRefs: FlowRef[];\n deferredFlowRefs: DeferredFlowRef[];\n externalFlowIds: Set<string>;\n flowRowsById: Map<string, QueueRow>;\n}): unknown {\n if (options.row.entityType !== 'process') {\n return {\n local_tasks: [],\n external_refs: [],\n deferred_refs: [],\n unresolved_refs: [],\n };\n }\n const deferredRefKeys = deferredProcessFlowRefKeys(options.deferredFlowRefs);\n return {\n local_tasks: options.flowRefs\n .map((ref) => ({ ref, row: options.flowRowsById.get(ref.id) }))\n .filter((item): item is { ref: FlowRef; row: QueueRow } => Boolean(item.row))\n .map(({ ref, row }) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: row.version,\n task_id: taskIdFor('flow', ref.id, row.version),\n ref_path: ref.path,\n })),\n external_refs: options.flowRefs\n .filter((ref) => !options.flowRowsById.has(ref.id) && options.externalFlowIds.has(ref.id))\n .map((ref) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: ref.version,\n ref_path: ref.path,\n })),\n deferred_refs: options.flowRefs\n .filter(\n (ref) =>\n !options.flowRowsById.has(ref.id) &&\n !options.externalFlowIds.has(ref.id) &&\n deferredRefKeys.has(flowRefKey(ref)),\n )\n .map((ref) => {\n const deferredRef = deferredRefKeys.get(flowRefKey(ref))!;\n return {\n entity_type: 'flow',\n entity_id: ref.id,\n version: ref.version,\n ref_path: ref.path,\n action_item_code: deferredRef.actionItemCode,\n reason: deferredRef.reason ?? null,\n };\n }),\n unresolved_refs: options.flowRefs\n .filter(\n (ref) =>\n !options.flowRowsById.has(ref.id) &&\n !options.externalFlowIds.has(ref.id) &&\n !deferredRefKeys.has(flowRefKey(ref)),\n )\n .map((ref) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: ref.version,\n ref_path: ref.path,\n })),\n };\n}\n\nfunction buildRunPlan(task: DatasetCurationQueueTask): unknown {\n const stagesByType: Record<DatasetCurationQueueEntityType, string[]> = {\n support: ['identity', 'schema', 'qa_or_profile', 'checkpoint'],\n flow: ['identity', 'name_plan', 'schema', 'qa', 'checkpoint'],\n process: [\n 'dependency_closure',\n 'reference_refresh',\n 'required_fields',\n 'schema',\n 'qa',\n 'curation',\n 'remote_dry_run',\n 'readback',\n ],\n };\n return {\n schema_version: 1,\n task_id: task.task_id,\n entity_type: task.entity_type,\n entity_id: task.entity_id,\n version: task.version,\n input_rows_file: task.input_rows_file,\n checkpoint_file: task.checkpoint_file,\n stages: stagesByType[task.entity_type].map((stage) => ({\n id: stage,\n status: 'pending',\n checkpoint_file: path.join(task.work_dir, 'checkpoints', `${stage}.json`),\n })),\n ai_authoring_policy: {\n output_only: 'structured_patch_or_build_plan',\n deterministic_apply_required: true,\n remote_write_allowed: false,\n },\n };\n}\n\nfunction extractDeferredProcessFlowRefs(payload: unknown): DeferredFlowRef[] {\n const refs = new Map<string, DeferredFlowRef>();\n scanForDeferredProcessFlowRefs(payload, refs);\n return [...refs.values()].sort((a, b) =>\n `${a.id}@${a.version ?? ''}@${a.path}`.localeCompare(`${b.id}@${b.version ?? ''}@${b.path}`),\n );\n}\n\nfunction scanForDeferredProcessFlowRefs(value: unknown, refs: Map<string, DeferredFlowRef>): void {\n if (Array.isArray(value)) {\n value.forEach((item) => scanForDeferredProcessFlowRefs(item, refs));\n return;\n }\n if (!isRecord(value)) {\n return;\n }\n\n const traces = asList(value['tiangongfoundry:unresolvedTrace']);\n for (const trace of traces) {\n if (!isRecord(trace)) {\n continue;\n }\n const actionItemCode = firstNonEmpty(trace.action_item_code, trace.actionItemCode);\n if (actionItemCode !== 'elementary_flow_identity_manual_review') {\n continue;\n }\n const id = firstNonEmpty(trace.reference_id, trace.referenceId, trace.ref_object_id);\n const pathValue = firstNonEmpty(trace.blocked_path, trace.blockedPath, trace.path);\n if (!id || !pathValue) {\n continue;\n }\n const version = firstNonEmpty(trace.reference_version, trace.referenceVersion, trace.version);\n const ref = {\n id,\n version,\n path: normalizeReferencePath(pathValue),\n actionItemCode,\n reason: firstNonEmpty(trace.reason),\n };\n refs.set(flowRefKey(ref), ref);\n }\n\n for (const nested of Object.values(value)) {\n scanForDeferredProcessFlowRefs(nested, refs);\n }\n}\n\nfunction deferredProcessFlowRefKeys(refs: DeferredFlowRef[]): Map<string, DeferredFlowRef> {\n const keys = new Map<string, DeferredFlowRef>();\n for (const ref of refs) {\n keys.set(flowRefKey(ref), ref);\n }\n return keys;\n}\n\nfunction flowRefKey(ref: FlowRef): string {\n return `${ref.id}@${ref.version ?? ''}@${normalizeReferencePath(ref.path)}`;\n}\n\nfunction normalizeReferencePath(value: string): string {\n return value\n .replace(/^\\/+/u, '')\n .replace(/\\/+/gu, '.')\n .replace(/^\\.+|\\.+$/gu, '');\n}\n\nfunction isFoundryTracePathParts(pathParts: string[]): boolean {\n return (\n pathParts.includes('common:other') &&\n pathParts.some(\n (part) => part.startsWith('tiangongfoundry:') && part.toLowerCase().includes('trace'),\n )\n );\n}\n\nfunction extractProcessFlowRefs(payload: unknown): FlowRef[] {\n const refs = new Map<string, FlowRef>();\n scanForFlowRefs(payload, [], refs);\n return [...refs.values()].sort((a, b) =>\n `${a.id}@${a.version ?? ''}`.localeCompare(`${b.id}@${b.version ?? ''}`),\n );\n}\n\nfunction scanForFlowRefs(value: unknown, pathParts: string[], refs: Map<string, FlowRef>): void {\n if (isFoundryTracePathParts(pathParts)) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => scanForFlowRefs(item, [...pathParts, String(index)], refs));\n return;\n }\n if (!isRecord(value)) {\n return;\n }\n\n const keyPath = pathParts.join('.');\n const keyHint = keyPath.toLowerCase();\n const looksLikeFlowRef =\n keyHint.includes('referencetoflowdataset') ||\n keyHint.includes('reference_to_flow_dataset') ||\n keyHint.includes('flowdataset') ||\n keyHint.includes('flow_dataset');\n if (looksLikeFlowRef) {\n const id = firstNonEmpty(\n value['@refObjectId'],\n value.refObjectId,\n value.ref_object_id,\n value.id,\n value.uuid,\n value['common:UUID'],\n );\n if (id) {\n const version = firstNonEmpty(\n value['@version'],\n value.version,\n value.dataSetVersion,\n value['common:dataSetVersion'],\n );\n refs.set(`${id}@${version ?? ''}@${keyPath}`, {\n id,\n version,\n path: keyPath,\n });\n }\n }\n\n for (const [key, nested] of Object.entries(value)) {\n scanForFlowRefs(nested, [...pathParts, key], refs);\n }\n}\n\nfunction readExternalFlowRefs(inputPath: string): FlowRef[] {\n const rows = materializeDatasetRows(inputPath);\n return rows.map((row) => {\n const id = firstNonEmpty(row.id, row.row.id, row.row.dataset_id, row.row.uuid);\n if (!id) {\n throw new CliError(`External flow ref is missing id in ${inputPath} at index ${row.index}.`, {\n code: 'CURATION_QUEUE_EXTERNAL_FLOW_REF_ID_MISSING',\n exitCode: 2,\n });\n }\n return {\n id,\n version: firstNonEmpty(row.version, row.row.version) ?? null,\n path: `${inputPath}#${row.index}`,\n };\n });\n}\n\nfunction asList(value: unknown): unknown[] {\n if (value === undefined || value === null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n\nfunction normalizeProcessLimit(value: number | undefined): number | null {\n if (value === undefined) {\n return null;\n }\n if (!Number.isInteger(value) || value < 1) {\n throw new CliError('--process-limit must be a positive integer.', {\n code: 'CURATION_QUEUE_PROCESS_LIMIT_INVALID',\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction requirePath(value: string | undefined, flag: string): string {\n const trimmed = value?.trim();\n if (!trimmed) {\n throw new CliError(`${flag} is required.`, {\n code: 'CURATION_QUEUE_REQUIRED_FLAG_MISSING',\n exitCode: 2,\n });\n }\n return trimmed;\n}\n\nfunction requireExistingPath(value: string | undefined, flag: string): string {\n const inputPath = requirePath(value, flag);\n if (!existsSync(inputPath)) {\n throw new CliError(`${flag} file does not exist: ${inputPath}`, {\n code: 'CURATION_QUEUE_INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n return inputPath;\n}\n\nfunction entityDirPlural(entityType: DatasetCurationQueueEntityType): string {\n return entityType === 'process' ? 'processes' : entityType === 'flow' ? 'flows' : 'supports';\n}\n\nfunction entityDirName(id: string, version: string): string {\n return `${sanitizePathToken(id)}__${sanitizePathToken(version)}`;\n}\n\nfunction taskIdFor(\n entityType: DatasetCurationQueueEntityType,\n id: string,\n version: string,\n): string {\n return `${entityType}:${id}@${version}`;\n}\n\nfunction sanitizePathToken(value: string): string {\n return value.replace(/[^A-Za-z0-9._-]+/gu, '_').replace(/^_+|_+$/gu, '') || 'unknown';\n}\n\nfunction buildInputHashes(inputPaths: string[]): Record<string, string> {\n const hashes: Record<string, string> = {};\n for (const inputPath of inputPaths) {\n hashes[path.resolve(inputPath)] = sha256(readFileSync(inputPath));\n }\n return hashes;\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction writeJson(filePath: string, value: unknown): void {\n mkdirSync(path.dirname(filePath), { recursive: true });\n writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n}\n\nfunction writeText(filePath: string, value: string): void {\n mkdirSync(path.dirname(filePath), { recursive: true });\n writeFileSync(filePath, value, 'utf8');\n}\n\nfunction jsonLines(rows: unknown[]): string {\n return rows.map((row) => JSON.stringify(row)).join('\\n') + (rows.length > 0 ? '\\n' : '');\n}\n\nexport const __testInternals = {\n buildTaskStates,\n countTaskStates,\n entityDirName,\n entityDirPlural,\n extractDeferredProcessFlowRefs,\n extractProcessFlowRefs,\n jsonLines,\n normalizeReferencePath,\n normalizeProcessLimit,\n normalizeQueueScope,\n parseQueueBlocker,\n parseQueueTask,\n readCheckpointStatus,\n readJsonlFile,\n readQueueRuntime,\n requireExistingPath,\n requirePath,\n sanitizePathToken,\n taskIdFor,\n taskMatchesScope,\n taskRuntimeStatus,\n withQueueAction,\n};\n"]}
1
+ {"version":3,"file":"dataset-curation-queue.js","sourceRoot":"","sources":["../../../src/lib/dataset-curation-queue.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\nimport {\n firstNonEmpty,\n isRecord,\n materializeDatasetRows,\n type DatasetRowInput,\n type JsonObject,\n} from './dataset-local.js';\n\nexport type DatasetCurationQueueEntityType = 'support' | 'flow' | 'process';\n\nexport type RunDatasetCurationQueueBuildOptions = {\n processesPath: string;\n flowsPath?: string;\n supportPaths?: string[];\n externalFlowRefPaths?: string[];\n outDir: string;\n excludeProcessIds?: string[];\n processLimit?: number;\n};\n\nexport type RunDatasetCurationQueueNextOptions = {\n queueDir: string;\n entityType?: DatasetCurationQueueEntityType;\n taskId?: string;\n};\n\nexport type RunDatasetCurationQueueVerifyOptions = {\n queueDir: string;\n entityType?: DatasetCurationQueueEntityType;\n taskId?: string;\n};\n\nexport type DatasetCurationQueueTask = {\n schema_version: 1;\n entity_type: DatasetCurationQueueEntityType;\n task_id: string;\n entity_id: string;\n version: string;\n lock_key: string;\n depends_on: string[];\n input_rows_file: string;\n work_dir: string;\n checkpoint_file: string;\n run_plan_file: string;\n closure_file: string;\n};\n\ntype DatasetCurationQueueBlocker = {\n schema_version: 1;\n code: string;\n severity: 'blocker';\n entity_type: DatasetCurationQueueEntityType;\n entity_id: string | null;\n version: string | null;\n message: string;\n details?: unknown;\n};\n\nexport type DatasetCurationQueueBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'ready' | 'blocked';\n out_dir: string;\n inputs: {\n processes: string;\n flows: string | null;\n support: string[];\n external_flow_refs: string[];\n };\n counts: {\n support_rows: number;\n flow_rows: number;\n process_rows: number;\n external_flow_refs: number;\n tasks: number;\n blockers: number;\n };\n hashes: {\n inputs: Record<string, string>;\n task_order: string;\n };\n files: {\n manifest: string;\n tasks: string;\n locks: string;\n blockers: string;\n };\n tasks: DatasetCurationQueueTask[];\n blockers: DatasetCurationQueueBlocker[];\n};\n\nexport type DatasetCurationQueueTaskRuntimeStatus =\n 'complete' | 'pending' | 'waiting_dependencies' | 'blocked';\n\nexport type DatasetCurationQueueTaskState = {\n task_id: string;\n entity_type: DatasetCurationQueueEntityType;\n entity_id: string;\n version: string;\n status: DatasetCurationQueueTaskRuntimeStatus;\n checkpoint_status: string | null;\n checkpoint_file: string;\n depends_on: string[];\n incomplete_dependencies: string[];\n reason: string | null;\n};\n\nexport type DatasetCurationQueueNextReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'ready' | 'complete' | 'blocked';\n queue_dir: string;\n scope: {\n entity_type: DatasetCurationQueueEntityType | null;\n task_id: string | null;\n };\n counts: {\n total: number;\n complete: number;\n pending: number;\n waiting_dependencies: number;\n blocked: number;\n runnable: number;\n };\n next_task:\n | (DatasetCurationQueueTask & {\n action: {\n kind: 'entity_curation_task';\n input_artifact: string;\n output_artifacts: string[];\n };\n })\n | null;\n task_states: DatasetCurationQueueTaskState[];\n blockers: DatasetCurationQueueBlocker[];\n};\n\nexport type DatasetCurationQueueVerifyReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'passed' | 'blocked';\n queue_dir: string;\n scope: {\n entity_type: DatasetCurationQueueEntityType | null;\n task_id: string | null;\n };\n counts: {\n total: number;\n complete: number;\n pending: number;\n waiting_dependencies: number;\n blocked: number;\n };\n task_states: DatasetCurationQueueTaskState[];\n blockers: DatasetCurationQueueBlocker[];\n};\n\ntype QueueRow = {\n entityType: DatasetCurationQueueEntityType;\n sourcePath: string;\n sourceIndex: number;\n row: JsonObject;\n payload: JsonObject;\n id: string;\n version: string;\n};\n\ntype FlowRef = {\n id: string;\n version: string | null;\n path: string;\n};\n\ntype DeferredFlowRef = FlowRef & {\n actionItemCode: string | null;\n reason: string | null;\n};\n\nconst DEFAULT_VERSION = 'unversioned';\n\nexport async function runDatasetCurationQueueBuild(\n options: RunDatasetCurationQueueBuildOptions,\n): Promise<DatasetCurationQueueBuildReport> {\n const outDir = requirePath(options.outDir, '--out-dir');\n const processesPath = requireExistingPath(options.processesPath, '--processes');\n const flowsPath = options.flowsPath ? requireExistingPath(options.flowsPath, '--flows') : null;\n const supportPaths = (options.supportPaths ?? []).map((inputPath) =>\n requireExistingPath(inputPath, '--support'),\n );\n const externalFlowRefPaths = (options.externalFlowRefPaths ?? []).map((inputPath) =>\n requireExistingPath(inputPath, '--external-flow-ref'),\n );\n const processLimit = normalizeProcessLimit(options.processLimit);\n const excludedProcessIds = new Set((options.excludeProcessIds ?? []).map((id) => id.trim()));\n\n const supportRows = supportPaths.flatMap((inputPath) => readQueueRows(inputPath, 'support'));\n const flowRows = flowsPath ? readQueueRows(flowsPath, 'flow') : [];\n const processRows = readQueueRows(processesPath, 'process')\n .filter((row) => !excludedProcessIds.has(row.id))\n .slice(0, processLimit ?? undefined);\n const externalFlowRefs = externalFlowRefPaths.flatMap((inputPath) =>\n readExternalFlowRefs(inputPath),\n );\n\n mkdirSync(outDir, { recursive: true });\n\n const localFlowTasks = new Map<string, string>();\n const flowRowsById = new Map<string, QueueRow>();\n for (const row of flowRows) {\n const taskId = taskIdFor(row.entityType, row.id, row.version);\n localFlowTasks.set(row.id, taskId);\n flowRowsById.set(row.id, row);\n }\n\n const externalFlowIds = new Set(externalFlowRefs.map((ref) => ref.id));\n const blockers: DatasetCurationQueueBlocker[] = [];\n const supportTasks = supportRows.map((row) => buildTask(outDir, row, []));\n const flowTasks = flowRows.map((row) => buildTask(outDir, row, []));\n const processTasks = processRows.map((row) => {\n const refs = extractProcessFlowRefs(row.payload);\n const deferredRefs = extractDeferredProcessFlowRefs(row.payload);\n const deferredRefKeys = deferredProcessFlowRefKeys(deferredRefs);\n const dependsOn = new Set<string>();\n const missingRefs: FlowRef[] = [];\n for (const ref of refs) {\n const taskId = localFlowTasks.get(ref.id);\n if (taskId) {\n dependsOn.add(taskId);\n } else if (!externalFlowIds.has(ref.id) && !deferredRefKeys.has(flowRefKey(ref))) {\n missingRefs.push(ref);\n }\n }\n if (missingRefs.length > 0) {\n blockers.push({\n schema_version: 1,\n code: 'process_flow_reference_unresolved',\n severity: 'blocker',\n entity_type: 'process',\n entity_id: row.id,\n version: row.version,\n message:\n 'Process references flows that are neither present in local flow rows nor declared as external flow refs.',\n details: { missing_flow_refs: missingRefs },\n });\n }\n return buildTask(outDir, row, [...dependsOn].sort());\n });\n const tasks = [...supportTasks, ...flowTasks, ...processTasks];\n const taskRows = [\n ...supportRows.map((row, index) => ({ row, task: supportTasks[index] })),\n ...flowRows.map((row, index) => ({ row, task: flowTasks[index] })),\n ...processRows.map((row, index) => ({ row, task: processTasks[index] })),\n ];\n\n for (const { row, task } of taskRows) {\n writeEntityArtifacts({\n row,\n task,\n flowRefs: row.entityType === 'process' ? extractProcessFlowRefs(row.payload) : [],\n deferredFlowRefs:\n row.entityType === 'process' ? extractDeferredProcessFlowRefs(row.payload) : [],\n externalFlowIds,\n flowRowsById,\n });\n }\n\n const outputsDir = path.join(outDir, 'outputs');\n mkdirSync(outputsDir, { recursive: true });\n const manifestPath = path.join(outputsDir, 'curation-queue-manifest.json');\n const tasksPath = path.join(outputsDir, 'curation-queue-tasks.jsonl');\n const locksPath = path.join(outputsDir, 'curation-queue-locks.json');\n const blockersPath = path.join(outputsDir, 'curation-queue-blockers.jsonl');\n const inputHashes = buildInputHashes([\n processesPath,\n ...(flowsPath ? [flowsPath] : []),\n ...supportPaths,\n ...externalFlowRefPaths,\n ]);\n const locks = {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n locks: tasks.map((task) => ({\n lock_key: task.lock_key,\n task_id: task.task_id,\n entity_type: task.entity_type,\n entity_id: task.entity_id,\n version: task.version,\n status: 'available',\n })),\n };\n const report: DatasetCurationQueueBuildReport = {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n status: blockers.length > 0 ? 'blocked' : 'ready',\n out_dir: path.resolve(outDir),\n inputs: {\n processes: path.resolve(processesPath),\n flows: flowsPath ? path.resolve(flowsPath) : null,\n support: supportPaths.map((inputPath) => path.resolve(inputPath)),\n external_flow_refs: externalFlowRefPaths.map((inputPath) => path.resolve(inputPath)),\n },\n counts: {\n support_rows: supportRows.length,\n flow_rows: flowRows.length,\n process_rows: processRows.length,\n external_flow_refs: externalFlowRefs.length,\n tasks: tasks.length,\n blockers: blockers.length,\n },\n hashes: {\n inputs: inputHashes,\n task_order: sha256(tasks.map((task) => task.task_id).join('\\n')),\n },\n files: {\n manifest: manifestPath,\n tasks: tasksPath,\n locks: locksPath,\n blockers: blockersPath,\n },\n tasks,\n blockers,\n };\n\n writeJson(manifestPath, report);\n writeText(tasksPath, jsonLines(tasks));\n writeJson(locksPath, locks);\n writeText(blockersPath, jsonLines(blockers));\n return report;\n}\n\nexport async function runDatasetCurationQueueNext(\n options: RunDatasetCurationQueueNextOptions,\n): Promise<DatasetCurationQueueNextReport> {\n const queue = readQueueRuntime(options.queueDir);\n const scope = normalizeQueueScope(options);\n const taskStates = buildTaskStates(queue.tasks).filter((state) => taskMatchesScope(state, scope));\n const scopedTasks = queue.tasks.filter((task) => taskMatchesScope(task, scope));\n const stateByTaskId = new Map(taskStates.map((state) => [state.task_id, state]));\n const runnable = scopedTasks.filter(\n (task) => stateByTaskId.get(task.task_id)?.status === 'pending',\n );\n const counts = countTaskStates(taskStates);\n const status =\n queue.blockers.length > 0 ||\n (taskStates.length > 0 && runnable.length === 0 && counts.complete < taskStates.length)\n ? 'blocked'\n : counts.complete === taskStates.length\n ? 'complete'\n : 'ready';\n const nextTask = status === 'ready' && runnable[0] ? withQueueAction(runnable[0]) : null;\n return {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n status,\n queue_dir: queue.queueDir,\n scope,\n counts: {\n ...counts,\n runnable: runnable.length,\n },\n next_task: nextTask,\n task_states: taskStates,\n blockers: queue.blockers,\n };\n}\n\nexport async function runDatasetCurationQueueVerify(\n options: RunDatasetCurationQueueVerifyOptions,\n): Promise<DatasetCurationQueueVerifyReport> {\n const queue = readQueueRuntime(options.queueDir);\n const scope = normalizeQueueScope(options);\n const taskStates = buildTaskStates(queue.tasks).filter((state) => taskMatchesScope(state, scope));\n const counts = countTaskStates(taskStates);\n return {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n status:\n queue.blockers.length === 0 && counts.complete === taskStates.length ? 'passed' : 'blocked',\n queue_dir: queue.queueDir,\n scope,\n counts,\n task_states: taskStates,\n blockers: queue.blockers,\n };\n}\n\nfunction readQueueRuntime(queueDirInput: string): {\n queueDir: string;\n tasks: DatasetCurationQueueTask[];\n blockers: DatasetCurationQueueBlocker[];\n} {\n const queueDir = requireExistingPath(queueDirInput, '--queue-dir');\n const outputsDir = path.join(queueDir, 'outputs');\n const tasksPath = path.join(outputsDir, 'curation-queue-tasks.jsonl');\n const blockersPath = path.join(outputsDir, 'curation-queue-blockers.jsonl');\n if (!existsSync(tasksPath)) {\n throw new CliError(`curation queue tasks file does not exist: ${tasksPath}`, {\n code: 'CURATION_QUEUE_TASKS_NOT_FOUND',\n exitCode: 2,\n });\n }\n if (!existsSync(blockersPath)) {\n throw new CliError(`curation queue blockers file does not exist: ${blockersPath}`, {\n code: 'CURATION_QUEUE_BLOCKERS_NOT_FOUND',\n exitCode: 2,\n });\n }\n return {\n queueDir: path.resolve(queueDir),\n tasks: readJsonlFile(tasksPath).map((value, index) => parseQueueTask(value, tasksPath, index)),\n blockers: readJsonlFile(blockersPath).map((value, index) =>\n parseQueueBlocker(value, blockersPath, index),\n ),\n };\n}\n\nfunction normalizeQueueScope(options: {\n entityType?: DatasetCurationQueueEntityType;\n taskId?: string;\n}): { entity_type: DatasetCurationQueueEntityType | null; task_id: string | null } {\n return {\n entity_type: options.entityType ?? null,\n task_id: options.taskId?.trim() || null,\n };\n}\n\nfunction buildTaskStates(tasks: DatasetCurationQueueTask[]): DatasetCurationQueueTaskState[] {\n const completeTaskIds = new Set(\n tasks\n .filter((task) => isCompleteCheckpointStatus(readCheckpointStatus(task.checkpoint_file)))\n .map((task) => task.task_id),\n );\n return tasks.map((task) => {\n const checkpointStatus = readCheckpointStatus(task.checkpoint_file);\n const incompleteDependencies = task.depends_on.filter((taskId) => !completeTaskIds.has(taskId));\n const status = taskRuntimeStatus(checkpointStatus, incompleteDependencies);\n return {\n task_id: task.task_id,\n entity_type: task.entity_type,\n entity_id: task.entity_id,\n version: task.version,\n status,\n checkpoint_status: checkpointStatus,\n checkpoint_file: task.checkpoint_file,\n depends_on: task.depends_on,\n incomplete_dependencies: incompleteDependencies,\n reason:\n status === 'waiting_dependencies'\n ? 'dependency checkpoints are not complete'\n : status === 'blocked'\n ? 'checkpoint status is blocked or failed'\n : null,\n };\n });\n}\n\nfunction taskRuntimeStatus(\n checkpointStatus: string | null,\n incompleteDependencies: string[],\n): DatasetCurationQueueTaskRuntimeStatus {\n if (isCompleteCheckpointStatus(checkpointStatus)) {\n return 'complete';\n }\n if (checkpointStatus === 'blocked' || checkpointStatus === 'failed') {\n return 'blocked';\n }\n if (incompleteDependencies.length > 0) {\n return 'waiting_dependencies';\n }\n return 'pending';\n}\n\nfunction isCompleteCheckpointStatus(status: string | null): boolean {\n return (\n status === 'passed' || status === 'complete' || status === 'completed' || status === 'waived'\n );\n}\n\nfunction readCheckpointStatus(checkpointFile: string): string | null {\n const resolvedPath = path.resolve(checkpointFile);\n if (!existsSync(resolvedPath)) {\n return null;\n }\n try {\n const value = JSON.parse(readFileSync(resolvedPath, 'utf8')) as unknown;\n if (!isRecord(value)) {\n return 'blocked';\n }\n const status = firstNonEmpty(value.status, value.state);\n return status ? status.toLowerCase() : 'blocked';\n } catch {\n return 'blocked';\n }\n}\n\nfunction taskMatchesScope(\n task: Pick<DatasetCurationQueueTask, 'entity_type' | 'task_id'>,\n scope: { entity_type: DatasetCurationQueueEntityType | null; task_id: string | null },\n): boolean {\n if (scope.entity_type && task.entity_type !== scope.entity_type) {\n return false;\n }\n if (scope.task_id && task.task_id !== scope.task_id) {\n return false;\n }\n return true;\n}\n\nfunction countTaskStates(taskStates: DatasetCurationQueueTaskState[]): {\n total: number;\n complete: number;\n pending: number;\n waiting_dependencies: number;\n blocked: number;\n} {\n return {\n total: taskStates.length,\n complete: taskStates.filter((state) => state.status === 'complete').length,\n pending: taskStates.filter((state) => state.status === 'pending').length,\n waiting_dependencies: taskStates.filter((state) => state.status === 'waiting_dependencies')\n .length,\n blocked: taskStates.filter((state) => state.status === 'blocked').length,\n };\n}\n\nfunction withQueueAction(task: DatasetCurationQueueTask): DatasetCurationQueueTask & {\n action: {\n kind: 'entity_curation_task';\n input_artifact: string;\n output_artifacts: string[];\n };\n} {\n return {\n ...task,\n action: {\n kind: 'entity_curation_task',\n input_artifact: task.input_rows_file,\n output_artifacts: [task.checkpoint_file],\n },\n };\n}\n\nfunction readJsonlFile(inputPath: string): unknown[] {\n const text = readFileSync(inputPath, 'utf8').trim();\n if (!text) {\n return [];\n }\n return text.split(/\\r?\\n/u).map((line, index) => {\n try {\n return JSON.parse(line) as unknown;\n } catch (error) {\n throw new CliError(`Invalid JSONL in ${inputPath} at line ${index + 1}: ${String(error)}`, {\n code: 'CURATION_QUEUE_JSONL_INVALID',\n exitCode: 2,\n });\n }\n });\n}\n\nfunction parseQueueTask(\n value: unknown,\n inputPath: string,\n index: number,\n): DatasetCurationQueueTask {\n if (!isRecord(value)) {\n throw new CliError(`Invalid queue task in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_TASK_INVALID',\n exitCode: 2,\n });\n }\n const entityType = value.entity_type;\n if (entityType !== 'support' && entityType !== 'flow' && entityType !== 'process') {\n throw new CliError(`Invalid queue task entity_type in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_TASK_INVALID',\n exitCode: 2,\n });\n }\n return {\n schema_version: 1,\n entity_type: entityType,\n task_id: requireString(value.task_id, inputPath, index, 'task_id'),\n entity_id: requireString(value.entity_id, inputPath, index, 'entity_id'),\n version: requireString(value.version, inputPath, index, 'version'),\n lock_key: requireString(value.lock_key, inputPath, index, 'lock_key'),\n depends_on: Array.isArray(value.depends_on)\n ? value.depends_on.filter((item): item is string => typeof item === 'string')\n : [],\n input_rows_file: requireString(value.input_rows_file, inputPath, index, 'input_rows_file'),\n work_dir: requireString(value.work_dir, inputPath, index, 'work_dir'),\n checkpoint_file: requireString(value.checkpoint_file, inputPath, index, 'checkpoint_file'),\n run_plan_file: requireString(value.run_plan_file, inputPath, index, 'run_plan_file'),\n closure_file: requireString(value.closure_file, inputPath, index, 'closure_file'),\n };\n}\n\nfunction parseQueueBlocker(\n value: unknown,\n inputPath: string,\n index: number,\n): DatasetCurationQueueBlocker {\n if (!isRecord(value)) {\n throw new CliError(`Invalid queue blocker in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_BLOCKER_INVALID',\n exitCode: 2,\n });\n }\n const entityType = value.entity_type;\n if (entityType !== 'support' && entityType !== 'flow' && entityType !== 'process') {\n throw new CliError(`Invalid queue blocker entity_type in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_BLOCKER_INVALID',\n exitCode: 2,\n });\n }\n return {\n schema_version: 1,\n code: requireString(value.code, inputPath, index, 'code'),\n severity: 'blocker',\n entity_type: entityType,\n entity_id: typeof value.entity_id === 'string' ? value.entity_id : null,\n version: typeof value.version === 'string' ? value.version : null,\n message: requireString(value.message, inputPath, index, 'message'),\n details: value.details,\n };\n}\n\nfunction requireString(value: unknown, inputPath: string, index: number, field: string): string {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n throw new CliError(`Invalid or missing ${field} in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_TASK_INVALID',\n exitCode: 2,\n });\n}\n\nfunction readQueueRows(inputPath: string, entityType: DatasetCurationQueueEntityType): QueueRow[] {\n const rows = materializeDatasetRows(inputPath);\n return rows.map((row) => queueRowFromDatasetRow(inputPath, entityType, row));\n}\n\nfunction queueRowFromDatasetRow(\n inputPath: string,\n entityType: DatasetCurationQueueEntityType,\n row: DatasetRowInput,\n): QueueRow {\n const tidasIdentity = genericTidasDatasetIdentity(row.payload);\n const id = firstNonEmpty(row.id, row.row.id, row.row.dataset_id, row.row.uuid, tidasIdentity.id);\n if (!id) {\n throw new CliError(\n `${entityType} row is missing a stable id in ${inputPath} at index ${row.index}.`,\n {\n code: 'CURATION_QUEUE_ROW_ID_MISSING',\n exitCode: 2,\n },\n );\n }\n return {\n entityType,\n sourcePath: inputPath,\n sourceIndex: row.index,\n row: row.row,\n payload: row.payload,\n id,\n version: firstNonEmpty(row.version, row.row.version, tidasIdentity.version) ?? DEFAULT_VERSION,\n };\n}\n\nfunction genericTidasDatasetIdentity(payload: JsonObject): {\n id: string | null;\n version: string | null;\n} {\n const root = genericTidasDatasetRoot(payload);\n const information = Object.values(root).find(\n (value) => isRecord(value) && isRecord(value.dataSetInformation),\n );\n const dataSetInformation =\n isRecord(information) && isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n\n return {\n id: firstNonEmpty(dataSetInformation['common:UUID']),\n version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),\n };\n}\n\nfunction genericTidasDatasetRoot(payload: JsonObject): JsonObject {\n const datasetRoots: JsonObject[] = [];\n for (const [key, value] of Object.entries(payload)) {\n if (key.endsWith('DataSet') && isRecord(value)) {\n datasetRoots.push(value);\n }\n }\n return datasetRoots.length === 1 ? datasetRoots[0] : payload;\n}\n\nfunction buildTask(outDir: string, row: QueueRow, dependsOn: string[]): DatasetCurationQueueTask {\n const taskId = taskIdFor(row.entityType, row.id, row.version);\n const workDir = path.join(\n outDir,\n 'entities',\n entityDirPlural(row.entityType),\n entityDirName(row.id, row.version),\n );\n return {\n schema_version: 1,\n entity_type: row.entityType,\n task_id: taskId,\n entity_id: row.id,\n version: row.version,\n lock_key: taskId,\n depends_on: dependsOn,\n input_rows_file: path.join(workDir, 'input.jsonl'),\n work_dir: workDir,\n checkpoint_file: path.join(workDir, 'checkpoint.json'),\n run_plan_file: path.join(workDir, 'entity-run-plan.json'),\n closure_file: path.join(workDir, 'closure.json'),\n };\n}\n\nfunction writeEntityArtifacts(options: {\n row: QueueRow;\n task: DatasetCurationQueueTask;\n flowRefs: FlowRef[];\n deferredFlowRefs: DeferredFlowRef[];\n externalFlowIds: Set<string>;\n flowRowsById: Map<string, QueueRow>;\n}): void {\n mkdirSync(path.join(options.task.work_dir, 'checkpoints'), { recursive: true });\n writeText(options.task.input_rows_file, jsonLines([options.row.row]));\n writeJson(options.task.closure_file, {\n schema_version: 1,\n entity_type: options.row.entityType,\n entity_id: options.row.id,\n version: options.row.version,\n source: {\n file: path.resolve(options.row.sourcePath),\n index: options.row.sourceIndex,\n },\n dependencies: buildDependencyClosure(options),\n });\n writeJson(options.task.run_plan_file, buildRunPlan(options.task));\n}\n\nfunction buildDependencyClosure(options: {\n row: QueueRow;\n task: DatasetCurationQueueTask;\n flowRefs: FlowRef[];\n deferredFlowRefs: DeferredFlowRef[];\n externalFlowIds: Set<string>;\n flowRowsById: Map<string, QueueRow>;\n}): unknown {\n if (options.row.entityType !== 'process') {\n return {\n local_tasks: [],\n external_refs: [],\n deferred_refs: [],\n unresolved_refs: [],\n };\n }\n const deferredRefKeys = deferredProcessFlowRefKeys(options.deferredFlowRefs);\n return {\n local_tasks: options.flowRefs\n .map((ref) => ({ ref, row: options.flowRowsById.get(ref.id) }))\n .filter((item): item is { ref: FlowRef; row: QueueRow } => Boolean(item.row))\n .map(({ ref, row }) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: row.version,\n task_id: taskIdFor('flow', ref.id, row.version),\n ref_path: ref.path,\n })),\n external_refs: options.flowRefs\n .filter((ref) => !options.flowRowsById.has(ref.id) && options.externalFlowIds.has(ref.id))\n .map((ref) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: ref.version,\n ref_path: ref.path,\n })),\n deferred_refs: options.flowRefs\n .filter(\n (ref) =>\n !options.flowRowsById.has(ref.id) &&\n !options.externalFlowIds.has(ref.id) &&\n deferredRefKeys.has(flowRefKey(ref)),\n )\n .map((ref) => {\n const deferredRef = deferredRefKeys.get(flowRefKey(ref))!;\n return {\n entity_type: 'flow',\n entity_id: ref.id,\n version: ref.version,\n ref_path: ref.path,\n action_item_code: deferredRef.actionItemCode,\n reason: deferredRef.reason ?? null,\n };\n }),\n unresolved_refs: options.flowRefs\n .filter(\n (ref) =>\n !options.flowRowsById.has(ref.id) &&\n !options.externalFlowIds.has(ref.id) &&\n !deferredRefKeys.has(flowRefKey(ref)),\n )\n .map((ref) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: ref.version,\n ref_path: ref.path,\n })),\n };\n}\n\nfunction buildRunPlan(task: DatasetCurationQueueTask): unknown {\n const stagesByType: Record<DatasetCurationQueueEntityType, string[]> = {\n support: ['identity', 'schema', 'qa_or_profile', 'checkpoint'],\n flow: ['identity', 'name_plan', 'schema', 'qa', 'checkpoint'],\n process: [\n 'dependency_closure',\n 'reference_refresh',\n 'required_fields',\n 'schema',\n 'qa',\n 'curation',\n 'remote_dry_run',\n 'readback',\n ],\n };\n return {\n schema_version: 1,\n task_id: task.task_id,\n entity_type: task.entity_type,\n entity_id: task.entity_id,\n version: task.version,\n input_rows_file: task.input_rows_file,\n checkpoint_file: task.checkpoint_file,\n stages: stagesByType[task.entity_type].map((stage) => ({\n id: stage,\n status: 'pending',\n checkpoint_file: path.join(task.work_dir, 'checkpoints', `${stage}.json`),\n })),\n ai_authoring_policy: {\n output_only: 'structured_patch_or_build_plan',\n deterministic_apply_required: true,\n remote_write_allowed: false,\n },\n };\n}\n\nfunction extractDeferredProcessFlowRefs(payload: unknown): DeferredFlowRef[] {\n const refs = new Map<string, DeferredFlowRef>();\n scanForDeferredProcessFlowRefs(payload, refs);\n return [...refs.values()].sort((a, b) =>\n `${a.id}@${a.version ?? ''}@${a.path}`.localeCompare(`${b.id}@${b.version ?? ''}@${b.path}`),\n );\n}\n\nfunction scanForDeferredProcessFlowRefs(value: unknown, refs: Map<string, DeferredFlowRef>): void {\n if (Array.isArray(value)) {\n value.forEach((item) => scanForDeferredProcessFlowRefs(item, refs));\n return;\n }\n if (!isRecord(value)) {\n return;\n }\n\n const traces = asList(value['tiangongfoundry:unresolvedTrace']);\n for (const trace of traces) {\n if (!isRecord(trace)) {\n continue;\n }\n const actionItemCode = firstNonEmpty(trace.action_item_code, trace.actionItemCode);\n if (actionItemCode !== 'elementary_flow_identity_manual_review') {\n continue;\n }\n const id = firstNonEmpty(trace.reference_id, trace.referenceId, trace.ref_object_id);\n const pathValue = firstNonEmpty(trace.blocked_path, trace.blockedPath, trace.path);\n if (!id || !pathValue) {\n continue;\n }\n const version = firstNonEmpty(trace.reference_version, trace.referenceVersion, trace.version);\n const ref = {\n id,\n version,\n path: normalizeReferencePath(pathValue),\n actionItemCode,\n reason: firstNonEmpty(trace.reason),\n };\n refs.set(flowRefKey(ref), ref);\n }\n\n for (const nested of Object.values(value)) {\n scanForDeferredProcessFlowRefs(nested, refs);\n }\n}\n\nfunction deferredProcessFlowRefKeys(refs: DeferredFlowRef[]): Map<string, DeferredFlowRef> {\n const keys = new Map<string, DeferredFlowRef>();\n for (const ref of refs) {\n keys.set(flowRefKey(ref), ref);\n }\n return keys;\n}\n\nfunction flowRefKey(ref: FlowRef): string {\n return `${ref.id}@${ref.version ?? ''}@${normalizeReferencePath(ref.path)}`;\n}\n\nfunction normalizeReferencePath(value: string): string {\n return value\n .replace(/^\\/+/u, '')\n .replace(/\\/+/gu, '.')\n .replace(/^\\.+|\\.+$/gu, '');\n}\n\nfunction isFoundryTracePathParts(pathParts: string[]): boolean {\n return (\n pathParts.includes('common:other') &&\n pathParts.some(\n (part) => part.startsWith('tiangongfoundry:') && part.toLowerCase().includes('trace'),\n )\n );\n}\n\nfunction extractProcessFlowRefs(payload: unknown): FlowRef[] {\n const refs = new Map<string, FlowRef>();\n scanForFlowRefs(payload, [], refs);\n return [...refs.values()].sort((a, b) =>\n `${a.id}@${a.version ?? ''}`.localeCompare(`${b.id}@${b.version ?? ''}`),\n );\n}\n\nfunction scanForFlowRefs(value: unknown, pathParts: string[], refs: Map<string, FlowRef>): void {\n if (isFoundryTracePathParts(pathParts)) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => scanForFlowRefs(item, [...pathParts, String(index)], refs));\n return;\n }\n if (!isRecord(value)) {\n return;\n }\n\n const keyPath = pathParts.join('.');\n const keyHint = keyPath.toLowerCase();\n const looksLikeFlowRef =\n keyHint.includes('referencetoflowdataset') ||\n keyHint.includes('reference_to_flow_dataset') ||\n keyHint.includes('flowdataset') ||\n keyHint.includes('flow_dataset');\n if (looksLikeFlowRef) {\n const id = firstNonEmpty(\n value['@refObjectId'],\n value.refObjectId,\n value.ref_object_id,\n value.id,\n value.uuid,\n value['common:UUID'],\n );\n if (id) {\n const version = firstNonEmpty(\n value['@version'],\n value.version,\n value.dataSetVersion,\n value['common:dataSetVersion'],\n );\n refs.set(`${id}@${version ?? ''}@${keyPath}`, {\n id,\n version,\n path: keyPath,\n });\n }\n }\n\n for (const [key, nested] of Object.entries(value)) {\n scanForFlowRefs(nested, [...pathParts, key], refs);\n }\n}\n\nfunction readExternalFlowRefs(inputPath: string): FlowRef[] {\n const rows = materializeDatasetRows(inputPath);\n return rows.map((row) => {\n const id = firstNonEmpty(row.id, row.row.id, row.row.dataset_id, row.row.uuid);\n if (!id) {\n throw new CliError(`External flow ref is missing id in ${inputPath} at index ${row.index}.`, {\n code: 'CURATION_QUEUE_EXTERNAL_FLOW_REF_ID_MISSING',\n exitCode: 2,\n });\n }\n return {\n id,\n version: firstNonEmpty(row.version, row.row.version) ?? null,\n path: `${inputPath}#${row.index}`,\n };\n });\n}\n\nfunction asList(value: unknown): unknown[] {\n if (value === undefined || value === null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n\nfunction normalizeProcessLimit(value: number | undefined): number | null {\n if (value === undefined) {\n return null;\n }\n if (!Number.isInteger(value) || value < 1) {\n throw new CliError('--process-limit must be a positive integer.', {\n code: 'CURATION_QUEUE_PROCESS_LIMIT_INVALID',\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction requirePath(value: string | undefined, flag: string): string {\n const trimmed = value?.trim();\n if (!trimmed) {\n throw new CliError(`${flag} is required.`, {\n code: 'CURATION_QUEUE_REQUIRED_FLAG_MISSING',\n exitCode: 2,\n });\n }\n return trimmed;\n}\n\nfunction requireExistingPath(value: string | undefined, flag: string): string {\n const inputPath = requirePath(value, flag);\n if (!existsSync(inputPath)) {\n throw new CliError(`${flag} file does not exist: ${inputPath}`, {\n code: 'CURATION_QUEUE_INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n return inputPath;\n}\n\nfunction entityDirPlural(entityType: DatasetCurationQueueEntityType): string {\n return entityType === 'process' ? 'processes' : entityType === 'flow' ? 'flows' : 'supports';\n}\n\nfunction entityDirName(id: string, version: string): string {\n return `${sanitizePathToken(id)}__${sanitizePathToken(version)}`;\n}\n\nfunction taskIdFor(\n entityType: DatasetCurationQueueEntityType,\n id: string,\n version: string,\n): string {\n return `${entityType}:${id}@${version}`;\n}\n\nfunction sanitizePathToken(value: string): string {\n return value.replace(/[^A-Za-z0-9._-]+/gu, '_').replace(/^_+|_+$/gu, '') || 'unknown';\n}\n\nfunction buildInputHashes(inputPaths: string[]): Record<string, string> {\n const hashes: Record<string, string> = {};\n for (const inputPath of inputPaths) {\n hashes[path.resolve(inputPath)] = sha256(readFileSync(inputPath));\n }\n return hashes;\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction writeJson(filePath: string, value: unknown): void {\n mkdirSync(path.dirname(filePath), { recursive: true });\n writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n}\n\nfunction writeText(filePath: string, value: string): void {\n mkdirSync(path.dirname(filePath), { recursive: true });\n writeFileSync(filePath, value, 'utf8');\n}\n\nfunction jsonLines(rows: unknown[]): string {\n return rows.map((row) => JSON.stringify(row)).join('\\n') + (rows.length > 0 ? '\\n' : '');\n}\n\nexport const __testInternals = {\n buildTaskStates,\n countTaskStates,\n entityDirName,\n entityDirPlural,\n extractDeferredProcessFlowRefs,\n extractProcessFlowRefs,\n jsonLines,\n normalizeReferencePath,\n normalizeProcessLimit,\n normalizeQueueScope,\n parseQueueBlocker,\n parseQueueTask,\n readCheckpointStatus,\n readJsonlFile,\n readQueueRuntime,\n requireExistingPath,\n requirePath,\n sanitizePathToken,\n taskIdFor,\n taskMatchesScope,\n taskRuntimeStatus,\n withQueueAction,\n};\n"]}