@tiangong-lca/cli 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +73 -30
  2. package/dist/src/cli.js +913 -113
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/lib/dataset-local.js +231 -0
  5. package/dist/src/lib/dataset-local.js.map +1 -0
  6. package/dist/src/lib/dataset-references-rewrite.js +214 -0
  7. package/dist/src/lib/dataset-references-rewrite.js.map +1 -0
  8. package/dist/src/lib/dataset-validate.js +191 -0
  9. package/dist/src/lib/dataset-validate.js.map +1 -0
  10. package/dist/src/lib/flow-regen-product.js +2 -10
  11. package/dist/src/lib/flow-regen-product.js.map +1 -1
  12. package/dist/src/lib/flow-remediate.js +4 -8
  13. package/dist/src/lib/flow-remediate.js.map +1 -1
  14. package/dist/src/lib/lifecyclemodel-auto-build.js +11 -8
  15. package/dist/src/lib/lifecyclemodel-auto-build.js.map +1 -1
  16. package/dist/src/lib/lifecyclemodel-bundle-save.js +468 -0
  17. package/dist/src/lib/lifecyclemodel-bundle-save.js.map +1 -0
  18. package/dist/src/lib/lifecyclemodel-graph.js +248 -0
  19. package/dist/src/lib/lifecyclemodel-graph.js.map +1 -0
  20. package/dist/src/lib/lifecyclemodel-publish-build.js +3 -1
  21. package/dist/src/lib/lifecyclemodel-publish-build.js.map +1 -1
  22. package/dist/src/lib/lifecyclemodel-save-draft-run.js +245 -0
  23. package/dist/src/lib/lifecyclemodel-save-draft-run.js.map +1 -0
  24. package/dist/src/lib/lifecyclemodel-validate-build.js +1 -1
  25. package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -1
  26. package/dist/src/lib/process-auto-build.js +11 -8
  27. package/dist/src/lib/process-auto-build.js.map +1 -1
  28. package/dist/src/lib/process-batch-build.js +6 -3
  29. package/dist/src/lib/process-batch-build.js.map +1 -1
  30. package/dist/src/lib/process-dedup-review.js +870 -0
  31. package/dist/src/lib/process-dedup-review.js.map +1 -0
  32. package/dist/src/lib/process-payload-validation.js +50 -0
  33. package/dist/src/lib/process-payload-validation.js.map +1 -0
  34. package/dist/src/lib/process-publish-build.js +4 -6
  35. package/dist/src/lib/process-publish-build.js.map +1 -1
  36. package/dist/src/lib/process-refresh-references.js +1028 -0
  37. package/dist/src/lib/process-refresh-references.js.map +1 -0
  38. package/dist/src/lib/process-resume-build.js +4 -6
  39. package/dist/src/lib/process-resume-build.js.map +1 -1
  40. package/dist/src/lib/process-save-draft-run.js +31 -12
  41. package/dist/src/lib/process-save-draft-run.js.map +1 -1
  42. package/dist/src/lib/process-scope-statistics.js +859 -0
  43. package/dist/src/lib/process-scope-statistics.js.map +1 -0
  44. package/dist/src/lib/process-verify-rows.js +250 -0
  45. package/dist/src/lib/process-verify-rows.js.map +1 -0
  46. package/dist/src/lib/publish.js +54 -4
  47. package/dist/src/lib/publish.js.map +1 -1
  48. package/dist/src/lib/remote.js +4 -4
  49. package/dist/src/lib/remote.js.map +1 -1
  50. package/dist/src/lib/review-lifecyclemodel.js +2 -2
  51. package/dist/src/lib/review-lifecyclemodel.js.map +1 -1
  52. package/dist/src/lib/tidas-sdk-package-validator.js +28 -9
  53. package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -1
  54. package/dist/src/lib/tidas-sdk-validation.js +96 -0
  55. package/dist/src/lib/tidas-sdk-validation.js.map +1 -0
  56. package/dist/src/lib/user-api-key.js +1 -1
  57. package/dist/src/lib/user-api-key.js.map +1 -1
  58. package/package.json +4 -4
  59. /package/bin/{tiangong.d.ts → tiangong-lca.d.ts} +0 -0
  60. /package/bin/{tiangong.js → tiangong-lca.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-scope-statistics.js","sourceRoot":"","sources":["../../../src/lib/process-scope-statistics.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport {\n readJsonArtifact,\n readJsonLinesArtifact,\n writeJsonArtifact,\n writeJsonLinesArtifact,\n writeTextArtifact,\n} from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike, ResponseLike } from './http.js';\nimport { deriveSupabaseProjectBaseUrl, requireSupabaseRestRuntime } from './supabase-client.js';\nimport { resolveSupabaseUserSession } from './supabase-session.js';\nimport { redactEmail, requireUserApiKeyCredentials } from './user-api-key.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nconst DEFAULT_STATE_CODES = [0, 100] as const;\nconst DEFAULT_PAGE_SIZE = 200;\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 4;\n\ntype ProcessScopeStatisticsScope = 'visible' | 'current-user';\n\ntype SnapshotRow = {\n id: string;\n version: string;\n state_code: number | null;\n user_id: string | null;\n modified_at: string | null;\n model_id: string | null;\n json: JsonRecord;\n};\n\ntype ClassificationEntry = {\n level: number;\n text: string;\n};\n\ntype StatisticsMetadata = {\n userId: string | null;\n maskedUserEmail: string | null;\n totalRowsReportedByRemote: number | null;\n};\n\ntype StatisticsOptions = {\n scope: ProcessScopeStatisticsScope;\n stateCodes: number[];\n};\n\ntype CountRecord = {\n count: number;\n [key: string]: unknown;\n};\n\nexport type RunProcessScopeStatisticsOptions = {\n outDir: string;\n scope?: ProcessScopeStatisticsScope;\n stateCodes?: number[];\n pageSize?: number | null;\n reuseSnapshot?: boolean;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n maxRetries?: number;\n now?: Date;\n};\n\nexport type ProcessScopeStatisticsReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_process_scope_statistics';\n out_dir: string;\n scope: ProcessScopeStatisticsScope;\n state_codes: number[];\n total_process_rows: number;\n domain_count_primary: number;\n domain_count_leaf: number;\n craft_count: number;\n unit_process_rows: number;\n product_count: number;\n files: {\n snapshot_manifest: string;\n snapshot_rows: string;\n process_scope_summary: string;\n domain_summary: string;\n craft_summary: string;\n product_summary: string;\n type_of_dataset_summary: string;\n report: string;\n report_zh: string;\n };\n};\n\ntype ProcessScopeStatisticsSummary = {\n schema_version: 1;\n generated_at_utc: string;\n scope: ProcessScopeStatisticsScope;\n state_codes: number[];\n user_id: string | null;\n masked_user_email: string | null;\n total_process_rows: number;\n total_rows_reported_by_remote: number | null;\n rows_by_state_code: Record<string, number>;\n distinct_visible_owner_user_ids: number;\n domain_count_primary: number;\n domain_count_leaf: number;\n craft_count: number;\n unit_process_rows: number;\n unit_process_share: number;\n product_count: number;\n products_with_flow_id: number;\n products_without_flow_id: number;\n rows_missing_classification: number;\n rows_missing_craft: number;\n rows_missing_product: number;\n rows_missing_reference_exchange: number;\n metric_definitions: Record<string, string>;\n};\n\ntype ProcessScopeStatisticsArtifacts = {\n summary: ProcessScopeStatisticsSummary;\n domainPrimarySummary: Array<{\n domain: string;\n count: number;\n sample_path?: string;\n }>;\n domainLeafSummary: Array<{\n domain: string;\n count: number;\n sample_path?: string;\n }>;\n craftSummary: Array<{\n craft_signature: string;\n label: string;\n count: number;\n source_kind: string;\n }>;\n productSummary: Array<{\n product_key: string;\n label: string;\n count: number;\n stable_flow_id: string;\n stable_flow_version: string;\n source_kind: string;\n }>;\n typeOfDataSetSummary: Array<{\n type_of_dataset: string;\n count: number;\n }>;\n craftSourceSummary: Array<{\n source_kind: string;\n count: number;\n }>;\n productSourceSummary: Array<{\n source_kind: string;\n count: number;\n }>;\n};\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction normalizeOptionalToken(value: unknown): string | null {\n const trimmed = trimText(value);\n return trimmed ? trimmed : null;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction toPositiveInteger(value: number | null | undefined, label: string, code: string): number {\n if (!Number.isInteger(value) || (value as number) <= 0) {\n throw new CliError(`Expected ${label} to be a positive integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value as number;\n}\n\nfunction normalizeStateCodes(value: readonly number[] | undefined): number[] {\n if (!Array.isArray(value) || value.length === 0) {\n return [...DEFAULT_STATE_CODES];\n }\n\n const seen = new Set<number>();\n const normalized: number[] = [];\n for (const entry of value) {\n if (!Number.isInteger(entry) || entry < 0) {\n throw new CliError('Expected --state-codes to contain only non-negative integers.', {\n code: 'PROCESS_SCOPE_STATE_CODES_INVALID',\n exitCode: 2,\n });\n }\n if (!seen.has(entry)) {\n normalized.push(entry);\n seen.add(entry);\n }\n }\n if (normalized.length === 0) {\n throw new CliError('--state-codes must contain at least one state code.', {\n code: 'PROCESS_SCOPE_STATE_CODES_REQUIRED',\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction ensureScope(value: string | undefined): ProcessScopeStatisticsScope {\n if (value === undefined || value === 'visible') {\n return 'visible';\n }\n if (value === 'current-user') {\n return 'current-user';\n }\n throw new CliError(\"Expected --scope to be either 'visible' or 'current-user'.\", {\n code: 'PROCESS_SCOPE_SCOPE_INVALID',\n exitCode: 2,\n });\n}\n\nasync function parseJsonResponse(response: ResponseLike, label: string): Promise<unknown> {\n const text = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n if (!text.trim()) {\n return null;\n }\n if (!contentType.includes('application/json')) {\n return text;\n }\n try {\n return JSON.parse(text);\n } catch (error) {\n throw new CliError(`${label} returned invalid JSON.`, {\n code: 'PROCESS_SCOPE_REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n}\n\nasync function fetchJsonWithRetry(options: {\n url: string;\n init: RequestInit;\n label: string;\n fetchImpl: FetchLike;\n timeoutMs: number;\n maxRetries: number;\n}): Promise<{ status: number; headers: Headers; body: unknown }> {\n let lastError: unknown = null;\n\n for (let attempt = 1; attempt <= options.maxRetries; attempt += 1) {\n try {\n const response = await options.fetchImpl(options.url, {\n ...options.init,\n signal: AbortSignal.timeout(options.timeoutMs),\n });\n const body = await parseJsonResponse(response, options.label);\n if (!response.ok) {\n throw new CliError(`${options.label} failed with ${response.status}.`, {\n code: 'PROCESS_SCOPE_REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: {\n status: response.status,\n body,\n url: options.url,\n },\n });\n }\n return {\n status: response.status,\n headers: new Headers({\n 'content-range': response.headers.get('content-range') ?? '',\n 'content-type': response.headers.get('content-type') ?? '',\n }),\n body,\n };\n } catch (error) {\n lastError = error;\n if (attempt >= options.maxRetries) {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, attempt * 1_500));\n }\n }\n\n if (lastError instanceof CliError) {\n throw lastError;\n }\n\n throw new CliError(`${options.label} failed after ${options.maxRetries} attempt(s).`, {\n code: 'PROCESS_SCOPE_REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: String(lastError),\n });\n}\n\nasync function resolveCurrentUserId(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n now: Date;\n maxRetries: number;\n}): Promise<string> {\n const runtime = requireSupabaseRestRuntime(options.env);\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n now: options.now,\n });\n const body = await fetchJsonWithRetry({\n url: `${deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl)}/auth/v1/user`,\n init: {\n method: 'GET',\n headers: {\n apikey: runtime.publishableKey,\n Authorization: `Bearer ${session.accessToken}`,\n Accept: 'application/json',\n },\n },\n label: 'supabase current-user lookup',\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n });\n\n const userId = isRecord(body.body) ? normalizeOptionalToken(body.body.id) : null;\n if (!userId) {\n throw new CliError('Supabase current-user lookup succeeded without a user id.', {\n code: 'PROCESS_SCOPE_CURRENT_USER_ID_MISSING',\n exitCode: 1,\n });\n }\n return userId;\n}\n\nasync function fetchProcessRows(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n maxRetries: number;\n scope: ProcessScopeStatisticsScope;\n stateCodes: number[];\n pageSize: number;\n userId: string | null;\n}): Promise<{ rows: SnapshotRow[]; total: number | null }> {\n const runtime = requireSupabaseRestRuntime(options.env);\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const projectBaseUrl = deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl);\n const rows: SnapshotRow[] = [];\n let total = 0;\n\n for (const stateCode of options.stateCodes) {\n let stateTotal: number | null = null;\n let cursorId = '';\n\n while (true) {\n const url = new URL(`${projectBaseUrl}/rest/v1/processes`);\n url.searchParams.set('select', 'id,version,state_code,user_id,modified_at,model_id,json');\n url.searchParams.set('state_code', `eq.${stateCode}`);\n if (options.scope === 'current-user') {\n url.searchParams.set('user_id', `eq.${options.userId ?? ''}`);\n }\n if (cursorId) {\n url.searchParams.set('id', `gt.${cursorId}`);\n }\n url.searchParams.set('order', 'id.asc');\n url.searchParams.set('limit', String(options.pageSize));\n\n const page = await fetchJsonWithRetry({\n url: url.toString(),\n init: {\n method: 'GET',\n headers: {\n apikey: runtime.publishableKey,\n Authorization: `Bearer ${session.accessToken}`,\n Accept: 'application/json',\n ...(stateTotal === null ? { Prefer: 'count=exact' } : {}),\n },\n },\n label: `process scope statistics page fetch (state_code=${stateCode})`,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n });\n\n const pageRows = Array.isArray(page.body) ? page.body : [];\n const normalizedRows = pageRows\n .map((row) => normalizeSnapshotRow(row))\n .filter((row): row is SnapshotRow => row !== null);\n rows.push(...normalizedRows);\n\n if (stateTotal === null) {\n const match = page.headers.get('content-range')?.match(/\\/(\\d+)$/u) ?? null;\n stateTotal = match ? Number.parseInt(match[1]!, 10) : null;\n if (stateTotal !== null) {\n total += stateTotal;\n }\n }\n\n if (normalizedRows.length < options.pageSize) {\n break;\n }\n\n const lastRow = normalizedRows[normalizedRows.length - 1]!;\n cursorId = lastRow.id;\n }\n }\n\n return {\n rows,\n total: total || null,\n };\n}\n\nfunction normalizeSnapshotRow(value: unknown): SnapshotRow | null {\n if (!isRecord(value)) {\n return null;\n }\n const id = normalizeOptionalToken(value.id);\n const version = normalizeOptionalToken(value.version);\n const payload = normalizePayload(value.json);\n if (!id || !version || !payload) {\n return null;\n }\n return {\n id,\n version,\n state_code: typeof value.state_code === 'number' ? value.state_code : null,\n user_id: normalizeOptionalToken(value.user_id),\n modified_at: normalizeOptionalToken(value.modified_at),\n model_id: normalizeOptionalToken(value.model_id),\n json: payload,\n };\n}\n\nfunction normalizePayload(value: unknown): JsonRecord | null {\n if (isRecord(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction getLangList(value: unknown): JsonRecord[] {\n if (value === null || value === undefined || value === '') {\n return [];\n }\n if (Array.isArray(value)) {\n return value.filter((item): item is JsonRecord => isRecord(item));\n }\n if (isRecord(value)) {\n const langString = value['common:langString'];\n if (Array.isArray(langString)) {\n return langString.filter((item): item is JsonRecord => isRecord(item));\n }\n if (isRecord(langString)) {\n return [langString];\n }\n if (typeof value['#text'] === 'string' || typeof value['@xml:lang'] === 'string') {\n return [value];\n }\n }\n if (typeof value === 'string') {\n return [{ '@xml:lang': 'en', '#text': value }];\n }\n return [];\n}\n\nfunction getLangText(value: unknown, lang: string | null): string {\n const list = getLangList(value);\n const exact =\n lang === null\n ? null\n : list.find(\n (item) =>\n trimText(item['@xml:lang']).toLowerCase() === lang.toLowerCase() &&\n trimText(item['#text']),\n );\n const fallback = list.find((item) => trimText(item['#text']));\n return trimText((exact ?? fallback)?.['#text']);\n}\n\nfunction getAnyLangText(value: unknown): string {\n return getLangText(value, null);\n}\n\nfunction asArray(value: unknown): unknown[] {\n if (value === null || value === undefined || value === '') {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n\nfunction extractClassificationEntries(dataSetInformation: JsonRecord): ClassificationEntry[] {\n const classes = asArray(\n (dataSetInformation.classificationInformation as JsonRecord | undefined)?.[\n 'common:classification'\n ] &&\n (\n (dataSetInformation.classificationInformation as JsonRecord)['common:classification'] as\n | JsonRecord\n | undefined\n )?.['common:class'],\n );\n\n return classes\n .map((entry) => {\n if (!isRecord(entry)) {\n return null;\n }\n const level = Number.parseInt(trimText(entry['@level']) || '0', 10);\n const text = trimText(entry['#text']);\n if (!text) {\n return null;\n }\n return { level, text };\n })\n .filter((entry): entry is ClassificationEntry => entry !== null)\n .sort((left, right) => left.level - right.level);\n}\n\nfunction normalizeSignature(text: string): string {\n return trimText(text)\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[\\u3000\\u00a0]/gu, ' ')\n .replace(/[,,;;::()()[\\]{}<>|/\\\\]+/gu, ' ')\n .replace(/\\s+/gu, ' ')\n .trim();\n}\n\nfunction firstClause(text: string): string {\n const normalized = trimText(text);\n if (!normalized) {\n return '';\n }\n const [first] = normalized.split(/[.;;。]/u);\n return first.trim();\n}\n\nfunction renderProcessName(name: JsonRecord): string {\n const parts = [\n getLangText(name.baseName, 'en') ||\n getLangText(name.baseName, 'zh') ||\n getAnyLangText(name.baseName),\n getLangText(name.treatmentStandardsRoutes, 'en') ||\n getLangText(name.treatmentStandardsRoutes, 'zh') ||\n getAnyLangText(name.treatmentStandardsRoutes),\n getLangText(name.mixAndLocationTypes, 'en') ||\n getLangText(name.mixAndLocationTypes, 'zh') ||\n getAnyLangText(name.mixAndLocationTypes),\n getLangText(name.functionalUnitFlowProperties, 'en') ||\n getLangText(name.functionalUnitFlowProperties, 'zh') ||\n getAnyLangText(name.functionalUnitFlowProperties),\n ].filter((part) => trimText(part));\n\n return parts.join('; ');\n}\n\nfunction extractCraftCandidate(\n dataSetInformation: JsonRecord,\n technology: JsonRecord,\n): {\n source_kind: string;\n label: string;\n signature: string;\n} {\n const name = isRecord(dataSetInformation.name) ? dataSetInformation.name : {};\n const candidates = [\n {\n source_kind: 'treatmentStandardsRoutes',\n label:\n getLangText(name.treatmentStandardsRoutes, 'en') ||\n getLangText(name.treatmentStandardsRoutes, 'zh') ||\n getAnyLangText(name.treatmentStandardsRoutes),\n },\n {\n source_kind: 'technologyDescriptionAndIncludedProcesses',\n label:\n firstClause(getLangText(technology.technologyDescriptionAndIncludedProcesses, 'en')) ||\n firstClause(getLangText(technology.technologyDescriptionAndIncludedProcesses, 'zh')) ||\n firstClause(getAnyLangText(technology.technologyDescriptionAndIncludedProcesses)),\n },\n {\n source_kind: 'baseName',\n label:\n getLangText(name.baseName, 'en') ||\n getLangText(name.baseName, 'zh') ||\n getAnyLangText(name.baseName),\n },\n ];\n\n for (const candidate of candidates) {\n if (trimText(candidate.label)) {\n return {\n ...candidate,\n signature: normalizeSignature(candidate.label),\n };\n }\n }\n\n return {\n source_kind: 'missing',\n label: '',\n signature: '',\n };\n}\n\nfunction extractReferenceProduct(\n processDataSet: JsonRecord,\n dataSetInformation: JsonRecord,\n): {\n key: string;\n stable_flow_id: string;\n stable_flow_version: string;\n label: string;\n source_kind: string;\n missing_reference_exchange: boolean;\n} {\n const processInformation = isRecord(processDataSet.processInformation)\n ? processDataSet.processInformation\n : {};\n const quantRef = isRecord(processInformation.quantitativeReference)\n ? processInformation.quantitativeReference\n : {};\n const refInternalId = trimText(quantRef.referenceToReferenceFlow);\n const exchangesBlock = isRecord(processDataSet.exchanges) ? processDataSet.exchanges : {};\n const exchanges = asArray(exchangesBlock.exchange);\n const refExchange = exchanges.find(\n (exchange) => isRecord(exchange) && trimText(exchange['@dataSetInternalID']) === refInternalId,\n );\n const exchange = isRecord(refExchange) ? refExchange : null;\n const flowRef =\n exchange && isRecord(exchange.referenceToFlowDataSet) ? exchange.referenceToFlowDataSet : {};\n\n const flowRefId = trimText(flowRef['@refObjectId']);\n const flowRefVersion = trimText(flowRef['@version']);\n const shortDescription =\n getLangText(flowRef['common:shortDescription'], 'en') ||\n getLangText(flowRef['common:shortDescription'], 'zh') ||\n getAnyLangText(flowRef['common:shortDescription']);\n const name = isRecord(dataSetInformation.name) ? dataSetInformation.name : {};\n const fallbackBaseName =\n getLangText(name.baseName, 'en') ||\n getLangText(name.baseName, 'zh') ||\n getAnyLangText(name.baseName);\n const fallbackProcessName = renderProcessName(name);\n\n if (flowRefId) {\n return {\n key: `flow:${flowRefId}`,\n stable_flow_id: flowRefId,\n stable_flow_version: flowRefVersion,\n label: shortDescription || fallbackProcessName || flowRefId,\n source_kind: 'reference_flow_id',\n missing_reference_exchange: exchange === null,\n };\n }\n\n if (shortDescription) {\n return {\n key: `label:${normalizeSignature(shortDescription)}`,\n stable_flow_id: '',\n stable_flow_version: '',\n label: shortDescription,\n source_kind: 'reference_flow_short_description',\n missing_reference_exchange: exchange === null,\n };\n }\n\n if (fallbackBaseName) {\n return {\n key: `base:${normalizeSignature(fallbackBaseName)}`,\n stable_flow_id: '',\n stable_flow_version: '',\n label: fallbackBaseName,\n source_kind: 'process_base_name',\n missing_reference_exchange: exchange === null,\n };\n }\n\n return {\n key: '',\n stable_flow_id: '',\n stable_flow_version: '',\n label: '',\n source_kind: 'missing',\n missing_reference_exchange: exchange === null,\n };\n}\n\nfunction incrementCount(\n map: Map<string, CountRecord>,\n key: string,\n seed: Record<string, unknown> = {},\n): void {\n const existing = map.get(key) ?? {\n count: 0,\n ...seed,\n };\n existing.count += 1;\n map.set(key, existing);\n}\n\nfunction toSortedArray(map: Map<string, CountRecord>): Array<{ key: string } & CountRecord> {\n return [...map.entries()]\n .map(([key, value]) => ({\n key,\n ...value,\n }))\n .sort((left, right) => right.count - left.count || left.key.localeCompare(right.key));\n}\n\nfunction calculateStatistics(\n rows: SnapshotRow[],\n options: StatisticsOptions,\n metadata: StatisticsMetadata,\n generatedAtUtc: string,\n): ProcessScopeStatisticsArtifacts {\n const stateCodeCounts = new Map<string, CountRecord>();\n const typeOfDataSetCounts = new Map<string, CountRecord>();\n const domainPrimaryCounts = new Map<string, CountRecord>();\n const domainLeafCounts = new Map<string, CountRecord>();\n const craftCounts = new Map<string, CountRecord>();\n const craftSourceCounts = new Map<string, CountRecord>();\n const productCounts = new Map<string, CountRecord>();\n const productSourceCounts = new Map<string, CountRecord>();\n const ownerCounts = new Map<string, CountRecord>();\n\n let rowsMissingClassification = 0;\n let rowsMissingCraft = 0;\n let rowsMissingProduct = 0;\n let rowsMissingReferenceExchange = 0;\n let unitProcessRows = 0;\n\n for (const row of rows) {\n incrementCount(stateCodeCounts, String(row.state_code ?? 'null'));\n incrementCount(ownerCounts, row.user_id ?? 'missing');\n\n const processDataSet = isRecord(row.json.processDataSet) ? row.json.processDataSet : {};\n const processInformation = isRecord(processDataSet.processInformation)\n ? processDataSet.processInformation\n : {};\n const dataSetInformation = isRecord(processInformation.dataSetInformation)\n ? processInformation.dataSetInformation\n : {};\n const technology = isRecord(processInformation.technology) ? processInformation.technology : {};\n const modellingAndValidation = isRecord(processDataSet.modellingAndValidation)\n ? processDataSet.modellingAndValidation\n : {};\n const lciMethod = isRecord(modellingAndValidation.LCIMethodAndAllocation)\n ? modellingAndValidation.LCIMethodAndAllocation\n : {};\n\n const typeOfDataSet = trimText(lciMethod.typeOfDataSet) || 'missing';\n incrementCount(typeOfDataSetCounts, typeOfDataSet);\n if (typeOfDataSet.toLowerCase().includes('unit process')) {\n unitProcessRows += 1;\n }\n\n const classificationEntries = extractClassificationEntries(dataSetInformation);\n const primaryDomain =\n classificationEntries.find((entry) => entry.level === 1)?.text ??\n classificationEntries[classificationEntries.length - 1]?.text ??\n '';\n const leafDomain = classificationEntries[classificationEntries.length - 1]?.text ?? '';\n if (primaryDomain) {\n incrementCount(domainPrimaryCounts, primaryDomain, {\n sample_path: classificationEntries.map((entry) => entry.text).join(' > '),\n });\n } else {\n rowsMissingClassification += 1;\n }\n if (leafDomain) {\n incrementCount(domainLeafCounts, leafDomain, {\n sample_path: classificationEntries.map((entry) => entry.text).join(' > '),\n });\n }\n\n const craft = extractCraftCandidate(dataSetInformation, technology);\n if (craft.signature) {\n incrementCount(craftCounts, craft.signature, {\n label: craft.label,\n source_kind: craft.source_kind,\n });\n incrementCount(craftSourceCounts, craft.source_kind);\n } else {\n rowsMissingCraft += 1;\n }\n\n const product = extractReferenceProduct(processDataSet, dataSetInformation);\n if (product.key) {\n incrementCount(productCounts, product.key, {\n label: product.label,\n stable_flow_id: product.stable_flow_id,\n stable_flow_version: product.stable_flow_version,\n source_kind: product.source_kind,\n });\n incrementCount(productSourceCounts, product.source_kind);\n } else {\n rowsMissingProduct += 1;\n }\n if (product.missing_reference_exchange) {\n rowsMissingReferenceExchange += 1;\n }\n }\n\n const domainPrimarySummary = toSortedArray(domainPrimaryCounts).map((item) => ({\n domain: item.key,\n count: item.count,\n sample_path: item.sample_path as string | undefined,\n }));\n const domainLeafSummary = toSortedArray(domainLeafCounts).map((item) => ({\n domain: item.key,\n count: item.count,\n sample_path: item.sample_path as string | undefined,\n }));\n const craftSummary = toSortedArray(craftCounts).map((item) => ({\n craft_signature: item.key,\n label: item.label as string,\n count: item.count,\n source_kind: item.source_kind as string,\n }));\n const productSummary = toSortedArray(productCounts).map((item) => ({\n product_key: item.key,\n label: item.label as string,\n count: item.count,\n stable_flow_id: item.stable_flow_id as string,\n stable_flow_version: item.stable_flow_version as string,\n source_kind: item.source_kind as string,\n }));\n const typeOfDataSetSummary = toSortedArray(typeOfDataSetCounts).map((item) => ({\n type_of_dataset: item.key,\n count: item.count,\n }));\n\n return {\n summary: {\n schema_version: 1,\n generated_at_utc: generatedAtUtc,\n scope: options.scope,\n state_codes: options.stateCodes,\n user_id: metadata.userId,\n masked_user_email: metadata.maskedUserEmail,\n total_process_rows: rows.length,\n total_rows_reported_by_remote: metadata.totalRowsReportedByRemote,\n rows_by_state_code: Object.fromEntries(\n [...stateCodeCounts.entries()].map(([key, value]) => [key, value.count]),\n ),\n distinct_visible_owner_user_ids: ownerCounts.size,\n domain_count_primary: domainPrimaryCounts.size,\n domain_count_leaf: domainLeafCounts.size,\n craft_count: craftCounts.size,\n unit_process_rows: unitProcessRows,\n unit_process_share: rows.length === 0 ? 0 : unitProcessRows / rows.length,\n product_count: productCounts.size,\n products_with_flow_id: productSummary.filter((item) => item.stable_flow_id).length,\n products_without_flow_id: productSummary.filter((item) => !item.stable_flow_id).length,\n rows_missing_classification: rowsMissingClassification,\n rows_missing_craft: rowsMissingCraft,\n rows_missing_product: rowsMissingProduct,\n rows_missing_reference_exchange: rowsMissingReferenceExchange,\n metric_definitions: {\n domain_count_primary:\n 'Unique level-1 classification text; fallback to the deepest available classification when level 1 is missing.',\n craft_count:\n 'Unique normalized craft or route signatures derived from treatmentStandardsRoutes, or fallback technology/base-name text.',\n unit_process_rows: 'Rows whose typeOfDataSet contains the phrase \"Unit process\".',\n product_count:\n 'Unique reference products, keyed by reference flow ID when present and by normalized label fallback otherwise.',\n },\n },\n domainPrimarySummary,\n domainLeafSummary,\n craftSummary,\n productSummary,\n typeOfDataSetSummary,\n craftSourceSummary: toSortedArray(craftSourceCounts).map((item) => ({\n source_kind: item.key,\n count: item.count,\n })),\n productSourceSummary: toSortedArray(productSourceCounts).map((item) => ({\n source_kind: item.key,\n count: item.count,\n })),\n };\n}\n\nfunction escapePipe(value: unknown): string {\n return String(value ?? '').replace(/\\|/gu, '\\\\|');\n}\n\nfunction renderMarkdownReport(\n statistics: ProcessScopeStatisticsArtifacts,\n reportLang: 'en' | 'zh',\n): string {\n const isZh = reportLang === 'zh';\n const summary = statistics.summary;\n const lines: string[] = [];\n\n lines.push(isZh ? '# Process 覆盖统计' : '# Process Scope Statistics');\n lines.push('');\n lines.push(\n isZh ? `统计时间:${summary.generated_at_utc}` : `Generated at: ${summary.generated_at_utc}`,\n );\n lines.push(\n isZh\n ? `范围:\\`scope=${summary.scope}\\`, \\`state_codes=${summary.state_codes.join(',')}\\``\n : `Scope: \\`scope=${summary.scope}\\`, \\`state_codes=${summary.state_codes.join(',')}\\``,\n );\n lines.push('');\n lines.push(isZh ? '## 核心结果' : '## Headline Metrics');\n lines.push('');\n lines.push(\n `- ${isZh ? '总 process 行数' : 'Total process rows'}: \\`${summary.total_process_rows}\\``,\n );\n lines.push(\n `- ${isZh ? '可见 owner 数' : 'Distinct visible owners'}: \\`${summary.distinct_visible_owner_user_ids}\\``,\n );\n lines.push(\n `- ${isZh ? '领域数量(一级分类口径)' : 'Domain count (primary definition)'}: \\`${summary.domain_count_primary}\\``,\n );\n lines.push(\n `- ${isZh ? '领域数量(叶子分类口径)' : 'Domain count (leaf classification)'}: \\`${summary.domain_count_leaf}\\``,\n );\n lines.push(`- ${isZh ? '工艺/路线数量' : 'Craft / route count'}: \\`${summary.craft_count}\\``);\n lines.push(`- ${isZh ? '单元过程行数' : 'Unit-process rows'}: \\`${summary.unit_process_rows}\\``);\n lines.push(`- ${isZh ? '产品数量' : 'Product count'}: \\`${summary.product_count}\\``);\n lines.push('');\n lines.push(isZh ? '## 状态分布' : '## State-code Distribution');\n lines.push('');\n Object.entries(summary.rows_by_state_code).forEach(([stateCode, count]) => {\n lines.push(`- \\`state_code=${stateCode}\\`: \\`${count}\\``);\n });\n lines.push('');\n lines.push(isZh ? '## 统计口径' : '## Metric Definitions');\n lines.push('');\n lines.push(\n `- ${isZh ? '领域' : 'Domain'}: ${\n isZh\n ? '优先使用 classification level=1;若缺失,则回退到最深层分类。'\n : 'Prefer classification level 1; fall back to the deepest available classification when level 1 is missing.'\n }`,\n );\n lines.push(\n `- ${isZh ? '工艺' : 'Craft'}: ${\n isZh\n ? '优先使用 `treatmentStandardsRoutes`;为空时回退到技术说明首句,再回退到 `baseName`。'\n : 'Prefer `treatmentStandardsRoutes`; fall back to the first clause of technology text, then to `baseName`.'\n }`,\n );\n lines.push(\n `- ${isZh ? '单元过程' : 'Unit process'}: ${\n isZh\n ? '以 `typeOfDataSet` 是否包含 `Unit process` 为准。'\n : 'Rows are counted when `typeOfDataSet` contains `Unit process`.'\n }`,\n );\n lines.push(\n `- ${isZh ? '产品' : 'Product'}: ${\n isZh\n ? '优先按 reference flow UUID 聚合;缺失时回退到 reference flow 短描述,再回退到 process base name。'\n : 'Prefer reference-flow UUIDs; fall back to reference-flow short descriptions, then to process base names.'\n }`,\n );\n lines.push('');\n\n lines.push(isZh ? '## Top 领域' : '## Top Domains');\n lines.push('');\n lines.push(`| ${isZh ? '领域' : 'Domain'} | ${isZh ? '数量' : 'Count'} |`);\n lines.push('| --- | --- |');\n statistics.domainPrimarySummary.slice(0, 15).forEach((item) => {\n lines.push(`| ${escapePipe(item.domain)} | ${item.count} |`);\n });\n lines.push('');\n\n lines.push(isZh ? '## Top 工艺/路线' : '## Top Crafts / Routes');\n lines.push('');\n lines.push(\n `| ${isZh ? '工艺/路线' : 'Craft / Route'} | ${isZh ? '数量' : 'Count'} | ${isZh ? '来源' : 'Source'} |`,\n );\n lines.push('| --- | --- | --- |');\n statistics.craftSummary.slice(0, 15).forEach((item) => {\n lines.push(`| ${escapePipe(item.label)} | ${item.count} | ${item.source_kind} |`);\n });\n lines.push('');\n\n lines.push(isZh ? '## Top 产品' : '## Top Products');\n lines.push('');\n lines.push(\n `| ${isZh ? '产品' : 'Product'} | ${isZh ? '数量' : 'Count'} | ${isZh ? '标识来源' : 'Key source'} |`,\n );\n lines.push('| --- | --- | --- |');\n statistics.productSummary.slice(0, 15).forEach((item) => {\n lines.push(`| ${escapePipe(item.label)} | ${item.count} | ${item.source_kind} |`);\n });\n lines.push('');\n\n return `${lines.join('\\n')}\\n`;\n}\n\nfunction readSnapshotRows(filePath: string): SnapshotRow[] {\n return readJsonLinesArtifact(filePath)\n .map((row) => normalizeSnapshotRow(row))\n .filter((row): row is SnapshotRow => row !== null);\n}\n\nfunction readSnapshotManifest(filePath: string): JsonRecord | null {\n const value = readJsonArtifact(filePath);\n return isRecord(value) ? value : null;\n}\n\nexport async function runProcessScopeStatistics(\n options: RunProcessScopeStatisticsOptions,\n): Promise<ProcessScopeStatisticsReport> {\n const outDir = trimText(options.outDir);\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'PROCESS_SCOPE_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const scope = ensureScope(options.scope);\n const stateCodes = normalizeStateCodes(options.stateCodes);\n const pageSize = toPositiveInteger(\n options.pageSize ?? DEFAULT_PAGE_SIZE,\n '--page-size',\n 'PROCESS_SCOPE_PAGE_SIZE_INVALID',\n );\n const timeoutMs = toPositiveInteger(\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n '--timeout-ms',\n 'PROCESS_SCOPE_TIMEOUT_INVALID',\n );\n const maxRetries = toPositiveInteger(\n options.maxRetries ?? DEFAULT_MAX_RETRIES,\n 'process scope statistics retry count',\n 'PROCESS_SCOPE_MAX_RETRIES_INVALID',\n );\n\n const resolvedOutDir = path.resolve(outDir);\n const snapshotRowsPath = path.join(resolvedOutDir, 'inputs', 'processes.snapshot.rows.jsonl');\n const snapshotManifestPath = path.join(\n resolvedOutDir,\n 'inputs',\n 'processes.snapshot.manifest.json',\n );\n const generatedAtUtc = nowIso(options.now);\n\n let rows: SnapshotRow[];\n let metadata: StatisticsMetadata;\n\n if (options.reuseSnapshot) {\n rows = readSnapshotRows(snapshotRowsPath);\n const manifest = readSnapshotManifest(snapshotManifestPath);\n metadata = {\n userId: normalizeOptionalToken(manifest?.user_id),\n maskedUserEmail: normalizeOptionalToken(manifest?.masked_user_email),\n totalRowsReportedByRemote:\n typeof manifest?.total_rows === 'number' ? manifest.total_rows : rows.length,\n };\n } else {\n const env = options.env ?? process.env;\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const restRuntime = requireSupabaseRestRuntime(env);\n const userApiKeyCredentials = requireUserApiKeyCredentials(restRuntime.userApiKey);\n const userId =\n scope === 'current-user'\n ? await resolveCurrentUserId({\n env,\n fetchImpl,\n timeoutMs,\n now: options.now ?? new Date(),\n maxRetries,\n })\n : null;\n const snapshot = await fetchProcessRows({\n env,\n fetchImpl,\n timeoutMs,\n maxRetries,\n scope,\n stateCodes,\n pageSize,\n userId,\n });\n rows = snapshot.rows;\n metadata = {\n userId,\n maskedUserEmail: redactEmail(userApiKeyCredentials.email),\n totalRowsReportedByRemote: snapshot.total ?? rows.length,\n };\n\n writeJsonLinesArtifact(snapshotRowsPath, rows);\n writeJsonArtifact(snapshotManifestPath, {\n schema_version: 1,\n generated_at_utc: generatedAtUtc,\n masked_user_email: metadata.maskedUserEmail,\n user_id: metadata.userId,\n scope,\n state_codes: stateCodes,\n page_size: pageSize,\n total_rows: metadata.totalRowsReportedByRemote,\n });\n }\n\n const statistics = calculateStatistics(\n rows,\n {\n scope,\n stateCodes,\n },\n metadata,\n generatedAtUtc,\n );\n\n const summaryPath = path.join(resolvedOutDir, 'outputs', 'process-scope-summary.json');\n const domainPath = path.join(resolvedOutDir, 'outputs', 'domain-summary.json');\n const craftPath = path.join(resolvedOutDir, 'outputs', 'craft-summary.json');\n const productPath = path.join(resolvedOutDir, 'outputs', 'product-summary.json');\n const datasetTypePath = path.join(resolvedOutDir, 'outputs', 'type-of-dataset-summary.json');\n const reportPath = path.join(resolvedOutDir, 'reports', 'process-scope-statistics.md');\n const reportZhPath = path.join(resolvedOutDir, 'reports', 'process-scope-statistics.zh-CN.md');\n\n writeJsonArtifact(summaryPath, statistics.summary);\n writeJsonArtifact(domainPath, {\n primary: statistics.domainPrimarySummary,\n leaf: statistics.domainLeafSummary,\n });\n writeJsonArtifact(craftPath, {\n craft_summary: statistics.craftSummary,\n source_summary: statistics.craftSourceSummary,\n });\n writeJsonArtifact(productPath, {\n product_summary: statistics.productSummary,\n source_summary: statistics.productSourceSummary,\n });\n writeJsonArtifact(datasetTypePath, statistics.typeOfDataSetSummary);\n writeTextArtifact(reportPath, renderMarkdownReport(statistics, 'en'));\n writeTextArtifact(reportZhPath, renderMarkdownReport(statistics, 'zh'));\n\n return {\n schema_version: 1,\n generated_at_utc: generatedAtUtc,\n status: 'completed_process_scope_statistics',\n out_dir: resolvedOutDir,\n scope,\n state_codes: stateCodes,\n total_process_rows: statistics.summary.total_process_rows,\n domain_count_primary: statistics.summary.domain_count_primary,\n domain_count_leaf: statistics.summary.domain_count_leaf,\n craft_count: statistics.summary.craft_count,\n unit_process_rows: statistics.summary.unit_process_rows,\n product_count: statistics.summary.product_count,\n files: {\n snapshot_manifest: snapshotManifestPath,\n snapshot_rows: snapshotRowsPath,\n process_scope_summary: summaryPath,\n domain_summary: domainPath,\n craft_summary: craftPath,\n product_summary: productPath,\n type_of_dataset_summary: datasetTypePath,\n report: reportPath,\n report_zh: reportZhPath,\n },\n };\n}\n\nexport const __testInternals = {\n calculateStatistics,\n ensureScope,\n escapePipe,\n extractClassificationEntries,\n extractCraftCandidate,\n extractReferenceProduct,\n fetchJsonWithRetry,\n fetchProcessRows,\n getAnyLangText,\n getLangList,\n getLangText,\n normalizePayload,\n normalizeSignature,\n normalizeSnapshotRow,\n normalizeStateCodes,\n parseJsonResponse,\n readSnapshotManifest,\n resolveCurrentUserId,\n renderMarkdownReport,\n toPositiveInteger,\n};\n"]}
@@ -0,0 +1,250 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';
4
+ import { CliError } from './errors.js';
5
+ import { validateProcessPayload, } from './process-payload-validation.js';
6
+ function isRecord(value) {
7
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
8
+ }
9
+ function trimText(value) {
10
+ return typeof value === 'string' ? value.trim() : '';
11
+ }
12
+ function requiredNonEmpty(value, label, code) {
13
+ const normalized = value.trim();
14
+ if (!normalized) {
15
+ throw new CliError(`Missing required ${label}.`, {
16
+ code,
17
+ exitCode: 2,
18
+ });
19
+ }
20
+ return normalized;
21
+ }
22
+ function readRowsFile(filePath) {
23
+ if (!existsSync(filePath)) {
24
+ throw new CliError(`Rows file not found: ${filePath}`, {
25
+ code: 'PROCESS_VERIFY_ROWS_FILE_NOT_FOUND',
26
+ exitCode: 2,
27
+ });
28
+ }
29
+ const text = readFileSync(filePath, 'utf8');
30
+ if (filePath.toLowerCase().endsWith('.jsonl')) {
31
+ return text
32
+ .split(/\r?\n/u)
33
+ .map((line) => line.trim())
34
+ .filter(Boolean)
35
+ .map((line, index) => {
36
+ try {
37
+ return JSON.parse(line);
38
+ }
39
+ catch (error) {
40
+ throw new CliError(`Rows file contains invalid JSONL at line ${index + 1}: ${filePath}`, {
41
+ code: 'PROCESS_VERIFY_ROWS_FILE_INVALID_JSONL',
42
+ exitCode: 2,
43
+ details: String(error),
44
+ });
45
+ }
46
+ });
47
+ }
48
+ try {
49
+ const parsed = JSON.parse(text);
50
+ if (Array.isArray(parsed)) {
51
+ return parsed;
52
+ }
53
+ if (isRecord(parsed) && Array.isArray(parsed.rows)) {
54
+ return parsed.rows;
55
+ }
56
+ return [parsed];
57
+ }
58
+ catch (error) {
59
+ throw new CliError(`Rows file is not valid JSON: ${filePath}`, {
60
+ code: 'PROCESS_VERIFY_ROWS_FILE_INVALID_JSON',
61
+ exitCode: 2,
62
+ details: String(error),
63
+ });
64
+ }
65
+ }
66
+ function getPayload(row) {
67
+ if (isRecord(row) && isRecord(row.process)) {
68
+ return row.process;
69
+ }
70
+ if (isRecord(row) && isRecord(row.json_ordered)) {
71
+ return row.json_ordered;
72
+ }
73
+ if (isRecord(row) && isRecord(row.json)) {
74
+ return row.json;
75
+ }
76
+ if (isRecord(row)) {
77
+ return row;
78
+ }
79
+ return {};
80
+ }
81
+ function firstNonEmpty(...values) {
82
+ for (const value of values) {
83
+ const normalized = trimText(value);
84
+ if (normalized) {
85
+ return normalized;
86
+ }
87
+ }
88
+ return null;
89
+ }
90
+ function getIdentity(row, payload, index) {
91
+ const root = isRecord(payload.processDataSet) ? payload.processDataSet : payload;
92
+ const processInformation = isRecord(root.processInformation) ? root.processInformation : {};
93
+ const dataSetInformation = isRecord(processInformation.dataSetInformation)
94
+ ? processInformation.dataSetInformation
95
+ : {};
96
+ const administrativeInformation = isRecord(root.administrativeInformation)
97
+ ? root.administrativeInformation
98
+ : {};
99
+ const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)
100
+ ? administrativeInformation.publicationAndOwnership
101
+ : {};
102
+ return {
103
+ row_index: index,
104
+ id: firstNonEmpty(isRecord(row) ? row.id : null, isRecord(row) ? row.process_id : null, dataSetInformation['common:UUID'], payload.id, payload['@id']),
105
+ version: firstNonEmpty(isRecord(row) ? row.version : null, publicationAndOwnership['common:dataSetVersion'], payload.version, payload['@version']),
106
+ };
107
+ }
108
+ function getLangList(value) {
109
+ if (value === null || value === undefined || value === '') {
110
+ return [];
111
+ }
112
+ if (Array.isArray(value)) {
113
+ return value.filter((entry) => isRecord(entry));
114
+ }
115
+ if (isRecord(value)) {
116
+ const langString = value['common:langString'];
117
+ if (Array.isArray(langString)) {
118
+ return langString.filter((entry) => isRecord(entry));
119
+ }
120
+ if (isRecord(langString)) {
121
+ return [langString];
122
+ }
123
+ if (value['#text'] !== undefined || value['@xml:lang'] !== undefined) {
124
+ return [value];
125
+ }
126
+ }
127
+ if (typeof value === 'string') {
128
+ return [{ '@xml:lang': 'en', '#text': value }];
129
+ }
130
+ return [];
131
+ }
132
+ function getLangText(value, lang) {
133
+ const entries = getLangList(value);
134
+ if (lang) {
135
+ for (const entry of entries) {
136
+ if (trimText(entry['@xml:lang']).toLowerCase() === lang.toLowerCase() &&
137
+ trimText(entry['#text'])) {
138
+ return trimText(entry['#text']);
139
+ }
140
+ }
141
+ }
142
+ for (const entry of entries) {
143
+ if (trimText(entry['#text'])) {
144
+ return trimText(entry['#text']);
145
+ }
146
+ }
147
+ return '';
148
+ }
149
+ function hasOwn(objectValue, key) {
150
+ return Object.prototype.hasOwnProperty.call(objectValue, key);
151
+ }
152
+ function summarizeNameFields(payload) {
153
+ const root = isRecord(payload.processDataSet) ? payload.processDataSet : payload;
154
+ const processInformation = isRecord(root.processInformation) ? root.processInformation : {};
155
+ const dataSetInformation = isRecord(processInformation.dataSetInformation)
156
+ ? processInformation.dataSetInformation
157
+ : {};
158
+ const name = isRecord(dataSetInformation.name) ? dataSetInformation.name : {};
159
+ const fieldNames = [
160
+ 'baseName',
161
+ 'treatmentStandardsRoutes',
162
+ 'mixAndLocationTypes',
163
+ 'functionalUnitFlowProperties',
164
+ ];
165
+ const fields = {};
166
+ for (const fieldName of fieldNames) {
167
+ fields[fieldName] = {
168
+ present: hasOwn(name, fieldName),
169
+ en: getLangText(name[fieldName], 'en'),
170
+ zh: getLangText(name[fieldName], 'zh'),
171
+ any: getLangText(name[fieldName], null),
172
+ };
173
+ }
174
+ const missingRequired = ['baseName', 'treatmentStandardsRoutes', 'mixAndLocationTypes'].filter((fieldName) => !fields[fieldName].present);
175
+ return {
176
+ missing_required_fields: missingRequired,
177
+ fields,
178
+ };
179
+ }
180
+ function nowIso(now = new Date()) {
181
+ return now.toISOString();
182
+ }
183
+ export async function runProcessVerifyRows(options) {
184
+ const rowsFile = path.resolve(requiredNonEmpty(options.rowsFile, '--rows-file', 'PROCESS_VERIFY_ROWS_FILE_REQUIRED'));
185
+ const outDir = path.resolve(requiredNonEmpty(options.outDir, '--out-dir', 'PROCESS_VERIFY_OUT_DIR_REQUIRED'));
186
+ const validate = options.validateProcessPayloadImpl ?? validateProcessPayload;
187
+ const rows = readRowsFile(rowsFile);
188
+ const generatedAtUtc = nowIso(options.now);
189
+ const records = rows.map((row, index) => {
190
+ const payload = getPayload(row);
191
+ const identity = getIdentity(row, payload, index);
192
+ const validation = validate(payload);
193
+ const nameSummary = summarizeNameFields(payload);
194
+ return {
195
+ ...identity,
196
+ status: validation.ok && nameSummary.missing_required_fields.length === 0 ? 'ok' : 'invalid',
197
+ validation,
198
+ name_summary: nameSummary,
199
+ };
200
+ });
201
+ const invalidRows = records
202
+ .filter((record) => record.status === 'invalid')
203
+ .map((record) => ({
204
+ id: record.id,
205
+ version: record.version,
206
+ row_index: record.row_index,
207
+ missing_required_fields: record.name_summary.missing_required_fields,
208
+ schema_issue_count: record.validation.issue_count,
209
+ }));
210
+ const invalidCount = invalidRows.length;
211
+ const summaryPath = path.join(outDir, 'outputs', 'summary.json');
212
+ const verificationPath = path.join(outDir, 'outputs', 'verification.jsonl');
213
+ writeJsonArtifact(summaryPath, {
214
+ generated_at_utc: generatedAtUtc,
215
+ rows_file: rowsFile,
216
+ row_count: records.length,
217
+ invalid_count: invalidCount,
218
+ schema_invalid_count: records.filter((record) => !record.validation.ok).length,
219
+ missing_required_name_field_count: records.filter((record) => record.name_summary.missing_required_fields.length > 0).length,
220
+ invalid_rows: invalidRows,
221
+ });
222
+ writeJsonLinesArtifact(verificationPath, records);
223
+ return {
224
+ schema_version: 1,
225
+ generated_at_utc: generatedAtUtc,
226
+ status: invalidCount > 0
227
+ ? 'completed_with_invalid_process_rows'
228
+ : 'completed_process_row_verification',
229
+ rows_file: rowsFile,
230
+ out_dir: outDir,
231
+ row_count: records.length,
232
+ invalid_count: invalidCount,
233
+ schema_invalid_count: records.filter((record) => !record.validation.ok).length,
234
+ missing_required_name_field_count: records.filter((record) => record.name_summary.missing_required_fields.length > 0).length,
235
+ invalid_rows: invalidRows,
236
+ files: {
237
+ summary_json: summaryPath,
238
+ verification_jsonl: verificationPath,
239
+ },
240
+ };
241
+ }
242
+ export const __testInternals = {
243
+ getIdentity,
244
+ getLangList,
245
+ getLangText,
246
+ getPayload,
247
+ readRowsFile,
248
+ summarizeNameFields,
249
+ };
250
+ //# sourceMappingURL=process-verify-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-verify-rows.js","sourceRoot":"","sources":["../../../src/lib/process-verify-rows.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 {\n validateProcessPayload,\n type ProcessPayloadValidationResult,\n} from './process-payload-validation.js';\n\ntype JsonObject = Record<string, unknown>;\n\ntype NameFieldKey =\n | 'baseName'\n | 'treatmentStandardsRoutes'\n | 'mixAndLocationTypes'\n | 'functionalUnitFlowProperties';\n\nexport type ProcessVerifyNameFieldSummary = {\n present: boolean;\n en: string;\n zh: string;\n any: string;\n};\n\nexport type ProcessVerifyRowRecord = {\n row_index: number;\n id: string | null;\n version: string | null;\n status: 'ok' | 'invalid';\n validation: ProcessPayloadValidationResult;\n name_summary: {\n missing_required_fields: Array<'baseName' | 'treatmentStandardsRoutes' | 'mixAndLocationTypes'>;\n fields: Record<NameFieldKey, ProcessVerifyNameFieldSummary>;\n };\n};\n\nexport type ProcessVerifyRowsReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_process_row_verification' | 'completed_with_invalid_process_rows';\n rows_file: string;\n out_dir: string;\n row_count: number;\n invalid_count: number;\n schema_invalid_count: number;\n missing_required_name_field_count: number;\n invalid_rows: Array<{\n id: string | null;\n version: string | null;\n row_index: number;\n missing_required_fields: Array<'baseName' | 'treatmentStandardsRoutes' | 'mixAndLocationTypes'>;\n schema_issue_count: number;\n }>;\n files: {\n summary_json: string;\n verification_jsonl: string;\n };\n};\n\nexport type RunProcessVerifyRowsOptions = {\n rowsFile: string;\n outDir: string;\n now?: Date;\n validateProcessPayloadImpl?: (payload: JsonObject) => ProcessPayloadValidationResult;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction requiredNonEmpty(value: string, label: string, code: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new CliError(`Missing required ${label}.`, {\n code,\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction readRowsFile(filePath: string): unknown[] {\n if (!existsSync(filePath)) {\n throw new CliError(`Rows file not found: ${filePath}`, {\n code: 'PROCESS_VERIFY_ROWS_FILE_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n const text = readFileSync(filePath, 'utf8');\n if (filePath.toLowerCase().endsWith('.jsonl')) {\n return text\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n try {\n return JSON.parse(line) as unknown;\n } catch (error) {\n throw new CliError(`Rows file contains invalid JSONL at line ${index + 1}: ${filePath}`, {\n code: 'PROCESS_VERIFY_ROWS_FILE_INVALID_JSONL',\n exitCode: 2,\n details: String(error),\n });\n }\n });\n }\n\n try {\n const parsed = JSON.parse(text) as unknown;\n if (Array.isArray(parsed)) {\n return parsed;\n }\n if (isRecord(parsed) && Array.isArray(parsed.rows)) {\n return parsed.rows;\n }\n return [parsed];\n } catch (error) {\n throw new CliError(`Rows file is not valid JSON: ${filePath}`, {\n code: 'PROCESS_VERIFY_ROWS_FILE_INVALID_JSON',\n exitCode: 2,\n details: String(error),\n });\n }\n}\n\nfunction getPayload(row: unknown): JsonObject {\n if (isRecord(row) && isRecord(row.process)) {\n return row.process;\n }\n if (isRecord(row) && isRecord(row.json_ordered)) {\n return row.json_ordered;\n }\n if (isRecord(row) && isRecord(row.json)) {\n return row.json;\n }\n if (isRecord(row)) {\n return row;\n }\n\n return {};\n}\n\nfunction firstNonEmpty(...values: unknown[]): string | null {\n for (const value of values) {\n const normalized = trimText(value);\n if (normalized) {\n return normalized;\n }\n }\n return null;\n}\n\nfunction getIdentity(row: unknown, payload: JsonObject, index: number) {\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\n return {\n row_index: index,\n id: firstNonEmpty(\n isRecord(row) ? row.id : null,\n isRecord(row) ? row.process_id : null,\n dataSetInformation['common:UUID'],\n payload.id,\n payload['@id'],\n ),\n version: firstNonEmpty(\n isRecord(row) ? row.version : null,\n publicationAndOwnership['common:dataSetVersion'],\n payload.version,\n payload['@version'],\n ),\n };\n}\n\nfunction getLangList(value: unknown): JsonObject[] {\n if (value === null || value === undefined || value === '') {\n return [];\n }\n if (Array.isArray(value)) {\n return value.filter((entry): entry is JsonObject => isRecord(entry));\n }\n if (isRecord(value)) {\n const langString = value['common:langString'];\n if (Array.isArray(langString)) {\n return langString.filter((entry): entry is JsonObject => isRecord(entry));\n }\n if (isRecord(langString)) {\n return [langString];\n }\n if (value['#text'] !== undefined || value['@xml:lang'] !== undefined) {\n return [value];\n }\n }\n if (typeof value === 'string') {\n return [{ '@xml:lang': 'en', '#text': value }];\n }\n return [];\n}\n\nfunction getLangText(value: unknown, lang: string | null): string {\n const entries = getLangList(value);\n if (lang) {\n for (const entry of entries) {\n if (\n trimText(entry['@xml:lang']).toLowerCase() === lang.toLowerCase() &&\n trimText(entry['#text'])\n ) {\n return trimText(entry['#text']);\n }\n }\n }\n for (const entry of entries) {\n if (trimText(entry['#text'])) {\n return trimText(entry['#text']);\n }\n }\n return '';\n}\n\nfunction hasOwn(objectValue: JsonObject, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(objectValue, key);\n}\n\nfunction summarizeNameFields(payload: JsonObject): {\n missing_required_fields: Array<'baseName' | 'treatmentStandardsRoutes' | 'mixAndLocationTypes'>;\n fields: Record<NameFieldKey, ProcessVerifyNameFieldSummary>;\n} {\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 name = isRecord(dataSetInformation.name) ? dataSetInformation.name : {};\n\n const fieldNames: NameFieldKey[] = [\n 'baseName',\n 'treatmentStandardsRoutes',\n 'mixAndLocationTypes',\n 'functionalUnitFlowProperties',\n ];\n\n const fields = {} as Record<NameFieldKey, ProcessVerifyNameFieldSummary>;\n for (const fieldName of fieldNames) {\n fields[fieldName] = {\n present: hasOwn(name, fieldName),\n en: getLangText(name[fieldName], 'en'),\n zh: getLangText(name[fieldName], 'zh'),\n any: getLangText(name[fieldName], null),\n };\n }\n\n const missingRequired = ['baseName', 'treatmentStandardsRoutes', 'mixAndLocationTypes'].filter(\n (fieldName) => !fields[fieldName as NameFieldKey].present,\n ) as Array<'baseName' | 'treatmentStandardsRoutes' | 'mixAndLocationTypes'>;\n\n return {\n missing_required_fields: missingRequired,\n fields,\n };\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nexport async function runProcessVerifyRows(\n options: RunProcessVerifyRowsOptions,\n): Promise<ProcessVerifyRowsReport> {\n const rowsFile = path.resolve(\n requiredNonEmpty(options.rowsFile, '--rows-file', 'PROCESS_VERIFY_ROWS_FILE_REQUIRED'),\n );\n const outDir = path.resolve(\n requiredNonEmpty(options.outDir, '--out-dir', 'PROCESS_VERIFY_OUT_DIR_REQUIRED'),\n );\n const validate = options.validateProcessPayloadImpl ?? validateProcessPayload;\n const rows = readRowsFile(rowsFile);\n const generatedAtUtc = nowIso(options.now);\n\n const records: ProcessVerifyRowRecord[] = rows.map((row, index) => {\n const payload = getPayload(row);\n const identity = getIdentity(row, payload, index);\n const validation = validate(payload);\n const nameSummary = summarizeNameFields(payload);\n return {\n ...identity,\n status: validation.ok && nameSummary.missing_required_fields.length === 0 ? 'ok' : 'invalid',\n validation,\n name_summary: nameSummary,\n };\n });\n\n const invalidRows = records\n .filter((record) => record.status === 'invalid')\n .map((record) => ({\n id: record.id,\n version: record.version,\n row_index: record.row_index,\n missing_required_fields: record.name_summary.missing_required_fields,\n schema_issue_count: record.validation.issue_count,\n }));\n const invalidCount = invalidRows.length;\n const summaryPath = path.join(outDir, 'outputs', 'summary.json');\n const verificationPath = path.join(outDir, 'outputs', 'verification.jsonl');\n\n writeJsonArtifact(summaryPath, {\n generated_at_utc: generatedAtUtc,\n rows_file: rowsFile,\n row_count: records.length,\n invalid_count: invalidCount,\n schema_invalid_count: records.filter((record) => !record.validation.ok).length,\n missing_required_name_field_count: records.filter(\n (record) => record.name_summary.missing_required_fields.length > 0,\n ).length,\n invalid_rows: invalidRows,\n });\n writeJsonLinesArtifact(verificationPath, records);\n\n return {\n schema_version: 1,\n generated_at_utc: generatedAtUtc,\n status:\n invalidCount > 0\n ? 'completed_with_invalid_process_rows'\n : 'completed_process_row_verification',\n rows_file: rowsFile,\n out_dir: outDir,\n row_count: records.length,\n invalid_count: invalidCount,\n schema_invalid_count: records.filter((record) => !record.validation.ok).length,\n missing_required_name_field_count: records.filter(\n (record) => record.name_summary.missing_required_fields.length > 0,\n ).length,\n invalid_rows: invalidRows,\n files: {\n summary_json: summaryPath,\n verification_jsonl: verificationPath,\n },\n };\n}\n\nexport const __testInternals = {\n getIdentity,\n getLangList,\n getLangText,\n getPayload,\n readRowsFile,\n summarizeNameFields,\n};\n"]}
@@ -2,6 +2,7 @@ import path from 'node:path';
2
2
  import { CliError } from './errors.js';
3
3
  import { writeJsonArtifact } from './artifacts.js';
4
4
  import { readJsonInput } from './io.js';
5
+ import { syncLifecyclemodelBundleRecord, } from './lifecyclemodel-bundle-save.js';
5
6
  import { syncStateAwareProcessRecord } from './process-save-draft.js';
6
7
  import { buildRunId, resolveRunLayout } from './run.js';
7
8
  import { hasSupabaseRestRuntime, syncSupabaseJsonOrderedRecord, } from './supabase-json-ordered-write.js';
@@ -156,13 +157,19 @@ function extract_source_identity(payload) {
156
157
  return [datasetId, version];
157
158
  }
158
159
  function load_dataset_entry(entry, baseDir) {
159
- if (isRecord(entry)) {
160
+ const source = load_dataset_entry_source(entry, baseDir);
161
+ if (isRecord(source)) {
160
162
  for (const key of ['json_ordered', 'jsonOrdered', 'payload']) {
161
- const candidate = entry[key];
163
+ const candidate = source[key];
162
164
  if (isRecord(candidate)) {
163
165
  return candidate;
164
166
  }
165
167
  }
168
+ }
169
+ return source;
170
+ }
171
+ function load_dataset_entry_source(entry, baseDir) {
172
+ if (isRecord(entry)) {
166
173
  const fileValue = first_non_empty(entry.file, entry.path);
167
174
  if (fileValue) {
168
175
  return load_json_object(resolve_path(baseDir, fileValue));
@@ -178,6 +185,35 @@ function load_dataset_entry(entry, baseDir) {
178
185
  details: entry,
179
186
  });
180
187
  }
188
+ function load_lifecyclemodel_publish_entry(entry, baseDir) {
189
+ const source = load_dataset_entry_source(entry, baseDir);
190
+ const payload = load_dataset_entry(entry, baseDir);
191
+ const metadata = {};
192
+ const jsonTg = isRecord(source.json_tg)
193
+ ? source.json_tg
194
+ : isRecord(source.jsonTg)
195
+ ? source.jsonTg
196
+ : null;
197
+ if (jsonTg) {
198
+ metadata.json_tg = jsonTg;
199
+ }
200
+ const processMutations = source.processMutations ?? source.process_mutations;
201
+ if (Array.isArray(processMutations)) {
202
+ metadata.processMutations = processMutations;
203
+ }
204
+ const ruleVerification = typeof source.ruleVerification === 'boolean'
205
+ ? source.ruleVerification
206
+ : typeof source.rule_verification === 'boolean'
207
+ ? source.rule_verification
208
+ : undefined;
209
+ if (typeof ruleVerification === 'boolean') {
210
+ metadata.ruleVerification = ruleVerification;
211
+ }
212
+ return {
213
+ payload,
214
+ metadata: Object.keys(metadata).length > 0 ? metadata : null,
215
+ };
216
+ }
181
217
  function push_collected_entries(target, entries, origin) {
182
218
  for (const entry of entries) {
183
219
  target.push({ entry: entry, origin });
@@ -285,6 +321,7 @@ async function maybe_execute_dataset(report, payload, options) {
285
321
  id: report.id,
286
322
  version: report.version,
287
323
  payload,
324
+ metadata: options.metadata,
288
325
  source: report.source,
289
326
  bundle_path: report.bundle_path,
290
327
  publish: options.publish,
@@ -300,7 +337,8 @@ async function maybe_execute_dataset(report, payload, options) {
300
337
  async function publish_lifecyclemodels(entries, options) {
301
338
  const reports = [];
302
339
  for (const item of entries) {
303
- const payload = load_dataset_entry(item.entry, item.origin.base_dir);
340
+ const loaded = load_lifecyclemodel_publish_entry(item.entry, item.origin.base_dir);
341
+ const payload = loaded.payload;
304
342
  const [datasetId, version] = extract_lifecyclemodel_identity(payload);
305
343
  const report = {
306
344
  table: 'lifecyclemodels',
@@ -314,6 +352,7 @@ async function publish_lifecyclemodels(entries, options) {
314
352
  ...options,
315
353
  table: 'lifecyclemodels',
316
354
  executor: options.executor,
355
+ metadata: loaded.metadata,
317
356
  }));
318
357
  }
319
358
  return reports;
@@ -444,12 +483,23 @@ function build_default_dataset_executor(options) {
444
483
  fetchImpl: options.fetchImpl,
445
484
  timeoutMs: options.timeoutMs,
446
485
  audit: {
447
- command: 'tiangong publish run',
486
+ command: 'tiangong-lca publish run',
448
487
  source: args.source,
449
488
  bundle_path: args.bundle_path,
450
489
  },
451
490
  });
452
491
  }
492
+ if (options.table === 'lifecyclemodels') {
493
+ return syncLifecyclemodelBundleRecord({
494
+ id: args.id,
495
+ version: args.version,
496
+ payload: args.payload,
497
+ metadata: args.metadata ?? null,
498
+ env: options.env,
499
+ fetchImpl: options.fetchImpl,
500
+ timeoutMs: options.timeoutMs,
501
+ });
502
+ }
453
503
  return syncSupabaseJsonOrderedRecord({
454
504
  table: options.table,
455
505
  id: args.id,