@tiangong-lca/cli 0.0.16 → 0.0.18

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.
@@ -614,19 +614,40 @@ export async function runDatasetRemoteVerify(options) {
614
614
  : null);
615
615
  const lookupCache = new Map();
616
616
  const checks = [];
617
+ // Pre-fetch the unique remote lookups in bounded-concurrency batches. Large
618
+ // reference closures (e.g. a mega-process referencing 1600+ flows) would
619
+ // otherwise serialize into thousands of sequential round-trips and take many
620
+ // minutes; the loop below then simply awaits the already-in-flight cached
621
+ // promises, preserving the existing per-reference error handling.
622
+ const REMOTE_LOOKUP_CONCURRENCY = 20;
623
+ const prefetch = [];
624
+ const prefetchQueued = new Set();
625
+ for (const reference of references) {
626
+ const lookupKey = uniqueLookupKey(reference);
627
+ if (reference.table && reference.id && lookupKey && !prefetchQueued.has(lookupKey)) {
628
+ prefetchQueued.add(lookupKey);
629
+ prefetch.push({
630
+ key: lookupKey,
631
+ request: { table: reference.table, id: reference.id, version: reference.version },
632
+ });
633
+ }
634
+ }
635
+ for (let offset = 0; offset < prefetch.length; offset += REMOTE_LOOKUP_CONCURRENCY) {
636
+ const batch = prefetch.slice(offset, offset + REMOTE_LOOKUP_CONCURRENCY);
637
+ await Promise.all(batch.map(({ key, request }) => {
638
+ const promise = lookupImpl(request);
639
+ lookupCache.set(key, promise);
640
+ return promise.then(() => undefined, () => undefined);
641
+ }));
642
+ }
617
643
  for (const reference of references) {
618
644
  let lookup = null;
619
645
  let lookupFailed = false;
620
646
  const lookupKey = uniqueLookupKey(reference);
621
647
  if (reference.table && reference.id && lookupKey) {
648
+ // The bounded-concurrency prefetch above populated lookupCache for every
649
+ // reference that passes this same guard, so the promise is always present.
622
650
  try {
623
- if (!lookupCache.has(lookupKey)) {
624
- lookupCache.set(lookupKey, lookupImpl({
625
- table: reference.table,
626
- id: reference.id,
627
- version: reference.version,
628
- }));
629
- }
630
651
  lookup = await lookupCache.get(lookupKey);
631
652
  }
632
653
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-remote-verify.js","sourceRoot":"","sources":["../../../src/lib/dataset-remote-verify.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from 'node:crypto';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\nimport {\n firstNonEmpty,\n isRecord,\n readDatasetRowsInput,\n trimToken,\n unwrapDatasetPayload,\n type JsonObject,\n} from './dataset-local.js';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport type RemoteDatasetTable =\n | 'contacts'\n | 'flowproperties'\n | 'flows'\n | 'lciamethods'\n | 'lifecyclemodels'\n | 'processes'\n | 'sources'\n | 'unitgroups';\n\nexport type RemoteVerificationReferenceRole = 'root' | 'reference';\nexport type RemoteVerificationRootPolicy = 'existing' | 'candidate';\n\nexport type RemoteVerificationStatus =\n | 'ok'\n | 'lookup_failed'\n | 'missing_dataset'\n | 'missing_version'\n | 'unsupported_type'\n | 'version_missing'\n | 'version_outdated';\n\nexport type RemoteVerificationIssueCode =\n | RemoteVerificationStatus\n | 'owner_mismatch'\n | 'payload_mismatch'\n | 'remote_payload_missing'\n | 'state_code_mismatch';\n\nexport type RemoteDatasetReference = {\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n type: string | null;\n id: string | null;\n version: string | null;\n path: string;\n short_description: string | null;\n};\n\nexport type RemoteDatasetLookupRow = {\n id: string;\n version: string | null;\n};\n\nexport type RemoteDatasetLookup = {\n exact: RemoteDatasetLookupRow | null;\n latest: RemoteDatasetLookupRow | null;\n exact_source_url: string | null;\n latest_source_url: string | null;\n};\n\nexport type RemoteDatasetPayloadLookup = {\n id: string;\n version: string | null;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n payload: JsonObject | null;\n source_url: string | null;\n};\n\nexport type RemoteDatasetLookupRequest = {\n table: RemoteDatasetTable;\n id: string;\n version: string | null;\n};\n\nexport type RemoteVerificationCheck = {\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n type: string | null;\n id: string | null;\n version: string | null;\n path: string;\n short_description: string | null;\n status: RemoteVerificationIssueCode;\n exact_version: string | null;\n latest_version: string | null;\n exact_source_url: string | null;\n latest_source_url: string | null;\n message: string;\n remote_user_id?: string | null;\n remote_state_code?: number | null;\n remote_modified_at?: string | null;\n local_payload_sha256?: string | null;\n remote_payload_sha256?: string | null;\n};\n\nexport type RemoteVerificationBlocker = {\n code: RemoteVerificationIssueCode;\n severity: 'error';\n message: string;\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n id: string | null;\n version: string | null;\n latest_version: string | null;\n path: string;\n};\n\nexport type DatasetRemoteVerificationReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'passed_remote_verification' | 'blocked_remote_verification';\n root_policy: RemoteVerificationRootPolicy;\n input_path: string;\n out_dir: string;\n counts: {\n rows: number;\n references: number;\n checked: number;\n blockers: number;\n root_readback_checks?: number;\n root_payload_mismatches?: number;\n by_status: Record<string, number>;\n by_table: Record<RemoteDatasetTable, number>;\n };\n blockers: RemoteVerificationBlocker[];\n files: {\n report: string;\n checks: string;\n blockers: string;\n };\n};\n\nexport type RunDatasetRemoteVerifyOptions = {\n inputPath: string;\n outDir: string;\n rootPolicy?: RemoteVerificationRootPolicy;\n compareRootPayload?: boolean;\n targetUserId?: string | null;\n stateCode?: number | null;\n rawInput?: unknown;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n lookupDatasetImpl?: (request: RemoteDatasetLookupRequest) => Promise<RemoteDatasetLookup>;\n lookupRootPayloadImpl?: (\n request: RemoteDatasetLookupRequest,\n ) => Promise<RemoteDatasetPayloadLookup | null>;\n};\n\ntype RootDatasetDescriptor = {\n wrapper: string;\n table: RemoteDatasetTable;\n type: string;\n information_key: string;\n};\n\nconst ROOT_DATASET_DESCRIPTORS: RootDatasetDescriptor[] = [\n {\n wrapper: 'processDataSet',\n table: 'processes',\n type: 'process data set',\n information_key: 'processInformation',\n },\n {\n wrapper: 'flowDataSet',\n table: 'flows',\n type: 'flow data set',\n information_key: 'flowInformation',\n },\n {\n wrapper: 'lifeCycleModelDataSet',\n table: 'lifecyclemodels',\n type: 'life cycle model data set',\n information_key: 'lifeCycleModelInformation',\n },\n {\n wrapper: 'sourceDataSet',\n table: 'sources',\n type: 'source data set',\n information_key: 'sourceInformation',\n },\n {\n wrapper: 'contactDataSet',\n table: 'contacts',\n type: 'contact data set',\n information_key: 'contactInformation',\n },\n {\n wrapper: 'flowPropertyDataSet',\n table: 'flowproperties',\n type: 'flow property data set',\n information_key: 'flowPropertiesInformation',\n },\n {\n wrapper: 'unitGroupDataSet',\n table: 'unitgroups',\n type: 'unit group data set',\n information_key: 'unitGroupInformation',\n },\n {\n wrapper: 'LCIAMethodDataSet',\n table: 'lciamethods',\n type: 'LCIA method data set',\n information_key: 'LCIAMethodInformation',\n },\n];\n\nconst TABLE_ALIASES = new Map<string, RemoteDatasetTable>([\n ['contact', 'contacts'],\n ['contact data set', 'contacts'],\n ['contacts', 'contacts'],\n ['flow', 'flows'],\n ['flow data set', 'flows'],\n ['flows', 'flows'],\n ['flow property', 'flowproperties'],\n ['flow property data set', 'flowproperties'],\n ['flowproperties', 'flowproperties'],\n ['lcia method', 'lciamethods'],\n ['lcia method data set', 'lciamethods'],\n ['lciamethod', 'lciamethods'],\n ['lciamethods', 'lciamethods'],\n ['life cycle model', 'lifecyclemodels'],\n ['life cycle model data set', 'lifecyclemodels'],\n ['lifecycle model', 'lifecyclemodels'],\n ['lifecycle model data set', 'lifecyclemodels'],\n ['lifecyclemodel', 'lifecyclemodels'],\n ['lifecyclemodels', 'lifecyclemodels'],\n ['process', 'processes'],\n ['process data set', 'processes'],\n ['processes', 'processes'],\n ['source', 'sources'],\n ['source data set', 'sources'],\n ['sources', 'sources'],\n ['unit group', 'unitgroups'],\n ['unit group data set', 'unitgroups'],\n ['unitgroup', 'unitgroups'],\n ['unitgroups', 'unitgroups'],\n]);\n\nconst PATH_TABLE_HINTS: Array<[RegExp, RemoteDatasetTable]> = [\n [/referenceToFlowDataSet$/u, 'flows'],\n [/referenceToProcess$/u, 'processes'],\n [/referenceToResultingProcess$/u, 'processes'],\n [/referenceToFlowPropertyDataSet$/u, 'flowproperties'],\n [/referenceToReferenceUnitGroup$/u, 'unitgroups'],\n [/referenceToLCIAMethodDataSet$/u, 'lciamethods'],\n [/referenceToDataSource$/u, 'sources'],\n [/referenceToExternalDocumentation$/u, 'sources'],\n [/referenceToDataSetFormat$/u, 'sources'],\n [/referenceToComplianceSystem$/u, 'sources'],\n [/referenceToDataSetUseApproval$/u, 'sources'],\n [/referenceToContact$/u, 'contacts'],\n [/referenceToCommissioner$/u, 'contacts'],\n [/referenceToPersonOrEntity/u, 'contacts'],\n [/referenceToNameOfReviewerAndInstitution$/u, 'contacts'],\n];\n\nconst EMPTY_STATUS_COUNTS: Record<string, number> = {\n ok: 0,\n lookup_failed: 0,\n missing_dataset: 0,\n missing_version: 0,\n owner_mismatch: 0,\n payload_mismatch: 0,\n remote_payload_missing: 0,\n state_code_mismatch: 0,\n unsupported_type: 0,\n version_missing: 0,\n version_outdated: 0,\n};\n\nconst EMPTY_TABLE_COUNTS: Record<RemoteDatasetTable, number> = {\n contacts: 0,\n flowproperties: 0,\n flows: 0,\n lciamethods: 0,\n lifecyclemodels: 0,\n processes: 0,\n sources: 0,\n unitgroups: 0,\n};\n\nfunction requireNonEmpty(value: string, label: string, code: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new CliError(`Missing required ${label} value.`, {\n code,\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction textValue(value: unknown): string | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return String(value);\n }\n return trimToken(value);\n}\n\nfunction normalizeTableToken(value: string | null): string | null {\n return value ? value.trim().replace(/\\s+/gu, ' ').toLowerCase() : null;\n}\n\nfunction tableFromType(value: string | null): RemoteDatasetTable | null {\n const normalized = normalizeTableToken(value);\n return normalized ? (TABLE_ALIASES.get(normalized) ?? null) : null;\n}\n\nfunction tableFromPath(pathExpression: string): RemoteDatasetTable | null {\n const pathEnd = pathExpression.split('/').filter(Boolean).at(-1) ?? '';\n return PATH_TABLE_HINTS.find(([pattern]) => pattern.test(pathEnd))?.[1] ?? null;\n}\n\nfunction shortDescription(value: unknown): string | null {\n if (typeof value === 'string') {\n return textValue(value);\n }\n if (Array.isArray(value)) {\n for (const entry of value) {\n const text = shortDescription(entry);\n if (text) {\n return text;\n }\n }\n return null;\n }\n if (isRecord(value)) {\n return textValue(value['#text'] ?? value.text ?? value.value);\n }\n return null;\n}\n\nfunction pointerPath(basePath: string, segment: string | number): string {\n const encoded = String(segment).replace(/~/gu, '~0').replace(/\\//gu, '~1');\n return `${basePath}/${encoded}`;\n}\n\nfunction unescapePointerSegment(segment: string): string {\n return segment.replace(/~1/gu, '/').replace(/~0/gu, '~');\n}\n\nfunction isFoundryTracePath(pathExpression: string): boolean {\n const segments = pathExpression.split('/').filter(Boolean).map(unescapePointerSegment);\n return (\n segments.includes('common:other') &&\n segments.some(\n (segment) =>\n segment.startsWith('tiangongfoundry:') && segment.toLowerCase().includes('trace'),\n )\n );\n}\n\nfunction rootOf(\n payload: JsonObject,\n): { descriptor: RootDatasetDescriptor; root: JsonObject } | null {\n for (const descriptor of ROOT_DATASET_DESCRIPTORS) {\n if (isRecord(payload[descriptor.wrapper])) {\n return { descriptor, root: payload[descriptor.wrapper] as JsonObject };\n }\n }\n return null;\n}\n\nfunction rootIdentity(row: JsonObject, payload: JsonObject): RemoteDatasetReference | null {\n const root = rootOf(payload);\n if (!root) {\n return null;\n }\n const information = isRecord(root.root[root.descriptor.information_key])\n ? (root.root[root.descriptor.information_key] as JsonObject)\n : {};\n const dataSetInformation = isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.root.administrativeInformation)\n ? root.root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n\n return {\n row_index: -1,\n role: 'root',\n table: root.descriptor.table,\n type: root.descriptor.type,\n id: firstNonEmpty(row.id, row.uuid, dataSetInformation['common:UUID']),\n version: firstNonEmpty(row.version, publicationAndOwnership['common:dataSetVersion']),\n path: `/${root.descriptor.wrapper}`,\n short_description: shortDescription(dataSetInformation.name ?? dataSetInformation.shortName),\n };\n}\n\nfunction referenceFromRecord(\n rowIndex: number,\n value: JsonObject,\n pathExpression: string,\n): RemoteDatasetReference | null {\n const id = firstNonEmpty(value['@refObjectId'], value.refObjectId, value.id);\n if (!id) {\n return null;\n }\n const type = firstNonEmpty(value['@type'], value.type);\n const table = tableFromType(type) ?? tableFromPath(pathExpression);\n return {\n row_index: rowIndex,\n role: 'reference',\n table,\n type,\n id,\n version: firstNonEmpty(value['@version'], value.version),\n path: pathExpression,\n short_description: shortDescription(value['common:shortDescription']),\n };\n}\n\nfunction flowReferenceFromRecord(\n rowIndex: number,\n value: JsonObject,\n pathExpression: string,\n): RemoteDatasetReference | null {\n const id = firstNonEmpty(value['@flowUUID']);\n return id\n ? {\n row_index: rowIndex,\n role: 'reference',\n table: 'flows',\n type: 'flow data set',\n id,\n version: firstNonEmpty(value['@version'], value.version),\n path: pointerPath(pathExpression, '@flowUUID'),\n short_description: null,\n }\n : null;\n}\n\nfunction collectReferencesFromValue(\n rowIndex: number,\n value: unknown,\n pathExpression: string,\n references: RemoteDatasetReference[],\n): void {\n if (isFoundryTracePath(pathExpression)) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry, index) =>\n collectReferencesFromValue(rowIndex, entry, pointerPath(pathExpression, index), references),\n );\n return;\n }\n\n if (!isRecord(value)) {\n return;\n }\n\n const ref = referenceFromRecord(rowIndex, value, pathExpression);\n if (ref) {\n references.push(ref);\n }\n const flowRef = flowReferenceFromRecord(rowIndex, value, pathExpression);\n if (flowRef) {\n references.push(flowRef);\n }\n for (const [key, nested] of Object.entries(value)) {\n collectReferencesFromValue(rowIndex, nested, pointerPath(pathExpression, key), references);\n }\n}\n\nexport function collectRemoteReferences(rows: JsonObject[]): RemoteDatasetReference[] {\n const references: RemoteDatasetReference[] = [];\n rows.forEach((row, index) => {\n const payload = unwrapDatasetPayload(row);\n const root = rootIdentity(row, payload);\n if (root) {\n references.push({ ...root, row_index: index });\n }\n collectReferencesFromValue(index, payload, '', references);\n });\n return references;\n}\n\nfunction compareVersions(left: string | null, right: string | null): number {\n if (!left && !right) {\n return 0;\n }\n if (!left) {\n return -1;\n }\n if (!right) {\n return 1;\n }\n const leftParts = left.split(/[._-]/u);\n const rightParts = right.split(/[._-]/u);\n const length = Math.max(leftParts.length, rightParts.length);\n for (let index = 0; index < length; index += 1) {\n const leftPart = leftParts[index] ?? '0';\n const rightPart = rightParts[index] ?? '0';\n const leftNumber = Number(leftPart);\n const rightNumber = Number(rightPart);\n if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber)) {\n if (leftNumber !== rightNumber) {\n return leftNumber > rightNumber ? 1 : -1;\n }\n } else {\n const compared = leftPart.localeCompare(rightPart);\n if (compared !== 0) {\n return compared > 0 ? 1 : -1;\n }\n }\n }\n return 0;\n}\n\nfunction buildRemoteUrl(\n restBaseUrl: string,\n table: RemoteDatasetTable,\n id: string,\n version: string | null,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('id', `eq.${id}`);\n if (version) {\n url.searchParams.set('version', `eq.${version}`);\n } else {\n url.searchParams.set('order', 'version.desc');\n url.searchParams.set('limit', '1');\n }\n return url.toString();\n}\n\nfunction normalizeRows(value: unknown): RemoteDatasetLookupRow[] {\n return Array.isArray(value)\n ? value\n .filter(isRecord)\n .map((row) => ({\n id: firstNonEmpty(row.id) ?? '',\n version: firstNonEmpty(row.version),\n }))\n .filter((row) => Boolean(row.id))\n : [];\n}\n\nfunction stableJson(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stableJson);\n }\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, stableJson(value[key])]),\n );\n }\n return value;\n}\n\nfunction sha256Json(value: unknown): string {\n return crypto\n .createHash('sha256')\n .update(JSON.stringify(stableJson(value)))\n .digest('hex');\n}\n\nfunction buildRemotePayloadUrl(\n restBaseUrl: string,\n table: RemoteDatasetTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('select', 'id,version,user_id,state_code,modified_at,json,json_ordered');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction normalizePayloadRow(value: unknown): RemoteDatasetPayloadLookup | null {\n if (!isRecord(value)) {\n return null;\n }\n const payload = isRecord(value.json_ordered)\n ? value.json_ordered\n : isRecord(value.json)\n ? value.json\n : null;\n return {\n id: firstNonEmpty(value.id) ?? '',\n version: firstNonEmpty(value.version),\n user_id: firstNonEmpty(value.user_id),\n state_code: typeof value.state_code === 'number' ? value.state_code : null,\n modified_at: firstNonEmpty(value.modified_at),\n payload: payload as JsonObject | null,\n source_url: null,\n };\n}\n\nexport async function lookupRemoteDataset(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n request: RemoteDatasetLookupRequest;\n}): Promise<RemoteDatasetLookup> {\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const exactSourceUrl = options.request.version\n ? buildRemoteUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n options.request.version,\n )\n : null;\n const latestSourceUrl = buildRemoteUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n null,\n );\n const exactRows = options.request.version\n ? normalizeRows(\n await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version')\n .eq('id', options.request.id)\n .eq('version', options.request.version),\n exactSourceUrl as string,\n ),\n )\n : [];\n const latestRows = normalizeRows(\n await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version')\n .eq('id', options.request.id)\n .order('version', { ascending: false })\n .limit(1),\n latestSourceUrl,\n ),\n );\n return {\n exact: exactRows[0] ?? null,\n latest: latestRows[0] ?? null,\n exact_source_url: exactSourceUrl,\n latest_source_url: latestSourceUrl,\n };\n}\n\nasync function lookupRemoteDatasetPayload(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n request: RemoteDatasetLookupRequest;\n}): Promise<RemoteDatasetPayloadLookup | null> {\n if (!options.request.version) {\n return null;\n }\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const sourceUrl = buildRemotePayloadUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n options.request.version,\n );\n const rows = await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version,user_id,state_code,modified_at,json,json_ordered')\n .eq('id', options.request.id)\n .eq('version', options.request.version),\n sourceUrl,\n );\n const payloadRow = normalizePayloadRow(Array.isArray(rows) ? rows[0] : null);\n return payloadRow ? { ...payloadRow, source_url: sourceUrl } : null;\n}\n\nfunction checkMessage(reference: RemoteDatasetReference, status: RemoteVerificationStatus): string {\n const label = `${reference.table ?? reference.type ?? 'unknown'}:${reference.id ?? '-'}@${\n reference.version ?? '-'\n }`;\n switch (status) {\n case 'ok':\n return `Remote dataset reference is resolvable: ${label}.`;\n case 'lookup_failed':\n return `Remote lookup failed for dataset reference: ${label}.`;\n case 'missing_dataset':\n return `Remote dataset id does not exist: ${label}.`;\n case 'missing_version':\n return `Remote dataset id exists, but the requested version does not exist: ${label}.`;\n case 'unsupported_type':\n return `Dataset reference type cannot be mapped to a TianGong table: ${label}.`;\n case 'version_missing':\n return `Dataset reference is missing @version and cannot pass publish-readiness verification: ${label}.`;\n case 'version_outdated':\n return `Requested dataset version is lower than the latest published version: ${label}.`;\n }\n}\n\nfunction classifyCheck(\n reference: RemoteDatasetReference,\n lookup: RemoteDatasetLookup | null,\n lookupFailed: boolean,\n rootPolicy: RemoteVerificationRootPolicy,\n): RemoteVerificationCheck {\n let status: RemoteVerificationStatus = 'ok';\n if (!reference.table || !reference.id) {\n status = 'unsupported_type';\n } else if (lookupFailed) {\n status = 'lookup_failed';\n } else if (!reference.version) {\n status = 'version_missing';\n } else if (reference.role === 'root' && rootPolicy === 'candidate') {\n if (!lookup?.latest) {\n status = 'ok';\n } else if (!lookup.exact) {\n status =\n compareVersions(reference.version, lookup.latest.version) > 0\n ? 'ok'\n : compareVersions(lookup.latest.version, reference.version) > 0\n ? 'version_outdated'\n : 'missing_version';\n } else if (compareVersions(lookup.latest.version, reference.version) > 0) {\n status = 'version_outdated';\n }\n } else if (!lookup?.latest) {\n status = 'missing_dataset';\n } else if (!lookup.exact) {\n status = 'missing_version';\n } else if (compareVersions(lookup.latest.version, reference.version) > 0) {\n status = 'version_outdated';\n }\n return {\n ...reference,\n status,\n exact_version: lookup?.exact?.version ?? null,\n latest_version: lookup?.latest?.version ?? null,\n exact_source_url: lookup?.exact_source_url ?? null,\n latest_source_url: lookup?.latest_source_url ?? null,\n message: checkMessage(reference, status),\n };\n}\n\nfunction blockerFromCheck(check: RemoteVerificationCheck): RemoteVerificationBlocker | null {\n return check.status === 'ok'\n ? null\n : {\n code: check.status,\n severity: 'error',\n message: check.message,\n row_index: check.row_index,\n role: check.role,\n table: check.table,\n id: check.id,\n version: check.version,\n latest_version: check.latest_version,\n path: check.path,\n };\n}\n\nfunction makeRootReadbackCheck(\n reference: RemoteDatasetReference,\n status: RemoteVerificationIssueCode,\n message: string,\n remote: RemoteDatasetPayloadLookup | null,\n hashes: {\n local: string | null;\n remote: string | null;\n } = { local: null, remote: null },\n): RemoteVerificationCheck {\n return {\n ...reference,\n path: `${reference.path}#readback`,\n status,\n exact_version: remote?.version ?? null,\n latest_version: null,\n exact_source_url: remote?.source_url ?? null,\n latest_source_url: null,\n message,\n remote_user_id: remote?.user_id ?? null,\n remote_state_code: remote?.state_code ?? null,\n remote_modified_at: remote?.modified_at ?? null,\n local_payload_sha256: hashes.local,\n remote_payload_sha256: hashes.remote,\n };\n}\n\nfunction rootReadbackChecks(options: {\n reference: RemoteDatasetReference;\n localPayload: JsonObject;\n remote: RemoteDatasetPayloadLookup | null;\n compareRootPayload: boolean;\n targetUserId: string | null;\n stateCode: number | null;\n}): RemoteVerificationCheck[] {\n const { reference, localPayload, remote, compareRootPayload, targetUserId, stateCode } = options;\n if (!remote) {\n return [\n makeRootReadbackCheck(\n reference,\n 'missing_dataset',\n `Remote root payload was not found for ${reference.table}:${reference.id}@${reference.version}.`,\n null,\n ),\n ];\n }\n\n const checks: RemoteVerificationCheck[] = [];\n if (targetUserId && remote.user_id !== targetUserId) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'owner_mismatch',\n `Remote root owner ${remote.user_id ?? '<missing>'} does not match target user ${targetUserId}.`,\n remote,\n ),\n );\n }\n if (stateCode !== null && remote.state_code !== stateCode) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'state_code_mismatch',\n `Remote root state_code ${remote.state_code ?? '<missing>'} does not match required state_code ${stateCode}.`,\n remote,\n ),\n );\n }\n\n let hashes: { local: string | null; remote: string | null } = { local: null, remote: null };\n if (compareRootPayload) {\n if (!remote.payload) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'remote_payload_missing',\n `Remote root payload is missing for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n ),\n );\n } else {\n hashes = {\n local: sha256Json(localPayload),\n remote: sha256Json(remote.payload),\n };\n if (hashes.local !== hashes.remote) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'payload_mismatch',\n `Remote root payload hash does not match local row for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n hashes,\n ),\n );\n }\n }\n }\n\n if (checks.length > 0) {\n return checks;\n }\n return [\n makeRootReadbackCheck(\n reference,\n 'ok',\n `Remote root readback matches required owner, state, and payload checks for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n hashes,\n ),\n ];\n}\n\nfunction buildFiles(outDir: string): DatasetRemoteVerificationReport['files'] {\n const resolved = path.resolve(outDir);\n return {\n report: path.join(resolved, 'outputs', 'remote-verification-report.json'),\n checks: path.join(resolved, 'outputs', 'remote-verification.jsonl'),\n blockers: path.join(resolved, 'outputs', 'blockers.jsonl'),\n };\n}\n\nfunction uniqueLookupKey(reference: RemoteDatasetReference): string | null {\n return reference.table && reference.id\n ? `${reference.table}:${reference.id}:${reference.version ?? ''}`\n : null;\n}\n\nexport async function runDatasetRemoteVerify(\n options: RunDatasetRemoteVerifyOptions,\n): Promise<DatasetRemoteVerificationReport> {\n const inputPath = path.resolve(\n requireNonEmpty(options.inputPath, '--input', 'DATASET_REMOTE_VERIFY_INPUT_REQUIRED'),\n );\n const outDir = path.resolve(\n requireNonEmpty(options.outDir, '--out-dir', 'DATASET_REMOTE_VERIFY_OUT_DIR_REQUIRED'),\n );\n const rows = readDatasetRowsInput(inputPath, options.rawInput);\n const references = collectRemoteReferences(rows);\n const rootPolicy = options.rootPolicy ?? 'existing';\n const compareRootPayload = options.compareRootPayload === true;\n const targetUserId = trimToken(options.targetUserId);\n const stateCode = options.stateCode ?? null;\n const needsRootReadback = compareRootPayload || Boolean(targetUserId) || stateCode !== null;\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const runtime =\n options.lookupDatasetImpl === undefined\n ? createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n })\n : null;\n const lookupImpl =\n options.lookupDatasetImpl ??\n ((request: RemoteDatasetLookupRequest) =>\n lookupRemoteDataset({\n runtime: runtime as SupabaseDataRuntime,\n fetchImpl,\n timeoutMs,\n request,\n }));\n const rootPayloadLookupImpl =\n options.lookupRootPayloadImpl ??\n (runtime\n ? (request: RemoteDatasetLookupRequest) =>\n lookupRemoteDatasetPayload({\n runtime: runtime as SupabaseDataRuntime,\n fetchImpl,\n timeoutMs,\n request,\n })\n : null);\n const lookupCache = new Map<string, Promise<RemoteDatasetLookup>>();\n const checks: RemoteVerificationCheck[] = [];\n\n for (const reference of references) {\n let lookup: RemoteDatasetLookup | null = null;\n let lookupFailed = false;\n const lookupKey = uniqueLookupKey(reference);\n if (reference.table && reference.id && lookupKey) {\n try {\n if (!lookupCache.has(lookupKey)) {\n lookupCache.set(\n lookupKey,\n lookupImpl({\n table: reference.table,\n id: reference.id,\n version: reference.version,\n }),\n );\n }\n lookup = await lookupCache.get(lookupKey)!;\n } catch {\n lookupFailed = true;\n }\n }\n checks.push(classifyCheck(reference, lookup, lookupFailed, rootPolicy));\n }\n\n if (needsRootReadback) {\n const rootChecks = checks.filter(\n (check) =>\n check.role === 'root' &&\n check.status === 'ok' &&\n check.table &&\n check.id &&\n (compareRootPayload || rootPolicy !== 'candidate' || Boolean(check.exact_version)),\n );\n for (const check of rootChecks) {\n const localPayload = unwrapDatasetPayload(rows[check.row_index]);\n let remotePayload: RemoteDatasetPayloadLookup | null;\n try {\n if (!rootPayloadLookupImpl) {\n throw new Error('root payload lookup is not available');\n }\n remotePayload = await rootPayloadLookupImpl({\n table: check.table as RemoteDatasetTable,\n id: check.id as string,\n version: check.version,\n });\n } catch {\n checks.push(\n makeRootReadbackCheck(\n check,\n 'lookup_failed',\n `Remote root payload lookup failed for ${check.table}:${check.id}@${check.version}.`,\n null,\n ),\n );\n continue;\n }\n checks.push(\n ...rootReadbackChecks({\n reference: check,\n localPayload,\n remote: remotePayload,\n compareRootPayload,\n targetUserId,\n stateCode,\n }),\n );\n }\n }\n\n const blockers = checks\n .map(blockerFromCheck)\n .filter((blocker): blocker is RemoteVerificationBlocker => blocker !== null);\n const byStatus = { ...EMPTY_STATUS_COUNTS };\n const byTable = { ...EMPTY_TABLE_COUNTS };\n checks.forEach((check) => {\n byStatus[check.status] ??= 0;\n byStatus[check.status] += 1;\n if (check.table) {\n byTable[check.table] += 1;\n }\n });\n const rootReadbackChecksCount = checks.filter((check) => check.path.endsWith('#readback')).length;\n const rootPayloadMismatches = checks.filter(\n (check) => check.status === 'payload_mismatch',\n ).length;\n\n const files = buildFiles(outDir);\n const report: DatasetRemoteVerificationReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: blockers.length > 0 ? 'blocked_remote_verification' : 'passed_remote_verification',\n root_policy: rootPolicy,\n input_path: inputPath,\n out_dir: outDir,\n counts: {\n rows: rows.length,\n references: references.length,\n checked: checks.length,\n blockers: blockers.length,\n ...(needsRootReadback ? { root_readback_checks: rootReadbackChecksCount } : {}),\n ...(needsRootReadback ? { root_payload_mismatches: rootPayloadMismatches } : {}),\n by_status: byStatus,\n by_table: byTable,\n },\n blockers,\n files,\n };\n\n writeJsonArtifact(files.report, report);\n writeJsonLinesArtifact(files.checks, checks);\n writeJsonLinesArtifact(files.blockers, blockers);\n\n return report;\n}\n\nexport const __testInternals = {\n buildRemotePayloadUrl,\n buildRemoteUrl,\n collectRemoteReferences,\n compareVersions,\n isFoundryTracePath,\n lookupRemoteDatasetPayload,\n lookupRemoteDataset,\n makeRootReadbackCheck,\n normalizePayloadRow,\n normalizeRows,\n rootReadbackChecks,\n sha256Json,\n shortDescription,\n tableFromPath,\n tableFromType,\n};\n"]}
1
+ {"version":3,"file":"dataset-remote-verify.js","sourceRoot":"","sources":["../../../src/lib/dataset-remote-verify.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from 'node:crypto';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\nimport {\n firstNonEmpty,\n isRecord,\n readDatasetRowsInput,\n trimToken,\n unwrapDatasetPayload,\n type JsonObject,\n} from './dataset-local.js';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport type RemoteDatasetTable =\n | 'contacts'\n | 'flowproperties'\n | 'flows'\n | 'lciamethods'\n | 'lifecyclemodels'\n | 'processes'\n | 'sources'\n | 'unitgroups';\n\nexport type RemoteVerificationReferenceRole = 'root' | 'reference';\nexport type RemoteVerificationRootPolicy = 'existing' | 'candidate';\n\nexport type RemoteVerificationStatus =\n | 'ok'\n | 'lookup_failed'\n | 'missing_dataset'\n | 'missing_version'\n | 'unsupported_type'\n | 'version_missing'\n | 'version_outdated';\n\nexport type RemoteVerificationIssueCode =\n | RemoteVerificationStatus\n | 'owner_mismatch'\n | 'payload_mismatch'\n | 'remote_payload_missing'\n | 'state_code_mismatch';\n\nexport type RemoteDatasetReference = {\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n type: string | null;\n id: string | null;\n version: string | null;\n path: string;\n short_description: string | null;\n};\n\nexport type RemoteDatasetLookupRow = {\n id: string;\n version: string | null;\n};\n\nexport type RemoteDatasetLookup = {\n exact: RemoteDatasetLookupRow | null;\n latest: RemoteDatasetLookupRow | null;\n exact_source_url: string | null;\n latest_source_url: string | null;\n};\n\nexport type RemoteDatasetPayloadLookup = {\n id: string;\n version: string | null;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n payload: JsonObject | null;\n source_url: string | null;\n};\n\nexport type RemoteDatasetLookupRequest = {\n table: RemoteDatasetTable;\n id: string;\n version: string | null;\n};\n\nexport type RemoteVerificationCheck = {\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n type: string | null;\n id: string | null;\n version: string | null;\n path: string;\n short_description: string | null;\n status: RemoteVerificationIssueCode;\n exact_version: string | null;\n latest_version: string | null;\n exact_source_url: string | null;\n latest_source_url: string | null;\n message: string;\n remote_user_id?: string | null;\n remote_state_code?: number | null;\n remote_modified_at?: string | null;\n local_payload_sha256?: string | null;\n remote_payload_sha256?: string | null;\n};\n\nexport type RemoteVerificationBlocker = {\n code: RemoteVerificationIssueCode;\n severity: 'error';\n message: string;\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n id: string | null;\n version: string | null;\n latest_version: string | null;\n path: string;\n};\n\nexport type DatasetRemoteVerificationReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'passed_remote_verification' | 'blocked_remote_verification';\n root_policy: RemoteVerificationRootPolicy;\n input_path: string;\n out_dir: string;\n counts: {\n rows: number;\n references: number;\n checked: number;\n blockers: number;\n root_readback_checks?: number;\n root_payload_mismatches?: number;\n by_status: Record<string, number>;\n by_table: Record<RemoteDatasetTable, number>;\n };\n blockers: RemoteVerificationBlocker[];\n files: {\n report: string;\n checks: string;\n blockers: string;\n };\n};\n\nexport type RunDatasetRemoteVerifyOptions = {\n inputPath: string;\n outDir: string;\n rootPolicy?: RemoteVerificationRootPolicy;\n compareRootPayload?: boolean;\n targetUserId?: string | null;\n stateCode?: number | null;\n rawInput?: unknown;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n lookupDatasetImpl?: (request: RemoteDatasetLookupRequest) => Promise<RemoteDatasetLookup>;\n lookupRootPayloadImpl?: (\n request: RemoteDatasetLookupRequest,\n ) => Promise<RemoteDatasetPayloadLookup | null>;\n};\n\ntype RootDatasetDescriptor = {\n wrapper: string;\n table: RemoteDatasetTable;\n type: string;\n information_key: string;\n};\n\nconst ROOT_DATASET_DESCRIPTORS: RootDatasetDescriptor[] = [\n {\n wrapper: 'processDataSet',\n table: 'processes',\n type: 'process data set',\n information_key: 'processInformation',\n },\n {\n wrapper: 'flowDataSet',\n table: 'flows',\n type: 'flow data set',\n information_key: 'flowInformation',\n },\n {\n wrapper: 'lifeCycleModelDataSet',\n table: 'lifecyclemodels',\n type: 'life cycle model data set',\n information_key: 'lifeCycleModelInformation',\n },\n {\n wrapper: 'sourceDataSet',\n table: 'sources',\n type: 'source data set',\n information_key: 'sourceInformation',\n },\n {\n wrapper: 'contactDataSet',\n table: 'contacts',\n type: 'contact data set',\n information_key: 'contactInformation',\n },\n {\n wrapper: 'flowPropertyDataSet',\n table: 'flowproperties',\n type: 'flow property data set',\n information_key: 'flowPropertiesInformation',\n },\n {\n wrapper: 'unitGroupDataSet',\n table: 'unitgroups',\n type: 'unit group data set',\n information_key: 'unitGroupInformation',\n },\n {\n wrapper: 'LCIAMethodDataSet',\n table: 'lciamethods',\n type: 'LCIA method data set',\n information_key: 'LCIAMethodInformation',\n },\n];\n\nconst TABLE_ALIASES = new Map<string, RemoteDatasetTable>([\n ['contact', 'contacts'],\n ['contact data set', 'contacts'],\n ['contacts', 'contacts'],\n ['flow', 'flows'],\n ['flow data set', 'flows'],\n ['flows', 'flows'],\n ['flow property', 'flowproperties'],\n ['flow property data set', 'flowproperties'],\n ['flowproperties', 'flowproperties'],\n ['lcia method', 'lciamethods'],\n ['lcia method data set', 'lciamethods'],\n ['lciamethod', 'lciamethods'],\n ['lciamethods', 'lciamethods'],\n ['life cycle model', 'lifecyclemodels'],\n ['life cycle model data set', 'lifecyclemodels'],\n ['lifecycle model', 'lifecyclemodels'],\n ['lifecycle model data set', 'lifecyclemodels'],\n ['lifecyclemodel', 'lifecyclemodels'],\n ['lifecyclemodels', 'lifecyclemodels'],\n ['process', 'processes'],\n ['process data set', 'processes'],\n ['processes', 'processes'],\n ['source', 'sources'],\n ['source data set', 'sources'],\n ['sources', 'sources'],\n ['unit group', 'unitgroups'],\n ['unit group data set', 'unitgroups'],\n ['unitgroup', 'unitgroups'],\n ['unitgroups', 'unitgroups'],\n]);\n\nconst PATH_TABLE_HINTS: Array<[RegExp, RemoteDatasetTable]> = [\n [/referenceToFlowDataSet$/u, 'flows'],\n [/referenceToProcess$/u, 'processes'],\n [/referenceToResultingProcess$/u, 'processes'],\n [/referenceToFlowPropertyDataSet$/u, 'flowproperties'],\n [/referenceToReferenceUnitGroup$/u, 'unitgroups'],\n [/referenceToLCIAMethodDataSet$/u, 'lciamethods'],\n [/referenceToDataSource$/u, 'sources'],\n [/referenceToExternalDocumentation$/u, 'sources'],\n [/referenceToDataSetFormat$/u, 'sources'],\n [/referenceToComplianceSystem$/u, 'sources'],\n [/referenceToDataSetUseApproval$/u, 'sources'],\n [/referenceToContact$/u, 'contacts'],\n [/referenceToCommissioner$/u, 'contacts'],\n [/referenceToPersonOrEntity/u, 'contacts'],\n [/referenceToNameOfReviewerAndInstitution$/u, 'contacts'],\n];\n\nconst EMPTY_STATUS_COUNTS: Record<string, number> = {\n ok: 0,\n lookup_failed: 0,\n missing_dataset: 0,\n missing_version: 0,\n owner_mismatch: 0,\n payload_mismatch: 0,\n remote_payload_missing: 0,\n state_code_mismatch: 0,\n unsupported_type: 0,\n version_missing: 0,\n version_outdated: 0,\n};\n\nconst EMPTY_TABLE_COUNTS: Record<RemoteDatasetTable, number> = {\n contacts: 0,\n flowproperties: 0,\n flows: 0,\n lciamethods: 0,\n lifecyclemodels: 0,\n processes: 0,\n sources: 0,\n unitgroups: 0,\n};\n\nfunction requireNonEmpty(value: string, label: string, code: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new CliError(`Missing required ${label} value.`, {\n code,\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction textValue(value: unknown): string | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return String(value);\n }\n return trimToken(value);\n}\n\nfunction normalizeTableToken(value: string | null): string | null {\n return value ? value.trim().replace(/\\s+/gu, ' ').toLowerCase() : null;\n}\n\nfunction tableFromType(value: string | null): RemoteDatasetTable | null {\n const normalized = normalizeTableToken(value);\n return normalized ? (TABLE_ALIASES.get(normalized) ?? null) : null;\n}\n\nfunction tableFromPath(pathExpression: string): RemoteDatasetTable | null {\n const pathEnd = pathExpression.split('/').filter(Boolean).at(-1) ?? '';\n return PATH_TABLE_HINTS.find(([pattern]) => pattern.test(pathEnd))?.[1] ?? null;\n}\n\nfunction shortDescription(value: unknown): string | null {\n if (typeof value === 'string') {\n return textValue(value);\n }\n if (Array.isArray(value)) {\n for (const entry of value) {\n const text = shortDescription(entry);\n if (text) {\n return text;\n }\n }\n return null;\n }\n if (isRecord(value)) {\n return textValue(value['#text'] ?? value.text ?? value.value);\n }\n return null;\n}\n\nfunction pointerPath(basePath: string, segment: string | number): string {\n const encoded = String(segment).replace(/~/gu, '~0').replace(/\\//gu, '~1');\n return `${basePath}/${encoded}`;\n}\n\nfunction unescapePointerSegment(segment: string): string {\n return segment.replace(/~1/gu, '/').replace(/~0/gu, '~');\n}\n\nfunction isFoundryTracePath(pathExpression: string): boolean {\n const segments = pathExpression.split('/').filter(Boolean).map(unescapePointerSegment);\n return (\n segments.includes('common:other') &&\n segments.some(\n (segment) =>\n segment.startsWith('tiangongfoundry:') && segment.toLowerCase().includes('trace'),\n )\n );\n}\n\nfunction rootOf(\n payload: JsonObject,\n): { descriptor: RootDatasetDescriptor; root: JsonObject } | null {\n for (const descriptor of ROOT_DATASET_DESCRIPTORS) {\n if (isRecord(payload[descriptor.wrapper])) {\n return { descriptor, root: payload[descriptor.wrapper] as JsonObject };\n }\n }\n return null;\n}\n\nfunction rootIdentity(row: JsonObject, payload: JsonObject): RemoteDatasetReference | null {\n const root = rootOf(payload);\n if (!root) {\n return null;\n }\n const information = isRecord(root.root[root.descriptor.information_key])\n ? (root.root[root.descriptor.information_key] as JsonObject)\n : {};\n const dataSetInformation = isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.root.administrativeInformation)\n ? root.root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n\n return {\n row_index: -1,\n role: 'root',\n table: root.descriptor.table,\n type: root.descriptor.type,\n id: firstNonEmpty(row.id, row.uuid, dataSetInformation['common:UUID']),\n version: firstNonEmpty(row.version, publicationAndOwnership['common:dataSetVersion']),\n path: `/${root.descriptor.wrapper}`,\n short_description: shortDescription(dataSetInformation.name ?? dataSetInformation.shortName),\n };\n}\n\nfunction referenceFromRecord(\n rowIndex: number,\n value: JsonObject,\n pathExpression: string,\n): RemoteDatasetReference | null {\n const id = firstNonEmpty(value['@refObjectId'], value.refObjectId, value.id);\n if (!id) {\n return null;\n }\n const type = firstNonEmpty(value['@type'], value.type);\n const table = tableFromType(type) ?? tableFromPath(pathExpression);\n return {\n row_index: rowIndex,\n role: 'reference',\n table,\n type,\n id,\n version: firstNonEmpty(value['@version'], value.version),\n path: pathExpression,\n short_description: shortDescription(value['common:shortDescription']),\n };\n}\n\nfunction flowReferenceFromRecord(\n rowIndex: number,\n value: JsonObject,\n pathExpression: string,\n): RemoteDatasetReference | null {\n const id = firstNonEmpty(value['@flowUUID']);\n return id\n ? {\n row_index: rowIndex,\n role: 'reference',\n table: 'flows',\n type: 'flow data set',\n id,\n version: firstNonEmpty(value['@version'], value.version),\n path: pointerPath(pathExpression, '@flowUUID'),\n short_description: null,\n }\n : null;\n}\n\nfunction collectReferencesFromValue(\n rowIndex: number,\n value: unknown,\n pathExpression: string,\n references: RemoteDatasetReference[],\n): void {\n if (isFoundryTracePath(pathExpression)) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry, index) =>\n collectReferencesFromValue(rowIndex, entry, pointerPath(pathExpression, index), references),\n );\n return;\n }\n\n if (!isRecord(value)) {\n return;\n }\n\n const ref = referenceFromRecord(rowIndex, value, pathExpression);\n if (ref) {\n references.push(ref);\n }\n const flowRef = flowReferenceFromRecord(rowIndex, value, pathExpression);\n if (flowRef) {\n references.push(flowRef);\n }\n for (const [key, nested] of Object.entries(value)) {\n collectReferencesFromValue(rowIndex, nested, pointerPath(pathExpression, key), references);\n }\n}\n\nexport function collectRemoteReferences(rows: JsonObject[]): RemoteDatasetReference[] {\n const references: RemoteDatasetReference[] = [];\n rows.forEach((row, index) => {\n const payload = unwrapDatasetPayload(row);\n const root = rootIdentity(row, payload);\n if (root) {\n references.push({ ...root, row_index: index });\n }\n collectReferencesFromValue(index, payload, '', references);\n });\n return references;\n}\n\nfunction compareVersions(left: string | null, right: string | null): number {\n if (!left && !right) {\n return 0;\n }\n if (!left) {\n return -1;\n }\n if (!right) {\n return 1;\n }\n const leftParts = left.split(/[._-]/u);\n const rightParts = right.split(/[._-]/u);\n const length = Math.max(leftParts.length, rightParts.length);\n for (let index = 0; index < length; index += 1) {\n const leftPart = leftParts[index] ?? '0';\n const rightPart = rightParts[index] ?? '0';\n const leftNumber = Number(leftPart);\n const rightNumber = Number(rightPart);\n if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber)) {\n if (leftNumber !== rightNumber) {\n return leftNumber > rightNumber ? 1 : -1;\n }\n } else {\n const compared = leftPart.localeCompare(rightPart);\n if (compared !== 0) {\n return compared > 0 ? 1 : -1;\n }\n }\n }\n return 0;\n}\n\nfunction buildRemoteUrl(\n restBaseUrl: string,\n table: RemoteDatasetTable,\n id: string,\n version: string | null,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('id', `eq.${id}`);\n if (version) {\n url.searchParams.set('version', `eq.${version}`);\n } else {\n url.searchParams.set('order', 'version.desc');\n url.searchParams.set('limit', '1');\n }\n return url.toString();\n}\n\nfunction normalizeRows(value: unknown): RemoteDatasetLookupRow[] {\n return Array.isArray(value)\n ? value\n .filter(isRecord)\n .map((row) => ({\n id: firstNonEmpty(row.id) ?? '',\n version: firstNonEmpty(row.version),\n }))\n .filter((row) => Boolean(row.id))\n : [];\n}\n\nfunction stableJson(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stableJson);\n }\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, stableJson(value[key])]),\n );\n }\n return value;\n}\n\nfunction sha256Json(value: unknown): string {\n return crypto\n .createHash('sha256')\n .update(JSON.stringify(stableJson(value)))\n .digest('hex');\n}\n\nfunction buildRemotePayloadUrl(\n restBaseUrl: string,\n table: RemoteDatasetTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('select', 'id,version,user_id,state_code,modified_at,json,json_ordered');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction normalizePayloadRow(value: unknown): RemoteDatasetPayloadLookup | null {\n if (!isRecord(value)) {\n return null;\n }\n const payload = isRecord(value.json_ordered)\n ? value.json_ordered\n : isRecord(value.json)\n ? value.json\n : null;\n return {\n id: firstNonEmpty(value.id) ?? '',\n version: firstNonEmpty(value.version),\n user_id: firstNonEmpty(value.user_id),\n state_code: typeof value.state_code === 'number' ? value.state_code : null,\n modified_at: firstNonEmpty(value.modified_at),\n payload: payload as JsonObject | null,\n source_url: null,\n };\n}\n\nexport async function lookupRemoteDataset(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n request: RemoteDatasetLookupRequest;\n}): Promise<RemoteDatasetLookup> {\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const exactSourceUrl = options.request.version\n ? buildRemoteUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n options.request.version,\n )\n : null;\n const latestSourceUrl = buildRemoteUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n null,\n );\n const exactRows = options.request.version\n ? normalizeRows(\n await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version')\n .eq('id', options.request.id)\n .eq('version', options.request.version),\n exactSourceUrl as string,\n ),\n )\n : [];\n const latestRows = normalizeRows(\n await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version')\n .eq('id', options.request.id)\n .order('version', { ascending: false })\n .limit(1),\n latestSourceUrl,\n ),\n );\n return {\n exact: exactRows[0] ?? null,\n latest: latestRows[0] ?? null,\n exact_source_url: exactSourceUrl,\n latest_source_url: latestSourceUrl,\n };\n}\n\nasync function lookupRemoteDatasetPayload(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n request: RemoteDatasetLookupRequest;\n}): Promise<RemoteDatasetPayloadLookup | null> {\n if (!options.request.version) {\n return null;\n }\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const sourceUrl = buildRemotePayloadUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n options.request.version,\n );\n const rows = await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version,user_id,state_code,modified_at,json,json_ordered')\n .eq('id', options.request.id)\n .eq('version', options.request.version),\n sourceUrl,\n );\n const payloadRow = normalizePayloadRow(Array.isArray(rows) ? rows[0] : null);\n return payloadRow ? { ...payloadRow, source_url: sourceUrl } : null;\n}\n\nfunction checkMessage(reference: RemoteDatasetReference, status: RemoteVerificationStatus): string {\n const label = `${reference.table ?? reference.type ?? 'unknown'}:${reference.id ?? '-'}@${\n reference.version ?? '-'\n }`;\n switch (status) {\n case 'ok':\n return `Remote dataset reference is resolvable: ${label}.`;\n case 'lookup_failed':\n return `Remote lookup failed for dataset reference: ${label}.`;\n case 'missing_dataset':\n return `Remote dataset id does not exist: ${label}.`;\n case 'missing_version':\n return `Remote dataset id exists, but the requested version does not exist: ${label}.`;\n case 'unsupported_type':\n return `Dataset reference type cannot be mapped to a TianGong table: ${label}.`;\n case 'version_missing':\n return `Dataset reference is missing @version and cannot pass publish-readiness verification: ${label}.`;\n case 'version_outdated':\n return `Requested dataset version is lower than the latest published version: ${label}.`;\n }\n}\n\nfunction classifyCheck(\n reference: RemoteDatasetReference,\n lookup: RemoteDatasetLookup | null,\n lookupFailed: boolean,\n rootPolicy: RemoteVerificationRootPolicy,\n): RemoteVerificationCheck {\n let status: RemoteVerificationStatus = 'ok';\n if (!reference.table || !reference.id) {\n status = 'unsupported_type';\n } else if (lookupFailed) {\n status = 'lookup_failed';\n } else if (!reference.version) {\n status = 'version_missing';\n } else if (reference.role === 'root' && rootPolicy === 'candidate') {\n if (!lookup?.latest) {\n status = 'ok';\n } else if (!lookup.exact) {\n status =\n compareVersions(reference.version, lookup.latest.version) > 0\n ? 'ok'\n : compareVersions(lookup.latest.version, reference.version) > 0\n ? 'version_outdated'\n : 'missing_version';\n } else if (compareVersions(lookup.latest.version, reference.version) > 0) {\n status = 'version_outdated';\n }\n } else if (!lookup?.latest) {\n status = 'missing_dataset';\n } else if (!lookup.exact) {\n status = 'missing_version';\n } else if (compareVersions(lookup.latest.version, reference.version) > 0) {\n status = 'version_outdated';\n }\n return {\n ...reference,\n status,\n exact_version: lookup?.exact?.version ?? null,\n latest_version: lookup?.latest?.version ?? null,\n exact_source_url: lookup?.exact_source_url ?? null,\n latest_source_url: lookup?.latest_source_url ?? null,\n message: checkMessage(reference, status),\n };\n}\n\nfunction blockerFromCheck(check: RemoteVerificationCheck): RemoteVerificationBlocker | null {\n return check.status === 'ok'\n ? null\n : {\n code: check.status,\n severity: 'error',\n message: check.message,\n row_index: check.row_index,\n role: check.role,\n table: check.table,\n id: check.id,\n version: check.version,\n latest_version: check.latest_version,\n path: check.path,\n };\n}\n\nfunction makeRootReadbackCheck(\n reference: RemoteDatasetReference,\n status: RemoteVerificationIssueCode,\n message: string,\n remote: RemoteDatasetPayloadLookup | null,\n hashes: {\n local: string | null;\n remote: string | null;\n } = { local: null, remote: null },\n): RemoteVerificationCheck {\n return {\n ...reference,\n path: `${reference.path}#readback`,\n status,\n exact_version: remote?.version ?? null,\n latest_version: null,\n exact_source_url: remote?.source_url ?? null,\n latest_source_url: null,\n message,\n remote_user_id: remote?.user_id ?? null,\n remote_state_code: remote?.state_code ?? null,\n remote_modified_at: remote?.modified_at ?? null,\n local_payload_sha256: hashes.local,\n remote_payload_sha256: hashes.remote,\n };\n}\n\nfunction rootReadbackChecks(options: {\n reference: RemoteDatasetReference;\n localPayload: JsonObject;\n remote: RemoteDatasetPayloadLookup | null;\n compareRootPayload: boolean;\n targetUserId: string | null;\n stateCode: number | null;\n}): RemoteVerificationCheck[] {\n const { reference, localPayload, remote, compareRootPayload, targetUserId, stateCode } = options;\n if (!remote) {\n return [\n makeRootReadbackCheck(\n reference,\n 'missing_dataset',\n `Remote root payload was not found for ${reference.table}:${reference.id}@${reference.version}.`,\n null,\n ),\n ];\n }\n\n const checks: RemoteVerificationCheck[] = [];\n if (targetUserId && remote.user_id !== targetUserId) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'owner_mismatch',\n `Remote root owner ${remote.user_id ?? '<missing>'} does not match target user ${targetUserId}.`,\n remote,\n ),\n );\n }\n if (stateCode !== null && remote.state_code !== stateCode) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'state_code_mismatch',\n `Remote root state_code ${remote.state_code ?? '<missing>'} does not match required state_code ${stateCode}.`,\n remote,\n ),\n );\n }\n\n let hashes: { local: string | null; remote: string | null } = { local: null, remote: null };\n if (compareRootPayload) {\n if (!remote.payload) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'remote_payload_missing',\n `Remote root payload is missing for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n ),\n );\n } else {\n hashes = {\n local: sha256Json(localPayload),\n remote: sha256Json(remote.payload),\n };\n if (hashes.local !== hashes.remote) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'payload_mismatch',\n `Remote root payload hash does not match local row for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n hashes,\n ),\n );\n }\n }\n }\n\n if (checks.length > 0) {\n return checks;\n }\n return [\n makeRootReadbackCheck(\n reference,\n 'ok',\n `Remote root readback matches required owner, state, and payload checks for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n hashes,\n ),\n ];\n}\n\nfunction buildFiles(outDir: string): DatasetRemoteVerificationReport['files'] {\n const resolved = path.resolve(outDir);\n return {\n report: path.join(resolved, 'outputs', 'remote-verification-report.json'),\n checks: path.join(resolved, 'outputs', 'remote-verification.jsonl'),\n blockers: path.join(resolved, 'outputs', 'blockers.jsonl'),\n };\n}\n\nfunction uniqueLookupKey(reference: RemoteDatasetReference): string | null {\n return reference.table && reference.id\n ? `${reference.table}:${reference.id}:${reference.version ?? ''}`\n : null;\n}\n\nexport async function runDatasetRemoteVerify(\n options: RunDatasetRemoteVerifyOptions,\n): Promise<DatasetRemoteVerificationReport> {\n const inputPath = path.resolve(\n requireNonEmpty(options.inputPath, '--input', 'DATASET_REMOTE_VERIFY_INPUT_REQUIRED'),\n );\n const outDir = path.resolve(\n requireNonEmpty(options.outDir, '--out-dir', 'DATASET_REMOTE_VERIFY_OUT_DIR_REQUIRED'),\n );\n const rows = readDatasetRowsInput(inputPath, options.rawInput);\n const references = collectRemoteReferences(rows);\n const rootPolicy = options.rootPolicy ?? 'existing';\n const compareRootPayload = options.compareRootPayload === true;\n const targetUserId = trimToken(options.targetUserId);\n const stateCode = options.stateCode ?? null;\n const needsRootReadback = compareRootPayload || Boolean(targetUserId) || stateCode !== null;\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const runtime =\n options.lookupDatasetImpl === undefined\n ? createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n })\n : null;\n const lookupImpl =\n options.lookupDatasetImpl ??\n ((request: RemoteDatasetLookupRequest) =>\n lookupRemoteDataset({\n runtime: runtime as SupabaseDataRuntime,\n fetchImpl,\n timeoutMs,\n request,\n }));\n const rootPayloadLookupImpl =\n options.lookupRootPayloadImpl ??\n (runtime\n ? (request: RemoteDatasetLookupRequest) =>\n lookupRemoteDatasetPayload({\n runtime: runtime as SupabaseDataRuntime,\n fetchImpl,\n timeoutMs,\n request,\n })\n : null);\n const lookupCache = new Map<string, Promise<RemoteDatasetLookup>>();\n const checks: RemoteVerificationCheck[] = [];\n\n // Pre-fetch the unique remote lookups in bounded-concurrency batches. Large\n // reference closures (e.g. a mega-process referencing 1600+ flows) would\n // otherwise serialize into thousands of sequential round-trips and take many\n // minutes; the loop below then simply awaits the already-in-flight cached\n // promises, preserving the existing per-reference error handling.\n const REMOTE_LOOKUP_CONCURRENCY = 20;\n const prefetch: Array<{ key: string; request: RemoteDatasetLookupRequest }> = [];\n const prefetchQueued = new Set<string>();\n for (const reference of references) {\n const lookupKey = uniqueLookupKey(reference);\n if (reference.table && reference.id && lookupKey && !prefetchQueued.has(lookupKey)) {\n prefetchQueued.add(lookupKey);\n prefetch.push({\n key: lookupKey,\n request: { table: reference.table, id: reference.id, version: reference.version },\n });\n }\n }\n for (let offset = 0; offset < prefetch.length; offset += REMOTE_LOOKUP_CONCURRENCY) {\n const batch = prefetch.slice(offset, offset + REMOTE_LOOKUP_CONCURRENCY);\n await Promise.all(\n batch.map(({ key, request }) => {\n const promise = lookupImpl(request);\n lookupCache.set(key, promise);\n return promise.then(\n () => undefined,\n () => undefined,\n );\n }),\n );\n }\n\n for (const reference of references) {\n let lookup: RemoteDatasetLookup | null = null;\n let lookupFailed = false;\n const lookupKey = uniqueLookupKey(reference);\n if (reference.table && reference.id && lookupKey) {\n // The bounded-concurrency prefetch above populated lookupCache for every\n // reference that passes this same guard, so the promise is always present.\n try {\n lookup = await lookupCache.get(lookupKey)!;\n } catch {\n lookupFailed = true;\n }\n }\n checks.push(classifyCheck(reference, lookup, lookupFailed, rootPolicy));\n }\n\n if (needsRootReadback) {\n const rootChecks = checks.filter(\n (check) =>\n check.role === 'root' &&\n check.status === 'ok' &&\n check.table &&\n check.id &&\n (compareRootPayload || rootPolicy !== 'candidate' || Boolean(check.exact_version)),\n );\n for (const check of rootChecks) {\n const localPayload = unwrapDatasetPayload(rows[check.row_index]);\n let remotePayload: RemoteDatasetPayloadLookup | null;\n try {\n if (!rootPayloadLookupImpl) {\n throw new Error('root payload lookup is not available');\n }\n remotePayload = await rootPayloadLookupImpl({\n table: check.table as RemoteDatasetTable,\n id: check.id as string,\n version: check.version,\n });\n } catch {\n checks.push(\n makeRootReadbackCheck(\n check,\n 'lookup_failed',\n `Remote root payload lookup failed for ${check.table}:${check.id}@${check.version}.`,\n null,\n ),\n );\n continue;\n }\n checks.push(\n ...rootReadbackChecks({\n reference: check,\n localPayload,\n remote: remotePayload,\n compareRootPayload,\n targetUserId,\n stateCode,\n }),\n );\n }\n }\n\n const blockers = checks\n .map(blockerFromCheck)\n .filter((blocker): blocker is RemoteVerificationBlocker => blocker !== null);\n const byStatus = { ...EMPTY_STATUS_COUNTS };\n const byTable = { ...EMPTY_TABLE_COUNTS };\n checks.forEach((check) => {\n byStatus[check.status] ??= 0;\n byStatus[check.status] += 1;\n if (check.table) {\n byTable[check.table] += 1;\n }\n });\n const rootReadbackChecksCount = checks.filter((check) => check.path.endsWith('#readback')).length;\n const rootPayloadMismatches = checks.filter(\n (check) => check.status === 'payload_mismatch',\n ).length;\n\n const files = buildFiles(outDir);\n const report: DatasetRemoteVerificationReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: blockers.length > 0 ? 'blocked_remote_verification' : 'passed_remote_verification',\n root_policy: rootPolicy,\n input_path: inputPath,\n out_dir: outDir,\n counts: {\n rows: rows.length,\n references: references.length,\n checked: checks.length,\n blockers: blockers.length,\n ...(needsRootReadback ? { root_readback_checks: rootReadbackChecksCount } : {}),\n ...(needsRootReadback ? { root_payload_mismatches: rootPayloadMismatches } : {}),\n by_status: byStatus,\n by_table: byTable,\n },\n blockers,\n files,\n };\n\n writeJsonArtifact(files.report, report);\n writeJsonLinesArtifact(files.checks, checks);\n writeJsonLinesArtifact(files.blockers, blockers);\n\n return report;\n}\n\nexport const __testInternals = {\n buildRemotePayloadUrl,\n buildRemoteUrl,\n collectRemoteReferences,\n compareVersions,\n isFoundryTracePath,\n lookupRemoteDatasetPayload,\n lookupRemoteDataset,\n makeRootReadbackCheck,\n normalizePayloadRow,\n normalizeRows,\n rootReadbackChecks,\n sha256Json,\n shortDescription,\n tableFromPath,\n tableFromType,\n};\n"]}
@@ -86,7 +86,7 @@ function serializeError(error) {
86
86
  }
87
87
  return { message: String(error) };
88
88
  }
89
- function normalizeType(value) {
89
+ function normalizeType(value, allowReferenceOnlySupport = false) {
90
90
  const normalized = value?.trim().toLowerCase();
91
91
  if (!normalized || normalized === 'auto') {
92
92
  return 'auto';
@@ -101,6 +101,9 @@ function normalizeType(value) {
101
101
  normalized === 'unitgroups' ||
102
102
  normalized === 'unit-group' ||
103
103
  normalized === 'unit-groups') {
104
+ if (allowReferenceOnlySupport) {
105
+ return 'unitgroup';
106
+ }
104
107
  throw new CliError('Unit groups are reference-only support data for dataset save-draft. Select an existing database row instead of creating a custom My Data unit group.', {
105
108
  code: 'DATASET_SAVE_DRAFT_REFERENCE_ONLY_TYPE',
106
109
  exitCode: 2,
@@ -111,6 +114,9 @@ function normalizeType(value) {
111
114
  normalized === 'flowproperties' ||
112
115
  normalized === 'flow-property' ||
113
116
  normalized === 'flow-properties') {
117
+ if (allowReferenceOnlySupport) {
118
+ return 'flowproperty';
119
+ }
114
120
  throw new CliError('Flow properties are reference-only support data for dataset save-draft. Select an existing database row instead of creating a custom My Data flow property.', {
115
121
  code: 'DATASET_SAVE_DRAFT_REFERENCE_ONLY_TYPE',
116
122
  exitCode: 2,
@@ -422,7 +428,7 @@ function selectedRow(row) {
422
428
  payload: row.payload,
423
429
  };
424
430
  }
425
- function buildPreparedFailure(row) {
431
+ function buildPreparedFailure(row, allowReferenceOnlySupport = false) {
426
432
  if (!row.type || !row.config) {
427
433
  return {
428
434
  index: row.index,
@@ -438,7 +444,7 @@ function buildPreparedFailure(row) {
438
444
  },
439
445
  };
440
446
  }
441
- if (REFERENCE_ONLY_SAVE_DRAFT_TYPES.has(row.type)) {
447
+ if (REFERENCE_ONLY_SAVE_DRAFT_TYPES.has(row.type) && !allowReferenceOnlySupport) {
442
448
  return {
443
449
  index: row.index,
444
450
  id: row.id,
@@ -529,7 +535,9 @@ export async function runDatasetSaveDraft(options) {
529
535
  const now = options.now ?? new Date();
530
536
  const inputPath = path.resolve(options.inputPath);
531
537
  const commit = options.commit === true;
532
- const requestedType = normalizeType(options.type);
538
+ const allowReferenceOnlySupport = options.allowReferenceOnlySupport === true ||
539
+ (options.env?.TIANGONG_ALLOW_ACCOUNT_LOCAL_SUPPORT ?? '') === '1';
540
+ const requestedType = normalizeType(options.type, allowReferenceOnlySupport);
533
541
  const outDir = path.resolve(options.outDir ?? defaultOutDir(inputPath, commit, now));
534
542
  const files = buildFiles(outDir);
535
543
  const preparedRows = prepareRows(inputPath, options.rawInput, requestedType);
@@ -561,7 +569,7 @@ export async function runDatasetSaveDraft(options) {
561
569
  const referenceOnlySupportCache = new Map();
562
570
  const reports = [];
563
571
  for (const row of preparedRows) {
564
- const preparedFailure = buildPreparedFailure(row);
572
+ const preparedFailure = buildPreparedFailure(row, allowReferenceOnlySupport);
565
573
  if (preparedFailure) {
566
574
  reports.push(preparedFailure);
567
575
  continue;
@@ -590,7 +598,7 @@ export async function runDatasetSaveDraft(options) {
590
598
  });
591
599
  const visibleRow = visibleRows[0] ?? null;
592
600
  if (row.type === 'flow') {
593
- if (!visibleRow && isElementaryFlowPayload(row.payload)) {
601
+ if (!visibleRow && isElementaryFlowPayload(row.payload) && !allowReferenceOnlySupport) {
594
602
  reports.push({
595
603
  ...baseReport,
596
604
  status: 'failed',