@tiangong-lca/cli 0.1.2 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -12
- package/dist/src/auth-identity-receipt.d.ts +2 -0
- package/dist/src/auth-identity-receipt.js +2 -0
- package/dist/src/auth-identity-receipt.js.map +1 -0
- package/dist/src/cli.d.ts +4 -0
- package/dist/src/cli.js +264 -7
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/auth-identity-receipt.d.ts +2 -2
- package/dist/src/lib/auth-identity-receipt.js +20 -12
- package/dist/src/lib/auth-identity-receipt.js.map +1 -1
- package/dist/src/lib/env.d.ts +8 -0
- package/dist/src/lib/env.js +36 -3
- package/dist/src/lib/env.js.map +1 -1
- package/dist/src/lib/lca-release.d.ts +1 -1
- package/dist/src/lib/lca-release.js +3 -4
- package/dist/src/lib/lca-release.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-resulting-process.js +6 -2
- package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -1
- package/dist/src/lib/oauth-loopback.d.ts +52 -0
- package/dist/src/lib/oauth-loopback.js +229 -0
- package/dist/src/lib/oauth-loopback.js.map +1 -0
- package/dist/src/lib/oauth-pkce.d.ts +63 -0
- package/dist/src/lib/oauth-pkce.js +268 -0
- package/dist/src/lib/oauth-pkce.js.map +1 -0
- package/dist/src/lib/process-refresh-references.js +2 -2
- package/dist/src/lib/process-refresh-references.js.map +1 -1
- package/dist/src/lib/process-scope-statistics.js +8 -3
- package/dist/src/lib/process-scope-statistics.js.map +1 -1
- package/dist/src/lib/state-lock.js +10 -4
- package/dist/src/lib/state-lock.js.map +1 -1
- package/dist/src/lib/supabase-client.d.ts +13 -1
- package/dist/src/lib/supabase-client.js +64 -3
- package/dist/src/lib/supabase-client.js.map +1 -1
- package/dist/src/lib/supabase-json-ordered-write.js +7 -3
- package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
- package/dist/src/lib/supabase-session.d.ts +63 -8
- package/dist/src/lib/supabase-session.js +315 -21
- package/dist/src/lib/supabase-session.js.map +1 -1
- package/package.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lca-release.js","sourceRoot":"","sources":["../../../src/lib/lca-release.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport path from 'node:path';\nimport { createClient } from '@supabase/supabase-js';\nimport { CliError } from './errors.js';\nimport type { FetchLike, ResponseLike } from './http.js';\nimport { readJsonInput } from './io.js';\nimport {\n buildSupabaseAuthHeaders,\n createSupabaseFetch,\n deriveSupabaseFunctionsBaseUrl,\n requireSupabaseRestRuntime,\n} from './supabase-client.js';\nimport { resolveSupabaseUserSession } from './supabase-session.js';\nimport { fingerprintUserApiKey } from './user-api-key.js';\n\nexport const LCA_RELEASE_ACTIONS = [\n 'prepare',\n 'upload',\n 'finalize',\n 'approve',\n 'publish',\n 'readback-verify',\n 'unpublish',\n 'status',\n 'current',\n 'calculation-bundle',\n 'calculation-artifact',\n 'artifact-download',\n] as const;\n\nexport type LcaReleaseAction = (typeof LCA_RELEASE_ACTIONS)[number];\n\nexport type LcaReleaseOutput = {\n path: string;\n sha256: string;\n byteSize: number;\n mediaType: string;\n};\n\nexport type LcaReleaseReport = {\n schemaVersion: 'tiangong.cli.lca-release.v1';\n action: LcaReleaseAction;\n status: 'planned' | 'completed';\n complete: boolean;\n summary: Record<string, unknown>;\n data?: unknown;\n output?: LcaReleaseOutput;\n request?: Record<string, unknown>;\n warnings: string[];\n nextCommands: string[];\n};\n\nexport type RunLcaReleaseOptions = {\n action: LcaReleaseAction;\n inputPath: string | null;\n outputPath: string | null;\n releaseRunId: string | null;\n packageId: string | null;\n artifactId: string | null;\n artifactPath: string | null;\n env: NodeJS.ProcessEnv;\n timeoutMs: number;\n dryRun: boolean;\n force: boolean;\n fetchImpl: FetchLike;\n};\n\ntype JsonRecord = Record<string, unknown>;\ntype LocalUploadArtifact = {\n profileId: string;\n format: string;\n sha256: string;\n byteSize: number;\n mediaType: string;\n filePath: string;\n};\n\nconst COMMAND_ENDPOINT = 'app_lca_release_commands';\nconst SHA256_PATTERN = /^[0-9a-f]{64}$/u;\nconst REQUIRED_UPLOAD_PAIRS = [\n 'unit-process-full-closure.v1:tidas',\n 'unit-process-full-closure.v1:ilcd',\n 'standalone-lifecyclemodel-result-full-closure.v1:tidas',\n 'standalone-lifecyclemodel-result-full-closure.v1:ilcd',\n] as const;\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction requiredString(value: unknown, field: string): string {\n if (typeof value !== 'string' || !value.trim()) {\n throw new CliError(`Missing required ${field}.`, {\n code: 'LCA_RELEASE_FIELD_REQUIRED',\n exitCode: 2,\n details: { field },\n });\n }\n return value.trim();\n}\n\nfunction requiredId(value: string | null, flag: string): string {\n if (!value) {\n throw new CliError(`Missing required ${flag} value.`, {\n code: 'LCA_RELEASE_ID_REQUIRED',\n exitCode: 2,\n details: { flag },\n });\n }\n return value;\n}\n\nfunction requiredPath(value: string | null, flag: string): string {\n if (!value) {\n throw new CliError(`Missing required ${flag} value.`, {\n code: 'LCA_RELEASE_PATH_REQUIRED',\n exitCode: 2,\n details: { flag },\n });\n }\n return path.resolve(value);\n}\n\nfunction readObjectInput(inputPath: string | null): { inputPath: string; value: JsonRecord } {\n const resolved = requiredPath(inputPath, '--input');\n const value = readJsonInput(resolved);\n if (!isRecord(value)) {\n throw new CliError(`LCA release input must be a JSON object: ${resolved}`, {\n code: 'LCA_RELEASE_INPUT_OBJECT_REQUIRED',\n exitCode: 2,\n });\n }\n return { inputPath: resolved, value };\n}\n\nfunction sha256Bytes(bytes: Uint8Array): string {\n return createHash('sha256').update(bytes).digest('hex');\n}\n\nfunction outputRef(outputPath: string, bytes: Uint8Array, mediaType: string): LcaReleaseOutput {\n return {\n path: outputPath,\n sha256: sha256Bytes(bytes),\n byteSize: bytes.byteLength,\n mediaType,\n };\n}\n\nfunction writeOutput(\n outputPath: string,\n bytes: Uint8Array,\n mediaType: string,\n force: boolean,\n): LcaReleaseOutput {\n if (existsSync(outputPath) && !force) {\n throw new CliError(`Output already exists: ${outputPath}. Use --force to replace it.`, {\n code: 'LCA_RELEASE_OUTPUT_EXISTS',\n exitCode: 2,\n });\n }\n const tempPath = `${outputPath}.${process.pid}.${Date.now()}.tmp`;\n try {\n mkdirSync(path.dirname(outputPath), { recursive: true });\n writeFileSync(tempPath, bytes, { mode: 0o600 });\n renameSync(tempPath, outputPath);\n chmodSync(outputPath, 0o600);\n } catch (error) {\n try {\n rmSync(tempPath, { force: true });\n } catch {\n // Preserve the actionable write failure when the temporary path itself is unreachable.\n }\n throw new CliError(`Failed to write LCA release output: ${outputPath}`, {\n code: 'LCA_RELEASE_OUTPUT_WRITE_FAILED',\n exitCode: 1,\n details: String(error),\n });\n }\n return outputRef(outputPath, bytes, mediaType);\n}\n\nfunction writeJsonOutput(outputPath: string, value: unknown, force: boolean): LcaReleaseOutput {\n const bytes = Buffer.from(`${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n return writeOutput(outputPath, bytes, 'application/json', force);\n}\n\nfunction commandAction(action: LcaReleaseAction): string {\n const mapping: Partial<Record<LcaReleaseAction, string>> = {\n prepare: 'prepare',\n finalize: 'finalize_artifacts',\n approve: 'approve',\n publish: 'publish',\n 'readback-verify': 'readback_verify',\n unpublish: 'unpublish',\n status: 'get_release',\n current: 'get_current',\n 'calculation-bundle': 'get_calculation_bundle',\n 'calculation-artifact': 'get_calculation_bundle',\n 'artifact-download': 'create_artifact_download',\n };\n const result = mapping[action];\n if (!result) {\n throw new CliError(`Action ${action} does not map to a direct release command.`, {\n code: 'LCA_RELEASE_ACTION_NOT_DIRECT',\n exitCode: 2,\n });\n }\n return result;\n}\n\nfunction buildCommandPayload(\n options: RunLcaReleaseOptions,\n userApiKey: string,\n): { body: JsonRecord; inputPath: string | null } {\n if (\n options.action === 'prepare' ||\n options.action === 'finalize' ||\n options.action === 'approve' ||\n options.action === 'publish' ||\n options.action === 'readback-verify' ||\n options.action === 'unpublish'\n ) {\n const input = readObjectInput(options.inputPath);\n const body: JsonRecord = { ...input.value, action: commandAction(options.action) };\n if (options.action === 'publish') {\n body.credentialFingerprint = fingerprintUserApiKey(userApiKey).replace(/^sha256:/u, '');\n }\n return { body, inputPath: input.inputPath };\n }\n if (options.action === 'status') {\n return {\n body: {\n action: commandAction(options.action),\n releaseRunId: requiredId(options.releaseRunId, '--release-run-id'),\n },\n inputPath: null,\n };\n }\n if (options.action === 'current') {\n return { body: { action: commandAction(options.action) }, inputPath: null };\n }\n if (options.action === 'calculation-bundle' || options.action === 'calculation-artifact') {\n return {\n body: {\n action: commandAction(options.action),\n packageId: requiredId(options.packageId, '--package-id'),\n },\n inputPath: null,\n };\n }\n return {\n body: {\n action: commandAction(options.action),\n artifactId: requiredId(options.artifactId, '--artifact-id'),\n },\n inputPath: null,\n };\n}\n\nfunction edgeUrl(apiBaseUrl: string): string {\n return `${deriveSupabaseFunctionsBaseUrl(apiBaseUrl)}/${COMMAND_ENDPOINT}`;\n}\n\nasync function readJsonResponse(response: ResponseLike, url: string): Promise<JsonRecord> {\n const text = await response.text();\n let payload: unknown;\n try {\n payload = JSON.parse(text);\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${url}`, {\n code: 'LCA_RELEASE_REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n if (!isRecord(payload)) {\n throw new CliError(`Remote response was not a JSON object for ${url}`, {\n code: 'LCA_RELEASE_REMOTE_OBJECT_REQUIRED',\n exitCode: 1,\n });\n }\n if (!response.ok || payload.ok === false) {\n const code = typeof payload.code === 'string' ? payload.code : 'LCA_RELEASE_REMOTE_FAILED';\n const message =\n typeof payload.message === 'string'\n ? payload.message\n : `HTTP ${response.status} returned from ${url}`;\n throw new CliError(message, {\n code,\n exitCode: response.status === 401 || response.status === 403 ? 3 : 1,\n details: payload.details ?? payload,\n });\n }\n if (payload.ok !== true || !('data' in payload)) {\n throw new CliError(`Remote release response was missing ok:true and data for ${url}`, {\n code: 'LCA_RELEASE_REMOTE_ENVELOPE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n return payload;\n}\n\nasync function invokeCommand(options: {\n url: string;\n publishableKey: string;\n accessToken: string;\n body: JsonRecord;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<JsonRecord> {\n const response = await options.fetchImpl(options.url, {\n method: 'POST',\n headers: {\n ...buildSupabaseAuthHeaders(options.publishableKey, options.accessToken),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(options.body),\n signal: AbortSignal.timeout(options.timeoutMs),\n });\n return readJsonResponse(response, options.url);\n}\n\nfunction parseLocalUploadArtifacts(value: JsonRecord, inputPath: string): LocalUploadArtifact[] {\n if (!Array.isArray(value.artifacts)) {\n throw new CliError('Release upload input must contain artifacts[].', {\n code: 'LCA_RELEASE_UPLOAD_ARTIFACTS_REQUIRED',\n exitCode: 2,\n });\n }\n const baseDir = path.dirname(inputPath);\n const artifacts = value.artifacts.map((candidate, index) => {\n if (!isRecord(candidate)) {\n throw new CliError(`Release upload artifact ${index} must be a JSON object.`, {\n code: 'LCA_RELEASE_UPLOAD_ARTIFACT_INVALID',\n exitCode: 2,\n });\n }\n const profileId = requiredString(candidate.profileId, `artifacts[${index}].profileId`);\n const format = requiredString(candidate.format, `artifacts[${index}].format`);\n const sha256 = requiredString(candidate.sha256, `artifacts[${index}].sha256`);\n const mediaType = requiredString(candidate.mediaType, `artifacts[${index}].mediaType`);\n const localPath = requiredString(candidate.path, `artifacts[${index}].path`);\n if (!SHA256_PATTERN.test(sha256)) {\n throw new CliError(`Release upload artifact ${index} has an invalid SHA-256.`, {\n code: 'LCA_RELEASE_UPLOAD_HASH_INVALID',\n exitCode: 2,\n });\n }\n if (!Number.isSafeInteger(candidate.byteSize) || Number(candidate.byteSize) <= 0) {\n throw new CliError(`Release upload artifact ${index} has an invalid byteSize.`, {\n code: 'LCA_RELEASE_UPLOAD_SIZE_INVALID',\n exitCode: 2,\n });\n }\n if (mediaType !== 'application/zip') {\n throw new CliError(`Release upload artifact ${index} must use application/zip.`, {\n code: 'LCA_RELEASE_UPLOAD_MEDIA_TYPE_INVALID',\n exitCode: 2,\n });\n }\n const filePath = path.isAbsolute(localPath) ? localPath : path.resolve(baseDir, localPath);\n if (!existsSync(filePath) || !statSync(filePath).isFile()) {\n throw new CliError(`Release upload artifact file not found: ${filePath}`, {\n code: 'LCA_RELEASE_UPLOAD_FILE_NOT_FOUND',\n exitCode: 2,\n });\n }\n const bytes = readFileSync(filePath);\n if (bytes.byteLength !== Number(candidate.byteSize)) {\n throw new CliError(`Release upload artifact byte size mismatch: ${filePath}`, {\n code: 'LCA_RELEASE_UPLOAD_SIZE_MISMATCH',\n exitCode: 2,\n });\n }\n if (sha256Bytes(bytes) !== sha256) {\n throw new CliError(`Release upload artifact SHA-256 mismatch: ${filePath}`, {\n code: 'LCA_RELEASE_UPLOAD_HASH_MISMATCH',\n exitCode: 2,\n });\n }\n return {\n profileId,\n format,\n sha256,\n byteSize: bytes.byteLength,\n mediaType,\n filePath,\n };\n });\n const pairs = artifacts.map((artifact) => `${artifact.profileId}:${artifact.format}`);\n if (\n artifacts.length !== REQUIRED_UPLOAD_PAIRS.length ||\n new Set(pairs).size !== REQUIRED_UPLOAD_PAIRS.length ||\n REQUIRED_UPLOAD_PAIRS.some((pair) => !pairs.includes(pair))\n ) {\n throw new CliError('Release upload requires each TIDAS/ILCD profile pair exactly once.', {\n code: 'LCA_RELEASE_UPLOAD_SET_INVALID',\n exitCode: 2,\n details: { expected: REQUIRED_UPLOAD_PAIRS, actual: pairs },\n });\n }\n return artifacts.sort(\n (left, right) =>\n REQUIRED_UPLOAD_PAIRS.indexOf(`${left.profileId}:${left.format}` as never) -\n REQUIRED_UPLOAD_PAIRS.indexOf(`${right.profileId}:${right.format}` as never),\n );\n}\n\nfunction parseUploadResponse(payload: JsonRecord, local: LocalUploadArtifact[]) {\n const responseArtifacts = payload.data;\n if (!Array.isArray(responseArtifacts) || responseArtifacts.length !== local.length) {\n throw new CliError('Release upload URL response did not contain all four artifacts.', {\n code: 'LCA_RELEASE_UPLOAD_URLS_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n return local.map((artifact) => {\n const match = responseArtifacts.find(\n (candidate) =>\n isRecord(candidate) &&\n candidate.profileId === artifact.profileId &&\n candidate.format === artifact.format,\n );\n if (!isRecord(match)) {\n throw new CliError(\n `Release upload URL is missing ${artifact.profileId}:${artifact.format}.`,\n {\n code: 'LCA_RELEASE_UPLOAD_URL_MISSING',\n exitCode: 1,\n },\n );\n }\n if (\n match.sha256 !== artifact.sha256 ||\n match.byteSize !== artifact.byteSize ||\n match.mediaType !== artifact.mediaType\n ) {\n throw new CliError(`Release upload URL metadata drifted for ${artifact.filePath}.`, {\n code: 'LCA_RELEASE_UPLOAD_URL_METADATA_MISMATCH',\n exitCode: 1,\n });\n }\n return {\n local: artifact,\n storageBucket: requiredString(match.storageBucket, 'storageBucket'),\n objectKey: requiredString(match.objectKey, 'objectKey'),\n token: requiredString(match.token, 'token'),\n };\n });\n}\n\nasync function runUpload(\n options: RunLcaReleaseOptions,\n runtime: ReturnType<typeof requireSupabaseRestRuntime>,\n url: string,\n): Promise<LcaReleaseReport> {\n const input = readObjectInput(options.inputPath);\n const outputPath = requiredPath(options.outputPath, '--output');\n const releaseRunId = requiredString(input.value.releaseRunId, 'releaseRunId');\n const publishPlanHash = requiredString(input.value.publishPlanHash, 'publishPlanHash');\n const artifacts = parseLocalUploadArtifacts(input.value, input.inputPath);\n const requestBody = {\n action: 'create_artifact_uploads',\n releaseRunId,\n publishPlanHash,\n artifacts: artifacts.map((artifact) => ({\n profileId: artifact.profileId,\n format: artifact.format,\n sha256: artifact.sha256,\n byteSize: artifact.byteSize,\n mediaType: artifact.mediaType,\n })),\n };\n if (options.dryRun) {\n return {\n schemaVersion: 'tiangong.cli.lca-release.v1',\n action: 'upload',\n status: 'planned',\n complete: false,\n summary: { releaseRunId, artifactCount: artifacts.length, outputPath },\n request: {\n method: 'POST',\n url,\n headers: { Authorization: 'Bearer ****', apikey: '****' },\n body: requestBody,\n plannedUploads: artifacts.map((artifact) => artifact.filePath),\n },\n warnings: [],\n nextCommands: [\n `tiangong-lca release upload --input ${input.inputPath} --output ${outputPath}`,\n ],\n };\n }\n\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const signed = await invokeCommand({\n url,\n publishableKey: runtime.publishableKey,\n accessToken: session.accessToken,\n body: requestBody,\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n const uploads = parseUploadResponse(signed, artifacts);\n const storage = createClient(session.projectBaseUrl, runtime.publishableKey, {\n auth: { autoRefreshToken: false, persistSession: false, detectSessionInUrl: false },\n global: { fetch: createSupabaseFetch(options.fetchImpl, options.timeoutMs) },\n });\n for (const upload of uploads) {\n const result = await storage.storage\n .from(upload.storageBucket)\n .uploadToSignedUrl(upload.objectKey, upload.token, readFileSync(upload.local.filePath), {\n contentType: upload.local.mediaType,\n cacheControl: '31536000',\n });\n if (result.error) {\n throw new CliError(`Failed to upload release artifact: ${upload.local.filePath}`, {\n code: 'LCA_RELEASE_ARTIFACT_UPLOAD_FAILED',\n exitCode: 1,\n details: result.error.message,\n });\n }\n }\n const receipt = {\n schemaVersion: 'tiangong.release-upload-receipt.v1',\n releaseRunId,\n publishPlanHash,\n artifacts: uploads.map((upload) => ({\n profileId: upload.local.profileId,\n format: upload.local.format,\n storageBucket: upload.storageBucket,\n objectKey: upload.objectKey,\n sha256: upload.local.sha256,\n byteSize: upload.local.byteSize,\n mediaType: upload.local.mediaType,\n })),\n };\n const output = writeJsonOutput(outputPath, receipt, options.force);\n return {\n schemaVersion: 'tiangong.cli.lca-release.v1',\n action: 'upload',\n status: 'completed',\n complete: true,\n summary: { releaseRunId, artifactCount: uploads.length },\n data: receipt,\n output,\n warnings: [],\n nextCommands: ['tiangong-lca release finalize --input ./release-finalize.json --json'],\n };\n}\n\nasync function downloadBytes(\n signedUrl: string,\n timeoutMs: number,\n fetchImpl: FetchLike,\n): Promise<Uint8Array> {\n const response = await fetchImpl(signedUrl, {\n method: 'GET',\n headers: { Accept: 'application/octet-stream' },\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!response.ok) {\n throw new CliError(`HTTP ${response.status} returned while downloading ${signedUrl}`, {\n code: 'LCA_RELEASE_DOWNLOAD_FAILED',\n exitCode: 1,\n });\n }\n if (!response.arrayBuffer) {\n throw new CliError('Download transport did not provide binary response support.', {\n code: 'LCA_RELEASE_DOWNLOAD_BINARY_UNAVAILABLE',\n exitCode: 1,\n });\n }\n return new Uint8Array(await response.arrayBuffer());\n}\n\nfunction selectDownload(\n action: 'artifact-download' | 'calculation-artifact',\n data: unknown,\n artifactPath: string | null,\n): JsonRecord {\n const root = isRecord(data) ? data : {};\n if (action === 'artifact-download') return root;\n const bundle = isRecord(root.calculationBundle) ? root.calculationBundle : {};\n const artifacts = Array.isArray(bundle.artifacts) ? bundle.artifacts : [];\n const requested = requiredId(artifactPath, '--artifact-path');\n const selected = artifacts.find((artifact) => isRecord(artifact) && artifact.path === requested);\n if (!isRecord(selected)) {\n const candidates = artifacts\n .filter(isRecord)\n .map((artifact) => artifact.path)\n .filter((value): value is string => typeof value === 'string')\n .slice(0, 20);\n throw new CliError(`Calculation Bundle artifact not found: ${requested}`, {\n code: 'LCA_RELEASE_CALCULATION_ARTIFACT_NOT_FOUND',\n exitCode: 2,\n details: { candidates, total: artifacts.length },\n });\n }\n return selected;\n}\n\nasync function writeDownload(\n options: RunLcaReleaseOptions,\n data: unknown,\n): Promise<{ output: LcaReleaseOutput; selected: JsonRecord }> {\n const outputPath = requiredPath(options.outputPath, '--output');\n const selected = selectDownload(\n options.action as 'artifact-download' | 'calculation-artifact',\n data,\n options.artifactPath,\n );\n const signedUrl = requiredString(selected.signedDownloadUrl, 'signedDownloadUrl');\n const expectedSha256 = requiredString(selected.sha256, 'sha256');\n const expectedByteSize = selected.byteSize;\n if (!Number.isSafeInteger(expectedByteSize) || Number(expectedByteSize) < 0) {\n throw new CliError('Download metadata contains an invalid byteSize.', {\n code: 'LCA_RELEASE_DOWNLOAD_SIZE_INVALID',\n exitCode: 1,\n });\n }\n const bytes = await downloadBytes(signedUrl, options.timeoutMs, options.fetchImpl);\n if (bytes.byteLength !== Number(expectedByteSize)) {\n throw new CliError('Downloaded artifact byte size differs from the durable reference.', {\n code: 'LCA_RELEASE_DOWNLOAD_SIZE_MISMATCH',\n exitCode: 1,\n details: { expected: expectedByteSize, actual: bytes.byteLength },\n });\n }\n const observedSha256 = sha256Bytes(bytes);\n if (observedSha256 !== expectedSha256) {\n throw new CliError('Downloaded artifact SHA-256 differs from the durable reference.', {\n code: 'LCA_RELEASE_DOWNLOAD_HASH_MISMATCH',\n exitCode: 1,\n details: { expected: expectedSha256, actual: observedSha256 },\n });\n }\n const mediaType =\n typeof selected.mediaType === 'string' ? selected.mediaType : 'application/octet-stream';\n return {\n output: writeOutput(outputPath, bytes, mediaType, options.force),\n selected,\n };\n}\n\nfunction nextCommands(action: LcaReleaseAction, data: unknown): string[] {\n const record = isRecord(data) ? data : {};\n const releaseRunId = typeof record.releaseRunId === 'string' ? record.releaseRunId : '<run-id>';\n const mapping: Partial<Record<LcaReleaseAction, string[]>> = {\n prepare: [\n 'tiangong-lca release upload --input ./release-upload.json --output ./upload-receipt.json',\n ],\n upload: ['tiangong-lca release finalize --input ./release-finalize.json --json'],\n finalize: ['tiangong-lca release approve --input ./release-approval.json --json'],\n approve: ['tiangong-lca release publish --input ./release-publish.json --json'],\n publish: ['tiangong-lca release readback-verify --input ./release-readback.json --json'],\n 'readback-verify': [`tiangong-lca release status --release-run-id ${releaseRunId} --json`],\n unpublish: ['tiangong-lca release current --json'],\n status: [],\n current: [],\n 'calculation-bundle': [\n 'tiangong-lca release calculation-artifact --package-id <package-id> --artifact-path <path> --output ./result.jsonl.gz',\n ],\n 'calculation-artifact': [],\n 'artifact-download': [],\n };\n return mapping[action] ?? [];\n}\n\nfunction summarize(action: LcaReleaseAction, data: unknown): Record<string, unknown> {\n const record = isRecord(data) ? data : {};\n if (action === 'calculation-bundle') {\n const bundle = isRecord(record.calculationBundle) ? record.calculationBundle : {};\n const manifest = isRecord(bundle.manifest) ? bundle.manifest : {};\n const artifacts = Array.isArray(bundle.artifacts) ? bundle.artifacts : [];\n const scope = isRecord(manifest.scope) ? manifest.scope : {};\n return {\n packageId: record.packageId ?? null,\n calculationId: bundle.calculationId ?? null,\n bundleContentHash: bundle.bundleContentHash ?? null,\n processCount: scope.processCount ?? null,\n artifactCount: artifacts.length,\n };\n }\n return {\n releaseRunId: record.releaseRunId ?? null,\n releaseVersion: record.releaseVersion ?? null,\n status: record.status ?? 'completed',\n };\n}\n\nexport async function runLcaRelease(options: RunLcaReleaseOptions): Promise<LcaReleaseReport> {\n const runtime = requireSupabaseRestRuntime(options.env);\n const url = edgeUrl(runtime.apiBaseUrl);\n if (options.action === 'upload') return runUpload(options, runtime, url);\n\n const command = buildCommandPayload(options, runtime.userApiKey);\n if (options.dryRun) {\n return {\n schemaVersion: 'tiangong.cli.lca-release.v1',\n action: options.action,\n status: 'planned',\n complete: false,\n summary: { inputPath: command.inputPath },\n request: {\n method: 'POST',\n url,\n headers: { Authorization: 'Bearer ****', apikey: '****' },\n body: command.body,\n },\n warnings: [],\n nextCommands: [],\n };\n }\n\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const envelope = await invokeCommand({\n url,\n publishableKey: runtime.publishableKey,\n accessToken: session.accessToken,\n body: command.body,\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n const data = envelope.data;\n\n if (options.action === 'artifact-download' || options.action === 'calculation-artifact') {\n const downloaded = await writeDownload(options, data);\n return {\n schemaVersion: 'tiangong.cli.lca-release.v1',\n action: options.action,\n status: 'completed',\n complete: true,\n summary: {\n artifactId: downloaded.selected.artifactId ?? null,\n artifactPath: downloaded.selected.path ?? null,\n },\n output: downloaded.output,\n warnings: [],\n nextCommands: [],\n };\n }\n\n let output: LcaReleaseOutput | undefined;\n if (options.action === 'calculation-bundle') {\n output = writeJsonOutput(requiredPath(options.outputPath, '--output'), data, options.force);\n } else if (options.outputPath) {\n output = writeJsonOutput(path.resolve(options.outputPath), data, options.force);\n }\n return {\n schemaVersion: 'tiangong.cli.lca-release.v1',\n action: options.action,\n status: 'completed',\n complete: true,\n summary: summarize(options.action, data),\n ...(output ? { output } : { data }),\n warnings: [],\n nextCommands: nextCommands(options.action, data),\n };\n}\n\nexport function renderLcaReleaseReport(report: LcaReleaseReport): string {\n const lines = [\n `LCA release ${report.action}: ${report.status}`,\n '',\n 'Summary:',\n ...Object.entries(report.summary).map(\n ([key, value]) => `- ${key}: ${typeof value === 'string' ? value : JSON.stringify(value)}`,\n ),\n `- complete: ${report.complete}`,\n ];\n if (report.output) lines.push(`- output: ${report.output.path} (${report.output.sha256})`);\n lines.push('', 'Next:');\n if (report.nextCommands.length === 0) lines.push('- none');\n for (const command of report.nextCommands) lines.push(`- ${command}`);\n return `${lines.join('\\n')}\\n`;\n}\n\nexport const __testInternals = {\n buildCommandPayload,\n commandAction,\n downloadBytes,\n edgeUrl,\n invokeCommand,\n isRecord,\n nextCommands,\n outputRef,\n parseLocalUploadArtifacts,\n parseUploadResponse,\n readJsonResponse,\n requiredId,\n requiredPath,\n requiredString,\n runUpload,\n selectDownload,\n sha256Bytes,\n summarize,\n writeJsonOutput,\n writeOutput,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"lca-release.js","sourceRoot":"","sources":["../../../src/lib/lca-release.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport path from 'node:path';\nimport { createClient } from '@supabase/supabase-js';\nimport { CliError } from './errors.js';\nimport type { FetchLike, ResponseLike } from './http.js';\nimport { readJsonInput } from './io.js';\nimport {\n buildSupabaseAuthHeaders,\n createSupabaseFetch,\n deriveSupabaseFunctionsBaseUrl,\n requireSupabaseRestRuntime,\n} from './supabase-client.js';\nimport { resolveSupabaseUserSession } from './supabase-session.js';\n\nexport const LCA_RELEASE_ACTIONS = [\n 'prepare',\n 'upload',\n 'finalize',\n 'approve',\n 'publish',\n 'readback-verify',\n 'unpublish',\n 'status',\n 'current',\n 'calculation-bundle',\n 'calculation-artifact',\n 'artifact-download',\n] as const;\n\nexport type LcaReleaseAction = (typeof LCA_RELEASE_ACTIONS)[number];\n\nexport type LcaReleaseOutput = {\n path: string;\n sha256: string;\n byteSize: number;\n mediaType: string;\n};\n\nexport type LcaReleaseReport = {\n schemaVersion: 'tiangong.cli.lca-release.v1';\n action: LcaReleaseAction;\n status: 'planned' | 'completed';\n complete: boolean;\n summary: Record<string, unknown>;\n data?: unknown;\n output?: LcaReleaseOutput;\n request?: Record<string, unknown>;\n warnings: string[];\n nextCommands: string[];\n};\n\nexport type RunLcaReleaseOptions = {\n action: LcaReleaseAction;\n inputPath: string | null;\n outputPath: string | null;\n releaseRunId: string | null;\n packageId: string | null;\n artifactId: string | null;\n artifactPath: string | null;\n env: NodeJS.ProcessEnv;\n timeoutMs: number;\n dryRun: boolean;\n force: boolean;\n fetchImpl: FetchLike;\n};\n\ntype JsonRecord = Record<string, unknown>;\ntype LocalUploadArtifact = {\n profileId: string;\n format: string;\n sha256: string;\n byteSize: number;\n mediaType: string;\n filePath: string;\n};\n\nconst COMMAND_ENDPOINT = 'app_lca_release_commands';\nconst SHA256_PATTERN = /^[0-9a-f]{64}$/u;\nconst REQUIRED_UPLOAD_PAIRS = [\n 'unit-process-full-closure.v1:tidas',\n 'unit-process-full-closure.v1:ilcd',\n 'standalone-lifecyclemodel-result-full-closure.v1:tidas',\n 'standalone-lifecyclemodel-result-full-closure.v1:ilcd',\n] as const;\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction requiredString(value: unknown, field: string): string {\n if (typeof value !== 'string' || !value.trim()) {\n throw new CliError(`Missing required ${field}.`, {\n code: 'LCA_RELEASE_FIELD_REQUIRED',\n exitCode: 2,\n details: { field },\n });\n }\n return value.trim();\n}\n\nfunction requiredId(value: string | null, flag: string): string {\n if (!value) {\n throw new CliError(`Missing required ${flag} value.`, {\n code: 'LCA_RELEASE_ID_REQUIRED',\n exitCode: 2,\n details: { flag },\n });\n }\n return value;\n}\n\nfunction requiredPath(value: string | null, flag: string): string {\n if (!value) {\n throw new CliError(`Missing required ${flag} value.`, {\n code: 'LCA_RELEASE_PATH_REQUIRED',\n exitCode: 2,\n details: { flag },\n });\n }\n return path.resolve(value);\n}\n\nfunction readObjectInput(inputPath: string | null): { inputPath: string; value: JsonRecord } {\n const resolved = requiredPath(inputPath, '--input');\n const value = readJsonInput(resolved);\n if (!isRecord(value)) {\n throw new CliError(`LCA release input must be a JSON object: ${resolved}`, {\n code: 'LCA_RELEASE_INPUT_OBJECT_REQUIRED',\n exitCode: 2,\n });\n }\n return { inputPath: resolved, value };\n}\n\nfunction sha256Bytes(bytes: Uint8Array): string {\n return createHash('sha256').update(bytes).digest('hex');\n}\n\nfunction outputRef(outputPath: string, bytes: Uint8Array, mediaType: string): LcaReleaseOutput {\n return {\n path: outputPath,\n sha256: sha256Bytes(bytes),\n byteSize: bytes.byteLength,\n mediaType,\n };\n}\n\nfunction writeOutput(\n outputPath: string,\n bytes: Uint8Array,\n mediaType: string,\n force: boolean,\n): LcaReleaseOutput {\n if (existsSync(outputPath) && !force) {\n throw new CliError(`Output already exists: ${outputPath}. Use --force to replace it.`, {\n code: 'LCA_RELEASE_OUTPUT_EXISTS',\n exitCode: 2,\n });\n }\n const tempPath = `${outputPath}.${process.pid}.${Date.now()}.tmp`;\n try {\n mkdirSync(path.dirname(outputPath), { recursive: true });\n writeFileSync(tempPath, bytes, { mode: 0o600 });\n renameSync(tempPath, outputPath);\n chmodSync(outputPath, 0o600);\n } catch (error) {\n try {\n rmSync(tempPath, { force: true });\n } catch {\n // Preserve the actionable write failure when the temporary path itself is unreachable.\n }\n throw new CliError(`Failed to write LCA release output: ${outputPath}`, {\n code: 'LCA_RELEASE_OUTPUT_WRITE_FAILED',\n exitCode: 1,\n details: String(error),\n });\n }\n return outputRef(outputPath, bytes, mediaType);\n}\n\nfunction writeJsonOutput(outputPath: string, value: unknown, force: boolean): LcaReleaseOutput {\n const bytes = Buffer.from(`${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n return writeOutput(outputPath, bytes, 'application/json', force);\n}\n\nfunction commandAction(action: LcaReleaseAction): string {\n const mapping: Partial<Record<LcaReleaseAction, string>> = {\n prepare: 'prepare',\n finalize: 'finalize_artifacts',\n approve: 'approve',\n publish: 'publish',\n 'readback-verify': 'readback_verify',\n unpublish: 'unpublish',\n status: 'get_release',\n current: 'get_current',\n 'calculation-bundle': 'get_calculation_bundle',\n 'calculation-artifact': 'get_calculation_bundle',\n 'artifact-download': 'create_artifact_download',\n };\n const result = mapping[action];\n if (!result) {\n throw new CliError(`Action ${action} does not map to a direct release command.`, {\n code: 'LCA_RELEASE_ACTION_NOT_DIRECT',\n exitCode: 2,\n });\n }\n return result;\n}\n\nfunction buildCommandPayload(options: RunLcaReleaseOptions): {\n body: JsonRecord;\n inputPath: string | null;\n} {\n if (\n options.action === 'prepare' ||\n options.action === 'finalize' ||\n options.action === 'approve' ||\n options.action === 'publish' ||\n options.action === 'readback-verify' ||\n options.action === 'unpublish'\n ) {\n const input = readObjectInput(options.inputPath);\n const body: JsonRecord = { ...input.value, action: commandAction(options.action) };\n if (options.action === 'publish') {\n delete body.credentialFingerprint;\n }\n return { body, inputPath: input.inputPath };\n }\n if (options.action === 'status') {\n return {\n body: {\n action: commandAction(options.action),\n releaseRunId: requiredId(options.releaseRunId, '--release-run-id'),\n },\n inputPath: null,\n };\n }\n if (options.action === 'current') {\n return { body: { action: commandAction(options.action) }, inputPath: null };\n }\n if (options.action === 'calculation-bundle' || options.action === 'calculation-artifact') {\n return {\n body: {\n action: commandAction(options.action),\n packageId: requiredId(options.packageId, '--package-id'),\n },\n inputPath: null,\n };\n }\n return {\n body: {\n action: commandAction(options.action),\n artifactId: requiredId(options.artifactId, '--artifact-id'),\n },\n inputPath: null,\n };\n}\n\nfunction edgeUrl(apiBaseUrl: string): string {\n return `${deriveSupabaseFunctionsBaseUrl(apiBaseUrl)}/${COMMAND_ENDPOINT}`;\n}\n\nasync function readJsonResponse(response: ResponseLike, url: string): Promise<JsonRecord> {\n const text = await response.text();\n let payload: unknown;\n try {\n payload = JSON.parse(text);\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${url}`, {\n code: 'LCA_RELEASE_REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n if (!isRecord(payload)) {\n throw new CliError(`Remote response was not a JSON object for ${url}`, {\n code: 'LCA_RELEASE_REMOTE_OBJECT_REQUIRED',\n exitCode: 1,\n });\n }\n if (!response.ok || payload.ok === false) {\n const code = typeof payload.code === 'string' ? payload.code : 'LCA_RELEASE_REMOTE_FAILED';\n const message =\n typeof payload.message === 'string'\n ? payload.message\n : `HTTP ${response.status} returned from ${url}`;\n throw new CliError(message, {\n code,\n exitCode: response.status === 401 || response.status === 403 ? 3 : 1,\n details: payload.details ?? payload,\n });\n }\n if (payload.ok !== true || !('data' in payload)) {\n throw new CliError(`Remote release response was missing ok:true and data for ${url}`, {\n code: 'LCA_RELEASE_REMOTE_ENVELOPE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n return payload;\n}\n\nasync function invokeCommand(options: {\n url: string;\n publishableKey: string;\n accessToken: string;\n body: JsonRecord;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<JsonRecord> {\n const response = await options.fetchImpl(options.url, {\n method: 'POST',\n headers: {\n ...buildSupabaseAuthHeaders(options.publishableKey, options.accessToken),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(options.body),\n signal: AbortSignal.timeout(options.timeoutMs),\n });\n return readJsonResponse(response, options.url);\n}\n\nfunction parseLocalUploadArtifacts(value: JsonRecord, inputPath: string): LocalUploadArtifact[] {\n if (!Array.isArray(value.artifacts)) {\n throw new CliError('Release upload input must contain artifacts[].', {\n code: 'LCA_RELEASE_UPLOAD_ARTIFACTS_REQUIRED',\n exitCode: 2,\n });\n }\n const baseDir = path.dirname(inputPath);\n const artifacts = value.artifacts.map((candidate, index) => {\n if (!isRecord(candidate)) {\n throw new CliError(`Release upload artifact ${index} must be a JSON object.`, {\n code: 'LCA_RELEASE_UPLOAD_ARTIFACT_INVALID',\n exitCode: 2,\n });\n }\n const profileId = requiredString(candidate.profileId, `artifacts[${index}].profileId`);\n const format = requiredString(candidate.format, `artifacts[${index}].format`);\n const sha256 = requiredString(candidate.sha256, `artifacts[${index}].sha256`);\n const mediaType = requiredString(candidate.mediaType, `artifacts[${index}].mediaType`);\n const localPath = requiredString(candidate.path, `artifacts[${index}].path`);\n if (!SHA256_PATTERN.test(sha256)) {\n throw new CliError(`Release upload artifact ${index} has an invalid SHA-256.`, {\n code: 'LCA_RELEASE_UPLOAD_HASH_INVALID',\n exitCode: 2,\n });\n }\n if (!Number.isSafeInteger(candidate.byteSize) || Number(candidate.byteSize) <= 0) {\n throw new CliError(`Release upload artifact ${index} has an invalid byteSize.`, {\n code: 'LCA_RELEASE_UPLOAD_SIZE_INVALID',\n exitCode: 2,\n });\n }\n if (mediaType !== 'application/zip') {\n throw new CliError(`Release upload artifact ${index} must use application/zip.`, {\n code: 'LCA_RELEASE_UPLOAD_MEDIA_TYPE_INVALID',\n exitCode: 2,\n });\n }\n const filePath = path.isAbsolute(localPath) ? localPath : path.resolve(baseDir, localPath);\n if (!existsSync(filePath) || !statSync(filePath).isFile()) {\n throw new CliError(`Release upload artifact file not found: ${filePath}`, {\n code: 'LCA_RELEASE_UPLOAD_FILE_NOT_FOUND',\n exitCode: 2,\n });\n }\n const bytes = readFileSync(filePath);\n if (bytes.byteLength !== Number(candidate.byteSize)) {\n throw new CliError(`Release upload artifact byte size mismatch: ${filePath}`, {\n code: 'LCA_RELEASE_UPLOAD_SIZE_MISMATCH',\n exitCode: 2,\n });\n }\n if (sha256Bytes(bytes) !== sha256) {\n throw new CliError(`Release upload artifact SHA-256 mismatch: ${filePath}`, {\n code: 'LCA_RELEASE_UPLOAD_HASH_MISMATCH',\n exitCode: 2,\n });\n }\n return {\n profileId,\n format,\n sha256,\n byteSize: bytes.byteLength,\n mediaType,\n filePath,\n };\n });\n const pairs = artifacts.map((artifact) => `${artifact.profileId}:${artifact.format}`);\n if (\n artifacts.length !== REQUIRED_UPLOAD_PAIRS.length ||\n new Set(pairs).size !== REQUIRED_UPLOAD_PAIRS.length ||\n REQUIRED_UPLOAD_PAIRS.some((pair) => !pairs.includes(pair))\n ) {\n throw new CliError('Release upload requires each TIDAS/ILCD profile pair exactly once.', {\n code: 'LCA_RELEASE_UPLOAD_SET_INVALID',\n exitCode: 2,\n details: { expected: REQUIRED_UPLOAD_PAIRS, actual: pairs },\n });\n }\n return artifacts.sort(\n (left, right) =>\n REQUIRED_UPLOAD_PAIRS.indexOf(`${left.profileId}:${left.format}` as never) -\n REQUIRED_UPLOAD_PAIRS.indexOf(`${right.profileId}:${right.format}` as never),\n );\n}\n\nfunction parseUploadResponse(payload: JsonRecord, local: LocalUploadArtifact[]) {\n const responseArtifacts = payload.data;\n if (!Array.isArray(responseArtifacts) || responseArtifacts.length !== local.length) {\n throw new CliError('Release upload URL response did not contain all four artifacts.', {\n code: 'LCA_RELEASE_UPLOAD_URLS_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n return local.map((artifact) => {\n const match = responseArtifacts.find(\n (candidate) =>\n isRecord(candidate) &&\n candidate.profileId === artifact.profileId &&\n candidate.format === artifact.format,\n );\n if (!isRecord(match)) {\n throw new CliError(\n `Release upload URL is missing ${artifact.profileId}:${artifact.format}.`,\n {\n code: 'LCA_RELEASE_UPLOAD_URL_MISSING',\n exitCode: 1,\n },\n );\n }\n if (\n match.sha256 !== artifact.sha256 ||\n match.byteSize !== artifact.byteSize ||\n match.mediaType !== artifact.mediaType\n ) {\n throw new CliError(`Release upload URL metadata drifted for ${artifact.filePath}.`, {\n code: 'LCA_RELEASE_UPLOAD_URL_METADATA_MISMATCH',\n exitCode: 1,\n });\n }\n return {\n local: artifact,\n storageBucket: requiredString(match.storageBucket, 'storageBucket'),\n objectKey: requiredString(match.objectKey, 'objectKey'),\n token: requiredString(match.token, 'token'),\n };\n });\n}\n\nasync function runUpload(\n options: RunLcaReleaseOptions,\n runtime: ReturnType<typeof requireSupabaseRestRuntime>,\n url: string,\n): Promise<LcaReleaseReport> {\n const input = readObjectInput(options.inputPath);\n const outputPath = requiredPath(options.outputPath, '--output');\n const releaseRunId = requiredString(input.value.releaseRunId, 'releaseRunId');\n const publishPlanHash = requiredString(input.value.publishPlanHash, 'publishPlanHash');\n const artifacts = parseLocalUploadArtifacts(input.value, input.inputPath);\n const requestBody = {\n action: 'create_artifact_uploads',\n releaseRunId,\n publishPlanHash,\n artifacts: artifacts.map((artifact) => ({\n profileId: artifact.profileId,\n format: artifact.format,\n sha256: artifact.sha256,\n byteSize: artifact.byteSize,\n mediaType: artifact.mediaType,\n })),\n };\n if (options.dryRun) {\n return {\n schemaVersion: 'tiangong.cli.lca-release.v1',\n action: 'upload',\n status: 'planned',\n complete: false,\n summary: { releaseRunId, artifactCount: artifacts.length, outputPath },\n request: {\n method: 'POST',\n url,\n headers: { Authorization: 'Bearer ****', apikey: '****' },\n body: requestBody,\n plannedUploads: artifacts.map((artifact) => artifact.filePath),\n },\n warnings: [],\n nextCommands: [\n `tiangong-lca release upload --input ${input.inputPath} --output ${outputPath}`,\n ],\n };\n }\n\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const signed = await invokeCommand({\n url,\n publishableKey: runtime.publishableKey,\n accessToken: session.accessToken,\n body: requestBody,\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n const uploads = parseUploadResponse(signed, artifacts);\n const storage = createClient(session.projectBaseUrl, runtime.publishableKey, {\n auth: { autoRefreshToken: false, persistSession: false, detectSessionInUrl: false },\n global: { fetch: createSupabaseFetch(options.fetchImpl, options.timeoutMs) },\n });\n for (const upload of uploads) {\n const result = await storage.storage\n .from(upload.storageBucket)\n .uploadToSignedUrl(upload.objectKey, upload.token, readFileSync(upload.local.filePath), {\n contentType: upload.local.mediaType,\n cacheControl: '31536000',\n });\n if (result.error) {\n throw new CliError(`Failed to upload release artifact: ${upload.local.filePath}`, {\n code: 'LCA_RELEASE_ARTIFACT_UPLOAD_FAILED',\n exitCode: 1,\n details: result.error.message,\n });\n }\n }\n const receipt = {\n schemaVersion: 'tiangong.release-upload-receipt.v1',\n releaseRunId,\n publishPlanHash,\n artifacts: uploads.map((upload) => ({\n profileId: upload.local.profileId,\n format: upload.local.format,\n storageBucket: upload.storageBucket,\n objectKey: upload.objectKey,\n sha256: upload.local.sha256,\n byteSize: upload.local.byteSize,\n mediaType: upload.local.mediaType,\n })),\n };\n const output = writeJsonOutput(outputPath, receipt, options.force);\n return {\n schemaVersion: 'tiangong.cli.lca-release.v1',\n action: 'upload',\n status: 'completed',\n complete: true,\n summary: { releaseRunId, artifactCount: uploads.length },\n data: receipt,\n output,\n warnings: [],\n nextCommands: ['tiangong-lca release finalize --input ./release-finalize.json --json'],\n };\n}\n\nasync function downloadBytes(\n signedUrl: string,\n timeoutMs: number,\n fetchImpl: FetchLike,\n): Promise<Uint8Array> {\n const response = await fetchImpl(signedUrl, {\n method: 'GET',\n headers: { Accept: 'application/octet-stream' },\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!response.ok) {\n throw new CliError(`HTTP ${response.status} returned while downloading ${signedUrl}`, {\n code: 'LCA_RELEASE_DOWNLOAD_FAILED',\n exitCode: 1,\n });\n }\n if (!response.arrayBuffer) {\n throw new CliError('Download transport did not provide binary response support.', {\n code: 'LCA_RELEASE_DOWNLOAD_BINARY_UNAVAILABLE',\n exitCode: 1,\n });\n }\n return new Uint8Array(await response.arrayBuffer());\n}\n\nfunction selectDownload(\n action: 'artifact-download' | 'calculation-artifact',\n data: unknown,\n artifactPath: string | null,\n): JsonRecord {\n const root = isRecord(data) ? data : {};\n if (action === 'artifact-download') return root;\n const bundle = isRecord(root.calculationBundle) ? root.calculationBundle : {};\n const artifacts = Array.isArray(bundle.artifacts) ? bundle.artifacts : [];\n const requested = requiredId(artifactPath, '--artifact-path');\n const selected = artifacts.find((artifact) => isRecord(artifact) && artifact.path === requested);\n if (!isRecord(selected)) {\n const candidates = artifacts\n .filter(isRecord)\n .map((artifact) => artifact.path)\n .filter((value): value is string => typeof value === 'string')\n .slice(0, 20);\n throw new CliError(`Calculation Bundle artifact not found: ${requested}`, {\n code: 'LCA_RELEASE_CALCULATION_ARTIFACT_NOT_FOUND',\n exitCode: 2,\n details: { candidates, total: artifacts.length },\n });\n }\n return selected;\n}\n\nasync function writeDownload(\n options: RunLcaReleaseOptions,\n data: unknown,\n): Promise<{ output: LcaReleaseOutput; selected: JsonRecord }> {\n const outputPath = requiredPath(options.outputPath, '--output');\n const selected = selectDownload(\n options.action as 'artifact-download' | 'calculation-artifact',\n data,\n options.artifactPath,\n );\n const signedUrl = requiredString(selected.signedDownloadUrl, 'signedDownloadUrl');\n const expectedSha256 = requiredString(selected.sha256, 'sha256');\n const expectedByteSize = selected.byteSize;\n if (!Number.isSafeInteger(expectedByteSize) || Number(expectedByteSize) < 0) {\n throw new CliError('Download metadata contains an invalid byteSize.', {\n code: 'LCA_RELEASE_DOWNLOAD_SIZE_INVALID',\n exitCode: 1,\n });\n }\n const bytes = await downloadBytes(signedUrl, options.timeoutMs, options.fetchImpl);\n if (bytes.byteLength !== Number(expectedByteSize)) {\n throw new CliError('Downloaded artifact byte size differs from the durable reference.', {\n code: 'LCA_RELEASE_DOWNLOAD_SIZE_MISMATCH',\n exitCode: 1,\n details: { expected: expectedByteSize, actual: bytes.byteLength },\n });\n }\n const observedSha256 = sha256Bytes(bytes);\n if (observedSha256 !== expectedSha256) {\n throw new CliError('Downloaded artifact SHA-256 differs from the durable reference.', {\n code: 'LCA_RELEASE_DOWNLOAD_HASH_MISMATCH',\n exitCode: 1,\n details: { expected: expectedSha256, actual: observedSha256 },\n });\n }\n const mediaType =\n typeof selected.mediaType === 'string' ? selected.mediaType : 'application/octet-stream';\n return {\n output: writeOutput(outputPath, bytes, mediaType, options.force),\n selected,\n };\n}\n\nfunction nextCommands(action: LcaReleaseAction, data: unknown): string[] {\n const record = isRecord(data) ? data : {};\n const releaseRunId = typeof record.releaseRunId === 'string' ? record.releaseRunId : '<run-id>';\n const mapping: Partial<Record<LcaReleaseAction, string[]>> = {\n prepare: [\n 'tiangong-lca release upload --input ./release-upload.json --output ./upload-receipt.json',\n ],\n upload: ['tiangong-lca release finalize --input ./release-finalize.json --json'],\n finalize: ['tiangong-lca release approve --input ./release-approval.json --json'],\n approve: ['tiangong-lca release publish --input ./release-publish.json --json'],\n publish: ['tiangong-lca release readback-verify --input ./release-readback.json --json'],\n 'readback-verify': [`tiangong-lca release status --release-run-id ${releaseRunId} --json`],\n unpublish: ['tiangong-lca release current --json'],\n status: [],\n current: [],\n 'calculation-bundle': [\n 'tiangong-lca release calculation-artifact --package-id <package-id> --artifact-path <path> --output ./result.jsonl.gz',\n ],\n 'calculation-artifact': [],\n 'artifact-download': [],\n };\n return mapping[action] ?? [];\n}\n\nfunction summarize(action: LcaReleaseAction, data: unknown): Record<string, unknown> {\n const record = isRecord(data) ? data : {};\n if (action === 'calculation-bundle') {\n const bundle = isRecord(record.calculationBundle) ? record.calculationBundle : {};\n const manifest = isRecord(bundle.manifest) ? bundle.manifest : {};\n const artifacts = Array.isArray(bundle.artifacts) ? bundle.artifacts : [];\n const scope = isRecord(manifest.scope) ? manifest.scope : {};\n return {\n packageId: record.packageId ?? null,\n calculationId: bundle.calculationId ?? null,\n bundleContentHash: bundle.bundleContentHash ?? null,\n processCount: scope.processCount ?? null,\n artifactCount: artifacts.length,\n };\n }\n return {\n releaseRunId: record.releaseRunId ?? null,\n releaseVersion: record.releaseVersion ?? null,\n status: record.status ?? 'completed',\n };\n}\n\nexport async function runLcaRelease(options: RunLcaReleaseOptions): Promise<LcaReleaseReport> {\n const runtime = requireSupabaseRestRuntime(options.env);\n const url = edgeUrl(runtime.apiBaseUrl);\n if (options.action === 'upload') return runUpload(options, runtime, url);\n\n const command = buildCommandPayload(options);\n if (options.dryRun) {\n return {\n schemaVersion: 'tiangong.cli.lca-release.v1',\n action: options.action,\n status: 'planned',\n complete: false,\n summary: { inputPath: command.inputPath },\n request: {\n method: 'POST',\n url,\n headers: { Authorization: 'Bearer ****', apikey: '****' },\n body: command.body,\n },\n warnings: [],\n nextCommands: [],\n };\n }\n\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const envelope = await invokeCommand({\n url,\n publishableKey: runtime.publishableKey,\n accessToken: session.accessToken,\n body: command.body,\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n const data = envelope.data;\n\n if (options.action === 'artifact-download' || options.action === 'calculation-artifact') {\n const downloaded = await writeDownload(options, data);\n return {\n schemaVersion: 'tiangong.cli.lca-release.v1',\n action: options.action,\n status: 'completed',\n complete: true,\n summary: {\n artifactId: downloaded.selected.artifactId ?? null,\n artifactPath: downloaded.selected.path ?? null,\n },\n output: downloaded.output,\n warnings: [],\n nextCommands: [],\n };\n }\n\n let output: LcaReleaseOutput | undefined;\n if (options.action === 'calculation-bundle') {\n output = writeJsonOutput(requiredPath(options.outputPath, '--output'), data, options.force);\n } else if (options.outputPath) {\n output = writeJsonOutput(path.resolve(options.outputPath), data, options.force);\n }\n return {\n schemaVersion: 'tiangong.cli.lca-release.v1',\n action: options.action,\n status: 'completed',\n complete: true,\n summary: summarize(options.action, data),\n ...(output ? { output } : { data }),\n warnings: [],\n nextCommands: nextCommands(options.action, data),\n };\n}\n\nexport function renderLcaReleaseReport(report: LcaReleaseReport): string {\n const lines = [\n `LCA release ${report.action}: ${report.status}`,\n '',\n 'Summary:',\n ...Object.entries(report.summary).map(\n ([key, value]) => `- ${key}: ${typeof value === 'string' ? value : JSON.stringify(value)}`,\n ),\n `- complete: ${report.complete}`,\n ];\n if (report.output) lines.push(`- output: ${report.output.path} (${report.output.sha256})`);\n lines.push('', 'Next:');\n if (report.nextCommands.length === 0) lines.push('- none');\n for (const command of report.nextCommands) lines.push(`- ${command}`);\n return `${lines.join('\\n')}\\n`;\n}\n\nexport const __testInternals = {\n buildCommandPayload,\n commandAction,\n downloadBytes,\n edgeUrl,\n invokeCommand,\n isRecord,\n nextCommands,\n outputRef,\n parseLocalUploadArtifacts,\n parseUploadResponse,\n readJsonResponse,\n requiredId,\n requiredPath,\n requiredString,\n runUpload,\n selectDownload,\n sha256Bytes,\n summarize,\n writeJsonOutput,\n writeOutput,\n};\n"]}
|
|
@@ -57,8 +57,12 @@ function requireRemoteProcessLookupRuntime(env) {
|
|
|
57
57
|
if (typeof env.TIANGONG_LCA_API_BASE_URL !== 'string' || !env.TIANGONG_LCA_API_BASE_URL.trim()) {
|
|
58
58
|
missing.push('TIANGONG_LCA_API_BASE_URL');
|
|
59
59
|
}
|
|
60
|
-
if (
|
|
61
|
-
|
|
60
|
+
if (![
|
|
61
|
+
env.TIANGONG_LCA_OAUTH_CLIENT_ID,
|
|
62
|
+
env.TIANGONG_LCA_ACCESS_TOKEN,
|
|
63
|
+
env.TIANGONG_LCA_API_KEY,
|
|
64
|
+
].some((value) => typeof value === 'string' && value.trim())) {
|
|
65
|
+
missing.push('TIANGONG_LCA_OAUTH_CLIENT_ID or TIANGONG_LCA_ACCESS_TOKEN or TIANGONG_LCA_API_KEY');
|
|
62
66
|
}
|
|
63
67
|
if (typeof env.TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY !== 'string' ||
|
|
64
68
|
!env.TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY.trim()) {
|