@tiangong-lca/cli 0.0.4 → 0.0.5
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.
- package/README.md +31 -23
- package/bin/tiangong.js +15 -2
- package/dist/src/cli.js +255 -7
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-command.js +115 -96
- package/dist/src/lib/dataset-command.js.map +1 -1
- package/dist/src/lib/flow-publish-version.js +13 -13
- package/dist/src/lib/flow-publish-version.js.map +1 -1
- package/dist/src/lib/http.js +19 -0
- package/dist/src/lib/http.js.map +1 -1
- package/dist/src/lib/package-version.js +23 -0
- package/dist/src/lib/package-version.js.map +1 -0
- package/dist/src/lib/process-list.js +337 -0
- package/dist/src/lib/process-list.js.map +1 -0
- package/dist/src/lib/process-save-draft-run.js +325 -0
- package/dist/src/lib/process-save-draft-run.js.map +1 -0
- package/dist/src/lib/process-save-draft.js +165 -0
- package/dist/src/lib/process-save-draft.js.map +1 -0
- package/dist/src/lib/publish.js +28 -10
- package/dist/src/lib/publish.js.map +1 -1
- package/dist/src/lib/review-process.js +180 -9
- package/dist/src/lib/review-process.js.map +1 -1
- package/dist/src/lib/supabase-json-ordered-write.js +14 -32
- package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-process.js","sourceRoot":"","sources":["../../../src/lib/review-process.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeTextArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { readJsonInput } from './io.js';\nimport { invokeLlm, readLlmRuntimeEnv, type LlmRuntimeEnv } from './llm.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nconst KIND_RE = /\\[tg_io_kind_tag=([^\\]]+)\\]/gu;\nconst UOM_RE = /\\[tg_io_uom_tag=([^\\]]+)\\]/gu;\n\nconst ENERGY_WORDS = [\n 'electric',\n 'electricity',\n 'kwh',\n 'mj',\n 'heat',\n 'steam',\n 'fuel',\n 'diesel',\n 'gas',\n 'power',\n '电',\n '能',\n] as const;\n\nconst RAW_WORDS = [\n 'raw material',\n 'feedstock',\n 'fertilizer',\n 'water',\n 'seed',\n 'pesticide',\n '原材料',\n '投入',\n '肥料',\n '种子',\n '农药',\n '用水',\n] as const;\n\nconst BYP_WORDS = ['by-product', 'co-product', '副产品', '联产'] as const;\nconst WASTE_WORDS = ['waste', '废', 'residue', 'sludge'] as const;\n\ntype BaseInfoCheck = {\n name_zh_en_ok: boolean;\n functional_unit_ok: boolean;\n system_boundary_ok: boolean;\n time_ok: boolean;\n geo_ok: boolean;\n tech_ok: boolean;\n admin_ok: boolean;\n completeness_score: number;\n base_names: string[];\n};\n\ntype ClassifiedExchange = {\n classification:\n | 'raw_material_input'\n | 'energy_input'\n | 'other_input'\n | 'product_output'\n | 'byproduct_output'\n | 'waste_output'\n | 'other_output'\n | 'other';\n kinds: string[];\n uoms: string[];\n blob: string;\n};\n\ntype UnitIssue = {\n flow_uuid: string;\n current_unit: string;\n suggested_unit: string;\n basis: string;\n confidence: string;\n};\n\ntype ProcessReviewRow = {\n process_file: string;\n raw_input: number;\n product: number;\n byproduct: number;\n waste: number;\n energy_excluded: number;\n delta: number;\n relative_deviation: number | null;\n};\n\ntype ProcessReviewTotals = {\n raw_input: number;\n product_plus_byproduct_plus_waste: number;\n delta: number;\n relative_deviation: number | null;\n energy_excluded: number;\n};\n\ntype ProcessSummaryForLlm = {\n process_file: string;\n base_names: string[];\n base_checks: {\n name_zh_en_ok: boolean;\n functional_unit_ok: boolean;\n system_boundary_ok: boolean;\n time_ok: boolean;\n geo_ok: boolean;\n tech_ok: boolean;\n admin_ok: boolean;\n };\n balance: {\n raw_in: number;\n product: number;\n byproduct: number;\n waste: number;\n energy_excluded: number;\n relative_deviation: number | null;\n };\n};\n\nexport type ProcessReviewLlmResult =\n | {\n enabled: false;\n reason: string;\n }\n | {\n enabled: true;\n ok: true;\n result: JsonRecord;\n }\n | {\n enabled: true;\n ok: false;\n reason: string;\n raw?: string;\n };\n\nexport type ProcessReviewSummary = {\n run_id: string;\n logic_version: string;\n process_count: number;\n totals: ProcessReviewTotals;\n llm: ProcessReviewLlmResult;\n};\n\nexport type ProcessReviewReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_local_process_review';\n run_id: string;\n run_root: string;\n out_dir: string;\n logic_version: string;\n process_count: number;\n totals: ProcessReviewTotals;\n files: {\n review_zh: string;\n review_en: string;\n timing: string;\n unit_issue_log: string;\n summary: string;\n report: string;\n };\n llm: ProcessReviewLlmResult;\n};\n\nexport type RunProcessReviewOptions = {\n runRoot: string;\n runId: string;\n outDir: string;\n startTs?: string;\n endTs?: string;\n logicVersion?: string;\n enableLlm?: boolean;\n llmModel?: string;\n llmMaxProcesses?: number;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n now?: () => Date;\n};\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction requiredNonEmpty(value: string | undefined, label: string, code: string): string {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n\n throw new CliError(`Missing required ${label}.`, {\n code,\n exitCode: 2,\n });\n}\n\nfunction textFromValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value\n .filter(isRecord)\n .map((item) => String(item['#text'] ?? ''))\n .join(' ');\n }\n\n if (isRecord(value)) {\n return String(value['#text'] ?? '');\n }\n\n return String(value ?? '');\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : 0;\n }\n\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : 0;\n }\n\n return 0;\n}\n\nfunction deepGet(value: unknown, pathParts: string[]): unknown {\n let current: unknown = value;\n\n for (const key of pathParts) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[key];\n if (current === undefined || current === null) {\n return undefined;\n }\n }\n\n return current;\n}\n\nfunction hasNonEmpty(value: unknown): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n\n if (typeof value === 'string') {\n return value.trim().length > 0;\n }\n\n if (Array.isArray(value)) {\n return value.some((item) => hasNonEmpty(item));\n }\n\n if (isRecord(value)) {\n if ('#text' in value) {\n return hasNonEmpty(value['#text']);\n }\n return Object.values(value).some((item) => hasNonEmpty(item));\n }\n\n return true;\n}\n\nfunction extractBaseNames(processPayload: JsonRecord): [boolean, boolean, string[]] {\n const base = deepGet(processPayload, [\n 'processDataSet',\n 'processInformation',\n 'dataSetInformation',\n 'name',\n 'baseName',\n ]);\n const items = Array.isArray(base) ? base : base ? [base] : [];\n let zh = false;\n let en = false;\n const values: string[] = [];\n\n items.forEach((item) => {\n if (!isRecord(item)) {\n return;\n }\n const lang = String(item['@xml:lang'] ?? '').toLowerCase();\n const text = String(item['#text'] ?? '').trim();\n if (!text) {\n return;\n }\n values.push(text);\n if (lang.startsWith('zh')) {\n zh = true;\n }\n if (lang.startsWith('en')) {\n en = true;\n }\n });\n\n if (!(zh && en) && values.length >= 2) {\n zh = zh || true;\n en = en || true;\n }\n\n return [zh, en, values];\n}\n\nfunction classifyExchange(exchange: JsonRecord): ClassifiedExchange {\n const comments =\n `${textFromValue(exchange.commonComment)} ${textFromValue(exchange.generalComment)}`.toLowerCase();\n const flowDescription = textFromValue(\n isRecord(exchange.referenceToFlowDataSet)\n ? exchange.referenceToFlowDataSet['common:shortDescription']\n : undefined,\n ).toLowerCase();\n const blob = `${comments} ${flowDescription}`.trim();\n const kinds = Array.from(blob.matchAll(KIND_RE), (match) => match[1].toLowerCase());\n const kindSet = new Set(kinds);\n const uoms = Array.from(blob.matchAll(UOM_RE), (match) => match[1].toLowerCase());\n const direction = String(exchange.exchangeDirection ?? '').toLowerCase();\n const isEnergy =\n ENERGY_WORDS.some((word) => blob.includes(word)) ||\n uoms.some((uom) => uom === 'kwh' || uom === 'mj' || uom === 'gj');\n\n if (direction === 'input') {\n if (kindSet.has('energy') || isEnergy) {\n return { classification: 'energy_input', kinds, uoms, blob };\n }\n if (kindSet.has('waste')) {\n return { classification: 'other_input', kinds, uoms, blob };\n }\n if (kindSet.has('raw_material') || kindSet.has('resource')) {\n return { classification: 'raw_material_input', kinds, uoms, blob };\n }\n if (kindSet.has('product') || RAW_WORDS.some((word) => blob.includes(word))) {\n return { classification: 'raw_material_input', kinds, uoms, blob };\n }\n return { classification: 'other_input', kinds, uoms, blob };\n }\n\n if (direction === 'output') {\n if (kindSet.has('waste') || WASTE_WORDS.some((word) => blob.includes(word))) {\n return { classification: 'waste_output', kinds, uoms, blob };\n }\n if (BYP_WORDS.some((word) => blob.includes(word))) {\n return { classification: 'byproduct_output', kinds, uoms, blob };\n }\n if (kindSet.has('product')) {\n return { classification: 'product_output', kinds, uoms, blob };\n }\n return { classification: 'other_output', kinds, uoms, blob };\n }\n\n return { classification: 'other', kinds, uoms, blob };\n}\n\nfunction unitIssueCheck(exchange: JsonRecord, uoms: string[], blob: string): UnitIssue[] {\n const flowUuid = isRecord(exchange.referenceToFlowDataSet)\n ? String(exchange.referenceToFlowDataSet['@refObjectId'] ?? '')\n : '';\n\n if (!flowUuid) {\n return [];\n }\n\n const currentUnit = uoms[0] ?? '';\n if (\n ['electric', 'electricity', '交流电', '电力'].some((word) => blob.includes(word)) &&\n currentUnit &&\n !['kwh', 'mj', 'gj'].includes(currentUnit)\n ) {\n return [\n {\n flow_uuid: flowUuid,\n current_unit: currentUnit,\n suggested_unit: 'kWh',\n basis: 'flow 描述为电力/电能,但 uom 标签非能量单位',\n confidence: '高',\n },\n ];\n }\n\n if (\n ['water', '用水', '工艺用水'].some((word) => blob.includes(word)) &&\n currentUnit &&\n ['kwh', 'mj', 'gj'].includes(currentUnit)\n ) {\n return [\n {\n flow_uuid: flowUuid,\n current_unit: currentUnit,\n suggested_unit: 'm3 或 kg',\n basis: 'flow 描述为水,但 uom 标签为能量单位',\n confidence: '高',\n },\n ];\n }\n\n if (\n ['co2', 'carbon dioxide', '二氧化碳'].some((word) => blob.includes(word)) &&\n currentUnit &&\n ['kwh', 'mj', 'gj'].includes(currentUnit)\n ) {\n return [\n {\n flow_uuid: flowUuid,\n current_unit: currentUnit,\n suggested_unit: 'kg',\n basis: '排放流通常质量单位计,当前为能量单位',\n confidence: '中',\n },\n ];\n }\n\n return [];\n}\n\nfunction baseInfoCheck(processPayload: JsonRecord): BaseInfoCheck {\n const [zhOk, enOk, values] = extractBaseNames(processPayload);\n const functionalUnit = deepGet(processPayload, [\n 'processDataSet',\n 'processInformation',\n 'quantitativeReference',\n 'functionalUnitOrOther',\n ]);\n const mixAndLocation = deepGet(processPayload, [\n 'processDataSet',\n 'processInformation',\n 'geography',\n 'mixAndLocationTypes',\n ]);\n const route = deepGet(processPayload, [\n 'processDataSet',\n 'modellingAndValidation',\n 'LCIMethodAndAllocation',\n 'typeOfDataSet',\n ]);\n const time = deepGet(processPayload, ['processDataSet', 'processInformation', 'time']);\n const geography = deepGet(processPayload, ['processDataSet', 'processInformation', 'geography']);\n const technology = deepGet(processPayload, ['processDataSet', 'modellingAndValidation']);\n const administrativeInformation = deepGet(processPayload, [\n 'processDataSet',\n 'administrativeInformation',\n ]);\n\n const nameOk = zhOk && enOk;\n const functionalUnitOk = hasNonEmpty(functionalUnit);\n const systemBoundaryOk = hasNonEmpty(mixAndLocation) || hasNonEmpty(route);\n const timeOk = hasNonEmpty(time);\n const geographyOk = hasNonEmpty(geography);\n const technologyOk = hasNonEmpty(technology);\n const administrativeOk = hasNonEmpty(administrativeInformation);\n const completenessScore = [\n nameOk,\n functionalUnitOk,\n systemBoundaryOk,\n timeOk,\n geographyOk,\n technologyOk,\n administrativeOk,\n ].filter(Boolean).length;\n\n return {\n name_zh_en_ok: nameOk,\n functional_unit_ok: functionalUnitOk,\n system_boundary_ok: systemBoundaryOk,\n time_ok: timeOk,\n geo_ok: geographyOk,\n tech_ok: technologyOk,\n admin_ok: administrativeOk,\n completeness_score: completenessScore,\n base_names: values,\n };\n}\n\nfunction unwrapProcessPayload(value: unknown, filePath: string): JsonRecord {\n if (!isRecord(value)) {\n throw new CliError(`Expected process review file to contain a JSON object: ${filePath}`, {\n code: 'PROCESS_REVIEW_INPUT_INVALID',\n exitCode: 2,\n });\n }\n\n const candidate =\n (isRecord(value.json_ordered) && value.json_ordered) ||\n (isRecord(value.jsonOrdered) && value.jsonOrdered) ||\n (isRecord(value.json) && value.json) ||\n value;\n\n if (!isRecord(candidate.processDataSet)) {\n throw new CliError(`Process review file is missing processDataSet: ${filePath}`, {\n code: 'PROCESS_REVIEW_INPUT_INVALID',\n exitCode: 2,\n });\n }\n\n return candidate;\n}\n\nfunction readProcessFiles(runRoot: string): string[] {\n const processDir = path.join(runRoot, 'exports', 'processes');\n if (!existsSync(processDir) || !statSync(processDir).isDirectory()) {\n throw new CliError(`Process review exports directory not found: ${processDir}`, {\n code: 'PROCESS_REVIEW_EXPORTS_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n return readdirSync(processDir)\n .filter((entry) => entry.endsWith('.json'))\n .sort()\n .map((entry) => path.join(processDir, entry));\n}\n\nfunction buildPrompt(processSummaries: ProcessSummaryForLlm[]): string {\n return [\n '请基于以下 process 摘要做语义一致性审核(中英名称一致性、边界表达、修订建议)。',\n '要求:',\n '1) 只根据给定摘要;',\n '2) 证据不足必须明确标注;',\n '3) 输出 JSON,格式:{\"findings\":[{\"process_file\",\"severity\",\"fixability\",\"evidence\",\"action\"}]}。',\n '',\n `输入摘要:\\n${JSON.stringify(processSummaries, null, 2)}`,\n ].join('\\n');\n}\n\nfunction parseLlmJsonOutput(output: string): JsonRecord | null {\n const start = output.indexOf('{');\n const end = output.lastIndexOf('}');\n const candidate = start >= 0 && end > start ? output.slice(start, end + 1) : output;\n\n try {\n const parsed = JSON.parse(candidate) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nasync function runOptionalLlmReview(\n processSummaries: ProcessSummaryForLlm[],\n options: {\n enableLlm: boolean;\n llmModel: string | undefined;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n outDir: string;\n },\n): Promise<ProcessReviewLlmResult> {\n if (!options.enableLlm) {\n return {\n enabled: false,\n reason: 'disabled',\n };\n }\n\n let env = readLlmRuntimeEnv(options.env);\n if (options.llmModel) {\n env = {\n ...env,\n model: options.llmModel,\n } satisfies LlmRuntimeEnv;\n }\n\n try {\n const response = await invokeLlm({\n env,\n input: {\n prompt: '你是严谨的LCA审核助手。只给基于输入证据的判断,不得臆造。输出必须是JSON对象。',\n context: buildPrompt(processSummaries),\n },\n fetchImpl: options.fetchImpl,\n timeoutMs: 45_000,\n cacheDir: path.join(options.outDir, '.llm-cache'),\n tracePath: path.join(options.outDir, 'llm-trace.jsonl'),\n module: 'review-process',\n stage: 'semantic-review',\n runId: 'review-process',\n });\n\n const parsed = parseLlmJsonOutput(response.output);\n if (!parsed) {\n return {\n enabled: true,\n ok: false,\n reason: 'llm_non_json_output',\n raw: response.output.slice(0, 8_000),\n };\n }\n\n return {\n enabled: true,\n ok: true,\n result: parsed,\n };\n } catch (error) {\n return {\n enabled: true,\n ok: false,\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction formatPercent(value: number | null): string {\n return value === null ? '' : `${(value * 100).toFixed(2)}%`;\n}\n\nfunction renderZhReview(options: {\n runId: string;\n logicVersion: string;\n baseRows: Array<[string, BaseInfoCheck]>;\n rows: ProcessReviewRow[];\n totals: ProcessReviewTotals;\n llmResult: ProcessReviewLlmResult;\n evidenceStrong: string[];\n evidenceWeak: string[];\n}): string {\n const lines = [\n '# one_flow_rerun_review_v2_1_zh\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n '\\n## 2.1 基础信息核查\\n',\n '|process file|中英名称|功能单位|系统边界|时间|地理|技术|管理元数据|完整性得分(0-7)|\\n',\n '|---|---|---|---|---|---|---|---|---:|\\n',\n ];\n\n options.baseRows.forEach(([fileName, base]) => {\n lines.push(\n `|${fileName}|${base.name_zh_en_ok ? '✅' : '❌'}|${base.functional_unit_ok ? '✅' : '❌'}|${base.system_boundary_ok ? '✅' : '❌'}|${base.time_ok ? '✅' : '❌'}|${base.geo_ok ? '✅' : '❌'}|${base.tech_ok ? '✅' : '❌'}|${base.admin_ok ? '✅' : '❌'}|${base.completeness_score}|\\n`,\n );\n });\n\n lines.push(\n '\\n## 物料平衡口径\\n- 物料平衡:仅核查 `原材料投入 = 产品+副产品+废物`\\n- 能量投入:单列记录,不计入平衡\\n',\n );\n lines.push(\n '\\n## 分过程结果\\n|process file|原材料投入|产品|副产品|废物|能量投入(不计平衡)|差值(输出-投入)|相对偏差|\\n|---|---:|---:|---:|---:|---:|---:|---:|\\n',\n );\n\n options.rows.forEach((row) => {\n lines.push(\n `|${row.process_file}|${row.raw_input.toPrecision(6)}|${row.product.toPrecision(6)}|${row.byproduct.toPrecision(6)}|${row.waste.toPrecision(6)}|${row.energy_excluded.toPrecision(6)}|${row.delta.toPrecision(6)}|${formatPercent(row.relative_deviation)}|\\n`,\n );\n });\n\n lines.push(\n `\\n## 汇总\\n- 原材料投入合计: **${options.totals.raw_input.toPrecision(6)}**\\n- 产品+副产品+废物合计: **${options.totals.product_plus_byproduct_plus_waste.toPrecision(6)}**\\n- 差值(输出-投入): **${options.totals.delta.toPrecision(6)}**\\n- 相对偏差: **${formatPercent(options.totals.relative_deviation)}**\\n- 能量投入(不计平衡)合计: **${options.totals.energy_excluded.toPrecision(6)}**\\n`,\n );\n lines.push('\\n## LLM 语义审核层(可选)\\n');\n\n if (options.llmResult.enabled && options.llmResult.ok) {\n const findings = Array.isArray(options.llmResult.result.findings)\n ? options.llmResult.result.findings\n : [];\n if (findings.length > 0) {\n lines.push('\\n|process file|severity|fixability|evidence|action|\\n|---|---|---|---|---|\\n');\n findings.slice(0, 50).forEach((finding) => {\n const evidenceValue = isRecord(finding) ? finding.evidence : '';\n const evidence =\n typeof evidenceValue === 'string'\n ? evidenceValue\n : JSON.stringify(evidenceValue ?? '', null, 0);\n const action = isRecord(finding) ? String(finding.action ?? finding.suggestion ?? '') : '';\n lines.push(\n `|${String(isRecord(finding) ? (finding.process_file ?? '') : '').replaceAll('|', '/')}|${String(isRecord(finding) ? (finding.severity ?? '') : '').replaceAll('|', '/')}|${String(isRecord(finding) ? (finding.fixability ?? 'review-needed') : 'review-needed').replaceAll('|', '/')}|${evidence.replaceAll('|', '/')}|${action.replaceAll('|', '/')}|\\n`,\n );\n });\n }\n } else {\n lines.push(`- 未启用或调用失败:\\`${options.llmResult.reason}\\`\\n`);\n }\n\n lines.push(\n `\\n## 证据充足的结论\\n${options.evidenceStrong.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n lines.push(\n `\\n## 证据不足的结论/限制\\n${options.evidenceWeak.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n\n return lines.join('');\n}\n\nfunction renderEnReview(options: {\n runId: string;\n logicVersion: string;\n baseRows: Array<[string, BaseInfoCheck]>;\n rows: ProcessReviewRow[];\n totals: ProcessReviewTotals;\n evidenceStrong: string[];\n evidenceWeak: string[];\n}): string {\n const lines = [\n '# one_flow_rerun_review_v2_1_en\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n '\\n## 2.1 Basic info checks\\n',\n '|process file|zh+en names|functional unit|system boundary|time|geo|tech|admin metadata|completeness(0-7)|\\n',\n '|---|---|---|---|---|---|---|---|---:|\\n',\n ];\n\n options.baseRows.forEach(([fileName, base]) => {\n lines.push(\n `|${fileName}|${base.name_zh_en_ok ? '✅' : '❌'}|${base.functional_unit_ok ? '✅' : '❌'}|${base.system_boundary_ok ? '✅' : '❌'}|${base.time_ok ? '✅' : '❌'}|${base.geo_ok ? '✅' : '❌'}|${base.tech_ok ? '✅' : '❌'}|${base.admin_ok ? '✅' : '❌'}|${base.completeness_score}|\\n`,\n );\n });\n\n lines.push(\n '\\n## Material balance scope\\n- Check only `raw material input = product + by-product + waste`\\n- Energy inputs are listed but excluded from balance\\n',\n );\n lines.push(\n '\\n## Per-process results\\n|process file|raw material in|product|by-product|waste|energy in (excluded)|delta(out-in)|relative deviation|\\n|---|---:|---:|---:|---:|---:|---:|---:|\\n',\n );\n\n options.rows.forEach((row) => {\n lines.push(\n `|${row.process_file}|${row.raw_input.toPrecision(6)}|${row.product.toPrecision(6)}|${row.byproduct.toPrecision(6)}|${row.waste.toPrecision(6)}|${row.energy_excluded.toPrecision(6)}|${row.delta.toPrecision(6)}|${formatPercent(row.relative_deviation)}|\\n`,\n );\n });\n\n lines.push(\n `\\n## Summary\\n- Raw material input total: **${options.totals.raw_input.toPrecision(6)}**\\n- Product+by-product+waste total: **${options.totals.product_plus_byproduct_plus_waste.toPrecision(6)}**\\n- Delta (out-in): **${options.totals.delta.toPrecision(6)}**\\n- Relative deviation: **${formatPercent(options.totals.relative_deviation)}**\\n- Energy input total (excluded from balance): **${options.totals.energy_excluded.toPrecision(6)}**\\n`,\n );\n lines.push(\n `\\n## Evidence-sufficient conclusions\\n${options.evidenceStrong.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n lines.push(\n `\\n## Evidence-insufficient conclusions / limitations\\n${options.evidenceWeak.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n\n return lines.join('');\n}\n\nfunction renderTiming(options: {\n runId: string;\n startTs: string | undefined;\n endTs: string | undefined;\n processCount: number;\n}): string {\n const lines = ['# one_flow_rerun_timing\\n', `- run_id: \\`${options.runId}\\`\\n`];\n\n if (options.startTs && options.endTs) {\n const start = new Date(options.startTs);\n const end = new Date(options.endTs);\n if (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime())) {\n throw new CliError('Expected --start-ts and --end-ts to be valid ISO timestamps.', {\n code: 'PROCESS_REVIEW_INVALID_TIMESTAMP',\n exitCode: 2,\n });\n }\n lines.push(`- start: \\`${options.startTs}\\`\\n`);\n lines.push(`- end: \\`${options.endTs}\\`\\n`);\n lines.push(\n `- total elapsed: **${((end.getTime() - start.getTime()) / 60_000).toFixed(2)} min**\\n`,\n );\n }\n\n lines.push(`- process files reviewed: \\`${options.processCount}\\`\\n`);\n lines.push(\n '- major time consumers: references retrieval, flow matching/search, flow metadata lookups.\\n',\n );\n return lines.join('');\n}\n\nfunction renderUnitIssues(runId: string, unitIssues: UnitIssue[]): string {\n const lines = [\n '# flow_unit_issue_log\\n',\n `- run_id: \\`${runId}\\`\\n`,\n '\\n|flow UUID|current unit|suggested unit|basis|confidence|\\n|---|---|---|---|---|\\n',\n ];\n\n if (unitIssues.length === 0) {\n lines.push('|无|无|无|未发现基于直接证据的单位矛盾|—|\\n');\n return lines.join('');\n }\n\n const seen = new Set<string>();\n unitIssues.forEach((issue) => {\n const key = JSON.stringify(issue);\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n lines.push(\n `|${issue.flow_uuid}|${issue.current_unit}|${issue.suggested_unit}|${issue.basis}|${issue.confidence}|\\n`,\n );\n });\n\n return lines.join('');\n}\n\nexport async function runProcessReview(\n options: RunProcessReviewOptions,\n): Promise<ProcessReviewReport> {\n const runRoot = path.resolve(\n requiredNonEmpty(options.runRoot, '--run-root', 'PROCESS_REVIEW_RUN_ROOT_REQUIRED'),\n );\n const runId = requiredNonEmpty(options.runId, '--run-id', 'PROCESS_REVIEW_RUN_ID_REQUIRED');\n const outDir = path.resolve(\n requiredNonEmpty(options.outDir, '--out-dir', 'PROCESS_REVIEW_OUT_DIR_REQUIRED'),\n );\n const logicVersion = options.logicVersion?.trim() || 'v2.1';\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const env = options.env ?? process.env;\n const llmMaxProcesses =\n typeof options.llmMaxProcesses === 'number' &&\n Number.isInteger(options.llmMaxProcesses) &&\n options.llmMaxProcesses > 0\n ? options.llmMaxProcesses\n : 8;\n const processFiles = readProcessFiles(runRoot);\n const baseRows: Array<[string, BaseInfoCheck]> = [];\n const rows: ProcessReviewRow[] = [];\n const unitIssues: UnitIssue[] = [];\n const processSummariesForLlm: ProcessSummaryForLlm[] = [];\n\n let totalRaw = 0;\n let totalProduct = 0;\n let totalByproduct = 0;\n let totalWaste = 0;\n let totalEnergy = 0;\n\n processFiles.forEach((filePath) => {\n const processPayload = unwrapProcessPayload(readJsonInput(filePath), filePath);\n const exchangesValue = deepGet(processPayload, ['processDataSet', 'exchanges', 'exchange']);\n const exchanges = Array.isArray(exchangesValue)\n ? exchangesValue.filter(isRecord)\n : isRecord(exchangesValue)\n ? [exchangesValue]\n : [];\n const base = baseInfoCheck(processPayload);\n const fileName = path.basename(filePath);\n baseRows.push([fileName, base]);\n\n let rawInput = 0;\n let product = 0;\n let byproduct = 0;\n let waste = 0;\n let energyExcluded = 0;\n\n exchanges.forEach((exchange) => {\n const classified = classifyExchange(exchange);\n const amount = toNumber(exchange.meanAmount ?? exchange.resultingAmount);\n if (classified.classification === 'raw_material_input') {\n rawInput += amount;\n } else if (classified.classification === 'product_output') {\n product += amount;\n } else if (classified.classification === 'byproduct_output') {\n byproduct += amount;\n } else if (classified.classification === 'waste_output') {\n waste += amount;\n } else if (classified.classification === 'energy_input') {\n energyExcluded += amount;\n }\n unitIssues.push(...unitIssueCheck(exchange, classified.uoms, classified.blob));\n });\n\n const balanceOut = product + byproduct + waste;\n const delta = balanceOut - rawInput;\n const relativeDeviation = rawInput > 0 ? Math.abs(delta) / rawInput : null;\n\n rows.push({\n process_file: fileName,\n raw_input: rawInput,\n product,\n byproduct,\n waste,\n energy_excluded: energyExcluded,\n delta,\n relative_deviation: relativeDeviation,\n });\n\n totalRaw += rawInput;\n totalProduct += product;\n totalByproduct += byproduct;\n totalWaste += waste;\n totalEnergy += energyExcluded;\n\n if (processSummariesForLlm.length < Math.max(1, llmMaxProcesses)) {\n processSummariesForLlm.push({\n process_file: fileName,\n base_names: base.base_names.slice(0, 4),\n base_checks: {\n name_zh_en_ok: base.name_zh_en_ok,\n functional_unit_ok: base.functional_unit_ok,\n system_boundary_ok: base.system_boundary_ok,\n time_ok: base.time_ok,\n geo_ok: base.geo_ok,\n tech_ok: base.tech_ok,\n admin_ok: base.admin_ok,\n },\n balance: {\n raw_in: rawInput,\n product,\n byproduct,\n waste,\n energy_excluded: energyExcluded,\n relative_deviation: relativeDeviation,\n },\n });\n }\n });\n\n const totals: ProcessReviewTotals = {\n raw_input: totalRaw,\n product_plus_byproduct_plus_waste: totalProduct + totalByproduct + totalWaste,\n delta: totalProduct + totalByproduct + totalWaste - totalRaw,\n relative_deviation:\n totalRaw > 0\n ? Math.abs(totalProduct + totalByproduct + totalWaste - totalRaw) / totalRaw\n : null,\n energy_excluded: totalEnergy,\n };\n\n const evidenceStrong = [\n '已基于 exchange 的 comment 标签/描述做口径过滤,仅核算 原材料投入 vs 产品+副产品+废物,能量单列不计入平衡。',\n ...(unitIssues.length > 0\n ? ['发现单位疑似错误时均附带 flow 描述与单位标签的直接矛盾证据。']\n : []),\n ];\n\n const evidenceWeak = [\n '部分 exchange 缺少结构化 type 标签,仅能依赖文本关键词分类,存在误判风险。',\n '未逐条拉取 flow 数据集参考单位做机器核对,单位结论以评论标签与流名称语义一致性为主。',\n ];\n\n const llmResult = await runOptionalLlmReview(processSummariesForLlm, {\n enableLlm: Boolean(options.enableLlm),\n llmModel: options.llmModel,\n env,\n fetchImpl,\n outDir,\n });\n\n const summary: ProcessReviewSummary = {\n run_id: runId,\n logic_version: logicVersion,\n process_count: processFiles.length,\n totals,\n llm: llmResult,\n };\n\n const reviewZhPath = writeTextArtifact(\n path.join(outDir, 'one_flow_rerun_review_v2_1_zh.md'),\n renderZhReview({\n runId,\n logicVersion,\n baseRows,\n rows,\n totals,\n llmResult,\n evidenceStrong,\n evidenceWeak,\n }),\n );\n const reviewEnPath = writeTextArtifact(\n path.join(outDir, 'one_flow_rerun_review_v2_1_en.md'),\n renderEnReview({\n runId,\n logicVersion,\n baseRows,\n rows,\n totals,\n evidenceStrong,\n evidenceWeak,\n }),\n );\n const timingPath = writeTextArtifact(\n path.join(outDir, 'one_flow_rerun_timing.md'),\n renderTiming({\n runId,\n startTs: options.startTs,\n endTs: options.endTs,\n processCount: processFiles.length,\n }),\n );\n const unitIssuePath = writeTextArtifact(\n path.join(outDir, 'flow_unit_issue_log.md'),\n renderUnitIssues(runId, unitIssues),\n );\n const summaryPath = writeJsonArtifact(path.join(outDir, 'review_summary_v2_1.json'), summary);\n\n const report: ProcessReviewReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? (() => new Date()))().toISOString(),\n status: 'completed_local_process_review',\n run_id: runId,\n run_root: runRoot,\n out_dir: outDir,\n logic_version: logicVersion,\n process_count: processFiles.length,\n totals,\n files: {\n review_zh: reviewZhPath,\n review_en: reviewEnPath,\n timing: timingPath,\n unit_issue_log: unitIssuePath,\n summary: summaryPath,\n report: '',\n },\n llm: llmResult,\n };\n\n const reportPath = writeJsonArtifact(path.join(outDir, 'process-review-report.json'), report);\n report.files.report = reportPath;\n writeJsonArtifact(reportPath, report);\n return report;\n}\n\nexport const __testInternals = {\n requiredNonEmpty,\n textFromValue,\n toNumber,\n deepGet,\n hasNonEmpty,\n extractBaseNames,\n classifyExchange,\n unitIssueCheck,\n baseInfoCheck,\n unwrapProcessPayload,\n buildPrompt,\n parseLlmJsonOutput,\n runOptionalLlmReview,\n renderZhReview,\n renderEnReview,\n renderTiming,\n renderUnitIssues,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"review-process.js","sourceRoot":"","sources":["../../../src/lib/review-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAsB,MAAM,UAAU,CAAC;AAI5E,MAAM,OAAO,GAAG,+BAA+B,CAAC;AAChD,MAAM,MAAM,GAAG,8BAA8B,CAAC;AAE9C,MAAM,YAAY,GAAG;IACnB,UAAU;IACV,aAAa;IACb,KAAK;IACL,IAAI;IACJ,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,KAAK;IACL,OAAO;IACP,GAAG;IACH,GAAG;CACK,CAAC;AAEX,MAAM,SAAS,GAAG;IAChB,cAAc;IACd,WAAW;IACX,YAAY;IACZ,OAAO;IACP,MAAM;IACN,WAAW;IACX,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACI,CAAC;AAEX,MAAM,SAAS,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAU,CAAC;AACrE,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAiJjE,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB,EAAE,KAAa,EAAE,IAAY;IAC9E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,QAAQ,CAAC,oBAAoB,KAAK,GAAG,EAAE;QAC/C,IAAI;QACJ,QAAQ,EAAE,CAAC;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK;aACT,MAAM,CAAC,QAAQ,CAAC;aAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;aAC1C,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,SAAmB;IAClD,IAAI,OAAO,GAAY,KAAK,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YACrB,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,cAA0B;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,cAAc,EAAE;QACnC,gBAAgB;QAChB,oBAAoB;QACpB,oBAAoB;QACpB,MAAM;QACN,UAAU;KACX,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,EAAE,GAAG,IAAI,CAAC;QACZ,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,EAAE,GAAG,IAAI,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtC,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC;QAChB,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAoB;IAC5C,MAAM,QAAQ,GACZ,GAAG,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IACrG,MAAM,eAAe,GAAG,aAAa,CACnC,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACvC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,yBAAyB,CAAC;QAC5D,CAAC,CAAC,SAAS,CACd,CAAC,WAAW,EAAE,CAAC;IAChB,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACzE,MAAM,QAAQ,GACZ,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;IAEpE,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC;YACtC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC/D,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC9D,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3D,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACrE,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC5E,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACrE,CAAC;QACD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9D,CAAC;IAED,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC5E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC/D,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAClD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,QAAoB,EAAE,IAAc,EAAE,IAAY;IACxE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACxD,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/D,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,IACE,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5E,WAAW;QACX,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC1C,CAAC;QACD,OAAO;YACL;gBACE,SAAS,EAAE,QAAQ;gBACnB,YAAY,EAAE,WAAW;gBACzB,cAAc,EAAE,KAAK;gBACrB,KAAK,EAAE,6BAA6B;gBACpC,UAAU,EAAE,GAAG;aAChB;SACF,CAAC;IACJ,CAAC;IAED,IACE,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3D,WAAW;QACX,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EACzC,CAAC;QACD,OAAO;YACL;gBACE,SAAS,EAAE,QAAQ;gBACnB,YAAY,EAAE,WAAW;gBACzB,cAAc,EAAE,SAAS;gBACzB,KAAK,EAAE,yBAAyB;gBAChC,UAAU,EAAE,GAAG;aAChB;SACF,CAAC;IACJ,CAAC;IAED,IACE,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrE,WAAW;QACX,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EACzC,CAAC;QACD,OAAO;YACL;gBACE,SAAS,EAAE,QAAQ;gBACnB,YAAY,EAAE,WAAW;gBACzB,cAAc,EAAE,IAAI;gBACpB,KAAK,EAAE,oBAAoB;gBAC3B,UAAU,EAAE,GAAG;aAChB;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,cAA0B;IAC/C,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE;QAC7C,gBAAgB;QAChB,oBAAoB;QACpB,uBAAuB;QACvB,uBAAuB;KACxB,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE;QAC7C,gBAAgB;QAChB,oBAAoB;QACpB,WAAW;QACX,qBAAqB;KACtB,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,EAAE;QACpC,gBAAgB;QAChB,wBAAwB;QACxB,wBAAwB;QACxB,eAAe;KAChB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC;IACjG,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,gBAAgB,EAAE,wBAAwB,CAAC,CAAC,CAAC;IACzF,MAAM,yBAAyB,GAAG,OAAO,CAAC,cAAc,EAAE;QACxD,gBAAgB;QAChB,2BAA2B;KAC5B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,IAAI,IAAI,CAAC;IAC5B,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,gBAAgB,GAAG,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAChE,MAAM,iBAAiB,GAAG;QACxB,MAAM;QACN,gBAAgB;QAChB,gBAAgB;QAChB,MAAM;QACN,WAAW;QACX,YAAY;QACZ,gBAAgB;KACjB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAEzB,OAAO;QACL,aAAa,EAAE,MAAM;QACrB,kBAAkB,EAAE,gBAAgB;QACpC,kBAAkB,EAAE,gBAAgB;QACpC,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,gBAAgB;QAC1B,kBAAkB,EAAE,iBAAiB;QACrC,UAAU,EAAE,MAAM;KACnB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,QAAgB;IAC5D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,QAAQ,CAAC,0DAA0D,QAAQ,EAAE,EAAE;YACvF,IAAI,EAAE,8BAA8B;YACpC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GACb,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC;QAC1C,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC;QACpD,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC;QAClD,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;QACpC,KAAK,CAAC;IAER,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,QAAQ,CAAC,kDAAkD,QAAQ,EAAE,EAAE;YAC/E,IAAI,EAAE,8BAA8B;YACpC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAiB,EAAE,KAAa;IAC9D,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,EAAE,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,cAA4B,CAAC;IAClD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5F,MAAM,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC,kBAAkB,CAAC;QACxE,CAAC,CAAC,kBAAkB,CAAC,kBAAkB;QACvC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,yBAAyB,GAAG,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC,yBAAyB;QAChC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,uBAAuB,GAAG,QAAQ,CAAC,yBAAyB,CAAC,uBAAuB,CAAC;QACzF,CAAC,CAAC,yBAAyB,CAAC,uBAAuB;QACnD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,EAAE,GACN,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;IAC3F,MAAM,OAAO,GACX,MAAM,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACtF,WAAW,CAAC;IACd,OAAO;QACL,EAAE;QACF,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE5C,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI;aACR,KAAK,CAAC,SAAS,CAAC;aAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACnB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;gBAC3C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACtB,MAAM,IAAI,QAAQ,CAAC,4CAA4C,QAAQ,EAAE,EAAE;wBACzE,IAAI,EAAE,uCAAuC;wBAC7C,QAAQ,EAAE,CAAC;qBACZ,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;oBAC9B,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,IAAI,QAAQ,CAChB,2DAA2D,KAAK,GAAG,CAAC,GAAG,EACvE;oBACE,IAAI,EAAE,mCAAmC;oBACzC,QAAQ,EAAE,CAAC;oBACX,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;iBACvB,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACP,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,QAAQ,CAAC,+CAA+C,QAAQ,EAAE,EAAE;YAC5E,IAAI,EAAE,kCAAkC;YACxC,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;SACvB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClF,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,QAAQ,CAAC,kEAAkE,QAAQ,EAAE,EAAE;QAC/F,IAAI,EAAE,kCAAkC;QACxC,QAAQ,EAAE,CAAC;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,MAAc;IAEd,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IACjE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,KAAK,GAA+B,EAAE,CAAC;IAC7C,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,EAAE,GAAG,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjD,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;YACjB,cAAc,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAiD,EAAE,CAAC;IAC/D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SAClB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SACpD,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE;QAC1B,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,sBAAsB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,GAAG,EAAE,KAAK,OAAO,OAAO,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChD,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC;YACT,WAAW,EAAE,GAAG;YAChB,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,8BAA8B,CAAC,CAAC;IACtF,iBAAiB,CAAC,WAAW,EAAE;QAC7B,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxC,eAAe,EAAE,IAAI,CAAC,MAAM;QAC5B,0BAA0B,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;QACrD,8BAA8B,EAAE,cAAc;QAC9C,aAAa,EAAE,SAAS;QACxB,KAAK;KACN,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,EAAE,SAAS;QACvB,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAK3B;IASC,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5F,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,QAAQ,CAAC,mEAAmE,EAAE;YACtF,IAAI,EAAE,oCAAoC;YAC1C,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3E,OAAO;YACL,SAAS,EAAE,WAAW;YACtB,qBAAqB,EAAE,YAAY,CAAC,YAAY;YAChD,0BAA0B,EAAE,YAAY,CAAC,WAAW;YACpD,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI;YACjE,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YACxC,kBAAkB,EAAE;gBAClB,UAAU,EAAE,WAAW;gBACvB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACzC,QAAQ,EAAE,EAAE;gBACZ,0BAA0B,EAAE,YAAY,CAAC,YAAY;gBACrD,uBAAuB,EAAE,YAAY,CAAC,YAAY;aACnD;SACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAQ,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC7D,OAAO;QACL,SAAS,EAAE,UAAU;QACrB,qBAAqB,EAAE,SAAS;QAChC,0BAA0B,EAAE,IAAI;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtD,OAAO;QACP,QAAQ,EAAE,EAAE;QACZ,kBAAkB,EAAE;YAClB,UAAU,EAAE,UAAU;YACtB,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,OAAO;YACjB,0BAA0B,EAAE,EAAE;YAC9B,uBAAuB,EAAE,SAAS;SACnC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACnE,MAAM,IAAI,QAAQ,CAAC,uCAAuC,UAAU,EAAE,EAAE;YACtE,IAAI,EAAE,kCAAkC;YACxC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC,UAAU,CAAC;SAC3B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAC1C,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,gBAAwC;IAC3D,OAAO;QACL,8CAA8C;QAC9C,KAAK;QACL,aAAa;QACb,gBAAgB;QAChB,4FAA4F;QAC5F,EAAE;QACF,UAAU,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;KACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,KAAK,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAEpF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAY,CAAC;QAChD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,gBAAwC,EACxC,OAMC;IAED,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,GAAG,GAAG;YACJ,GAAG,GAAG;YACN,KAAK,EAAE,OAAO,CAAC,QAAQ;SACA,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC;YAC/B,GAAG;YACH,KAAK,EAAE;gBACL,MAAM,EAAE,4CAA4C;gBACpD,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC;aACvC;YACD,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,MAAM;YACjB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC;YACjD,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC;YACvD,MAAM,EAAE,gBAAgB;YACxB,KAAK,EAAE,iBAAiB;YACxB,KAAK,EAAE,gBAAgB;SACxB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,qBAAqB;gBAC7B,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;aACrC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,MAAM;SACf,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,IAAI;YACb,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAoB;IACzC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9D,CAAC;AAED,SAAS,cAAc,CAAC,OASvB;IACC,MAAM,KAAK,GAAG;QACZ,mCAAmC;QACnC,eAAe,OAAO,CAAC,KAAK,MAAM;QAClC,sBAAsB,OAAO,CAAC,YAAY,MAAM;QAChD,mBAAmB;QACnB,2DAA2D;QAC3D,0CAA0C;KAC3C,CAAC;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;QAC5C,KAAK,CAAC,IAAI,CACR,IAAI,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAC7Q,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CACR,kEAAkE,CACnE,CAAC;IACF,KAAK,CAAC,IAAI,CACR,kHAAkH,CACnH,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3B,KAAK,CAAC,IAAI,CACR,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAC/P,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CACR,yBAAyB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,wBAAwB,OAAO,CAAC,MAAM,CAAC,iCAAiC,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAsB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,yBAAyB,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAC9V,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAEnC,IAAI,OAAO,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC/D,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ;YACnC,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;YAC5F,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACxC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,MAAM,QAAQ,GACZ,OAAO,aAAa,KAAK,QAAQ;oBAC/B,CAAC,CAAC,aAAa;oBACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3F,KAAK,CAAC,IAAI,CACR,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAC5V,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CACR,iBAAiB,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAClF,CAAC;IACF,KAAK,CAAC,IAAI,CACR,oBAAoB,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACnF,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,OAQvB;IACC,MAAM,KAAK,GAAG;QACZ,mCAAmC;QACnC,eAAe,OAAO,CAAC,KAAK,MAAM;QAClC,sBAAsB,OAAO,CAAC,YAAY,MAAM;QAChD,8BAA8B;QAC9B,6GAA6G;QAC7G,0CAA0C;KAC3C,CAAC;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;QAC5C,KAAK,CAAC,IAAI,CACR,IAAI,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAC7Q,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CACR,uJAAuJ,CACxJ,CAAC;IACF,KAAK,CAAC,IAAI,CACR,qLAAqL,CACtL,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3B,KAAK,CAAC,IAAI,CACR,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAC/P,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CACR,+CAA+C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,2CAA2C,OAAO,CAAC,MAAM,CAAC,iCAAiC,CAAC,WAAW,CAAC,CAAC,CAAC,2BAA2B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,+BAA+B,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,uDAAuD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CACxb,CAAC;IACF,KAAK,CAAC,IAAI,CACR,yCAAyC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC1G,CAAC;IACF,KAAK,CAAC,IAAI,CACR,yDAAyD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACxH,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,YAAY,CAAC,OAKrB;IACC,MAAM,KAAK,GAAG,CAAC,2BAA2B,EAAE,eAAe,OAAO,CAAC,KAAK,MAAM,CAAC,CAAC;IAEhF,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,QAAQ,CAAC,8DAA8D,EAAE;gBACjF,IAAI,EAAE,kCAAkC;gBACxC,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,OAAO,MAAM,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,KAAK,MAAM,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CACR,sBAAsB,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CACxF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,+BAA+B,OAAO,CAAC,YAAY,MAAM,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CACR,8FAA8F,CAC/F,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,UAAuB;IAC9D,MAAM,KAAK,GAAG;QACZ,yBAAyB;QACzB,eAAe,KAAK,MAAM;QAC1B,qFAAqF;KACtF,CAAC;IAEF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CACR,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,CAC1G,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAgC;IAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CACzB,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,iCAAiC,CAAC,CACjF,CAAC;IACF,MAAM,aAAa,GAAG,kBAAkB,CAAC;QACvC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM;KACP,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,gCAAgC,CAAC,CAAC;IAClG,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAK,KAAmB,CAAC;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,eAAe,GACnB,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ;QAC3C,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC;QACzC,OAAO,CAAC,eAAe,GAAG,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,eAAe;QACzB,CAAC,CAAC,CAAC,CAAC;IACR,MAAM,YAAY,GAAG,gBAAgB,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAmC,EAAE,CAAC;IACpD,MAAM,IAAI,GAAuB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,MAAM,sBAAsB,GAA2B,EAAE,CAAC;IAE1D,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAChC,MAAM,cAAc,GAAG,oBAAoB,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC/E,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;QAC5F,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;YAC7C,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;YACjC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;gBACxB,CAAC,CAAC,CAAC,cAAc,CAAC;gBAClB,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,IAAI,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QAEhC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7B,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,eAAe,CAAC,CAAC;YACzE,IAAI,UAAU,CAAC,cAAc,KAAK,oBAAoB,EAAE,CAAC;gBACvD,QAAQ,IAAI,MAAM,CAAC;YACrB,CAAC;iBAAM,IAAI,UAAU,CAAC,cAAc,KAAK,gBAAgB,EAAE,CAAC;gBAC1D,OAAO,IAAI,MAAM,CAAC;YACpB,CAAC;iBAAM,IAAI,UAAU,CAAC,cAAc,KAAK,kBAAkB,EAAE,CAAC;gBAC5D,SAAS,IAAI,MAAM,CAAC;YACtB,CAAC;iBAAM,IAAI,UAAU,CAAC,cAAc,KAAK,cAAc,EAAE,CAAC;gBACxD,KAAK,IAAI,MAAM,CAAC;YAClB,CAAC;iBAAM,IAAI,UAAU,CAAC,cAAc,KAAK,cAAc,EAAE,CAAC;gBACxD,cAAc,IAAI,MAAM,CAAC;YAC3B,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;QAC/C,MAAM,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;QACpC,MAAM,iBAAiB,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAE3E,IAAI,CAAC,IAAI,CAAC;YACR,YAAY,EAAE,QAAQ;YACtB,SAAS,EAAE,QAAQ;YACnB,OAAO;YACP,SAAS;YACT,KAAK;YACL,eAAe,EAAE,cAAc;YAC/B,KAAK;YACL,kBAAkB,EAAE,iBAAiB;SACtC,CAAC,CAAC;QAEH,QAAQ,IAAI,QAAQ,CAAC;QACrB,YAAY,IAAI,OAAO,CAAC;QACxB,cAAc,IAAI,SAAS,CAAC;QAC5B,UAAU,IAAI,KAAK,CAAC;QACpB,WAAW,IAAI,cAAc,CAAC;QAE9B,IAAI,sBAAsB,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC;YACjE,sBAAsB,CAAC,IAAI,CAAC;gBAC1B,YAAY,EAAE,QAAQ;gBACtB,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvC,WAAW,EAAE;oBACX,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;oBAC3C,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;oBAC3C,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB;gBACD,OAAO,EAAE;oBACP,MAAM,EAAE,QAAQ;oBAChB,OAAO;oBACP,SAAS;oBACT,KAAK;oBACL,eAAe,EAAE,cAAc;oBAC/B,kBAAkB,EAAE,iBAAiB;iBACtC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAwB;QAClC,SAAS,EAAE,QAAQ;QACnB,iCAAiC,EAAE,YAAY,GAAG,cAAc,GAAG,UAAU;QAC7E,KAAK,EAAE,YAAY,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ;QAC5D,kBAAkB,EAChB,QAAQ,GAAG,CAAC;YACV,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC,GAAG,QAAQ;YAC5E,CAAC,CAAC,IAAI;QACV,eAAe,EAAE,WAAW;KAC7B,CAAC;IAEF,MAAM,cAAc,GAAG;QACrB,qEAAqE;QACrE,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;YACvB,CAAC,CAAC,CAAC,mCAAmC,CAAC;YACvC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,MAAM,YAAY,GAAG;QACnB,+CAA+C;QAC/C,+CAA+C;KAChD,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,sBAAsB,EAAE;QACnE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG;QACH,SAAS;QACT,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,OAAO,GAAyB;QACpC,MAAM,EAAE,KAAK;QACb,aAAa,EAAE,YAAY;QAC3B,aAAa,EAAE,YAAY,CAAC,MAAM;QAClC,MAAM;QACN,GAAG,EAAE,SAAS;KACf,CAAC;IACF,MAAM,sBAAsB,GAAG,iBAAiB,CAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,2BAA2B,CAAC,EAC9C,aAAa,CAAC,kBAAkB,CACjC,CAAC;IAEF,MAAM,YAAY,GAAG,iBAAiB,CACpC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kCAAkC,CAAC,EACrD,cAAc,CAAC;QACb,KAAK;QACL,YAAY;QACZ,QAAQ;QACR,IAAI;QACJ,MAAM;QACN,SAAS;QACT,cAAc;QACd,YAAY;KACb,CAAC,CACH,CAAC;IACF,MAAM,YAAY,GAAG,iBAAiB,CACpC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kCAAkC,CAAC,EACrD,cAAc,CAAC;QACb,KAAK;QACL,YAAY;QACZ,QAAQ;QACR,IAAI;QACJ,MAAM;QACN,cAAc;QACd,YAAY;KACb,CAAC,CACH,CAAC;IACF,MAAM,UAAU,GAAG,iBAAiB,CAClC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,EAC7C,YAAY,CAAC;QACX,KAAK;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,YAAY,EAAE,YAAY,CAAC,MAAM;KAClC,CAAC,CACH,CAAC;IACF,MAAM,aAAa,GAAG,iBAAiB,CACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAwB,CAAC,EAC3C,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CACpC,CAAC;IACF,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,EAAE,OAAO,CAAC,CAAC;IAE9F,MAAM,MAAM,GAAwB;QAClC,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE;QACrE,MAAM,EAAE,gCAAgC;QACxC,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,aAAa,CAAC,OAAO;QAC/B,SAAS,EAAE,aAAa,CAAC,QAAQ;QACjC,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,aAAa,CAAC,SAAS;QACnC,uBAAuB,EAAE,aAAa,CAAC,qBAAqB;QAC5D,aAAa,EAAE,YAAY;QAC3B,aAAa,EAAE,YAAY,CAAC,MAAM;QAClC,MAAM;QACN,KAAK,EAAE;YACL,oBAAoB,EAAE,sBAAsB;YAC5C,uBAAuB,EAAE,aAAa,CAAC,0BAA0B;YACjE,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,UAAU;YAClB,cAAc,EAAE,aAAa;YAC7B,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,EAAE;SACX;QACD,GAAG,EAAE,SAAS;KACf,CAAC;IAEF,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,4BAA4B,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9F,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC;IACjC,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,gBAAgB;IAChB,aAAa;IACb,QAAQ;IACR,OAAO;IACP,WAAW;IACX,gBAAgB;IAChB,gBAAgB;IAChB,cAAc;IACd,aAAa;IACb,oBAAoB;IACpB,WAAW;IACX,kBAAkB;IAClB,oBAAoB;IACpB,cAAc;IACd,cAAc;IACd,YAAY;IACZ,gBAAgB;CACjB,CAAC","sourcesContent":["import { existsSync, mkdirSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeTextArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { readJsonInput } from './io.js';\nimport { invokeLlm, readLlmRuntimeEnv, type LlmRuntimeEnv } from './llm.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nconst KIND_RE = /\\[tg_io_kind_tag=([^\\]]+)\\]/gu;\nconst UOM_RE = /\\[tg_io_uom_tag=([^\\]]+)\\]/gu;\n\nconst ENERGY_WORDS = [\n 'electric',\n 'electricity',\n 'kwh',\n 'mj',\n 'heat',\n 'steam',\n 'fuel',\n 'diesel',\n 'gas',\n 'power',\n '电',\n '能',\n] as const;\n\nconst RAW_WORDS = [\n 'raw material',\n 'feedstock',\n 'fertilizer',\n 'water',\n 'seed',\n 'pesticide',\n '原材料',\n '投入',\n '肥料',\n '种子',\n '农药',\n '用水',\n] as const;\n\nconst BYP_WORDS = ['by-product', 'co-product', '副产品', '联产'] as const;\nconst WASTE_WORDS = ['waste', '废', 'residue', 'sludge'] as const;\n\ntype BaseInfoCheck = {\n name_zh_en_ok: boolean;\n functional_unit_ok: boolean;\n system_boundary_ok: boolean;\n time_ok: boolean;\n geo_ok: boolean;\n tech_ok: boolean;\n admin_ok: boolean;\n completeness_score: number;\n base_names: string[];\n};\n\ntype ClassifiedExchange = {\n classification:\n | 'raw_material_input'\n | 'energy_input'\n | 'other_input'\n | 'product_output'\n | 'byproduct_output'\n | 'waste_output'\n | 'other_output'\n | 'other';\n kinds: string[];\n uoms: string[];\n blob: string;\n};\n\ntype UnitIssue = {\n flow_uuid: string;\n current_unit: string;\n suggested_unit: string;\n basis: string;\n confidence: string;\n};\n\ntype ProcessReviewRow = {\n process_file: string;\n raw_input: number;\n product: number;\n byproduct: number;\n waste: number;\n energy_excluded: number;\n delta: number;\n relative_deviation: number | null;\n};\n\ntype ProcessReviewTotals = {\n raw_input: number;\n product_plus_byproduct_plus_waste: number;\n delta: number;\n relative_deviation: number | null;\n energy_excluded: number;\n};\n\ntype ProcessSummaryForLlm = {\n process_file: string;\n base_names: string[];\n base_checks: {\n name_zh_en_ok: boolean;\n functional_unit_ok: boolean;\n system_boundary_ok: boolean;\n time_ok: boolean;\n geo_ok: boolean;\n tech_ok: boolean;\n admin_ok: boolean;\n };\n balance: {\n raw_in: number;\n product: number;\n byproduct: number;\n waste: number;\n energy_excluded: number;\n relative_deviation: number | null;\n };\n};\n\nexport type ProcessReviewLlmResult =\n | {\n enabled: false;\n reason: string;\n }\n | {\n enabled: true;\n ok: true;\n result: JsonRecord;\n }\n | {\n enabled: true;\n ok: false;\n reason: string;\n raw?: string;\n };\n\nexport type ProcessReviewSummary = {\n run_id: string;\n logic_version: string;\n process_count: number;\n totals: ProcessReviewTotals;\n llm: ProcessReviewLlmResult;\n};\n\nexport type ProcessReviewReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_local_process_review';\n run_id: string;\n run_root: string;\n rows_file: string;\n out_dir: string;\n input_mode: 'rows_file' | 'run_root';\n effective_processes_dir: string;\n logic_version: string;\n process_count: number;\n totals: ProcessReviewTotals;\n files: {\n review_input_summary: string;\n materialization_summary: string | null;\n review_zh: string;\n review_en: string;\n timing: string;\n unit_issue_log: string;\n summary: string;\n report: string;\n };\n llm: ProcessReviewLlmResult;\n};\n\nexport type RunProcessReviewOptions = {\n rowsFile?: string;\n runRoot?: string;\n runId?: string;\n outDir: string;\n startTs?: string;\n endTs?: string;\n logicVersion?: string;\n enableLlm?: boolean;\n llmModel?: string;\n llmMaxProcesses?: number;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n now?: () => Date;\n};\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction requiredNonEmpty(value: string | undefined, label: string, code: string): string {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n\n throw new CliError(`Missing required ${label}.`, {\n code,\n exitCode: 2,\n });\n}\n\nfunction textFromValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value\n .filter(isRecord)\n .map((item) => String(item['#text'] ?? ''))\n .join(' ');\n }\n\n if (isRecord(value)) {\n return String(value['#text'] ?? '');\n }\n\n return String(value ?? '');\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : 0;\n }\n\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : 0;\n }\n\n return 0;\n}\n\nfunction deepGet(value: unknown, pathParts: string[]): unknown {\n let current: unknown = value;\n\n for (const key of pathParts) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[key];\n if (current === undefined || current === null) {\n return undefined;\n }\n }\n\n return current;\n}\n\nfunction hasNonEmpty(value: unknown): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n\n if (typeof value === 'string') {\n return value.trim().length > 0;\n }\n\n if (Array.isArray(value)) {\n return value.some((item) => hasNonEmpty(item));\n }\n\n if (isRecord(value)) {\n if ('#text' in value) {\n return hasNonEmpty(value['#text']);\n }\n return Object.values(value).some((item) => hasNonEmpty(item));\n }\n\n return true;\n}\n\nfunction extractBaseNames(processPayload: JsonRecord): [boolean, boolean, string[]] {\n const base = deepGet(processPayload, [\n 'processDataSet',\n 'processInformation',\n 'dataSetInformation',\n 'name',\n 'baseName',\n ]);\n const items = Array.isArray(base) ? base : base ? [base] : [];\n let zh = false;\n let en = false;\n const values: string[] = [];\n\n items.forEach((item) => {\n if (!isRecord(item)) {\n return;\n }\n const lang = String(item['@xml:lang'] ?? '').toLowerCase();\n const text = String(item['#text'] ?? '').trim();\n if (!text) {\n return;\n }\n values.push(text);\n if (lang.startsWith('zh')) {\n zh = true;\n }\n if (lang.startsWith('en')) {\n en = true;\n }\n });\n\n if (!(zh && en) && values.length >= 2) {\n zh = zh || true;\n en = en || true;\n }\n\n return [zh, en, values];\n}\n\nfunction classifyExchange(exchange: JsonRecord): ClassifiedExchange {\n const comments =\n `${textFromValue(exchange.commonComment)} ${textFromValue(exchange.generalComment)}`.toLowerCase();\n const flowDescription = textFromValue(\n isRecord(exchange.referenceToFlowDataSet)\n ? exchange.referenceToFlowDataSet['common:shortDescription']\n : undefined,\n ).toLowerCase();\n const blob = `${comments} ${flowDescription}`.trim();\n const kinds = Array.from(blob.matchAll(KIND_RE), (match) => match[1].toLowerCase());\n const kindSet = new Set(kinds);\n const uoms = Array.from(blob.matchAll(UOM_RE), (match) => match[1].toLowerCase());\n const direction = String(exchange.exchangeDirection ?? '').toLowerCase();\n const isEnergy =\n ENERGY_WORDS.some((word) => blob.includes(word)) ||\n uoms.some((uom) => uom === 'kwh' || uom === 'mj' || uom === 'gj');\n\n if (direction === 'input') {\n if (kindSet.has('energy') || isEnergy) {\n return { classification: 'energy_input', kinds, uoms, blob };\n }\n if (kindSet.has('waste')) {\n return { classification: 'other_input', kinds, uoms, blob };\n }\n if (kindSet.has('raw_material') || kindSet.has('resource')) {\n return { classification: 'raw_material_input', kinds, uoms, blob };\n }\n if (kindSet.has('product') || RAW_WORDS.some((word) => blob.includes(word))) {\n return { classification: 'raw_material_input', kinds, uoms, blob };\n }\n return { classification: 'other_input', kinds, uoms, blob };\n }\n\n if (direction === 'output') {\n if (kindSet.has('waste') || WASTE_WORDS.some((word) => blob.includes(word))) {\n return { classification: 'waste_output', kinds, uoms, blob };\n }\n if (BYP_WORDS.some((word) => blob.includes(word))) {\n return { classification: 'byproduct_output', kinds, uoms, blob };\n }\n if (kindSet.has('product')) {\n return { classification: 'product_output', kinds, uoms, blob };\n }\n return { classification: 'other_output', kinds, uoms, blob };\n }\n\n return { classification: 'other', kinds, uoms, blob };\n}\n\nfunction unitIssueCheck(exchange: JsonRecord, uoms: string[], blob: string): UnitIssue[] {\n const flowUuid = isRecord(exchange.referenceToFlowDataSet)\n ? String(exchange.referenceToFlowDataSet['@refObjectId'] ?? '')\n : '';\n\n if (!flowUuid) {\n return [];\n }\n\n const currentUnit = uoms[0] ?? '';\n if (\n ['electric', 'electricity', '交流电', '电力'].some((word) => blob.includes(word)) &&\n currentUnit &&\n !['kwh', 'mj', 'gj'].includes(currentUnit)\n ) {\n return [\n {\n flow_uuid: flowUuid,\n current_unit: currentUnit,\n suggested_unit: 'kWh',\n basis: 'flow 描述为电力/电能,但 uom 标签非能量单位',\n confidence: '高',\n },\n ];\n }\n\n if (\n ['water', '用水', '工艺用水'].some((word) => blob.includes(word)) &&\n currentUnit &&\n ['kwh', 'mj', 'gj'].includes(currentUnit)\n ) {\n return [\n {\n flow_uuid: flowUuid,\n current_unit: currentUnit,\n suggested_unit: 'm3 或 kg',\n basis: 'flow 描述为水,但 uom 标签为能量单位',\n confidence: '高',\n },\n ];\n }\n\n if (\n ['co2', 'carbon dioxide', '二氧化碳'].some((word) => blob.includes(word)) &&\n currentUnit &&\n ['kwh', 'mj', 'gj'].includes(currentUnit)\n ) {\n return [\n {\n flow_uuid: flowUuid,\n current_unit: currentUnit,\n suggested_unit: 'kg',\n basis: '排放流通常质量单位计,当前为能量单位',\n confidence: '中',\n },\n ];\n }\n\n return [];\n}\n\nfunction baseInfoCheck(processPayload: JsonRecord): BaseInfoCheck {\n const [zhOk, enOk, values] = extractBaseNames(processPayload);\n const functionalUnit = deepGet(processPayload, [\n 'processDataSet',\n 'processInformation',\n 'quantitativeReference',\n 'functionalUnitOrOther',\n ]);\n const mixAndLocation = deepGet(processPayload, [\n 'processDataSet',\n 'processInformation',\n 'geography',\n 'mixAndLocationTypes',\n ]);\n const route = deepGet(processPayload, [\n 'processDataSet',\n 'modellingAndValidation',\n 'LCIMethodAndAllocation',\n 'typeOfDataSet',\n ]);\n const time = deepGet(processPayload, ['processDataSet', 'processInformation', 'time']);\n const geography = deepGet(processPayload, ['processDataSet', 'processInformation', 'geography']);\n const technology = deepGet(processPayload, ['processDataSet', 'modellingAndValidation']);\n const administrativeInformation = deepGet(processPayload, [\n 'processDataSet',\n 'administrativeInformation',\n ]);\n\n const nameOk = zhOk && enOk;\n const functionalUnitOk = hasNonEmpty(functionalUnit);\n const systemBoundaryOk = hasNonEmpty(mixAndLocation) || hasNonEmpty(route);\n const timeOk = hasNonEmpty(time);\n const geographyOk = hasNonEmpty(geography);\n const technologyOk = hasNonEmpty(technology);\n const administrativeOk = hasNonEmpty(administrativeInformation);\n const completenessScore = [\n nameOk,\n functionalUnitOk,\n systemBoundaryOk,\n timeOk,\n geographyOk,\n technologyOk,\n administrativeOk,\n ].filter(Boolean).length;\n\n return {\n name_zh_en_ok: nameOk,\n functional_unit_ok: functionalUnitOk,\n system_boundary_ok: systemBoundaryOk,\n time_ok: timeOk,\n geo_ok: geographyOk,\n tech_ok: technologyOk,\n admin_ok: administrativeOk,\n completeness_score: completenessScore,\n base_names: values,\n };\n}\n\nfunction unwrapProcessPayload(value: unknown, filePath: string): JsonRecord {\n if (!isRecord(value)) {\n throw new CliError(`Expected process review file to contain a JSON object: ${filePath}`, {\n code: 'PROCESS_REVIEW_INPUT_INVALID',\n exitCode: 2,\n });\n }\n\n const candidate =\n (isRecord(value.process) && value.process) ||\n (isRecord(value.json_ordered) && value.json_ordered) ||\n (isRecord(value.jsonOrdered) && value.jsonOrdered) ||\n (isRecord(value.json) && value.json) ||\n value;\n\n if (!isRecord(candidate.processDataSet)) {\n throw new CliError(`Process review file is missing processDataSet: ${filePath}`, {\n code: 'PROCESS_REVIEW_INPUT_INVALID',\n exitCode: 2,\n });\n }\n\n return candidate;\n}\n\nfunction extractProcessIdentity(value: JsonRecord, index: number): { id: string; version: string } {\n const payload = unwrapProcessPayload(value, `row-${index + 1}`);\n const root = payload.processDataSet as JsonRecord;\n const processInformation = isRecord(root.processInformation) ? root.processInformation : {};\n const dataSetInformation = isRecord(processInformation.dataSetInformation)\n ? processInformation.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n const id =\n String(dataSetInformation['common:UUID'] ?? value.id ?? '').trim() || `row-${index + 1}`;\n const version =\n String(publicationAndOwnership['common:dataSetVersion'] ?? value.version ?? '').trim() ||\n '01.00.000';\n return {\n id,\n version,\n };\n}\n\nfunction loadReviewRows(rowsFile: string): JsonRecord[] {\n const resolved = path.resolve(rowsFile);\n const text = readFileSync(resolved, 'utf8');\n\n if (resolved.endsWith('.jsonl')) {\n return text\n .split(/\\r?\\n/gu)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n try {\n const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed)) {\n throw new CliError(`Expected JSON object rows in JSONL file: ${resolved}`, {\n code: 'PROCESS_REVIEW_ROWS_INVALID_JSONL_ROW',\n exitCode: 2,\n });\n }\n return parsed;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n throw new CliError(\n `Process review rows file contains invalid JSONL at line ${index + 1}.`,\n {\n code: 'PROCESS_REVIEW_ROWS_INVALID_JSONL',\n exitCode: 2,\n details: String(error),\n },\n );\n }\n });\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text) as unknown;\n } catch (error) {\n throw new CliError(`Process review rows file is not valid JSON: ${resolved}`, {\n code: 'PROCESS_REVIEW_ROWS_INVALID_JSON',\n exitCode: 2,\n details: String(error),\n });\n }\n if (Array.isArray(parsed) && parsed.every(isRecord)) {\n return parsed;\n }\n\n if (isRecord(parsed) && Array.isArray(parsed.rows) && parsed.rows.every(isRecord)) {\n return parsed.rows;\n }\n\n throw new CliError(`Expected JSON array of objects or a report object with rows[]: ${resolved}`, {\n code: 'PROCESS_REVIEW_ROWS_INVALID_JSON',\n exitCode: 2,\n });\n}\n\nfunction materializeRowsFile(\n rowsFile: string,\n outDir: string,\n): { processesDir: string; summaryPath: string } {\n const rows = loadReviewRows(rowsFile);\n const targetDir = path.join(outDir, 'review-input', 'processes');\n mkdirSync(targetDir, { recursive: true });\n\n const byKey: Record<string, JsonRecord> = {};\n let duplicateCount = 0;\n rows.forEach((row, index) => {\n const payload = unwrapProcessPayload(row, `${rowsFile}#${index + 1}`);\n const identity = extractProcessIdentity(row, index);\n const key = `${identity.id}@${identity.version}`;\n if (key in byKey) {\n duplicateCount += 1;\n }\n byKey[key] = payload;\n });\n\n const items: Array<{ process_key: string; file: string }> = [];\n Object.entries(byKey)\n .sort(([left], [right]) => left.localeCompare(right))\n .forEach(([key, payload]) => {\n const { id, version } = extractProcessIdentity(payload, 0);\n const fileName = `${id}__${version}.json`;\n const filePath = path.join(targetDir, fileName);\n writeJsonArtifact(filePath, payload);\n items.push({\n process_key: key,\n file: filePath,\n });\n });\n\n const summaryPath = path.join(outDir, 'review-input', 'materialization-summary.json');\n writeJsonArtifact(summaryPath, {\n source_rows_file: path.resolve(rowsFile),\n input_row_count: rows.length,\n materialized_process_count: Object.keys(byKey).length,\n duplicate_input_rows_collapsed: duplicateCount,\n processes_dir: targetDir,\n items,\n });\n\n return {\n processesDir: targetDir,\n summaryPath,\n };\n}\n\nfunction resolveReviewInput(options: {\n rowsFile?: string;\n runRoot?: string;\n runId?: string;\n outDir: string;\n}): {\n inputMode: 'rows_file' | 'run_root';\n effectiveProcessesDir: string;\n materializationSummaryPath: string | null;\n runId: string;\n runRoot: string;\n rowsFile: string;\n reviewInputSummary: JsonRecord;\n} {\n const declaredModes = [Boolean(options.rowsFile), Boolean(options.runRoot)].filter(Boolean);\n if (declaredModes.length !== 1) {\n throw new CliError('Process review requires exactly one of --rows-file or --run-root.', {\n code: 'PROCESS_REVIEW_INPUT_MODE_REQUIRED',\n exitCode: 2,\n });\n }\n\n if (options.rowsFile) {\n const materialized = materializeRowsFile(options.rowsFile, options.outDir);\n return {\n inputMode: 'rows_file',\n effectiveProcessesDir: materialized.processesDir,\n materializationSummaryPath: materialized.summaryPath,\n runId: options.runId?.trim() || path.parse(options.rowsFile).name,\n runRoot: '',\n rowsFile: path.resolve(options.rowsFile),\n reviewInputSummary: {\n input_mode: 'rows_file',\n rows_file: path.resolve(options.rowsFile),\n run_root: '',\n materialized_processes_dir: materialized.processesDir,\n effective_processes_dir: materialized.processesDir,\n },\n };\n }\n\n const runRoot = path.resolve(options.runRoot!);\n const effective = path.join(runRoot, 'exports', 'processes');\n return {\n inputMode: 'run_root',\n effectiveProcessesDir: effective,\n materializationSummaryPath: null,\n runId: options.runId?.trim() || path.basename(runRoot),\n runRoot,\n rowsFile: '',\n reviewInputSummary: {\n input_mode: 'run_root',\n rows_file: '',\n run_root: runRoot,\n materialized_processes_dir: '',\n effective_processes_dir: effective,\n },\n };\n}\n\nfunction readProcessFiles(processDir: string): string[] {\n if (!existsSync(processDir) || !statSync(processDir).isDirectory()) {\n throw new CliError(`Process review directory not found: ${processDir}`, {\n code: 'PROCESS_REVIEW_EXPORTS_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n return readdirSync(processDir)\n .filter((entry) => entry.endsWith('.json'))\n .sort()\n .map((entry) => path.join(processDir, entry));\n}\n\nfunction buildPrompt(processSummaries: ProcessSummaryForLlm[]): string {\n return [\n '请基于以下 process 摘要做语义一致性审核(中英名称一致性、边界表达、修订建议)。',\n '要求:',\n '1) 只根据给定摘要;',\n '2) 证据不足必须明确标注;',\n '3) 输出 JSON,格式:{\"findings\":[{\"process_file\",\"severity\",\"fixability\",\"evidence\",\"action\"}]}。',\n '',\n `输入摘要:\\n${JSON.stringify(processSummaries, null, 2)}`,\n ].join('\\n');\n}\n\nfunction parseLlmJsonOutput(output: string): JsonRecord | null {\n const start = output.indexOf('{');\n const end = output.lastIndexOf('}');\n const candidate = start >= 0 && end > start ? output.slice(start, end + 1) : output;\n\n try {\n const parsed = JSON.parse(candidate) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nasync function runOptionalLlmReview(\n processSummaries: ProcessSummaryForLlm[],\n options: {\n enableLlm: boolean;\n llmModel: string | undefined;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n outDir: string;\n },\n): Promise<ProcessReviewLlmResult> {\n if (!options.enableLlm) {\n return {\n enabled: false,\n reason: 'disabled',\n };\n }\n\n let env = readLlmRuntimeEnv(options.env);\n if (options.llmModel) {\n env = {\n ...env,\n model: options.llmModel,\n } satisfies LlmRuntimeEnv;\n }\n\n try {\n const response = await invokeLlm({\n env,\n input: {\n prompt: '你是严谨的LCA审核助手。只给基于输入证据的判断,不得臆造。输出必须是JSON对象。',\n context: buildPrompt(processSummaries),\n },\n fetchImpl: options.fetchImpl,\n timeoutMs: 45_000,\n cacheDir: path.join(options.outDir, '.llm-cache'),\n tracePath: path.join(options.outDir, 'llm-trace.jsonl'),\n module: 'review-process',\n stage: 'semantic-review',\n runId: 'review-process',\n });\n\n const parsed = parseLlmJsonOutput(response.output);\n if (!parsed) {\n return {\n enabled: true,\n ok: false,\n reason: 'llm_non_json_output',\n raw: response.output.slice(0, 8_000),\n };\n }\n\n return {\n enabled: true,\n ok: true,\n result: parsed,\n };\n } catch (error) {\n return {\n enabled: true,\n ok: false,\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction formatPercent(value: number | null): string {\n return value === null ? '' : `${(value * 100).toFixed(2)}%`;\n}\n\nfunction renderZhReview(options: {\n runId: string;\n logicVersion: string;\n baseRows: Array<[string, BaseInfoCheck]>;\n rows: ProcessReviewRow[];\n totals: ProcessReviewTotals;\n llmResult: ProcessReviewLlmResult;\n evidenceStrong: string[];\n evidenceWeak: string[];\n}): string {\n const lines = [\n '# one_flow_rerun_review_v2_1_zh\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n '\\n## 2.1 基础信息核查\\n',\n '|process file|中英名称|功能单位|系统边界|时间|地理|技术|管理元数据|完整性得分(0-7)|\\n',\n '|---|---|---|---|---|---|---|---|---:|\\n',\n ];\n\n options.baseRows.forEach(([fileName, base]) => {\n lines.push(\n `|${fileName}|${base.name_zh_en_ok ? '✅' : '❌'}|${base.functional_unit_ok ? '✅' : '❌'}|${base.system_boundary_ok ? '✅' : '❌'}|${base.time_ok ? '✅' : '❌'}|${base.geo_ok ? '✅' : '❌'}|${base.tech_ok ? '✅' : '❌'}|${base.admin_ok ? '✅' : '❌'}|${base.completeness_score}|\\n`,\n );\n });\n\n lines.push(\n '\\n## 物料平衡口径\\n- 物料平衡:仅核查 `原材料投入 = 产品+副产品+废物`\\n- 能量投入:单列记录,不计入平衡\\n',\n );\n lines.push(\n '\\n## 分过程结果\\n|process file|原材料投入|产品|副产品|废物|能量投入(不计平衡)|差值(输出-投入)|相对偏差|\\n|---|---:|---:|---:|---:|---:|---:|---:|\\n',\n );\n\n options.rows.forEach((row) => {\n lines.push(\n `|${row.process_file}|${row.raw_input.toPrecision(6)}|${row.product.toPrecision(6)}|${row.byproduct.toPrecision(6)}|${row.waste.toPrecision(6)}|${row.energy_excluded.toPrecision(6)}|${row.delta.toPrecision(6)}|${formatPercent(row.relative_deviation)}|\\n`,\n );\n });\n\n lines.push(\n `\\n## 汇总\\n- 原材料投入合计: **${options.totals.raw_input.toPrecision(6)}**\\n- 产品+副产品+废物合计: **${options.totals.product_plus_byproduct_plus_waste.toPrecision(6)}**\\n- 差值(输出-投入): **${options.totals.delta.toPrecision(6)}**\\n- 相对偏差: **${formatPercent(options.totals.relative_deviation)}**\\n- 能量投入(不计平衡)合计: **${options.totals.energy_excluded.toPrecision(6)}**\\n`,\n );\n lines.push('\\n## LLM 语义审核层(可选)\\n');\n\n if (options.llmResult.enabled && options.llmResult.ok) {\n const findings = Array.isArray(options.llmResult.result.findings)\n ? options.llmResult.result.findings\n : [];\n if (findings.length > 0) {\n lines.push('\\n|process file|severity|fixability|evidence|action|\\n|---|---|---|---|---|\\n');\n findings.slice(0, 50).forEach((finding) => {\n const evidenceValue = isRecord(finding) ? finding.evidence : '';\n const evidence =\n typeof evidenceValue === 'string'\n ? evidenceValue\n : JSON.stringify(evidenceValue ?? '', null, 0);\n const action = isRecord(finding) ? String(finding.action ?? finding.suggestion ?? '') : '';\n lines.push(\n `|${String(isRecord(finding) ? (finding.process_file ?? '') : '').replaceAll('|', '/')}|${String(isRecord(finding) ? (finding.severity ?? '') : '').replaceAll('|', '/')}|${String(isRecord(finding) ? (finding.fixability ?? 'review-needed') : 'review-needed').replaceAll('|', '/')}|${evidence.replaceAll('|', '/')}|${action.replaceAll('|', '/')}|\\n`,\n );\n });\n }\n } else {\n lines.push(`- 未启用或调用失败:\\`${options.llmResult.reason}\\`\\n`);\n }\n\n lines.push(\n `\\n## 证据充足的结论\\n${options.evidenceStrong.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n lines.push(\n `\\n## 证据不足的结论/限制\\n${options.evidenceWeak.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n\n return lines.join('');\n}\n\nfunction renderEnReview(options: {\n runId: string;\n logicVersion: string;\n baseRows: Array<[string, BaseInfoCheck]>;\n rows: ProcessReviewRow[];\n totals: ProcessReviewTotals;\n evidenceStrong: string[];\n evidenceWeak: string[];\n}): string {\n const lines = [\n '# one_flow_rerun_review_v2_1_en\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n '\\n## 2.1 Basic info checks\\n',\n '|process file|zh+en names|functional unit|system boundary|time|geo|tech|admin metadata|completeness(0-7)|\\n',\n '|---|---|---|---|---|---|---|---|---:|\\n',\n ];\n\n options.baseRows.forEach(([fileName, base]) => {\n lines.push(\n `|${fileName}|${base.name_zh_en_ok ? '✅' : '❌'}|${base.functional_unit_ok ? '✅' : '❌'}|${base.system_boundary_ok ? '✅' : '❌'}|${base.time_ok ? '✅' : '❌'}|${base.geo_ok ? '✅' : '❌'}|${base.tech_ok ? '✅' : '❌'}|${base.admin_ok ? '✅' : '❌'}|${base.completeness_score}|\\n`,\n );\n });\n\n lines.push(\n '\\n## Material balance scope\\n- Check only `raw material input = product + by-product + waste`\\n- Energy inputs are listed but excluded from balance\\n',\n );\n lines.push(\n '\\n## Per-process results\\n|process file|raw material in|product|by-product|waste|energy in (excluded)|delta(out-in)|relative deviation|\\n|---|---:|---:|---:|---:|---:|---:|---:|\\n',\n );\n\n options.rows.forEach((row) => {\n lines.push(\n `|${row.process_file}|${row.raw_input.toPrecision(6)}|${row.product.toPrecision(6)}|${row.byproduct.toPrecision(6)}|${row.waste.toPrecision(6)}|${row.energy_excluded.toPrecision(6)}|${row.delta.toPrecision(6)}|${formatPercent(row.relative_deviation)}|\\n`,\n );\n });\n\n lines.push(\n `\\n## Summary\\n- Raw material input total: **${options.totals.raw_input.toPrecision(6)}**\\n- Product+by-product+waste total: **${options.totals.product_plus_byproduct_plus_waste.toPrecision(6)}**\\n- Delta (out-in): **${options.totals.delta.toPrecision(6)}**\\n- Relative deviation: **${formatPercent(options.totals.relative_deviation)}**\\n- Energy input total (excluded from balance): **${options.totals.energy_excluded.toPrecision(6)}**\\n`,\n );\n lines.push(\n `\\n## Evidence-sufficient conclusions\\n${options.evidenceStrong.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n lines.push(\n `\\n## Evidence-insufficient conclusions / limitations\\n${options.evidenceWeak.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n\n return lines.join('');\n}\n\nfunction renderTiming(options: {\n runId: string;\n startTs: string | undefined;\n endTs: string | undefined;\n processCount: number;\n}): string {\n const lines = ['# one_flow_rerun_timing\\n', `- run_id: \\`${options.runId}\\`\\n`];\n\n if (options.startTs && options.endTs) {\n const start = new Date(options.startTs);\n const end = new Date(options.endTs);\n if (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime())) {\n throw new CliError('Expected --start-ts and --end-ts to be valid ISO timestamps.', {\n code: 'PROCESS_REVIEW_INVALID_TIMESTAMP',\n exitCode: 2,\n });\n }\n lines.push(`- start: \\`${options.startTs}\\`\\n`);\n lines.push(`- end: \\`${options.endTs}\\`\\n`);\n lines.push(\n `- total elapsed: **${((end.getTime() - start.getTime()) / 60_000).toFixed(2)} min**\\n`,\n );\n }\n\n lines.push(`- process files reviewed: \\`${options.processCount}\\`\\n`);\n lines.push(\n '- major time consumers: references retrieval, flow matching/search, flow metadata lookups.\\n',\n );\n return lines.join('');\n}\n\nfunction renderUnitIssues(runId: string, unitIssues: UnitIssue[]): string {\n const lines = [\n '# flow_unit_issue_log\\n',\n `- run_id: \\`${runId}\\`\\n`,\n '\\n|flow UUID|current unit|suggested unit|basis|confidence|\\n|---|---|---|---|---|\\n',\n ];\n\n if (unitIssues.length === 0) {\n lines.push('|无|无|无|未发现基于直接证据的单位矛盾|—|\\n');\n return lines.join('');\n }\n\n const seen = new Set<string>();\n unitIssues.forEach((issue) => {\n const key = JSON.stringify(issue);\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n lines.push(\n `|${issue.flow_uuid}|${issue.current_unit}|${issue.suggested_unit}|${issue.basis}|${issue.confidence}|\\n`,\n );\n });\n\n return lines.join('');\n}\n\nexport async function runProcessReview(\n options: RunProcessReviewOptions,\n): Promise<ProcessReviewReport> {\n const outDir = path.resolve(\n requiredNonEmpty(options.outDir, '--out-dir', 'PROCESS_REVIEW_OUT_DIR_REQUIRED'),\n );\n const resolvedInput = resolveReviewInput({\n rowsFile: options.rowsFile,\n runRoot: options.runRoot,\n runId: options.runId,\n outDir,\n });\n const runId = requiredNonEmpty(resolvedInput.runId, '--run-id', 'PROCESS_REVIEW_RUN_ID_REQUIRED');\n const logicVersion = options.logicVersion?.trim() || 'v2.1';\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const env = options.env ?? process.env;\n const llmMaxProcesses =\n typeof options.llmMaxProcesses === 'number' &&\n Number.isInteger(options.llmMaxProcesses) &&\n options.llmMaxProcesses > 0\n ? options.llmMaxProcesses\n : 8;\n const processFiles = readProcessFiles(resolvedInput.effectiveProcessesDir);\n const baseRows: Array<[string, BaseInfoCheck]> = [];\n const rows: ProcessReviewRow[] = [];\n const unitIssues: UnitIssue[] = [];\n const processSummariesForLlm: ProcessSummaryForLlm[] = [];\n\n let totalRaw = 0;\n let totalProduct = 0;\n let totalByproduct = 0;\n let totalWaste = 0;\n let totalEnergy = 0;\n\n processFiles.forEach((filePath) => {\n const processPayload = unwrapProcessPayload(readJsonInput(filePath), filePath);\n const exchangesValue = deepGet(processPayload, ['processDataSet', 'exchanges', 'exchange']);\n const exchanges = Array.isArray(exchangesValue)\n ? exchangesValue.filter(isRecord)\n : isRecord(exchangesValue)\n ? [exchangesValue]\n : [];\n const base = baseInfoCheck(processPayload);\n const fileName = path.basename(filePath);\n baseRows.push([fileName, base]);\n\n let rawInput = 0;\n let product = 0;\n let byproduct = 0;\n let waste = 0;\n let energyExcluded = 0;\n\n exchanges.forEach((exchange) => {\n const classified = classifyExchange(exchange);\n const amount = toNumber(exchange.meanAmount ?? exchange.resultingAmount);\n if (classified.classification === 'raw_material_input') {\n rawInput += amount;\n } else if (classified.classification === 'product_output') {\n product += amount;\n } else if (classified.classification === 'byproduct_output') {\n byproduct += amount;\n } else if (classified.classification === 'waste_output') {\n waste += amount;\n } else if (classified.classification === 'energy_input') {\n energyExcluded += amount;\n }\n unitIssues.push(...unitIssueCheck(exchange, classified.uoms, classified.blob));\n });\n\n const balanceOut = product + byproduct + waste;\n const delta = balanceOut - rawInput;\n const relativeDeviation = rawInput > 0 ? Math.abs(delta) / rawInput : null;\n\n rows.push({\n process_file: fileName,\n raw_input: rawInput,\n product,\n byproduct,\n waste,\n energy_excluded: energyExcluded,\n delta,\n relative_deviation: relativeDeviation,\n });\n\n totalRaw += rawInput;\n totalProduct += product;\n totalByproduct += byproduct;\n totalWaste += waste;\n totalEnergy += energyExcluded;\n\n if (processSummariesForLlm.length < Math.max(1, llmMaxProcesses)) {\n processSummariesForLlm.push({\n process_file: fileName,\n base_names: base.base_names.slice(0, 4),\n base_checks: {\n name_zh_en_ok: base.name_zh_en_ok,\n functional_unit_ok: base.functional_unit_ok,\n system_boundary_ok: base.system_boundary_ok,\n time_ok: base.time_ok,\n geo_ok: base.geo_ok,\n tech_ok: base.tech_ok,\n admin_ok: base.admin_ok,\n },\n balance: {\n raw_in: rawInput,\n product,\n byproduct,\n waste,\n energy_excluded: energyExcluded,\n relative_deviation: relativeDeviation,\n },\n });\n }\n });\n\n const totals: ProcessReviewTotals = {\n raw_input: totalRaw,\n product_plus_byproduct_plus_waste: totalProduct + totalByproduct + totalWaste,\n delta: totalProduct + totalByproduct + totalWaste - totalRaw,\n relative_deviation:\n totalRaw > 0\n ? Math.abs(totalProduct + totalByproduct + totalWaste - totalRaw) / totalRaw\n : null,\n energy_excluded: totalEnergy,\n };\n\n const evidenceStrong = [\n '已基于 exchange 的 comment 标签/描述做口径过滤,仅核算 原材料投入 vs 产品+副产品+废物,能量单列不计入平衡。',\n ...(unitIssues.length > 0\n ? ['发现单位疑似错误时均附带 flow 描述与单位标签的直接矛盾证据。']\n : []),\n ];\n\n const evidenceWeak = [\n '部分 exchange 缺少结构化 type 标签,仅能依赖文本关键词分类,存在误判风险。',\n '未逐条拉取 flow 数据集参考单位做机器核对,单位结论以评论标签与流名称语义一致性为主。',\n ];\n\n const llmResult = await runOptionalLlmReview(processSummariesForLlm, {\n enableLlm: Boolean(options.enableLlm),\n llmModel: options.llmModel,\n env,\n fetchImpl,\n outDir,\n });\n\n const summary: ProcessReviewSummary = {\n run_id: runId,\n logic_version: logicVersion,\n process_count: processFiles.length,\n totals,\n llm: llmResult,\n };\n const reviewInputSummaryPath = writeJsonArtifact(\n path.join(outDir, 'review-input-summary.json'),\n resolvedInput.reviewInputSummary,\n );\n\n const reviewZhPath = writeTextArtifact(\n path.join(outDir, 'one_flow_rerun_review_v2_1_zh.md'),\n renderZhReview({\n runId,\n logicVersion,\n baseRows,\n rows,\n totals,\n llmResult,\n evidenceStrong,\n evidenceWeak,\n }),\n );\n const reviewEnPath = writeTextArtifact(\n path.join(outDir, 'one_flow_rerun_review_v2_1_en.md'),\n renderEnReview({\n runId,\n logicVersion,\n baseRows,\n rows,\n totals,\n evidenceStrong,\n evidenceWeak,\n }),\n );\n const timingPath = writeTextArtifact(\n path.join(outDir, 'one_flow_rerun_timing.md'),\n renderTiming({\n runId,\n startTs: options.startTs,\n endTs: options.endTs,\n processCount: processFiles.length,\n }),\n );\n const unitIssuePath = writeTextArtifact(\n path.join(outDir, 'flow_unit_issue_log.md'),\n renderUnitIssues(runId, unitIssues),\n );\n const summaryPath = writeJsonArtifact(path.join(outDir, 'review_summary_v2_1.json'), summary);\n\n const report: ProcessReviewReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? (() => new Date()))().toISOString(),\n status: 'completed_local_process_review',\n run_id: runId,\n run_root: resolvedInput.runRoot,\n rows_file: resolvedInput.rowsFile,\n out_dir: outDir,\n input_mode: resolvedInput.inputMode,\n effective_processes_dir: resolvedInput.effectiveProcessesDir,\n logic_version: logicVersion,\n process_count: processFiles.length,\n totals,\n files: {\n review_input_summary: reviewInputSummaryPath,\n materialization_summary: resolvedInput.materializationSummaryPath,\n review_zh: reviewZhPath,\n review_en: reviewEnPath,\n timing: timingPath,\n unit_issue_log: unitIssuePath,\n summary: summaryPath,\n report: '',\n },\n llm: llmResult,\n };\n\n const reportPath = writeJsonArtifact(path.join(outDir, 'process-review-report.json'), report);\n report.files.report = reportPath;\n writeJsonArtifact(reportPath, report);\n return report;\n}\n\nexport const __testInternals = {\n requiredNonEmpty,\n textFromValue,\n toNumber,\n deepGet,\n hasNonEmpty,\n extractBaseNames,\n classifyExchange,\n unitIssueCheck,\n baseInfoCheck,\n unwrapProcessPayload,\n buildPrompt,\n parseLlmJsonOutput,\n runOptionalLlmReview,\n renderZhReview,\n renderEnReview,\n renderTiming,\n renderUnitIssues,\n};\n"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { createDatasetCommandClient } from './dataset-command.js';
|
|
2
|
-
import { readRuntimeEnv } from './env.js';
|
|
3
1
|
import { CliError } from './errors.js';
|
|
2
|
+
import { buildDatasetCommandTransport, createDatasetRecord, saveDraftDatasetRecord, } from './dataset-command.js';
|
|
4
3
|
import { createSupabaseDataClient, requireSupabaseRestRuntime, runSupabaseArrayQuery, } from './supabase-client.js';
|
|
5
4
|
import { createSupabaseDataRuntime } from './supabase-session.js';
|
|
6
5
|
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
@@ -56,20 +55,22 @@ async function exactVisibleRows(options) {
|
|
|
56
55
|
return parseVisibleRows(payload, url);
|
|
57
56
|
}
|
|
58
57
|
async function insertJsonOrderedRow(options) {
|
|
59
|
-
await
|
|
58
|
+
await createDatasetRecord({
|
|
59
|
+
transport: options.transport,
|
|
60
60
|
table: options.table,
|
|
61
61
|
id: options.id,
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
payload: options.payload,
|
|
63
|
+
extraData: options.extraData,
|
|
64
64
|
});
|
|
65
65
|
}
|
|
66
66
|
async function updateJsonOrderedRow(options) {
|
|
67
|
-
await
|
|
67
|
+
await saveDraftDatasetRecord({
|
|
68
|
+
transport: options.transport,
|
|
68
69
|
table: options.table,
|
|
69
70
|
id: options.id,
|
|
70
71
|
version: options.version,
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
payload: options.payload,
|
|
73
|
+
extraData: options.extraData,
|
|
73
74
|
});
|
|
74
75
|
}
|
|
75
76
|
function requireNonEmptyToken(value, label, code) {
|
|
@@ -82,23 +83,6 @@ function requireNonEmptyToken(value, label, code) {
|
|
|
82
83
|
}
|
|
83
84
|
return normalized;
|
|
84
85
|
}
|
|
85
|
-
function commandOptionsFromExtraData(extraData) {
|
|
86
|
-
if (!extraData) {
|
|
87
|
-
return {};
|
|
88
|
-
}
|
|
89
|
-
const result = {};
|
|
90
|
-
if ('modelId' in extraData || 'model_id' in extraData) {
|
|
91
|
-
const modelIdValue = extraData.modelId ?? extraData.model_id;
|
|
92
|
-
result.modelId = modelIdValue === null ? null : trimToken(modelIdValue) || null;
|
|
93
|
-
}
|
|
94
|
-
if ('ruleVerification' in extraData || 'rule_verification' in extraData) {
|
|
95
|
-
const ruleVerificationValue = extraData.ruleVerification ?? extraData.rule_verification;
|
|
96
|
-
if (typeof ruleVerificationValue === 'boolean' || ruleVerificationValue === null) {
|
|
97
|
-
result.ruleVerification = ruleVerificationValue;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return result;
|
|
101
|
-
}
|
|
102
86
|
export function hasSupabaseRestRuntime(env) {
|
|
103
87
|
if (!env) {
|
|
104
88
|
return false;
|
|
@@ -116,13 +100,12 @@ export async function syncSupabaseJsonOrderedRecord(options) {
|
|
|
116
100
|
fetchImpl: options.fetchImpl,
|
|
117
101
|
timeoutMs,
|
|
118
102
|
});
|
|
119
|
-
const
|
|
120
|
-
const commandClient = createDatasetCommandClient({
|
|
103
|
+
const commandTransport = await buildDatasetCommandTransport({
|
|
121
104
|
runtime,
|
|
122
105
|
fetchImpl: options.fetchImpl,
|
|
123
106
|
timeoutMs,
|
|
124
|
-
region: readRuntimeEnv(options.env).region,
|
|
125
107
|
});
|
|
108
|
+
const { client, restBaseUrl } = createSupabaseDataClient(runtime, options.fetchImpl, timeoutMs);
|
|
126
109
|
const visibleBefore = await exactVisibleRows({
|
|
127
110
|
client,
|
|
128
111
|
restBaseUrl,
|
|
@@ -138,7 +121,7 @@ export async function syncSupabaseJsonOrderedRecord(options) {
|
|
|
138
121
|
}
|
|
139
122
|
if (visibleBefore.length > 0) {
|
|
140
123
|
await updateJsonOrderedRow({
|
|
141
|
-
|
|
124
|
+
transport: commandTransport,
|
|
142
125
|
table: options.table,
|
|
143
126
|
id,
|
|
144
127
|
version,
|
|
@@ -152,7 +135,7 @@ export async function syncSupabaseJsonOrderedRecord(options) {
|
|
|
152
135
|
}
|
|
153
136
|
try {
|
|
154
137
|
await insertJsonOrderedRow({
|
|
155
|
-
|
|
138
|
+
transport: commandTransport,
|
|
156
139
|
table: options.table,
|
|
157
140
|
id,
|
|
158
141
|
payload: options.payload,
|
|
@@ -181,7 +164,7 @@ export async function syncSupabaseJsonOrderedRecord(options) {
|
|
|
181
164
|
};
|
|
182
165
|
}
|
|
183
166
|
await updateJsonOrderedRow({
|
|
184
|
-
|
|
167
|
+
transport: commandTransport,
|
|
185
168
|
table: options.table,
|
|
186
169
|
id,
|
|
187
170
|
version,
|
|
@@ -199,7 +182,6 @@ export const __testInternals = {
|
|
|
199
182
|
buildUpdateUrl,
|
|
200
183
|
parseVisibleRows,
|
|
201
184
|
exactVisibleRows,
|
|
202
|
-
commandOptionsFromExtraData,
|
|
203
185
|
insertJsonOrderedRow,
|
|
204
186
|
updateJsonOrderedRow,
|
|
205
187
|
requireNonEmptyToken,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-json-ordered-write.js","sourceRoot":"","sources":["../../../src/lib/supabase-json-ordered-write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAA6B,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAIlE,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAuBlC,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,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CACrB,WAAmB,EACnB,KAA+B,EAC/B,EAAU,EACV,OAAe;IAEf,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACpE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;IACxD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,OAAO,EAAE,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CACrB,WAAmB,EACnB,KAA+B,EAC/B,EAAU,EACV,OAAe;IAEf,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACpE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,OAAO,EAAE,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB,EAAE,GAAW;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAAC,mDAAmD,GAAG,EAAE,EAAE;YAC3E,IAAI,EAAE,gCAAgC;YACtC,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,QAAQ,CAAC,qBAAqB,KAAK,8BAA8B,GAAG,EAAE,EAAE;gBAChF,IAAI,EAAE,gCAAgC;gBACtC,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;YAChC,UAAU,EAAE,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;SACzE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAM/B;IACC,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,MAAM,qBAAqB,CACzC,OAAO,CAAC,MAAM;SACX,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;SACnB,MAAM,CAAC,uBAAuB,CAAC;SAC/B,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;SACpB,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,EACjC,GAAG,CACJ,CAAC;IACF,OAAO,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,OAMnC;IACC,MAAM,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;QACjC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,WAAW,EAAE,OAAO,CAAC,OAAO;QAC5B,GAAG,2BAA2B,CAAC,OAAO,CAAC,SAAS,CAAC;KAClD,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,OAOnC;IACC,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,OAAO;QAC5B,GAAG,2BAA2B,CAAC,OAAO,CAAC,SAAS,CAAC;KAClD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,KAAa,EAAE,IAAY;IACtE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,QAAQ,CAAC,oBAAoB,KAAK,GAAG,EAAE;YAC/C,IAAI;YACJ,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,2BAA2B,CAAC,SAAsB;IAIzD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAGR,EAAE,CAAC;IAEP,IAAI,SAAS,IAAI,SAAS,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC;QAC7D,MAAM,CAAC,OAAO,GAAG,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;IAClF,CAAC;IAED,IAAI,kBAAkB,IAAI,SAAS,IAAI,mBAAmB,IAAI,SAAS,EAAE,CAAC;QACxE,MAAM,qBAAqB,GAAG,SAAS,CAAC,gBAAgB,IAAI,SAAS,CAAC,iBAAiB,CAAC;QACxF,IAAI,OAAO,qBAAqB,KAAK,SAAS,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;YACjF,MAAM,CAAC,gBAAgB,GAAG,qBAAqB,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAkC;IACvE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CACZ,SAAS,CAAC,GAAG,CAAC,yBAAyB,CAAC;QACxC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACnC,SAAS,CAAC,GAAG,CAAC,qCAAqC,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,OAUnD;IACC,MAAM,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,mCAAmC,CAAC,CAAC;IAC/F,MAAM,OAAO,GAAG,oBAAoB,CAClC,OAAO,CAAC,OAAO,EACf,iBAAiB,EACjB,wCAAwC,CACzC,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,MAAM,OAAO,GAAG,yBAAyB,CAAC;QACxC,OAAO,EAAE,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC;QAChD,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS;KACV,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAChG,MAAM,aAAa,GAAG,0BAA0B,CAAC;QAC/C,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS;QACT,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM;KAC3C,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;QAC3C,MAAM;QACN,WAAW;QACX,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,EAAE;QACF,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,SAAS,KAAK,oBAAoB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3E,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,kBAAkB;SAC9B,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,oBAAoB,CAAC;YACzB,aAAa;YACb,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,EAAE;YACF,OAAO;YACP,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QACH,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,iBAAiB;SAC7B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,oBAAoB,CAAC;YACzB,aAAa;YACb,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,EAAE;YACF,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QACH,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,QAAQ;SACpB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC;YAC1C,MAAM;YACN,WAAW;YACX,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,EAAE;YACF,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,KAAK,oBAAoB,EAAE,CAAC;YAC/C,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,kBAAkB;aAC9B,CAAC;QACJ,CAAC;QAED,MAAM,oBAAoB,CAAC;YACzB,aAAa;YACb,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,EAAE;YACF,OAAO;YACP,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QACH,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,2BAA2B;SACvC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,2BAA2B;IAC3B,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;CACrB,CAAC","sourcesContent":["import { createDatasetCommandClient, type DatasetCommandClient } from './dataset-command.js';\nimport { readRuntimeEnv } from './env.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport type SupabaseJsonOrderedTable = 'lifecyclemodels' | 'processes' | 'sources';\nexport type SupabaseJsonOrderedWriteMode = 'upsert_current_version' | 'append_only_insert';\nexport type SupabaseJsonOrderedWriteOperation =\n | 'insert'\n | 'update_existing'\n | 'update_after_insert_error'\n | 'skipped_existing';\n\nexport type SupabaseJsonOrderedWriteResult = {\n status: 'success';\n operation: SupabaseJsonOrderedWriteOperation;\n};\n\ntype VisibleRow = {\n id: string;\n version: string;\n state_code: number | null;\n};\n\ntype SupabaseDataClient = ReturnType<typeof createSupabaseDataClient>['client'];\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimToken(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction buildSelectUrl(\n restBaseUrl: string,\n table: SupabaseJsonOrderedTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('select', 'id,version,state_code');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction buildUpdateUrl(\n restBaseUrl: string,\n table: SupabaseJsonOrderedTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction parseVisibleRows(payload: unknown, url: string): VisibleRow[] {\n if (!Array.isArray(payload)) {\n throw new CliError(`Supabase REST response was not a JSON array for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload.map((item, index) => {\n if (!isRecord(item)) {\n throw new CliError(`Supabase REST row ${index} was not a JSON object for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: item,\n });\n }\n\n return {\n id: trimToken(item.id),\n version: trimToken(item.version),\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nasync function exactVisibleRows(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n}): Promise<VisibleRow[]> {\n const url = buildSelectUrl(options.restBaseUrl, options.table, options.id, options.version);\n const payload = await runSupabaseArrayQuery(\n options.client\n .from(options.table)\n .select('id,version,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n url,\n );\n return parseVisibleRows(payload, url);\n}\n\nasync function insertJsonOrderedRow(options: {\n commandClient: DatasetCommandClient;\n table: SupabaseJsonOrderedTable;\n id: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n await options.commandClient.create({\n table: options.table,\n id: options.id,\n jsonOrdered: options.payload,\n ...commandOptionsFromExtraData(options.extraData),\n });\n}\n\nasync function updateJsonOrderedRow(options: {\n commandClient: DatasetCommandClient;\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n await options.commandClient.saveDraft({\n table: options.table,\n id: options.id,\n version: options.version,\n jsonOrdered: options.payload,\n ...commandOptionsFromExtraData(options.extraData),\n });\n}\n\nfunction requireNonEmptyToken(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 commandOptionsFromExtraData(extraData?: JsonObject): {\n modelId?: string | null;\n ruleVerification?: boolean | null;\n} {\n if (!extraData) {\n return {};\n }\n\n const result: {\n modelId?: string | null;\n ruleVerification?: boolean | null;\n } = {};\n\n if ('modelId' in extraData || 'model_id' in extraData) {\n const modelIdValue = extraData.modelId ?? extraData.model_id;\n result.modelId = modelIdValue === null ? null : trimToken(modelIdValue) || null;\n }\n\n if ('ruleVerification' in extraData || 'rule_verification' in extraData) {\n const ruleVerificationValue = extraData.ruleVerification ?? extraData.rule_verification;\n if (typeof ruleVerificationValue === 'boolean' || ruleVerificationValue === null) {\n result.ruleVerification = ruleVerificationValue;\n }\n }\n\n return result;\n}\n\nexport function hasSupabaseRestRuntime(env: NodeJS.ProcessEnv | undefined): boolean {\n if (!env) {\n return false;\n }\n\n return Boolean(\n trimToken(env.TIANGONG_LCA_API_BASE_URL) &&\n trimToken(env.TIANGONG_LCA_API_KEY) &&\n trimToken(env.TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY),\n );\n}\n\nexport async function syncSupabaseJsonOrderedRecord(options: {\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n payload: JsonObject;\n writeMode: SupabaseJsonOrderedWriteMode;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs?: number;\n extraData?: JsonObject;\n}): Promise<SupabaseJsonOrderedWriteResult> {\n const id = requireNonEmptyToken(options.id, 'dataset id', 'SUPABASE_JSON_ORDERED_ID_REQUIRED');\n const version = requireNonEmptyToken(\n options.version,\n 'dataset version',\n 'SUPABASE_JSON_ORDERED_VERSION_REQUIRED',\n );\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n const { client, restBaseUrl } = createSupabaseDataClient(runtime, options.fetchImpl, timeoutMs);\n const commandClient = createDatasetCommandClient({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n region: readRuntimeEnv(options.env).region,\n });\n\n const visibleBefore = await exactVisibleRows({\n client,\n restBaseUrl,\n table: options.table,\n id,\n version,\n });\n\n if (options.writeMode === 'append_only_insert' && visibleBefore.length > 0) {\n return {\n status: 'success',\n operation: 'skipped_existing',\n };\n }\n\n if (visibleBefore.length > 0) {\n await updateJsonOrderedRow({\n commandClient,\n table: options.table,\n id,\n version,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'update_existing',\n };\n }\n\n try {\n await insertJsonOrderedRow({\n commandClient,\n table: options.table,\n id,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'insert',\n };\n } catch (error) {\n const visibleAfter = await exactVisibleRows({\n client,\n restBaseUrl,\n table: options.table,\n id,\n version,\n });\n\n if (visibleAfter.length === 0) {\n throw error;\n }\n\n if (options.writeMode === 'append_only_insert') {\n return {\n status: 'success',\n operation: 'skipped_existing',\n };\n }\n\n await updateJsonOrderedRow({\n commandClient,\n table: options.table,\n id,\n version,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'update_after_insert_error',\n };\n }\n}\n\nexport const __testInternals = {\n buildSelectUrl,\n buildUpdateUrl,\n parseVisibleRows,\n exactVisibleRows,\n commandOptionsFromExtraData,\n insertJsonOrderedRow,\n updateJsonOrderedRow,\n requireNonEmptyToken,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"supabase-json-ordered-write.js","sourceRoot":"","sources":["../../../src/lib/supabase-json-ordered-write.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport {\n buildDatasetCommandTransport,\n createDatasetRecord,\n saveDraftDatasetRecord,\n type DatasetCommandTransport,\n} from './dataset-command.js';\nimport type { FetchLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport type SupabaseJsonOrderedTable = 'lifecyclemodels' | 'processes' | 'sources';\nexport type SupabaseJsonOrderedWriteMode = 'upsert_current_version' | 'append_only_insert';\nexport type SupabaseJsonOrderedWriteOperation =\n | 'insert'\n | 'update_existing'\n | 'update_after_insert_error'\n | 'skipped_existing';\n\nexport type SupabaseJsonOrderedWriteResult = {\n status: 'success';\n operation: SupabaseJsonOrderedWriteOperation;\n};\n\ntype VisibleRow = {\n id: string;\n version: string;\n state_code: number | null;\n};\n\ntype SupabaseDataClient = ReturnType<typeof createSupabaseDataClient>['client'];\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimToken(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction buildSelectUrl(\n restBaseUrl: string,\n table: SupabaseJsonOrderedTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('select', 'id,version,state_code');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction buildUpdateUrl(\n restBaseUrl: string,\n table: SupabaseJsonOrderedTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction parseVisibleRows(payload: unknown, url: string): VisibleRow[] {\n if (!Array.isArray(payload)) {\n throw new CliError(`Supabase REST response was not a JSON array for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload.map((item, index) => {\n if (!isRecord(item)) {\n throw new CliError(`Supabase REST row ${index} was not a JSON object for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: item,\n });\n }\n\n return {\n id: trimToken(item.id),\n version: trimToken(item.version),\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nasync function exactVisibleRows(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n}): Promise<VisibleRow[]> {\n const url = buildSelectUrl(options.restBaseUrl, options.table, options.id, options.version);\n const payload = await runSupabaseArrayQuery(\n options.client\n .from(options.table)\n .select('id,version,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n url,\n );\n return parseVisibleRows(payload, url);\n}\n\nasync function insertJsonOrderedRow(options: {\n transport: DatasetCommandTransport;\n table: SupabaseJsonOrderedTable;\n id: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n await createDatasetRecord({\n transport: options.transport,\n table: options.table,\n id: options.id,\n payload: options.payload,\n extraData: options.extraData,\n });\n}\n\nasync function updateJsonOrderedRow(options: {\n transport: DatasetCommandTransport;\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n await saveDraftDatasetRecord({\n transport: options.transport,\n table: options.table,\n id: options.id,\n version: options.version,\n payload: options.payload,\n extraData: options.extraData,\n });\n}\n\nfunction requireNonEmptyToken(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\nexport function hasSupabaseRestRuntime(env: NodeJS.ProcessEnv | undefined): boolean {\n if (!env) {\n return false;\n }\n\n return Boolean(\n trimToken(env.TIANGONG_LCA_API_BASE_URL) &&\n trimToken(env.TIANGONG_LCA_API_KEY) &&\n trimToken(env.TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY),\n );\n}\n\nexport async function syncSupabaseJsonOrderedRecord(options: {\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n payload: JsonObject;\n writeMode: SupabaseJsonOrderedWriteMode;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs?: number;\n extraData?: JsonObject;\n}): Promise<SupabaseJsonOrderedWriteResult> {\n const id = requireNonEmptyToken(options.id, 'dataset id', 'SUPABASE_JSON_ORDERED_ID_REQUIRED');\n const version = requireNonEmptyToken(\n options.version,\n 'dataset version',\n 'SUPABASE_JSON_ORDERED_VERSION_REQUIRED',\n );\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n const commandTransport = await buildDatasetCommandTransport({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n const { client, restBaseUrl } = createSupabaseDataClient(runtime, options.fetchImpl, timeoutMs);\n\n const visibleBefore = await exactVisibleRows({\n client,\n restBaseUrl,\n table: options.table,\n id,\n version,\n });\n\n if (options.writeMode === 'append_only_insert' && visibleBefore.length > 0) {\n return {\n status: 'success',\n operation: 'skipped_existing',\n };\n }\n\n if (visibleBefore.length > 0) {\n await updateJsonOrderedRow({\n transport: commandTransport,\n table: options.table,\n id,\n version,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'update_existing',\n };\n }\n\n try {\n await insertJsonOrderedRow({\n transport: commandTransport,\n table: options.table,\n id,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'insert',\n };\n } catch (error) {\n const visibleAfter = await exactVisibleRows({\n client,\n restBaseUrl,\n table: options.table,\n id,\n version,\n });\n\n if (visibleAfter.length === 0) {\n throw error;\n }\n\n if (options.writeMode === 'append_only_insert') {\n return {\n status: 'success',\n operation: 'skipped_existing',\n };\n }\n\n await updateJsonOrderedRow({\n transport: commandTransport,\n table: options.table,\n id,\n version,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'update_after_insert_error',\n };\n }\n}\n\nexport const __testInternals = {\n buildSelectUrl,\n buildUpdateUrl,\n parseVisibleRows,\n exactVisibleRows,\n insertJsonOrderedRow,\n updateJsonOrderedRow,\n requireNonEmptyToken,\n};\n"]}
|