@tiangong-lca/cli 0.0.6 → 0.0.8

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 (90) hide show
  1. package/README.md +154 -30
  2. package/dist/src/cli.js +2235 -149
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/lib/dataset-author.js +100 -0
  5. package/dist/src/lib/dataset-author.js.map +1 -0
  6. package/dist/src/lib/dataset-bilingual.js +545 -0
  7. package/dist/src/lib/dataset-bilingual.js.map +1 -0
  8. package/dist/src/lib/dataset-contract.js +350 -0
  9. package/dist/src/lib/dataset-contract.js.map +1 -0
  10. package/dist/src/lib/dataset-evidence-search.js +636 -0
  11. package/dist/src/lib/dataset-evidence-search.js.map +1 -0
  12. package/dist/src/lib/dataset-import-lca.js +171 -0
  13. package/dist/src/lib/dataset-import-lca.js.map +1 -0
  14. package/dist/src/lib/dataset-local.js +231 -0
  15. package/dist/src/lib/dataset-local.js.map +1 -0
  16. package/dist/src/lib/dataset-references-rewrite.js +214 -0
  17. package/dist/src/lib/dataset-references-rewrite.js.map +1 -0
  18. package/dist/src/lib/dataset-remote-refresh.js +166 -0
  19. package/dist/src/lib/dataset-remote-refresh.js.map +1 -0
  20. package/dist/src/lib/dataset-remote-verify.js +543 -0
  21. package/dist/src/lib/dataset-remote-verify.js.map +1 -0
  22. package/dist/src/lib/dataset-validate.js +247 -0
  23. package/dist/src/lib/dataset-validate.js.map +1 -0
  24. package/dist/src/lib/flow-payload-validation.js +51 -0
  25. package/dist/src/lib/flow-payload-validation.js.map +1 -0
  26. package/dist/src/lib/flow-publish-reviewed-data.js +16 -0
  27. package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -1
  28. package/dist/src/lib/flow-publish-version.js +182 -12
  29. package/dist/src/lib/flow-publish-version.js.map +1 -1
  30. package/dist/src/lib/flow-regen-product.js +2 -10
  31. package/dist/src/lib/flow-regen-product.js.map +1 -1
  32. package/dist/src/lib/flow-remediate.js +4 -8
  33. package/dist/src/lib/flow-remediate.js.map +1 -1
  34. package/dist/src/lib/identity-preflight.js +1021 -0
  35. package/dist/src/lib/identity-preflight.js.map +1 -0
  36. package/dist/src/lib/lifecyclemodel-auto-build.js +11 -8
  37. package/dist/src/lib/lifecyclemodel-auto-build.js.map +1 -1
  38. package/dist/src/lib/lifecyclemodel-graph.js +248 -0
  39. package/dist/src/lib/lifecyclemodel-graph.js.map +1 -0
  40. package/dist/src/lib/lifecyclemodel-publish-build.js +1 -1
  41. package/dist/src/lib/lifecyclemodel-publish-build.js.map +1 -1
  42. package/dist/src/lib/lifecyclemodel-save-draft-run.js +245 -0
  43. package/dist/src/lib/lifecyclemodel-save-draft-run.js.map +1 -0
  44. package/dist/src/lib/lifecyclemodel-validate-build.js +1 -1
  45. package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -1
  46. package/dist/src/lib/process-auto-build.js +158 -8
  47. package/dist/src/lib/process-auto-build.js.map +1 -1
  48. package/dist/src/lib/process-batch-build.js +6 -3
  49. package/dist/src/lib/process-batch-build.js.map +1 -1
  50. package/dist/src/lib/process-dedup-review.js +921 -0
  51. package/dist/src/lib/process-dedup-review.js.map +1 -0
  52. package/dist/src/lib/process-flow-build-plan.js +1071 -0
  53. package/dist/src/lib/process-flow-build-plan.js.map +1 -0
  54. package/dist/src/lib/process-payload-validation.js +57 -0
  55. package/dist/src/lib/process-payload-validation.js.map +1 -0
  56. package/dist/src/lib/process-publish-build.js +126 -10
  57. package/dist/src/lib/process-publish-build.js.map +1 -1
  58. package/dist/src/lib/process-refresh-references.js +1037 -0
  59. package/dist/src/lib/process-refresh-references.js.map +1 -0
  60. package/dist/src/lib/process-required-fields.js +810 -0
  61. package/dist/src/lib/process-required-fields.js.map +1 -0
  62. package/dist/src/lib/process-resume-build.js +4 -6
  63. package/dist/src/lib/process-resume-build.js.map +1 -1
  64. package/dist/src/lib/process-save-draft-run.js +35 -13
  65. package/dist/src/lib/process-save-draft-run.js.map +1 -1
  66. package/dist/src/lib/process-scope-statistics.js +859 -0
  67. package/dist/src/lib/process-scope-statistics.js.map +1 -0
  68. package/dist/src/lib/process-verify-rows.js +250 -0
  69. package/dist/src/lib/process-verify-rows.js.map +1 -0
  70. package/dist/src/lib/publish.js +101 -1
  71. package/dist/src/lib/publish.js.map +1 -1
  72. package/dist/src/lib/remote.js +4 -4
  73. package/dist/src/lib/remote.js.map +1 -1
  74. package/dist/src/lib/review-flow.js +58 -0
  75. package/dist/src/lib/review-flow.js.map +1 -1
  76. package/dist/src/lib/review-lifecyclemodel.js +2 -2
  77. package/dist/src/lib/review-lifecyclemodel.js.map +1 -1
  78. package/dist/src/lib/review-process.js +150 -2
  79. package/dist/src/lib/review-process.js.map +1 -1
  80. package/dist/src/lib/runtime-rulesets.js +283 -0
  81. package/dist/src/lib/runtime-rulesets.js.map +1 -0
  82. package/dist/src/lib/tidas-sdk-package-validator.js +28 -9
  83. package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -1
  84. package/dist/src/lib/tidas-sdk-validation.js +96 -0
  85. package/dist/src/lib/tidas-sdk-validation.js.map +1 -0
  86. package/dist/src/lib/user-api-key.js +1 -1
  87. package/dist/src/lib/user-api-key.js.map +1 -1
  88. package/package.json +5 -5
  89. /package/bin/{tiangong.d.ts → tiangong-lca.d.ts} +0 -0
  90. /package/bin/{tiangong.js → tiangong-lca.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-required-fields.js","sourceRoot":"","sources":["../../../src/lib/process-required-fields.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n cloneJson,\n datasetRoot,\n firstNonEmpty,\n isRecord,\n materializeDatasetRows,\n type DatasetRowInput,\n type JsonObject,\n} from './dataset-local.js';\n\nconst ANNUAL_SUPPLY_FIELD =\n 'processDataSet.modellingAndValidation.dataSourcesTreatmentAndRepresentativeness.annualSupplyOrProductionVolume';\nconst ANNUAL_SUPPLY_ROOT_FIELD =\n 'modellingAndValidation.dataSourcesTreatmentAndRepresentativeness.annualSupplyOrProductionVolume';\nconst NUMERIC_TEXT_WITH_SUFFIX_PATTERN = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([Ee][+-]?\\d+)?\\s+\\S.*$/u;\nconst ANNUAL_PERIOD_PATTERN =\n /(?:\\/\\s*(?:year|yr|a)\\b|\\bper\\s+(?:year|annum)\\b|\\/\\s*年|每年|年度|年供应|年产)/iu;\nconst CJK_TEXT_PATTERN = /[\\p{Script=Han}]/u;\nconst NET_CALORIFIC_VALUE_ID = '93a60a56-a3c8-11da-a746-0800200c9a66';\nconst DEFAULT_COMPLIANCE_SYSTEM = {\n '@refObjectId': 'c84c4185-d1b0-44fc-823e-d2ec630c7906',\n '@type': 'source data set',\n '@uri': 'https://tiangong.earth/datasets/c84c4185-d1b0-44fc-823e-d2ec630c7906',\n '@version': '00.00.001',\n 'common:shortDescription': {\n '@xml:lang': 'en',\n '#text': 'Environmental Footprint (EF) 3.1',\n },\n} as const;\nconst DEFAULT_COMPLIANCE_DECLARATION = {\n 'common:referenceToComplianceSystem': DEFAULT_COMPLIANCE_SYSTEM,\n 'common:approvalOfOverallCompliance': 'Not defined',\n 'common:nomenclatureCompliance': 'Not defined',\n 'common:methodologicalCompliance': 'Not defined',\n 'common:reviewCompliance': 'Not defined',\n 'common:documentationCompliance': 'Not defined',\n 'common:qualityCompliance': 'Not defined',\n} as const;\nconst REQUIRED_COMPLIANCE_FIELDS = [\n 'common:approvalOfOverallCompliance',\n 'common:nomenclatureCompliance',\n 'common:methodologicalCompliance',\n 'common:reviewCompliance',\n 'common:documentationCompliance',\n 'common:qualityCompliance',\n] as const;\n\ntype AnnualSupplyStatus = 'existing' | 'completed' | 'blocked' | 'skipped';\n\nexport type ProcessRequiredFieldIssue = {\n code: string;\n message: string;\n path: string;\n};\n\nexport type ProcessRequiredFieldCompletion = {\n field_path: string;\n source: 'existing' | 'evidence' | 'placeholder_repair' | 'required_structure_repair';\n value: Array<{ '#text': string; '@xml:lang': string }>;\n amount: string | null;\n unit: string | null;\n reference_exchange_internal_id: string | null;\n basis: string;\n};\n\nexport type ProcessRequiredFieldsRowReport = {\n index: number;\n id: string | null;\n version: string | null;\n type: string | null;\n status: AnnualSupplyStatus;\n issues: ProcessRequiredFieldIssue[];\n completions: ProcessRequiredFieldCompletion[];\n};\n\nexport type ProcessRequiredFieldsReport = {\n generated_at_utc: string;\n input_path: string;\n out_path: string;\n out_dir: string | null;\n status: 'completed' | 'completed_with_blockers';\n default_unit: string;\n counts: {\n total: number;\n processes: number;\n completed: number;\n existing: number;\n blocked: number;\n skipped: number;\n };\n files: {\n output_rows: string;\n report: string | null;\n evidence: string | null;\n };\n rows: ProcessRequiredFieldsRowReport[];\n};\n\nexport type RunProcessRequiredFieldsCompleteOptions = {\n inputPath: string;\n outPath: string;\n outDir?: string | null;\n defaultUnit?: string | null;\n flowInputPath?: string | null;\n rawInput?: unknown;\n rawFlowInput?: unknown;\n now?: Date;\n};\n\ntype CompletionContext = {\n defaultUnit: string;\n flowUnitById?: Map<string, string>;\n};\n\ntype AnnualSupplyEvidenceValue = {\n value: Array<{ '#text': string; '@xml:lang': string }>;\n amount: string;\n unit: string;\n basis: string;\n};\n\nfunction normalizeUnit(value: string | null | undefined): string {\n const token = value?.trim();\n return token || 'unit';\n}\n\nfunction sourceLanguageForText(value: string, fallback = 'en'): string {\n return CJK_TEXT_PATTERN.test(value) ? 'zh' : fallback;\n}\n\nfunction textValue(value: unknown): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n return String(value);\n }\n return null;\n}\n\nfunction asList(value: unknown): unknown[] {\n if (Array.isArray(value)) {\n return value;\n }\n return value === undefined || value === null ? [] : [value];\n}\n\nfunction valueAtPath(root: unknown, pathExpression: string): unknown {\n let current = root;\n for (const segment of pathExpression.split('.')) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction annualSupplyItems(value: unknown): Array<{ '#text': string; '@xml:lang': string }> {\n return asList(value).filter((item): item is { '#text': string; '@xml:lang': string } => {\n return (\n isRecord(item) && typeof item['#text'] === 'string' && typeof item['@xml:lang'] === 'string'\n );\n });\n}\n\nfunction isValidAnnualSupplyVolume(value: unknown): boolean {\n const items = annualSupplyItems(value);\n return (\n items.length > 0 &&\n items.every((item) => {\n const text = item['#text'].trim();\n return NUMERIC_TEXT_WITH_SUFFIX_PATTERN.test(text) && ANNUAL_PERIOD_PATTERN.test(text);\n })\n );\n}\n\nfunction isValidReview(value: unknown): boolean {\n return asList(value).some((item) => isRecord(item) && Boolean(firstNonEmpty(item['@type'])));\n}\n\nfunction isValidComplianceDeclaration(value: unknown): boolean {\n return asList(value).some((item) => {\n if (!isRecord(item)) {\n return false;\n }\n const complianceSystem = isRecord(item['common:referenceToComplianceSystem'])\n ? item['common:referenceToComplianceSystem']\n : {};\n return (\n Boolean(firstNonEmpty(complianceSystem['@refObjectId'])) &&\n REQUIRED_COMPLIANCE_FIELDS.every((field) => Boolean(firstNonEmpty(item[field])))\n );\n });\n}\n\nexport function collectProcessRequiredFieldIssues(\n payload: JsonObject,\n): ProcessRequiredFieldIssue[] {\n const root = datasetRoot(payload, 'process');\n const modelling = isRecord(root.modellingAndValidation) ? root.modellingAndValidation : {};\n const dataSources = isRecord(modelling.dataSourcesTreatmentAndRepresentativeness)\n ? modelling.dataSourcesTreatmentAndRepresentativeness\n : null;\n if (!dataSources) {\n return [\n {\n code: 'process_data_sources_treatment_missing',\n message: 'Process payload must include dataSourcesTreatmentAndRepresentativeness.',\n path: 'processDataSet.modellingAndValidation.dataSourcesTreatmentAndRepresentativeness',\n },\n ];\n }\n\n const issues: ProcessRequiredFieldIssue[] = [];\n const validation = isRecord(modelling.validation) ? modelling.validation : {};\n if (!isValidReview(validation.review)) {\n issues.push({\n code: 'process_validation_review_missing',\n message: 'Process payload must include modellingAndValidation.validation.review.',\n path: 'processDataSet.modellingAndValidation.validation.review',\n });\n }\n\n const complianceDeclarations = isRecord(modelling.complianceDeclarations)\n ? modelling.complianceDeclarations\n : {};\n if (!isValidComplianceDeclaration(complianceDeclarations.compliance)) {\n issues.push({\n code: 'process_compliance_declaration_missing',\n message:\n 'Process payload must include modellingAndValidation.complianceDeclarations.compliance.',\n path: 'processDataSet.modellingAndValidation.complianceDeclarations.compliance',\n });\n }\n\n const annualSupply = dataSources.annualSupplyOrProductionVolume;\n if (isValidAnnualSupplyVolume(annualSupply)) {\n return issues;\n }\n\n const items = annualSupplyItems(annualSupply);\n if (items.length === 0) {\n return [\n ...issues,\n {\n code: 'annual_supply_or_production_volume_missing',\n message:\n 'Process payload must include annualSupplyOrProductionVolume as numeric text with a unit or context suffix.',\n path: ANNUAL_SUPPLY_FIELD,\n },\n ];\n }\n\n if (\n items.every((item) => NUMERIC_TEXT_WITH_SUFFIX_PATTERN.test(item['#text'].trim())) &&\n items.some((item) => !ANNUAL_PERIOD_PATTERN.test(item['#text'].trim()))\n ) {\n return [\n ...issues,\n {\n code: 'annual_supply_or_production_volume_not_annualized',\n message:\n 'annualSupplyOrProductionVolume must express an annualized amount such as \"3.6 MJ/year\" or \"3.6 MJ/年\", not a reference-flow description.',\n path: ANNUAL_SUPPLY_FIELD,\n },\n ];\n }\n\n return [\n ...issues,\n {\n code: 'annual_supply_or_production_volume_invalid',\n message:\n 'annualSupplyOrProductionVolume must start with a real number followed by a unit or context suffix.',\n path: ANNUAL_SUPPLY_FIELD,\n },\n ];\n}\n\nfunction issuePath(pathSegments: Array<string | number>): string {\n return pathSegments.length > 0 ? pathSegments.map(String).join('.') : '<root>';\n}\n\nfunction collectPlaceholderIssuesFromValue(\n value: unknown,\n pathSegments: Array<string | number>,\n issues: ProcessRequiredFieldIssue[],\n): void {\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n if (\n (pathSegments.at(-1) === 'common:referenceYear' && normalized === '9999') ||\n normalized.includes('tidas_import_placeholder') ||\n normalized.includes('tidas_import_trace_v1') ||\n normalized.includes('not declared in source package') ||\n normalized.includes('source package metadata not declared') ||\n normalized === '<null>' ||\n /(^|[\\s\"'`])(?:\\/users\\/|\\/home\\/|[a-z]:\\\\)/iu.test(value) ||\n normalized.includes('placeholder.example') ||\n normalized.includes('pending confirmation') ||\n /00000000-0000-0000-0000-0000000000[0-9a-f]{2}/u.test(normalized)\n ) {\n issues.push({\n code: 'process_placeholder_content',\n message:\n 'Process payload contains placeholder or pending-confirmation content that must be replaced before save or publish.',\n path: issuePath(pathSegments),\n });\n }\n return;\n }\n\n if (typeof value === 'number') {\n if (pathSegments.at(-1) === 'common:referenceYear' && value === 9999) {\n issues.push({\n code: 'process_placeholder_content',\n message:\n 'Process payload contains placeholder or pending-confirmation content that must be replaced before save or publish.',\n path: issuePath(pathSegments),\n });\n }\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) =>\n collectPlaceholderIssuesFromValue(item, [...pathSegments, index], issues),\n );\n return;\n }\n\n if (isRecord(value)) {\n for (const [key, child] of Object.entries(value)) {\n collectPlaceholderIssuesFromValue(child, [...pathSegments, key], issues);\n }\n }\n}\n\nexport function collectProcessPlaceholderIssues(payload: JsonObject): ProcessRequiredFieldIssue[] {\n const root = datasetRoot(payload, 'process');\n const issues: ProcessRequiredFieldIssue[] = [];\n collectPlaceholderIssuesFromValue(root, ['processDataSet'], issues);\n return issues;\n}\n\nfunction hasPlaceholderContent(value: unknown): boolean {\n const issues: ProcessRequiredFieldIssue[] = [];\n collectPlaceholderIssuesFromValue(value, [], issues);\n return issues.length > 0;\n}\n\nfunction removePlaceholderField(\n parent: JsonObject,\n key: string,\n fieldPath: string,\n completions: ProcessRequiredFieldCompletion[],\n): void {\n if (!hasPlaceholderContent(parent[key])) {\n return;\n }\n delete parent[key];\n completions.push({\n field_path: fieldPath,\n source: 'placeholder_repair',\n value: [],\n amount: null,\n unit: null,\n reference_exchange_internal_id: null,\n basis:\n 'Removed placeholder review metadata because the dataset is marked Not reviewed and no completed review evidence is present.',\n });\n}\n\nfunction repairPlaceholderReviewMetadata(root: JsonObject): ProcessRequiredFieldCompletion[] {\n const modelling = isRecord(root.modellingAndValidation) ? root.modellingAndValidation : {};\n const validation = isRecord(modelling.validation) ? modelling.validation : null;\n if (!validation) {\n return [];\n }\n\n const completions: ProcessRequiredFieldCompletion[] = [];\n const validationPath = 'processDataSet.modellingAndValidation.validation';\n for (const key of [\n 'reviewDetails',\n 'common:reviewDetails',\n 'common:referenceToCompleteReviewReport',\n 'common:referenceToNameOfReviewerAndInstitution',\n ]) {\n removePlaceholderField(validation, key, `${validationPath}.${key}`, completions);\n }\n\n if (isRecord(validation.review)) {\n const reviewPath = `${validationPath}.review`;\n for (const key of [\n 'reviewDetails',\n 'common:reviewDetails',\n 'common:referenceToCompleteReviewReport',\n 'common:referenceToNameOfReviewerAndInstitution',\n ]) {\n removePlaceholderField(validation.review, key, `${reviewPath}.${key}`, completions);\n }\n }\n\n return completions;\n}\n\nfunction addRequiredStructureCompletion(\n completions: ProcessRequiredFieldCompletion[],\n fieldPath: string,\n basis: string,\n): void {\n completions.push({\n field_path: fieldPath,\n source: 'required_structure_repair',\n value: [],\n amount: null,\n unit: null,\n reference_exchange_internal_id: null,\n basis,\n });\n}\n\nfunction repairRequiredProcessStructures(root: JsonObject): ProcessRequiredFieldCompletion[] {\n const completions: ProcessRequiredFieldCompletion[] = [];\n if (!isRecord(root.modellingAndValidation)) {\n root.modellingAndValidation = {};\n }\n const modelling = root.modellingAndValidation as JsonObject;\n\n if (!isRecord(modelling.validation)) {\n modelling.validation = {};\n }\n const validation = modelling.validation as JsonObject;\n if (!isValidReview(validation.review)) {\n validation.review = {\n '@type': 'Not reviewed',\n };\n addRequiredStructureCompletion(\n completions,\n 'processDataSet.modellingAndValidation.validation.review',\n 'Inserted a conservative Not reviewed marker because UI roundtrip or source data omitted the required validation.review structure.',\n );\n }\n\n if (!isRecord(modelling.complianceDeclarations)) {\n modelling.complianceDeclarations = {};\n }\n const complianceDeclarations = modelling.complianceDeclarations as JsonObject;\n if (!isValidComplianceDeclaration(complianceDeclarations.compliance)) {\n complianceDeclarations.compliance = cloneJson(DEFAULT_COMPLIANCE_DECLARATION);\n addRequiredStructureCompletion(\n completions,\n 'processDataSet.modellingAndValidation.complianceDeclarations.compliance',\n 'Inserted a conservative Not defined compliance declaration against EF 3.1 because UI roundtrip or source data omitted the required compliance structure.',\n );\n }\n\n return completions;\n}\n\nfunction processRootForMutation(payload: JsonObject): JsonObject {\n if (isRecord(payload.processDataSet)) {\n return payload.processDataSet;\n }\n return payload;\n}\n\nfunction selectReferenceExchange(root: JsonObject): JsonObject | null {\n const exchangesRoot = isRecord(root.exchanges) ? root.exchanges : {};\n const exchanges = asList(exchangesRoot.exchange).filter(isRecord);\n const processInfo = isRecord(root.processInformation) ? root.processInformation : {};\n const quantitativeReference = isRecord(processInfo.quantitativeReference)\n ? processInfo.quantitativeReference\n : {};\n const referenceId = firstNonEmpty(quantitativeReference.referenceToReferenceFlow);\n\n const byReferenceId = referenceId\n ? exchanges.find((exchange) => firstNonEmpty(exchange['@dataSetInternalID']) === referenceId)\n : null;\n if (byReferenceId) {\n return byReferenceId;\n }\n\n return (\n exchanges.find((exchange) => exchange.quantitativeReference === true) ??\n exchanges.find(\n (exchange) => String(exchange.exchangeDirection ?? '').toLowerCase() === 'output',\n ) ??\n null\n );\n}\n\nfunction localizedTextIncludes(value: unknown, pattern: RegExp): boolean {\n return annualSupplyItems(value).some((item) => pattern.test(item['#text']));\n}\n\nfunction inferSpecificUnitFromFlowPayload(payload: JsonObject): string | null {\n const root = datasetRoot(payload, 'flow');\n const flowPropertiesRoot = isRecord(root.flowProperties) ? root.flowProperties : {};\n const flowProperties = asList(flowPropertiesRoot.flowProperty).filter(isRecord);\n for (const flowProperty of flowProperties) {\n const direct = firstNonEmpty(\n flowProperty.unit,\n flowProperty.referenceUnit,\n flowProperty.flowUnit,\n );\n if (direct) {\n return direct;\n }\n\n const flowPropertyRef = isRecord(flowProperty.referenceToFlowPropertyDataSet)\n ? flowProperty.referenceToFlowPropertyDataSet\n : {};\n const flowPropertyId = firstNonEmpty(flowPropertyRef['@refObjectId']);\n const flowPropertyText = flowPropertyRef['common:shortDescription'];\n if (\n flowPropertyId === NET_CALORIFIC_VALUE_ID ||\n localizedTextIncludes(flowPropertyText, /Net calorific|净热值/u)\n ) {\n return 'MJ';\n }\n }\n\n const flowInformation = isRecord(root.flowInformation) ? root.flowInformation : {};\n const dataSetInformation = isRecord(flowInformation.dataSetInformation)\n ? flowInformation.dataSetInformation\n : {};\n const classificationInformation = isRecord(dataSetInformation.classificationInformation)\n ? dataSetInformation.classificationInformation\n : {};\n const classification = isRecord(classificationInformation['common:classification'])\n ? classificationInformation['common:classification']\n : {};\n const classificationClasses = classification['common:class'];\n if (\n localizedTextIncludes(classificationClasses, /Electrical energy|electricity|交流电|电力|电能/iu)\n ) {\n return 'MJ';\n }\n\n return null;\n}\n\nfunction buildFlowUnitIndex(\n flowRows: DatasetRowInput[],\n fallbackUnit: string,\n): Map<string, string> {\n const index = new Map<string, string>();\n for (const row of flowRows) {\n if (row.kind !== 'flow' || !row.id) {\n continue;\n }\n const inferred = inferSpecificUnitFromFlowPayload(row.payload);\n if (inferred && inferred !== fallbackUnit) {\n index.set(row.id, inferred);\n }\n }\n return index;\n}\n\nfunction inferUnitFromReferenceExchange(\n exchange: JsonObject,\n fallbackOrContext: string | CompletionContext,\n): string {\n const context =\n typeof fallbackOrContext === 'string' ? { defaultUnit: fallbackOrContext } : fallbackOrContext;\n const fallbackUnit = context.defaultUnit;\n const flowRef = isRecord(exchange.referenceToFlowDataSet) ? exchange.referenceToFlowDataSet : {};\n const refObjectId = firstNonEmpty(flowRef['@refObjectId']);\n if (refObjectId) {\n const indexedUnit = context.flowUnitById?.get(refObjectId);\n if (indexedUnit) {\n return indexedUnit;\n }\n }\n\n const direct = firstNonEmpty(exchange.unit, exchange.referenceUnit, exchange.flowUnit);\n if (direct) {\n return direct;\n }\n\n const shortDescriptions = flowRef['common:shortDescription'];\n if (\n localizedTextIncludes(\n shortDescriptions,\n /MJ|net calorific|lower calorific|Electrical energy|electricity|净热值|低位发热|交流电|电力|电能/iu,\n )\n ) {\n return 'MJ';\n }\n\n const flowProperty = isRecord(exchange.flowProperty) ? exchange.flowProperty : {};\n const flowPropertyRef = isRecord(flowProperty.referenceToFlowPropertyDataSet)\n ? flowProperty.referenceToFlowPropertyDataSet\n : {};\n const flowPropertyId = firstNonEmpty(flowPropertyRef['@refObjectId']);\n const flowPropertyText = flowPropertyRef['common:shortDescription'];\n if (\n refObjectId === NET_CALORIFIC_VALUE_ID ||\n flowPropertyId === NET_CALORIFIC_VALUE_ID ||\n localizedTextIncludes(flowPropertyText, /Net calorific|净热值/u)\n ) {\n return 'MJ';\n }\n\n return fallbackUnit;\n}\n\nfunction buildAnnualSupplyValue(\n amount: string,\n unit: string,\n): Array<{\n '#text': string;\n '@xml:lang': string;\n}> {\n return [{ '@xml:lang': 'en', '#text': `${amount} ${unit}/year` }];\n}\n\nfunction annualSupplyTextParts(value: string): { amount: string; unit: string } | null {\n const match = /^\\s*([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[Ee][+-]?\\d+)?)\\s+(\\S.*)$/u.exec(value);\n return match ? { amount: match[1] as string, unit: (match[2] as string).trim() } : null;\n}\n\nfunction annualSupplyValueFromText(value: string): AnnualSupplyEvidenceValue | null {\n const text = value.trim();\n if (!NUMERIC_TEXT_WITH_SUFFIX_PATTERN.test(text) || !ANNUAL_PERIOD_PATTERN.test(text)) {\n return null;\n }\n const parts = annualSupplyTextParts(text) as { amount: string; unit: string };\n return {\n value: [{ '@xml:lang': sourceLanguageForText(text), '#text': text }],\n amount: parts.amount,\n unit: parts.unit,\n basis: 'Evidence provided a complete annual supply / production volume text value.',\n };\n}\n\nfunction normalizeAnnualSupplyEvidenceValue(\n candidate: unknown,\n context: CompletionContext,\n): AnnualSupplyEvidenceValue | null {\n if (typeof candidate === 'string') {\n return annualSupplyValueFromText(candidate);\n }\n\n if (typeof candidate === 'number' && Number.isFinite(candidate)) {\n const amount = String(candidate);\n return {\n value: buildAnnualSupplyValue(amount, context.defaultUnit),\n amount,\n unit: context.defaultUnit,\n basis:\n 'Evidence provided a numeric annual supply / production volume; the configured default unit was applied.',\n };\n }\n\n if (isValidAnnualSupplyVolume(candidate)) {\n const value = [\n annualSupplyItems(candidate).map((item) => ({\n '@xml:lang': item['@xml:lang'],\n '#text': item['#text'].trim(),\n }))[0]!,\n ];\n const parts = annualSupplyTextParts(value[0]!['#text']) as { amount: string; unit: string };\n return {\n value,\n amount: parts.amount,\n unit: parts.unit,\n basis:\n 'Evidence provided a validated source-language annual supply / production volume value.',\n };\n }\n\n if (!isRecord(candidate)) {\n return null;\n }\n\n for (const key of [\n 'value',\n 'text',\n 'value_text',\n 'valueText',\n 'annualSupplyOrProductionVolume',\n 'annual_supply_or_production_volume',\n ]) {\n const nested = normalizeAnnualSupplyEvidenceValue(candidate[key], context);\n if (nested) {\n return nested;\n }\n }\n\n const preferredLanguage = textValue(\n candidate.source_language ??\n candidate.sourceLanguage ??\n candidate.lang ??\n candidate['@xml:lang'],\n )?.toLowerCase();\n const english = textValue(candidate.en ?? candidate.english);\n const chinese = textValue(candidate.zh ?? candidate.chinese ?? candidate['zh-CN']);\n const localized = [\n english ? { '@xml:lang': 'en', '#text': english } : null,\n chinese ? { '@xml:lang': 'zh', '#text': chinese } : null,\n ].filter((item): item is { '#text': string; '@xml:lang': string } => Boolean(item));\n if (localized.length > 0 && isValidAnnualSupplyVolume(localized)) {\n const selected =\n localized.find((item) => item['@xml:lang'].toLowerCase() === preferredLanguage) ??\n localized[0]!;\n const value = [selected];\n const parts = annualSupplyTextParts(selected['#text']) as {\n amount: string;\n unit: string;\n };\n return {\n value,\n amount: parts.amount,\n unit: parts.unit,\n basis: 'Evidence provided a language-specific annual supply / production volume text value.',\n };\n }\n\n const amount = textValue(candidate.amount ?? candidate.value_amount ?? candidate.valueAmount);\n const unit = normalizeUnit(\n textValue(\n candidate.unit ?? candidate.uom ?? candidate.reference_unit ?? candidate.referenceUnit,\n ) ?? context.defaultUnit,\n );\n if (amount) {\n return {\n value: buildAnnualSupplyValue(amount, unit),\n amount,\n unit,\n basis:\n 'Evidence provided annual supply / production volume amount and unit as structured fields.',\n };\n }\n\n return null;\n}\n\nfunction isAnnualSupplyEvidencePath(pathExpression: string | null): boolean {\n if (!pathExpression) {\n return false;\n }\n return (\n pathExpression === ANNUAL_SUPPLY_FIELD ||\n pathExpression === ANNUAL_SUPPLY_ROOT_FIELD ||\n pathExpression.endsWith(`.${ANNUAL_SUPPLY_ROOT_FIELD}`) ||\n pathExpression.endsWith('.annualSupplyOrProductionVolume')\n );\n}\n\nfunction fieldPathFromEvidenceEntry(entry: JsonObject): string | null {\n return firstNonEmpty(\n entry.field_path,\n entry.fieldPath,\n entry.path,\n entry.field,\n entry.target_path,\n entry.targetPath,\n );\n}\n\nfunction findAnnualSupplyEvidenceEntry(\n container: unknown,\n context: CompletionContext,\n): AnnualSupplyEvidenceValue | null {\n if (!isRecord(container)) {\n return null;\n }\n\n const directPath = fieldPathFromEvidenceEntry(container);\n if (isAnnualSupplyEvidencePath(directPath)) {\n const directValue = normalizeAnnualSupplyEvidenceValue(container, context);\n if (directValue) {\n return directValue;\n }\n }\n\n for (const key of [\n 'field_values',\n 'fieldValues',\n 'field_bindings',\n 'fieldBindings',\n 'bindings',\n ]) {\n const entries = asList(container[key]).filter(isRecord);\n for (const entry of entries) {\n if (!isAnnualSupplyEvidencePath(fieldPathFromEvidenceEntry(entry))) {\n continue;\n }\n const value = normalizeAnnualSupplyEvidenceValue(entry, context);\n if (value) {\n return value;\n }\n }\n }\n\n return null;\n}\n\nfunction findAnnualSupplyEvidenceValue(\n row: JsonObject,\n payload: JsonObject,\n context: CompletionContext,\n): AnnualSupplyEvidenceValue | null {\n const explicitPaths = [\n 'annualSupplyOrProductionVolume',\n 'annual_supply_or_production_volume',\n 'required_fields.annualSupplyOrProductionVolume',\n 'requiredFields.annualSupplyOrProductionVolume',\n 'authoring.required_fields.annualSupplyOrProductionVolume',\n 'authoring.requiredFields.annualSupplyOrProductionVolume',\n 'process_authoring.required_fields.annualSupplyOrProductionVolume',\n 'processAuthoring.requiredFields.annualSupplyOrProductionVolume',\n ];\n for (const source of [row, payload]) {\n for (const explicitPath of explicitPaths) {\n const value = normalizeAnnualSupplyEvidenceValue(valueAtPath(source, explicitPath), context);\n if (value) {\n return value;\n }\n }\n }\n\n const evidencePaths = [\n 'evidence_manifest',\n 'evidenceManifest',\n 'authoring_evidence',\n 'authoringEvidence',\n 'process_authoring.evidence_manifest',\n 'processAuthoring.evidenceManifest',\n ];\n for (const source of [row, payload]) {\n for (const evidencePath of evidencePaths) {\n const value = findAnnualSupplyEvidenceEntry(valueAtPath(source, evidencePath), context);\n if (value) {\n return value;\n }\n }\n }\n\n return null;\n}\n\nfunction ensureDataSources(root: JsonObject): JsonObject {\n if (!isRecord(root.modellingAndValidation)) {\n root.modellingAndValidation = {};\n }\n const modelling = root.modellingAndValidation as JsonObject;\n if (!isRecord(modelling.dataSourcesTreatmentAndRepresentativeness)) {\n modelling.dataSourcesTreatmentAndRepresentativeness = {};\n }\n return modelling.dataSourcesTreatmentAndRepresentativeness as JsonObject;\n}\n\nfunction cloneRowWithPayload(row: DatasetRowInput): { row: JsonObject; payload: JsonObject } {\n const clonedRow = cloneJson(row.row);\n if (isRecord(clonedRow.json_ordered)) {\n return { row: clonedRow, payload: clonedRow.json_ordered };\n }\n if (isRecord(clonedRow.jsonOrdered)) {\n return { row: clonedRow, payload: clonedRow.jsonOrdered };\n }\n if (isRecord(clonedRow.json)) {\n return { row: clonedRow, payload: clonedRow.json };\n }\n if (isRecord(clonedRow.payload)) {\n return { row: clonedRow, payload: clonedRow.payload };\n }\n if (isRecord(clonedRow.process)) {\n return { row: clonedRow, payload: clonedRow.process };\n }\n return { row: clonedRow, payload: clonedRow };\n}\n\nfunction completeProcessRow(\n row: DatasetRowInput,\n context: CompletionContext,\n): { row: JsonObject; report: ProcessRequiredFieldsRowReport } {\n const { row: clonedRow, payload } = cloneRowWithPayload(row);\n if (row.kind !== 'process') {\n return {\n row: clonedRow,\n report: {\n index: row.index,\n id: row.id,\n version: row.version,\n type: row.kind,\n status: 'skipped',\n issues: [],\n completions: [],\n },\n };\n }\n\n const root = processRootForMutation(payload);\n const placeholderCompletions = repairPlaceholderReviewMetadata(root);\n const requiredStructureCompletions = repairRequiredProcessStructures(root);\n const repairCompletions = [...placeholderCompletions, ...requiredStructureCompletions];\n const existingIssues = collectProcessRequiredFieldIssues(payload);\n const placeholderIssues = collectProcessPlaceholderIssues(payload);\n\n if (existingIssues.length === 0 && placeholderIssues.length === 0) {\n return {\n row: clonedRow,\n report: {\n index: row.index,\n id: row.id,\n version: row.version,\n type: row.kind,\n status: repairCompletions.length > 0 ? 'completed' : 'existing',\n issues: [],\n completions: repairCompletions,\n },\n };\n }\n\n if (placeholderIssues.length > 0) {\n return {\n row: clonedRow,\n report: {\n index: row.index,\n id: row.id,\n version: row.version,\n type: row.kind,\n status: 'blocked',\n issues: [...existingIssues, ...placeholderIssues],\n completions: repairCompletions,\n },\n };\n }\n\n const evidenceValue = findAnnualSupplyEvidenceValue(clonedRow, payload, context);\n if (evidenceValue) {\n const dataSources = ensureDataSources(root);\n dataSources.annualSupplyOrProductionVolume = evidenceValue.value;\n const completion: ProcessRequiredFieldCompletion = {\n field_path: ANNUAL_SUPPLY_FIELD,\n source: 'evidence',\n value: evidenceValue.value,\n amount: evidenceValue.amount,\n unit: evidenceValue.unit,\n reference_exchange_internal_id: null,\n basis: evidenceValue.basis,\n };\n return {\n row: clonedRow,\n report: {\n index: row.index,\n id: row.id,\n version: row.version,\n type: row.kind,\n status: 'completed',\n issues: [],\n completions: [...repairCompletions, completion],\n },\n };\n }\n\n return {\n row: clonedRow,\n report: {\n index: row.index,\n id: row.id,\n version: row.version,\n type: row.kind,\n status: 'blocked',\n issues: [\n ...existingIssues,\n {\n code: 'annual_supply_evidence_missing',\n message:\n 'Could not complete annualSupplyOrProductionVolume because no source evidence value was provided.',\n path: ANNUAL_SUPPLY_FIELD,\n },\n ],\n completions: repairCompletions,\n },\n };\n}\n\nfunction buildFiles(outPath: string, outDir: string | null): ProcessRequiredFieldsReport['files'] {\n if (!outDir) {\n return {\n output_rows: path.resolve(outPath),\n report: null,\n evidence: null,\n };\n }\n const resolved = path.resolve(outDir);\n return {\n output_rows: path.resolve(outPath),\n report: path.join(resolved, 'outputs', 'process-required-fields-report.json'),\n evidence: path.join(resolved, 'outputs', 'process-required-fields-evidence.jsonl'),\n };\n}\n\nfunction requireOutputPath(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new CliError('Missing required --out value.', {\n code: 'PROCESS_REQUIRED_FIELDS_OUT_REQUIRED',\n exitCode: 2,\n });\n }\n return trimmed;\n}\n\nexport async function runProcessRequiredFieldsComplete(\n options: RunProcessRequiredFieldsCompleteOptions,\n): Promise<ProcessRequiredFieldsReport> {\n const outPath = requireOutputPath(options.outPath);\n const outDir = options.outDir?.trim() ? options.outDir.trim() : null;\n const defaultUnit = normalizeUnit(options.defaultUnit);\n const rows = materializeDatasetRows(options.inputPath, options.rawInput);\n const flowRows = options.flowInputPath?.trim()\n ? materializeDatasetRows(options.flowInputPath, options.rawFlowInput)\n : [];\n const flowUnitById = buildFlowUnitIndex(flowRows, defaultUnit);\n const completed = rows.map((row) => completeProcessRow(row, { defaultUnit, flowUnitById }));\n const rowReports = completed.map((item) => item.report);\n const files = buildFiles(outPath, outDir);\n const blockers = rowReports.filter((row) => row.status === 'blocked');\n\n const report: ProcessRequiredFieldsReport = {\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n input_path: path.resolve(options.inputPath),\n out_path: path.resolve(outPath),\n out_dir: outDir ? path.resolve(outDir) : null,\n status: blockers.length > 0 ? 'completed_with_blockers' : 'completed',\n default_unit: defaultUnit,\n counts: {\n total: rowReports.length,\n processes: rowReports.filter((row) => row.type === 'process').length,\n completed: rowReports.filter((row) => row.status === 'completed').length,\n existing: rowReports.filter((row) => row.status === 'existing').length,\n blocked: blockers.length,\n skipped: rowReports.filter((row) => row.status === 'skipped').length,\n },\n files,\n rows: rowReports,\n };\n\n writeJsonLinesArtifact(\n files.output_rows,\n completed.map((item) => item.row),\n );\n if (files.report) {\n writeJsonArtifact(files.report, report);\n }\n if (files.evidence) {\n writeJsonLinesArtifact(\n files.evidence,\n rowReports.flatMap((row) =>\n row.completions.map((completion) => ({\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n ...completion,\n })),\n ),\n );\n }\n\n return report;\n}\n\nexport const __testInternals = {\n ANNUAL_SUPPLY_ROOT_FIELD,\n annualSupplyTextParts,\n annualSupplyValueFromText,\n cloneRowWithPayload,\n collectProcessRequiredFieldIssues,\n completeProcessRow,\n ensureDataSources,\n fieldPathFromEvidenceEntry,\n findAnnualSupplyEvidenceValue,\n findAnnualSupplyEvidenceEntry,\n buildFlowUnitIndex,\n inferUnitFromReferenceExchange,\n inferSpecificUnitFromFlowPayload,\n issuePath,\n isAnnualSupplyEvidencePath,\n isValidComplianceDeclaration,\n isValidAnnualSupplyVolume,\n isValidReview,\n normalizeAnnualSupplyEvidenceValue,\n repairRequiredProcessStructures,\n requireOutputPath,\n selectReferenceExchange,\n textValue,\n valueAtPath,\n};\n"]}
@@ -54,15 +54,13 @@ function buildLayout(runRoot, runId) {
54
54
  function resolveLayout(options) {
55
55
  const runId = nonEmptyString(options.runId);
56
56
  const runDir = nonEmptyString(options.runDir);
57
- if (!runId && !runDir) {
58
- throw new CliError('Missing required --run-id or --run-dir for process resume-build.', {
57
+ if (!runDir) {
58
+ throw new CliError('Missing required --run-dir for process resume-build.', {
59
59
  code: 'PROCESS_RESUME_RUN_REQUIRED',
60
60
  exitCode: 2,
61
61
  });
62
62
  }
63
- const runRoot = runDir
64
- ? path.resolve(runDir)
65
- : path.resolve('artifacts', 'process_from_flow', runId);
63
+ const runRoot = path.resolve(runDir);
66
64
  const derivedRunId = path.basename(runRoot);
67
65
  if (runDir && runId && derivedRunId !== runId) {
68
66
  throw new CliError(`process resume-build run-id does not match run-dir basename: ${runId} !== ${derivedRunId}`, {
@@ -252,7 +250,7 @@ function buildNextActions(layout, summary) {
252
250
  summary.next_stage
253
251
  ? `future: migrate CLI stage executor for ${summary.next_stage}`
254
252
  : `future: inspect completed run state for ${layout.runId}`,
255
- `future: tiangong process publish-build --run-id ${layout.runId}`,
253
+ `future: tiangong-lca process publish-build --run-dir ${layout.runRoot}`,
256
254
  ];
257
255
  }
258
256
  function buildAgentHandoffSummary(layout, state, resumeMetadata, summary, now) {
@@ -1 +1 @@
1
- {"version":3,"file":"process-resume-build.js","sourceRoot":"","sources":["../../../src/lib/process-resume-build.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport {\n readJsonArtifact,\n readJsonLinesArtifact,\n writeJsonArtifact,\n writeJsonLinesArtifact,\n} from './artifacts.js';\nimport { CliError } from './errors.js';\nimport { buildResumeMetadata, writeLatestRunId, type RunLayout } from './run.js';\nimport { withStateFileLock } from './state-lock.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nexport type ProcessResumeBuildLayout = {\n runId: string;\n runRoot: string;\n collectionDir: string;\n cacheDir: string;\n manifestsDir: string;\n reportsDir: string;\n latestRunIdPath: string;\n statePath: string;\n handoffSummaryPath: string;\n runManifestPath: string;\n invocationIndexPath: string;\n resumeMetadataPath: string;\n resumeHistoryPath: string;\n reportPath: string;\n};\n\nexport type ProcessResumeBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'prepared_local_process_resume_run';\n run_id: string;\n run_root: string;\n request_id: string | null;\n resumed_from: string;\n checkpoint: string | null;\n attempt: number;\n state_summary: {\n build_status: string | null;\n next_stage: string | null;\n stop_after: string | null;\n process_count: number;\n matched_exchange_count: number;\n process_dataset_count: number;\n source_dataset_count: number;\n };\n files: {\n state: string;\n handoff_summary: string;\n run_manifest: string;\n invocation_index: string;\n resume_metadata: string;\n resume_history: string;\n report: string;\n };\n next_actions: string[];\n};\n\nexport type RunProcessResumeBuildOptions = {\n runId?: string;\n runDir?: string | null;\n now?: Date;\n cwd?: string;\n};\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized || null;\n}\n\nfunction readRequiredJsonObject(\n filePath: string,\n missingCode: string,\n invalidCode: string,\n label: string,\n): JsonRecord {\n if (!existsSync(filePath)) {\n throw new CliError(`Required process resume artifact not found: ${filePath}`, {\n code: missingCode,\n exitCode: 2,\n details: { label, filePath },\n });\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected process resume artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { label, filePath },\n });\n }\n\n return value;\n}\n\nfunction buildLayout(runRoot: string, runId: string): ProcessResumeBuildLayout {\n const collectionDir = path.dirname(runRoot);\n\n return {\n runId,\n runRoot,\n collectionDir,\n cacheDir: path.join(runRoot, 'cache'),\n manifestsDir: path.join(runRoot, 'manifests'),\n reportsDir: path.join(runRoot, 'reports'),\n latestRunIdPath: path.join(collectionDir, '.latest_run_id'),\n statePath: path.join(runRoot, 'cache', 'process_from_flow_state.json'),\n handoffSummaryPath: path.join(runRoot, 'cache', 'agent_handoff_summary.json'),\n runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),\n invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),\n resumeMetadataPath: path.join(runRoot, 'manifests', 'resume-metadata.json'),\n resumeHistoryPath: path.join(runRoot, 'manifests', 'resume-history.jsonl'),\n reportPath: path.join(runRoot, 'reports', 'process-resume-build-report.json'),\n };\n}\n\nfunction resolveLayout(options: RunProcessResumeBuildOptions): ProcessResumeBuildLayout {\n const runId = nonEmptyString(options.runId);\n const runDir = nonEmptyString(options.runDir);\n\n if (!runId && !runDir) {\n throw new CliError('Missing required --run-id or --run-dir for process resume-build.', {\n code: 'PROCESS_RESUME_RUN_REQUIRED',\n exitCode: 2,\n });\n }\n\n const runRoot = runDir\n ? path.resolve(runDir)\n : path.resolve('artifacts', 'process_from_flow', runId as string);\n const derivedRunId = path.basename(runRoot);\n\n if (runDir && runId && derivedRunId !== runId) {\n throw new CliError(\n `process resume-build run-id does not match run-dir basename: ${runId} !== ${derivedRunId}`,\n {\n code: 'PROCESS_RESUME_RUN_ID_MISMATCH',\n exitCode: 2,\n },\n );\n }\n\n return buildLayout(runRoot, runId ?? derivedRunId);\n}\n\nfunction ensureRunRootExists(layout: ProcessResumeBuildLayout): void {\n if (!existsSync(layout.runRoot)) {\n throw new CliError(`process resume-build run root not found: ${layout.runRoot}`, {\n code: 'PROCESS_RESUME_RUN_NOT_FOUND',\n exitCode: 2,\n });\n }\n}\n\nfunction readRequiredRunManifest(layout: ProcessResumeBuildLayout): JsonRecord {\n const manifest = readRequiredJsonObject(\n layout.runManifestPath,\n 'PROCESS_RESUME_RUN_MANIFEST_MISSING',\n 'PROCESS_RESUME_RUN_MANIFEST_INVALID',\n 'run-manifest',\n );\n\n const manifestRunId = nonEmptyString(manifest.runId);\n if (manifestRunId && manifestRunId !== layout.runId) {\n throw new CliError(\n `process resume-build run manifest runId mismatch: ${layout.runManifestPath}`,\n {\n code: 'PROCESS_RESUME_RUN_MANIFEST_MISMATCH',\n exitCode: 2,\n details: {\n expected: layout.runId,\n actual: manifestRunId,\n },\n },\n );\n }\n\n return manifest;\n}\n\nfunction readRequiredState(layout: ProcessResumeBuildLayout): JsonRecord {\n const state = readRequiredJsonObject(\n layout.statePath,\n 'PROCESS_RESUME_STATE_MISSING',\n 'PROCESS_RESUME_STATE_INVALID',\n 'state',\n );\n\n const stateRunId = nonEmptyString(state.run_id);\n if (stateRunId && stateRunId !== layout.runId) {\n throw new CliError(`process resume-build state run_id mismatch: ${layout.statePath}`, {\n code: 'PROCESS_RESUME_STATE_RUN_ID_MISMATCH',\n exitCode: 2,\n details: {\n expected: layout.runId,\n actual: stateRunId,\n },\n });\n }\n\n return state;\n}\n\nfunction readRequiredHandoffSummary(layout: ProcessResumeBuildLayout): JsonRecord {\n return readRequiredJsonObject(\n layout.handoffSummaryPath,\n 'PROCESS_RESUME_HANDOFF_MISSING',\n 'PROCESS_RESUME_HANDOFF_INVALID',\n 'handoff-summary',\n );\n}\n\nfunction readInvocationIndex(layout: ProcessResumeBuildLayout): JsonRecord {\n if (!existsSync(layout.invocationIndexPath)) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n const value = readJsonArtifact(layout.invocationIndexPath);\n if (!isRecord(value)) {\n throw new CliError(\n `Expected process resume invocation index JSON object: ${layout.invocationIndexPath}`,\n {\n code: 'PROCESS_RESUME_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n if (value.invocations === undefined) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n if (!Array.isArray(value.invocations)) {\n throw new CliError(\n `Expected process resume invocation index to contain an invocations array: ${layout.invocationIndexPath}`,\n {\n code: 'PROCESS_RESUME_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return value;\n}\n\nfunction readResumeHistory(layout: ProcessResumeBuildLayout): JsonRecord[] {\n if (!existsSync(layout.resumeHistoryPath)) {\n return [];\n }\n\n const rows = readJsonLinesArtifact(layout.resumeHistoryPath);\n return rows.map((row, index) => {\n if (!isRecord(row)) {\n throw new CliError(\n `Expected process resume history JSONL rows to be objects: ${layout.resumeHistoryPath}`,\n {\n code: 'PROCESS_RESUME_HISTORY_INVALID',\n exitCode: 2,\n details: { index },\n },\n );\n }\n\n return row;\n });\n}\n\nfunction stateArrayLength(value: unknown): number {\n return Array.isArray(value) ? value.length : 0;\n}\n\nfunction buildStateSummary(state: JsonRecord): ProcessResumeBuildReport['state_summary'] {\n return {\n build_status: nonEmptyString(state.build_status),\n next_stage: nonEmptyString(state.next_stage),\n stop_after: nonEmptyString(state.stop_after),\n process_count: stateArrayLength(state.processes),\n matched_exchange_count: stateArrayLength(state.matched_process_exchanges),\n process_dataset_count: stateArrayLength(state.process_datasets),\n source_dataset_count: stateArrayLength(state.source_datasets),\n };\n}\n\nfunction resolveResumedFrom(state: JsonRecord): string {\n return nonEmptyString(state.next_stage) ?? nonEmptyString(state.build_status) ?? 'unknown';\n}\n\nfunction nextAttempt(history: JsonRecord[]): number {\n return (\n history.reduce((maxAttempt, entry) => {\n const attempt = entry.attempt;\n return typeof attempt === 'number' && Number.isFinite(attempt) && attempt > maxAttempt\n ? attempt\n : maxAttempt;\n }, 0) + 1\n );\n}\n\nfunction updateStepMarkers(stepMarkers: unknown, completedAt: string): JsonRecord {\n const markers = isRecord(stepMarkers) ? { ...stepMarkers } : {};\n markers.resume_prepared = {\n status: 'completed',\n completed_at: completedAt,\n };\n return markers;\n}\n\nfunction buildUpdatedState(state: JsonRecord, resumeMetadata: JsonRecord, now: Date): JsonRecord {\n return {\n ...state,\n build_status: 'resume_prepared',\n stop_after: null,\n resume_attempt: resumeMetadata.attempt,\n resume_requested_at: now.toISOString(),\n last_resume_metadata: resumeMetadata,\n step_markers: updateStepMarkers(state.step_markers, now.toISOString()),\n };\n}\n\nfunction buildInvocationIndex(\n layout: ProcessResumeBuildLayout,\n invocationIndex: JsonRecord,\n options: RunProcessResumeBuildOptions,\n now: Date,\n): JsonRecord {\n const priorInvocations = Array.isArray(invocationIndex.invocations)\n ? [...invocationIndex.invocations]\n : [];\n const command = ['process', 'resume-build'];\n\n if (options.runId) {\n command.push('--run-id', options.runId);\n }\n if (options.runDir) {\n command.push('--run-dir', options.runDir);\n }\n\n return {\n ...invocationIndex,\n schema_version:\n typeof invocationIndex.schema_version === 'number' ? invocationIndex.schema_version : 1,\n invocations: [\n ...priorInvocations,\n {\n command,\n cwd: options.cwd ?? process.cwd(),\n created_at: now.toISOString(),\n run_id: layout.runId,\n run_root: layout.runRoot,\n report_path: layout.reportPath,\n },\n ],\n };\n}\n\nfunction asRunLayout(layout: ProcessResumeBuildLayout): RunLayout {\n return {\n namespace: 'process_from_flow',\n runId: layout.runId,\n artifactsRoot: path.dirname(layout.collectionDir),\n collectionDir: layout.collectionDir,\n runRoot: layout.runRoot,\n cacheDir: layout.cacheDir,\n inputsDir: path.join(layout.runRoot, 'input'),\n outputsDir: path.join(layout.runRoot, 'exports'),\n reportsDir: layout.reportsDir,\n logsDir: path.join(layout.runRoot, 'logs'),\n manifestsDir: layout.manifestsDir,\n latestRunIdPath: layout.latestRunIdPath,\n };\n}\n\nfunction buildNextActions(\n layout: ProcessResumeBuildLayout,\n summary: ProcessResumeBuildReport['state_summary'],\n): string[] {\n return [\n `inspect: ${layout.statePath}`,\n `inspect: ${layout.resumeMetadataPath}`,\n `inspect: ${layout.invocationIndexPath}`,\n summary.next_stage\n ? `future: migrate CLI stage executor for ${summary.next_stage}`\n : `future: inspect completed run state for ${layout.runId}`,\n `future: tiangong process publish-build --run-id ${layout.runId}`,\n ];\n}\n\nfunction buildAgentHandoffSummary(\n layout: ProcessResumeBuildLayout,\n state: JsonRecord,\n resumeMetadata: JsonRecord,\n summary: ProcessResumeBuildReport['state_summary'],\n now: Date,\n): JsonRecord {\n return {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n run_id: layout.runId,\n command: 'process resume-build',\n flow_path: nonEmptyString(state.flow_path),\n operation: nonEmptyString(state.operation),\n stop_after: null,\n process_count: summary.process_count,\n matched_exchange_count: summary.matched_exchange_count,\n process_dataset_count: summary.process_dataset_count,\n source_dataset_count: summary.source_dataset_count,\n remaining_placeholder_refs: stateArrayLength(state.placeholder_resolutions),\n placeholder_examples: [],\n publish_summary: {},\n artifacts: {\n state_path: layout.statePath,\n timing_report: null,\n publish_summary: null,\n llm_cost_report: null,\n process_update_report: null,\n flow_auto_build_manifest: null,\n resume_metadata: layout.resumeMetadataPath,\n resume_history: layout.resumeHistoryPath,\n invocation_index: layout.invocationIndexPath,\n },\n next_actions: buildNextActions(layout, summary),\n extra: {\n status: 'prepared_local_process_resume_run',\n request_id: nonEmptyString(state.request_id),\n resumed_from: resumeMetadata.resumedFrom,\n checkpoint: resumeMetadata.checkpoint,\n attempt: resumeMetadata.attempt,\n },\n };\n}\n\nfunction buildReport(\n layout: ProcessResumeBuildLayout,\n state: JsonRecord,\n resumeMetadata: JsonRecord,\n summary: ProcessResumeBuildReport['state_summary'],\n now: Date,\n): ProcessResumeBuildReport {\n return {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n status: 'prepared_local_process_resume_run',\n run_id: layout.runId,\n run_root: layout.runRoot,\n request_id: nonEmptyString(state.request_id),\n resumed_from: String(resumeMetadata.resumedFrom),\n checkpoint: resumeMetadata.checkpoint === null ? null : String(resumeMetadata.checkpoint ?? ''),\n attempt: Number(resumeMetadata.attempt ?? 1),\n state_summary: summary,\n files: {\n state: layout.statePath,\n handoff_summary: layout.handoffSummaryPath,\n run_manifest: layout.runManifestPath,\n invocation_index: layout.invocationIndexPath,\n resume_metadata: layout.resumeMetadataPath,\n resume_history: layout.resumeHistoryPath,\n report: layout.reportPath,\n },\n next_actions: buildNextActions(layout, summary),\n };\n}\n\nexport async function runProcessResumeBuild(\n options: RunProcessResumeBuildOptions,\n): Promise<ProcessResumeBuildReport> {\n const now = options.now ?? new Date();\n const layout = resolveLayout(options);\n ensureRunRootExists(layout);\n readRequiredRunManifest(layout);\n readRequiredHandoffSummary(layout);\n const history = readResumeHistory(layout);\n const invocationIndex = readInvocationIndex(layout);\n\n return await withStateFileLock(\n layout.statePath,\n { reason: 'process-resume-build.prepare_resume', now },\n () => {\n const state = readRequiredState(layout);\n const resumeMetadata = buildResumeMetadata({\n runId: layout.runId,\n resumedFrom: resolveResumedFrom(state),\n checkpoint: nonEmptyString(state.stop_after),\n attempt: nextAttempt(history),\n resumedAt: now,\n });\n const updatedState = buildUpdatedState(state, resumeMetadata, now);\n const summary = buildStateSummary(updatedState);\n const updatedInvocationIndex = buildInvocationIndex(layout, invocationIndex, options, now);\n const handoffSummary = buildAgentHandoffSummary(\n layout,\n updatedState,\n resumeMetadata,\n summary,\n now,\n );\n const report = buildReport(layout, updatedState, resumeMetadata, summary, now);\n\n writeJsonArtifact(layout.statePath, updatedState);\n writeJsonArtifact(layout.invocationIndexPath, updatedInvocationIndex);\n writeJsonArtifact(layout.resumeMetadataPath, resumeMetadata);\n writeJsonLinesArtifact(layout.resumeHistoryPath, resumeMetadata, { append: true });\n writeJsonArtifact(layout.handoffSummaryPath, handoffSummary);\n writeLatestRunId(asRunLayout(layout), layout.runId);\n writeJsonArtifact(layout.reportPath, report);\n\n return report;\n },\n );\n}\n\n// Exposed for deterministic unit coverage of process resume-build helpers.\nexport const __testInternals = {\n buildLayout,\n resolveLayout,\n buildStateSummary,\n resolveResumedFrom,\n nextAttempt,\n updateStepMarkers,\n buildUpdatedState,\n buildInvocationIndex,\n buildNextActions,\n buildReport,\n};\n"]}
1
+ {"version":3,"file":"process-resume-build.js","sourceRoot":"","sources":["../../../src/lib/process-resume-build.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport {\n readJsonArtifact,\n readJsonLinesArtifact,\n writeJsonArtifact,\n writeJsonLinesArtifact,\n} from './artifacts.js';\nimport { CliError } from './errors.js';\nimport { buildResumeMetadata, writeLatestRunId, type RunLayout } from './run.js';\nimport { withStateFileLock } from './state-lock.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nexport type ProcessResumeBuildLayout = {\n runId: string;\n runRoot: string;\n collectionDir: string;\n cacheDir: string;\n manifestsDir: string;\n reportsDir: string;\n latestRunIdPath: string;\n statePath: string;\n handoffSummaryPath: string;\n runManifestPath: string;\n invocationIndexPath: string;\n resumeMetadataPath: string;\n resumeHistoryPath: string;\n reportPath: string;\n};\n\nexport type ProcessResumeBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'prepared_local_process_resume_run';\n run_id: string;\n run_root: string;\n request_id: string | null;\n resumed_from: string;\n checkpoint: string | null;\n attempt: number;\n state_summary: {\n build_status: string | null;\n next_stage: string | null;\n stop_after: string | null;\n process_count: number;\n matched_exchange_count: number;\n process_dataset_count: number;\n source_dataset_count: number;\n };\n files: {\n state: string;\n handoff_summary: string;\n run_manifest: string;\n invocation_index: string;\n resume_metadata: string;\n resume_history: string;\n report: string;\n };\n next_actions: string[];\n};\n\nexport type RunProcessResumeBuildOptions = {\n runId?: string;\n runDir?: string | null;\n now?: Date;\n cwd?: string;\n};\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized || null;\n}\n\nfunction readRequiredJsonObject(\n filePath: string,\n missingCode: string,\n invalidCode: string,\n label: string,\n): JsonRecord {\n if (!existsSync(filePath)) {\n throw new CliError(`Required process resume artifact not found: ${filePath}`, {\n code: missingCode,\n exitCode: 2,\n details: { label, filePath },\n });\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected process resume artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { label, filePath },\n });\n }\n\n return value;\n}\n\nfunction buildLayout(runRoot: string, runId: string): ProcessResumeBuildLayout {\n const collectionDir = path.dirname(runRoot);\n\n return {\n runId,\n runRoot,\n collectionDir,\n cacheDir: path.join(runRoot, 'cache'),\n manifestsDir: path.join(runRoot, 'manifests'),\n reportsDir: path.join(runRoot, 'reports'),\n latestRunIdPath: path.join(collectionDir, '.latest_run_id'),\n statePath: path.join(runRoot, 'cache', 'process_from_flow_state.json'),\n handoffSummaryPath: path.join(runRoot, 'cache', 'agent_handoff_summary.json'),\n runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),\n invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),\n resumeMetadataPath: path.join(runRoot, 'manifests', 'resume-metadata.json'),\n resumeHistoryPath: path.join(runRoot, 'manifests', 'resume-history.jsonl'),\n reportPath: path.join(runRoot, 'reports', 'process-resume-build-report.json'),\n };\n}\n\nfunction resolveLayout(options: RunProcessResumeBuildOptions): ProcessResumeBuildLayout {\n const runId = nonEmptyString(options.runId);\n const runDir = nonEmptyString(options.runDir);\n\n if (!runDir) {\n throw new CliError('Missing required --run-dir for process resume-build.', {\n code: 'PROCESS_RESUME_RUN_REQUIRED',\n exitCode: 2,\n });\n }\n\n const runRoot = path.resolve(runDir);\n const derivedRunId = path.basename(runRoot);\n\n if (runDir && runId && derivedRunId !== runId) {\n throw new CliError(\n `process resume-build run-id does not match run-dir basename: ${runId} !== ${derivedRunId}`,\n {\n code: 'PROCESS_RESUME_RUN_ID_MISMATCH',\n exitCode: 2,\n },\n );\n }\n\n return buildLayout(runRoot, runId ?? derivedRunId);\n}\n\nfunction ensureRunRootExists(layout: ProcessResumeBuildLayout): void {\n if (!existsSync(layout.runRoot)) {\n throw new CliError(`process resume-build run root not found: ${layout.runRoot}`, {\n code: 'PROCESS_RESUME_RUN_NOT_FOUND',\n exitCode: 2,\n });\n }\n}\n\nfunction readRequiredRunManifest(layout: ProcessResumeBuildLayout): JsonRecord {\n const manifest = readRequiredJsonObject(\n layout.runManifestPath,\n 'PROCESS_RESUME_RUN_MANIFEST_MISSING',\n 'PROCESS_RESUME_RUN_MANIFEST_INVALID',\n 'run-manifest',\n );\n\n const manifestRunId = nonEmptyString(manifest.runId);\n if (manifestRunId && manifestRunId !== layout.runId) {\n throw new CliError(\n `process resume-build run manifest runId mismatch: ${layout.runManifestPath}`,\n {\n code: 'PROCESS_RESUME_RUN_MANIFEST_MISMATCH',\n exitCode: 2,\n details: {\n expected: layout.runId,\n actual: manifestRunId,\n },\n },\n );\n }\n\n return manifest;\n}\n\nfunction readRequiredState(layout: ProcessResumeBuildLayout): JsonRecord {\n const state = readRequiredJsonObject(\n layout.statePath,\n 'PROCESS_RESUME_STATE_MISSING',\n 'PROCESS_RESUME_STATE_INVALID',\n 'state',\n );\n\n const stateRunId = nonEmptyString(state.run_id);\n if (stateRunId && stateRunId !== layout.runId) {\n throw new CliError(`process resume-build state run_id mismatch: ${layout.statePath}`, {\n code: 'PROCESS_RESUME_STATE_RUN_ID_MISMATCH',\n exitCode: 2,\n details: {\n expected: layout.runId,\n actual: stateRunId,\n },\n });\n }\n\n return state;\n}\n\nfunction readRequiredHandoffSummary(layout: ProcessResumeBuildLayout): JsonRecord {\n return readRequiredJsonObject(\n layout.handoffSummaryPath,\n 'PROCESS_RESUME_HANDOFF_MISSING',\n 'PROCESS_RESUME_HANDOFF_INVALID',\n 'handoff-summary',\n );\n}\n\nfunction readInvocationIndex(layout: ProcessResumeBuildLayout): JsonRecord {\n if (!existsSync(layout.invocationIndexPath)) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n const value = readJsonArtifact(layout.invocationIndexPath);\n if (!isRecord(value)) {\n throw new CliError(\n `Expected process resume invocation index JSON object: ${layout.invocationIndexPath}`,\n {\n code: 'PROCESS_RESUME_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n if (value.invocations === undefined) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n if (!Array.isArray(value.invocations)) {\n throw new CliError(\n `Expected process resume invocation index to contain an invocations array: ${layout.invocationIndexPath}`,\n {\n code: 'PROCESS_RESUME_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return value;\n}\n\nfunction readResumeHistory(layout: ProcessResumeBuildLayout): JsonRecord[] {\n if (!existsSync(layout.resumeHistoryPath)) {\n return [];\n }\n\n const rows = readJsonLinesArtifact(layout.resumeHistoryPath);\n return rows.map((row, index) => {\n if (!isRecord(row)) {\n throw new CliError(\n `Expected process resume history JSONL rows to be objects: ${layout.resumeHistoryPath}`,\n {\n code: 'PROCESS_RESUME_HISTORY_INVALID',\n exitCode: 2,\n details: { index },\n },\n );\n }\n\n return row;\n });\n}\n\nfunction stateArrayLength(value: unknown): number {\n return Array.isArray(value) ? value.length : 0;\n}\n\nfunction buildStateSummary(state: JsonRecord): ProcessResumeBuildReport['state_summary'] {\n return {\n build_status: nonEmptyString(state.build_status),\n next_stage: nonEmptyString(state.next_stage),\n stop_after: nonEmptyString(state.stop_after),\n process_count: stateArrayLength(state.processes),\n matched_exchange_count: stateArrayLength(state.matched_process_exchanges),\n process_dataset_count: stateArrayLength(state.process_datasets),\n source_dataset_count: stateArrayLength(state.source_datasets),\n };\n}\n\nfunction resolveResumedFrom(state: JsonRecord): string {\n return nonEmptyString(state.next_stage) ?? nonEmptyString(state.build_status) ?? 'unknown';\n}\n\nfunction nextAttempt(history: JsonRecord[]): number {\n return (\n history.reduce((maxAttempt, entry) => {\n const attempt = entry.attempt;\n return typeof attempt === 'number' && Number.isFinite(attempt) && attempt > maxAttempt\n ? attempt\n : maxAttempt;\n }, 0) + 1\n );\n}\n\nfunction updateStepMarkers(stepMarkers: unknown, completedAt: string): JsonRecord {\n const markers = isRecord(stepMarkers) ? { ...stepMarkers } : {};\n markers.resume_prepared = {\n status: 'completed',\n completed_at: completedAt,\n };\n return markers;\n}\n\nfunction buildUpdatedState(state: JsonRecord, resumeMetadata: JsonRecord, now: Date): JsonRecord {\n return {\n ...state,\n build_status: 'resume_prepared',\n stop_after: null,\n resume_attempt: resumeMetadata.attempt,\n resume_requested_at: now.toISOString(),\n last_resume_metadata: resumeMetadata,\n step_markers: updateStepMarkers(state.step_markers, now.toISOString()),\n };\n}\n\nfunction buildInvocationIndex(\n layout: ProcessResumeBuildLayout,\n invocationIndex: JsonRecord,\n options: RunProcessResumeBuildOptions,\n now: Date,\n): JsonRecord {\n const priorInvocations = Array.isArray(invocationIndex.invocations)\n ? [...invocationIndex.invocations]\n : [];\n const command = ['process', 'resume-build'];\n\n if (options.runId) {\n command.push('--run-id', options.runId);\n }\n if (options.runDir) {\n command.push('--run-dir', options.runDir);\n }\n\n return {\n ...invocationIndex,\n schema_version:\n typeof invocationIndex.schema_version === 'number' ? invocationIndex.schema_version : 1,\n invocations: [\n ...priorInvocations,\n {\n command,\n cwd: options.cwd ?? process.cwd(),\n created_at: now.toISOString(),\n run_id: layout.runId,\n run_root: layout.runRoot,\n report_path: layout.reportPath,\n },\n ],\n };\n}\n\nfunction asRunLayout(layout: ProcessResumeBuildLayout): RunLayout {\n return {\n namespace: 'process_from_flow',\n runId: layout.runId,\n artifactsRoot: path.dirname(layout.collectionDir),\n collectionDir: layout.collectionDir,\n runRoot: layout.runRoot,\n cacheDir: layout.cacheDir,\n inputsDir: path.join(layout.runRoot, 'input'),\n outputsDir: path.join(layout.runRoot, 'exports'),\n reportsDir: layout.reportsDir,\n logsDir: path.join(layout.runRoot, 'logs'),\n manifestsDir: layout.manifestsDir,\n latestRunIdPath: layout.latestRunIdPath,\n };\n}\n\nfunction buildNextActions(\n layout: ProcessResumeBuildLayout,\n summary: ProcessResumeBuildReport['state_summary'],\n): string[] {\n return [\n `inspect: ${layout.statePath}`,\n `inspect: ${layout.resumeMetadataPath}`,\n `inspect: ${layout.invocationIndexPath}`,\n summary.next_stage\n ? `future: migrate CLI stage executor for ${summary.next_stage}`\n : `future: inspect completed run state for ${layout.runId}`,\n `future: tiangong-lca process publish-build --run-dir ${layout.runRoot}`,\n ];\n}\n\nfunction buildAgentHandoffSummary(\n layout: ProcessResumeBuildLayout,\n state: JsonRecord,\n resumeMetadata: JsonRecord,\n summary: ProcessResumeBuildReport['state_summary'],\n now: Date,\n): JsonRecord {\n return {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n run_id: layout.runId,\n command: 'process resume-build',\n flow_path: nonEmptyString(state.flow_path),\n operation: nonEmptyString(state.operation),\n stop_after: null,\n process_count: summary.process_count,\n matched_exchange_count: summary.matched_exchange_count,\n process_dataset_count: summary.process_dataset_count,\n source_dataset_count: summary.source_dataset_count,\n remaining_placeholder_refs: stateArrayLength(state.placeholder_resolutions),\n placeholder_examples: [],\n publish_summary: {},\n artifacts: {\n state_path: layout.statePath,\n timing_report: null,\n publish_summary: null,\n llm_cost_report: null,\n process_update_report: null,\n flow_auto_build_manifest: null,\n resume_metadata: layout.resumeMetadataPath,\n resume_history: layout.resumeHistoryPath,\n invocation_index: layout.invocationIndexPath,\n },\n next_actions: buildNextActions(layout, summary),\n extra: {\n status: 'prepared_local_process_resume_run',\n request_id: nonEmptyString(state.request_id),\n resumed_from: resumeMetadata.resumedFrom,\n checkpoint: resumeMetadata.checkpoint,\n attempt: resumeMetadata.attempt,\n },\n };\n}\n\nfunction buildReport(\n layout: ProcessResumeBuildLayout,\n state: JsonRecord,\n resumeMetadata: JsonRecord,\n summary: ProcessResumeBuildReport['state_summary'],\n now: Date,\n): ProcessResumeBuildReport {\n return {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n status: 'prepared_local_process_resume_run',\n run_id: layout.runId,\n run_root: layout.runRoot,\n request_id: nonEmptyString(state.request_id),\n resumed_from: String(resumeMetadata.resumedFrom),\n checkpoint: resumeMetadata.checkpoint === null ? null : String(resumeMetadata.checkpoint ?? ''),\n attempt: Number(resumeMetadata.attempt ?? 1),\n state_summary: summary,\n files: {\n state: layout.statePath,\n handoff_summary: layout.handoffSummaryPath,\n run_manifest: layout.runManifestPath,\n invocation_index: layout.invocationIndexPath,\n resume_metadata: layout.resumeMetadataPath,\n resume_history: layout.resumeHistoryPath,\n report: layout.reportPath,\n },\n next_actions: buildNextActions(layout, summary),\n };\n}\n\nexport async function runProcessResumeBuild(\n options: RunProcessResumeBuildOptions,\n): Promise<ProcessResumeBuildReport> {\n const now = options.now ?? new Date();\n const layout = resolveLayout(options);\n ensureRunRootExists(layout);\n readRequiredRunManifest(layout);\n readRequiredHandoffSummary(layout);\n const history = readResumeHistory(layout);\n const invocationIndex = readInvocationIndex(layout);\n\n return await withStateFileLock(\n layout.statePath,\n { reason: 'process-resume-build.prepare_resume', now },\n () => {\n const state = readRequiredState(layout);\n const resumeMetadata = buildResumeMetadata({\n runId: layout.runId,\n resumedFrom: resolveResumedFrom(state),\n checkpoint: nonEmptyString(state.stop_after),\n attempt: nextAttempt(history),\n resumedAt: now,\n });\n const updatedState = buildUpdatedState(state, resumeMetadata, now);\n const summary = buildStateSummary(updatedState);\n const updatedInvocationIndex = buildInvocationIndex(layout, invocationIndex, options, now);\n const handoffSummary = buildAgentHandoffSummary(\n layout,\n updatedState,\n resumeMetadata,\n summary,\n now,\n );\n const report = buildReport(layout, updatedState, resumeMetadata, summary, now);\n\n writeJsonArtifact(layout.statePath, updatedState);\n writeJsonArtifact(layout.invocationIndexPath, updatedInvocationIndex);\n writeJsonArtifact(layout.resumeMetadataPath, resumeMetadata);\n writeJsonLinesArtifact(layout.resumeHistoryPath, resumeMetadata, { append: true });\n writeJsonArtifact(layout.handoffSummaryPath, handoffSummary);\n writeLatestRunId(asRunLayout(layout), layout.runId);\n writeJsonArtifact(layout.reportPath, report);\n\n return report;\n },\n );\n}\n\n// Exposed for deterministic unit coverage of process resume-build helpers.\nexport const __testInternals = {\n buildLayout,\n resolveLayout,\n buildStateSummary,\n resolveResumedFrom,\n nextAttempt,\n updateStepMarkers,\n buildUpdatedState,\n buildInvocationIndex,\n buildNextActions,\n buildReport,\n};\n"]}
@@ -3,6 +3,7 @@ import path from 'node:path';
3
3
  import { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';
4
4
  import { CliError } from './errors.js';
5
5
  import { readJsonInput } from './io.js';
6
+ import { summarizeProcessPayloadValidation, validateProcessPayload, } from './process-payload-validation.js';
6
7
  import { collectPublishInputs, normalizePublishRequest, } from './publish.js';
7
8
  import { syncStateAwareProcessRecord, } from './process-save-draft.js';
8
9
  import { buildRunId, resolveRunLayout } from './run.js';
@@ -72,7 +73,7 @@ function looksLikePublishRequest(value) {
72
73
  }
73
74
  function loadProcessPayloadFromDatasetEntry(entry, baseDir) {
74
75
  if (isRecord(entry)) {
75
- for (const key of ['json_ordered', 'jsonOrdered', 'payload']) {
76
+ for (const key of ['json_ordered', 'jsonOrdered', 'payload', 'process']) {
76
77
  const candidate = entry[key];
77
78
  if (isRecord(candidate)) {
78
79
  return candidate;
@@ -138,17 +139,35 @@ function processPayloadFromRow(row) {
138
139
  if (isRecord(row.json)) {
139
140
  return row.json;
140
141
  }
142
+ if (isRecord(row.process)) {
143
+ return row.process;
144
+ }
141
145
  return row;
142
146
  }
143
- function candidateFromPayload(payload, source, bundlePath) {
147
+ function candidateFromPayload(payload, source, bundlePath, validateProcessPayloadImpl) {
144
148
  try {
145
149
  const [id, version] = extractProcessIdentity(payload);
150
+ const validation = validateProcessPayloadImpl(payload);
151
+ if (!validation.ok) {
152
+ return {
153
+ id,
154
+ version,
155
+ source,
156
+ bundle_path: bundlePath,
157
+ payload,
158
+ validation,
159
+ error: {
160
+ message: summarizeProcessPayloadValidation(validation),
161
+ },
162
+ };
163
+ }
146
164
  return {
147
165
  id,
148
166
  version,
149
167
  source,
150
168
  bundle_path: bundlePath,
151
169
  payload,
170
+ validation,
152
171
  };
153
172
  }
154
173
  catch (error) {
@@ -169,10 +188,10 @@ function candidateFromPayload(payload, source, bundlePath) {
169
188
  function sourceFromPublishOrigin(origin) {
170
189
  return origin.source === 'bundle' ? 'bundle' : 'input';
171
190
  }
172
- function candidateFromPublishEntry(entry) {
173
- return candidateFromPayload(loadProcessPayloadFromDatasetEntry(entry.entry, entry.origin.base_dir), sourceFromPublishOrigin(entry.origin), entry.origin.bundle_path);
191
+ function candidateFromPublishEntry(entry, validateProcessPayloadImpl) {
192
+ return candidateFromPayload(loadProcessPayloadFromDatasetEntry(entry.entry, entry.origin.base_dir), sourceFromPublishOrigin(entry.origin), entry.origin.bundle_path, validateProcessPayloadImpl);
174
193
  }
175
- function prepareRowsFileInput(inputPath, rawInput) {
194
+ function prepareRowsFileInput(inputPath, rawInput, validateProcessPayloadImpl) {
176
195
  const rows = Array.isArray(rawInput) ? rawInput : [rawInput];
177
196
  const normalizedRows = rows.map((row, index) => {
178
197
  if (!isRecord(row)) {
@@ -190,10 +209,10 @@ function prepareRowsFileInput(inputPath, rawInput) {
190
209
  input_path: inputPath,
191
210
  row_count: normalizedRows.length,
192
211
  },
193
- processes: normalizedRows.map((row) => candidateFromPayload(processPayloadFromRow(row), 'rows_file', null)),
212
+ processes: normalizedRows.map((row) => candidateFromPayload(processPayloadFromRow(row), 'rows_file', null, validateProcessPayloadImpl)),
194
213
  };
195
214
  }
196
- function preparePublishRequestInput(inputPath, rawInput, commit, now) {
215
+ function preparePublishRequestInput(inputPath, rawInput, commit, now, validateProcessPayloadImpl) {
197
216
  const normalized = normalizePublishRequest(rawInput, {
198
217
  requestPath: inputPath,
199
218
  commitOverride: commit,
@@ -203,13 +222,13 @@ function preparePublishRequestInput(inputPath, rawInput, commit, now) {
203
222
  return {
204
223
  inputKind: 'publish_request',
205
224
  normalizedInput: normalized,
206
- processes: collected.processes.map(candidateFromPublishEntry),
225
+ processes: collected.processes.map((entry) => candidateFromPublishEntry(entry, validateProcessPayloadImpl)),
207
226
  };
208
227
  }
209
- function prepareProcessSaveDraftInput(inputPath, rawInput, commit, now) {
228
+ function prepareProcessSaveDraftInput(inputPath, rawInput, commit, now, validateProcessPayloadImpl) {
210
229
  return looksLikePublishRequest(rawInput)
211
- ? preparePublishRequestInput(inputPath, rawInput, commit, now)
212
- : prepareRowsFileInput(inputPath, rawInput);
230
+ ? preparePublishRequestInput(inputPath, rawInput, commit, now, validateProcessPayloadImpl)
231
+ : prepareRowsFileInput(inputPath, rawInput, validateProcessPayloadImpl);
213
232
  }
214
233
  function defaultOutDir(inputPath, commit, now) {
215
234
  const runId = buildRunId({
@@ -239,6 +258,7 @@ function compactCandidate(candidate) {
239
258
  source: candidate.source,
240
259
  bundle_path: candidate.bundle_path,
241
260
  payload: candidate.payload,
261
+ ...(candidate.validation ? { validation: candidate.validation } : {}),
242
262
  ...(candidate.error ? { error: candidate.error } : {}),
243
263
  };
244
264
  }
@@ -247,7 +267,8 @@ export async function runProcessSaveDraft(options) {
247
267
  const inputPath = path.resolve(options.inputPath);
248
268
  const commit = options.commit === true;
249
269
  const rawInput = options.rawInput ?? readStructuredInput(inputPath);
250
- const prepared = prepareProcessSaveDraftInput(inputPath, rawInput, commit, now);
270
+ const validateProcessPayloadImpl = options.validateProcessPayloadImpl ?? validateProcessPayload;
271
+ const prepared = prepareProcessSaveDraftInput(inputPath, rawInput, commit, now, validateProcessPayloadImpl);
251
272
  const outDir = resolveOutDir(inputPath, options.outDir, commit, now);
252
273
  const files = buildFiles(outDir);
253
274
  if (commit && (!options.env || !options.fetchImpl)) {
@@ -266,6 +287,7 @@ export async function runProcessSaveDraft(options) {
266
287
  source: candidate.source,
267
288
  bundle_path: candidate.bundle_path,
268
289
  status: 'prepared',
290
+ ...(candidate.validation ? { validation: candidate.validation } : {}),
269
291
  };
270
292
  if (candidate.error) {
271
293
  report.status = 'failed';
@@ -286,7 +308,7 @@ export async function runProcessSaveDraft(options) {
286
308
  fetchImpl: options.fetchImpl,
287
309
  timeoutMs: options.timeoutMs,
288
310
  audit: {
289
- command: 'tiangong process save-draft',
311
+ command: 'tiangong-lca process save-draft',
290
312
  source: candidate.source,
291
313
  bundle_path: candidate.bundle_path,
292
314
  },
@@ -1 +1 @@
1
- {"version":3,"file":"process-save-draft-run.js","sourceRoot":"","sources":["../../../src/lib/process-save-draft-run.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { readJsonInput } from './io.js';\nimport {\n collectPublishInputs,\n normalizePublishRequest,\n type PublishCollectedDatasetEntry,\n type PublishCollectedOrigin,\n} from './publish.js';\nimport {\n syncStateAwareProcessRecord,\n type ProcessStateAwareWriteResult,\n} from './process-save-draft.js';\nimport { buildRunId, resolveRunLayout } from './run.js';\n\ntype JsonObject = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction first_non_empty(...values: unknown[]): string | null {\n for (const value of values) {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction resolve_path(baseDir: string, value: string): string {\n return path.resolve(baseDir, value);\n}\n\nfunction serialize_error(error: unknown): { message: string } {\n if (error instanceof Error) {\n return { message: error.message };\n }\n return { message: String(error) };\n}\n\nfunction readJsonLinesInput(inputPath: string): JsonObject[] {\n const resolved = path.resolve(inputPath);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code: 'INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n return readFileSync(resolved, 'utf8')\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n try {\n const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed)) {\n throw new CliError(\n `Expected JSON object rows in JSONL input: ${resolved} (line ${index + 1})`,\n {\n code: 'INPUT_INVALID_JSONL_ROW',\n exitCode: 2,\n },\n );\n }\n return parsed;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n throw new CliError(`Input file contains invalid JSONL at line ${index + 1}: ${resolved}`, {\n code: 'INPUT_INVALID_JSONL',\n exitCode: 2,\n details: String(error),\n });\n }\n });\n}\n\nfunction readStructuredInput(inputPath: string): unknown {\n return inputPath.toLowerCase().endsWith('.jsonl')\n ? readJsonLinesInput(inputPath)\n : readJsonInput(inputPath);\n}\n\nfunction looksLikePublishRequest(value: unknown): boolean {\n return (\n isRecord(value) &&\n ('inputs' in value || 'publish' in value || 'out_dir' in value || 'output_dir' in value)\n );\n}\n\nfunction loadProcessPayloadFromDatasetEntry(entry: unknown, baseDir: string): JsonObject {\n if (isRecord(entry)) {\n for (const key of ['json_ordered', 'jsonOrdered', 'payload'] as const) {\n const candidate = entry[key];\n if (isRecord(candidate)) {\n return candidate;\n }\n }\n\n const fileValue = first_non_empty(entry.file, entry.path);\n if (fileValue) {\n const filePath = resolve_path(baseDir, fileValue);\n const loaded = readJsonInput(filePath);\n if (!isRecord(loaded)) {\n throw new CliError(`Expected JSON object input: ${filePath}`, {\n code: 'PROCESS_SAVE_DRAFT_INPUT_NOT_OBJECT',\n exitCode: 2,\n });\n }\n return loaded;\n }\n\n return entry;\n }\n\n if (typeof entry === 'string' && entry.trim()) {\n const filePath = resolve_path(baseDir, entry);\n const loaded = readJsonInput(filePath);\n if (!isRecord(loaded)) {\n throw new CliError(`Expected JSON object input: ${filePath}`, {\n code: 'PROCESS_SAVE_DRAFT_INPUT_NOT_OBJECT',\n exitCode: 2,\n });\n }\n return loaded;\n }\n\n throw new CliError('Unsupported process save-draft dataset entry.', {\n code: 'PROCESS_SAVE_DRAFT_UNSUPPORTED_ENTRY',\n exitCode: 2,\n details: entry,\n });\n}\n\nfunction extractProcessIdentity(payload: JsonObject): [string, string] {\n const root = isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n const processInformation = isRecord(root.processInformation) ? root.processInformation : {};\n const dataSetInformation = isRecord(processInformation.dataSetInformation)\n ? processInformation.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n const datasetId = first_non_empty(dataSetInformation['common:UUID']);\n const version = first_non_empty(publicationAndOwnership['common:dataSetVersion'], '01.01.000')!;\n\n if (!datasetId) {\n throw new CliError(\n 'Process payload missing processInformation.dataSetInformation.common:UUID.',\n {\n code: 'PUBLISH_PROCESS_ID_MISSING',\n exitCode: 2,\n },\n );\n }\n\n return [datasetId, version];\n}\n\nfunction processPayloadFromRow(row: JsonObject): JsonObject {\n if (isRecord(row.json_ordered)) {\n return row.json_ordered;\n }\n\n if (isRecord(row.json)) {\n return row.json;\n }\n\n return row;\n}\n\nexport type ProcessSaveDraftSource = 'rows_file' | 'bundle' | 'input';\n\nexport type ProcessSaveDraftCandidate = {\n id: string | null;\n version: string | null;\n source: ProcessSaveDraftSource;\n bundle_path: string | null;\n payload: JsonObject;\n error?: { message: string };\n};\n\nexport type ProcessSaveDraftProcessReport = {\n id: string | null;\n version: string | null;\n source: ProcessSaveDraftSource;\n bundle_path: string | null;\n status: 'prepared' | 'executed' | 'failed';\n execution?: ProcessStateAwareWriteResult;\n error?: { message: string };\n};\n\nexport type ProcessSaveDraftReport = {\n generated_at_utc: string;\n input_path: string;\n input_kind: 'rows_file' | 'publish_request';\n out_dir: string;\n commit: boolean;\n mode: 'dry_run' | 'commit';\n status: 'completed' | 'completed_with_failures';\n counts: {\n selected: number;\n prepared: number;\n executed: number;\n failed: number;\n };\n files: {\n normalized_input: string;\n selected_processes: string;\n progress_jsonl: string;\n failures_jsonl: string;\n summary_json: string;\n };\n processes: ProcessSaveDraftProcessReport[];\n};\n\nexport type RunProcessSaveDraftOptions = {\n inputPath: string;\n outDir?: string | null;\n commit?: boolean | null;\n rawInput?: unknown;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\ntype PreparedProcessSaveDraftInput = {\n inputKind: 'rows_file' | 'publish_request';\n normalizedInput: unknown;\n processes: ProcessSaveDraftCandidate[];\n};\n\nfunction candidateFromPayload(\n payload: JsonObject,\n source: ProcessSaveDraftSource,\n bundlePath: string | null,\n): ProcessSaveDraftCandidate {\n try {\n const [id, version] = extractProcessIdentity(payload);\n return {\n id,\n version,\n source,\n bundle_path: bundlePath,\n payload,\n };\n } catch (error) {\n return {\n id: first_non_empty(payload['@id'], payload.id),\n version: first_non_empty(payload['@version'], payload.version, '01.01.000'),\n source,\n bundle_path: bundlePath,\n payload,\n error:\n error instanceof CliError && error.code === 'PUBLISH_PROCESS_ID_MISSING'\n ? {\n message:\n 'Payload is not a canonical processDataSet wrapper; process save-draft only supports canonical process datasets.',\n }\n : serialize_error(error),\n };\n }\n}\n\nfunction sourceFromPublishOrigin(origin: PublishCollectedOrigin): ProcessSaveDraftSource {\n return origin.source === 'bundle' ? 'bundle' : 'input';\n}\n\nfunction candidateFromPublishEntry(entry: PublishCollectedDatasetEntry): ProcessSaveDraftCandidate {\n return candidateFromPayload(\n loadProcessPayloadFromDatasetEntry(entry.entry, entry.origin.base_dir),\n sourceFromPublishOrigin(entry.origin),\n entry.origin.bundle_path,\n );\n}\n\nfunction prepareRowsFileInput(inputPath: string, rawInput: unknown): PreparedProcessSaveDraftInput {\n const rows = Array.isArray(rawInput) ? rawInput : [rawInput];\n const normalizedRows = rows.map((row, index) => {\n if (!isRecord(row)) {\n throw new CliError(\n `Expected JSON object rows in process save-draft input: ${inputPath} (index ${index})`,\n {\n code: 'PROCESS_SAVE_DRAFT_INVALID_ROW',\n exitCode: 2,\n },\n );\n }\n return row;\n });\n\n return {\n inputKind: 'rows_file',\n normalizedInput: {\n input_kind: 'rows_file',\n input_path: inputPath,\n row_count: normalizedRows.length,\n },\n processes: normalizedRows.map((row) =>\n candidateFromPayload(processPayloadFromRow(row), 'rows_file', null),\n ),\n };\n}\n\nfunction preparePublishRequestInput(\n inputPath: string,\n rawInput: unknown,\n commit: boolean,\n now: Date,\n): PreparedProcessSaveDraftInput {\n const normalized = normalizePublishRequest(rawInput, {\n requestPath: inputPath,\n commitOverride: commit,\n now,\n });\n const collected = collectPublishInputs(normalized, path.dirname(inputPath));\n\n return {\n inputKind: 'publish_request',\n normalizedInput: normalized,\n processes: collected.processes.map(candidateFromPublishEntry),\n };\n}\n\nfunction prepareProcessSaveDraftInput(\n inputPath: string,\n rawInput: unknown,\n commit: boolean,\n now: Date,\n): PreparedProcessSaveDraftInput {\n return looksLikePublishRequest(rawInput)\n ? preparePublishRequestInput(inputPath, rawInput, commit, now)\n : prepareRowsFileInput(inputPath, rawInput);\n}\n\nfunction defaultOutDir(inputPath: string, commit: boolean, now: Date): string {\n const runId = buildRunId({\n namespace: 'process_save_draft',\n operation: commit ? 'commit' : 'dry_run',\n now,\n });\n return resolveRunLayout(\n path.join(path.dirname(inputPath), 'artifacts'),\n 'process_save_draft',\n runId,\n ).runRoot;\n}\n\nfunction resolveOutDir(\n inputPath: string,\n outDir: string | null | undefined,\n commit: boolean,\n now: Date,\n): string {\n return outDir ? path.resolve(outDir) : defaultOutDir(inputPath, commit, now);\n}\n\nfunction buildFiles(outDir: string): ProcessSaveDraftReport['files'] {\n const outputDir = path.join(outDir, 'outputs', 'save-draft-rpc');\n return {\n normalized_input: path.join(outDir, 'inputs', 'normalized-input.json'),\n selected_processes: path.join(outputDir, 'selected-processes.jsonl'),\n progress_jsonl: path.join(outputDir, 'progress.jsonl'),\n failures_jsonl: path.join(outputDir, 'failures.jsonl'),\n summary_json: path.join(outputDir, 'summary.json'),\n };\n}\n\nfunction compactCandidate(candidate: ProcessSaveDraftCandidate): JsonObject {\n return {\n id: candidate.id,\n version: candidate.version,\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n payload: candidate.payload,\n ...(candidate.error ? { error: candidate.error } : {}),\n };\n}\n\nexport async function runProcessSaveDraft(\n options: RunProcessSaveDraftOptions,\n): Promise<ProcessSaveDraftReport> {\n const now = options.now ?? new Date();\n const inputPath = path.resolve(options.inputPath);\n const commit = options.commit === true;\n const rawInput = options.rawInput ?? readStructuredInput(inputPath);\n const prepared = prepareProcessSaveDraftInput(inputPath, rawInput, commit, now);\n const outDir = resolveOutDir(inputPath, options.outDir, commit, now);\n const files = buildFiles(outDir);\n\n if (commit && (!options.env || !options.fetchImpl)) {\n throw new CliError('Process save-draft commit requires env and fetch runtime bindings.', {\n code: 'PROCESS_SAVE_DRAFT_RUNTIME_REQUIRED',\n exitCode: 2,\n });\n }\n\n writeJsonArtifact(files.normalized_input, prepared.normalizedInput);\n writeJsonLinesArtifact(files.selected_processes, prepared.processes.map(compactCandidate));\n\n const reports: ProcessSaveDraftProcessReport[] = [];\n for (const candidate of prepared.processes) {\n const report: ProcessSaveDraftProcessReport = {\n id: candidate.id,\n version: candidate.version,\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n status: 'prepared',\n };\n\n if (candidate.error) {\n report.status = 'failed';\n report.error = candidate.error;\n reports.push(report);\n continue;\n }\n\n if (!commit) {\n reports.push(report);\n continue;\n }\n\n try {\n report.execution = await syncStateAwareProcessRecord({\n id: candidate.id!,\n version: candidate.version!,\n payload: candidate.payload,\n env: options.env!,\n fetchImpl: options.fetchImpl!,\n timeoutMs: options.timeoutMs,\n audit: {\n command: 'tiangong process save-draft',\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n },\n });\n report.status = 'executed';\n } catch (error) {\n report.status = 'failed';\n report.error = serialize_error(error);\n }\n\n reports.push(report);\n }\n\n const failedReports = reports.filter((report) => report.status === 'failed');\n writeJsonLinesArtifact(files.progress_jsonl, reports);\n writeJsonLinesArtifact(files.failures_jsonl, failedReports);\n\n const report: ProcessSaveDraftReport = {\n generated_at_utc: now.toISOString(),\n input_path: inputPath,\n input_kind: prepared.inputKind,\n out_dir: outDir,\n commit,\n mode: commit ? 'commit' : 'dry_run',\n status: failedReports.length > 0 ? 'completed_with_failures' : 'completed',\n counts: {\n selected: prepared.processes.length,\n prepared: reports.filter((entry) => entry.status === 'prepared').length,\n executed: reports.filter((entry) => entry.status === 'executed').length,\n failed: failedReports.length,\n },\n files,\n processes: reports,\n };\n\n writeJsonArtifact(files.summary_json, report);\n return report;\n}\n"]}
1
+ {"version":3,"file":"process-save-draft-run.js","sourceRoot":"","sources":["../../../src/lib/process-save-draft-run.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { readJsonInput } from './io.js';\nimport {\n summarizeProcessPayloadValidation,\n validateProcessPayload,\n type ProcessPayloadValidationResult,\n} from './process-payload-validation.js';\nimport {\n collectPublishInputs,\n normalizePublishRequest,\n type PublishCollectedDatasetEntry,\n type PublishCollectedOrigin,\n} from './publish.js';\nimport {\n syncStateAwareProcessRecord,\n type ProcessStateAwareWriteResult,\n} from './process-save-draft.js';\nimport { buildRunId, resolveRunLayout } from './run.js';\n\ntype JsonObject = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction first_non_empty(...values: unknown[]): string | null {\n for (const value of values) {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction resolve_path(baseDir: string, value: string): string {\n return path.resolve(baseDir, value);\n}\n\nfunction serialize_error(error: unknown): { message: string } {\n if (error instanceof Error) {\n return { message: error.message };\n }\n return { message: String(error) };\n}\n\nfunction readJsonLinesInput(inputPath: string): JsonObject[] {\n const resolved = path.resolve(inputPath);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code: 'INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n return readFileSync(resolved, 'utf8')\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n try {\n const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed)) {\n throw new CliError(\n `Expected JSON object rows in JSONL input: ${resolved} (line ${index + 1})`,\n {\n code: 'INPUT_INVALID_JSONL_ROW',\n exitCode: 2,\n },\n );\n }\n return parsed;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n throw new CliError(`Input file contains invalid JSONL at line ${index + 1}: ${resolved}`, {\n code: 'INPUT_INVALID_JSONL',\n exitCode: 2,\n details: String(error),\n });\n }\n });\n}\n\nfunction readStructuredInput(inputPath: string): unknown {\n return inputPath.toLowerCase().endsWith('.jsonl')\n ? readJsonLinesInput(inputPath)\n : readJsonInput(inputPath);\n}\n\nfunction looksLikePublishRequest(value: unknown): boolean {\n return (\n isRecord(value) &&\n ('inputs' in value || 'publish' in value || 'out_dir' in value || 'output_dir' in value)\n );\n}\n\nfunction loadProcessPayloadFromDatasetEntry(entry: unknown, baseDir: string): JsonObject {\n if (isRecord(entry)) {\n for (const key of ['json_ordered', 'jsonOrdered', 'payload', 'process'] as const) {\n const candidate = entry[key];\n if (isRecord(candidate)) {\n return candidate;\n }\n }\n\n const fileValue = first_non_empty(entry.file, entry.path);\n if (fileValue) {\n const filePath = resolve_path(baseDir, fileValue);\n const loaded = readJsonInput(filePath);\n if (!isRecord(loaded)) {\n throw new CliError(`Expected JSON object input: ${filePath}`, {\n code: 'PROCESS_SAVE_DRAFT_INPUT_NOT_OBJECT',\n exitCode: 2,\n });\n }\n return loaded;\n }\n\n return entry;\n }\n\n if (typeof entry === 'string' && entry.trim()) {\n const filePath = resolve_path(baseDir, entry);\n const loaded = readJsonInput(filePath);\n if (!isRecord(loaded)) {\n throw new CliError(`Expected JSON object input: ${filePath}`, {\n code: 'PROCESS_SAVE_DRAFT_INPUT_NOT_OBJECT',\n exitCode: 2,\n });\n }\n return loaded;\n }\n\n throw new CliError('Unsupported process save-draft dataset entry.', {\n code: 'PROCESS_SAVE_DRAFT_UNSUPPORTED_ENTRY',\n exitCode: 2,\n details: entry,\n });\n}\n\nfunction extractProcessIdentity(payload: JsonObject): [string, string] {\n const root = isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n const processInformation = isRecord(root.processInformation) ? root.processInformation : {};\n const dataSetInformation = isRecord(processInformation.dataSetInformation)\n ? processInformation.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n const datasetId = first_non_empty(dataSetInformation['common:UUID']);\n const version = first_non_empty(publicationAndOwnership['common:dataSetVersion'], '01.01.000')!;\n\n if (!datasetId) {\n throw new CliError(\n 'Process payload missing processInformation.dataSetInformation.common:UUID.',\n {\n code: 'PUBLISH_PROCESS_ID_MISSING',\n exitCode: 2,\n },\n );\n }\n\n return [datasetId, version];\n}\n\nfunction processPayloadFromRow(row: JsonObject): JsonObject {\n if (isRecord(row.json_ordered)) {\n return row.json_ordered;\n }\n\n if (isRecord(row.json)) {\n return row.json;\n }\n\n if (isRecord(row.process)) {\n return row.process;\n }\n\n return row;\n}\n\nexport type ProcessSaveDraftSource = 'rows_file' | 'bundle' | 'input';\n\nexport type ProcessSaveDraftCandidate = {\n id: string | null;\n version: string | null;\n source: ProcessSaveDraftSource;\n bundle_path: string | null;\n payload: JsonObject;\n validation?: ProcessPayloadValidationResult;\n error?: { message: string };\n};\n\nexport type ProcessSaveDraftProcessReport = {\n id: string | null;\n version: string | null;\n source: ProcessSaveDraftSource;\n bundle_path: string | null;\n status: 'prepared' | 'executed' | 'failed';\n validation?: ProcessPayloadValidationResult;\n execution?: ProcessStateAwareWriteResult;\n error?: { message: string };\n};\n\nexport type ProcessSaveDraftReport = {\n generated_at_utc: string;\n input_path: string;\n input_kind: 'rows_file' | 'publish_request';\n out_dir: string;\n commit: boolean;\n mode: 'dry_run' | 'commit';\n status: 'completed' | 'completed_with_failures';\n counts: {\n selected: number;\n prepared: number;\n executed: number;\n failed: number;\n };\n files: {\n normalized_input: string;\n selected_processes: string;\n progress_jsonl: string;\n failures_jsonl: string;\n summary_json: string;\n };\n processes: ProcessSaveDraftProcessReport[];\n};\n\nexport type RunProcessSaveDraftOptions = {\n inputPath: string;\n outDir?: string | null;\n commit?: boolean | null;\n rawInput?: unknown;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n validateProcessPayloadImpl?: (payload: JsonObject) => ProcessPayloadValidationResult;\n};\n\ntype PreparedProcessSaveDraftInput = {\n inputKind: 'rows_file' | 'publish_request';\n normalizedInput: unknown;\n processes: ProcessSaveDraftCandidate[];\n};\n\nfunction candidateFromPayload(\n payload: JsonObject,\n source: ProcessSaveDraftSource,\n bundlePath: string | null,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): ProcessSaveDraftCandidate {\n try {\n const [id, version] = extractProcessIdentity(payload);\n const validation = validateProcessPayloadImpl(payload);\n if (!validation.ok) {\n return {\n id,\n version,\n source,\n bundle_path: bundlePath,\n payload,\n validation,\n error: {\n message: summarizeProcessPayloadValidation(validation),\n },\n };\n }\n return {\n id,\n version,\n source,\n bundle_path: bundlePath,\n payload,\n validation,\n };\n } catch (error) {\n return {\n id: first_non_empty(payload['@id'], payload.id),\n version: first_non_empty(payload['@version'], payload.version, '01.01.000'),\n source,\n bundle_path: bundlePath,\n payload,\n error:\n error instanceof CliError && error.code === 'PUBLISH_PROCESS_ID_MISSING'\n ? {\n message:\n 'Payload is not a canonical processDataSet wrapper; process save-draft only supports canonical process datasets.',\n }\n : serialize_error(error),\n };\n }\n}\n\nfunction sourceFromPublishOrigin(origin: PublishCollectedOrigin): ProcessSaveDraftSource {\n return origin.source === 'bundle' ? 'bundle' : 'input';\n}\n\nfunction candidateFromPublishEntry(\n entry: PublishCollectedDatasetEntry,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): ProcessSaveDraftCandidate {\n return candidateFromPayload(\n loadProcessPayloadFromDatasetEntry(entry.entry, entry.origin.base_dir),\n sourceFromPublishOrigin(entry.origin),\n entry.origin.bundle_path,\n validateProcessPayloadImpl,\n );\n}\n\nfunction prepareRowsFileInput(\n inputPath: string,\n rawInput: unknown,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): PreparedProcessSaveDraftInput {\n const rows = Array.isArray(rawInput) ? rawInput : [rawInput];\n const normalizedRows = rows.map((row, index) => {\n if (!isRecord(row)) {\n throw new CliError(\n `Expected JSON object rows in process save-draft input: ${inputPath} (index ${index})`,\n {\n code: 'PROCESS_SAVE_DRAFT_INVALID_ROW',\n exitCode: 2,\n },\n );\n }\n return row;\n });\n\n return {\n inputKind: 'rows_file',\n normalizedInput: {\n input_kind: 'rows_file',\n input_path: inputPath,\n row_count: normalizedRows.length,\n },\n processes: normalizedRows.map((row) =>\n candidateFromPayload(\n processPayloadFromRow(row),\n 'rows_file',\n null,\n validateProcessPayloadImpl,\n ),\n ),\n };\n}\n\nfunction preparePublishRequestInput(\n inputPath: string,\n rawInput: unknown,\n commit: boolean,\n now: Date,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): PreparedProcessSaveDraftInput {\n const normalized = normalizePublishRequest(rawInput, {\n requestPath: inputPath,\n commitOverride: commit,\n now,\n });\n const collected = collectPublishInputs(normalized, path.dirname(inputPath));\n\n return {\n inputKind: 'publish_request',\n normalizedInput: normalized,\n processes: collected.processes.map((entry) =>\n candidateFromPublishEntry(entry, validateProcessPayloadImpl),\n ),\n };\n}\n\nfunction prepareProcessSaveDraftInput(\n inputPath: string,\n rawInput: unknown,\n commit: boolean,\n now: Date,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): PreparedProcessSaveDraftInput {\n return looksLikePublishRequest(rawInput)\n ? preparePublishRequestInput(inputPath, rawInput, commit, now, validateProcessPayloadImpl)\n : prepareRowsFileInput(inputPath, rawInput, validateProcessPayloadImpl);\n}\n\nfunction defaultOutDir(inputPath: string, commit: boolean, now: Date): string {\n const runId = buildRunId({\n namespace: 'process_save_draft',\n operation: commit ? 'commit' : 'dry_run',\n now,\n });\n return resolveRunLayout(\n path.join(path.dirname(inputPath), 'artifacts'),\n 'process_save_draft',\n runId,\n ).runRoot;\n}\n\nfunction resolveOutDir(\n inputPath: string,\n outDir: string | null | undefined,\n commit: boolean,\n now: Date,\n): string {\n return outDir ? path.resolve(outDir) : defaultOutDir(inputPath, commit, now);\n}\n\nfunction buildFiles(outDir: string): ProcessSaveDraftReport['files'] {\n const outputDir = path.join(outDir, 'outputs', 'save-draft-rpc');\n return {\n normalized_input: path.join(outDir, 'inputs', 'normalized-input.json'),\n selected_processes: path.join(outputDir, 'selected-processes.jsonl'),\n progress_jsonl: path.join(outputDir, 'progress.jsonl'),\n failures_jsonl: path.join(outputDir, 'failures.jsonl'),\n summary_json: path.join(outputDir, 'summary.json'),\n };\n}\n\nfunction compactCandidate(candidate: ProcessSaveDraftCandidate): JsonObject {\n return {\n id: candidate.id,\n version: candidate.version,\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n payload: candidate.payload,\n ...(candidate.validation ? { validation: candidate.validation } : {}),\n ...(candidate.error ? { error: candidate.error } : {}),\n };\n}\n\nexport async function runProcessSaveDraft(\n options: RunProcessSaveDraftOptions,\n): Promise<ProcessSaveDraftReport> {\n const now = options.now ?? new Date();\n const inputPath = path.resolve(options.inputPath);\n const commit = options.commit === true;\n const rawInput = options.rawInput ?? readStructuredInput(inputPath);\n const validateProcessPayloadImpl = options.validateProcessPayloadImpl ?? validateProcessPayload;\n const prepared = prepareProcessSaveDraftInput(\n inputPath,\n rawInput,\n commit,\n now,\n validateProcessPayloadImpl,\n );\n const outDir = resolveOutDir(inputPath, options.outDir, commit, now);\n const files = buildFiles(outDir);\n\n if (commit && (!options.env || !options.fetchImpl)) {\n throw new CliError('Process save-draft commit requires env and fetch runtime bindings.', {\n code: 'PROCESS_SAVE_DRAFT_RUNTIME_REQUIRED',\n exitCode: 2,\n });\n }\n\n writeJsonArtifact(files.normalized_input, prepared.normalizedInput);\n writeJsonLinesArtifact(files.selected_processes, prepared.processes.map(compactCandidate));\n\n const reports: ProcessSaveDraftProcessReport[] = [];\n for (const candidate of prepared.processes) {\n const report: ProcessSaveDraftProcessReport = {\n id: candidate.id,\n version: candidate.version,\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n status: 'prepared',\n ...(candidate.validation ? { validation: candidate.validation } : {}),\n };\n\n if (candidate.error) {\n report.status = 'failed';\n report.error = candidate.error;\n reports.push(report);\n continue;\n }\n\n if (!commit) {\n reports.push(report);\n continue;\n }\n\n try {\n report.execution = await syncStateAwareProcessRecord({\n id: candidate.id!,\n version: candidate.version!,\n payload: candidate.payload,\n env: options.env!,\n fetchImpl: options.fetchImpl!,\n timeoutMs: options.timeoutMs,\n audit: {\n command: 'tiangong-lca process save-draft',\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n },\n });\n report.status = 'executed';\n } catch (error) {\n report.status = 'failed';\n report.error = serialize_error(error);\n }\n\n reports.push(report);\n }\n\n const failedReports = reports.filter((report) => report.status === 'failed');\n writeJsonLinesArtifact(files.progress_jsonl, reports);\n writeJsonLinesArtifact(files.failures_jsonl, failedReports);\n\n const report: ProcessSaveDraftReport = {\n generated_at_utc: now.toISOString(),\n input_path: inputPath,\n input_kind: prepared.inputKind,\n out_dir: outDir,\n commit,\n mode: commit ? 'commit' : 'dry_run',\n status: failedReports.length > 0 ? 'completed_with_failures' : 'completed',\n counts: {\n selected: prepared.processes.length,\n prepared: reports.filter((entry) => entry.status === 'prepared').length,\n executed: reports.filter((entry) => entry.status === 'executed').length,\n failed: failedReports.length,\n },\n files,\n processes: reports,\n };\n\n writeJsonArtifact(files.summary_json, report);\n return report;\n}\n"]}