@tiangong-lca/cli 0.0.1

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 (96) hide show
  1. package/README.md +368 -0
  2. package/bin/tiangong.d.ts +1 -0
  3. package/bin/tiangong.js +32 -0
  4. package/dist/scripts/assert-full-coverage.js +77 -0
  5. package/dist/scripts/assert-full-coverage.js.map +1 -0
  6. package/dist/src/cli.js +2740 -0
  7. package/dist/src/cli.js.map +1 -0
  8. package/dist/src/lib/artifacts.js +86 -0
  9. package/dist/src/lib/artifacts.js.map +1 -0
  10. package/dist/src/lib/dotenv.js +36 -0
  11. package/dist/src/lib/dotenv.js.map +1 -0
  12. package/dist/src/lib/env.js +139 -0
  13. package/dist/src/lib/env.js.map +1 -0
  14. package/dist/src/lib/errors.js +38 -0
  15. package/dist/src/lib/errors.js.map +1 -0
  16. package/dist/src/lib/flow-build-alias-map.js +299 -0
  17. package/dist/src/lib/flow-build-alias-map.js.map +1 -0
  18. package/dist/src/lib/flow-get.js +81 -0
  19. package/dist/src/lib/flow-get.js.map +1 -0
  20. package/dist/src/lib/flow-governance.js +164 -0
  21. package/dist/src/lib/flow-governance.js.map +1 -0
  22. package/dist/src/lib/flow-list.js +187 -0
  23. package/dist/src/lib/flow-list.js.map +1 -0
  24. package/dist/src/lib/flow-publish-reviewed-data.js +808 -0
  25. package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -0
  26. package/dist/src/lib/flow-publish-version.js +541 -0
  27. package/dist/src/lib/flow-publish-version.js.map +1 -0
  28. package/dist/src/lib/flow-read.js +310 -0
  29. package/dist/src/lib/flow-read.js.map +1 -0
  30. package/dist/src/lib/flow-regen-product.js +1396 -0
  31. package/dist/src/lib/flow-regen-product.js.map +1 -0
  32. package/dist/src/lib/flow-remediate.js +821 -0
  33. package/dist/src/lib/flow-remediate.js.map +1 -0
  34. package/dist/src/lib/http.js +45 -0
  35. package/dist/src/lib/http.js.map +1 -0
  36. package/dist/src/lib/io.js +30 -0
  37. package/dist/src/lib/io.js.map +1 -0
  38. package/dist/src/lib/kb-search.js +83 -0
  39. package/dist/src/lib/kb-search.js.map +1 -0
  40. package/dist/src/lib/lifecyclemodel-auto-build.js +1328 -0
  41. package/dist/src/lib/lifecyclemodel-auto-build.js.map +1 -0
  42. package/dist/src/lib/lifecyclemodel-orchestrate.js +1556 -0
  43. package/dist/src/lib/lifecyclemodel-orchestrate.js.map +1 -0
  44. package/dist/src/lib/lifecyclemodel-publish-build.js +296 -0
  45. package/dist/src/lib/lifecyclemodel-publish-build.js.map +1 -0
  46. package/dist/src/lib/lifecyclemodel-publish-resulting-process.js +101 -0
  47. package/dist/src/lib/lifecyclemodel-publish-resulting-process.js.map +1 -0
  48. package/dist/src/lib/lifecyclemodel-resulting-process.js +1152 -0
  49. package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -0
  50. package/dist/src/lib/lifecyclemodel-validate-build.js +238 -0
  51. package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -0
  52. package/dist/src/lib/llm.js +383 -0
  53. package/dist/src/lib/llm.js.map +1 -0
  54. package/dist/src/lib/process-auto-build.js +717 -0
  55. package/dist/src/lib/process-auto-build.js.map +1 -0
  56. package/dist/src/lib/process-batch-build.js +409 -0
  57. package/dist/src/lib/process-batch-build.js.map +1 -0
  58. package/dist/src/lib/process-get.js +66 -0
  59. package/dist/src/lib/process-get.js.map +1 -0
  60. package/dist/src/lib/process-publish-build.js +451 -0
  61. package/dist/src/lib/process-publish-build.js.map +1 -0
  62. package/dist/src/lib/process-resume-build.js +364 -0
  63. package/dist/src/lib/process-resume-build.js.map +1 -0
  64. package/dist/src/lib/publish.js +562 -0
  65. package/dist/src/lib/publish.js.map +1 -0
  66. package/dist/src/lib/remote.js +88 -0
  67. package/dist/src/lib/remote.js.map +1 -0
  68. package/dist/src/lib/review-flow.js +1110 -0
  69. package/dist/src/lib/review-flow.js.map +1 -0
  70. package/dist/src/lib/review-lifecyclemodel.js +727 -0
  71. package/dist/src/lib/review-lifecyclemodel.js.map +1 -0
  72. package/dist/src/lib/review-process.js +702 -0
  73. package/dist/src/lib/review-process.js.map +1 -0
  74. package/dist/src/lib/run.js +106 -0
  75. package/dist/src/lib/run.js.map +1 -0
  76. package/dist/src/lib/state-lock.js +150 -0
  77. package/dist/src/lib/state-lock.js.map +1 -0
  78. package/dist/src/lib/supabase-client.js +269 -0
  79. package/dist/src/lib/supabase-client.js.map +1 -0
  80. package/dist/src/lib/supabase-json-ordered-write.js +186 -0
  81. package/dist/src/lib/supabase-json-ordered-write.js.map +1 -0
  82. package/dist/src/lib/supabase-rest.js +138 -0
  83. package/dist/src/lib/supabase-rest.js.map +1 -0
  84. package/dist/src/lib/supabase-session.js +424 -0
  85. package/dist/src/lib/supabase-session.js.map +1 -0
  86. package/dist/src/lib/tidas-sdk-package-validator.js +493 -0
  87. package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -0
  88. package/dist/src/lib/unstructured.js +203 -0
  89. package/dist/src/lib/unstructured.js.map +1 -0
  90. package/dist/src/lib/user-api-key.js +75 -0
  91. package/dist/src/lib/user-api-key.js.map +1 -0
  92. package/dist/src/lib/validation.js +191 -0
  93. package/dist/src/lib/validation.js.map +1 -0
  94. package/dist/src/main.js +38 -0
  95. package/dist/src/main.js.map +1 -0
  96. package/package.json +81 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecyclemodel-resulting-process.js","sourceRoot":"","sources":["../../../src/lib/lifecyclemodel-resulting-process.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { writeJsonArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { readJsonInput } from './io.js';\nimport { buildRunId, resolveRunLayout } from './run.js';\nimport {\n fetchExactOrLatestProcessRow,\n normalizeSupabaseProcessPayload,\n requireSupabaseRestRuntime,\n} from './supabase-rest.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst DEFAULT_DATASET_VERSION = '00.00.001';\nconst EPSILON = 1e-10;\nconst REMOTE_PROCESS_LOOKUP_TIMEOUT_MS = 10_000;\n\nexport type ProjectionMode = 'primary-only' | 'all-subproducts';\nexport type PublishIntent = 'dry_run' | 'prepare_only' | 'publish';\n\nexport type LifecyclemodelResultingProcessRequest = {\n source_model: {\n id: string | null;\n version: string | null;\n name: string | null;\n json_ordered_path: string | null;\n json_ordered: JsonObject | null;\n };\n projection: {\n mode: ProjectionMode;\n process_id: string | null;\n process_version: string | null;\n metadata_overrides: JsonObject;\n attach_graph_snapshot: boolean;\n attach_graph_snapshot_uri: string | null;\n };\n process_sources: {\n process_catalog_path: string | null;\n run_dirs: string[];\n process_json_dirs: string[];\n process_json_files: string[];\n allow_remote_lookup: boolean;\n };\n publish: {\n intent: PublishIntent;\n prepare_process_payloads: boolean;\n prepare_relation_payloads: boolean;\n };\n};\n\nexport type LifecyclemodelResultingProcessReport = {\n generated_at_utc: string;\n request_path: string;\n out_dir: string;\n status: string;\n projected_process_count: number;\n relation_count: number;\n source_model: {\n id: string;\n version: string;\n name: string;\n json_ordered_path: string | null;\n reference_to_resulting_process_id: string | null;\n reference_to_resulting_process_version: string | null;\n reference_process_instance_id: string | null;\n };\n files: {\n normalized_request: string;\n source_model_normalized: string;\n source_model_summary: string;\n projection_report: string;\n process_projection_bundle: string;\n };\n};\n\nexport type RunLifecyclemodelResultingProcessOptions = {\n inputPath: string;\n outDir?: string | null;\n now?: Date;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n};\n\ntype RemoteProcessLookupContext = {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n};\n\ntype ProcessRecord = {\n processUuid: string;\n version: string;\n raw: JsonObject;\n sourceLabel: string;\n sourcePath: string | null;\n referenceExchangeInternalId: string;\n referenceFlowUuid: string;\n referenceDirection: string;\n referenceAmount: number;\n inputAmounts: Record<string, number>;\n outputAmounts: Record<string, number>;\n};\n\ntype ProcessInstance = {\n instance_id: string;\n process_id: string;\n process_version: string;\n label: string;\n multiplication_factor: number;\n reference_to_process: JsonObject;\n raw: JsonObject;\n};\n\ntype Edge = {\n edge_id: string;\n from: string;\n to: string;\n exchange_id: string | null;\n flow_uuid: string | null;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction ensureList<T = unknown>(value: unknown): T[] {\n if (value === undefined || value === null) {\n return [];\n }\n\n return Array.isArray(value) ? (value as T[]) : ([value] as T[]);\n}\n\nfunction copyJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction firstNonEmpty(...values: unknown[]): string | null {\n for (const value of values) {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n }\n\n return null;\n}\n\nfunction uniqueStrings(values: Array<string | null | undefined>): string[] {\n const unique: string[] = [];\n const seen = new Set<string>();\n\n values.forEach((value) => {\n if (!value) {\n return;\n }\n\n if (seen.has(value)) {\n return;\n }\n\n seen.add(value);\n unique.push(value);\n });\n\n return unique;\n}\n\nfunction sha256Text(text: string): string {\n return createHash('sha256').update(text).digest('hex');\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction requireRemoteProcessLookupRuntime(env: NodeJS.ProcessEnv) {\n const missing: string[] = [];\n if (typeof env.TIANGONG_LCA_API_BASE_URL !== 'string' || !env.TIANGONG_LCA_API_BASE_URL.trim()) {\n missing.push('TIANGONG_LCA_API_BASE_URL');\n }\n\n if (typeof env.TIANGONG_LCA_API_KEY !== 'string' || !env.TIANGONG_LCA_API_KEY.trim()) {\n missing.push('TIANGONG_LCA_API_KEY');\n }\n\n if (\n typeof env.TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY !== 'string' ||\n !env.TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY.trim()\n ) {\n missing.push('TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY');\n }\n\n if (missing.length > 0) {\n throw new CliError(\n `Remote process lookup requires ${missing.join(', ')} when process_sources.allow_remote_lookup=true.`,\n {\n code: 'LIFECYCLEMODEL_REMOTE_LOOKUP_ENV_REQUIRED',\n exitCode: 2,\n details: { missing },\n },\n );\n }\n\n return requireSupabaseRestRuntime(env);\n}\n\nasync function fetchRemoteProcessRecord(options: {\n processId: string;\n requestedVersion: string;\n runtime: ReturnType<typeof createSupabaseDataRuntime>;\n fetchImpl: FetchLike;\n}): Promise<{\n record: ProcessRecord;\n resolution: 'remote_supabase_exact' | 'remote_supabase_latest_fallback';\n sourcePath: string;\n resolvedVersion: string;\n}> {\n const lookupKey = `${options.processId}@${options.requestedVersion}`;\n try {\n const lookup = await fetchExactOrLatestProcessRow({\n runtime: options.runtime,\n id: options.processId,\n version: options.requestedVersion,\n timeoutMs: REMOTE_PROCESS_LOOKUP_TIMEOUT_MS,\n fetchImpl: options.fetchImpl,\n fallbackToLatest: true,\n });\n\n if (!lookup) {\n throw new CliError(`Could not resolve remote process dataset for ${lookupKey}.`, {\n code: 'LIFECYCLEMODEL_REMOTE_PROCESS_NOT_FOUND',\n exitCode: 2,\n details: { process_id: options.processId, version: options.requestedVersion },\n });\n }\n\n const record = parseProcessRecord(normalizeSupabaseProcessPayload(lookup.row.json, lookupKey), {\n sourceLabel: 'remote:supabase',\n sourcePath: lookup.sourceUrl,\n });\n\n return {\n record,\n resolution:\n lookup.resolution === 'remote_supabase_latest_fallback'\n ? 'remote_supabase_latest_fallback'\n : 'remote_supabase_exact',\n sourcePath: lookup.sourceUrl,\n resolvedVersion: lookup.row.version || record.version,\n };\n } catch (error) {\n if (error instanceof CliError && error.code === 'SUPABASE_REST_RESPONSE_INVALID') {\n throw new CliError(`Remote process lookup returned an invalid response for ${lookupKey}.`, {\n code: 'LIFECYCLEMODEL_REMOTE_LOOKUP_RESPONSE_INVALID',\n exitCode: 1,\n details: error.details,\n });\n }\n\n throw error;\n }\n}\n\nfunction resolveInputPath(baseDir: string, value: string): string;\nfunction resolveInputPath(baseDir: string, value: unknown): string | null;\nfunction resolveInputPath(baseDir: string, value: unknown): string | null {\n if (typeof value !== 'string' || !value.trim()) {\n return null;\n }\n\n const trimmed = value.trim();\n if (trimmed.startsWith('file:')) {\n return trimmed;\n }\n\n if (trimmed.includes('://')) {\n return trimmed;\n }\n\n return path.resolve(baseDir, trimmed);\n}\n\nfunction resolveLocalPath(value: string, fieldName: string): string {\n if (value.startsWith('file:')) {\n return fileURLToPath(value);\n }\n\n if (value.includes('://')) {\n throw new CliError(`${fieldName} must resolve to a local filesystem path.`, {\n code: 'LIFECYCLEMODEL_LOCAL_PATH_REQUIRED',\n exitCode: 2,\n details: value,\n });\n }\n\n return path.resolve(value);\n}\n\nfunction readJsonObject(filePath: string, code: string): JsonObject {\n const value = readJsonInput(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected a JSON object file: ${filePath}`, {\n code,\n exitCode: 2,\n });\n }\n\n return value;\n}\n\nfunction toFiniteNumber(value: unknown, fieldName: string): number {\n if (value === undefined || value === null || value === '') {\n return 0;\n }\n\n const parsed = typeof value === 'number' ? value : Number(String(value));\n if (!Number.isFinite(parsed)) {\n throw new CliError(`Expected a numeric value for ${fieldName}.`, {\n code: 'LIFECYCLEMODEL_INVALID_NUMBER',\n exitCode: 2,\n details: { fieldName, value },\n });\n }\n\n return parsed;\n}\n\nfunction normalizeNumericOutput(value: number): number {\n const rounded = Math.abs(value) < EPSILON ? 0 : Number.parseFloat(value.toFixed(12));\n return rounded === 0 ? 0 : rounded;\n}\n\nfunction toBoolean(value: unknown, defaultValue: boolean): boolean {\n if (value === undefined) {\n return defaultValue;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string') {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n }\n\n return Boolean(value);\n}\n\nfunction normalizeStringArray(value: unknown, fieldName: string): string[] {\n const items = ensureList(value);\n\n return items.map((item, index) => {\n if (typeof item !== 'string' || !item.trim()) {\n throw new CliError(`Expected ${fieldName}[${index}] to be a non-empty string.`, {\n code: 'LIFECYCLEMODEL_INVALID_STRING_ARRAY',\n exitCode: 2,\n details: { fieldName, value: item },\n });\n }\n\n return item.trim();\n });\n}\n\nfunction normalizeProjectionMode(value: unknown): ProjectionMode {\n const mode = firstNonEmpty(value) ?? 'primary-only';\n if (mode === 'primary-only' || mode === 'all-subproducts') {\n return mode;\n }\n\n throw new CliError('projection.mode must be primary-only or all-subproducts.', {\n code: 'LIFECYCLEMODEL_INVALID_PROJECTION_MODE',\n exitCode: 2,\n details: value,\n });\n}\n\nfunction normalizePublishIntent(value: unknown): PublishIntent {\n const intent = firstNonEmpty(value) ?? 'dry_run';\n if (intent === 'dry_run' || intent === 'prepare_only' || intent === 'publish') {\n return intent;\n }\n\n throw new CliError('publish.intent must be dry_run, prepare_only, or publish.', {\n code: 'LIFECYCLEMODEL_INVALID_PUBLISH_INTENT',\n exitCode: 2,\n details: value,\n });\n}\n\nfunction normalizeMetadataOverrides(value: unknown): JsonObject {\n if (value === undefined) {\n return {};\n }\n\n if (!isRecord(value)) {\n throw new CliError('projection.metadata_overrides must be a JSON object when provided.', {\n code: 'LIFECYCLEMODEL_INVALID_METADATA_OVERRIDES',\n exitCode: 2,\n });\n }\n\n return copyJson(value);\n}\n\nexport function normalizeLifecyclemodelResultingProcessRequest(\n input: unknown,\n options: {\n requestPath: string;\n },\n): LifecyclemodelResultingProcessRequest {\n if (!isRecord(input)) {\n throw new CliError('Lifecyclemodel resulting-process request must be a JSON object.', {\n code: 'LIFECYCLEMODEL_REQUEST_NOT_OBJECT',\n exitCode: 2,\n });\n }\n\n const baseDir = path.dirname(path.resolve(options.requestPath));\n const sourceModelRaw = isRecord(input.source_model) ? input.source_model : {};\n const projectionRaw = isRecord(input.projection) ? input.projection : {};\n const processSourcesRaw = isRecord(input.process_sources) ? input.process_sources : {};\n const publishRaw = isRecord(input.publish) ? input.publish : {};\n\n const normalized: LifecyclemodelResultingProcessRequest = {\n source_model: {\n id: firstNonEmpty(sourceModelRaw.id),\n version: firstNonEmpty(sourceModelRaw.version),\n name: firstNonEmpty(sourceModelRaw.name),\n json_ordered_path: resolveInputPath(baseDir, sourceModelRaw.json_ordered_path),\n json_ordered: isRecord(sourceModelRaw.json_ordered)\n ? copyJson(sourceModelRaw.json_ordered)\n : null,\n },\n projection: {\n mode: normalizeProjectionMode(projectionRaw.mode),\n process_id: firstNonEmpty(projectionRaw.process_id),\n process_version: firstNonEmpty(projectionRaw.process_version),\n metadata_overrides: normalizeMetadataOverrides(projectionRaw.metadata_overrides),\n attach_graph_snapshot: toBoolean(projectionRaw.attach_graph_snapshot, false),\n attach_graph_snapshot_uri: resolveInputPath(baseDir, projectionRaw.attach_graph_snapshot_uri),\n },\n process_sources: {\n process_catalog_path: (() => {\n const resolved = resolveInputPath(baseDir, processSourcesRaw.process_catalog_path);\n return resolved ? resolveLocalPath(resolved, 'process_sources.process_catalog_path') : null;\n })(),\n run_dirs: normalizeStringArray(processSourcesRaw.run_dirs, 'process_sources.run_dirs').map(\n (item) => resolveLocalPath(resolveInputPath(baseDir, item), 'process_sources.run_dirs'),\n ),\n process_json_dirs: normalizeStringArray(\n processSourcesRaw.process_json_dirs,\n 'process_sources.process_json_dirs',\n ).map((item) =>\n resolveLocalPath(resolveInputPath(baseDir, item), 'process_sources.process_json_dirs'),\n ),\n process_json_files: normalizeStringArray(\n processSourcesRaw.process_json_files,\n 'process_sources.process_json_files',\n ).map((item) =>\n resolveLocalPath(resolveInputPath(baseDir, item), 'process_sources.process_json_files'),\n ),\n allow_remote_lookup: toBoolean(\n processSourcesRaw.allow_remote_lookup ?? processSourcesRaw.allow_mcp_lookup,\n false,\n ),\n },\n publish: {\n intent: normalizePublishIntent(publishRaw.intent),\n prepare_process_payloads: toBoolean(publishRaw.prepare_process_payloads, true),\n prepare_relation_payloads: toBoolean(publishRaw.prepare_relation_payloads, true),\n },\n };\n\n if (\n !normalized.source_model.id &&\n !normalized.source_model.json_ordered &&\n !normalized.source_model.json_ordered_path\n ) {\n throw new CliError(\n 'source_model must include at least one of id, json_ordered, or json_ordered_path.',\n {\n code: 'LIFECYCLEMODEL_SOURCE_MODEL_REQUIRED',\n exitCode: 2,\n },\n );\n }\n\n if (!normalized.process_sources.process_catalog_path) {\n normalized.process_sources.process_catalog_path = autoDetectProcessCatalogPath(\n normalized.source_model.json_ordered_path,\n );\n }\n\n if (normalized.process_sources.process_json_dirs.length === 0) {\n normalized.process_sources.process_json_dirs = autoDetectProcessJsonDirs(\n normalized.source_model.json_ordered_path,\n );\n }\n\n return normalized;\n}\n\nfunction lifecyclemodelRoot(model: JsonObject): JsonObject {\n return isRecord(model.lifeCycleModelDataSet)\n ? (model.lifeCycleModelDataSet as JsonObject)\n : model;\n}\n\nfunction processDatasetRoot(payload: JsonObject): JsonObject {\n if (isRecord(payload.processDataSet)) {\n return payload.processDataSet;\n }\n\n for (const key of ['json_ordered', 'json'] as const) {\n const nested = payload[key];\n if (isRecord(nested) && isRecord(nested.processDataSet)) {\n return nested.processDataSet;\n }\n }\n\n throw new CliError('Process payload does not contain processDataSet.', {\n code: 'LIFECYCLEMODEL_PROCESS_DATASET_REQUIRED',\n exitCode: 2,\n });\n}\n\nfunction resolveNameField(namePayload: unknown): string | null {\n if (typeof namePayload === 'string') {\n return namePayload.trim() || null;\n }\n\n if (Array.isArray(namePayload)) {\n for (const item of namePayload) {\n const resolved = resolveNameField(item);\n if (resolved) {\n return resolved;\n }\n }\n return null;\n }\n\n if (!isRecord(namePayload)) {\n return null;\n }\n\n const direct = firstNonEmpty(namePayload['@index'], namePayload['#text'], namePayload.text);\n if (direct) {\n return direct;\n }\n\n for (const key of ['baseName', 'shortName', 'name'] as const) {\n const nested = namePayload[key];\n if (isRecord(nested)) {\n const nestedText = firstNonEmpty(nested['@index'], nested['#text'], nested.text);\n if (nestedText) {\n return nestedText;\n }\n }\n\n const resolved = firstNonEmpty(nested);\n if (resolved) {\n return resolved;\n }\n }\n\n return null;\n}\n\nfunction normalizedNameInfo(namePayload: unknown, fallbackText: string): JsonObject {\n if (isRecord(namePayload) && Object.keys(namePayload).length > 0) {\n return copyJson(namePayload);\n }\n\n return {\n baseName: [\n {\n '@xml:lang': 'en',\n '#text': resolveNameField(namePayload) ?? fallbackText,\n },\n ],\n };\n}\n\nfunction multilangFromText(enText: string, zhText: string): JsonObject[] {\n return [\n {\n '@xml:lang': 'en',\n '#text': enText,\n },\n {\n '@xml:lang': 'zh',\n '#text': zhText,\n },\n ];\n}\n\nfunction modelDatasetVersion(model: JsonObject): string | null {\n const root = lifecyclemodelRoot(model);\n const administrative = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publication = isRecord(administrative.publicationAndOwnership)\n ? administrative.publicationAndOwnership\n : isRecord(administrative['common:publicationAndOwnership'])\n ? (administrative['common:publicationAndOwnership'] as JsonObject)\n : {};\n\n return firstNonEmpty(publication['common:dataSetVersion']);\n}\n\nfunction modelIdentifier(\n model: JsonObject,\n sourceModel: LifecyclemodelResultingProcessRequest['source_model'],\n): {\n id: string;\n version: string;\n name: string;\n} {\n const root = lifecyclemodelRoot(model);\n const info = isRecord(root.lifeCycleModelInformation) ? root.lifeCycleModelInformation : {};\n const dataInfo = isRecord(info.dataSetInformation) ? info.dataSetInformation : {};\n const modelId =\n firstNonEmpty(\n sourceModel.id,\n dataInfo['common:UUID'],\n root['@id'],\n root.id,\n dataInfo.identifierOfSubDataSet,\n ) ?? `lm-${sha256Text(JSON.stringify(model)).slice(0, 12)}`;\n const version =\n firstNonEmpty(\n sourceModel.version,\n modelDatasetVersion(model),\n root['@version'],\n root.version,\n dataInfo['@version'],\n ) ?? DEFAULT_DATASET_VERSION;\n const name =\n firstNonEmpty(sourceModel.name, resolveNameField(dataInfo.name), root.name) ?? modelId;\n\n return {\n id: modelId,\n version,\n name,\n };\n}\n\nfunction extractProcessInstances(model: JsonObject): ProcessInstance[] {\n const root = lifecyclemodelRoot(model);\n const info = isRecord(root.lifeCycleModelInformation) ? root.lifeCycleModelInformation : {};\n const technology = isRecord(info.technology)\n ? info.technology\n : isRecord(root.technology)\n ? root.technology\n : {};\n const processes = isRecord(technology.processes) ? technology.processes : {};\n const instances = ensureList<JsonObject>(processes.processInstance);\n\n return instances.filter(isRecord).map((item, index) => {\n const ref = isRecord(item.referenceToProcess) ? item.referenceToProcess : {};\n return {\n instance_id:\n firstNonEmpty(item['@dataSetInternalID'], item['@id'], item.id) ?? `pi-${index + 1}`,\n process_id: firstNonEmpty(ref['@refObjectId'], ref.id, ref.processId) ?? `proc-${index + 1}`,\n process_version: firstNonEmpty(ref['@version'], ref.version) ?? DEFAULT_DATASET_VERSION,\n label:\n firstNonEmpty(\n resolveNameField(ref['common:shortDescription']),\n resolveNameField(ref.shortDescription),\n resolveNameField(ref.name),\n ref['@refObjectId'],\n ) ?? `process-${index + 1}`,\n multiplication_factor: normalizeNumericOutput(\n toFiniteNumber(item['@multiplicationFactor'], 'processInstance.@multiplicationFactor'),\n ),\n reference_to_process: copyJson(ref),\n raw: copyJson(item),\n };\n });\n}\n\nfunction extractEdges(model: JsonObject): Edge[] {\n const edges: Edge[] = [];\n\n extractProcessInstances(model).forEach((instance) => {\n const connections = isRecord(instance.raw.connections) ? instance.raw.connections : {};\n const outputs = ensureList<JsonObject>(connections.outputExchange);\n\n outputs.filter(isRecord).forEach((exchange, edgeIndex) => {\n const downstreamItems = ensureList<JsonObject>(exchange.downstreamProcess).filter(isRecord);\n downstreamItems.forEach((downstream, downstreamIndex) => {\n const downstreamId = firstNonEmpty(\n downstream['@refObjectId'],\n downstream['@id'],\n downstream.id,\n exchange.downstreamProcessId,\n );\n if (!downstreamId) {\n return;\n }\n\n edges.push({\n edge_id:\n firstNonEmpty(exchange['@id'], exchange.id) ??\n `${instance.instance_id}-edge-${edgeIndex + 1}-${downstreamIndex + 1}`,\n from: instance.instance_id,\n to: downstreamId,\n exchange_id: firstNonEmpty(exchange['@id'], exchange.id),\n flow_uuid: firstNonEmpty(\n exchange['@flowUUID'],\n downstream['@flowUUID'],\n exchange.flowUUID,\n ),\n });\n });\n });\n });\n\n return edges;\n}\n\nfunction processReferencePairs(model: JsonObject): Array<{ process_id: string; version: string }> {\n const seen = new Set<string>();\n const pairs: Array<{ process_id: string; version: string }> = [];\n\n extractProcessInstances(model).forEach((instance) => {\n const key = `${instance.process_id}@${instance.process_version}`;\n if (seen.has(key)) {\n return;\n }\n\n seen.add(key);\n pairs.push({\n process_id: instance.process_id,\n version: instance.process_version,\n });\n });\n\n return pairs;\n}\n\nfunction parseProcessRecord(\n payload: JsonObject,\n options: {\n sourceLabel: string;\n sourcePath: string | null;\n },\n): ProcessRecord {\n const dataset = processDatasetRoot(payload);\n const info = isRecord(dataset.processInformation) ? dataset.processInformation : {};\n const dataInfo = isRecord(info.dataSetInformation) ? info.dataSetInformation : {};\n const administrative = isRecord(dataset.administrativeInformation)\n ? dataset.administrativeInformation\n : {};\n const publication = isRecord(administrative.publicationAndOwnership)\n ? administrative.publicationAndOwnership\n : {};\n const processUuid = firstNonEmpty(dataInfo['common:UUID']);\n if (!processUuid) {\n throw new CliError(`processDataSet missing common:UUID from ${options.sourceLabel}`, {\n code: 'LIFECYCLEMODEL_PROCESS_UUID_REQUIRED',\n exitCode: 2,\n });\n }\n\n const version = firstNonEmpty(publication['common:dataSetVersion']) ?? DEFAULT_DATASET_VERSION;\n const quantitativeReference = isRecord(info.quantitativeReference)\n ? info.quantitativeReference\n : {};\n const referenceInternalId = firstNonEmpty(quantitativeReference.referenceToReferenceFlow);\n const exchangesWrapper = isRecord(dataset.exchanges) ? dataset.exchanges : {};\n const exchanges = ensureList<JsonObject>(exchangesWrapper.exchange).filter(isRecord);\n const referenceExchange = exchanges.find(\n (item) => String(item['@dataSetInternalID'] ?? '') === String(referenceInternalId ?? ''),\n );\n\n if (!referenceExchange) {\n throw new CliError(\n `reference exchange ${referenceInternalId ?? '(missing)'} not found for process ${processUuid}`,\n {\n code: 'LIFECYCLEMODEL_REFERENCE_EXCHANGE_NOT_FOUND',\n exitCode: 2,\n },\n );\n }\n\n const inputAmounts: Record<string, number> = {};\n const outputAmounts: Record<string, number> = {};\n\n exchanges.forEach((exchange) => {\n const flowRef = isRecord(exchange.referenceToFlowDataSet)\n ? exchange.referenceToFlowDataSet\n : {};\n const flowUuid = firstNonEmpty(flowRef['@refObjectId']);\n const direction = firstNonEmpty(exchange.exchangeDirection) ?? '';\n if (!flowUuid) {\n return;\n }\n\n const amount = normalizeNumericOutput(\n toFiniteNumber(exchange.meanAmount ?? exchange.resultingAmount, 'exchange amount'),\n );\n\n if (direction === 'Input') {\n inputAmounts[flowUuid] = normalizeNumericOutput((inputAmounts[flowUuid] ?? 0) + amount);\n } else if (direction === 'Output') {\n outputAmounts[flowUuid] = normalizeNumericOutput((outputAmounts[flowUuid] ?? 0) + amount);\n }\n });\n\n const referenceFlow = isRecord(referenceExchange.referenceToFlowDataSet)\n ? referenceExchange.referenceToFlowDataSet\n : {};\n\n return {\n processUuid,\n version,\n raw: {\n processDataSet: dataset,\n },\n sourceLabel: options.sourceLabel,\n sourcePath: options.sourcePath,\n referenceExchangeInternalId: String(referenceInternalId ?? ''),\n referenceFlowUuid: firstNonEmpty(referenceFlow['@refObjectId']) ?? '',\n referenceDirection: firstNonEmpty(referenceExchange.exchangeDirection) ?? '',\n referenceAmount: normalizeNumericOutput(\n toFiniteNumber(\n referenceExchange.meanAmount ?? referenceExchange.resultingAmount,\n 'reference amount',\n ),\n ),\n inputAmounts,\n outputAmounts,\n };\n}\n\nfunction autoDetectProcessCatalogPath(modelPath: string | null): string | null {\n if (!modelPath) {\n return null;\n }\n\n const resolved = PathSafe.resolve(modelPath);\n if (!resolved) {\n return null;\n }\n\n if (path.basename(path.dirname(resolved)) !== 'lifecyclemodels') {\n return null;\n }\n\n const tidasBundleDir = path.dirname(path.dirname(resolved));\n if (path.basename(tidasBundleDir) !== 'tidas_bundle') {\n return null;\n }\n\n const candidate = path.join(path.dirname(tidasBundleDir), 'process-catalog.json');\n return existsSync(candidate) ? candidate : null;\n}\n\nfunction autoDetectProcessJsonDirs(modelPath: string | null): string[] {\n if (!modelPath) {\n return [];\n }\n\n const resolved = PathSafe.resolve(modelPath);\n if (!resolved) {\n return [];\n }\n\n const candidates = [path.join(path.dirname(resolved), 'processes')];\n\n if (path.basename(path.dirname(resolved)) === 'lifecyclemodels') {\n candidates.push(path.join(path.dirname(path.dirname(resolved)), 'processes'));\n }\n\n const stem = path.basename(resolved, path.extname(resolved));\n if (stem.endsWith('-model')) {\n const prefix = stem.slice(0, -'-model'.length).trim();\n if (prefix) {\n candidates.push(path.join(path.dirname(resolved), `${prefix}-processes`));\n }\n }\n if (stem.endsWith('_model')) {\n const prefix = stem.slice(0, -'_model'.length).trim();\n if (prefix) {\n candidates.push(path.join(path.dirname(resolved), `${prefix}_processes`));\n }\n }\n\n return uniqueStrings(candidates.filter((candidate) => existsSync(candidate)));\n}\n\nconst PathSafe = {\n resolve(value: string): string | null {\n try {\n return resolveLocalPath(value, 'path');\n } catch {\n return null;\n }\n },\n};\n\nfunction processSourceDirs(request: LifecyclemodelResultingProcessRequest): string[] {\n const dirs = [...request.process_sources.process_json_dirs];\n\n request.process_sources.run_dirs.forEach((runDir) => {\n const candidate = path.join(runDir, 'exports', 'processes');\n if (existsSync(candidate)) {\n dirs.push(candidate);\n }\n });\n\n if (request.process_sources.process_catalog_path) {\n try {\n const payload = JSON.parse(\n readFileSync(request.process_sources.process_catalog_path, 'utf8'),\n ) as unknown;\n ensureList<JsonObject>(payload)\n .filter(isRecord)\n .forEach((item) => {\n const sourceLabel = firstNonEmpty(item.source_label);\n if (!sourceLabel) {\n return;\n }\n const candidate = path.join(sourceLabel, 'exports', 'processes');\n if (existsSync(candidate)) {\n dirs.push(candidate);\n }\n });\n } catch {\n // Keep local process resolution best-effort for catalog expansion.\n }\n }\n\n return uniqueStrings(dirs);\n}\n\nfunction locateLocalProcessFile(\n processId: string,\n version: string,\n options: {\n processDirs: string[];\n processFiles: string[];\n },\n): string | null {\n const targetFileName = `${processId}_${version}.json`;\n\n for (const directory of options.processDirs) {\n const candidate = path.join(directory, targetFileName);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n for (const filePath of options.processFiles) {\n if (existsSync(filePath) && path.basename(filePath) === targetFileName) {\n return filePath;\n }\n }\n\n return null;\n}\n\nasync function resolveProcessRecords(\n request: LifecyclemodelResultingProcessRequest,\n options: {\n sourceModelJson: JsonObject;\n remoteLookup?: RemoteProcessLookupContext;\n },\n): Promise<{\n records: Record<string, ProcessRecord>;\n resolutionSummary: JsonObject;\n}> {\n const requiredPairs = processReferencePairs(options.sourceModelJson);\n const processFiles = request.process_sources.process_json_files;\n const processDirs = processSourceDirs(request);\n const records: Record<string, ProcessRecord> = {};\n const resolutionItems: JsonObject[] = [];\n const unresolved: Array<{ process_id: string; version: string }> = [];\n\n requiredPairs.forEach(({ process_id, version }) => {\n const localPath = locateLocalProcessFile(process_id, version, {\n processDirs,\n processFiles,\n });\n\n if (localPath) {\n const record = parseProcessRecord(\n readJsonObject(localPath, 'LIFECYCLEMODEL_PROCESS_FILE_NOT_OBJECT'),\n {\n sourceLabel: path.dirname(localPath),\n sourcePath: localPath,\n },\n );\n records[`${process_id}@${version}`] = record;\n resolutionItems.push({\n process_id,\n version,\n resolution: 'local_file',\n source_path: localPath,\n });\n return;\n }\n\n unresolved.push({ process_id, version });\n });\n\n if (unresolved.length > 0 && request.process_sources.allow_remote_lookup) {\n const env = options.remoteLookup?.env ?? process.env;\n const fetchImpl = options.remoteLookup?.fetchImpl ?? (fetch as FetchLike);\n const runtime = createSupabaseDataRuntime({\n runtime: requireRemoteProcessLookupRuntime(env),\n fetchImpl,\n timeoutMs: REMOTE_PROCESS_LOOKUP_TIMEOUT_MS,\n });\n\n for (const item of unresolved) {\n const remoteRecord = await fetchRemoteProcessRecord({\n processId: item.process_id,\n requestedVersion: item.version,\n runtime,\n fetchImpl,\n });\n records[`${item.process_id}@${item.version}`] = remoteRecord.record;\n resolutionItems.push({\n process_id: item.process_id,\n requested_version: item.version,\n resolved_version: remoteRecord.resolvedVersion,\n resolution: remoteRecord.resolution,\n source_path: remoteRecord.sourcePath,\n });\n }\n }\n\n const remainingUnresolved = requiredPairs.filter(\n ({ process_id, version }) => !records[`${process_id}@${version}`],\n );\n\n if (remainingUnresolved.length > 0) {\n const missing = remainingUnresolved\n .map((item) => `${item.process_id}@${item.version}`)\n .join(', ');\n throw new CliError(\n `Could not resolve referenced process datasets for lifecycle model: ${missing}.`,\n {\n code: 'LIFECYCLEMODEL_PROCESS_RESOLUTION_FAILED',\n exitCode: 2,\n },\n );\n }\n\n return {\n records,\n resolutionSummary: {\n required_process_count: requiredPairs.length,\n resolved_process_count: Object.keys(records).length,\n local_process_dir_count: processDirs.length,\n explicit_process_file_count: processFiles.length,\n remote_resolution_count: resolutionItems.filter((item) =>\n String(item.resolution).startsWith('remote_'),\n ).length,\n items: resolutionItems,\n },\n };\n}\n\nfunction loadSourceModel(request: LifecyclemodelResultingProcessRequest): {\n sourceModelJson: JsonObject;\n modelPath: string | null;\n} {\n if (request.source_model.json_ordered) {\n return {\n sourceModelJson: copyJson(request.source_model.json_ordered),\n modelPath: null,\n };\n }\n\n if (!request.source_model.json_ordered_path) {\n throw new CliError('source_model must include json_ordered or json_ordered_path.', {\n code: 'LIFECYCLEMODEL_SOURCE_MODEL_PATH_REQUIRED',\n exitCode: 2,\n });\n }\n\n const localPath = resolveLocalPath(\n request.source_model.json_ordered_path,\n 'source_model.json_ordered_path',\n );\n\n return {\n sourceModelJson: readJsonObject(localPath, 'LIFECYCLEMODEL_SOURCE_MODEL_NOT_OBJECT'),\n modelPath: localPath,\n };\n}\n\nfunction referenceToResultingProcess(model: JsonObject): {\n id: string | null;\n version: string | null;\n} {\n const root = lifecyclemodelRoot(model);\n const info = isRecord(root.lifeCycleModelInformation) ? root.lifeCycleModelInformation : {};\n const dataInfo = isRecord(info.dataSetInformation) ? info.dataSetInformation : {};\n const ref = isRecord(dataInfo.referenceToResultingProcess)\n ? dataInfo.referenceToResultingProcess\n : {};\n\n return {\n id: firstNonEmpty(ref['@refObjectId'], ref.id),\n version: firstNonEmpty(ref['@version'], ref.version),\n };\n}\n\nfunction referenceProcessInstanceId(model: JsonObject): string | null {\n const root = lifecyclemodelRoot(model);\n const info = isRecord(root.lifeCycleModelInformation) ? root.lifeCycleModelInformation : {};\n const quantitative = isRecord(info.quantitativeReference) ? info.quantitativeReference : {};\n const ref = quantitative.referenceToReferenceProcess;\n return isRecord(ref) ? firstNonEmpty(ref['@refObjectId'], ref.id) : firstNonEmpty(ref);\n}\n\nfunction chooseReferenceInstance(\n processInstances: ProcessInstance[],\n requestedInstanceId: string | null,\n): ProcessInstance {\n const directMatch = requestedInstanceId\n ? processInstances.find((item) => item.instance_id === requestedInstanceId)\n : null;\n if (directMatch) {\n return directMatch;\n }\n\n const scaled = processInstances.find((item) => item.multiplication_factor > 0);\n if (scaled) {\n return scaled;\n }\n\n const fallback = processInstances[0];\n if (!fallback) {\n throw new CliError('Lifecycle model does not contain any process instances.', {\n code: 'LIFECYCLEMODEL_PROCESS_INSTANCES_REQUIRED',\n exitCode: 2,\n });\n }\n\n return fallback;\n}\n\nfunction cloneExchangeWithAmount(\n exchange: JsonObject,\n amount: number,\n internalId: string,\n options: {\n quantitativeReference: boolean;\n },\n): JsonObject {\n const cloned = copyJson(exchange);\n cloned['@dataSetInternalID'] = internalId;\n const normalizedAmount = normalizeNumericOutput(amount);\n cloned.meanAmount = normalizedAmount;\n if ('resultingAmount' in cloned) {\n cloned.resultingAmount = normalizedAmount;\n }\n cloned.quantitativeReference = options.quantitativeReference;\n return cloned;\n}\n\nfunction buildResultingProcessPayload(options: {\n sourceModelId: string;\n sourceModelVersion: string;\n sourceModelName: string;\n sourceModelNameInfo: JsonObject;\n processId: string;\n processVersion: string;\n role: 'primary';\n projectionSignature: string;\n processInstances: ProcessInstance[];\n edges: Edge[];\n processRecords: Record<string, ProcessRecord>;\n referenceProcessInstanceId: string | null;\n metadataOverrides: JsonObject;\n attachGraphSnapshotUri: string | null;\n}): JsonObject {\n const chosenInstance = chooseReferenceInstance(\n options.processInstances,\n options.referenceProcessInstanceId,\n );\n const chosenKey = `${chosenInstance.process_id}@${chosenInstance.process_version}`;\n const finalRecord = options.processRecords[chosenKey];\n const finalProcess = copyJson(finalRecord.raw);\n const finalDataset = processDatasetRoot(finalProcess);\n const totals = new Map<string, { amount: number; exchange: JsonObject }>();\n\n options.processInstances.forEach((instance) => {\n if (instance.multiplication_factor === 0) {\n return;\n }\n\n const record = options.processRecords[`${instance.process_id}@${instance.process_version}`];\n const recordDataset = processDatasetRoot(record.raw);\n const exchangesWrapper = isRecord(recordDataset.exchanges)\n ? (recordDataset.exchanges as JsonObject)\n : {};\n const exchanges = ensureList<JsonObject>(exchangesWrapper.exchange).filter(isRecord);\n\n exchanges.forEach((exchange) => {\n const flowRef = isRecord(exchange.referenceToFlowDataSet)\n ? exchange.referenceToFlowDataSet\n : {};\n const flowUuid = firstNonEmpty(flowRef['@refObjectId']);\n const direction = firstNonEmpty(exchange.exchangeDirection);\n\n if (!flowUuid || (direction !== 'Input' && direction !== 'Output')) {\n return;\n }\n\n const key = `${flowUuid}\\u0000${direction}`;\n const scaledAmount =\n toFiniteNumber(exchange.meanAmount ?? exchange.resultingAmount, 'exchange amount') *\n instance.multiplication_factor;\n const existing = totals.get(key);\n if (existing) {\n existing.amount = normalizeNumericOutput(existing.amount + scaledAmount);\n return;\n }\n\n totals.set(key, {\n amount: normalizeNumericOutput(scaledAmount),\n exchange: copyJson(exchange),\n });\n });\n });\n\n const instanceById = new Map(options.processInstances.map((item) => [item.instance_id, item]));\n options.edges.forEach((edge) => {\n if (!edge.flow_uuid) {\n return;\n }\n\n const downstreamInstance = instanceById.get(edge.to);\n if (!downstreamInstance) {\n return;\n }\n\n const downstreamRecord =\n options.processRecords[\n `${downstreamInstance.process_id}@${downstreamInstance.process_version}`\n ];\n if (!downstreamRecord) {\n return;\n }\n\n const internalAmount =\n (downstreamRecord.inputAmounts[edge.flow_uuid] ?? 0) *\n downstreamInstance.multiplication_factor;\n\n ['Output', 'Input'].forEach((direction) => {\n const key = `${edge.flow_uuid}\\u0000${direction}`;\n const existing = totals.get(key);\n if (!existing) {\n return;\n }\n\n existing.amount = normalizeNumericOutput(existing.amount - internalAmount);\n });\n });\n\n const exchangeItems: JsonObject[] = [];\n let nextInternalId = 1;\n let referenceExchangeInternalId = '';\n const sortedEntries = [...totals.entries()].sort((left, right) =>\n left[0].localeCompare(right[0]),\n );\n\n sortedEntries.forEach(([key, payload]) => {\n if (payload.amount <= 0) {\n return;\n }\n\n const [flowUuid, direction] = key.split('\\u0000');\n const quantitativeReference =\n flowUuid === finalRecord.referenceFlowUuid &&\n direction === (finalRecord.referenceDirection || 'Output') &&\n !referenceExchangeInternalId;\n\n const internalId = String(nextInternalId);\n nextInternalId += 1;\n if (quantitativeReference) {\n referenceExchangeInternalId = internalId;\n }\n\n exchangeItems.push(\n cloneExchangeWithAmount(payload.exchange, payload.amount, internalId, {\n quantitativeReference,\n }),\n );\n });\n\n if (!referenceExchangeInternalId) {\n throw new CliError(\n `Could not build resulting process reference exchange for lifecycle model ${options.sourceModelId}.`,\n {\n code: 'LIFECYCLEMODEL_REFERENCE_OUTPUT_REQUIRED',\n exitCode: 2,\n },\n );\n }\n\n const processInformation = isRecord(finalDataset.processInformation)\n ? (finalDataset.processInformation as JsonObject)\n : {};\n finalDataset.processInformation = processInformation;\n const dataInfo = isRecord(processInformation.dataSetInformation)\n ? (processInformation.dataSetInformation as JsonObject)\n : {};\n processInformation.dataSetInformation = dataInfo;\n dataInfo['common:UUID'] = options.processId;\n dataInfo.name = copyJson(options.sourceModelNameInfo);\n const generalComment = ensureList<JsonObject>(dataInfo['common:generalComment']).filter(isRecord);\n generalComment.push(\n ...multilangFromText(\n `Local ${options.role} resulting process generated from lifecycle model ${options.sourceModelId}; exchanges are aggregated from included processes with internal linked flows cancelled.`,\n `本地为生命周期模型 ${options.sourceModelId} 生成的 ${options.role} resulting process;其 exchanges 由包含过程聚合并抵消内部连接 flow 后得到。`,\n ),\n );\n dataInfo['common:generalComment'] = generalComment;\n\n const quantitativeReference = isRecord(processInformation.quantitativeReference)\n ? (processInformation.quantitativeReference as JsonObject)\n : {};\n processInformation.quantitativeReference = quantitativeReference;\n quantitativeReference.referenceToReferenceFlow = referenceExchangeInternalId;\n\n const technology = isRecord(processInformation.technology)\n ? (processInformation.technology as JsonObject)\n : {};\n processInformation.technology = technology;\n const includedRefs = options.processInstances.map((item) => copyJson(item.reference_to_process));\n if (includedRefs.length > 0) {\n technology.referenceToIncludedProcesses =\n includedRefs.length === 1 ? includedRefs[0] : includedRefs;\n }\n\n finalDataset.exchanges = {\n exchange: exchangeItems.length === 1 ? exchangeItems[0] : exchangeItems,\n };\n\n const administrative = isRecord(finalDataset.administrativeInformation)\n ? (finalDataset.administrativeInformation as JsonObject)\n : {};\n finalDataset.administrativeInformation = administrative;\n const publication = isRecord(administrative.publicationAndOwnership)\n ? (administrative.publicationAndOwnership as JsonObject)\n : {};\n administrative.publicationAndOwnership = publication;\n publication['common:dataSetVersion'] = options.processVersion;\n publication['common:permanentDataSetURI'] =\n `https://local.tiangong.invalid/processes/${options.processId}?version=${options.processVersion}`;\n\n const modellingAndValidation = isRecord(finalDataset.modellingAndValidation)\n ? (finalDataset.modellingAndValidation as JsonObject)\n : {};\n finalDataset.modellingAndValidation = modellingAndValidation;\n const lciMethod = isRecord(modellingAndValidation.LCIMethodAndAllocation)\n ? (modellingAndValidation.LCIMethodAndAllocation as JsonObject)\n : {};\n modellingAndValidation.LCIMethodAndAllocation = lciMethod;\n const typeOfDataSet =\n firstNonEmpty(options.metadataOverrides.type_of_data_set) ?? 'partly terminated system';\n lciMethod.typeOfDataSet = typeOfDataSet;\n\n dataInfo.generatedFromLifecycleModel = {\n id: options.sourceModelId,\n version: options.sourceModelVersion,\n role: options.role,\n };\n\n const metadata: JsonObject = {\n generated_from_lifecyclemodel_id: options.sourceModelId,\n generated_from_lifecyclemodel_version: options.sourceModelVersion,\n projection_role: options.role,\n projection_signature: options.projectionSignature,\n type_of_data_set: typeOfDataSet,\n ...copyJson(options.metadataOverrides),\n };\n if (options.attachGraphSnapshotUri) {\n metadata.graph_snapshot_uri = options.attachGraphSnapshotUri;\n }\n\n finalProcess.projectionMetadata = metadata;\n finalProcess.topologySummary = {\n process_instance_count: options.processInstances.length,\n edge_count: options.edges.length,\n };\n\n return finalProcess;\n}\n\nasync function buildProjectionBundle(options: {\n request: LifecyclemodelResultingProcessRequest;\n sourceModelJson: JsonObject;\n modelPath: string | null;\n remoteLookup?: RemoteProcessLookupContext;\n}): Promise<{\n bundle: JsonObject;\n report: JsonObject;\n sourceModelSummary: {\n id: string;\n version: string;\n name: string;\n json_ordered_path: string | null;\n reference_to_resulting_process_id: string | null;\n reference_to_resulting_process_version: string | null;\n reference_process_instance_id: string | null;\n resolved_process_summary: JsonObject;\n };\n}> {\n const root = lifecyclemodelRoot(options.sourceModelJson);\n const modelInfo = isRecord(root.lifeCycleModelInformation) ? root.lifeCycleModelInformation : {};\n const modelDataInfo = isRecord(modelInfo.dataSetInformation) ? modelInfo.dataSetInformation : {};\n const modelIdentity = modelIdentifier(options.sourceModelJson, options.request.source_model);\n const sourceModelNameInfo = normalizedNameInfo(modelDataInfo.name, modelIdentity.name);\n const processInstances = extractProcessInstances(options.sourceModelJson);\n const edges = extractEdges(options.sourceModelJson);\n const processResolution = await resolveProcessRecords(options.request, {\n sourceModelJson: options.sourceModelJson,\n remoteLookup: options.remoteLookup,\n });\n const referenceProcess = referenceToResultingProcess(options.sourceModelJson);\n const referenceProcessInstance = referenceProcessInstanceId(options.sourceModelJson);\n const signatureSeed = {\n source_model_id: modelIdentity.id,\n source_model_version: modelIdentity.version,\n projection_mode: options.request.projection.mode,\n process_instances: processInstances.map((item) => ({\n instance_id: item.instance_id,\n process_id: item.process_id,\n process_version: item.process_version,\n })),\n edges,\n };\n const projectionSignature = `sha256:${sha256Text(JSON.stringify(signatureSeed))}`;\n const primaryProcessId =\n options.request.projection.process_id ??\n referenceProcess.id ??\n `${modelIdentity.id}-resulting-process`;\n const primaryProcessVersion =\n options.request.projection.process_version ?? referenceProcess.version ?? modelIdentity.version;\n const notes = [\n 'This command materializes a deterministic resulting processDataSet by aggregating included process exchanges and cancelling internal linked flows.',\n 'Remote writes remain gated behind an explicit publish layer.',\n ];\n\n const primaryPayload = buildResultingProcessPayload({\n sourceModelId: modelIdentity.id,\n sourceModelVersion: modelIdentity.version,\n sourceModelName: modelIdentity.name,\n sourceModelNameInfo,\n processId: primaryProcessId,\n processVersion: primaryProcessVersion,\n role: 'primary',\n projectionSignature,\n processInstances,\n edges,\n processRecords: processResolution.records,\n referenceProcessInstanceId: referenceProcessInstance,\n metadataOverrides: options.request.projection.metadata_overrides,\n attachGraphSnapshotUri: options.request.projection.attach_graph_snapshot_uri,\n });\n\n if (options.request.projection.mode === 'all-subproducts') {\n const jsonTg = isRecord(root.json_tg) ? root.json_tg : {};\n const submodels = ensureList<JsonObject>(jsonTg.submodels).filter(isRecord);\n notes.push(\n submodels.length > 0\n ? 'Subproduct projection was requested, but this lifecycle model only carries submodel metadata and no submodel-specific topology slices; only the primary aggregated resulting process was emitted.'\n : 'Subproduct projection was requested, but the lifecycle model does not expose submodel topology metadata; only the primary aggregated resulting process was emitted.',\n );\n }\n\n const sourceModelSummary = {\n id: modelIdentity.id,\n version: modelIdentity.version,\n name: modelIdentity.name,\n json_ordered_path: options.modelPath,\n reference_to_resulting_process_id: referenceProcess.id,\n reference_to_resulting_process_version: referenceProcess.version,\n reference_process_instance_id: referenceProcessInstance,\n resolved_process_summary: processResolution.resolutionSummary,\n };\n\n const report = {\n generated_at: nowIso(),\n status:\n options.request.publish.intent === 'publish'\n ? 'projected_local_bundle'\n : 'prepared_local_bundle',\n source_model: sourceModelSummary,\n projection_mode: options.request.projection.mode,\n node_count: processInstances.length,\n edge_count: edges.length,\n reference_process_instance_id: referenceProcessInstance,\n process_instance_preview: processInstances.slice(0, 10).map((item) => ({\n instance_id: item.instance_id,\n process_id: item.process_id,\n label: item.label,\n })),\n edge_preview: edges.slice(0, 10),\n projection_signature: projectionSignature,\n attach_graph_snapshot_uri: options.request.projection.attach_graph_snapshot_uri,\n resolved_process_summary: processResolution.resolutionSummary,\n projected_process_count: 1,\n notes,\n };\n\n const bundle = {\n source_model: sourceModelSummary,\n projected_processes: [\n {\n role: 'primary',\n id: primaryProcessId,\n version: primaryProcessVersion,\n name: modelIdentity.name,\n json_ordered: primaryPayload,\n metadata: primaryPayload.projectionMetadata,\n },\n ],\n relations: [\n {\n lifecyclemodel_id: modelIdentity.id,\n lifecyclemodel_version: modelIdentity.version,\n resulting_process_id: primaryProcessId,\n resulting_process_version: primaryProcessVersion,\n projection_role: 'primary',\n projection_signature: projectionSignature,\n is_primary: true,\n },\n ],\n report,\n projection: {\n mode: options.request.projection.mode,\n metadata_overrides: options.request.projection.metadata_overrides,\n attach_graph_snapshot_uri: options.request.projection.attach_graph_snapshot_uri,\n },\n };\n\n return {\n bundle,\n report,\n sourceModelSummary,\n };\n}\n\nfunction defaultOutDir(requestPath: string, subject: string, now: Date = new Date()): string {\n const requestDir = path.dirname(path.resolve(requestPath));\n const runId = buildRunId({\n namespace: 'lifecyclemodel_resulting_process',\n subject,\n operation: 'build',\n now,\n });\n\n return resolveRunLayout(\n path.join(requestDir, 'artifacts'),\n 'lifecyclemodel_resulting_process',\n runId,\n ).runRoot;\n}\n\nexport async function runLifecyclemodelBuildResultingProcess(\n options: RunLifecyclemodelResultingProcessOptions,\n): Promise<LifecyclemodelResultingProcessReport> {\n const requestPath = path.resolve(options.inputPath);\n const input = readJsonInput(requestPath);\n const normalizedRequest = normalizeLifecyclemodelResultingProcessRequest(input, {\n requestPath,\n });\n const sourceModel = loadSourceModel(normalizedRequest);\n const modelIdentity = modelIdentifier(\n sourceModel.sourceModelJson,\n normalizedRequest.source_model,\n );\n const outDir = options.outDir\n ? path.resolve(options.outDir)\n : defaultOutDir(requestPath, modelIdentity.id, options.now);\n const projection = await buildProjectionBundle({\n request: normalizedRequest,\n sourceModelJson: sourceModel.sourceModelJson,\n modelPath: sourceModel.modelPath,\n remoteLookup: {\n env: options.env ?? process.env,\n fetchImpl: options.fetchImpl ?? (fetch as FetchLike),\n },\n });\n\n const files = {\n normalized_request: writeJsonArtifact(\n path.join(outDir, 'request.normalized.json'),\n normalizedRequest,\n ),\n source_model_normalized: writeJsonArtifact(\n path.join(outDir, 'source-model.normalized.json'),\n sourceModel.sourceModelJson,\n ),\n source_model_summary: writeJsonArtifact(\n path.join(outDir, 'source-model.summary.json'),\n projection.sourceModelSummary,\n ),\n projection_report: writeJsonArtifact(\n path.join(outDir, 'projection-report.json'),\n projection.report,\n ),\n process_projection_bundle: writeJsonArtifact(\n path.join(outDir, 'process-projection-bundle.json'),\n projection.bundle,\n ),\n };\n\n return {\n generated_at_utc: nowIso(options.now),\n request_path: requestPath,\n out_dir: outDir,\n status: String(projection.report.status),\n projected_process_count: 1,\n relation_count: 1,\n source_model: {\n id: projection.sourceModelSummary.id,\n version: projection.sourceModelSummary.version,\n name: projection.sourceModelSummary.name,\n json_ordered_path: projection.sourceModelSummary.json_ordered_path,\n reference_to_resulting_process_id:\n projection.sourceModelSummary.reference_to_resulting_process_id,\n reference_to_resulting_process_version:\n projection.sourceModelSummary.reference_to_resulting_process_version,\n reference_process_instance_id: projection.sourceModelSummary.reference_process_instance_id,\n },\n files,\n };\n}\n\n// Exposed for deterministic unit coverage of internal lifecyclemodel fallback logic.\nexport const __testInternals = {\n uniqueStrings,\n toFiniteNumber,\n normalizeNumericOutput,\n toBoolean,\n resolveNameField,\n normalizedNameInfo,\n modelIdentifier,\n extractProcessInstances,\n extractEdges,\n processReferencePairs,\n parseProcessRecord,\n autoDetectProcessCatalogPath,\n autoDetectProcessJsonDirs,\n processSourceDirs,\n locateLocalProcessFile,\n loadSourceModel,\n referenceToResultingProcess,\n referenceProcessInstanceId,\n chooseReferenceInstance,\n cloneExchangeWithAmount,\n buildResultingProcessPayload,\n buildProjectionBundle,\n defaultOutDir,\n};\n"]}
@@ -0,0 +1,238 @@
1
+ import { existsSync, readdirSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { readJsonArtifact, writeJsonArtifact } from './artifacts.js';
4
+ import { CliError } from './errors.js';
5
+ import { runValidation, } from './validation.js';
6
+ function isRecord(value) {
7
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
8
+ }
9
+ function nonEmptyString(value) {
10
+ if (typeof value !== 'string') {
11
+ return null;
12
+ }
13
+ const normalized = value.trim();
14
+ return normalized || null;
15
+ }
16
+ function readRequiredJsonObject(filePath, missingCode, invalidCode, label) {
17
+ if (!existsSync(filePath)) {
18
+ throw new CliError(`Required lifecyclemodel ${label} artifact not found: ${filePath}`, {
19
+ code: missingCode,
20
+ exitCode: 2,
21
+ details: { filePath, label },
22
+ });
23
+ }
24
+ const value = readJsonArtifact(filePath);
25
+ if (!isRecord(value)) {
26
+ throw new CliError(`Expected lifecyclemodel ${label} artifact JSON object: ${filePath}`, {
27
+ code: invalidCode,
28
+ exitCode: 2,
29
+ details: { filePath, label },
30
+ });
31
+ }
32
+ return value;
33
+ }
34
+ function buildLayout(runRoot) {
35
+ const runId = path.basename(runRoot);
36
+ return {
37
+ runId,
38
+ runRoot,
39
+ modelsDir: path.join(runRoot, 'models'),
40
+ reportsDir: path.join(runRoot, 'reports'),
41
+ modelReportsDir: path.join(runRoot, 'reports', 'model-validations'),
42
+ manifestsDir: path.join(runRoot, 'manifests'),
43
+ runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),
44
+ invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),
45
+ autoBuildReportPath: path.join(runRoot, 'reports', 'lifecyclemodel-auto-build-report.json'),
46
+ reportPath: path.join(runRoot, 'reports', 'lifecyclemodel-validate-build-report.json'),
47
+ };
48
+ }
49
+ function resolveLayout(options) {
50
+ const runDir = nonEmptyString(options.runDir);
51
+ if (!runDir) {
52
+ throw new CliError('Missing required --run-dir for lifecyclemodel validate-build.', {
53
+ code: 'LIFECYCLEMODEL_VALIDATE_RUN_DIR_REQUIRED',
54
+ exitCode: 2,
55
+ });
56
+ }
57
+ return buildLayout(path.resolve(runDir));
58
+ }
59
+ function ensureRunRootExists(layout) {
60
+ if (!existsSync(layout.runRoot)) {
61
+ throw new CliError(`lifecyclemodel validate-build run root not found: ${layout.runRoot}`, {
62
+ code: 'LIFECYCLEMODEL_VALIDATE_RUN_NOT_FOUND',
63
+ exitCode: 2,
64
+ });
65
+ }
66
+ }
67
+ function readRequiredRunManifest(layout) {
68
+ const manifest = readRequiredJsonObject(layout.runManifestPath, 'LIFECYCLEMODEL_VALIDATE_RUN_MANIFEST_MISSING', 'LIFECYCLEMODEL_VALIDATE_RUN_MANIFEST_INVALID', 'run-manifest');
69
+ const manifestRunId = nonEmptyString(manifest.runId);
70
+ if (manifestRunId && manifestRunId !== layout.runId) {
71
+ throw new CliError(`lifecyclemodel validate-build run manifest runId mismatch: ${layout.runManifestPath}`, {
72
+ code: 'LIFECYCLEMODEL_VALIDATE_RUN_MANIFEST_MISMATCH',
73
+ exitCode: 2,
74
+ details: {
75
+ expected: layout.runId,
76
+ actual: manifestRunId,
77
+ },
78
+ });
79
+ }
80
+ return manifest;
81
+ }
82
+ function readInvocationIndex(layout) {
83
+ if (!existsSync(layout.invocationIndexPath)) {
84
+ return {
85
+ schema_version: 1,
86
+ invocations: [],
87
+ };
88
+ }
89
+ const value = readJsonArtifact(layout.invocationIndexPath);
90
+ if (!isRecord(value)) {
91
+ throw new CliError(`Expected lifecyclemodel validate invocation index JSON object: ${layout.invocationIndexPath}`, {
92
+ code: 'LIFECYCLEMODEL_VALIDATE_INVOCATION_INDEX_INVALID',
93
+ exitCode: 2,
94
+ });
95
+ }
96
+ if (value.invocations === undefined) {
97
+ return {
98
+ schema_version: 1,
99
+ invocations: [],
100
+ };
101
+ }
102
+ if (!Array.isArray(value.invocations)) {
103
+ throw new CliError(`Expected lifecyclemodel validate invocation index to contain an invocations array: ${layout.invocationIndexPath}`, {
104
+ code: 'LIFECYCLEMODEL_VALIDATE_INVOCATION_INDEX_INVALID',
105
+ exitCode: 2,
106
+ });
107
+ }
108
+ return value;
109
+ }
110
+ function discoverModelEntries(layout) {
111
+ const runNames = existsSync(layout.modelsDir) ? readdirSync(layout.modelsDir).sort() : [];
112
+ const entries = runNames.flatMap((runName) => {
113
+ const inputDir = path.join(layout.modelsDir, runName, 'tidas_bundle');
114
+ const lifecyclemodelsDir = path.join(inputDir, 'lifecyclemodels');
115
+ if (!existsSync(lifecyclemodelsDir)) {
116
+ return [];
117
+ }
118
+ const modelFiles = readdirSync(lifecyclemodelsDir)
119
+ .filter((entry) => entry.endsWith('.json'))
120
+ .sort()
121
+ .map((entry) => path.join(lifecyclemodelsDir, entry));
122
+ if (modelFiles.length === 0) {
123
+ throw new CliError(`lifecyclemodel validate-build found a bundle without lifecyclemodel JSON files: ${lifecyclemodelsDir}`, {
124
+ code: 'LIFECYCLEMODEL_VALIDATE_MODELS_EMPTY',
125
+ exitCode: 2,
126
+ });
127
+ }
128
+ return [{ runName, inputDir, modelFiles }];
129
+ });
130
+ if (entries.length === 0) {
131
+ throw new CliError(`lifecyclemodel validate-build run does not contain any model bundles: ${layout.modelsDir}`, {
132
+ code: 'LIFECYCLEMODEL_VALIDATE_MODELS_NOT_FOUND',
133
+ exitCode: 2,
134
+ });
135
+ }
136
+ return entries;
137
+ }
138
+ function buildInvocationIndex(layout, invocationIndex, options, now) {
139
+ const priorInvocations = Array.isArray(invocationIndex.invocations)
140
+ ? [...invocationIndex.invocations]
141
+ : [];
142
+ const command = ['lifecyclemodel', 'validate-build', '--run-dir', options.runDir];
143
+ if (options.engine) {
144
+ command.push('--engine', options.engine);
145
+ }
146
+ return {
147
+ ...invocationIndex,
148
+ schema_version: typeof invocationIndex.schema_version === 'number' ? invocationIndex.schema_version : 1,
149
+ invocations: [
150
+ ...priorInvocations,
151
+ {
152
+ command,
153
+ cwd: options.cwd ?? process.cwd(),
154
+ created_at: now.toISOString(),
155
+ run_id: layout.runId,
156
+ run_root: layout.runRoot,
157
+ report_path: layout.reportPath,
158
+ model_reports_dir: layout.modelReportsDir,
159
+ },
160
+ ],
161
+ };
162
+ }
163
+ function buildNextActions(layout) {
164
+ return [
165
+ `inspect: ${layout.reportPath}`,
166
+ `inspect: ${layout.modelReportsDir}`,
167
+ `run: tiangong lifecyclemodel publish-build --run-dir ${layout.runRoot}`,
168
+ ];
169
+ }
170
+ function resolveValidationImpl(deps) {
171
+ return deps.runValidationImpl ?? runValidation;
172
+ }
173
+ function resolveReportEngine(modelReports, requestedEngine) {
174
+ return modelReports[0]?.validation.mode ?? requestedEngine ?? 'auto';
175
+ }
176
+ export async function runLifecyclemodelValidateBuild(options, deps = {}) {
177
+ const now = options.now ?? new Date();
178
+ const layout = resolveLayout(options);
179
+ ensureRunRootExists(layout);
180
+ readRequiredRunManifest(layout);
181
+ const invocationIndex = readInvocationIndex(layout);
182
+ const validationImpl = resolveValidationImpl(deps);
183
+ const modelEntries = discoverModelEntries(layout);
184
+ const modelReports = [];
185
+ for (const entry of modelEntries) {
186
+ const reportFile = path.join(layout.modelReportsDir, `${entry.runName}.json`);
187
+ const validation = await validationImpl({
188
+ inputDir: entry.inputDir,
189
+ engine: options.engine,
190
+ reportFile,
191
+ });
192
+ modelReports.push({
193
+ run_name: entry.runName,
194
+ input_dir: entry.inputDir,
195
+ model_files: entry.modelFiles,
196
+ report_file: reportFile,
197
+ validation,
198
+ });
199
+ }
200
+ const okCount = modelReports.filter((entry) => entry.validation.ok).length;
201
+ const report = {
202
+ schema_version: 1,
203
+ generated_at_utc: now.toISOString(),
204
+ status: 'completed_lifecyclemodel_validate_build',
205
+ run_id: layout.runId,
206
+ run_root: layout.runRoot,
207
+ ok: okCount === modelReports.length,
208
+ engine: resolveReportEngine(modelReports, options.engine),
209
+ counts: {
210
+ models: modelReports.length,
211
+ ok: okCount,
212
+ failed: modelReports.length - okCount,
213
+ },
214
+ files: {
215
+ run_manifest: layout.runManifestPath,
216
+ invocation_index: layout.invocationIndexPath,
217
+ auto_build_report: existsSync(layout.autoBuildReportPath) ? layout.autoBuildReportPath : null,
218
+ report: layout.reportPath,
219
+ model_reports_dir: layout.modelReportsDir,
220
+ },
221
+ model_reports: modelReports,
222
+ next_actions: buildNextActions(layout),
223
+ };
224
+ writeJsonArtifact(layout.invocationIndexPath, buildInvocationIndex(layout, invocationIndex, options, now));
225
+ writeJsonArtifact(layout.reportPath, report);
226
+ return report;
227
+ }
228
+ export const __testInternals = {
229
+ buildLayout,
230
+ resolveLayout,
231
+ readInvocationIndex,
232
+ discoverModelEntries,
233
+ buildInvocationIndex,
234
+ buildNextActions,
235
+ resolveValidationImpl,
236
+ resolveReportEngine,
237
+ };
238
+ //# sourceMappingURL=lifecyclemodel-validate-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecyclemodel-validate-build.js","sourceRoot":"","sources":["../../../src/lib/lifecyclemodel-validate-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EACL,aAAa,GAGd,MAAM,iBAAiB,CAAC;AAUzB,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,UAAU,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED,SAAS,sBAAsB,CAC7B,QAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,KAAa;IAEb,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAAC,2BAA2B,KAAK,wBAAwB,QAAQ,EAAE,EAAE;YACrF,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,QAAQ,CAAC,2BAA2B,KAAK,0BAA0B,QAAQ,EAAE,EAAE;YACvF,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AA0DD,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO;QACL,KAAK;QACL,OAAO;QACP,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;QACvC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;QACzC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,mBAAmB,CAAC;QACnE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QAC7C,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,mBAAmB,CAAC;QACrE,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,uBAAuB,CAAC;QAC7E,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,uCAAuC,CAAC;QAC3F,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,2CAA2C,CAAC;KACvF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,OAA8C;IAE9C,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAAC,+DAA+D,EAAE;YAClF,IAAI,EAAE,0CAA0C;YAChD,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAyC;IACpE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,QAAQ,CAAC,qDAAqD,MAAM,CAAC,OAAO,EAAE,EAAE;YACxF,IAAI,EAAE,uCAAuC;YAC7C,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAyC;IACxE,MAAM,QAAQ,GAAG,sBAAsB,CACrC,MAAM,CAAC,eAAe,EACtB,8CAA8C,EAC9C,8CAA8C,EAC9C,cAAc,CACf,CAAC;IAEF,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,aAAa,IAAI,aAAa,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;QACpD,MAAM,IAAI,QAAQ,CAChB,8DAA8D,MAAM,CAAC,eAAe,EAAE,EACtF;YACE,IAAI,EAAE,+CAA+C;YACrD,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE;gBACP,QAAQ,EAAE,MAAM,CAAC,KAAK;gBACtB,MAAM,EAAE,aAAa;aACtB;SACF,CACF,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAyC;IACpE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,QAAQ,CAChB,kEAAkE,MAAM,CAAC,mBAAmB,EAAE,EAC9F;YACE,IAAI,EAAE,kDAAkD;YACxD,QAAQ,EAAE,CAAC;SACZ,CACF,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;YACL,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,QAAQ,CAChB,sFAAsF,MAAM,CAAC,mBAAmB,EAAE,EAClH;YACE,IAAI,EAAE,kDAAkD;YACxD,QAAQ,EAAE,CAAC;SACZ,CACF,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAyC;IACrE,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QACtE,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,kBAAkB,CAAC;aAC/C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAC1C,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC;QAExD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,QAAQ,CAChB,mFAAmF,kBAAkB,EAAE,EACvG;gBACE,IAAI,EAAE,sCAAsC;gBAC5C,QAAQ,EAAE,CAAC;aACZ,CACF,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAChB,yEAAyE,MAAM,CAAC,SAAS,EAAE,EAC3F;YACE,IAAI,EAAE,0CAA0C;YAChD,QAAQ,EAAE,CAAC;SACZ,CACF,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAC3B,MAAyC,EACzC,eAA2B,EAC3B,OAA8C,EAC9C,GAAS;IAET,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC;QACjE,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,WAAW,CAAC;QAClC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAClF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,GAAG,eAAe;QAClB,cAAc,EACZ,OAAO,eAAe,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACzF,WAAW,EAAE;YACX,GAAG,gBAAgB;YACnB;gBACE,OAAO;gBACP,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;gBACjC,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE;gBAC7B,MAAM,EAAE,MAAM,CAAC,KAAK;gBACpB,QAAQ,EAAE,MAAM,CAAC,OAAO;gBACxB,WAAW,EAAE,MAAM,CAAC,UAAU;gBAC9B,iBAAiB,EAAE,MAAM,CAAC,eAAe;aAC1C;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAyC;IACjE,OAAO;QACL,YAAY,MAAM,CAAC,UAAU,EAAE;QAC/B,YAAY,MAAM,CAAC,eAAe,EAAE;QACpC,wDAAwD,MAAM,CAAC,OAAO,EAAE;KACzE,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAqC;IAErC,OAAO,IAAI,CAAC,iBAAiB,IAAI,aAAa,CAAC;AACjD,CAAC;AAED,SAAS,mBAAmB,CAC1B,YAAsD,EACtD,eAAwB;IAExB,OAAO,YAAY,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,IAAI,eAAe,IAAI,MAAM,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,OAA8C,EAC9C,OAAwC,EAAE;IAE1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,eAAe,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAElD,MAAM,YAAY,GAA6C,EAAE,CAAC;IAClE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;QAC9E,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC;YACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU;SACX,CAAC,CAAC;QACH,YAAY,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,SAAS,EAAE,KAAK,CAAC,QAAQ;YACzB,WAAW,EAAE,KAAK,CAAC,UAAU;YAC7B,WAAW,EAAE,UAAU;YACvB,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,MAAM,GAAsC;QAChD,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,GAAG,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,yCAAyC;QACjD,MAAM,EAAE,MAAM,CAAC,KAAK;QACpB,QAAQ,EAAE,MAAM,CAAC,OAAO;QACxB,EAAE,EAAE,OAAO,KAAK,YAAY,CAAC,MAAM;QACnC,MAAM,EAAE,mBAAmB,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC;QACzD,MAAM,EAAE;YACN,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,YAAY,CAAC,MAAM,GAAG,OAAO;SACtC;QACD,KAAK,EAAE;YACL,YAAY,EAAE,MAAM,CAAC,eAAe;YACpC,gBAAgB,EAAE,MAAM,CAAC,mBAAmB;YAC5C,iBAAiB,EAAE,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI;YAC7F,MAAM,EAAE,MAAM,CAAC,UAAU;YACzB,iBAAiB,EAAE,MAAM,CAAC,eAAe;SAC1C;QACD,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,gBAAgB,CAAC,MAAM,CAAC;KACvC,CAAC;IAEF,iBAAiB,CACf,MAAM,CAAC,mBAAmB,EAC1B,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,CAAC,CAC5D,CAAC;IACF,iBAAiB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,WAAW;IACX,aAAa;IACb,mBAAmB;IACnB,oBAAoB;IACpB,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,mBAAmB;CACpB,CAAC","sourcesContent":["import { existsSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport { readJsonArtifact, writeJsonArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n runValidation,\n type RunValidationOptions,\n type ValidationRunReport,\n} from './validation.js';\n\ntype JsonObject = Record<string, unknown>;\n\ntype ModelBundleEntry = {\n runName: string;\n inputDir: string;\n modelFiles: string[];\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !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): JsonObject {\n if (!existsSync(filePath)) {\n throw new CliError(`Required lifecyclemodel ${label} artifact not found: ${filePath}`, {\n code: missingCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nexport type LifecyclemodelValidateBuildLayout = {\n runId: string;\n runRoot: string;\n modelsDir: string;\n reportsDir: string;\n modelReportsDir: string;\n manifestsDir: string;\n runManifestPath: string;\n invocationIndexPath: string;\n autoBuildReportPath: string;\n reportPath: string;\n};\n\nexport type LifecyclemodelValidateBuildModelReport = {\n run_name: string;\n input_dir: string;\n model_files: string[];\n report_file: string;\n validation: ValidationRunReport;\n};\n\nexport type LifecyclemodelValidateBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_lifecyclemodel_validate_build';\n run_id: string;\n run_root: string;\n ok: boolean;\n engine: string;\n counts: {\n models: number;\n ok: number;\n failed: number;\n };\n files: {\n run_manifest: string;\n invocation_index: string;\n auto_build_report: string | null;\n report: string;\n model_reports_dir: string;\n };\n model_reports: LifecyclemodelValidateBuildModelReport[];\n next_actions: string[];\n};\n\nexport type RunLifecyclemodelValidateBuildOptions = {\n runDir: string;\n engine?: string;\n now?: Date;\n cwd?: string;\n};\n\nexport type LifecyclemodelValidateBuildDeps = {\n runValidationImpl?: (options: RunValidationOptions) => Promise<ValidationRunReport>;\n};\n\nfunction buildLayout(runRoot: string): LifecyclemodelValidateBuildLayout {\n const runId = path.basename(runRoot);\n return {\n runId,\n runRoot,\n modelsDir: path.join(runRoot, 'models'),\n reportsDir: path.join(runRoot, 'reports'),\n modelReportsDir: path.join(runRoot, 'reports', 'model-validations'),\n manifestsDir: path.join(runRoot, 'manifests'),\n runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),\n invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),\n autoBuildReportPath: path.join(runRoot, 'reports', 'lifecyclemodel-auto-build-report.json'),\n reportPath: path.join(runRoot, 'reports', 'lifecyclemodel-validate-build-report.json'),\n };\n}\n\nfunction resolveLayout(\n options: RunLifecyclemodelValidateBuildOptions,\n): LifecyclemodelValidateBuildLayout {\n const runDir = nonEmptyString(options.runDir);\n if (!runDir) {\n throw new CliError('Missing required --run-dir for lifecyclemodel validate-build.', {\n code: 'LIFECYCLEMODEL_VALIDATE_RUN_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n return buildLayout(path.resolve(runDir));\n}\n\nfunction ensureRunRootExists(layout: LifecyclemodelValidateBuildLayout): void {\n if (!existsSync(layout.runRoot)) {\n throw new CliError(`lifecyclemodel validate-build run root not found: ${layout.runRoot}`, {\n code: 'LIFECYCLEMODEL_VALIDATE_RUN_NOT_FOUND',\n exitCode: 2,\n });\n }\n}\n\nfunction readRequiredRunManifest(layout: LifecyclemodelValidateBuildLayout): JsonObject {\n const manifest = readRequiredJsonObject(\n layout.runManifestPath,\n 'LIFECYCLEMODEL_VALIDATE_RUN_MANIFEST_MISSING',\n 'LIFECYCLEMODEL_VALIDATE_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 `lifecyclemodel validate-build run manifest runId mismatch: ${layout.runManifestPath}`,\n {\n code: 'LIFECYCLEMODEL_VALIDATE_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 readInvocationIndex(layout: LifecyclemodelValidateBuildLayout): JsonObject {\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 lifecyclemodel validate invocation index JSON object: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_VALIDATE_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 lifecyclemodel validate invocation index to contain an invocations array: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_VALIDATE_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return value;\n}\n\nfunction discoverModelEntries(layout: LifecyclemodelValidateBuildLayout): ModelBundleEntry[] {\n const runNames = existsSync(layout.modelsDir) ? readdirSync(layout.modelsDir).sort() : [];\n const entries = runNames.flatMap((runName) => {\n const inputDir = path.join(layout.modelsDir, runName, 'tidas_bundle');\n const lifecyclemodelsDir = path.join(inputDir, 'lifecyclemodels');\n if (!existsSync(lifecyclemodelsDir)) {\n return [];\n }\n\n const modelFiles = readdirSync(lifecyclemodelsDir)\n .filter((entry) => entry.endsWith('.json'))\n .sort()\n .map((entry) => path.join(lifecyclemodelsDir, entry));\n\n if (modelFiles.length === 0) {\n throw new CliError(\n `lifecyclemodel validate-build found a bundle without lifecyclemodel JSON files: ${lifecyclemodelsDir}`,\n {\n code: 'LIFECYCLEMODEL_VALIDATE_MODELS_EMPTY',\n exitCode: 2,\n },\n );\n }\n\n return [{ runName, inputDir, modelFiles }];\n });\n\n if (entries.length === 0) {\n throw new CliError(\n `lifecyclemodel validate-build run does not contain any model bundles: ${layout.modelsDir}`,\n {\n code: 'LIFECYCLEMODEL_VALIDATE_MODELS_NOT_FOUND',\n exitCode: 2,\n },\n );\n }\n\n return entries;\n}\n\nfunction buildInvocationIndex(\n layout: LifecyclemodelValidateBuildLayout,\n invocationIndex: JsonObject,\n options: RunLifecyclemodelValidateBuildOptions,\n now: Date,\n): JsonObject {\n const priorInvocations = Array.isArray(invocationIndex.invocations)\n ? [...invocationIndex.invocations]\n : [];\n const command = ['lifecyclemodel', 'validate-build', '--run-dir', options.runDir];\n if (options.engine) {\n command.push('--engine', options.engine);\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 model_reports_dir: layout.modelReportsDir,\n },\n ],\n };\n}\n\nfunction buildNextActions(layout: LifecyclemodelValidateBuildLayout): string[] {\n return [\n `inspect: ${layout.reportPath}`,\n `inspect: ${layout.modelReportsDir}`,\n `run: tiangong lifecyclemodel publish-build --run-dir ${layout.runRoot}`,\n ];\n}\n\nfunction resolveValidationImpl(\n deps: LifecyclemodelValidateBuildDeps,\n): (options: RunValidationOptions) => Promise<ValidationRunReport> {\n return deps.runValidationImpl ?? runValidation;\n}\n\nfunction resolveReportEngine(\n modelReports: LifecyclemodelValidateBuildModelReport[],\n requestedEngine?: string,\n): string {\n return modelReports[0]?.validation.mode ?? requestedEngine ?? 'auto';\n}\n\nexport async function runLifecyclemodelValidateBuild(\n options: RunLifecyclemodelValidateBuildOptions,\n deps: LifecyclemodelValidateBuildDeps = {},\n): Promise<LifecyclemodelValidateBuildReport> {\n const now = options.now ?? new Date();\n const layout = resolveLayout(options);\n ensureRunRootExists(layout);\n readRequiredRunManifest(layout);\n const invocationIndex = readInvocationIndex(layout);\n const validationImpl = resolveValidationImpl(deps);\n const modelEntries = discoverModelEntries(layout);\n\n const modelReports: LifecyclemodelValidateBuildModelReport[] = [];\n for (const entry of modelEntries) {\n const reportFile = path.join(layout.modelReportsDir, `${entry.runName}.json`);\n const validation = await validationImpl({\n inputDir: entry.inputDir,\n engine: options.engine,\n reportFile,\n });\n modelReports.push({\n run_name: entry.runName,\n input_dir: entry.inputDir,\n model_files: entry.modelFiles,\n report_file: reportFile,\n validation,\n });\n }\n\n const okCount = modelReports.filter((entry) => entry.validation.ok).length;\n const report: LifecyclemodelValidateBuildReport = {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n status: 'completed_lifecyclemodel_validate_build',\n run_id: layout.runId,\n run_root: layout.runRoot,\n ok: okCount === modelReports.length,\n engine: resolveReportEngine(modelReports, options.engine),\n counts: {\n models: modelReports.length,\n ok: okCount,\n failed: modelReports.length - okCount,\n },\n files: {\n run_manifest: layout.runManifestPath,\n invocation_index: layout.invocationIndexPath,\n auto_build_report: existsSync(layout.autoBuildReportPath) ? layout.autoBuildReportPath : null,\n report: layout.reportPath,\n model_reports_dir: layout.modelReportsDir,\n },\n model_reports: modelReports,\n next_actions: buildNextActions(layout),\n };\n\n writeJsonArtifact(\n layout.invocationIndexPath,\n buildInvocationIndex(layout, invocationIndex, options, now),\n );\n writeJsonArtifact(layout.reportPath, report);\n return report;\n}\n\nexport const __testInternals = {\n buildLayout,\n resolveLayout,\n readInvocationIndex,\n discoverModelEntries,\n buildInvocationIndex,\n buildNextActions,\n resolveValidationImpl,\n resolveReportEngine,\n};\n"]}