@tiangong-lca/cli 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +368 -0
  2. package/bin/tiangong.d.ts +1 -0
  3. package/bin/tiangong.js +32 -0
  4. package/dist/scripts/assert-full-coverage.js +77 -0
  5. package/dist/scripts/assert-full-coverage.js.map +1 -0
  6. package/dist/src/cli.js +2740 -0
  7. package/dist/src/cli.js.map +1 -0
  8. package/dist/src/lib/artifacts.js +86 -0
  9. package/dist/src/lib/artifacts.js.map +1 -0
  10. package/dist/src/lib/dotenv.js +36 -0
  11. package/dist/src/lib/dotenv.js.map +1 -0
  12. package/dist/src/lib/env.js +139 -0
  13. package/dist/src/lib/env.js.map +1 -0
  14. package/dist/src/lib/errors.js +38 -0
  15. package/dist/src/lib/errors.js.map +1 -0
  16. package/dist/src/lib/flow-build-alias-map.js +299 -0
  17. package/dist/src/lib/flow-build-alias-map.js.map +1 -0
  18. package/dist/src/lib/flow-get.js +81 -0
  19. package/dist/src/lib/flow-get.js.map +1 -0
  20. package/dist/src/lib/flow-governance.js +164 -0
  21. package/dist/src/lib/flow-governance.js.map +1 -0
  22. package/dist/src/lib/flow-list.js +187 -0
  23. package/dist/src/lib/flow-list.js.map +1 -0
  24. package/dist/src/lib/flow-publish-reviewed-data.js +808 -0
  25. package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -0
  26. package/dist/src/lib/flow-publish-version.js +541 -0
  27. package/dist/src/lib/flow-publish-version.js.map +1 -0
  28. package/dist/src/lib/flow-read.js +310 -0
  29. package/dist/src/lib/flow-read.js.map +1 -0
  30. package/dist/src/lib/flow-regen-product.js +1396 -0
  31. package/dist/src/lib/flow-regen-product.js.map +1 -0
  32. package/dist/src/lib/flow-remediate.js +821 -0
  33. package/dist/src/lib/flow-remediate.js.map +1 -0
  34. package/dist/src/lib/http.js +45 -0
  35. package/dist/src/lib/http.js.map +1 -0
  36. package/dist/src/lib/io.js +30 -0
  37. package/dist/src/lib/io.js.map +1 -0
  38. package/dist/src/lib/kb-search.js +83 -0
  39. package/dist/src/lib/kb-search.js.map +1 -0
  40. package/dist/src/lib/lifecyclemodel-auto-build.js +1328 -0
  41. package/dist/src/lib/lifecyclemodel-auto-build.js.map +1 -0
  42. package/dist/src/lib/lifecyclemodel-orchestrate.js +1556 -0
  43. package/dist/src/lib/lifecyclemodel-orchestrate.js.map +1 -0
  44. package/dist/src/lib/lifecyclemodel-publish-build.js +296 -0
  45. package/dist/src/lib/lifecyclemodel-publish-build.js.map +1 -0
  46. package/dist/src/lib/lifecyclemodel-publish-resulting-process.js +101 -0
  47. package/dist/src/lib/lifecyclemodel-publish-resulting-process.js.map +1 -0
  48. package/dist/src/lib/lifecyclemodel-resulting-process.js +1152 -0
  49. package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -0
  50. package/dist/src/lib/lifecyclemodel-validate-build.js +238 -0
  51. package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -0
  52. package/dist/src/lib/llm.js +383 -0
  53. package/dist/src/lib/llm.js.map +1 -0
  54. package/dist/src/lib/process-auto-build.js +717 -0
  55. package/dist/src/lib/process-auto-build.js.map +1 -0
  56. package/dist/src/lib/process-batch-build.js +409 -0
  57. package/dist/src/lib/process-batch-build.js.map +1 -0
  58. package/dist/src/lib/process-get.js +66 -0
  59. package/dist/src/lib/process-get.js.map +1 -0
  60. package/dist/src/lib/process-publish-build.js +451 -0
  61. package/dist/src/lib/process-publish-build.js.map +1 -0
  62. package/dist/src/lib/process-resume-build.js +364 -0
  63. package/dist/src/lib/process-resume-build.js.map +1 -0
  64. package/dist/src/lib/publish.js +562 -0
  65. package/dist/src/lib/publish.js.map +1 -0
  66. package/dist/src/lib/remote.js +88 -0
  67. package/dist/src/lib/remote.js.map +1 -0
  68. package/dist/src/lib/review-flow.js +1110 -0
  69. package/dist/src/lib/review-flow.js.map +1 -0
  70. package/dist/src/lib/review-lifecyclemodel.js +727 -0
  71. package/dist/src/lib/review-lifecyclemodel.js.map +1 -0
  72. package/dist/src/lib/review-process.js +702 -0
  73. package/dist/src/lib/review-process.js.map +1 -0
  74. package/dist/src/lib/run.js +106 -0
  75. package/dist/src/lib/run.js.map +1 -0
  76. package/dist/src/lib/state-lock.js +150 -0
  77. package/dist/src/lib/state-lock.js.map +1 -0
  78. package/dist/src/lib/supabase-client.js +269 -0
  79. package/dist/src/lib/supabase-client.js.map +1 -0
  80. package/dist/src/lib/supabase-json-ordered-write.js +186 -0
  81. package/dist/src/lib/supabase-json-ordered-write.js.map +1 -0
  82. package/dist/src/lib/supabase-rest.js +138 -0
  83. package/dist/src/lib/supabase-rest.js.map +1 -0
  84. package/dist/src/lib/supabase-session.js +424 -0
  85. package/dist/src/lib/supabase-session.js.map +1 -0
  86. package/dist/src/lib/tidas-sdk-package-validator.js +493 -0
  87. package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -0
  88. package/dist/src/lib/unstructured.js +203 -0
  89. package/dist/src/lib/unstructured.js.map +1 -0
  90. package/dist/src/lib/user-api-key.js +75 -0
  91. package/dist/src/lib/user-api-key.js.map +1 -0
  92. package/dist/src/lib/validation.js +191 -0
  93. package/dist/src/lib/validation.js.map +1 -0
  94. package/dist/src/main.js +38 -0
  95. package/dist/src/main.js.map +1 -0
  96. package/package.json +81 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-auto-build.js","sourceRoot":"","sources":["../../../src/lib/process-auto-build.ts"],"names":[],"mappings":"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","sourcesContent":["import { copyFileSync, existsSync, mkdirSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport { readJsonInput } from './io.js';\nimport {\n buildRunManifest,\n buildUtcTimestamp,\n ensureRunLayout,\n type RunLayout,\n sanitizeRunToken,\n writeLatestRunId,\n} from './run.js';\nimport { withStateFileLock } from './state-lock.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nexport type ProcessAutoBuildOperation = 'produce' | 'treat';\nexport type ProcessAutoBuildSourceInputType = 'local_file' | 'local_text';\n\nexport type ProcessAutoBuildSourcePolicy = {\n step1_route: {\n preferred: string[];\n fallback: string;\n };\n step2_process_split: {\n preferred: string[];\n fallback: string;\n };\n step3b_exchange_values: {\n preferred: string[];\n require_numeric_evidence: boolean;\n allow_estimation: boolean;\n };\n};\n\nexport type ProcessAutoBuildFlowSummary = {\n wrapper: 'flowDataSet' | 'direct';\n uuid: string | null;\n version: string | null;\n base_name: string | null;\n permanent_uri: string | null;\n};\n\nexport type NormalizedProcessAutoBuildSourceInput = {\n source_id: string;\n type: ProcessAutoBuildSourceInputType;\n source_path: string;\n artifact_path: string;\n artifact_file_name: string;\n intended_roles: string[];\n};\n\nexport type NormalizedProcessAutoBuildRequest = {\n schema_version: 1;\n request_path: string;\n request_id: string;\n flow_file: string;\n flow_summary: ProcessAutoBuildFlowSummary;\n flow_dataset: JsonRecord;\n operation: ProcessAutoBuildOperation;\n run_id: string;\n run_root: string;\n source_inputs: NormalizedProcessAutoBuildSourceInput[];\n source_policy: ProcessAutoBuildSourcePolicy;\n};\n\nexport type ProcessAutoBuildLayout = RunLayout & {\n requestDir: string;\n evidenceDir: string;\n evidenceIncomingDir: string;\n evidenceNormalizedDir: string;\n evidenceTextDir: string;\n evidenceStructuredDir: string;\n stageOutputsDir: string;\n reviewsDir: string;\n requestSnapshotPath: string;\n normalizedRequestPath: string;\n sourcePolicyPath: string;\n flowSummaryPath: string;\n inputManifestPath: string;\n assemblyPlanPath: string;\n lineageManifestPath: string;\n invocationIndexPath: string;\n runManifestPath: string;\n reportPath: string;\n statePath: string;\n handoffSummaryPath: string;\n processExportsDir: string;\n sourceExportsDir: string;\n};\n\nexport type ProcessAutoBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'prepared_local_process_auto_build_run';\n request_path: string;\n request_id: string;\n run_id: string;\n run_root: string;\n operation: ProcessAutoBuildOperation;\n flow: {\n source_path: string;\n artifact_path: string;\n wrapper: 'flowDataSet' | 'direct';\n uuid: string | null;\n version: string | null;\n base_name: string | null;\n };\n source_input_count: number;\n stage_count: number;\n files: {\n request_snapshot: string;\n normalized_request: string;\n source_policy: string;\n flow_summary: string;\n input_manifest: string;\n assembly_plan: string;\n lineage_manifest: string;\n invocation_index: string;\n run_manifest: string;\n state: string;\n handoff_summary: string;\n report: string;\n };\n next_actions: string[];\n};\n\nexport type RunProcessAutoBuildOptions = {\n inputPath: string;\n outDir?: string | null;\n now?: Date;\n cwd?: string;\n inputValue?: unknown;\n requestIdOverride?: string;\n runIdOverride?: string;\n};\n\ntype ProcessAutoBuildStage = {\n id: string;\n title: string;\n output: string;\n createsCandidatesDir: boolean;\n modules: string[];\n};\n\nconst DEFAULT_SOURCE_POLICY: ProcessAutoBuildSourcePolicy = {\n step1_route: {\n preferred: ['user_bundle', 'kb_bundle'],\n fallback: 'expert_judgement',\n },\n step2_process_split: {\n preferred: ['user_bundle.process_split', 'si_bundle', 'kb_bundle.process_split'],\n fallback: 'expert_judgement',\n },\n step3b_exchange_values: {\n preferred: ['user_bundle.exchange_values', 'si_bundle', 'kb_bundle.exchange_values'],\n require_numeric_evidence: true,\n allow_estimation: true,\n },\n};\n\nconst PROCESS_AUTO_BUILD_STAGES: ProcessAutoBuildStage[] = [\n {\n id: '01_route',\n title: 'Route planning',\n output: 'stage_outputs/01_route/route_plan.json',\n createsCandidatesDir: true,\n modules: ['kb-search', 'llm'],\n },\n {\n id: '02_process_split',\n title: 'Process chain split',\n output: 'stage_outputs/02_process_split/process_chain.json',\n createsCandidatesDir: true,\n modules: ['llm'],\n },\n {\n id: '03_exchange_plan',\n title: 'Exchange planning',\n output: 'stage_outputs/03_exchange_plan/exchange_plan.json',\n createsCandidatesDir: false,\n modules: ['llm'],\n },\n {\n id: '04_exchange_values',\n title: 'Exchange value extraction',\n output: 'stage_outputs/04_exchange_values/exchange_values.json',\n createsCandidatesDir: true,\n modules: ['unstructured', 'kb-search', 'llm'],\n },\n {\n id: '05_chain_review',\n title: 'Chain review',\n output: 'stage_outputs/05_chain_review/chain_review.json',\n createsCandidatesDir: false,\n modules: ['llm'],\n },\n {\n id: '06_flow_match',\n title: 'Flow matching',\n output: 'stage_outputs/06_flow_match/flow_match_bundle.json',\n createsCandidatesDir: false,\n modules: ['search:flow', 'llm'],\n },\n {\n id: '07_source_build',\n title: 'Source dataset build',\n output: 'stage_outputs/07_source_build/source_bundle.json',\n createsCandidatesDir: false,\n modules: ['validation'],\n },\n {\n id: '08_process_build',\n title: 'Process dataset build',\n output: 'stage_outputs/08_process_build/process_bundle.json',\n createsCandidatesDir: false,\n modules: ['validation', 'llm'],\n },\n {\n id: '09_qa',\n title: 'QA and balance review',\n output: 'stage_outputs/09_qa/qa_bundle.json',\n createsCandidatesDir: false,\n modules: ['validation', 'llm'],\n },\n {\n id: '10_publish',\n title: 'Publish handoff',\n output: 'stage_outputs/10_publish/publish_bundle.json',\n createsCandidatesDir: false,\n modules: ['publish'],\n },\n];\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized || null;\n}\n\nfunction extractText(value: unknown): string | null {\n const direct = nonEmptyString(value);\n if (direct) {\n return direct;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const extracted = extractText(item);\n if (extracted) {\n return extracted;\n }\n }\n return null;\n }\n\n if (!isRecord(value)) {\n return null;\n }\n\n if ('#text' in value) {\n return nonEmptyString(value['#text']);\n }\n\n return null;\n}\n\nfunction requiredRequestObject(input: unknown): JsonRecord {\n if (!isRecord(input)) {\n throw new CliError('process auto-build request must be a JSON object.', {\n code: 'PROCESS_AUTO_BUILD_REQUEST_INVALID',\n exitCode: 2,\n });\n }\n\n return input;\n}\n\nfunction requiredRequestString(input: JsonRecord, key: string): string {\n const value = nonEmptyString(input[key]);\n if (!value) {\n throw new CliError(`process auto-build request is missing '${key}'.`, {\n code: 'PROCESS_AUTO_BUILD_REQUEST_INVALID',\n exitCode: 2,\n details: { key },\n });\n }\n\n return value;\n}\n\nfunction normalizeOperation(value: unknown): ProcessAutoBuildOperation {\n const normalized = nonEmptyString(value);\n if (!normalized) {\n return 'produce';\n }\n if (normalized === 'produce' || normalized === 'treat') {\n return normalized;\n }\n\n throw new CliError(\"process auto-build operation must be 'produce' or 'treat'.\", {\n code: 'PROCESS_AUTO_BUILD_OPERATION_INVALID',\n exitCode: 2,\n details: normalized,\n });\n}\n\nfunction normalizePreferredList(value: unknown, fallback: string[]): string[] {\n if (!Array.isArray(value)) {\n return [...fallback];\n }\n\n const normalized = value\n .map((entry) => nonEmptyString(entry))\n .filter((entry): entry is string => Boolean(entry));\n\n return normalized.length ? normalized : [...fallback];\n}\n\nfunction normalizeBoolean(value: unknown, fallback: boolean): boolean {\n return typeof value === 'boolean' ? value : fallback;\n}\n\nfunction buildDefaultSourcePolicy(): ProcessAutoBuildSourcePolicy {\n return {\n step1_route: {\n preferred: [...DEFAULT_SOURCE_POLICY.step1_route.preferred],\n fallback: DEFAULT_SOURCE_POLICY.step1_route.fallback,\n },\n step2_process_split: {\n preferred: [...DEFAULT_SOURCE_POLICY.step2_process_split.preferred],\n fallback: DEFAULT_SOURCE_POLICY.step2_process_split.fallback,\n },\n step3b_exchange_values: {\n preferred: [...DEFAULT_SOURCE_POLICY.step3b_exchange_values.preferred],\n require_numeric_evidence:\n DEFAULT_SOURCE_POLICY.step3b_exchange_values.require_numeric_evidence,\n allow_estimation: DEFAULT_SOURCE_POLICY.step3b_exchange_values.allow_estimation,\n },\n };\n}\n\nfunction normalizeSourcePolicy(value: unknown): ProcessAutoBuildSourcePolicy {\n if (!isRecord(value)) {\n return buildDefaultSourcePolicy();\n }\n\n const defaults = buildDefaultSourcePolicy();\n const step1Route = isRecord(value.step1_route) ? value.step1_route : {};\n const step2ProcessSplit = isRecord(value.step2_process_split) ? value.step2_process_split : {};\n const step3ExchangeValues = isRecord(value.step3b_exchange_values)\n ? value.step3b_exchange_values\n : {};\n\n return {\n step1_route: {\n preferred: normalizePreferredList(step1Route.preferred, defaults.step1_route.preferred),\n fallback: nonEmptyString(step1Route.fallback) ?? DEFAULT_SOURCE_POLICY.step1_route.fallback,\n },\n step2_process_split: {\n preferred: normalizePreferredList(\n step2ProcessSplit.preferred,\n defaults.step2_process_split.preferred,\n ),\n fallback:\n nonEmptyString(step2ProcessSplit.fallback) ??\n DEFAULT_SOURCE_POLICY.step2_process_split.fallback,\n },\n step3b_exchange_values: {\n preferred: normalizePreferredList(\n step3ExchangeValues.preferred,\n defaults.step3b_exchange_values.preferred,\n ),\n require_numeric_evidence: normalizeBoolean(\n step3ExchangeValues.require_numeric_evidence,\n DEFAULT_SOURCE_POLICY.step3b_exchange_values.require_numeric_evidence,\n ),\n allow_estimation: normalizeBoolean(\n step3ExchangeValues.allow_estimation,\n DEFAULT_SOURCE_POLICY.step3b_exchange_values.allow_estimation,\n ),\n },\n };\n}\n\nfunction extractFlowDatasetRoot(payload: unknown): {\n flowPayload: JsonRecord;\n flowDataset: JsonRecord;\n wrapper: 'flowDataSet' | 'direct';\n} {\n if (!isRecord(payload)) {\n throw new CliError('process auto-build flow file must contain a JSON object.', {\n code: 'PROCESS_AUTO_BUILD_FLOW_INVALID',\n exitCode: 2,\n });\n }\n\n if (isRecord(payload.flowDataSet)) {\n return {\n flowPayload: payload,\n flowDataset: payload.flowDataSet,\n wrapper: 'flowDataSet',\n };\n }\n\n return {\n flowPayload: payload,\n flowDataset: payload,\n wrapper: 'direct',\n };\n}\n\nfunction extractFlowSummary(\n flowDataset: JsonRecord,\n wrapper: 'flowDataSet' | 'direct',\n): ProcessAutoBuildFlowSummary {\n const flowInformation = isRecord(flowDataset.flowInformation) ? flowDataset.flowInformation : {};\n const dataSetInformation = isRecord(flowInformation.dataSetInformation)\n ? flowInformation.dataSetInformation\n : {};\n const administrativeInformation = isRecord(flowDataset.administrativeInformation)\n ? flowDataset.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n const name = isRecord(dataSetInformation.name) ? dataSetInformation.name : {};\n\n return {\n wrapper,\n uuid:\n nonEmptyString(dataSetInformation['common:UUID']) ??\n nonEmptyString(flowDataset['@id']) ??\n null,\n version:\n nonEmptyString(publicationAndOwnership['common:dataSetVersion']) ??\n nonEmptyString(flowDataset['@version']) ??\n null,\n base_name: extractText(name.baseName),\n permanent_uri: nonEmptyString(publicationAndOwnership['common:permanentDataSetURI']) ?? null,\n };\n}\n\nfunction runIdToken(value: string | null | undefined, fallback: string): string {\n return sanitizeRunToken(value ?? '', fallback);\n}\n\nfunction buildProcessAutoBuildRunId(\n flowFilePath: string,\n operation: ProcessAutoBuildOperation,\n summary: ProcessAutoBuildFlowSummary,\n now: Date = new Date(),\n): string {\n const stem = path.basename(flowFilePath, path.extname(flowFilePath));\n const parts = stem.split('_');\n const flowCode = runIdToken(parts[0] || summary.base_name || summary.uuid, 'flow');\n const flowUuidShort = runIdToken(parts[1] || summary.uuid, 'unknown').slice(0, 8);\n const operationToken = operation === 'treat' ? 'treat' : 'produce';\n\n return `pfw_${flowCode}_${flowUuidShort}_${operationToken}_${buildUtcTimestamp(now)}`;\n}\n\nfunction resolveRunRoot(\n requestDir: string,\n runId: string,\n outDirOverride: string | null | undefined,\n requestRunRoot: unknown,\n): string {\n const override = nonEmptyString(outDirOverride);\n if (override) {\n return path.resolve(requestDir, override);\n }\n\n const requestValue = nonEmptyString(requestRunRoot);\n if (requestValue) {\n return path.resolve(requestDir, requestValue);\n }\n\n return path.join(requestDir, 'artifacts', 'process_from_flow', runId);\n}\n\nfunction normalizeSourceInputType(value: unknown): ProcessAutoBuildSourceInputType {\n const normalized = nonEmptyString(value);\n if (normalized === 'local_file' || normalized === 'local_text') {\n return normalized;\n }\n\n throw new CliError(\n \"process auto-build source_inputs[].type must be 'local_file' or 'local_text'.\",\n {\n code: 'PROCESS_AUTO_BUILD_SOURCE_INVALID',\n exitCode: 2,\n details: { value },\n },\n );\n}\n\nfunction normalizeIntendedRoles(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .map((entry) => nonEmptyString(entry))\n .filter((entry): entry is string => Boolean(entry));\n}\n\nfunction normalizeSourceInputs(\n value: unknown,\n requestDir: string,\n evidenceIncomingDir: string,\n): NormalizedProcessAutoBuildSourceInput[] {\n if (value === undefined) {\n return [];\n }\n\n if (!Array.isArray(value)) {\n throw new CliError('process auto-build source_inputs must be an array when provided.', {\n code: 'PROCESS_AUTO_BUILD_SOURCE_INVALID',\n exitCode: 2,\n });\n }\n\n const seenIds = new Set<string>();\n\n return value.map((entry, index) => {\n if (!isRecord(entry)) {\n throw new CliError('process auto-build source_inputs entries must be objects.', {\n code: 'PROCESS_AUTO_BUILD_SOURCE_INVALID',\n exitCode: 2,\n details: { index },\n });\n }\n\n const sourceId = requiredRequestString(entry, 'source_id');\n if (seenIds.has(sourceId)) {\n throw new CliError(`Duplicate process auto-build source_id: ${sourceId}`, {\n code: 'PROCESS_AUTO_BUILD_SOURCE_DUPLICATE',\n exitCode: 2,\n });\n }\n seenIds.add(sourceId);\n\n const sourcePath = path.resolve(requestDir, requiredRequestString(entry, 'path'));\n if (!existsSync(sourcePath)) {\n throw new CliError(`process auto-build source input not found: ${sourcePath}`, {\n code: 'PROCESS_AUTO_BUILD_SOURCE_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n const extension = path.extname(sourcePath);\n const artifactFileName = `${String(index + 1).padStart(2, '0')}_${runIdToken(sourceId, 'source')}${extension}`;\n\n return {\n source_id: sourceId,\n type: normalizeSourceInputType(entry.type),\n source_path: sourcePath,\n artifact_file_name: artifactFileName,\n artifact_path: path.join(evidenceIncomingDir, artifactFileName),\n intended_roles: normalizeIntendedRoles(entry.intended_roles),\n };\n });\n}\n\nfunction buildLayout(runRoot: string, runId: string): ProcessAutoBuildLayout {\n const collectionDir = path.dirname(runRoot);\n const layout: RunLayout = {\n namespace: 'process_from_flow',\n runId,\n artifactsRoot: path.dirname(collectionDir),\n collectionDir,\n runRoot,\n cacheDir: path.join(runRoot, 'cache'),\n inputsDir: path.join(runRoot, 'input'),\n outputsDir: path.join(runRoot, 'exports'),\n reportsDir: path.join(runRoot, 'reports'),\n logsDir: path.join(runRoot, 'logs'),\n manifestsDir: path.join(runRoot, 'manifests'),\n latestRunIdPath: path.join(collectionDir, '.latest_run_id'),\n };\n\n return {\n ...layout,\n requestDir: path.join(runRoot, 'request'),\n evidenceDir: path.join(runRoot, 'evidence'),\n evidenceIncomingDir: path.join(runRoot, 'evidence', 'incoming'),\n evidenceNormalizedDir: path.join(runRoot, 'evidence', 'normalized'),\n evidenceTextDir: path.join(runRoot, 'evidence', 'text'),\n evidenceStructuredDir: path.join(runRoot, 'evidence', 'structured'),\n stageOutputsDir: path.join(runRoot, 'stage_outputs'),\n reviewsDir: path.join(runRoot, 'reviews'),\n requestSnapshotPath: path.join(runRoot, 'request', 'pff-request.json'),\n normalizedRequestPath: path.join(runRoot, 'request', 'request.normalized.json'),\n sourcePolicyPath: path.join(runRoot, 'request', 'source-policy.json'),\n flowSummaryPath: path.join(runRoot, 'manifests', 'flow-summary.json'),\n inputManifestPath: path.join(runRoot, 'input', 'input_manifest.json'),\n assemblyPlanPath: path.join(runRoot, 'manifests', 'assembly-plan.json'),\n lineageManifestPath: path.join(runRoot, 'manifests', 'lineage-manifest.json'),\n invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),\n runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),\n reportPath: path.join(runRoot, 'reports', 'process-auto-build-report.json'),\n statePath: path.join(runRoot, 'cache', 'process_from_flow_state.json'),\n handoffSummaryPath: path.join(runRoot, 'cache', 'agent_handoff_summary.json'),\n processExportsDir: path.join(runRoot, 'exports', 'processes'),\n sourceExportsDir: path.join(runRoot, 'exports', 'sources'),\n };\n}\n\nfunction ensureEmptyRunRoot(runRoot: string): void {\n if (!existsSync(runRoot)) {\n return;\n }\n\n const entries = readdirSync(runRoot);\n if (entries.length > 0) {\n throw new CliError(`process auto-build run root already exists and is not empty: ${runRoot}`, {\n code: 'PROCESS_AUTO_BUILD_RUN_EXISTS',\n exitCode: 2,\n });\n }\n}\n\nfunction ensureProcessAutoBuildLayout(layout: ProcessAutoBuildLayout): void {\n ensureRunLayout(layout);\n [\n layout.requestDir,\n layout.evidenceDir,\n layout.evidenceIncomingDir,\n layout.evidenceNormalizedDir,\n layout.evidenceTextDir,\n layout.evidenceStructuredDir,\n layout.stageOutputsDir,\n layout.reviewsDir,\n layout.processExportsDir,\n layout.sourceExportsDir,\n ].forEach((dirPath) => {\n mkdirSync(dirPath, { recursive: true });\n });\n\n for (const stage of PROCESS_AUTO_BUILD_STAGES) {\n const stageDir = path.join(layout.stageOutputsDir, stage.id);\n mkdirSync(stageDir, { recursive: true });\n if (stage.createsCandidatesDir) {\n mkdirSync(path.join(stageDir, 'candidates'), { recursive: true });\n }\n }\n}\n\nfunction copyArtifactFile(sourcePath: string, targetPath: string, code: string): void {\n mkdirSync(path.dirname(targetPath), { recursive: true });\n try {\n copyFileSync(sourcePath, targetPath);\n } catch (error) {\n throw new CliError(`Failed to copy artifact file: ${sourcePath}`, {\n code,\n exitCode: 1,\n details: String(error),\n });\n }\n}\n\nfunction buildAssemblyPlan(runRoot: string): JsonRecord {\n return {\n schema_version: 1,\n stages: PROCESS_AUTO_BUILD_STAGES.map((stage) => ({\n id: stage.id,\n title: stage.title,\n status: 'pending',\n modules: stage.modules,\n output: stage.output,\n candidates_dir: stage.createsCandidatesDir\n ? path.posix.join(path.posix.dirname(stage.output), 'candidates')\n : null,\n output_abs: path.join(runRoot, stage.output),\n })),\n };\n}\n\nfunction buildLineageManifest(normalized: NormalizedProcessAutoBuildRequest): JsonRecord {\n return {\n schema_version: 1,\n request_id: normalized.request_id,\n run_id: normalized.run_id,\n flow: {\n source_path: normalized.flow_file,\n uuid: normalized.flow_summary.uuid,\n version: normalized.flow_summary.version,\n base_name: normalized.flow_summary.base_name,\n },\n source_inputs: normalized.source_inputs.map((source) => ({\n source_id: source.source_id,\n type: source.type,\n source_path: source.source_path,\n artifact_path: source.artifact_path,\n intended_roles: source.intended_roles,\n })),\n };\n}\n\nfunction buildInvocationIndex(\n normalized: NormalizedProcessAutoBuildRequest,\n options: RunProcessAutoBuildOptions,\n reportPath: string,\n now: Date,\n): JsonRecord {\n const command = ['process', 'auto-build', '--input', options.inputPath];\n if (options.outDir) {\n command.push('--out-dir', options.outDir);\n }\n\n return {\n schema_version: 1,\n invocations: [\n {\n command,\n cwd: options.cwd ?? process.cwd(),\n created_at: now.toISOString(),\n request_path: normalized.request_path,\n report_path: reportPath,\n },\n ],\n };\n}\n\nfunction buildStepMarkers(now: Date): JsonRecord {\n const completedAt = now.toISOString();\n const markers: JsonRecord = {\n intake_prepared: {\n status: 'completed',\n completed_at: completedAt,\n },\n };\n\n PROCESS_AUTO_BUILD_STAGES.forEach((stage) => {\n markers[stage.id] = {\n status: 'pending',\n };\n });\n\n return markers;\n}\n\nfunction buildInitialState(\n normalized: NormalizedProcessAutoBuildRequest,\n flowArtifactPath: string,\n now: Date,\n): JsonRecord {\n return {\n schema_version: 1,\n build_status: 'intake_prepared',\n next_stage: PROCESS_AUTO_BUILD_STAGES[0]?.id ?? null,\n run_id: normalized.run_id,\n request_id: normalized.request_id,\n flow_path: normalized.flow_file,\n flow_artifact_path: flowArtifactPath,\n flow_dataset: normalized.flow_dataset,\n flow_summary: normalized.flow_summary,\n operation: normalized.operation,\n source_inputs: normalized.source_inputs,\n source_policy: normalized.source_policy,\n scientific_references: {\n source_inputs: normalized.source_inputs.map((source) => ({\n source_id: source.source_id,\n type: source.type,\n intended_roles: source.intended_roles,\n source_path: source.source_path,\n })),\n },\n processes: [],\n process_exchanges: [],\n matched_process_exchanges: [],\n process_datasets: [],\n source_datasets: [],\n coverage_metrics: {},\n coverage_history: [],\n step_markers: buildStepMarkers(now),\n };\n}\n\nfunction buildNextActions(\n layout: ProcessAutoBuildLayout,\n normalized: NormalizedProcessAutoBuildRequest,\n): string[] {\n return [\n `inspect: ${layout.normalizedRequestPath}`,\n `inspect: ${layout.statePath}`,\n `inspect: ${layout.assemblyPlanPath}`,\n `future: tiangong process resume-build --run-id ${normalized.run_id}`,\n `future: tiangong process publish-build --run-id ${normalized.run_id}`,\n ];\n}\n\nfunction buildAgentHandoffSummary(\n normalized: NormalizedProcessAutoBuildRequest,\n layout: ProcessAutoBuildLayout,\n flowArtifactPath: string,\n now: Date,\n): JsonRecord {\n return {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n run_id: normalized.run_id,\n command: 'process auto-build',\n flow_path: normalized.flow_file,\n operation: normalized.operation,\n stop_after: null,\n process_count: 0,\n matched_exchange_count: 0,\n process_dataset_count: 0,\n source_dataset_count: 0,\n remaining_placeholder_refs: 0,\n placeholder_examples: [],\n publish_summary: {},\n artifacts: {\n state_path: layout.statePath,\n timing_report: null,\n publish_summary: null,\n llm_cost_report: null,\n process_update_report: null,\n flow_auto_build_manifest: null,\n request_snapshot: layout.requestSnapshotPath,\n normalized_request: layout.normalizedRequestPath,\n assembly_plan: layout.assemblyPlanPath,\n flow_copy: flowArtifactPath,\n },\n next_actions: buildNextActions(layout, normalized),\n extra: {\n status: 'prepared_local_process_auto_build_run',\n request_id: normalized.request_id,\n source_input_count: normalized.source_inputs.length,\n },\n };\n}\n\nfunction buildReport(\n normalized: NormalizedProcessAutoBuildRequest,\n layout: ProcessAutoBuildLayout,\n flowArtifactPath: string,\n now: Date,\n): ProcessAutoBuildReport {\n return {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n status: 'prepared_local_process_auto_build_run',\n request_path: normalized.request_path,\n request_id: normalized.request_id,\n run_id: normalized.run_id,\n run_root: normalized.run_root,\n operation: normalized.operation,\n flow: {\n source_path: normalized.flow_file,\n artifact_path: flowArtifactPath,\n wrapper: normalized.flow_summary.wrapper,\n uuid: normalized.flow_summary.uuid,\n version: normalized.flow_summary.version,\n base_name: normalized.flow_summary.base_name,\n },\n source_input_count: normalized.source_inputs.length,\n stage_count: PROCESS_AUTO_BUILD_STAGES.length,\n files: {\n request_snapshot: layout.requestSnapshotPath,\n normalized_request: layout.normalizedRequestPath,\n source_policy: layout.sourcePolicyPath,\n flow_summary: layout.flowSummaryPath,\n input_manifest: layout.inputManifestPath,\n assembly_plan: layout.assemblyPlanPath,\n lineage_manifest: layout.lineageManifestPath,\n invocation_index: layout.invocationIndexPath,\n run_manifest: layout.runManifestPath,\n state: layout.statePath,\n handoff_summary: layout.handoffSummaryPath,\n report: layout.reportPath,\n },\n next_actions: buildNextActions(layout, normalized),\n };\n}\n\nexport function normalizeProcessAutoBuildRequest(\n input: unknown,\n options: {\n inputPath: string;\n outDir?: string | null;\n now?: Date;\n requestIdOverride?: string;\n runIdOverride?: string;\n },\n): NormalizedProcessAutoBuildRequest {\n const request = requiredRequestObject(input);\n const requestDir = path.dirname(path.resolve(options.inputPath));\n const operation = normalizeOperation(request.operation);\n const flowFile = path.resolve(requestDir, requiredRequestString(request, 'flow_file'));\n const flowPayload = readJsonInput(flowFile);\n const { flowDataset, wrapper } = extractFlowDatasetRoot(flowPayload);\n const flowSummary = extractFlowSummary(flowDataset, wrapper);\n const runId =\n nonEmptyString(options.runIdOverride) ??\n nonEmptyString(request.run_id) ??\n buildProcessAutoBuildRunId(flowFile, operation, flowSummary, options.now);\n const runRoot = resolveRunRoot(requestDir, runId, options.outDir, request.workspace_run_root);\n const layout = buildLayout(runRoot, runId);\n\n return {\n schema_version: 1,\n request_path: path.resolve(options.inputPath),\n request_id:\n nonEmptyString(options.requestIdOverride) ??\n nonEmptyString(request.request_id) ??\n `pff-${runId}`,\n flow_file: flowFile,\n flow_summary: flowSummary,\n flow_dataset: flowDataset,\n operation,\n run_id: runId,\n run_root: runRoot,\n source_inputs: normalizeSourceInputs(\n request.source_inputs,\n requestDir,\n layout.evidenceIncomingDir,\n ),\n source_policy: normalizeSourcePolicy(request.source_policy),\n };\n}\n\nexport async function runProcessAutoBuild(\n options: RunProcessAutoBuildOptions,\n): Promise<ProcessAutoBuildReport> {\n const input = options.inputValue ?? readJsonInput(options.inputPath);\n const now = options.now ?? new Date();\n const normalized = normalizeProcessAutoBuildRequest(input, {\n inputPath: options.inputPath,\n outDir: options.outDir,\n now,\n requestIdOverride: options.requestIdOverride,\n runIdOverride: options.runIdOverride,\n });\n const layout = buildLayout(normalized.run_root, normalized.run_id);\n const flowArtifactPath = path.join(layout.inputsDir, path.basename(normalized.flow_file));\n\n ensureEmptyRunRoot(layout.runRoot);\n ensureProcessAutoBuildLayout(layout);\n\n copyArtifactFile(normalized.flow_file, flowArtifactPath, 'PROCESS_AUTO_BUILD_FLOW_COPY_FAILED');\n normalized.source_inputs.forEach((source) => {\n copyArtifactFile(\n source.source_path,\n source.artifact_path,\n 'PROCESS_AUTO_BUILD_SOURCE_COPY_FAILED',\n );\n });\n\n const request = requiredRequestObject(input);\n writeJsonArtifact(layout.requestSnapshotPath, request);\n writeJsonArtifact(layout.normalizedRequestPath, normalized);\n writeJsonArtifact(layout.sourcePolicyPath, normalized.source_policy);\n writeJsonArtifact(layout.flowSummaryPath, normalized.flow_summary);\n writeJsonArtifact(layout.inputManifestPath, {\n run_id: normalized.run_id,\n flow_path: normalized.flow_file,\n flow_artifact_path: flowArtifactPath,\n operation: normalized.operation,\n });\n writeJsonArtifact(layout.assemblyPlanPath, buildAssemblyPlan(layout.runRoot));\n writeJsonArtifact(layout.lineageManifestPath, buildLineageManifest(normalized));\n writeJsonArtifact(\n layout.invocationIndexPath,\n buildInvocationIndex(normalized, options, layout.reportPath, now),\n );\n writeJsonArtifact(\n layout.runManifestPath,\n buildRunManifest({\n layout,\n command: options.outDir\n ? ['process', 'auto-build', '--input', options.inputPath, '--out-dir', options.outDir]\n : ['process', 'auto-build', '--input', options.inputPath],\n cwd: options.cwd,\n createdAt: now,\n }),\n );\n\n const state = buildInitialState(normalized, flowArtifactPath, now);\n await withStateFileLock(\n layout.statePath,\n { reason: 'process-auto-build.initial_state', now },\n () => writeJsonArtifact(layout.statePath, state),\n );\n\n const handoff = buildAgentHandoffSummary(normalized, layout, flowArtifactPath, now);\n writeJsonArtifact(layout.handoffSummaryPath, handoff);\n writeLatestRunId(layout, normalized.run_id);\n\n const report = buildReport(normalized, layout, flowArtifactPath, now);\n writeJsonArtifact(layout.reportPath, report);\n return report;\n}\n\n// Exposed for deterministic unit coverage of process auto-build normalization and scaffold helpers.\nexport const __testInternals = {\n PROCESS_AUTO_BUILD_STAGES,\n extractText,\n normalizeOperation,\n normalizeSourcePolicy,\n extractFlowDatasetRoot,\n extractFlowSummary,\n buildProcessAutoBuildRunId,\n buildLayout,\n buildAssemblyPlan,\n buildLineageManifest,\n buildInvocationIndex,\n buildInitialState,\n buildAgentHandoffSummary,\n buildReport,\n};\n"]}
@@ -0,0 +1,409 @@
1
+ import { existsSync, mkdirSync, readdirSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { readJsonInput } from './io.js';
4
+ import { writeJsonArtifact } from './artifacts.js';
5
+ import { CliError, toErrorPayload } from './errors.js';
6
+ import { normalizeProcessAutoBuildRequest, runProcessAutoBuild, } from './process-auto-build.js';
7
+ import { buildRunId, buildRunManifest, ensureRunLayout, sanitizeRunToken, writeLatestRunId, } from './run.js';
8
+ function isRecord(value) {
9
+ return Boolean(value && typeof value === 'object' && !Array.isArray(value));
10
+ }
11
+ function nonEmptyString(value) {
12
+ if (typeof value !== 'string') {
13
+ return null;
14
+ }
15
+ const normalized = value.trim();
16
+ return normalized || null;
17
+ }
18
+ function normalizeBoolean(value, fallback) {
19
+ return typeof value === 'boolean' ? value : fallback;
20
+ }
21
+ function requiredRequestObject(input) {
22
+ if (!isRecord(input)) {
23
+ throw new CliError('process batch-build request must be a JSON object.', {
24
+ code: 'PROCESS_BATCH_BUILD_REQUEST_INVALID',
25
+ exitCode: 2,
26
+ });
27
+ }
28
+ return input;
29
+ }
30
+ function resolveBatchRoot(manifestDir, batchId, outDirOverride, requestOutDir) {
31
+ const override = nonEmptyString(outDirOverride);
32
+ if (override) {
33
+ return path.resolve(manifestDir, override);
34
+ }
35
+ const requestValue = nonEmptyString(requestOutDir);
36
+ if (requestValue) {
37
+ return path.resolve(manifestDir, requestValue);
38
+ }
39
+ return path.join(manifestDir, 'artifacts', 'process_batch', batchId);
40
+ }
41
+ function buildLayout(batchRoot, batchId) {
42
+ const collectionDir = path.dirname(batchRoot);
43
+ const layout = {
44
+ namespace: 'process_batch',
45
+ runId: batchId,
46
+ artifactsRoot: path.dirname(collectionDir),
47
+ collectionDir,
48
+ runRoot: batchRoot,
49
+ cacheDir: path.join(batchRoot, 'cache'),
50
+ inputsDir: path.join(batchRoot, 'request'),
51
+ outputsDir: path.join(batchRoot, 'runs'),
52
+ reportsDir: path.join(batchRoot, 'reports'),
53
+ logsDir: path.join(batchRoot, 'logs'),
54
+ manifestsDir: path.join(batchRoot, 'manifests'),
55
+ latestRunIdPath: path.join(collectionDir, '.latest_run_id'),
56
+ };
57
+ return {
58
+ ...layout,
59
+ requestDir: path.join(batchRoot, 'request'),
60
+ runsDir: path.join(batchRoot, 'runs'),
61
+ requestSnapshotPath: path.join(batchRoot, 'request', 'batch-request.json'),
62
+ normalizedRequestPath: path.join(batchRoot, 'request', 'request.normalized.json'),
63
+ invocationIndexPath: path.join(batchRoot, 'manifests', 'invocation-index.json'),
64
+ runManifestPath: path.join(batchRoot, 'manifests', 'run-manifest.json'),
65
+ reportPath: path.join(batchRoot, 'reports', 'process-batch-build-report.json'),
66
+ };
67
+ }
68
+ function ensureEmptyRunRoot(runRoot) {
69
+ if (!existsSync(runRoot)) {
70
+ return;
71
+ }
72
+ const entries = readdirSync(runRoot);
73
+ if (entries.length > 0) {
74
+ throw new CliError(`process batch-build run root already exists and is not empty: ${runRoot}`, {
75
+ code: 'PROCESS_BATCH_BUILD_RUN_EXISTS',
76
+ exitCode: 2,
77
+ });
78
+ }
79
+ }
80
+ function ensureProcessBatchBuildLayout(layout) {
81
+ ensureRunLayout(layout);
82
+ [layout.requestDir, layout.runsDir].forEach((dirPath) => {
83
+ mkdirSync(dirPath, { recursive: true });
84
+ });
85
+ }
86
+ function normalizeBatchId(inputPath, request, now) {
87
+ const explicit = nonEmptyString(request.batch_id);
88
+ if (explicit) {
89
+ return explicit;
90
+ }
91
+ return buildRunId({
92
+ namespace: 'process_batch',
93
+ subject: path.basename(inputPath, path.extname(inputPath)),
94
+ operation: 'build',
95
+ now,
96
+ });
97
+ }
98
+ function normalizeItemId(request, inputPath, index, seenIds) {
99
+ const explicit = nonEmptyString(request.item_id);
100
+ const baseId = sanitizeRunToken(explicit ?? path.basename(inputPath, path.extname(inputPath)), `item_${index + 1}`);
101
+ if (explicit) {
102
+ if (seenIds.has(baseId)) {
103
+ throw new CliError(`Duplicate process batch-build item_id: ${baseId}`, {
104
+ code: 'PROCESS_BATCH_BUILD_ITEM_DUPLICATE',
105
+ exitCode: 2,
106
+ });
107
+ }
108
+ seenIds.add(baseId);
109
+ return baseId;
110
+ }
111
+ if (!seenIds.has(baseId)) {
112
+ seenIds.add(baseId);
113
+ return baseId;
114
+ }
115
+ let suffix = 2;
116
+ while (seenIds.has(`${baseId}_${suffix}`)) {
117
+ suffix += 1;
118
+ }
119
+ const deduped = `${baseId}_${suffix}`;
120
+ seenIds.add(deduped);
121
+ return deduped;
122
+ }
123
+ function normalizeItems(value, manifestDir, batchRoot) {
124
+ if (!Array.isArray(value)) {
125
+ throw new CliError('process batch-build items must be an array.', {
126
+ code: 'PROCESS_BATCH_BUILD_REQUEST_INVALID',
127
+ exitCode: 2,
128
+ });
129
+ }
130
+ if (value.length === 0) {
131
+ throw new CliError('process batch-build items must not be empty.', {
132
+ code: 'PROCESS_BATCH_BUILD_REQUEST_INVALID',
133
+ exitCode: 2,
134
+ });
135
+ }
136
+ const seenIds = new Set();
137
+ return value.map((entry, index) => {
138
+ const request = typeof entry === 'string' ? { input_path: entry } : entry;
139
+ if (!isRecord(request)) {
140
+ throw new CliError('process batch-build items entries must be strings or objects.', {
141
+ code: 'PROCESS_BATCH_BUILD_REQUEST_INVALID',
142
+ exitCode: 2,
143
+ details: { index },
144
+ });
145
+ }
146
+ const inputValue = nonEmptyString(request.input_path);
147
+ if (!inputValue) {
148
+ throw new CliError("process batch-build items[] is missing 'input_path'.", {
149
+ code: 'PROCESS_BATCH_BUILD_REQUEST_INVALID',
150
+ exitCode: 2,
151
+ details: { index },
152
+ });
153
+ }
154
+ const inputPath = path.resolve(manifestDir, inputValue);
155
+ const itemId = normalizeItemId(request, inputPath, index, seenIds);
156
+ const explicitOutDir = nonEmptyString(request.out_dir);
157
+ const outDir = explicitOutDir
158
+ ? path.resolve(manifestDir, explicitOutDir)
159
+ : path.join(batchRoot, 'runs', `${String(index + 1).padStart(3, '0')}_${itemId}`);
160
+ return {
161
+ item_id: itemId,
162
+ input_path: inputPath,
163
+ out_dir: outDir,
164
+ };
165
+ });
166
+ }
167
+ export function normalizeProcessBatchBuildRequest(input, options) {
168
+ const request = requiredRequestObject(input);
169
+ const manifestPath = path.resolve(options.inputPath);
170
+ const manifestDir = path.dirname(manifestPath);
171
+ const now = options.now ?? new Date();
172
+ const batchId = normalizeBatchId(manifestPath, request, now);
173
+ const batchRoot = resolveBatchRoot(manifestDir, batchId, options.outDir, request.out_dir);
174
+ return {
175
+ schema_version: 1,
176
+ manifest_path: manifestPath,
177
+ batch_id: batchId,
178
+ batch_root: batchRoot,
179
+ continue_on_error: normalizeBoolean(request.continue_on_error, true),
180
+ items: normalizeItems(request.items, manifestDir, batchRoot),
181
+ };
182
+ }
183
+ function buildInvocationIndex(normalized, options, layout, now) {
184
+ const command = ['process', 'batch-build', '--input', options.inputPath];
185
+ if (options.outDir) {
186
+ command.push('--out-dir', options.outDir);
187
+ }
188
+ return {
189
+ schema_version: 1,
190
+ invocations: [
191
+ {
192
+ command,
193
+ cwd: options.cwd ?? process.cwd(),
194
+ created_at: now.toISOString(),
195
+ manifest_path: normalized.manifest_path,
196
+ batch_id: normalized.batch_id,
197
+ report_path: layout.reportPath,
198
+ },
199
+ ],
200
+ };
201
+ }
202
+ function buildNextActions(layout) {
203
+ return [
204
+ `inspect: ${layout.normalizedRequestPath}`,
205
+ `inspect: ${layout.reportPath}`,
206
+ `future: consume items[].run_root for downstream resume-build or publish-build steps`,
207
+ ];
208
+ }
209
+ function buildPreparedItemResult(item, index, report) {
210
+ return {
211
+ item_id: item.item_id,
212
+ index,
213
+ input_path: item.input_path,
214
+ out_dir: item.out_dir,
215
+ status: 'prepared',
216
+ run_id: report.run_id,
217
+ run_root: report.run_root,
218
+ request_id: report.request_id,
219
+ files: {
220
+ request_snapshot: report.files.request_snapshot,
221
+ report: report.files.report,
222
+ state: report.files.state,
223
+ handoff_summary: report.files.handoff_summary,
224
+ run_manifest: report.files.run_manifest,
225
+ },
226
+ error: null,
227
+ };
228
+ }
229
+ function buildFailedItemResult(item, index, error) {
230
+ return {
231
+ item_id: item.item_id,
232
+ index,
233
+ input_path: item.input_path,
234
+ out_dir: item.out_dir,
235
+ status: 'failed',
236
+ run_id: null,
237
+ run_root: null,
238
+ request_id: null,
239
+ files: {
240
+ request_snapshot: null,
241
+ report: null,
242
+ state: null,
243
+ handoff_summary: null,
244
+ run_manifest: null,
245
+ },
246
+ error: toErrorPayload(error).error,
247
+ };
248
+ }
249
+ function buildSkippedItemResult(item, index) {
250
+ return {
251
+ item_id: item.item_id,
252
+ index,
253
+ input_path: item.input_path,
254
+ out_dir: item.out_dir,
255
+ status: 'skipped',
256
+ run_id: null,
257
+ run_root: null,
258
+ request_id: null,
259
+ files: {
260
+ request_snapshot: null,
261
+ report: null,
262
+ state: null,
263
+ handoff_summary: null,
264
+ run_manifest: null,
265
+ },
266
+ error: null,
267
+ };
268
+ }
269
+ function buildReport(normalized, layout, items, now) {
270
+ const counts = items.reduce((summary, item) => {
271
+ summary.total += 1;
272
+ if (item.status === 'prepared') {
273
+ summary.prepared += 1;
274
+ }
275
+ else if (item.status === 'failed') {
276
+ summary.failed += 1;
277
+ }
278
+ else {
279
+ summary.skipped += 1;
280
+ }
281
+ return summary;
282
+ }, {
283
+ total: 0,
284
+ prepared: 0,
285
+ failed: 0,
286
+ skipped: 0,
287
+ });
288
+ return {
289
+ schema_version: 1,
290
+ generated_at_utc: now.toISOString(),
291
+ status: counts.failed > 0 ? 'completed_with_failures' : 'completed',
292
+ manifest_path: normalized.manifest_path,
293
+ batch_id: normalized.batch_id,
294
+ batch_root: normalized.batch_root,
295
+ continue_on_error: normalized.continue_on_error,
296
+ counts,
297
+ files: {
298
+ request_snapshot: layout.requestSnapshotPath,
299
+ normalized_request: layout.normalizedRequestPath,
300
+ invocation_index: layout.invocationIndexPath,
301
+ run_manifest: layout.runManifestPath,
302
+ report: layout.reportPath,
303
+ },
304
+ items,
305
+ next_actions: buildNextActions(layout),
306
+ };
307
+ }
308
+ function resolveItemOverrides(itemInput, item, index, now) {
309
+ if (!isRecord(itemInput)) {
310
+ return {
311
+ finalRunId: null,
312
+ };
313
+ }
314
+ const explicitRunId = nonEmptyString(itemInput.run_id);
315
+ const explicitRequestId = nonEmptyString(itemInput.request_id);
316
+ if (explicitRunId) {
317
+ return {
318
+ finalRunId: explicitRunId,
319
+ requestIdOverride: explicitRequestId ? undefined : `pff-${explicitRunId}`,
320
+ };
321
+ }
322
+ const preview = normalizeProcessAutoBuildRequest(itemInput, {
323
+ inputPath: item.input_path,
324
+ outDir: item.out_dir,
325
+ now,
326
+ });
327
+ const runIdOverride = `${preview.run_id}_b${String(index + 1).padStart(3, '0')}`;
328
+ return {
329
+ runIdOverride,
330
+ requestIdOverride: explicitRequestId ?? `pff-${runIdOverride}`,
331
+ finalRunId: runIdOverride,
332
+ };
333
+ }
334
+ export async function runProcessBatchBuild(options) {
335
+ const input = readJsonInput(options.inputPath);
336
+ const now = options.now ?? new Date();
337
+ const normalized = normalizeProcessBatchBuildRequest(input, {
338
+ inputPath: options.inputPath,
339
+ outDir: options.outDir,
340
+ now,
341
+ });
342
+ const layout = buildLayout(normalized.batch_root, normalized.batch_id);
343
+ ensureEmptyRunRoot(layout.runRoot);
344
+ ensureProcessBatchBuildLayout(layout);
345
+ writeJsonArtifact(layout.requestSnapshotPath, input);
346
+ writeJsonArtifact(layout.normalizedRequestPath, normalized);
347
+ writeJsonArtifact(layout.invocationIndexPath, buildInvocationIndex(normalized, options, layout, now));
348
+ writeJsonArtifact(layout.runManifestPath, buildRunManifest({
349
+ layout,
350
+ command: options.outDir
351
+ ? ['process', 'batch-build', '--input', options.inputPath, '--out-dir', options.outDir]
352
+ : ['process', 'batch-build', '--input', options.inputPath],
353
+ cwd: options.cwd,
354
+ createdAt: now,
355
+ }));
356
+ const seenRunIds = new Set();
357
+ const items = [];
358
+ let stopAfterFailure = false;
359
+ for (const [index, item] of normalized.items.entries()) {
360
+ if (stopAfterFailure) {
361
+ items.push(buildSkippedItemResult(item, index));
362
+ continue;
363
+ }
364
+ try {
365
+ const itemInput = readJsonInput(item.input_path);
366
+ const overrides = resolveItemOverrides(itemInput, item, index, now);
367
+ if (overrides.finalRunId && seenRunIds.has(overrides.finalRunId)) {
368
+ throw new CliError(`Duplicate process batch-build run_id: ${overrides.finalRunId}`, {
369
+ code: 'PROCESS_BATCH_BUILD_RUN_ID_DUPLICATE',
370
+ exitCode: 2,
371
+ details: { itemId: item.item_id, index },
372
+ });
373
+ }
374
+ if (overrides.finalRunId) {
375
+ seenRunIds.add(overrides.finalRunId);
376
+ }
377
+ const report = await runProcessAutoBuild({
378
+ inputPath: item.input_path,
379
+ inputValue: itemInput,
380
+ outDir: item.out_dir,
381
+ now,
382
+ cwd: options.cwd,
383
+ requestIdOverride: overrides.requestIdOverride,
384
+ runIdOverride: overrides.runIdOverride,
385
+ });
386
+ items.push(buildPreparedItemResult(item, index, report));
387
+ }
388
+ catch (error) {
389
+ items.push(buildFailedItemResult(item, index, error));
390
+ if (!normalized.continue_on_error) {
391
+ stopAfterFailure = true;
392
+ }
393
+ }
394
+ }
395
+ const report = buildReport(normalized, layout, items, now);
396
+ writeJsonArtifact(layout.reportPath, report);
397
+ writeLatestRunId(layout, normalized.batch_id);
398
+ return report;
399
+ }
400
+ export const __testInternals = {
401
+ buildLayout,
402
+ resolveBatchRoot,
403
+ normalizeItems,
404
+ normalizeProcessBatchBuildRequest,
405
+ buildInvocationIndex,
406
+ buildNextActions,
407
+ buildReport,
408
+ };
409
+ //# sourceMappingURL=process-batch-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-batch-build.js","sourceRoot":"","sources":["../../../src/lib/process-batch-build.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport { readJsonInput } from './io.js';\nimport { writeJsonArtifact } from './artifacts.js';\nimport { CliError, toErrorPayload, type ErrorPayload } from './errors.js';\nimport {\n normalizeProcessAutoBuildRequest,\n runProcessAutoBuild,\n type ProcessAutoBuildReport,\n} from './process-auto-build.js';\nimport {\n buildRunId,\n buildRunManifest,\n ensureRunLayout,\n sanitizeRunToken,\n writeLatestRunId,\n type RunLayout,\n} from './run.js';\n\ntype JsonRecord = Record<string, unknown>;\n\ntype ProcessBatchBuildStatus = 'completed' | 'completed_with_failures';\ntype ProcessBatchBuildItemStatus = 'prepared' | 'failed' | 'skipped';\n\ntype ProcessBatchBuildManifestItem = {\n item_id: string;\n input_path: string;\n out_dir: string;\n};\n\nexport type ProcessBatchBuildLayout = RunLayout & {\n requestDir: string;\n runsDir: string;\n requestSnapshotPath: string;\n normalizedRequestPath: string;\n invocationIndexPath: string;\n runManifestPath: string;\n reportPath: string;\n};\n\nexport type NormalizedProcessBatchBuildRequest = {\n schema_version: 1;\n manifest_path: string;\n batch_id: string;\n batch_root: string;\n continue_on_error: boolean;\n items: ProcessBatchBuildManifestItem[];\n};\n\nexport type ProcessBatchBuildItemReport = {\n item_id: string;\n index: number;\n input_path: string;\n out_dir: string;\n status: ProcessBatchBuildItemStatus;\n run_id: string | null;\n run_root: string | null;\n request_id: string | null;\n files: {\n request_snapshot: string | null;\n report: string | null;\n state: string | null;\n handoff_summary: string | null;\n run_manifest: string | null;\n };\n error: ErrorPayload['error'] | null;\n};\n\nexport type ProcessBatchBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: ProcessBatchBuildStatus;\n manifest_path: string;\n batch_id: string;\n batch_root: string;\n continue_on_error: boolean;\n counts: {\n total: number;\n prepared: number;\n failed: number;\n skipped: number;\n };\n files: {\n request_snapshot: string;\n normalized_request: string;\n invocation_index: string;\n run_manifest: string;\n report: string;\n };\n items: ProcessBatchBuildItemReport[];\n next_actions: string[];\n};\n\nexport type RunProcessBatchBuildOptions = {\n inputPath: string;\n outDir?: string | null;\n now?: Date;\n cwd?: string;\n};\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized || null;\n}\n\nfunction normalizeBoolean(value: unknown, fallback: boolean): boolean {\n return typeof value === 'boolean' ? value : fallback;\n}\n\nfunction requiredRequestObject(input: unknown): JsonRecord {\n if (!isRecord(input)) {\n throw new CliError('process batch-build request must be a JSON object.', {\n code: 'PROCESS_BATCH_BUILD_REQUEST_INVALID',\n exitCode: 2,\n });\n }\n\n return input;\n}\n\nfunction resolveBatchRoot(\n manifestDir: string,\n batchId: string,\n outDirOverride: string | null | undefined,\n requestOutDir: unknown,\n): string {\n const override = nonEmptyString(outDirOverride);\n if (override) {\n return path.resolve(manifestDir, override);\n }\n\n const requestValue = nonEmptyString(requestOutDir);\n if (requestValue) {\n return path.resolve(manifestDir, requestValue);\n }\n\n return path.join(manifestDir, 'artifacts', 'process_batch', batchId);\n}\n\nfunction buildLayout(batchRoot: string, batchId: string): ProcessBatchBuildLayout {\n const collectionDir = path.dirname(batchRoot);\n const layout: RunLayout = {\n namespace: 'process_batch',\n runId: batchId,\n artifactsRoot: path.dirname(collectionDir),\n collectionDir,\n runRoot: batchRoot,\n cacheDir: path.join(batchRoot, 'cache'),\n inputsDir: path.join(batchRoot, 'request'),\n outputsDir: path.join(batchRoot, 'runs'),\n reportsDir: path.join(batchRoot, 'reports'),\n logsDir: path.join(batchRoot, 'logs'),\n manifestsDir: path.join(batchRoot, 'manifests'),\n latestRunIdPath: path.join(collectionDir, '.latest_run_id'),\n };\n\n return {\n ...layout,\n requestDir: path.join(batchRoot, 'request'),\n runsDir: path.join(batchRoot, 'runs'),\n requestSnapshotPath: path.join(batchRoot, 'request', 'batch-request.json'),\n normalizedRequestPath: path.join(batchRoot, 'request', 'request.normalized.json'),\n invocationIndexPath: path.join(batchRoot, 'manifests', 'invocation-index.json'),\n runManifestPath: path.join(batchRoot, 'manifests', 'run-manifest.json'),\n reportPath: path.join(batchRoot, 'reports', 'process-batch-build-report.json'),\n };\n}\n\nfunction ensureEmptyRunRoot(runRoot: string): void {\n if (!existsSync(runRoot)) {\n return;\n }\n\n const entries = readdirSync(runRoot);\n if (entries.length > 0) {\n throw new CliError(`process batch-build run root already exists and is not empty: ${runRoot}`, {\n code: 'PROCESS_BATCH_BUILD_RUN_EXISTS',\n exitCode: 2,\n });\n }\n}\n\nfunction ensureProcessBatchBuildLayout(layout: ProcessBatchBuildLayout): void {\n ensureRunLayout(layout);\n [layout.requestDir, layout.runsDir].forEach((dirPath) => {\n mkdirSync(dirPath, { recursive: true });\n });\n}\n\nfunction normalizeBatchId(inputPath: string, request: JsonRecord, now: Date): string {\n const explicit = nonEmptyString(request.batch_id);\n if (explicit) {\n return explicit;\n }\n\n return buildRunId({\n namespace: 'process_batch',\n subject: path.basename(inputPath, path.extname(inputPath)),\n operation: 'build',\n now,\n });\n}\n\nfunction normalizeItemId(\n request: JsonRecord,\n inputPath: string,\n index: number,\n seenIds: Set<string>,\n): string {\n const explicit = nonEmptyString(request.item_id);\n const baseId = sanitizeRunToken(\n explicit ?? path.basename(inputPath, path.extname(inputPath)),\n `item_${index + 1}`,\n );\n\n if (explicit) {\n if (seenIds.has(baseId)) {\n throw new CliError(`Duplicate process batch-build item_id: ${baseId}`, {\n code: 'PROCESS_BATCH_BUILD_ITEM_DUPLICATE',\n exitCode: 2,\n });\n }\n\n seenIds.add(baseId);\n return baseId;\n }\n\n if (!seenIds.has(baseId)) {\n seenIds.add(baseId);\n return baseId;\n }\n\n let suffix = 2;\n while (seenIds.has(`${baseId}_${suffix}`)) {\n suffix += 1;\n }\n\n const deduped = `${baseId}_${suffix}`;\n seenIds.add(deduped);\n return deduped;\n}\n\nfunction normalizeItems(\n value: unknown,\n manifestDir: string,\n batchRoot: string,\n): ProcessBatchBuildManifestItem[] {\n if (!Array.isArray(value)) {\n throw new CliError('process batch-build items must be an array.', {\n code: 'PROCESS_BATCH_BUILD_REQUEST_INVALID',\n exitCode: 2,\n });\n }\n\n if (value.length === 0) {\n throw new CliError('process batch-build items must not be empty.', {\n code: 'PROCESS_BATCH_BUILD_REQUEST_INVALID',\n exitCode: 2,\n });\n }\n\n const seenIds = new Set<string>();\n\n return value.map((entry, index) => {\n const request = typeof entry === 'string' ? { input_path: entry } : entry;\n if (!isRecord(request)) {\n throw new CliError('process batch-build items entries must be strings or objects.', {\n code: 'PROCESS_BATCH_BUILD_REQUEST_INVALID',\n exitCode: 2,\n details: { index },\n });\n }\n\n const inputValue = nonEmptyString(request.input_path);\n if (!inputValue) {\n throw new CliError(\"process batch-build items[] is missing 'input_path'.\", {\n code: 'PROCESS_BATCH_BUILD_REQUEST_INVALID',\n exitCode: 2,\n details: { index },\n });\n }\n\n const inputPath = path.resolve(manifestDir, inputValue);\n const itemId = normalizeItemId(request, inputPath, index, seenIds);\n const explicitOutDir = nonEmptyString(request.out_dir);\n const outDir = explicitOutDir\n ? path.resolve(manifestDir, explicitOutDir)\n : path.join(batchRoot, 'runs', `${String(index + 1).padStart(3, '0')}_${itemId}`);\n\n return {\n item_id: itemId,\n input_path: inputPath,\n out_dir: outDir,\n };\n });\n}\n\nexport function normalizeProcessBatchBuildRequest(\n input: unknown,\n options: {\n inputPath: string;\n outDir?: string | null;\n now?: Date;\n },\n): NormalizedProcessBatchBuildRequest {\n const request = requiredRequestObject(input);\n const manifestPath = path.resolve(options.inputPath);\n const manifestDir = path.dirname(manifestPath);\n const now = options.now ?? new Date();\n const batchId = normalizeBatchId(manifestPath, request, now);\n const batchRoot = resolveBatchRoot(manifestDir, batchId, options.outDir, request.out_dir);\n\n return {\n schema_version: 1,\n manifest_path: manifestPath,\n batch_id: batchId,\n batch_root: batchRoot,\n continue_on_error: normalizeBoolean(request.continue_on_error, true),\n items: normalizeItems(request.items, manifestDir, batchRoot),\n };\n}\n\nfunction buildInvocationIndex(\n normalized: NormalizedProcessBatchBuildRequest,\n options: RunProcessBatchBuildOptions,\n layout: ProcessBatchBuildLayout,\n now: Date,\n): JsonRecord {\n const command = ['process', 'batch-build', '--input', options.inputPath];\n if (options.outDir) {\n command.push('--out-dir', options.outDir);\n }\n\n return {\n schema_version: 1,\n invocations: [\n {\n command,\n cwd: options.cwd ?? process.cwd(),\n created_at: now.toISOString(),\n manifest_path: normalized.manifest_path,\n batch_id: normalized.batch_id,\n report_path: layout.reportPath,\n },\n ],\n };\n}\n\nfunction buildNextActions(layout: ProcessBatchBuildLayout): string[] {\n return [\n `inspect: ${layout.normalizedRequestPath}`,\n `inspect: ${layout.reportPath}`,\n `future: consume items[].run_root for downstream resume-build or publish-build steps`,\n ];\n}\n\nfunction buildPreparedItemResult(\n item: ProcessBatchBuildManifestItem,\n index: number,\n report: ProcessAutoBuildReport,\n): ProcessBatchBuildItemReport {\n return {\n item_id: item.item_id,\n index,\n input_path: item.input_path,\n out_dir: item.out_dir,\n status: 'prepared',\n run_id: report.run_id,\n run_root: report.run_root,\n request_id: report.request_id,\n files: {\n request_snapshot: report.files.request_snapshot,\n report: report.files.report,\n state: report.files.state,\n handoff_summary: report.files.handoff_summary,\n run_manifest: report.files.run_manifest,\n },\n error: null,\n };\n}\n\nfunction buildFailedItemResult(\n item: ProcessBatchBuildManifestItem,\n index: number,\n error: unknown,\n): ProcessBatchBuildItemReport {\n return {\n item_id: item.item_id,\n index,\n input_path: item.input_path,\n out_dir: item.out_dir,\n status: 'failed',\n run_id: null,\n run_root: null,\n request_id: null,\n files: {\n request_snapshot: null,\n report: null,\n state: null,\n handoff_summary: null,\n run_manifest: null,\n },\n error: toErrorPayload(error).error,\n };\n}\n\nfunction buildSkippedItemResult(\n item: ProcessBatchBuildManifestItem,\n index: number,\n): ProcessBatchBuildItemReport {\n return {\n item_id: item.item_id,\n index,\n input_path: item.input_path,\n out_dir: item.out_dir,\n status: 'skipped',\n run_id: null,\n run_root: null,\n request_id: null,\n files: {\n request_snapshot: null,\n report: null,\n state: null,\n handoff_summary: null,\n run_manifest: null,\n },\n error: null,\n };\n}\n\nfunction buildReport(\n normalized: NormalizedProcessBatchBuildRequest,\n layout: ProcessBatchBuildLayout,\n items: ProcessBatchBuildItemReport[],\n now: Date,\n): ProcessBatchBuildReport {\n const counts = items.reduce(\n (summary, item) => {\n summary.total += 1;\n if (item.status === 'prepared') {\n summary.prepared += 1;\n } else if (item.status === 'failed') {\n summary.failed += 1;\n } else {\n summary.skipped += 1;\n }\n\n return summary;\n },\n {\n total: 0,\n prepared: 0,\n failed: 0,\n skipped: 0,\n },\n );\n\n return {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n status: counts.failed > 0 ? 'completed_with_failures' : 'completed',\n manifest_path: normalized.manifest_path,\n batch_id: normalized.batch_id,\n batch_root: normalized.batch_root,\n continue_on_error: normalized.continue_on_error,\n counts,\n files: {\n request_snapshot: layout.requestSnapshotPath,\n normalized_request: layout.normalizedRequestPath,\n invocation_index: layout.invocationIndexPath,\n run_manifest: layout.runManifestPath,\n report: layout.reportPath,\n },\n items,\n next_actions: buildNextActions(layout),\n };\n}\n\nfunction resolveItemOverrides(\n itemInput: unknown,\n item: ProcessBatchBuildManifestItem,\n index: number,\n now: Date,\n): {\n runIdOverride?: string;\n requestIdOverride?: string;\n finalRunId: string | null;\n} {\n if (!isRecord(itemInput)) {\n return {\n finalRunId: null,\n };\n }\n\n const explicitRunId = nonEmptyString(itemInput.run_id);\n const explicitRequestId = nonEmptyString(itemInput.request_id);\n if (explicitRunId) {\n return {\n finalRunId: explicitRunId,\n requestIdOverride: explicitRequestId ? undefined : `pff-${explicitRunId}`,\n };\n }\n\n const preview = normalizeProcessAutoBuildRequest(itemInput, {\n inputPath: item.input_path,\n outDir: item.out_dir,\n now,\n });\n const runIdOverride = `${preview.run_id}_b${String(index + 1).padStart(3, '0')}`;\n\n return {\n runIdOverride,\n requestIdOverride: explicitRequestId ?? `pff-${runIdOverride}`,\n finalRunId: runIdOverride,\n };\n}\n\nexport async function runProcessBatchBuild(\n options: RunProcessBatchBuildOptions,\n): Promise<ProcessBatchBuildReport> {\n const input = readJsonInput(options.inputPath);\n const now = options.now ?? new Date();\n const normalized = normalizeProcessBatchBuildRequest(input, {\n inputPath: options.inputPath,\n outDir: options.outDir,\n now,\n });\n const layout = buildLayout(normalized.batch_root, normalized.batch_id);\n\n ensureEmptyRunRoot(layout.runRoot);\n ensureProcessBatchBuildLayout(layout);\n\n writeJsonArtifact(layout.requestSnapshotPath, input);\n writeJsonArtifact(layout.normalizedRequestPath, normalized);\n writeJsonArtifact(\n layout.invocationIndexPath,\n buildInvocationIndex(normalized, options, layout, now),\n );\n writeJsonArtifact(\n layout.runManifestPath,\n buildRunManifest({\n layout,\n command: options.outDir\n ? ['process', 'batch-build', '--input', options.inputPath, '--out-dir', options.outDir]\n : ['process', 'batch-build', '--input', options.inputPath],\n cwd: options.cwd,\n createdAt: now,\n }),\n );\n\n const seenRunIds = new Set<string>();\n const items: ProcessBatchBuildItemReport[] = [];\n let stopAfterFailure = false;\n\n for (const [index, item] of normalized.items.entries()) {\n if (stopAfterFailure) {\n items.push(buildSkippedItemResult(item, index));\n continue;\n }\n\n try {\n const itemInput = readJsonInput(item.input_path);\n const overrides = resolveItemOverrides(itemInput, item, index, now);\n\n if (overrides.finalRunId && seenRunIds.has(overrides.finalRunId)) {\n throw new CliError(`Duplicate process batch-build run_id: ${overrides.finalRunId}`, {\n code: 'PROCESS_BATCH_BUILD_RUN_ID_DUPLICATE',\n exitCode: 2,\n details: { itemId: item.item_id, index },\n });\n }\n\n if (overrides.finalRunId) {\n seenRunIds.add(overrides.finalRunId);\n }\n\n const report = await runProcessAutoBuild({\n inputPath: item.input_path,\n inputValue: itemInput,\n outDir: item.out_dir,\n now,\n cwd: options.cwd,\n requestIdOverride: overrides.requestIdOverride,\n runIdOverride: overrides.runIdOverride,\n });\n items.push(buildPreparedItemResult(item, index, report));\n } catch (error) {\n items.push(buildFailedItemResult(item, index, error));\n if (!normalized.continue_on_error) {\n stopAfterFailure = true;\n }\n }\n }\n\n const report = buildReport(normalized, layout, items, now);\n writeJsonArtifact(layout.reportPath, report);\n writeLatestRunId(layout, normalized.batch_id);\n return report;\n}\n\nexport const __testInternals = {\n buildLayout,\n resolveBatchRoot,\n normalizeItems,\n normalizeProcessBatchBuildRequest,\n buildInvocationIndex,\n buildNextActions,\n buildReport,\n};\n"]}