@tiangong-lca/cli 0.0.4 → 0.0.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"lifecyclemodel-publish-build.js","sourceRoot":"","sources":["../../../src/lib/lifecyclemodel-publish-build.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport { readJsonArtifact, writeJsonArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport { normalizePublishRequest } from './publish.js';\n\ntype JsonObject = Record<string, unknown>;\n\ntype LifecyclemodelPublishValidationSummary = {\n available: boolean;\n ok: boolean | null;\n report: string | null;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized || null;\n}\n\nfunction copyJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction readRequiredJsonObject(\n filePath: string,\n missingCode: string,\n invalidCode: string,\n label: string,\n): JsonObject {\n if (!existsSync(filePath)) {\n throw new CliError(`Required lifecyclemodel ${label} artifact not found: ${filePath}`, {\n code: missingCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nexport type LifecyclemodelPublishBuildLayout = {\n runId: string;\n runRoot: string;\n modelsDir: string;\n reportsDir: string;\n manifestsDir: string;\n publishStageDir: string;\n runManifestPath: string;\n invocationIndexPath: string;\n validationReportPath: string;\n publishBundlePath: string;\n publishRequestPath: string;\n publishIntentPath: string;\n reportPath: string;\n};\n\nexport type LifecyclemodelPublishBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'prepared_local_lifecyclemodel_publish_bundle';\n run_id: string;\n run_root: string;\n counts: {\n lifecyclemodels: number;\n };\n publish_defaults: {\n commit: boolean;\n publish_lifecyclemodels: boolean;\n publish_processes: boolean;\n publish_sources: boolean;\n publish_relations: boolean;\n publish_process_build_runs: boolean;\n relation_mode: 'local_manifest_only';\n };\n validation: LifecyclemodelPublishValidationSummary;\n files: {\n run_manifest: string;\n invocation_index: string;\n publish_bundle: string;\n publish_request: string;\n publish_intent: string;\n report: string;\n };\n next_actions: string[];\n};\n\nexport type RunLifecyclemodelPublishBuildOptions = {\n runDir: string;\n now?: Date;\n cwd?: string;\n};\n\nfunction buildLayout(runRoot: string): LifecyclemodelPublishBuildLayout {\n const runId = path.basename(runRoot);\n return {\n runId,\n runRoot,\n modelsDir: path.join(runRoot, 'models'),\n reportsDir: path.join(runRoot, 'reports'),\n manifestsDir: path.join(runRoot, 'manifests'),\n publishStageDir: path.join(runRoot, 'stage_outputs', '10_publish'),\n runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),\n invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),\n validationReportPath: path.join(\n runRoot,\n 'reports',\n 'lifecyclemodel-validate-build-report.json',\n ),\n publishBundlePath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-bundle.json'),\n publishRequestPath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-request.json'),\n publishIntentPath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-intent.json'),\n reportPath: path.join(runRoot, 'reports', 'lifecyclemodel-publish-build-report.json'),\n };\n}\n\nfunction resolveLayout(\n options: RunLifecyclemodelPublishBuildOptions,\n): LifecyclemodelPublishBuildLayout {\n const runDir = nonEmptyString(options.runDir);\n if (!runDir) {\n throw new CliError('Missing required --run-dir for lifecyclemodel publish-build.', {\n code: 'LIFECYCLEMODEL_PUBLISH_RUN_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n return buildLayout(path.resolve(runDir));\n}\n\nfunction ensureRunRootExists(layout: LifecyclemodelPublishBuildLayout): void {\n if (!existsSync(layout.runRoot)) {\n throw new CliError(`lifecyclemodel publish-build run root not found: ${layout.runRoot}`, {\n code: 'LIFECYCLEMODEL_PUBLISH_RUN_NOT_FOUND',\n exitCode: 2,\n });\n }\n}\n\nfunction readRequiredRunManifest(layout: LifecyclemodelPublishBuildLayout): JsonObject {\n const manifest = readRequiredJsonObject(\n layout.runManifestPath,\n 'LIFECYCLEMODEL_PUBLISH_RUN_MANIFEST_MISSING',\n 'LIFECYCLEMODEL_PUBLISH_RUN_MANIFEST_INVALID',\n 'run-manifest',\n );\n\n const manifestRunId = nonEmptyString(manifest.runId);\n if (manifestRunId && manifestRunId !== layout.runId) {\n throw new CliError(\n `lifecyclemodel publish-build run manifest runId mismatch: ${layout.runManifestPath}`,\n {\n code: 'LIFECYCLEMODEL_PUBLISH_RUN_MANIFEST_MISMATCH',\n exitCode: 2,\n details: {\n expected: layout.runId,\n actual: manifestRunId,\n },\n },\n );\n }\n\n return manifest;\n}\n\nfunction readInvocationIndex(layout: LifecyclemodelPublishBuildLayout): JsonObject {\n if (!existsSync(layout.invocationIndexPath)) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n const value = readJsonArtifact(layout.invocationIndexPath);\n if (!isRecord(value)) {\n throw new CliError(\n `Expected lifecyclemodel publish invocation index JSON object: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_PUBLISH_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n if (value.invocations === undefined) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n if (!Array.isArray(value.invocations)) {\n throw new CliError(\n `Expected lifecyclemodel publish invocation index to contain an invocations array: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_PUBLISH_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return value;\n}\n\nfunction collectLifecyclemodelPayloads(layout: LifecyclemodelPublishBuildLayout): JsonObject[] {\n const runNames = existsSync(layout.modelsDir) ? readdirSync(layout.modelsDir).sort() : [];\n const payloads = runNames.flatMap((runName) => {\n const lifecyclemodelsDir = path.join(\n layout.modelsDir,\n runName,\n 'tidas_bundle',\n 'lifecyclemodels',\n );\n if (!existsSync(lifecyclemodelsDir)) {\n return [];\n }\n\n return readdirSync(lifecyclemodelsDir)\n .filter((entry) => entry.endsWith('.json'))\n .sort()\n .map((entry) => {\n const filePath = path.join(lifecyclemodelsDir, entry);\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected lifecyclemodel publish payload JSON object: ${filePath}`, {\n code: 'LIFECYCLEMODEL_PUBLISH_MODEL_INVALID',\n exitCode: 2,\n });\n }\n return value;\n });\n });\n\n if (payloads.length === 0) {\n throw new CliError(\n `lifecyclemodel publish-build run does not contain any lifecyclemodel payloads: ${layout.modelsDir}`,\n {\n code: 'LIFECYCLEMODEL_PUBLISH_MODELS_NOT_FOUND',\n exitCode: 2,\n },\n );\n }\n\n return payloads;\n}\n\nfunction readValidationSummary(\n layout: LifecyclemodelPublishBuildLayout,\n): LifecyclemodelPublishValidationSummary {\n if (!existsSync(layout.validationReportPath)) {\n return {\n available: false,\n ok: null,\n report: null,\n };\n }\n\n const value = readJsonArtifact(layout.validationReportPath);\n if (!isRecord(value)) {\n throw new CliError(\n `Expected lifecyclemodel validate-build report JSON object: ${layout.validationReportPath}`,\n {\n code: 'LIFECYCLEMODEL_PUBLISH_VALIDATION_REPORT_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return {\n available: true,\n ok: typeof value.ok === 'boolean' ? value.ok : false,\n report: layout.validationReportPath,\n };\n}\n\nfunction buildPublishRequest(): JsonObject {\n return {\n inputs: {\n bundle_paths: ['./publish-bundle.json'],\n },\n publish: {\n commit: false,\n publish_lifecyclemodels: true,\n publish_processes: false,\n publish_sources: false,\n publish_relations: false,\n publish_process_build_runs: false,\n relation_mode: 'local_manifest_only',\n },\n out_dir: './publish-run',\n };\n}\n\nfunction buildPublishIntent(\n layout: LifecyclemodelPublishBuildLayout,\n lifecyclemodelCount: number,\n): JsonObject {\n return {\n ok: true,\n command: 'publish run',\n input_path: layout.publishRequestPath,\n run_id: layout.runId,\n run_root: layout.runRoot,\n status: 'prepared_local_lifecyclemodel_publish_bundle',\n lifecyclemodel_count: lifecyclemodelCount,\n };\n}\n\nfunction buildInvocationIndex(\n layout: LifecyclemodelPublishBuildLayout,\n invocationIndex: JsonObject,\n options: RunLifecyclemodelPublishBuildOptions,\n now: Date,\n): JsonObject {\n const priorInvocations = Array.isArray(invocationIndex.invocations)\n ? [...invocationIndex.invocations]\n : [];\n\n return {\n ...invocationIndex,\n schema_version:\n typeof invocationIndex.schema_version === 'number' ? invocationIndex.schema_version : 1,\n invocations: [\n ...priorInvocations,\n {\n command: ['lifecyclemodel', 'publish-build', '--run-dir', options.runDir],\n cwd: options.cwd ?? process.cwd(),\n created_at: now.toISOString(),\n run_id: layout.runId,\n run_root: layout.runRoot,\n report_path: layout.reportPath,\n publish_request_path: layout.publishRequestPath,\n },\n ],\n };\n}\n\nfunction buildNextActions(layout: LifecyclemodelPublishBuildLayout): string[] {\n return [\n `inspect: ${layout.publishBundlePath}`,\n `inspect: ${layout.publishRequestPath}`,\n `run: tiangong publish run --input ${layout.publishRequestPath}`,\n ];\n}\n\nexport async function runLifecyclemodelPublishBuild(\n options: RunLifecyclemodelPublishBuildOptions,\n): Promise<LifecyclemodelPublishBuildReport> {\n const now = options.now ?? new Date();\n const layout = resolveLayout(options);\n ensureRunRootExists(layout);\n const runManifest = readRequiredRunManifest(layout);\n const invocationIndex = readInvocationIndex(layout);\n const lifecyclemodels = collectLifecyclemodelPayloads(layout);\n const validation = readValidationSummary(layout);\n const publishRequest = buildPublishRequest();\n const normalizedPublishRequest = normalizePublishRequest(publishRequest, {\n requestPath: layout.publishRequestPath,\n now,\n });\n const publishBundle = {\n generated_at_utc: now.toISOString(),\n run_id: layout.runId,\n run_root: layout.runRoot,\n status: 'prepared_local_lifecyclemodel_publish_bundle' as const,\n source_run: {\n run_manifest: copyJson(runManifest),\n },\n validation: copyJson(validation),\n lifecyclemodels: copyJson(lifecyclemodels),\n relations: [],\n };\n const publishIntent = buildPublishIntent(layout, lifecyclemodels.length);\n const report: LifecyclemodelPublishBuildReport = {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n status: 'prepared_local_lifecyclemodel_publish_bundle',\n run_id: layout.runId,\n run_root: layout.runRoot,\n counts: {\n lifecyclemodels: lifecyclemodels.length,\n },\n publish_defaults: {\n commit: normalizedPublishRequest.publish.commit,\n publish_lifecyclemodels: normalizedPublishRequest.publish.publish_lifecyclemodels,\n publish_processes: normalizedPublishRequest.publish.publish_processes,\n publish_sources: normalizedPublishRequest.publish.publish_sources,\n publish_relations: normalizedPublishRequest.publish.publish_relations,\n publish_process_build_runs: normalizedPublishRequest.publish.publish_process_build_runs,\n relation_mode: normalizedPublishRequest.publish.relation_mode,\n },\n validation,\n files: {\n run_manifest: layout.runManifestPath,\n invocation_index: layout.invocationIndexPath,\n publish_bundle: layout.publishBundlePath,\n publish_request: layout.publishRequestPath,\n publish_intent: layout.publishIntentPath,\n report: layout.reportPath,\n },\n next_actions: buildNextActions(layout),\n };\n\n writeJsonArtifact(\n layout.invocationIndexPath,\n buildInvocationIndex(layout, invocationIndex, options, now),\n );\n writeJsonArtifact(layout.publishBundlePath, publishBundle);\n writeJsonArtifact(layout.publishRequestPath, publishRequest);\n writeJsonArtifact(layout.publishIntentPath, publishIntent);\n writeJsonArtifact(layout.reportPath, report);\n\n return report;\n}\n\nexport const __testInternals = {\n buildLayout,\n resolveLayout,\n readInvocationIndex,\n collectLifecyclemodelPayloads,\n readValidationSummary,\n buildPublishRequest,\n buildPublishIntent,\n buildInvocationIndex,\n buildNextActions,\n};\n"]}
1
+ {"version":3,"file":"lifecyclemodel-publish-build.js","sourceRoot":"","sources":["../../../src/lib/lifecyclemodel-publish-build.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport { readJsonArtifact, writeJsonArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport { normalizePublishRequest } from './publish.js';\n\ntype JsonObject = Record<string, unknown>;\n\ntype LifecyclemodelPublishValidationSummary = {\n available: boolean;\n ok: boolean | null;\n report: string | null;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized || null;\n}\n\nfunction copyJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction readRequiredJsonObject(\n filePath: string,\n missingCode: string,\n invalidCode: string,\n label: string,\n): JsonObject {\n if (!existsSync(filePath)) {\n throw new CliError(`Required lifecyclemodel ${label} artifact not found: ${filePath}`, {\n code: missingCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nexport type LifecyclemodelPublishBuildLayout = {\n runId: string;\n runRoot: string;\n modelsDir: string;\n reportsDir: string;\n manifestsDir: string;\n publishStageDir: string;\n runManifestPath: string;\n invocationIndexPath: string;\n validationReportPath: string;\n publishBundlePath: string;\n publishRequestPath: string;\n publishIntentPath: string;\n reportPath: string;\n};\n\nexport type LifecyclemodelPublishBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'prepared_local_lifecyclemodel_publish_bundle';\n run_id: string;\n run_root: string;\n counts: {\n lifecyclemodels: number;\n };\n publish_defaults: {\n commit: boolean;\n publish_lifecyclemodels: boolean;\n publish_processes: boolean;\n publish_sources: boolean;\n publish_relations: boolean;\n publish_process_build_runs: boolean;\n relation_mode: 'local_manifest_only';\n };\n validation: LifecyclemodelPublishValidationSummary;\n files: {\n run_manifest: string;\n invocation_index: string;\n publish_bundle: string;\n publish_request: string;\n publish_intent: string;\n report: string;\n };\n next_actions: string[];\n};\n\nexport type RunLifecyclemodelPublishBuildOptions = {\n runDir: string;\n now?: Date;\n cwd?: string;\n};\n\nfunction buildLayout(runRoot: string): LifecyclemodelPublishBuildLayout {\n const runId = path.basename(runRoot);\n return {\n runId,\n runRoot,\n modelsDir: path.join(runRoot, 'models'),\n reportsDir: path.join(runRoot, 'reports'),\n manifestsDir: path.join(runRoot, 'manifests'),\n publishStageDir: path.join(runRoot, 'stage_outputs', '10_publish'),\n runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),\n invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),\n validationReportPath: path.join(\n runRoot,\n 'reports',\n 'lifecyclemodel-validate-build-report.json',\n ),\n publishBundlePath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-bundle.json'),\n publishRequestPath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-request.json'),\n publishIntentPath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-intent.json'),\n reportPath: path.join(runRoot, 'reports', 'lifecyclemodel-publish-build-report.json'),\n };\n}\n\nfunction resolveLayout(\n options: RunLifecyclemodelPublishBuildOptions,\n): LifecyclemodelPublishBuildLayout {\n const runDir = nonEmptyString(options.runDir);\n if (!runDir) {\n throw new CliError('Missing required --run-dir for lifecyclemodel publish-build.', {\n code: 'LIFECYCLEMODEL_PUBLISH_RUN_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n return buildLayout(path.resolve(runDir));\n}\n\nfunction ensureRunRootExists(layout: LifecyclemodelPublishBuildLayout): void {\n if (!existsSync(layout.runRoot)) {\n throw new CliError(`lifecyclemodel publish-build run root not found: ${layout.runRoot}`, {\n code: 'LIFECYCLEMODEL_PUBLISH_RUN_NOT_FOUND',\n exitCode: 2,\n });\n }\n}\n\nfunction readRequiredRunManifest(layout: LifecyclemodelPublishBuildLayout): JsonObject {\n const manifest = readRequiredJsonObject(\n layout.runManifestPath,\n 'LIFECYCLEMODEL_PUBLISH_RUN_MANIFEST_MISSING',\n 'LIFECYCLEMODEL_PUBLISH_RUN_MANIFEST_INVALID',\n 'run-manifest',\n );\n\n const manifestRunId = nonEmptyString(manifest.runId);\n if (manifestRunId && manifestRunId !== layout.runId) {\n throw new CliError(\n `lifecyclemodel publish-build run manifest runId mismatch: ${layout.runManifestPath}`,\n {\n code: 'LIFECYCLEMODEL_PUBLISH_RUN_MANIFEST_MISMATCH',\n exitCode: 2,\n details: {\n expected: layout.runId,\n actual: manifestRunId,\n },\n },\n );\n }\n\n return manifest;\n}\n\nfunction readInvocationIndex(layout: LifecyclemodelPublishBuildLayout): JsonObject {\n if (!existsSync(layout.invocationIndexPath)) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n const value = readJsonArtifact(layout.invocationIndexPath);\n if (!isRecord(value)) {\n throw new CliError(\n `Expected lifecyclemodel publish invocation index JSON object: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_PUBLISH_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n if (value.invocations === undefined) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n if (!Array.isArray(value.invocations)) {\n throw new CliError(\n `Expected lifecyclemodel publish invocation index to contain an invocations array: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_PUBLISH_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return value;\n}\n\nfunction collectLifecyclemodelPayloads(layout: LifecyclemodelPublishBuildLayout): JsonObject[] {\n const runNames = existsSync(layout.modelsDir) ? readdirSync(layout.modelsDir).sort() : [];\n const payloads = runNames.flatMap((runName) => {\n const lifecyclemodelsDir = path.join(\n layout.modelsDir,\n runName,\n 'tidas_bundle',\n 'lifecyclemodels',\n );\n if (!existsSync(lifecyclemodelsDir)) {\n return [];\n }\n\n return readdirSync(lifecyclemodelsDir)\n .filter((entry) => entry.endsWith('.json'))\n .sort()\n .map((entry) => {\n const filePath = path.join(lifecyclemodelsDir, entry);\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected lifecyclemodel publish payload JSON object: ${filePath}`, {\n code: 'LIFECYCLEMODEL_PUBLISH_MODEL_INVALID',\n exitCode: 2,\n });\n }\n return value;\n });\n });\n\n if (payloads.length === 0) {\n throw new CliError(\n `lifecyclemodel publish-build run does not contain any lifecyclemodel payloads: ${layout.modelsDir}`,\n {\n code: 'LIFECYCLEMODEL_PUBLISH_MODELS_NOT_FOUND',\n exitCode: 2,\n },\n );\n }\n\n return payloads;\n}\n\nfunction readValidationSummary(\n layout: LifecyclemodelPublishBuildLayout,\n): LifecyclemodelPublishValidationSummary {\n if (!existsSync(layout.validationReportPath)) {\n return {\n available: false,\n ok: null,\n report: null,\n };\n }\n\n const value = readJsonArtifact(layout.validationReportPath);\n if (!isRecord(value)) {\n throw new CliError(\n `Expected lifecyclemodel validate-build report JSON object: ${layout.validationReportPath}`,\n {\n code: 'LIFECYCLEMODEL_PUBLISH_VALIDATION_REPORT_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return {\n available: true,\n ok: typeof value.ok === 'boolean' ? value.ok : false,\n report: layout.validationReportPath,\n };\n}\n\nfunction buildPublishRequest(): JsonObject {\n return {\n inputs: {\n bundle_paths: ['./publish-bundle.json'],\n },\n publish: {\n commit: false,\n publish_lifecyclemodels: true,\n publish_processes: false,\n publish_sources: false,\n publish_relations: false,\n publish_process_build_runs: false,\n relation_mode: 'local_manifest_only',\n },\n out_dir: './publish-run',\n };\n}\n\nfunction buildPublishIntent(\n layout: LifecyclemodelPublishBuildLayout,\n lifecyclemodelCount: number,\n): JsonObject {\n return {\n ok: true,\n command: 'publish run',\n lifecyclemodel_transport: 'save_lifecycle_model_bundle',\n input_path: layout.publishRequestPath,\n run_id: layout.runId,\n run_root: layout.runRoot,\n status: 'prepared_local_lifecyclemodel_publish_bundle',\n lifecyclemodel_count: lifecyclemodelCount,\n };\n}\n\nfunction buildInvocationIndex(\n layout: LifecyclemodelPublishBuildLayout,\n invocationIndex: JsonObject,\n options: RunLifecyclemodelPublishBuildOptions,\n now: Date,\n): JsonObject {\n const priorInvocations = Array.isArray(invocationIndex.invocations)\n ? [...invocationIndex.invocations]\n : [];\n\n return {\n ...invocationIndex,\n schema_version:\n typeof invocationIndex.schema_version === 'number' ? invocationIndex.schema_version : 1,\n invocations: [\n ...priorInvocations,\n {\n command: ['lifecyclemodel', 'publish-build', '--run-dir', options.runDir],\n cwd: options.cwd ?? process.cwd(),\n created_at: now.toISOString(),\n run_id: layout.runId,\n run_root: layout.runRoot,\n report_path: layout.reportPath,\n publish_request_path: layout.publishRequestPath,\n },\n ],\n };\n}\n\nfunction buildNextActions(layout: LifecyclemodelPublishBuildLayout): string[] {\n return [\n `inspect: ${layout.publishBundlePath}`,\n `inspect: ${layout.publishRequestPath}`,\n `run: tiangong publish run --input ${layout.publishRequestPath} # lifecyclemodels commit through save_lifecycle_model_bundle`,\n ];\n}\n\nexport async function runLifecyclemodelPublishBuild(\n options: RunLifecyclemodelPublishBuildOptions,\n): Promise<LifecyclemodelPublishBuildReport> {\n const now = options.now ?? new Date();\n const layout = resolveLayout(options);\n ensureRunRootExists(layout);\n const runManifest = readRequiredRunManifest(layout);\n const invocationIndex = readInvocationIndex(layout);\n const lifecyclemodels = collectLifecyclemodelPayloads(layout);\n const validation = readValidationSummary(layout);\n const publishRequest = buildPublishRequest();\n const normalizedPublishRequest = normalizePublishRequest(publishRequest, {\n requestPath: layout.publishRequestPath,\n now,\n });\n const publishBundle = {\n generated_at_utc: now.toISOString(),\n run_id: layout.runId,\n run_root: layout.runRoot,\n status: 'prepared_local_lifecyclemodel_publish_bundle' as const,\n lifecyclemodel_transport: 'save_lifecycle_model_bundle' as const,\n source_run: {\n run_manifest: copyJson(runManifest),\n },\n validation: copyJson(validation),\n lifecyclemodels: copyJson(lifecyclemodels),\n relations: [],\n };\n const publishIntent = buildPublishIntent(layout, lifecyclemodels.length);\n const report: LifecyclemodelPublishBuildReport = {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n status: 'prepared_local_lifecyclemodel_publish_bundle',\n run_id: layout.runId,\n run_root: layout.runRoot,\n counts: {\n lifecyclemodels: lifecyclemodels.length,\n },\n publish_defaults: {\n commit: normalizedPublishRequest.publish.commit,\n publish_lifecyclemodels: normalizedPublishRequest.publish.publish_lifecyclemodels,\n publish_processes: normalizedPublishRequest.publish.publish_processes,\n publish_sources: normalizedPublishRequest.publish.publish_sources,\n publish_relations: normalizedPublishRequest.publish.publish_relations,\n publish_process_build_runs: normalizedPublishRequest.publish.publish_process_build_runs,\n relation_mode: normalizedPublishRequest.publish.relation_mode,\n },\n validation,\n files: {\n run_manifest: layout.runManifestPath,\n invocation_index: layout.invocationIndexPath,\n publish_bundle: layout.publishBundlePath,\n publish_request: layout.publishRequestPath,\n publish_intent: layout.publishIntentPath,\n report: layout.reportPath,\n },\n next_actions: buildNextActions(layout),\n };\n\n writeJsonArtifact(\n layout.invocationIndexPath,\n buildInvocationIndex(layout, invocationIndex, options, now),\n );\n writeJsonArtifact(layout.publishBundlePath, publishBundle);\n writeJsonArtifact(layout.publishRequestPath, publishRequest);\n writeJsonArtifact(layout.publishIntentPath, publishIntent);\n writeJsonArtifact(layout.reportPath, report);\n\n return report;\n}\n\nexport const __testInternals = {\n buildLayout,\n resolveLayout,\n readInvocationIndex,\n collectLifecyclemodelPayloads,\n readValidationSummary,\n buildPublishRequest,\n buildPublishIntent,\n buildInvocationIndex,\n buildNextActions,\n};\n"]}
@@ -0,0 +1,23 @@
1
+ import { readFileSync } from 'node:fs';
2
+ const PACKAGE_JSON_CANDIDATES = ['../package.json', '../../package.json'];
3
+ function parsePackageVersion(candidate, readText) {
4
+ try {
5
+ const payload = JSON.parse(readText(candidate));
6
+ return typeof payload.version === 'string' && payload.version.length > 0
7
+ ? payload.version
8
+ : null;
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ }
14
+ export function loadCliPackageVersion(importMetaUrl = import.meta.url, readText = (url) => readFileSync(url, 'utf8')) {
15
+ for (const relativePath of PACKAGE_JSON_CANDIDATES) {
16
+ const version = parsePackageVersion(new URL(relativePath, importMetaUrl), readText);
17
+ if (version) {
18
+ return version;
19
+ }
20
+ }
21
+ throw new Error('Could not resolve CLI package version from package.json.');
22
+ }
23
+ //# sourceMappingURL=package-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-version.js","sourceRoot":"","sources":["../../../src/lib/package-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,uBAAuB,GAAG,CAAC,iBAAiB,EAAE,oBAAoB,CAAU,CAAC;AAInF,SAAS,mBAAmB,CAAC,SAAc,EAAE,QAA8B;IACzE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA0B,CAAC;QACzE,OAAO,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACtE,CAAC,CAAC,OAAO,CAAC,OAAO;YACjB,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,gBAAwB,MAAM,CAAC,IAAI,CAAC,GAAG,EACvC,WAAiC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC;IAEnE,KAAK,MAAM,YAAY,IAAI,uBAAuB,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;QACpF,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import { readFileSync } from 'node:fs';\n\nconst PACKAGE_JSON_CANDIDATES = ['../package.json', '../../package.json'] as const;\n\ntype PackageVersionReader = (url: URL) => string;\n\nfunction parsePackageVersion(candidate: URL, readText: PackageVersionReader): string | null {\n try {\n const payload = JSON.parse(readText(candidate)) as { version?: unknown };\n return typeof payload.version === 'string' && payload.version.length > 0\n ? payload.version\n : null;\n } catch {\n return null;\n }\n}\n\nexport function loadCliPackageVersion(\n importMetaUrl: string = import.meta.url,\n readText: PackageVersionReader = (url) => readFileSync(url, 'utf8'),\n): string {\n for (const relativePath of PACKAGE_JSON_CANDIDATES) {\n const version = parsePackageVersion(new URL(relativePath, importMetaUrl), readText);\n if (version) {\n return version;\n }\n }\n\n throw new Error('Could not resolve CLI package version from package.json.');\n}\n"]}
@@ -0,0 +1,337 @@
1
+ import { CliError } from './errors.js';
2
+ import { normalizeStateCodeList, normalizeTokenList } from './flow-read.js';
3
+ import { normalizeSupabaseProcessPayload, requireSupabaseRestRuntime } from './supabase-rest.js';
4
+ import { createSupabaseDataClient, runSupabaseArrayQuery } from './supabase-client.js';
5
+ import { createSupabaseDataRuntime } from './supabase-session.js';
6
+ const PROCESS_LIST_TIMEOUT_MS = 10_000;
7
+ const DEFAULT_PROCESS_LIST_LIMIT = 100;
8
+ const DEFAULT_PROCESS_LIST_PAGE_SIZE = 100;
9
+ const DEFAULT_PROCESS_LIST_ORDER = 'id.asc,version.asc';
10
+ const DEFAULT_PROCESS_LIST_MAX_ATTEMPTS = 3;
11
+ function isRecord(value) {
12
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
13
+ }
14
+ function normalizeToken(value) {
15
+ if (typeof value !== 'string') {
16
+ return null;
17
+ }
18
+ const trimmed = value.trim();
19
+ if (!trimmed) {
20
+ return null;
21
+ }
22
+ return trimmed;
23
+ }
24
+ function nowIso(now = new Date()) {
25
+ return now.toISOString();
26
+ }
27
+ function toPositiveInteger(value, label, code) {
28
+ if (!Number.isInteger(value) || value <= 0) {
29
+ throw new CliError(`Expected ${label} to be a positive integer.`, {
30
+ code,
31
+ exitCode: 2,
32
+ });
33
+ }
34
+ return value;
35
+ }
36
+ function toNonNegativeInteger(value, label, code) {
37
+ if (!Number.isInteger(value) || value < 0) {
38
+ throw new CliError(`Expected ${label} to be a non-negative integer.`, {
39
+ code,
40
+ exitCode: 2,
41
+ });
42
+ }
43
+ return value;
44
+ }
45
+ function optionalPositiveInteger(value) {
46
+ return Number.isInteger(value) && value > 0 ? value : null;
47
+ }
48
+ function optionalNonNegativeInteger(value) {
49
+ return Number.isInteger(value) && value >= 0 ? value : null;
50
+ }
51
+ function buildProcessListUrl(restBaseUrl, filters) {
52
+ const url = new URL(`${restBaseUrl.replace(/\/+$/u, '')}/processes`);
53
+ url.searchParams.set('select', 'id,version,user_id,state_code,modified_at,json');
54
+ const ids = normalizeTokenList(filters.ids);
55
+ if (ids.length === 1) {
56
+ url.searchParams.set('id', `eq.${ids[0]}`);
57
+ }
58
+ else if (ids.length > 1) {
59
+ url.searchParams.set('id', `in.(${ids.join(',')})`);
60
+ }
61
+ if (typeof filters.version === 'string' && filters.version.trim()) {
62
+ url.searchParams.set('version', `eq.${filters.version.trim()}`);
63
+ }
64
+ if (typeof filters.userId === 'string' && filters.userId.trim()) {
65
+ url.searchParams.set('user_id', `eq.${filters.userId.trim()}`);
66
+ }
67
+ const stateCodes = normalizeStateCodeList(filters.stateCodes);
68
+ if (stateCodes.length === 1) {
69
+ url.searchParams.set('state_code', `eq.${stateCodes[0]}`);
70
+ }
71
+ else if (stateCodes.length > 1) {
72
+ url.searchParams.set('state_code', `in.(${stateCodes.join(',')})`);
73
+ }
74
+ if (typeof filters.order === 'string' && filters.order.trim()) {
75
+ url.searchParams.set('order', filters.order.trim());
76
+ }
77
+ if (Number.isInteger(filters.limit) && filters.limit > 0) {
78
+ url.searchParams.set('limit', String(filters.limit));
79
+ }
80
+ if (Number.isInteger(filters.offset) && filters.offset >= 0) {
81
+ url.searchParams.set('offset', String(filters.offset));
82
+ }
83
+ return url.toString();
84
+ }
85
+ function parseProcessRows(payload, url) {
86
+ if (!Array.isArray(payload)) {
87
+ throw new CliError(`Supabase REST response was not a JSON array for ${url}`, {
88
+ code: 'SUPABASE_REST_RESPONSE_INVALID',
89
+ exitCode: 1,
90
+ details: payload,
91
+ });
92
+ }
93
+ return payload.map((item, index) => {
94
+ if (!isRecord(item)) {
95
+ throw new CliError(`Supabase REST row ${index} was not a JSON object for ${url}`, {
96
+ code: 'SUPABASE_REST_RESPONSE_INVALID',
97
+ exitCode: 1,
98
+ details: item,
99
+ });
100
+ }
101
+ return {
102
+ id: typeof item.id === 'string' ? item.id : '',
103
+ version: typeof item.version === 'string' ? item.version : '',
104
+ user_id: typeof item.user_id === 'string' ? item.user_id : null,
105
+ state_code: typeof item.state_code === 'number' ? item.state_code : null,
106
+ modified_at: typeof item.modified_at === 'string' ? item.modified_at : null,
107
+ json: item.json,
108
+ };
109
+ });
110
+ }
111
+ function applyOrder(query, orderValue) {
112
+ const normalizedOrder = typeof orderValue === 'string' ? orderValue.trim() : '';
113
+ if (!normalizedOrder) {
114
+ return query;
115
+ }
116
+ let nextQuery = query;
117
+ for (const rawToken of normalizedOrder.split(',')) {
118
+ const token = rawToken.trim();
119
+ if (!token) {
120
+ continue;
121
+ }
122
+ const [column, direction, nulls] = token.split('.');
123
+ if (!column) {
124
+ continue;
125
+ }
126
+ nextQuery = nextQuery.order(column, {
127
+ ascending: direction !== 'desc',
128
+ nullsFirst: nulls === 'nullsfirst' ? true : nulls === 'nullslast' ? false : undefined,
129
+ });
130
+ }
131
+ return nextQuery;
132
+ }
133
+ async function listProcessRows(options) {
134
+ const { client, restBaseUrl } = createSupabaseDataClient(options.runtime, options.fetchImpl, options.timeoutMs);
135
+ const sourceUrl = buildProcessListUrl(restBaseUrl, options.filters);
136
+ let query = client.from('processes').select('id,version,user_id,state_code,modified_at,json');
137
+ const ids = normalizeTokenList(options.filters.ids);
138
+ if (ids.length === 1) {
139
+ query = query.eq('id', ids[0]);
140
+ }
141
+ else if (ids.length > 1) {
142
+ query = query.filter('id', 'in', `(${ids.join(',')})`);
143
+ }
144
+ if (typeof options.filters.version === 'string' && options.filters.version.trim()) {
145
+ query = query.eq('version', options.filters.version.trim());
146
+ }
147
+ if (typeof options.filters.userId === 'string' && options.filters.userId.trim()) {
148
+ query = query.eq('user_id', options.filters.userId.trim());
149
+ }
150
+ const stateCodes = normalizeStateCodeList(options.filters.stateCodes);
151
+ if (stateCodes.length === 1) {
152
+ query = query.eq('state_code', stateCodes[0]);
153
+ }
154
+ else if (stateCodes.length > 1) {
155
+ query = query.filter('state_code', 'in', `(${stateCodes.join(',')})`);
156
+ }
157
+ query = applyOrder(query, options.filters.order);
158
+ const limit = optionalPositiveInteger(options.filters.limit);
159
+ const offset = optionalNonNegativeInteger(options.filters.offset);
160
+ if (limit !== null) {
161
+ query = query.limit(limit);
162
+ if (offset !== null) {
163
+ query.url.searchParams.set('offset', String(offset));
164
+ }
165
+ }
166
+ const payload = await runSupabaseArrayQuery(query, sourceUrl);
167
+ return {
168
+ rows: parseProcessRows(payload, sourceUrl),
169
+ sourceUrl,
170
+ };
171
+ }
172
+ function isRetryableError(error) {
173
+ return !(error instanceof CliError && error.exitCode === 2);
174
+ }
175
+ async function listProcessRowsWithRetry(options) {
176
+ for (let attempt = 1;; attempt += 1) {
177
+ try {
178
+ return await listProcessRows(options);
179
+ }
180
+ catch (error) {
181
+ if (attempt >= options.maxAttempts || !isRetryableError(error)) {
182
+ throw error;
183
+ }
184
+ }
185
+ }
186
+ }
187
+ export async function runProcessList(options) {
188
+ const ids = normalizeTokenList(options.ids);
189
+ const requestedVersion = normalizeToken(options.version ?? null);
190
+ const requestedUserId = normalizeToken(options.userId ?? null);
191
+ const requestedStateCodes = normalizeStateCodeList(options.stateCodes);
192
+ const all = Boolean(options.all);
193
+ const order = normalizeToken(options.order ?? null) ?? DEFAULT_PROCESS_LIST_ORDER;
194
+ if (all && options.limit !== null && options.limit !== undefined) {
195
+ throw new CliError('Cannot combine --all with --limit.', {
196
+ code: 'PROCESS_LIST_ALL_LIMIT_CONFLICT',
197
+ exitCode: 2,
198
+ });
199
+ }
200
+ if (all && options.offset !== null && options.offset !== undefined) {
201
+ throw new CliError('Cannot combine --all with --offset.', {
202
+ code: 'PROCESS_LIST_ALL_OFFSET_CONFLICT',
203
+ exitCode: 2,
204
+ });
205
+ }
206
+ if (all &&
207
+ ids.length === 0 &&
208
+ requestedVersion === null &&
209
+ requestedUserId === null &&
210
+ requestedStateCodes.length === 0) {
211
+ throw new CliError('Refusing to run --all without at least one narrowing filter.', {
212
+ code: 'PROCESS_LIST_ALL_FILTER_REQUIRED',
213
+ exitCode: 2,
214
+ });
215
+ }
216
+ const fetchImpl = options.fetchImpl ?? fetch;
217
+ const timeoutMs = options.timeoutMs ?? PROCESS_LIST_TIMEOUT_MS;
218
+ const maxAttempts = toPositiveInteger(options.maxAttempts ?? DEFAULT_PROCESS_LIST_MAX_ATTEMPTS, 'process list retry count', 'PROCESS_LIST_MAX_ATTEMPTS_INVALID');
219
+ const runtime = createSupabaseDataRuntime({
220
+ runtime: requireSupabaseRestRuntime(options.env ?? process.env),
221
+ fetchImpl,
222
+ timeoutMs,
223
+ now: options.now,
224
+ });
225
+ const sourceUrls = [];
226
+ const rows = [];
227
+ if (all) {
228
+ const pageSizeValue = options.pageSize ?? DEFAULT_PROCESS_LIST_PAGE_SIZE;
229
+ const pageSize = toPositiveInteger(pageSizeValue, '--page-size', 'PROCESS_LIST_PAGE_SIZE_INVALID');
230
+ let currentOffset = 0;
231
+ while (true) {
232
+ const page = await listProcessRowsWithRetry({
233
+ runtime,
234
+ filters: {
235
+ ids,
236
+ version: requestedVersion,
237
+ userId: requestedUserId,
238
+ stateCodes: requestedStateCodes,
239
+ order,
240
+ limit: pageSize,
241
+ offset: currentOffset,
242
+ },
243
+ timeoutMs,
244
+ fetchImpl,
245
+ maxAttempts,
246
+ });
247
+ sourceUrls.push(page.sourceUrl);
248
+ rows.push(...page.rows.map((row) => ({
249
+ id: row.id,
250
+ version: row.version,
251
+ user_id: row.user_id,
252
+ state_code: row.state_code,
253
+ modified_at: row.modified_at,
254
+ process: normalizeSupabaseProcessPayload(row.json, `${row.id}@${row.version}`),
255
+ })));
256
+ if (page.rows.length < pageSize) {
257
+ break;
258
+ }
259
+ currentOffset += pageSize;
260
+ }
261
+ return {
262
+ schema_version: 1,
263
+ generated_at_utc: nowIso(options.now),
264
+ status: 'listed_remote_processes',
265
+ filters: {
266
+ ids,
267
+ requested_version: requestedVersion,
268
+ requested_user_id: requestedUserId,
269
+ requested_state_codes: requestedStateCodes,
270
+ order,
271
+ all: true,
272
+ limit: null,
273
+ offset: 0,
274
+ page_size: pageSize,
275
+ },
276
+ count: rows.length,
277
+ source_urls: sourceUrls,
278
+ rows,
279
+ };
280
+ }
281
+ const limit = toPositiveInteger(options.limit ?? DEFAULT_PROCESS_LIST_LIMIT, '--limit', 'PROCESS_LIST_LIMIT_INVALID');
282
+ const offset = toNonNegativeInteger(options.offset ?? 0, '--offset', 'PROCESS_LIST_OFFSET_INVALID');
283
+ const page = await listProcessRowsWithRetry({
284
+ runtime,
285
+ filters: {
286
+ ids,
287
+ version: requestedVersion,
288
+ userId: requestedUserId,
289
+ stateCodes: requestedStateCodes,
290
+ order,
291
+ limit,
292
+ offset,
293
+ },
294
+ timeoutMs,
295
+ fetchImpl,
296
+ maxAttempts,
297
+ });
298
+ return {
299
+ schema_version: 1,
300
+ generated_at_utc: nowIso(options.now),
301
+ status: 'listed_remote_processes',
302
+ filters: {
303
+ ids,
304
+ requested_version: requestedVersion,
305
+ requested_user_id: requestedUserId,
306
+ requested_state_codes: requestedStateCodes,
307
+ order,
308
+ all: false,
309
+ limit,
310
+ offset,
311
+ page_size: null,
312
+ },
313
+ count: page.rows.length,
314
+ source_urls: [page.sourceUrl],
315
+ rows: page.rows.map((row) => ({
316
+ id: row.id,
317
+ version: row.version,
318
+ user_id: row.user_id,
319
+ state_code: row.state_code,
320
+ modified_at: row.modified_at,
321
+ process: normalizeSupabaseProcessPayload(row.json, `${row.id}@${row.version}`),
322
+ })),
323
+ };
324
+ }
325
+ export const __testInternals = {
326
+ applyOrder,
327
+ buildProcessListUrl,
328
+ isRetryableError,
329
+ normalizeToken,
330
+ nowIso,
331
+ optionalNonNegativeInteger,
332
+ optionalPositiveInteger,
333
+ parseProcessRows,
334
+ toNonNegativeInteger,
335
+ toPositiveInteger,
336
+ };
337
+ //# sourceMappingURL=process-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-list.js","sourceRoot":"","sources":["../../../src/lib/process-list.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport { normalizeStateCodeList, normalizeTokenList } from './flow-read.js';\nimport type { FetchLike } from './http.js';\nimport { normalizeSupabaseProcessPayload, requireSupabaseRestRuntime } from './supabase-rest.js';\nimport { createSupabaseDataClient, runSupabaseArrayQuery } from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst PROCESS_LIST_TIMEOUT_MS = 10_000;\nconst DEFAULT_PROCESS_LIST_LIMIT = 100;\nconst DEFAULT_PROCESS_LIST_PAGE_SIZE = 100;\nconst DEFAULT_PROCESS_LIST_ORDER = 'id.asc,version.asc';\nconst DEFAULT_PROCESS_LIST_MAX_ATTEMPTS = 3;\n\ntype ProcessListQueryFilters = {\n ids?: string[];\n version?: string | null;\n userId?: string | null;\n stateCodes?: number[];\n order?: string | null;\n limit?: number | null;\n offset?: number | null;\n};\n\ntype SupabaseProcessListRow = {\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n json: unknown;\n};\n\ntype QueryWithUrl = {\n url: URL;\n limit: (count: number) => QueryWithUrl;\n};\n\nexport type RunProcessListOptions = {\n ids?: string[];\n version?: string | null;\n userId?: string | null;\n stateCodes?: number[];\n limit?: number | null;\n offset?: number | null;\n all?: boolean;\n pageSize?: number | null;\n order?: string | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n maxAttempts?: number | null;\n};\n\nexport type ProcessListReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'listed_remote_processes';\n filters: {\n ids: string[];\n requested_version: string | null;\n requested_user_id: string | null;\n requested_state_codes: number[];\n order: string;\n all: boolean;\n limit: number | null;\n offset: number;\n page_size: number | null;\n };\n count: number;\n source_urls: string[];\n rows: Array<{\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n process: JsonObject;\n }>;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeToken(value: string | null | undefined): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction toPositiveInteger(value: number | null | undefined, label: string, code: string): number {\n if (!Number.isInteger(value) || (value as number) <= 0) {\n throw new CliError(`Expected ${label} to be a positive integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value as number;\n}\n\nfunction toNonNegativeInteger(\n value: number | null | undefined,\n label: string,\n code: string,\n): number {\n if (!Number.isInteger(value) || (value as number) < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value as number;\n}\n\nfunction optionalPositiveInteger(value: number | null | undefined): number | null {\n return Number.isInteger(value) && (value as number) > 0 ? (value as number) : null;\n}\n\nfunction optionalNonNegativeInteger(value: number | null | undefined): number | null {\n return Number.isInteger(value) && (value as number) >= 0 ? (value as number) : null;\n}\n\nfunction buildProcessListUrl(restBaseUrl: string, filters: ProcessListQueryFilters): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/processes`);\n url.searchParams.set('select', 'id,version,user_id,state_code,modified_at,json');\n\n const ids = normalizeTokenList(filters.ids);\n if (ids.length === 1) {\n url.searchParams.set('id', `eq.${ids[0]}`);\n } else if (ids.length > 1) {\n url.searchParams.set('id', `in.(${ids.join(',')})`);\n }\n\n if (typeof filters.version === 'string' && filters.version.trim()) {\n url.searchParams.set('version', `eq.${filters.version.trim()}`);\n }\n\n if (typeof filters.userId === 'string' && filters.userId.trim()) {\n url.searchParams.set('user_id', `eq.${filters.userId.trim()}`);\n }\n\n const stateCodes = normalizeStateCodeList(filters.stateCodes);\n if (stateCodes.length === 1) {\n url.searchParams.set('state_code', `eq.${stateCodes[0]}`);\n } else if (stateCodes.length > 1) {\n url.searchParams.set('state_code', `in.(${stateCodes.join(',')})`);\n }\n\n if (typeof filters.order === 'string' && filters.order.trim()) {\n url.searchParams.set('order', filters.order.trim());\n }\n\n if (Number.isInteger(filters.limit) && (filters.limit as number) > 0) {\n url.searchParams.set('limit', String(filters.limit));\n }\n\n if (Number.isInteger(filters.offset) && (filters.offset as number) >= 0) {\n url.searchParams.set('offset', String(filters.offset));\n }\n\n return url.toString();\n}\n\nfunction parseProcessRows(payload: unknown, url: string): SupabaseProcessListRow[] {\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: typeof item.id === 'string' ? item.id : '',\n version: typeof item.version === 'string' ? item.version : '',\n user_id: typeof item.user_id === 'string' ? item.user_id : null,\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n modified_at: typeof item.modified_at === 'string' ? item.modified_at : null,\n json: item.json,\n };\n });\n}\n\nfunction applyOrder<Query extends { order: (column: string, options?: object) => Query }>(\n query: Query,\n orderValue: string | null | undefined,\n): Query {\n const normalizedOrder = typeof orderValue === 'string' ? orderValue.trim() : '';\n if (!normalizedOrder) {\n return query;\n }\n\n let nextQuery = query;\n for (const rawToken of normalizedOrder.split(',')) {\n const token = rawToken.trim();\n if (!token) {\n continue;\n }\n\n const [column, direction, nulls] = token.split('.');\n if (!column) {\n continue;\n }\n\n nextQuery = nextQuery.order(column, {\n ascending: direction !== 'desc',\n nullsFirst: nulls === 'nullsfirst' ? true : nulls === 'nullslast' ? false : undefined,\n });\n }\n\n return nextQuery;\n}\n\nasync function listProcessRows(options: {\n runtime: ReturnType<typeof createSupabaseDataRuntime>;\n filters: ProcessListQueryFilters;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<{ rows: SupabaseProcessListRow[]; sourceUrl: string }> {\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const sourceUrl = buildProcessListUrl(restBaseUrl, options.filters);\n let query = client.from('processes').select('id,version,user_id,state_code,modified_at,json');\n\n const ids = normalizeTokenList(options.filters.ids);\n if (ids.length === 1) {\n query = query.eq('id', ids[0] as string);\n } else if (ids.length > 1) {\n query = query.filter('id', 'in', `(${ids.join(',')})`);\n }\n\n if (typeof options.filters.version === 'string' && options.filters.version.trim()) {\n query = query.eq('version', options.filters.version.trim());\n }\n\n if (typeof options.filters.userId === 'string' && options.filters.userId.trim()) {\n query = query.eq('user_id', options.filters.userId.trim());\n }\n\n const stateCodes = normalizeStateCodeList(options.filters.stateCodes);\n if (stateCodes.length === 1) {\n query = query.eq('state_code', stateCodes[0] as number);\n } else if (stateCodes.length > 1) {\n query = query.filter('state_code', 'in', `(${stateCodes.join(',')})`);\n }\n\n query = applyOrder(query, options.filters.order);\n\n const limit = optionalPositiveInteger(options.filters.limit);\n const offset = optionalNonNegativeInteger(options.filters.offset);\n\n if (limit !== null) {\n query = query.limit(limit);\n if (offset !== null) {\n (query as unknown as QueryWithUrl).url.searchParams.set('offset', String(offset));\n }\n }\n\n const payload = await runSupabaseArrayQuery(query, sourceUrl);\n return {\n rows: parseProcessRows(payload, sourceUrl),\n sourceUrl,\n };\n}\n\nfunction isRetryableError(error: unknown): boolean {\n return !(error instanceof CliError && error.exitCode === 2);\n}\n\nasync function listProcessRowsWithRetry(options: {\n runtime: ReturnType<typeof createSupabaseDataRuntime>;\n filters: ProcessListQueryFilters;\n timeoutMs: number;\n fetchImpl: FetchLike;\n maxAttempts: number;\n}): Promise<{ rows: SupabaseProcessListRow[]; sourceUrl: string }> {\n for (let attempt = 1; ; attempt += 1) {\n try {\n return await listProcessRows(options);\n } catch (error) {\n if (attempt >= options.maxAttempts || !isRetryableError(error)) {\n throw error;\n }\n }\n }\n}\n\nexport async function runProcessList(options: RunProcessListOptions): Promise<ProcessListReport> {\n const ids = normalizeTokenList(options.ids);\n const requestedVersion = normalizeToken(options.version ?? null);\n const requestedUserId = normalizeToken(options.userId ?? null);\n const requestedStateCodes = normalizeStateCodeList(options.stateCodes);\n const all = Boolean(options.all);\n const order = normalizeToken(options.order ?? null) ?? DEFAULT_PROCESS_LIST_ORDER;\n\n if (all && options.limit !== null && options.limit !== undefined) {\n throw new CliError('Cannot combine --all with --limit.', {\n code: 'PROCESS_LIST_ALL_LIMIT_CONFLICT',\n exitCode: 2,\n });\n }\n\n if (all && options.offset !== null && options.offset !== undefined) {\n throw new CliError('Cannot combine --all with --offset.', {\n code: 'PROCESS_LIST_ALL_OFFSET_CONFLICT',\n exitCode: 2,\n });\n }\n\n if (\n all &&\n ids.length === 0 &&\n requestedVersion === null &&\n requestedUserId === null &&\n requestedStateCodes.length === 0\n ) {\n throw new CliError('Refusing to run --all without at least one narrowing filter.', {\n code: 'PROCESS_LIST_ALL_FILTER_REQUIRED',\n exitCode: 2,\n });\n }\n\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? PROCESS_LIST_TIMEOUT_MS;\n const maxAttempts = toPositiveInteger(\n options.maxAttempts ?? DEFAULT_PROCESS_LIST_MAX_ATTEMPTS,\n 'process list retry count',\n 'PROCESS_LIST_MAX_ATTEMPTS_INVALID',\n );\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n const sourceUrls: string[] = [];\n const rows: ProcessListReport['rows'] = [];\n\n if (all) {\n const pageSizeValue = options.pageSize ?? DEFAULT_PROCESS_LIST_PAGE_SIZE;\n const pageSize = toPositiveInteger(\n pageSizeValue,\n '--page-size',\n 'PROCESS_LIST_PAGE_SIZE_INVALID',\n );\n let currentOffset = 0;\n while (true) {\n const page = await listProcessRowsWithRetry({\n runtime,\n filters: {\n ids,\n version: requestedVersion,\n userId: requestedUserId,\n stateCodes: requestedStateCodes,\n order,\n limit: pageSize,\n offset: currentOffset,\n },\n timeoutMs,\n fetchImpl,\n maxAttempts,\n });\n sourceUrls.push(page.sourceUrl);\n rows.push(\n ...page.rows.map((row) => ({\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n modified_at: row.modified_at,\n process: normalizeSupabaseProcessPayload(row.json, `${row.id}@${row.version}`),\n })),\n );\n if (page.rows.length < pageSize) {\n break;\n }\n currentOffset += pageSize;\n }\n\n return {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: 'listed_remote_processes',\n filters: {\n ids,\n requested_version: requestedVersion,\n requested_user_id: requestedUserId,\n requested_state_codes: requestedStateCodes,\n order,\n all: true,\n limit: null,\n offset: 0,\n page_size: pageSize,\n },\n count: rows.length,\n source_urls: sourceUrls,\n rows,\n };\n }\n\n const limit = toPositiveInteger(\n options.limit ?? DEFAULT_PROCESS_LIST_LIMIT,\n '--limit',\n 'PROCESS_LIST_LIMIT_INVALID',\n );\n const offset = toNonNegativeInteger(\n options.offset ?? 0,\n '--offset',\n 'PROCESS_LIST_OFFSET_INVALID',\n );\n const page = await listProcessRowsWithRetry({\n runtime,\n filters: {\n ids,\n version: requestedVersion,\n userId: requestedUserId,\n stateCodes: requestedStateCodes,\n order,\n limit,\n offset,\n },\n timeoutMs,\n fetchImpl,\n maxAttempts,\n });\n\n return {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: 'listed_remote_processes',\n filters: {\n ids,\n requested_version: requestedVersion,\n requested_user_id: requestedUserId,\n requested_state_codes: requestedStateCodes,\n order,\n all: false,\n limit,\n offset,\n page_size: null,\n },\n count: page.rows.length,\n source_urls: [page.sourceUrl],\n rows: page.rows.map((row) => ({\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n modified_at: row.modified_at,\n process: normalizeSupabaseProcessPayload(row.json, `${row.id}@${row.version}`),\n })),\n };\n}\n\nexport const __testInternals = {\n applyOrder,\n buildProcessListUrl,\n isRetryableError,\n normalizeToken,\n nowIso,\n optionalNonNegativeInteger,\n optionalPositiveInteger,\n parseProcessRows,\n toNonNegativeInteger,\n toPositiveInteger,\n};\n"]}