@tiangong-lca/cli 0.0.32 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -12
  3. package/assets/import-smoke/simapro.csv +20 -0
  4. package/bin/tiangong-lca.js +1 -1
  5. package/dist/src/cli.js +103 -65
  6. package/dist/src/cli.js.map +1 -1
  7. package/dist/src/lib/dataset-bilingual.js.map +1 -1
  8. package/dist/src/lib/dataset-classification.js.map +1 -1
  9. package/dist/src/lib/dataset-contract.js.map +1 -1
  10. package/dist/src/lib/dataset-evidence-search.js.map +1 -1
  11. package/dist/src/lib/dataset-import-lca.js +302 -131
  12. package/dist/src/lib/dataset-import-lca.js.map +1 -1
  13. package/dist/src/lib/dataset-maintenance-apply.js +916 -43
  14. package/dist/src/lib/dataset-maintenance-apply.js.map +1 -1
  15. package/dist/src/lib/dataset-maintenance-clear-account.js +10 -4
  16. package/dist/src/lib/dataset-maintenance-clear-account.js.map +1 -1
  17. package/dist/src/lib/dataset-maintenance-contract.js +1 -6
  18. package/dist/src/lib/dataset-maintenance-contract.js.map +1 -1
  19. package/dist/src/lib/dataset-maintenance-derivatives.js +0 -1
  20. package/dist/src/lib/dataset-maintenance-derivatives.js.map +1 -1
  21. package/dist/src/lib/dataset-maintenance-flow-identity-capture.js +1 -0
  22. package/dist/src/lib/dataset-maintenance-flow-identity-capture.js.map +1 -1
  23. package/dist/src/lib/dataset-maintenance-pagination.js.map +1 -1
  24. package/dist/src/lib/dataset-maintenance-protected-before.js.map +1 -1
  25. package/dist/src/lib/dataset-maintenance-protected-contract.js +0 -1
  26. package/dist/src/lib/dataset-maintenance-protected-contract.js.map +1 -1
  27. package/dist/src/lib/dataset-maintenance-protected-freeze.js.map +1 -1
  28. package/dist/src/lib/dataset-maintenance-protected-preparation.js +0 -2
  29. package/dist/src/lib/dataset-maintenance-protected-preparation.js.map +1 -1
  30. package/dist/src/lib/dataset-maintenance-protected-seal.js.map +1 -1
  31. package/dist/src/lib/dataset-maintenance-protected-verify.js +0 -3
  32. package/dist/src/lib/dataset-maintenance-protected-verify.js.map +1 -1
  33. package/dist/src/lib/dataset-maintenance-remote.js +68 -12
  34. package/dist/src/lib/dataset-maintenance-remote.js.map +1 -1
  35. package/dist/src/lib/dataset-maintenance-verify.js +1 -2
  36. package/dist/src/lib/dataset-maintenance-verify.js.map +1 -1
  37. package/dist/src/lib/dataset-remote-refresh.js.map +1 -1
  38. package/dist/src/lib/dataset-remote-verify.js +2 -0
  39. package/dist/src/lib/dataset-remote-verify.js.map +1 -1
  40. package/dist/src/lib/dataset-save-draft-run.js +2 -0
  41. package/dist/src/lib/dataset-save-draft-run.js.map +1 -1
  42. package/dist/src/lib/flow-build-alias-map.js.map +1 -1
  43. package/dist/src/lib/flow-fetch-rows.js.map +1 -1
  44. package/dist/src/lib/flow-get.js.map +1 -1
  45. package/dist/src/lib/flow-governance.js.map +1 -1
  46. package/dist/src/lib/flow-list.js +1 -0
  47. package/dist/src/lib/flow-list.js.map +1 -1
  48. package/dist/src/lib/flow-payload-validation.js.map +1 -1
  49. package/dist/src/lib/flow-publish-version.js +1 -0
  50. package/dist/src/lib/flow-publish-version.js.map +1 -1
  51. package/dist/src/lib/flow-read.js +1 -0
  52. package/dist/src/lib/flow-read.js.map +1 -1
  53. package/dist/src/lib/flow-regen-product.js.map +1 -1
  54. package/dist/src/lib/flow-remediate.js.map +1 -1
  55. package/dist/src/lib/identity-preflight.js +4 -10
  56. package/dist/src/lib/identity-preflight.js.map +1 -1
  57. package/dist/src/lib/lifecyclemodel-bundle-save.js +1 -0
  58. package/dist/src/lib/lifecyclemodel-bundle-save.js.map +1 -1
  59. package/dist/src/lib/lifecyclemodel-orchestrate.js.map +1 -1
  60. package/dist/src/lib/lifecyclemodel-publish-resulting-process.js.map +1 -1
  61. package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -1
  62. package/dist/src/lib/lifecyclemodel-save-draft-run.js.map +1 -1
  63. package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -1
  64. package/dist/src/lib/package-version.js.map +1 -1
  65. package/dist/src/lib/process-auto-build.js.map +1 -1
  66. package/dist/src/lib/process-dedup-review.js +14 -7
  67. package/dist/src/lib/process-dedup-review.js.map +1 -1
  68. package/dist/src/lib/process-flow-build-plan.js +111 -30
  69. package/dist/src/lib/process-flow-build-plan.js.map +1 -1
  70. package/dist/src/lib/process-get.js +1 -0
  71. package/dist/src/lib/process-get.js.map +1 -1
  72. package/dist/src/lib/process-list.js +1 -0
  73. package/dist/src/lib/process-list.js.map +1 -1
  74. package/dist/src/lib/process-payload-validation.js.map +1 -1
  75. package/dist/src/lib/process-qa.js.map +1 -1
  76. package/dist/src/lib/process-refresh-references.js +15 -10
  77. package/dist/src/lib/process-refresh-references.js.map +1 -1
  78. package/dist/src/lib/process-save-draft.js +9 -3
  79. package/dist/src/lib/process-save-draft.js.map +1 -1
  80. package/dist/src/lib/process-scope-statistics.js +11 -4
  81. package/dist/src/lib/process-scope-statistics.js.map +1 -1
  82. package/dist/src/lib/process-verify-rows.js.map +1 -1
  83. package/dist/src/lib/publish.js.map +1 -1
  84. package/dist/src/lib/run.js.map +1 -1
  85. package/dist/src/lib/supabase-client.js +13 -1
  86. package/dist/src/lib/supabase-client.js.map +1 -1
  87. package/dist/src/lib/supabase-data-api-contract.js +328 -0
  88. package/dist/src/lib/supabase-data-api-contract.js.map +1 -0
  89. package/dist/src/lib/supabase-data-api-replay.js +69 -0
  90. package/dist/src/lib/supabase-data-api-replay.js.map +1 -0
  91. package/dist/src/lib/supabase-json-ordered-write.js +2 -0
  92. package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
  93. package/dist/src/lib/supabase-rest.js +1 -0
  94. package/dist/src/lib/supabase-rest.js.map +1 -1
  95. package/dist/src/lib/tidas-sdk-package-validator.js +5 -5
  96. package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -1
  97. package/dist/src/lib/validation.js.map +1 -1
  98. package/dist/src/main.js.map +1 -1
  99. package/package.json +40 -40
  100. package/dist/scripts/assert-full-coverage.js +0 -77
  101. package/dist/scripts/assert-full-coverage.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-maintenance-flow-identity-capture.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-flow-identity-capture.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { existsSync } from 'node:fs';\nimport {\n computeFlowIdentityCaptureEvidenceSha256,\n computeFlowIdentityCaptureSha256,\n parseFlowIdentityCapture,\n parseFlowIdentityPolicy,\n parseFlowIdentityReviewLedger,\n type FlowIdentityLiveCapture,\n} from './dataset-maintenance-flow-identity-contract.js';\nimport {\n buildFlowIdentityCaptureRequest,\n buildFlowIdentitySemantics,\n flowType,\n type ValidationDeps,\n} from './dataset-maintenance-flow-identity-plan.js';\nimport {\n materializePrivateArtifactDirectoryAtomically,\n readProtectedJsonArtifact,\n writePrivateImmutableJson,\n} from './dataset-maintenance-protected-artifacts.js';\nimport { parseProtectedToolchainEvidence } from './dataset-maintenance-protected-toolchain.js';\nimport {\n attestMaintenanceFlowIdentityCapture,\n fetchMaintenanceAccountTableRows,\n fetchMaintenanceExactRows,\n isMaintenanceRpcDomainFailure,\n resolveMaintenanceRemoteContext,\n type DatasetMaintenanceRemoteContext,\n} from './dataset-maintenance-remote.js';\nimport {\n isJsonObject,\n sha256Json,\n snapshotRemoteRow,\n stableJsonText,\n type DatasetMaintenanceRemoteRow,\n type DatasetMaintenanceRowSnapshot,\n type JsonObject,\n} from './dataset-maintenance-contract.js';\nimport { flowIdentityRestrictedSha256 } from './dataset-maintenance-flow-identity-wire.js';\nimport { validateFlowPayload } from './flow-payload-validation.js';\nimport { validateProcessPayload } from './process-payload-validation.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\n\nconst HASH = /^[a-f0-9]{64}$/u;\nconst UUID = /^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/u;\nconst VERSION = /^\\d{2}\\.\\d{2}\\.\\d{3}$/u;\n\nexport type FlowIdentityPrerequisites = {\n schema_version: 'dataset-flow-identity-prerequisites.v2';\n step2: {\n readback_sha256: string;\n completed_at_utc: string;\n status: 'passed';\n };\n issue29_target1: {\n readback_sha256: string;\n completed_at_utc: string;\n status: 'passed';\n };\n issue29_target2: {\n readback_sha256: string;\n completed_at_utc: string;\n status: 'passed';\n };\n};\n\nexport type CaptureFlowIdentityOptions = {\n policyPath: string;\n reviewLedgerPath: string;\n prerequisitesPath: string;\n toolchainEvidencePath: string;\n requestId: string;\n operationId: string;\n expectedProjectRef: string;\n confirm: string;\n cliVersion: string;\n sdkVersion: string;\n outDir: string;\n pageSize?: number;\n readConcurrency?: number;\n timeoutMs?: number;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n now?: Date;\n validation?: Partial<ValidationDeps>;\n};\n\nexport type FlowIdentityCaptureReport = {\n schema_version: 'dataset-flow-identity-capture-report.v2';\n generated_at_utc: string;\n status: 'captured';\n environment: 'production';\n project_ref: string;\n actor: { user_id: string; email: string };\n operation_id: string;\n request_id: string;\n receipt_id: string;\n receipt_proof_sha256: string;\n capture_request_sha256: string;\n live_capture_evidence_core_sha256: string;\n capture_artifact_sha256: string;\n counts: {\n sources: 305;\n targets: number;\n supports: number;\n owner_draft_processes: number;\n mappings: number;\n affected_processes: number;\n rewrites: number;\n };\n calls: {\n capture_attest: 1;\n scope_preflight: 0;\n process_rewrite: 0;\n scope_finalize: 0;\n automatic_retry: false;\n };\n artifacts: {\n request: string;\n attestation: string;\n live_capture: string;\n report: string;\n };\n};\n\ntype CaptureDependencies = {\n resolveContext: typeof resolveMaintenanceRemoteContext;\n fetchAccountTableRows: typeof fetchMaintenanceAccountTableRows;\n fetchExactRows: typeof fetchMaintenanceExactRows;\n attest: typeof attestMaintenanceFlowIdentityCapture;\n materialize: typeof materializePrivateArtifactDirectoryAtomically;\n};\n\nconst DEFAULT_DEPENDENCIES: CaptureDependencies = {\n resolveContext: resolveMaintenanceRemoteContext,\n fetchAccountTableRows: fetchMaintenanceAccountTableRows,\n fetchExactRows: fetchMaintenanceExactRows,\n attest: attestMaintenanceFlowIdentityCapture,\n materialize: materializePrivateArtifactDirectoryAtomically,\n};\n\nfunction fail(message: string, code = 'DATASET_FLOW_IDENTITY_CAPTURE_INVALID'): never {\n throw new CliError(message, { code, exitCode: 1 });\n}\n\nfunction exactKeys(value: JsonObject, keys: readonly string[]): boolean {\n const actual = Object.keys(value).sort();\n const expected = [...keys].sort();\n return actual.length === expected.length && actual.every((key, index) => key === expected[index]);\n}\n\nfunction readCanonical(filePath: string, label: string) {\n const artifact = readProtectedJsonArtifact({ filePath, label });\n if (artifact.text !== `${stableJsonText(artifact.value)}\\n`) {\n fail(`${label} must be canonical JSON with one trailing newline.`);\n }\n return artifact;\n}\n\nexport function parseFlowIdentityPrerequisites(value: unknown): FlowIdentityPrerequisites {\n if (\n !isJsonObject(value) ||\n !isJsonObject(value.step2) ||\n !isJsonObject(value.issue29_target1) ||\n !isJsonObject(value.issue29_target2) ||\n !exactKeys(value, ['schema_version', 'step2', 'issue29_target1', 'issue29_target2']) ||\n !exactKeys(value.step2, ['readback_sha256', 'completed_at_utc', 'status']) ||\n !exactKeys(value.issue29_target1, ['readback_sha256', 'completed_at_utc', 'status']) ||\n !exactKeys(value.issue29_target2, ['readback_sha256', 'completed_at_utc', 'status'])\n ) {\n fail('Flow identity prerequisites are invalid.');\n }\n const parsed = value as FlowIdentityPrerequisites;\n if (\n parsed.schema_version !== 'dataset-flow-identity-prerequisites.v2' ||\n parsed.step2.status !== 'passed' ||\n parsed.issue29_target1.status !== 'passed' ||\n parsed.issue29_target2.status !== 'passed' ||\n !HASH.test(parsed.step2.readback_sha256) ||\n !HASH.test(parsed.issue29_target1.readback_sha256) ||\n !HASH.test(parsed.issue29_target2.readback_sha256) ||\n !Number.isFinite(Date.parse(parsed.step2.completed_at_utc)) ||\n !Number.isFinite(Date.parse(parsed.issue29_target1.completed_at_utc)) ||\n !Number.isFinite(Date.parse(parsed.issue29_target2.completed_at_utc))\n ) {\n fail('Flow identity prerequisites do not prove passed Step 2 and issue #29 readbacks.');\n }\n return parsed;\n}\n\nfunction snapshot(row: DatasetMaintenanceRemoteRow): DatasetMaintenanceRowSnapshot {\n if (\n !row.user_id ||\n row.state_code === null ||\n !row.modified_at ||\n !row.json_ordered ||\n !row.json ||\n sha256Json(row.json) !== sha256Json(row.json_ordered)\n ) {\n fail('A capture row is incomplete or its json/json_ordered columns differ.');\n }\n return snapshotRemoteRow({\n table: row.table,\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n modified_at: row.modified_at,\n json_ordered: row.json_ordered,\n model_id: row.model_id,\n rule_verification: row.rule_verification,\n });\n}\n\nfunction identity(id: string, version: string): string {\n return `${id}\\u0000${version}`;\n}\n\nfunction referenceIdentity(value: unknown): { id: string; version: string } | null {\n if (\n !isJsonObject(value) ||\n typeof value['@refObjectId'] !== 'string' ||\n typeof value['@version'] !== 'string' ||\n !UUID.test(value['@refObjectId']) ||\n !VERSION.test(value['@version'])\n ) {\n return null;\n }\n return { id: value['@refObjectId'], version: value['@version'] };\n}\n\nfunction arrayOfObjects(value: unknown): JsonObject[] {\n const values = Array.isArray(value) ? value : isJsonObject(value) ? [value] : [];\n if (!values.every(isJsonObject)) fail('A flow support collection is malformed.');\n return values;\n}\n\nfunction flowPropertyClaim(payload: JsonObject): { id: string; version: string } {\n const root = isJsonObject(payload.flowDataSet) ? payload.flowDataSet : null;\n const information = isJsonObject(root?.flowInformation) ? root.flowInformation : null;\n const quantitative = isJsonObject(information?.quantitativeReference)\n ? information.quantitativeReference\n : null;\n const properties = isJsonObject(root?.flowProperties) ? root.flowProperties : null;\n const referenceInternalId = quantitative?.referenceToReferenceFlowProperty;\n const property = arrayOfObjects(properties?.flowProperty).find(\n (entry) => entry['@dataSetInternalID'] === referenceInternalId,\n );\n const claim = referenceIdentity(property?.referenceToFlowPropertyDataSet);\n if (!claim) fail('A mapped flow lacks an exact reference flow-property identity.');\n return claim;\n}\n\nfunction unitGroupClaim(payload: JsonObject): { id: string; version: string } {\n const root = isJsonObject(payload.flowPropertyDataSet) ? payload.flowPropertyDataSet : null;\n const information = isJsonObject(root?.flowPropertiesInformation)\n ? root.flowPropertiesInformation\n : null;\n const quantitative = isJsonObject(information?.quantitativeReference)\n ? information.quantitativeReference\n : null;\n const claim = referenceIdentity(quantitative?.referenceToReferenceUnitGroup);\n if (!claim) fail('A captured flow property lacks an exact unit-group identity.');\n return claim;\n}\n\nfunction processReferencesReviewedSource(\n row: DatasetMaintenanceRowSnapshot,\n reviewed: ReadonlySet<string>,\n): boolean {\n const root = isJsonObject(row.json_ordered?.processDataSet)\n ? row.json_ordered.processDataSet\n : null;\n const exchanges = isJsonObject(root?.exchanges) ? root.exchanges : null;\n const values = Array.isArray(exchanges?.exchange)\n ? exchanges.exchange\n : isJsonObject(exchanges?.exchange)\n ? [exchanges.exchange]\n : [];\n for (const value of values) {\n if (!isJsonObject(value)) fail('A captured process has a malformed exchange collection.');\n const reference = referenceIdentity(value.referenceToFlowDataSet);\n if (!reference) fail('A captured process exchange has a malformed flow reference.');\n if (reviewed.has(identity(reference.id, reference.version))) return true;\n }\n return false;\n}\n\nasync function fetchUniqueRows(options: {\n identities: Array<{\n table: 'flows' | 'flowproperties' | 'unitgroups';\n id: string;\n version: string;\n }>;\n context: DatasetMaintenanceRemoteContext;\n actorUserId: string;\n publicOnly: boolean;\n concurrency: number;\n dependencies: CaptureDependencies;\n}): Promise<DatasetMaintenanceRowSnapshot[]> {\n const rows: DatasetMaintenanceRowSnapshot[] = [];\n for (let offset = 0; offset < options.identities.length; offset += options.concurrency) {\n const chunk = options.identities.slice(offset, offset + options.concurrency);\n const fetched = await Promise.all(\n chunk.map(async (claim) => {\n const result = await options.dependencies.fetchExactRows({\n context: options.context,\n table: claim.table,\n id: claim.id,\n version: claim.version,\n includeJson: true,\n });\n const visible = result.rows.filter((row) =>\n options.publicOnly\n ? row.state_code === 100 && row.user_id !== options.actorUserId\n : row.state_code === 100 ||\n (row.state_code === 0 && row.user_id === options.actorUserId),\n );\n if (visible.length !== 1) {\n fail('A capture target/support identity is missing, duplicated, or outside visibility.');\n }\n return snapshot(visible[0]!);\n }),\n );\n rows.push(...fetched);\n }\n return rows.sort((left, right) =>\n `${left.table}\\u0000${identity(left.id, left.version)}`.localeCompare(\n `${right.table}\\u0000${identity(right.id, right.version)}`,\n ),\n );\n}\n\nfunction validateInputs(options: CaptureFlowIdentityOptions): { concurrency: number } {\n const concurrency = options.readConcurrency ?? 5;\n if (!UUID.test(options.requestId)) fail('capture request ID must be a canonical UUID.');\n if (!options.operationId.trim() || Buffer.byteLength(options.operationId, 'utf8') > 512) {\n fail('capture operation ID must be a non-empty token of at most 512 UTF-8 bytes.');\n }\n if (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > 5) {\n fail('capture read concurrency must be an integer between 1 and 5.');\n }\n if (!options.sdkVersion.trim()) fail('capture SDK version is required.');\n return { concurrency };\n}\n\nasync function executeCapture(\n options: CaptureFlowIdentityOptions,\n dependencies: CaptureDependencies,\n): Promise<FlowIdentityCaptureReport> {\n const { concurrency } = validateInputs(options);\n if (existsSync(path.resolve(options.outDir))) {\n fail('Capture output directory already exists; protected capture artifacts are immutable.');\n }\n const policyArtifact = readCanonical(options.policyPath, 'Flow identity compatibility policy');\n const reviewArtifact = readCanonical(options.reviewLedgerPath, 'Flow identity review ledger');\n const prerequisitesArtifact = readCanonical(\n options.prerequisitesPath,\n 'Flow identity prerequisites',\n );\n const toolchainArtifact = readCanonical(\n options.toolchainEvidencePath,\n 'Protected toolchain evidence',\n );\n const policy = parseFlowIdentityPolicy(policyArtifact.value);\n const review = parseFlowIdentityReviewLedger(reviewArtifact.value);\n const prerequisites = parseFlowIdentityPrerequisites(prerequisitesArtifact.value);\n if (policy.evidence_resolution_sha256 !== review.review_evidence_sha256) {\n fail('Compatibility policy does not bind the review ledger.');\n }\n parseProtectedToolchainEvidence(toolchainArtifact.value, {\n projectRef: options.expectedProjectRef,\n cliVersion: options.cliVersion,\n });\n const capturedAt = options.now ?? new Date();\n if (\n Date.parse(prerequisites.step2.completed_at_utc) > capturedAt.getTime() ||\n Date.parse(prerequisites.issue29_target1.completed_at_utc) > capturedAt.getTime() ||\n Date.parse(prerequisites.issue29_target2.completed_at_utc) > capturedAt.getTime()\n ) {\n fail('Capture time precedes a required passed prerequisite.');\n }\n const context = await dependencies.resolveContext({\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n now: options.now,\n });\n if (\n context.project_ref !== options.expectedProjectRef ||\n context.account.email.trim().toLowerCase() !== options.confirm.trim().toLowerCase()\n ) {\n fail('Authenticated production project/account does not match capture confirmation.');\n }\n const [flowCensus, processCensus] = await Promise.all([\n dependencies.fetchAccountTableRows({\n context,\n userId: context.account.user_id,\n table: 'flows',\n stateCode: 0,\n includeJson: true,\n pageSize: options.pageSize,\n }),\n dependencies.fetchAccountTableRows({\n context,\n userId: context.account.user_id,\n table: 'processes',\n stateCode: 0,\n includeJson: true,\n pageSize: options.pageSize,\n }),\n ]);\n const reviewed = new Set(\n review.entries.map((entry) => identity(entry.source.id, entry.source.version)),\n );\n const elementary = flowCensus.rows.filter(\n (row) => row.json_ordered && flowType(row.json_ordered) === 'Elementary flow',\n );\n const observed = new Set(elementary.map((row) => identity(row.id, row.version)));\n if (\n elementary.length !== 305 ||\n observed.size !== 305 ||\n [...reviewed].some((key) => !observed.has(key)) ||\n [...observed].some((key) => !reviewed.has(key))\n ) {\n fail(\n 'Authenticated owner-draft Elementary-flow census is not the exact 305-row review universe.',\n );\n }\n const sourceRows = elementary\n .map(snapshot)\n .sort((left, right) =>\n identity(left.id, left.version).localeCompare(identity(right.id, right.version)),\n );\n const fullProcessRows = processCensus.rows\n .map(snapshot)\n .sort((left, right) =>\n identity(left.id, left.version).localeCompare(identity(right.id, right.version)),\n );\n const processRows = fullProcessRows.filter((row) =>\n processReferencesReviewedSource(row, reviewed),\n );\n const processScanProof: JsonObject = {\n ...(processCensus.completeness as unknown as JsonObject),\n row_identity_set_sha256: sha256Json(\n fullProcessRows.map((row) => ({ id: row.id, version: row.version })),\n ),\n row_snapshot_set_sha256: sha256Json(\n fullProcessRows.map((row) => ({\n id: row.id,\n version: row.version,\n row_sha256: row.row_sha256,\n })),\n ),\n };\n const targetClaims = [\n ...new Map(\n review.entries\n .filter((entry) => entry.disposition === 'map_public')\n .map((entry) => [\n identity(entry.target!.id, entry.target!.version),\n {\n table: 'flows' as const,\n id: entry.target!.id,\n version: entry.target!.version,\n },\n ]),\n ).values(),\n ];\n const targetRows = await fetchUniqueRows({\n identities: targetClaims,\n context,\n actorUserId: context.account.user_id,\n publicOnly: true,\n concurrency,\n dependencies,\n });\n const fpClaims = [\n ...new Map(\n [\n ...sourceRows.filter((row) =>\n review.entries.some(\n (entry) =>\n entry.disposition === 'map_public' &&\n entry.source.id === row.id &&\n entry.source.version === row.version,\n ),\n ),\n ...targetRows,\n ].map((row) => {\n const claim = flowPropertyClaim(row.json_ordered!);\n return [\n identity(claim.id, claim.version),\n {\n table: 'flowproperties' as const,\n ...claim,\n },\n ];\n }),\n ).values(),\n ];\n const flowPropertyRows = await fetchUniqueRows({\n identities: fpClaims,\n context,\n actorUserId: context.account.user_id,\n publicOnly: false,\n concurrency,\n dependencies,\n });\n const unitGroupClaims = [\n ...new Map(\n flowPropertyRows.map((row) => {\n const claim = unitGroupClaim(row.json_ordered!);\n return [identity(claim.id, claim.version), { table: 'unitgroups' as const, ...claim }];\n }),\n ).values(),\n ];\n const unitGroupRows = await fetchUniqueRows({\n identities: unitGroupClaims,\n context,\n actorUserId: context.account.user_id,\n publicOnly: false,\n concurrency,\n dependencies,\n });\n const supportRows = [...flowPropertyRows, ...unitGroupRows].sort((left, right) =>\n `${left.table}\\u0000${identity(left.id, left.version)}`.localeCompare(\n `${right.table}\\u0000${identity(right.id, right.version)}`,\n ),\n );\n const capture: FlowIdentityLiveCapture = {\n schema_version: 'dataset-flow-identity-live-capture.v2',\n captured_at_utc: capturedAt.toISOString(),\n environment: 'production',\n project_ref: context.project_ref,\n account: {\n user_id: context.account.user_id,\n email: context.account.email.trim().toLowerCase(),\n },\n prerequisites: {\n step2_readback_sha256: prerequisites.step2.readback_sha256,\n step2_completed_at_utc: prerequisites.step2.completed_at_utc,\n issue29_target1_readback_sha256: prerequisites.issue29_target1.readback_sha256,\n issue29_target1_completed_at_utc: prerequisites.issue29_target1.completed_at_utc,\n issue29_target2_readback_sha256: prerequisites.issue29_target2.readback_sha256,\n issue29_target2_completed_at_utc: prerequisites.issue29_target2.completed_at_utc,\n },\n sdk: { package: '@tiangong-lca/tidas-sdk', version: options.sdkVersion.trim() },\n artifact_evidence: {\n review_ledger_sha256: review.ledger_sha256,\n live_capture_artifact_sha256: '',\n toolchain_evidence_sha256: toolchainArtifact.file_sha256,\n },\n completeness: {\n schema_version: 'dataset-flow-identity-capture-completeness.v2',\n source_count: 305,\n target_count: targetRows.length,\n support_count: supportRows.length,\n owner_draft_process_count: fullProcessRows.length,\n owner_draft_process_scan: processScanProof,\n },\n source_rows: sourceRows,\n target_rows: targetRows,\n support_rows: supportRows,\n process_rows: processRows,\n capture_request: {} as FlowIdentityLiveCapture['capture_request'],\n attestation: {} as FlowIdentityLiveCapture['attestation'],\n capture_artifact_sha256: '',\n };\n capture.artifact_evidence.live_capture_artifact_sha256 =\n computeFlowIdentityCaptureEvidenceSha256(capture);\n const validation: ValidationDeps = {\n validateFlow: options.validation?.validateFlow ?? validateFlowPayload,\n validateProcess: options.validation?.validateProcess ?? validateProcessPayload,\n };\n const semantics = buildFlowIdentitySemantics({ policy, review, capture, validation });\n capture.capture_request = buildFlowIdentityCaptureRequest({\n requestId: options.requestId,\n operationId: options.operationId,\n policy,\n capture,\n mappings: semantics.mappings,\n processTemplates: semantics.processTemplates,\n protectedClosure: semantics.protectedClosure,\n });\n const requestSha256 = flowIdentityRestrictedSha256(\n capture.capture_request as unknown as JsonObject,\n );\n const materializeIndeterminate = (error: unknown, rawResponse?: JsonObject): void => {\n const preferred = path.resolve(options.outDir);\n const recoveryDir = existsSync(preferred)\n ? `${preferred}.indeterminate-${options.requestId}`\n : preferred;\n dependencies.materialize(recoveryDir, (staging) => {\n writePrivateImmutableJson(\n path.join(staging, 'flow-identity-capture-request.json'),\n capture.capture_request,\n );\n if (rawResponse) {\n writePrivateImmutableJson(\n path.join(staging, 'flow-identity-capture-raw-response.json'),\n rawResponse,\n );\n }\n writePrivateImmutableJson(path.join(staging, 'flow-identity-capture-indeterminate.json'), {\n schema_version: 'dataset-flow-identity-capture-indeterminate.v2',\n status: 'indeterminate',\n request_id: options.requestId,\n capture_request_sha256: requestSha256,\n post_attempt_count: 1,\n automatic_retry: false,\n normal_capture_rerun_allowed: false,\n recovery: 'operator_exact_request_status_or_replay_required',\n error: String(error),\n });\n });\n };\n const materializeRejected = (rawResponse: JsonObject): void => {\n dependencies.materialize(path.resolve(options.outDir), (staging) => {\n writePrivateImmutableJson(\n path.join(staging, 'flow-identity-capture-request.json'),\n capture.capture_request,\n );\n writePrivateImmutableJson(path.join(staging, 'flow-identity-capture-domain-rejection.json'), {\n schema_version: 'dataset-flow-identity-capture-domain-rejection.v1',\n status: 'rejected',\n request_id: options.requestId,\n capture_request_sha256: requestSha256,\n post_attempt_count: 1,\n automatic_retry: false,\n same_request_replay_allowed: false,\n recovery: 'new_request_and_output_directory_required',\n response: rawResponse,\n });\n });\n };\n let rawAttestation: JsonObject;\n try {\n rawAttestation = await dependencies.attest({\n context,\n request: capture.capture_request as unknown as JsonObject,\n });\n } catch (error) {\n materializeIndeterminate(error);\n throw error;\n }\n if (isMaintenanceRpcDomainFailure(rawAttestation)) {\n materializeRejected(rawAttestation);\n throw new CliError(\n typeof rawAttestation.message === 'string'\n ? rawAttestation.message\n : 'Flow identity capture was rejected by the database.',\n {\n code: rawAttestation.code,\n exitCode: 1,\n details: rawAttestation,\n },\n );\n }\n try {\n capture.attestation = rawAttestation as FlowIdentityLiveCapture['attestation'];\n capture.capture_artifact_sha256 = computeFlowIdentityCaptureSha256(capture);\n const parsed = parseFlowIdentityCapture(capture);\n const generatedAt = options.now ?? new Date();\n const artifactPaths = {\n request: path.join(path.resolve(options.outDir), 'flow-identity-capture-request.json'),\n attestation: path.join(\n path.resolve(options.outDir),\n 'flow-identity-capture-attestation.json',\n ),\n live_capture: path.join(path.resolve(options.outDir), 'flow-identity-live-capture.json'),\n report: path.join(path.resolve(options.outDir), 'flow-identity-capture-report.json'),\n };\n const report: FlowIdentityCaptureReport = {\n schema_version: 'dataset-flow-identity-capture-report.v2',\n generated_at_utc: generatedAt.toISOString(),\n status: 'captured',\n environment: 'production',\n project_ref: parsed.project_ref,\n actor: parsed.account,\n operation_id: parsed.attestation.operation_id,\n request_id: parsed.capture_request.request_id,\n receipt_id: parsed.attestation.receipt_id,\n receipt_proof_sha256: parsed.attestation.receipt_proof_sha256,\n capture_request_sha256: parsed.attestation.capture_request_sha256,\n live_capture_evidence_core_sha256: parsed.artifact_evidence.live_capture_artifact_sha256,\n capture_artifact_sha256: parsed.capture_artifact_sha256,\n counts: {\n sources: 305,\n targets: parsed.target_rows.length,\n supports: parsed.support_rows.length,\n owner_draft_processes: parsed.completeness.owner_draft_process_count,\n mappings: semantics.mappings.length,\n affected_processes: semantics.processTemplates.length,\n rewrites: semantics.processTemplates.reduce(\n (sum, template) => sum + template.process.rewrite_count,\n 0,\n ),\n },\n calls: {\n capture_attest: 1,\n scope_preflight: 0,\n process_rewrite: 0,\n scope_finalize: 0,\n automatic_retry: false,\n },\n artifacts: artifactPaths,\n };\n dependencies.materialize(options.outDir, (staging) => {\n writePrivateImmutableJson(\n path.join(staging, path.basename(artifactPaths.request)),\n parsed.capture_request,\n );\n writePrivateImmutableJson(\n path.join(staging, path.basename(artifactPaths.attestation)),\n parsed.attestation,\n );\n writePrivateImmutableJson(\n path.join(staging, path.basename(artifactPaths.live_capture)),\n parsed,\n );\n writePrivateImmutableJson(path.join(staging, path.basename(artifactPaths.report)), report);\n });\n return report;\n } catch (error) {\n materializeIndeterminate(error, rawAttestation);\n throw error;\n }\n}\n\nexport async function captureFlowIdentity(\n options: CaptureFlowIdentityOptions,\n): Promise<FlowIdentityCaptureReport> {\n return executeCapture(options, DEFAULT_DEPENDENCIES);\n}\n\nexport const __testInternals = {\n executeCapture,\n flowPropertyClaim,\n parseFlowIdentityPrerequisites,\n snapshot,\n unitGroupClaim,\n};\n"]}
1
+ {"version":3,"file":"dataset-maintenance-flow-identity-capture.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-flow-identity-capture.ts"],"names":[],"mappings":"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","sourcesContent":["// data-api-relations: flowproperties, flows, unitgroups\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\nimport {\n computeFlowIdentityCaptureEvidenceSha256,\n computeFlowIdentityCaptureSha256,\n parseFlowIdentityCapture,\n parseFlowIdentityPolicy,\n parseFlowIdentityReviewLedger,\n type FlowIdentityLiveCapture,\n} from './dataset-maintenance-flow-identity-contract.js';\nimport {\n buildFlowIdentityCaptureRequest,\n buildFlowIdentitySemantics,\n flowType,\n type ValidationDeps,\n} from './dataset-maintenance-flow-identity-plan.js';\nimport {\n materializePrivateArtifactDirectoryAtomically,\n readProtectedJsonArtifact,\n writePrivateImmutableJson,\n} from './dataset-maintenance-protected-artifacts.js';\nimport { parseProtectedToolchainEvidence } from './dataset-maintenance-protected-toolchain.js';\nimport {\n attestMaintenanceFlowIdentityCapture,\n fetchMaintenanceAccountTableRows,\n fetchMaintenanceExactRows,\n isMaintenanceRpcDomainFailure,\n resolveMaintenanceRemoteContext,\n type DatasetMaintenanceRemoteContext,\n} from './dataset-maintenance-remote.js';\nimport {\n isJsonObject,\n sha256Json,\n snapshotRemoteRow,\n stableJsonText,\n type DatasetMaintenanceRemoteRow,\n type DatasetMaintenanceRowSnapshot,\n type JsonObject,\n} from './dataset-maintenance-contract.js';\nimport { flowIdentityRestrictedSha256 } from './dataset-maintenance-flow-identity-wire.js';\nimport { validateFlowPayload } from './flow-payload-validation.js';\nimport { validateProcessPayload } from './process-payload-validation.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\n\nconst HASH = /^[a-f0-9]{64}$/u;\nconst UUID = /^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/u;\nconst VERSION = /^\\d{2}\\.\\d{2}\\.\\d{3}$/u;\n\nexport type FlowIdentityPrerequisites = {\n schema_version: 'dataset-flow-identity-prerequisites.v2';\n step2: {\n readback_sha256: string;\n completed_at_utc: string;\n status: 'passed';\n };\n issue29_target1: {\n readback_sha256: string;\n completed_at_utc: string;\n status: 'passed';\n };\n issue29_target2: {\n readback_sha256: string;\n completed_at_utc: string;\n status: 'passed';\n };\n};\n\nexport type CaptureFlowIdentityOptions = {\n policyPath: string;\n reviewLedgerPath: string;\n prerequisitesPath: string;\n toolchainEvidencePath: string;\n requestId: string;\n operationId: string;\n expectedProjectRef: string;\n confirm: string;\n cliVersion: string;\n sdkVersion: string;\n outDir: string;\n pageSize?: number;\n readConcurrency?: number;\n timeoutMs?: number;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n now?: Date;\n validation?: Partial<ValidationDeps>;\n};\n\nexport type FlowIdentityCaptureReport = {\n schema_version: 'dataset-flow-identity-capture-report.v2';\n generated_at_utc: string;\n status: 'captured';\n environment: 'production';\n project_ref: string;\n actor: { user_id: string; email: string };\n operation_id: string;\n request_id: string;\n receipt_id: string;\n receipt_proof_sha256: string;\n capture_request_sha256: string;\n live_capture_evidence_core_sha256: string;\n capture_artifact_sha256: string;\n counts: {\n sources: 305;\n targets: number;\n supports: number;\n owner_draft_processes: number;\n mappings: number;\n affected_processes: number;\n rewrites: number;\n };\n calls: {\n capture_attest: 1;\n scope_preflight: 0;\n process_rewrite: 0;\n scope_finalize: 0;\n automatic_retry: false;\n };\n artifacts: {\n request: string;\n attestation: string;\n live_capture: string;\n report: string;\n };\n};\n\ntype CaptureDependencies = {\n resolveContext: typeof resolveMaintenanceRemoteContext;\n fetchAccountTableRows: typeof fetchMaintenanceAccountTableRows;\n fetchExactRows: typeof fetchMaintenanceExactRows;\n attest: typeof attestMaintenanceFlowIdentityCapture;\n materialize: typeof materializePrivateArtifactDirectoryAtomically;\n};\n\nconst DEFAULT_DEPENDENCIES: CaptureDependencies = {\n resolveContext: resolveMaintenanceRemoteContext,\n fetchAccountTableRows: fetchMaintenanceAccountTableRows,\n fetchExactRows: fetchMaintenanceExactRows,\n attest: attestMaintenanceFlowIdentityCapture,\n materialize: materializePrivateArtifactDirectoryAtomically,\n};\n\nfunction fail(message: string, code = 'DATASET_FLOW_IDENTITY_CAPTURE_INVALID'): never {\n throw new CliError(message, { code, exitCode: 1 });\n}\n\nfunction exactKeys(value: JsonObject, keys: readonly string[]): boolean {\n const actual = Object.keys(value).sort();\n const expected = [...keys].sort();\n return actual.length === expected.length && actual.every((key, index) => key === expected[index]);\n}\n\nfunction readCanonical(filePath: string, label: string) {\n const artifact = readProtectedJsonArtifact({ filePath, label });\n if (artifact.text !== `${stableJsonText(artifact.value)}\\n`) {\n fail(`${label} must be canonical JSON with one trailing newline.`);\n }\n return artifact;\n}\n\nexport function parseFlowIdentityPrerequisites(value: unknown): FlowIdentityPrerequisites {\n if (\n !isJsonObject(value) ||\n !isJsonObject(value.step2) ||\n !isJsonObject(value.issue29_target1) ||\n !isJsonObject(value.issue29_target2) ||\n !exactKeys(value, ['schema_version', 'step2', 'issue29_target1', 'issue29_target2']) ||\n !exactKeys(value.step2, ['readback_sha256', 'completed_at_utc', 'status']) ||\n !exactKeys(value.issue29_target1, ['readback_sha256', 'completed_at_utc', 'status']) ||\n !exactKeys(value.issue29_target2, ['readback_sha256', 'completed_at_utc', 'status'])\n ) {\n fail('Flow identity prerequisites are invalid.');\n }\n const parsed = value as FlowIdentityPrerequisites;\n if (\n parsed.schema_version !== 'dataset-flow-identity-prerequisites.v2' ||\n parsed.step2.status !== 'passed' ||\n parsed.issue29_target1.status !== 'passed' ||\n parsed.issue29_target2.status !== 'passed' ||\n !HASH.test(parsed.step2.readback_sha256) ||\n !HASH.test(parsed.issue29_target1.readback_sha256) ||\n !HASH.test(parsed.issue29_target2.readback_sha256) ||\n !Number.isFinite(Date.parse(parsed.step2.completed_at_utc)) ||\n !Number.isFinite(Date.parse(parsed.issue29_target1.completed_at_utc)) ||\n !Number.isFinite(Date.parse(parsed.issue29_target2.completed_at_utc))\n ) {\n fail('Flow identity prerequisites do not prove passed Step 2 and issue #29 readbacks.');\n }\n return parsed;\n}\n\nfunction snapshot(row: DatasetMaintenanceRemoteRow): DatasetMaintenanceRowSnapshot {\n if (\n !row.user_id ||\n row.state_code === null ||\n !row.modified_at ||\n !row.json_ordered ||\n !row.json ||\n sha256Json(row.json) !== sha256Json(row.json_ordered)\n ) {\n fail('A capture row is incomplete or its json/json_ordered columns differ.');\n }\n return snapshotRemoteRow({\n table: row.table,\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n modified_at: row.modified_at,\n json_ordered: row.json_ordered,\n model_id: row.model_id,\n rule_verification: row.rule_verification,\n });\n}\n\nfunction identity(id: string, version: string): string {\n return `${id}\\u0000${version}`;\n}\n\nfunction referenceIdentity(value: unknown): { id: string; version: string } | null {\n if (\n !isJsonObject(value) ||\n typeof value['@refObjectId'] !== 'string' ||\n typeof value['@version'] !== 'string' ||\n !UUID.test(value['@refObjectId']) ||\n !VERSION.test(value['@version'])\n ) {\n return null;\n }\n return { id: value['@refObjectId'], version: value['@version'] };\n}\n\nfunction arrayOfObjects(value: unknown): JsonObject[] {\n const values = Array.isArray(value) ? value : isJsonObject(value) ? [value] : [];\n if (!values.every(isJsonObject)) fail('A flow support collection is malformed.');\n return values;\n}\n\nfunction flowPropertyClaim(payload: JsonObject): { id: string; version: string } {\n const root = isJsonObject(payload.flowDataSet) ? payload.flowDataSet : null;\n const information = isJsonObject(root?.flowInformation) ? root.flowInformation : null;\n const quantitative = isJsonObject(information?.quantitativeReference)\n ? information.quantitativeReference\n : null;\n const properties = isJsonObject(root?.flowProperties) ? root.flowProperties : null;\n const referenceInternalId = quantitative?.referenceToReferenceFlowProperty;\n const property = arrayOfObjects(properties?.flowProperty).find(\n (entry) => entry['@dataSetInternalID'] === referenceInternalId,\n );\n const claim = referenceIdentity(property?.referenceToFlowPropertyDataSet);\n if (!claim) fail('A mapped flow lacks an exact reference flow-property identity.');\n return claim;\n}\n\nfunction unitGroupClaim(payload: JsonObject): { id: string; version: string } {\n const root = isJsonObject(payload.flowPropertyDataSet) ? payload.flowPropertyDataSet : null;\n const information = isJsonObject(root?.flowPropertiesInformation)\n ? root.flowPropertiesInformation\n : null;\n const quantitative = isJsonObject(information?.quantitativeReference)\n ? information.quantitativeReference\n : null;\n const claim = referenceIdentity(quantitative?.referenceToReferenceUnitGroup);\n if (!claim) fail('A captured flow property lacks an exact unit-group identity.');\n return claim;\n}\n\nfunction processReferencesReviewedSource(\n row: DatasetMaintenanceRowSnapshot,\n reviewed: ReadonlySet<string>,\n): boolean {\n const root = isJsonObject(row.json_ordered?.processDataSet)\n ? row.json_ordered.processDataSet\n : null;\n const exchanges = isJsonObject(root?.exchanges) ? root.exchanges : null;\n const values = Array.isArray(exchanges?.exchange)\n ? exchanges.exchange\n : isJsonObject(exchanges?.exchange)\n ? [exchanges.exchange]\n : [];\n for (const value of values) {\n if (!isJsonObject(value)) fail('A captured process has a malformed exchange collection.');\n const reference = referenceIdentity(value.referenceToFlowDataSet);\n if (!reference) fail('A captured process exchange has a malformed flow reference.');\n if (reviewed.has(identity(reference.id, reference.version))) return true;\n }\n return false;\n}\n\nasync function fetchUniqueRows(options: {\n identities: Array<{\n table: 'flows' | 'flowproperties' | 'unitgroups';\n id: string;\n version: string;\n }>;\n context: DatasetMaintenanceRemoteContext;\n actorUserId: string;\n publicOnly: boolean;\n concurrency: number;\n dependencies: CaptureDependencies;\n}): Promise<DatasetMaintenanceRowSnapshot[]> {\n const rows: DatasetMaintenanceRowSnapshot[] = [];\n for (let offset = 0; offset < options.identities.length; offset += options.concurrency) {\n const chunk = options.identities.slice(offset, offset + options.concurrency);\n const fetched = await Promise.all(\n chunk.map(async (claim) => {\n const result = await options.dependencies.fetchExactRows({\n context: options.context,\n table: claim.table,\n id: claim.id,\n version: claim.version,\n includeJson: true,\n });\n const visible = result.rows.filter((row) =>\n options.publicOnly\n ? row.state_code === 100 && row.user_id !== options.actorUserId\n : row.state_code === 100 ||\n (row.state_code === 0 && row.user_id === options.actorUserId),\n );\n if (visible.length !== 1) {\n fail('A capture target/support identity is missing, duplicated, or outside visibility.');\n }\n return snapshot(visible[0]!);\n }),\n );\n rows.push(...fetched);\n }\n return rows.sort((left, right) =>\n `${left.table}\\u0000${identity(left.id, left.version)}`.localeCompare(\n `${right.table}\\u0000${identity(right.id, right.version)}`,\n ),\n );\n}\n\nfunction validateInputs(options: CaptureFlowIdentityOptions): { concurrency: number } {\n const concurrency = options.readConcurrency ?? 5;\n if (!UUID.test(options.requestId)) fail('capture request ID must be a canonical UUID.');\n if (!options.operationId.trim() || Buffer.byteLength(options.operationId, 'utf8') > 512) {\n fail('capture operation ID must be a non-empty token of at most 512 UTF-8 bytes.');\n }\n if (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > 5) {\n fail('capture read concurrency must be an integer between 1 and 5.');\n }\n if (!options.sdkVersion.trim()) fail('capture SDK version is required.');\n return { concurrency };\n}\n\nasync function executeCapture(\n options: CaptureFlowIdentityOptions,\n dependencies: CaptureDependencies,\n): Promise<FlowIdentityCaptureReport> {\n const { concurrency } = validateInputs(options);\n if (existsSync(path.resolve(options.outDir))) {\n fail('Capture output directory already exists; protected capture artifacts are immutable.');\n }\n const policyArtifact = readCanonical(options.policyPath, 'Flow identity compatibility policy');\n const reviewArtifact = readCanonical(options.reviewLedgerPath, 'Flow identity review ledger');\n const prerequisitesArtifact = readCanonical(\n options.prerequisitesPath,\n 'Flow identity prerequisites',\n );\n const toolchainArtifact = readCanonical(\n options.toolchainEvidencePath,\n 'Protected toolchain evidence',\n );\n const policy = parseFlowIdentityPolicy(policyArtifact.value);\n const review = parseFlowIdentityReviewLedger(reviewArtifact.value);\n const prerequisites = parseFlowIdentityPrerequisites(prerequisitesArtifact.value);\n if (policy.evidence_resolution_sha256 !== review.review_evidence_sha256) {\n fail('Compatibility policy does not bind the review ledger.');\n }\n parseProtectedToolchainEvidence(toolchainArtifact.value, {\n projectRef: options.expectedProjectRef,\n cliVersion: options.cliVersion,\n });\n const capturedAt = options.now ?? new Date();\n if (\n Date.parse(prerequisites.step2.completed_at_utc) > capturedAt.getTime() ||\n Date.parse(prerequisites.issue29_target1.completed_at_utc) > capturedAt.getTime() ||\n Date.parse(prerequisites.issue29_target2.completed_at_utc) > capturedAt.getTime()\n ) {\n fail('Capture time precedes a required passed prerequisite.');\n }\n const context = await dependencies.resolveContext({\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n now: options.now,\n });\n if (\n context.project_ref !== options.expectedProjectRef ||\n context.account.email.trim().toLowerCase() !== options.confirm.trim().toLowerCase()\n ) {\n fail('Authenticated production project/account does not match capture confirmation.');\n }\n const [flowCensus, processCensus] = await Promise.all([\n dependencies.fetchAccountTableRows({\n context,\n userId: context.account.user_id,\n table: 'flows',\n stateCode: 0,\n includeJson: true,\n pageSize: options.pageSize,\n }),\n dependencies.fetchAccountTableRows({\n context,\n userId: context.account.user_id,\n table: 'processes',\n stateCode: 0,\n includeJson: true,\n pageSize: options.pageSize,\n }),\n ]);\n const reviewed = new Set(\n review.entries.map((entry) => identity(entry.source.id, entry.source.version)),\n );\n const elementary = flowCensus.rows.filter(\n (row) => row.json_ordered && flowType(row.json_ordered) === 'Elementary flow',\n );\n const observed = new Set(elementary.map((row) => identity(row.id, row.version)));\n if (\n elementary.length !== 305 ||\n observed.size !== 305 ||\n [...reviewed].some((key) => !observed.has(key)) ||\n [...observed].some((key) => !reviewed.has(key))\n ) {\n fail(\n 'Authenticated owner-draft Elementary-flow census is not the exact 305-row review universe.',\n );\n }\n const sourceRows = elementary\n .map(snapshot)\n .sort((left, right) =>\n identity(left.id, left.version).localeCompare(identity(right.id, right.version)),\n );\n const fullProcessRows = processCensus.rows\n .map(snapshot)\n .sort((left, right) =>\n identity(left.id, left.version).localeCompare(identity(right.id, right.version)),\n );\n const processRows = fullProcessRows.filter((row) =>\n processReferencesReviewedSource(row, reviewed),\n );\n const processScanProof: JsonObject = {\n ...(processCensus.completeness as unknown as JsonObject),\n row_identity_set_sha256: sha256Json(\n fullProcessRows.map((row) => ({ id: row.id, version: row.version })),\n ),\n row_snapshot_set_sha256: sha256Json(\n fullProcessRows.map((row) => ({\n id: row.id,\n version: row.version,\n row_sha256: row.row_sha256,\n })),\n ),\n };\n const targetClaims = [\n ...new Map(\n review.entries\n .filter((entry) => entry.disposition === 'map_public')\n .map((entry) => [\n identity(entry.target!.id, entry.target!.version),\n {\n table: 'flows' as const,\n id: entry.target!.id,\n version: entry.target!.version,\n },\n ]),\n ).values(),\n ];\n const targetRows = await fetchUniqueRows({\n identities: targetClaims,\n context,\n actorUserId: context.account.user_id,\n publicOnly: true,\n concurrency,\n dependencies,\n });\n const fpClaims = [\n ...new Map(\n [\n ...sourceRows.filter((row) =>\n review.entries.some(\n (entry) =>\n entry.disposition === 'map_public' &&\n entry.source.id === row.id &&\n entry.source.version === row.version,\n ),\n ),\n ...targetRows,\n ].map((row) => {\n const claim = flowPropertyClaim(row.json_ordered!);\n return [\n identity(claim.id, claim.version),\n {\n table: 'flowproperties' as const,\n ...claim,\n },\n ];\n }),\n ).values(),\n ];\n const flowPropertyRows = await fetchUniqueRows({\n identities: fpClaims,\n context,\n actorUserId: context.account.user_id,\n publicOnly: false,\n concurrency,\n dependencies,\n });\n const unitGroupClaims = [\n ...new Map(\n flowPropertyRows.map((row) => {\n const claim = unitGroupClaim(row.json_ordered!);\n return [identity(claim.id, claim.version), { table: 'unitgroups' as const, ...claim }];\n }),\n ).values(),\n ];\n const unitGroupRows = await fetchUniqueRows({\n identities: unitGroupClaims,\n context,\n actorUserId: context.account.user_id,\n publicOnly: false,\n concurrency,\n dependencies,\n });\n const supportRows = [...flowPropertyRows, ...unitGroupRows].sort((left, right) =>\n `${left.table}\\u0000${identity(left.id, left.version)}`.localeCompare(\n `${right.table}\\u0000${identity(right.id, right.version)}`,\n ),\n );\n const capture: FlowIdentityLiveCapture = {\n schema_version: 'dataset-flow-identity-live-capture.v2',\n captured_at_utc: capturedAt.toISOString(),\n environment: 'production',\n project_ref: context.project_ref,\n account: {\n user_id: context.account.user_id,\n email: context.account.email.trim().toLowerCase(),\n },\n prerequisites: {\n step2_readback_sha256: prerequisites.step2.readback_sha256,\n step2_completed_at_utc: prerequisites.step2.completed_at_utc,\n issue29_target1_readback_sha256: prerequisites.issue29_target1.readback_sha256,\n issue29_target1_completed_at_utc: prerequisites.issue29_target1.completed_at_utc,\n issue29_target2_readback_sha256: prerequisites.issue29_target2.readback_sha256,\n issue29_target2_completed_at_utc: prerequisites.issue29_target2.completed_at_utc,\n },\n sdk: { package: '@tiangong-lca/tidas-sdk', version: options.sdkVersion.trim() },\n artifact_evidence: {\n review_ledger_sha256: review.ledger_sha256,\n live_capture_artifact_sha256: '',\n toolchain_evidence_sha256: toolchainArtifact.file_sha256,\n },\n completeness: {\n schema_version: 'dataset-flow-identity-capture-completeness.v2',\n source_count: 305,\n target_count: targetRows.length,\n support_count: supportRows.length,\n owner_draft_process_count: fullProcessRows.length,\n owner_draft_process_scan: processScanProof,\n },\n source_rows: sourceRows,\n target_rows: targetRows,\n support_rows: supportRows,\n process_rows: processRows,\n capture_request: {} as FlowIdentityLiveCapture['capture_request'],\n attestation: {} as FlowIdentityLiveCapture['attestation'],\n capture_artifact_sha256: '',\n };\n capture.artifact_evidence.live_capture_artifact_sha256 =\n computeFlowIdentityCaptureEvidenceSha256(capture);\n const validation: ValidationDeps = {\n validateFlow: options.validation?.validateFlow ?? validateFlowPayload,\n validateProcess: options.validation?.validateProcess ?? validateProcessPayload,\n };\n const semantics = buildFlowIdentitySemantics({ policy, review, capture, validation });\n capture.capture_request = buildFlowIdentityCaptureRequest({\n requestId: options.requestId,\n operationId: options.operationId,\n policy,\n capture,\n mappings: semantics.mappings,\n processTemplates: semantics.processTemplates,\n protectedClosure: semantics.protectedClosure,\n });\n const requestSha256 = flowIdentityRestrictedSha256(\n capture.capture_request as unknown as JsonObject,\n );\n const materializeIndeterminate = (error: unknown, rawResponse?: JsonObject): void => {\n const preferred = path.resolve(options.outDir);\n const recoveryDir = existsSync(preferred)\n ? `${preferred}.indeterminate-${options.requestId}`\n : preferred;\n dependencies.materialize(recoveryDir, (staging) => {\n writePrivateImmutableJson(\n path.join(staging, 'flow-identity-capture-request.json'),\n capture.capture_request,\n );\n if (rawResponse) {\n writePrivateImmutableJson(\n path.join(staging, 'flow-identity-capture-raw-response.json'),\n rawResponse,\n );\n }\n writePrivateImmutableJson(path.join(staging, 'flow-identity-capture-indeterminate.json'), {\n schema_version: 'dataset-flow-identity-capture-indeterminate.v2',\n status: 'indeterminate',\n request_id: options.requestId,\n capture_request_sha256: requestSha256,\n post_attempt_count: 1,\n automatic_retry: false,\n normal_capture_rerun_allowed: false,\n recovery: 'operator_exact_request_status_or_replay_required',\n error: String(error),\n });\n });\n };\n const materializeRejected = (rawResponse: JsonObject): void => {\n dependencies.materialize(path.resolve(options.outDir), (staging) => {\n writePrivateImmutableJson(\n path.join(staging, 'flow-identity-capture-request.json'),\n capture.capture_request,\n );\n writePrivateImmutableJson(path.join(staging, 'flow-identity-capture-domain-rejection.json'), {\n schema_version: 'dataset-flow-identity-capture-domain-rejection.v1',\n status: 'rejected',\n request_id: options.requestId,\n capture_request_sha256: requestSha256,\n post_attempt_count: 1,\n automatic_retry: false,\n same_request_replay_allowed: false,\n recovery: 'new_request_and_output_directory_required',\n response: rawResponse,\n });\n });\n };\n let rawAttestation: JsonObject;\n try {\n rawAttestation = await dependencies.attest({\n context,\n request: capture.capture_request as unknown as JsonObject,\n });\n } catch (error) {\n materializeIndeterminate(error);\n throw error;\n }\n if (isMaintenanceRpcDomainFailure(rawAttestation)) {\n materializeRejected(rawAttestation);\n throw new CliError(\n typeof rawAttestation.message === 'string'\n ? rawAttestation.message\n : 'Flow identity capture was rejected by the database.',\n {\n code: rawAttestation.code,\n exitCode: 1,\n details: rawAttestation,\n },\n );\n }\n try {\n capture.attestation = rawAttestation as FlowIdentityLiveCapture['attestation'];\n capture.capture_artifact_sha256 = computeFlowIdentityCaptureSha256(capture);\n const parsed = parseFlowIdentityCapture(capture);\n const generatedAt = options.now ?? new Date();\n const artifactPaths = {\n request: path.join(path.resolve(options.outDir), 'flow-identity-capture-request.json'),\n attestation: path.join(\n path.resolve(options.outDir),\n 'flow-identity-capture-attestation.json',\n ),\n live_capture: path.join(path.resolve(options.outDir), 'flow-identity-live-capture.json'),\n report: path.join(path.resolve(options.outDir), 'flow-identity-capture-report.json'),\n };\n const report: FlowIdentityCaptureReport = {\n schema_version: 'dataset-flow-identity-capture-report.v2',\n generated_at_utc: generatedAt.toISOString(),\n status: 'captured',\n environment: 'production',\n project_ref: parsed.project_ref,\n actor: parsed.account,\n operation_id: parsed.attestation.operation_id,\n request_id: parsed.capture_request.request_id,\n receipt_id: parsed.attestation.receipt_id,\n receipt_proof_sha256: parsed.attestation.receipt_proof_sha256,\n capture_request_sha256: parsed.attestation.capture_request_sha256,\n live_capture_evidence_core_sha256: parsed.artifact_evidence.live_capture_artifact_sha256,\n capture_artifact_sha256: parsed.capture_artifact_sha256,\n counts: {\n sources: 305,\n targets: parsed.target_rows.length,\n supports: parsed.support_rows.length,\n owner_draft_processes: parsed.completeness.owner_draft_process_count,\n mappings: semantics.mappings.length,\n affected_processes: semantics.processTemplates.length,\n rewrites: semantics.processTemplates.reduce(\n (sum, template) => sum + template.process.rewrite_count,\n 0,\n ),\n },\n calls: {\n capture_attest: 1,\n scope_preflight: 0,\n process_rewrite: 0,\n scope_finalize: 0,\n automatic_retry: false,\n },\n artifacts: artifactPaths,\n };\n dependencies.materialize(options.outDir, (staging) => {\n writePrivateImmutableJson(\n path.join(staging, path.basename(artifactPaths.request)),\n parsed.capture_request,\n );\n writePrivateImmutableJson(\n path.join(staging, path.basename(artifactPaths.attestation)),\n parsed.attestation,\n );\n writePrivateImmutableJson(\n path.join(staging, path.basename(artifactPaths.live_capture)),\n parsed,\n );\n writePrivateImmutableJson(path.join(staging, path.basename(artifactPaths.report)), report);\n });\n return report;\n } catch (error) {\n materializeIndeterminate(error, rawAttestation);\n throw error;\n }\n}\n\nexport async function captureFlowIdentity(\n options: CaptureFlowIdentityOptions,\n): Promise<FlowIdentityCaptureReport> {\n return executeCapture(options, DEFAULT_DEPENDENCIES);\n}\n\nexport const __testInternals = {\n executeCapture,\n flowPropertyClaim,\n parseFlowIdentityPrerequisites,\n snapshot,\n unitGroupClaim,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-maintenance-pagination.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\n\nexport type DatasetMaintenanceTableCompleteness = {\n status: 'complete';\n complete: true;\n strategy: 'postgrest_exact_count';\n requested_page_size: number;\n effective_page_size: number;\n pages_fetched: number;\n rows_fetched: number;\n exact_total: number;\n termination_reason: 'content_range_total_reached';\n content_range_verified: true;\n ordering_verified: true;\n duplicate_count: 0;\n};\n\nexport type DatasetMaintenanceSnapshotCompleteness<Table extends string = string> = {\n status: 'complete';\n complete: true;\n strategy: 'postgrest_exact_count_multi_request';\n requested_page_size: number;\n page_count: number;\n row_count: number;\n entity_counts: Record<Table, number>;\n tables: Array<{ table: Table } & DatasetMaintenanceTableCompleteness>;\n};\n\nexport type DatasetMaintenancePage<T> = {\n rows: T[];\n source_url: string;\n content_range: string | null;\n};\n\ntype ParsedContentRange = {\n start: number | null;\n end: number | null;\n total: number;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isIntegerBetween(value: unknown, minimum: number, maximum: number): value is number {\n return Number.isInteger(value) && Number(value) >= minimum && Number(value) <= maximum;\n}\n\nexport function isDatasetMaintenanceSnapshotCompleteness<Table extends string>(\n value: unknown,\n expectedTables: readonly Table[],\n): value is DatasetMaintenanceSnapshotCompleteness<Table> {\n if (!isRecord(value)) return false;\n if (\n value.status !== 'complete' ||\n value.complete !== true ||\n value.strategy !== 'postgrest_exact_count_multi_request' ||\n !isIntegerBetween(value.requested_page_size, 1, 5_000) ||\n !isIntegerBetween(value.page_count, expectedTables.length, Number.MAX_SAFE_INTEGER) ||\n !isIntegerBetween(value.row_count, 0, Number.MAX_SAFE_INTEGER)\n ) {\n return false;\n }\n\n const entityCounts = value.entity_counts;\n if (!isRecord(entityCounts)) return false;\n const expectedTableSet = new Set<string>(expectedTables);\n const entityCountKeys = Object.keys(entityCounts);\n if (\n entityCountKeys.length !== expectedTables.length ||\n entityCountKeys.some((table) => !expectedTableSet.has(table))\n ) {\n return false;\n }\n for (const table of expectedTables) {\n if (!isIntegerBetween(entityCounts[table], 0, Number.MAX_SAFE_INTEGER)) {\n return false;\n }\n }\n\n if (!Array.isArray(value.tables) || value.tables.length !== expectedTables.length) return false;\n const observedTables = new Set<string>();\n let pageCount = 0;\n let rowCount = 0;\n for (const rawTable of value.tables) {\n if (!isRecord(rawTable)) return false;\n const table = rawTable.table;\n if (typeof table !== 'string' || !expectedTableSet.has(table) || observedTables.has(table)) {\n return false;\n }\n if (\n rawTable.status !== 'complete' ||\n rawTable.complete !== true ||\n rawTable.strategy !== 'postgrest_exact_count' ||\n rawTable.requested_page_size !== value.requested_page_size ||\n !isIntegerBetween(rawTable.effective_page_size, 0, value.requested_page_size) ||\n !isIntegerBetween(rawTable.pages_fetched, 1, Number.MAX_SAFE_INTEGER) ||\n !isIntegerBetween(rawTable.rows_fetched, 0, Number.MAX_SAFE_INTEGER) ||\n rawTable.exact_total !== rawTable.rows_fetched ||\n (rawTable.rows_fetched === 0) !== (rawTable.effective_page_size === 0) ||\n (rawTable.rows_fetched === 0\n ? rawTable.pages_fetched !== 1\n : rawTable.pages_fetched > rawTable.rows_fetched ||\n rawTable.effective_page_size > rawTable.rows_fetched - rawTable.pages_fetched + 1 ||\n rawTable.rows_fetched > rawTable.pages_fetched * rawTable.effective_page_size) ||\n rawTable.termination_reason !== 'content_range_total_reached' ||\n rawTable.content_range_verified !== true ||\n rawTable.ordering_verified !== true ||\n rawTable.duplicate_count !== 0 ||\n rawTable.rows_fetched !== entityCounts[table]\n ) {\n return false;\n }\n observedTables.add(table);\n pageCount += rawTable.pages_fetched;\n rowCount += rawTable.rows_fetched;\n }\n\n return pageCount === value.page_count && rowCount === value.row_count;\n}\n\nexport function isSnapshotCompletenessCompatible<Table extends string>(\n value: unknown,\n baseline: DatasetMaintenanceSnapshotCompleteness<Table> | undefined,\n expectedTables: readonly Table[],\n): boolean {\n if (value === undefined) return baseline === undefined;\n if (!isDatasetMaintenanceSnapshotCompleteness(value, expectedTables)) return false;\n if (baseline === undefined) return true;\n return (\n value.row_count === baseline.row_count &&\n expectedTables.every((table) => value.entity_counts[table] === baseline.entity_counts[table])\n );\n}\n\nfunction incomplete(details: Record<string, unknown>): never {\n throw new CliError('PostgREST pagination could not prove a complete maintenance snapshot.', {\n code: 'DATASET_MAINTENANCE_SNAPSHOT_INCOMPLETE',\n exitCode: 1,\n details,\n });\n}\n\nexport function parseExactContentRange(\n value: string | null,\n details: Record<string, unknown> = {},\n): ParsedContentRange {\n const match = value?.trim().match(/^(?:items\\s+)?(?:(\\d+)-(\\d+)|\\*)\\/(\\d+)$/iu);\n if (!match) {\n return incomplete({\n ...details,\n reason: 'content_range_missing_or_invalid',\n content_range: value,\n });\n }\n const start = match[1] === undefined ? null : Number.parseInt(match[1], 10);\n const end = match[2] === undefined ? null : Number.parseInt(match[2], 10);\n const total = Number.parseInt(match[3]!, 10);\n if (\n !Number.isSafeInteger(total) ||\n (start !== null &&\n (end === null || !Number.isSafeInteger(start) || !Number.isSafeInteger(end))) ||\n (start !== null && end! < start)\n ) {\n return incomplete({ ...details, reason: 'content_range_out_of_bounds', content_range: value });\n }\n return { start, end, total };\n}\n\nexport async function fetchCompletePostgrestPages<T>(options: {\n table: string;\n requestedPageSize: number;\n fetchPage: (offset: number) => Promise<DatasetMaintenancePage<T>>;\n rowIdentity: (row: T) => string | null;\n}): Promise<{\n rows: T[];\n source_urls: string[];\n completeness: DatasetMaintenanceTableCompleteness;\n}> {\n const rows: T[] = [];\n const sourceUrls: string[] = [];\n let expectedTotal: number | null = null;\n let offset = 0;\n let pagesFetched = 0;\n let effectivePageSize = 0;\n let previousIdentity: string | null = null;\n\n while (true) {\n const page = await options.fetchPage(offset);\n pagesFetched += 1;\n sourceUrls.push(page.source_url);\n effectivePageSize = Math.max(effectivePageSize, page.rows.length);\n const range = parseExactContentRange(page.content_range, {\n table: options.table,\n offset,\n source_url: page.source_url,\n });\n if (expectedTotal === null) {\n expectedTotal = range.total;\n } else if (range.total !== expectedTotal) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'exact_total_changed_between_pages',\n expected_total: expectedTotal,\n observed_total: range.total,\n });\n }\n\n if (page.rows.length === 0) {\n if (range.start !== null || offset !== 0 || range.total !== 0) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'empty_page_before_exact_total',\n expected_total: expectedTotal,\n content_range: page.content_range,\n });\n }\n return {\n rows,\n source_urls: sourceUrls,\n completeness: {\n status: 'complete',\n complete: true,\n strategy: 'postgrest_exact_count',\n requested_page_size: options.requestedPageSize,\n effective_page_size: effectivePageSize,\n pages_fetched: pagesFetched,\n rows_fetched: 0,\n exact_total: 0,\n termination_reason: 'content_range_total_reached',\n content_range_verified: true,\n ordering_verified: true,\n duplicate_count: 0,\n },\n };\n }\n\n if (\n page.rows.length > options.requestedPageSize ||\n range.start !== offset ||\n range.end !== offset + page.rows.length - 1\n ) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'content_range_does_not_match_page',\n requested_page_size: options.requestedPageSize,\n returned_rows: page.rows.length,\n content_range: page.content_range,\n });\n }\n\n for (const row of page.rows) {\n const identity = options.rowIdentity(row);\n if (!identity) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'row_identity_missing',\n });\n }\n if (previousIdentity !== null && identity <= previousIdentity) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: identity === previousIdentity ? 'duplicate_row_identity' : 'row_order_not_strict',\n previous_identity: previousIdentity,\n observed_identity: identity,\n });\n }\n previousIdentity = identity;\n }\n\n rows.push(...page.rows);\n const nextOffset = offset + page.rows.length;\n if (nextOffset > expectedTotal) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'rows_exceed_exact_total',\n expected_total: expectedTotal,\n rows_fetched: nextOffset,\n });\n }\n if (nextOffset === expectedTotal) {\n return {\n rows,\n source_urls: sourceUrls,\n completeness: {\n status: 'complete',\n complete: true,\n strategy: 'postgrest_exact_count',\n requested_page_size: options.requestedPageSize,\n effective_page_size: effectivePageSize,\n pages_fetched: pagesFetched,\n rows_fetched: rows.length,\n exact_total: expectedTotal,\n termination_reason: 'content_range_total_reached',\n content_range_verified: true,\n ordering_verified: true,\n duplicate_count: 0,\n },\n };\n }\n offset = nextOffset;\n }\n}\n\nexport function buildSnapshotCompleteness<Table extends string>(options: {\n tables: readonly Table[];\n requestedPageSize: number;\n results: Array<{ table: Table; completeness: DatasetMaintenanceTableCompleteness }>;\n}): DatasetMaintenanceSnapshotCompleteness<Table> {\n const expectedTables = new Set(options.tables);\n const observedTables = new Set(options.results.map((result) => result.table));\n if (\n options.results.length !== options.tables.length ||\n observedTables.size !== expectedTables.size ||\n [...observedTables].some((table) => !expectedTables.has(table))\n ) {\n return incomplete({\n reason: 'aggregate_table_set_invalid',\n expected_tables: [...options.tables],\n observed_tables: options.results.map((result) => result.table),\n });\n }\n const entityCounts = Object.fromEntries(\n options.tables.map((table) => [\n table,\n options.results.find((result) => result.table === table)!.completeness.rows_fetched,\n ]),\n ) as Record<Table, number>;\n return {\n status: 'complete',\n complete: true,\n strategy: 'postgrest_exact_count_multi_request',\n requested_page_size: options.requestedPageSize,\n page_count: options.results.reduce((sum, result) => sum + result.completeness.pages_fetched, 0),\n row_count: options.results.reduce((sum, result) => sum + result.completeness.rows_fetched, 0),\n entity_counts: entityCounts,\n tables: options.results.map((result) => ({\n table: result.table,\n ...result.completeness,\n })),\n };\n}\n"]}
1
+ {"version":3,"file":"dataset-maintenance-pagination.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\n\nexport type DatasetMaintenanceTableCompleteness = {\n status: 'complete';\n complete: true;\n strategy: 'postgrest_exact_count';\n requested_page_size: number;\n effective_page_size: number;\n pages_fetched: number;\n rows_fetched: number;\n exact_total: number;\n termination_reason: 'content_range_total_reached';\n content_range_verified: true;\n ordering_verified: true;\n duplicate_count: 0;\n};\n\nexport type DatasetMaintenanceSnapshotCompleteness<Table extends string = string> = {\n status: 'complete';\n complete: true;\n strategy: 'postgrest_exact_count_multi_request';\n requested_page_size: number;\n page_count: number;\n row_count: number;\n entity_counts: Record<Table, number>;\n tables: Array<{ table: Table } & DatasetMaintenanceTableCompleteness>;\n};\n\nexport type DatasetMaintenancePage<T> = {\n rows: T[];\n source_url: string;\n content_range: string | null;\n};\n\ntype ParsedContentRange = {\n start: number | null;\n end: number | null;\n total: number;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isIntegerBetween(value: unknown, minimum: number, maximum: number): value is number {\n return Number.isInteger(value) && Number(value) >= minimum && Number(value) <= maximum;\n}\n\nexport function isDatasetMaintenanceSnapshotCompleteness<Table extends string>(\n value: unknown,\n expectedTables: readonly Table[],\n): value is DatasetMaintenanceSnapshotCompleteness<Table> {\n if (!isRecord(value)) return false;\n if (\n value.status !== 'complete' ||\n value.complete !== true ||\n value.strategy !== 'postgrest_exact_count_multi_request' ||\n !isIntegerBetween(value.requested_page_size, 1, 5_000) ||\n !isIntegerBetween(value.page_count, expectedTables.length, Number.MAX_SAFE_INTEGER) ||\n !isIntegerBetween(value.row_count, 0, Number.MAX_SAFE_INTEGER)\n ) {\n return false;\n }\n\n const entityCounts = value.entity_counts;\n if (!isRecord(entityCounts)) return false;\n const expectedTableSet = new Set<string>(expectedTables);\n const entityCountKeys = Object.keys(entityCounts);\n if (\n entityCountKeys.length !== expectedTables.length ||\n entityCountKeys.some((table) => !expectedTableSet.has(table))\n ) {\n return false;\n }\n for (const table of expectedTables) {\n if (!isIntegerBetween(entityCounts[table], 0, Number.MAX_SAFE_INTEGER)) {\n return false;\n }\n }\n\n if (!Array.isArray(value.tables) || value.tables.length !== expectedTables.length) return false;\n const observedTables = new Set<string>();\n let pageCount = 0;\n let rowCount = 0;\n for (const rawTable of value.tables) {\n if (!isRecord(rawTable)) return false;\n const table = rawTable.table;\n if (typeof table !== 'string' || !expectedTableSet.has(table) || observedTables.has(table)) {\n return false;\n }\n if (\n rawTable.status !== 'complete' ||\n rawTable.complete !== true ||\n rawTable.strategy !== 'postgrest_exact_count' ||\n rawTable.requested_page_size !== value.requested_page_size ||\n !isIntegerBetween(rawTable.effective_page_size, 0, value.requested_page_size) ||\n !isIntegerBetween(rawTable.pages_fetched, 1, Number.MAX_SAFE_INTEGER) ||\n !isIntegerBetween(rawTable.rows_fetched, 0, Number.MAX_SAFE_INTEGER) ||\n rawTable.exact_total !== rawTable.rows_fetched ||\n (rawTable.rows_fetched === 0) !== (rawTable.effective_page_size === 0) ||\n (rawTable.rows_fetched === 0\n ? rawTable.pages_fetched !== 1\n : rawTable.pages_fetched > rawTable.rows_fetched ||\n rawTable.effective_page_size > rawTable.rows_fetched - rawTable.pages_fetched + 1 ||\n rawTable.rows_fetched > rawTable.pages_fetched * rawTable.effective_page_size) ||\n rawTable.termination_reason !== 'content_range_total_reached' ||\n rawTable.content_range_verified !== true ||\n rawTable.ordering_verified !== true ||\n rawTable.duplicate_count !== 0 ||\n rawTable.rows_fetched !== entityCounts[table]\n ) {\n return false;\n }\n observedTables.add(table);\n pageCount += rawTable.pages_fetched;\n rowCount += rawTable.rows_fetched;\n }\n\n return pageCount === value.page_count && rowCount === value.row_count;\n}\n\nexport function isSnapshotCompletenessCompatible<Table extends string>(\n value: unknown,\n baseline: DatasetMaintenanceSnapshotCompleteness<Table> | undefined,\n expectedTables: readonly Table[],\n): boolean {\n if (value === undefined) return baseline === undefined;\n if (!isDatasetMaintenanceSnapshotCompleteness(value, expectedTables)) return false;\n if (baseline === undefined) return true;\n return (\n value.row_count === baseline.row_count &&\n expectedTables.every((table) => value.entity_counts[table] === baseline.entity_counts[table])\n );\n}\n\nfunction incomplete(details: Record<string, unknown>): never {\n throw new CliError('PostgREST pagination could not prove a complete maintenance snapshot.', {\n code: 'DATASET_MAINTENANCE_SNAPSHOT_INCOMPLETE',\n exitCode: 1,\n details,\n });\n}\n\nexport function parseExactContentRange(\n value: string | null,\n details: Record<string, unknown> = {},\n): ParsedContentRange {\n const match = value?.trim().match(/^(?:items\\s+)?(?:(\\d+)-(\\d+)|\\*)\\/(\\d+)$/iu);\n if (!match) {\n return incomplete({\n ...details,\n reason: 'content_range_missing_or_invalid',\n content_range: value,\n });\n }\n const start = match[1] === undefined ? null : Number.parseInt(match[1], 10);\n const end = match[2] === undefined ? null : Number.parseInt(match[2], 10);\n const total = Number.parseInt(match[3]!, 10);\n if (\n !Number.isSafeInteger(total) ||\n (start !== null &&\n (end === null || !Number.isSafeInteger(start) || !Number.isSafeInteger(end))) ||\n (start !== null && end! < start)\n ) {\n return incomplete({ ...details, reason: 'content_range_out_of_bounds', content_range: value });\n }\n return { start, end, total };\n}\n\nexport async function fetchCompletePostgrestPages<T>(options: {\n table: string;\n requestedPageSize: number;\n fetchPage: (offset: number) => Promise<DatasetMaintenancePage<T>>;\n rowIdentity: (row: T) => string | null;\n}): Promise<{\n rows: T[];\n source_urls: string[];\n completeness: DatasetMaintenanceTableCompleteness;\n}> {\n const rows: T[] = [];\n const sourceUrls: string[] = [];\n let expectedTotal: number | null = null;\n let offset = 0;\n let pagesFetched = 0;\n let effectivePageSize = 0;\n let previousIdentity: string | null = null;\n\n while (true) {\n const page = await options.fetchPage(offset);\n pagesFetched += 1;\n sourceUrls.push(page.source_url);\n effectivePageSize = Math.max(effectivePageSize, page.rows.length);\n const range = parseExactContentRange(page.content_range, {\n table: options.table,\n offset,\n source_url: page.source_url,\n });\n if (expectedTotal === null) {\n expectedTotal = range.total;\n } else if (range.total !== expectedTotal) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'exact_total_changed_between_pages',\n expected_total: expectedTotal,\n observed_total: range.total,\n });\n }\n\n if (page.rows.length === 0) {\n if (range.start !== null || offset !== 0 || range.total !== 0) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'empty_page_before_exact_total',\n expected_total: expectedTotal,\n content_range: page.content_range,\n });\n }\n return {\n rows,\n source_urls: sourceUrls,\n completeness: {\n status: 'complete',\n complete: true,\n strategy: 'postgrest_exact_count',\n requested_page_size: options.requestedPageSize,\n effective_page_size: effectivePageSize,\n pages_fetched: pagesFetched,\n rows_fetched: 0,\n exact_total: 0,\n termination_reason: 'content_range_total_reached',\n content_range_verified: true,\n ordering_verified: true,\n duplicate_count: 0,\n },\n };\n }\n\n if (\n page.rows.length > options.requestedPageSize ||\n range.start !== offset ||\n range.end !== offset + page.rows.length - 1\n ) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'content_range_does_not_match_page',\n requested_page_size: options.requestedPageSize,\n returned_rows: page.rows.length,\n content_range: page.content_range,\n });\n }\n\n for (const row of page.rows) {\n const identity = options.rowIdentity(row);\n if (!identity) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'row_identity_missing',\n });\n }\n if (previousIdentity !== null && identity <= previousIdentity) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: identity === previousIdentity ? 'duplicate_row_identity' : 'row_order_not_strict',\n previous_identity: previousIdentity,\n observed_identity: identity,\n });\n }\n previousIdentity = identity;\n }\n\n rows.push(...page.rows);\n const nextOffset = offset + page.rows.length;\n if (nextOffset > expectedTotal) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'rows_exceed_exact_total',\n expected_total: expectedTotal,\n rows_fetched: nextOffset,\n });\n }\n if (nextOffset === expectedTotal) {\n return {\n rows,\n source_urls: sourceUrls,\n completeness: {\n status: 'complete',\n complete: true,\n strategy: 'postgrest_exact_count',\n requested_page_size: options.requestedPageSize,\n effective_page_size: effectivePageSize,\n pages_fetched: pagesFetched,\n rows_fetched: rows.length,\n exact_total: expectedTotal,\n termination_reason: 'content_range_total_reached',\n content_range_verified: true,\n ordering_verified: true,\n duplicate_count: 0,\n },\n };\n }\n offset = nextOffset;\n }\n}\n\nexport function buildSnapshotCompleteness<Table extends string>(options: {\n tables: readonly Table[];\n requestedPageSize: number;\n results: Array<{ table: Table; completeness: DatasetMaintenanceTableCompleteness }>;\n}): DatasetMaintenanceSnapshotCompleteness<Table> {\n const expectedTables = new Set(options.tables);\n const observedTables = new Set(options.results.map((result) => result.table));\n if (\n options.results.length !== options.tables.length ||\n observedTables.size !== expectedTables.size ||\n [...observedTables].some((table) => !expectedTables.has(table))\n ) {\n return incomplete({\n reason: 'aggregate_table_set_invalid',\n expected_tables: [...options.tables],\n observed_tables: options.results.map((result) => result.table),\n });\n }\n const entityCounts = Object.fromEntries(\n options.tables.map((table) => [\n table,\n options.results.find((result) => result.table === table)!.completeness.rows_fetched,\n ]),\n ) as Record<Table, number>;\n return {\n status: 'complete',\n complete: true,\n strategy: 'postgrest_exact_count_multi_request',\n requested_page_size: options.requestedPageSize,\n page_count: options.results.reduce((sum, result) => sum + result.completeness.pages_fetched, 0),\n row_count: options.results.reduce((sum, result) => sum + result.completeness.rows_fetched, 0),\n entity_counts: entityCounts,\n tables: options.results.map((result) => ({\n table: result.table,\n ...result.completeness,\n })),\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-maintenance-protected-before.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-protected-before.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadMaintenanceDesiredPayload } from './dataset-maintenance-alias-request.js';\nimport {\n MAINTENANCE_SCAN_TABLES,\n maintenanceRowKey,\n sha256Json,\n snapshotRemoteRow,\n type DatasetMaintenancePlan,\n type DatasetMaintenanceRemoteRow,\n type DatasetMaintenanceRowSnapshot,\n} from './dataset-maintenance-contract.js';\nimport {\n PROTECTED_EXECUTION_COUNTS,\n parseProtectedDerivativeSnapshot,\n type ProtectedDerivativeSnapshot,\n type ProtectedDerivativeTarget,\n} from './dataset-maintenance-protected-contract.js';\nimport { maintenanceProjectedReferenceFingerprint } from './dataset-maintenance-plan.js';\nimport { isSnapshotCompletenessCompatible } from './dataset-maintenance-pagination.js';\nimport {\n fetchMaintenanceDerivativeSnapshot,\n fetchMaintenanceExactRows,\n type DatasetMaintenanceRemoteContext,\n} from './dataset-maintenance-remote.js';\nimport { CliError } from './errors.js';\n\nconst DERIVATIVE_READ_CONCURRENCY = 5;\n\nexport type ProtectedDerivativeSnapshotTarget = Omit<\n ProtectedDerivativeTarget,\n 'baseline_snapshot_sha256'\n> & {\n baseline_snapshot_sha256?: string;\n};\n\nexport type ProtectedBeforeReadDependencies = {\n fetchExactRows: typeof fetchMaintenanceExactRows;\n fetchDerivativeSnapshot: typeof fetchMaintenanceDerivativeSnapshot;\n parseDerivativeSnapshot: typeof parseProtectedDerivativeSnapshot;\n};\n\nexport type ProtectedBeforeReadDependencyOverrides = Partial<ProtectedBeforeReadDependencies>;\n\nexport type ProtectedBeforeValidationResult = {\n projected_rows: DatasetMaintenanceRemoteRow[];\n support_snapshots: DatasetMaintenanceRowSnapshot[];\n derivative_snapshots: ProtectedDerivativeSnapshot[];\n derivative_mode: 'capture' | 'compare';\n};\n\ntype ProtectedBeforeBaseOptions = {\n plan: DatasetMaintenancePlan;\n planDir: string;\n actorUserId: string;\n currentRows: DatasetMaintenanceRemoteRow[];\n completeness: unknown;\n context: DatasetMaintenanceRemoteContext;\n dependencies?: ProtectedBeforeReadDependencyOverrides;\n};\n\nexport type ValidateProtectedBeforeStateOptions = ProtectedBeforeBaseOptions &\n (\n | {\n derivativeMode: 'capture';\n derivativeTargets: ProtectedDerivativeSnapshotTarget[];\n }\n | {\n derivativeMode: 'compare';\n derivativeTargets: ProtectedDerivativeTarget[];\n }\n );\n\nfunction readDependencies(\n overrides: ProtectedBeforeReadDependencyOverrides = {},\n): ProtectedBeforeReadDependencies {\n return {\n fetchExactRows: overrides.fetchExactRows ?? fetchMaintenanceExactRows,\n fetchDerivativeSnapshot:\n overrides.fetchDerivativeSnapshot ?? fetchMaintenanceDerivativeSnapshot,\n parseDerivativeSnapshot: overrides.parseDerivativeSnapshot ?? parseProtectedDerivativeSnapshot,\n };\n}\n\nfunction actorMismatch(message: string): never {\n throw new CliError(message, {\n code: 'DATASET_MAINTENANCE_PROTECTED_ACTOR_MISMATCH',\n exitCode: 1,\n });\n}\n\nfunction assertPlanActor(plan: DatasetMaintenancePlan, actorUserId: string): void {\n if (\n !actorUserId.trim() ||\n plan.account.user_id !== actorUserId ||\n plan.actions.some((action) => action.expected_user_id !== actorUserId)\n ) {\n actorMismatch('Protected preparation plan and actions must belong to the exact actor.');\n }\n}\n\nfunction assertReadContextActor(\n context: DatasetMaintenanceRemoteContext,\n actorUserId: string,\n): void {\n if (context.account.user_id !== actorUserId) {\n actorMismatch('Authenticated read context does not match the protected preparation actor.');\n }\n}\n\nexport function projectedRows(options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n currentRows: DatasetMaintenanceRemoteRow[];\n}): DatasetMaintenanceRemoteRow[] {\n const projected = new Map(options.currentRows.map((row) => [maintenanceRowKey(row), { ...row }]));\n for (const action of options.plan.actions) {\n const key = maintenanceRowKey(action);\n const row = projected.get(key);\n if (row) {\n projected.set(key, {\n ...row,\n json_ordered: loadMaintenanceDesiredPayload(options.planDir, action),\n });\n }\n }\n return [...projected.values()].sort((left, right) =>\n maintenanceRowKey(left).localeCompare(maintenanceRowKey(right)),\n );\n}\n\nexport function assertStrictBeforeState(options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n actorUserId: string;\n currentRows: DatasetMaintenanceRemoteRow[];\n completeness: unknown;\n}): DatasetMaintenanceRemoteRow[] {\n const { plan } = options;\n assertPlanActor(plan, options.actorUserId);\n if (\n !plan.snapshot_completeness ||\n !isSnapshotCompletenessCompatible(\n options.completeness,\n plan.snapshot_completeness,\n MAINTENANCE_SCAN_TABLES,\n )\n ) {\n throw new CliError('Production RLS census does not match the frozen complete snapshot.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_SNAPSHOT_INCOMPLETE',\n exitCode: 1,\n });\n }\n\n const snapshots = options.currentRows\n .map(snapshotRemoteRow)\n .sort((left, right) => maintenanceRowKey(left).localeCompare(maintenanceRowKey(right)));\n if (sha256Json(snapshots) !== plan.visible_snapshot_sha256) {\n throw new CliError('Production RLS visible snapshot drifted after the freeze.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_VISIBLE_SNAPSHOT_DRIFT',\n exitCode: 1,\n });\n }\n\n const expectedKeys = new Set([\n ...plan.actions.map(maintenanceRowKey),\n ...plan.protected_rows.map(maintenanceRowKey),\n ]);\n const currentKeys = options.currentRows.map(maintenanceRowKey);\n if (\n expectedKeys.size !== options.currentRows.length ||\n new Set(currentKeys).size !== options.currentRows.length ||\n options.currentRows.some(\n (row) => row.user_id !== options.actorUserId || !expectedKeys.has(maintenanceRowKey(row)),\n )\n ) {\n throw new CliError('Production owner account contains missing or unexpected rows.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_ACCOUNT_CENSUS_DRIFT',\n exitCode: 1,\n });\n }\n\n const current = new Map(options.currentRows.map((row) => [maintenanceRowKey(row), row]));\n for (const row of plan.protected_rows) {\n const observed = current.get(maintenanceRowKey(row))!;\n if (snapshotRemoteRow(observed).row_sha256 !== row.row_sha256) {\n throw new CliError(`Protected row drifted: ${row.id}`, {\n code: 'DATASET_MAINTENANCE_PROTECTED_ROW_DRIFT',\n exitCode: 1,\n details: row,\n });\n }\n }\n\n for (const action of plan.actions) {\n const observed = current.get(maintenanceRowKey(action))!;\n if (\n !action.before ||\n observed.user_id !== options.actorUserId ||\n observed.user_id !== action.expected_user_id ||\n observed.state_code !== 0 ||\n snapshotRemoteRow(observed).row_sha256 !== action.before.row_sha256\n ) {\n throw new CliError(\n `Action row is no longer in the exact frozen before state: ${action.action_id}`,\n {\n code: 'DATASET_MAINTENANCE_PROTECTED_ACTION_DRIFT',\n exitCode: 1,\n },\n );\n }\n }\n\n const finalRows = projectedRows({\n plan,\n planDir: options.planDir,\n currentRows: options.currentRows,\n });\n if (\n sha256Json(maintenanceProjectedReferenceFingerprint(finalRows)) !==\n plan.projected_reference_sha256\n ) {\n throw new CliError('Projected reference closure drifted before protected execution.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_REFERENCE_DRIFT',\n exitCode: 1,\n });\n }\n return finalRows;\n}\n\nexport async function assertSupportSnapshots(options: {\n plan: DatasetMaintenancePlan;\n actorUserId: string;\n context: DatasetMaintenanceRemoteContext;\n dependencies?: ProtectedBeforeReadDependencyOverrides;\n}): Promise<DatasetMaintenanceRowSnapshot[]> {\n assertPlanActor(options.plan, options.actorUserId);\n assertReadContextActor(options.context, options.actorUserId);\n const dependencies = readDependencies(options.dependencies);\n const verified: DatasetMaintenanceRowSnapshot[] = [];\n for (const batch of options.plan.alias_batches ?? []) {\n for (const snapshot of [\n batch.target_snapshots.unitgroup,\n batch.target_snapshots.flowproperty,\n batch.target_snapshots.source_unitgroup,\n ]) {\n if (!snapshot) {\n throw new CliError(`Alias support snapshot is absent for ${batch.batch_id}.`, {\n code: 'DATASET_MAINTENANCE_PROTECTED_SUPPORT_DRIFT',\n exitCode: 1,\n });\n }\n const exact = await dependencies.fetchExactRows({\n context: options.context,\n table: snapshot.table,\n id: snapshot.id,\n version: snapshot.version,\n });\n const row = exact.rows.length === 1 ? exact.rows[0] : null;\n if (\n !row ||\n row.user_id !== options.actorUserId ||\n row.state_code !== 0 ||\n snapshotRemoteRow(row).row_sha256 !== snapshot.row_sha256\n ) {\n throw new CliError(`Alias support row drifted for ${batch.batch_id}.`, {\n code: 'DATASET_MAINTENANCE_PROTECTED_SUPPORT_DRIFT',\n exitCode: 1,\n details: { table: snapshot.table, id: snapshot.id, version: snapshot.version },\n });\n }\n verified.push(snapshotRemoteRow(row));\n }\n }\n return verified;\n}\n\nfunction derivativeTargetKey(target: ProtectedDerivativeSnapshotTarget): string {\n return `${target.table}\\u0000${target.id}\\u0000${target.version}`;\n}\n\nfunction stableDerivativeTargets(\n targets: ProtectedDerivativeSnapshotTarget[],\n actorUserId: string,\n): ProtectedDerivativeSnapshotTarget[] {\n const keys = targets.map(derivativeTargetKey);\n if (\n targets.length !== PROTECTED_EXECUTION_COUNTS.derivative_target_count ||\n new Set(keys).size !== targets.length ||\n targets.filter((target) => target.table === 'flows').length !==\n PROTECTED_EXECUTION_COUNTS.flow_count ||\n targets.filter((target) => target.table === 'processes').length !==\n PROTECTED_EXECUTION_COUNTS.process_count ||\n targets.some(\n (target) =>\n !target.id.trim() ||\n !target.version.trim() ||\n target.user_id !== actorUserId ||\n target.state_code !== 0,\n )\n ) {\n throw new CliError('Protected derivative targets are incomplete, duplicate, or foreign.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_DERIVATIVE_TARGET_INVALID',\n exitCode: 1,\n });\n }\n return [...targets].sort((left, right) =>\n derivativeTargetKey(left).localeCompare(derivativeTargetKey(right)),\n );\n}\n\nexport async function captureDerivativeSnapshots(options: {\n actorUserId: string;\n context: DatasetMaintenanceRemoteContext;\n derivativeTargets: ProtectedDerivativeSnapshotTarget[];\n dependencies?: ProtectedBeforeReadDependencyOverrides;\n}): Promise<ProtectedDerivativeSnapshot[]> {\n assertReadContextActor(options.context, options.actorUserId);\n const targets = stableDerivativeTargets(options.derivativeTargets, options.actorUserId);\n const dependencies = readDependencies(options.dependencies);\n const verified: ProtectedDerivativeSnapshot[] = [];\n for (let offset = 0; offset < targets.length; offset += DERIVATIVE_READ_CONCURRENCY) {\n const chunk = targets.slice(offset, offset + DERIVATIVE_READ_CONCURRENCY);\n const snapshots = await Promise.all(\n chunk.map(async (target) =>\n dependencies.parseDerivativeSnapshot(\n await dependencies.fetchDerivativeSnapshot({\n context: options.context,\n table: target.table,\n id: target.id,\n version: target.version,\n }),\n {\n table: target.table,\n id: target.id,\n version: target.version,\n userId: target.user_id,\n },\n ),\n ),\n );\n verified.push(...snapshots);\n }\n return verified;\n}\n\nexport async function assertDerivativeBaselines(options: {\n actorUserId: string;\n context: DatasetMaintenanceRemoteContext;\n derivativeTargets: ProtectedDerivativeTarget[];\n dependencies?: ProtectedBeforeReadDependencyOverrides;\n}): Promise<ProtectedDerivativeSnapshot[]> {\n const snapshots = await captureDerivativeSnapshots({\n actorUserId: options.actorUserId,\n context: options.context,\n derivativeTargets: options.derivativeTargets,\n dependencies: options.dependencies,\n });\n const expectedByKey = new Map(\n options.derivativeTargets.map((target) => [derivativeTargetKey(target), target]),\n );\n for (const snapshot of snapshots) {\n const target = expectedByKey.get(derivativeTargetKey(snapshot));\n if (!target || snapshot.snapshot_sha256 !== target.baseline_snapshot_sha256) {\n throw new CliError('A protected derivative baseline drifted before preflight.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_DERIVATIVE_BASELINE_DRIFT',\n exitCode: 1,\n details: { table: snapshot.table, id: snapshot.id, version: snapshot.version },\n });\n }\n }\n return snapshots;\n}\n\nexport function assertDerivativeCensusBindings(options: {\n actorUserId: string;\n currentRows: DatasetMaintenanceRemoteRow[];\n derivativeSnapshots: ProtectedDerivativeSnapshot[];\n}): void {\n const current = new Map(\n options.currentRows\n .filter((row) => row.table === 'flows' || row.table === 'processes')\n .map((row) => [maintenanceRowKey(row), row]),\n );\n for (const snapshot of options.derivativeSnapshots) {\n const row = current.get(maintenanceRowKey(snapshot));\n if (\n !row ||\n row.user_id !== options.actorUserId ||\n row.state_code !== 0 ||\n row.modified_at !== snapshot.modified_at\n ) {\n throw new CliError(\n 'A protected derivative snapshot does not match the immediately preceding account census.',\n {\n code: 'DATASET_MAINTENANCE_PROTECTED_DERIVATIVE_CENSUS_DRIFT',\n exitCode: 1,\n details: {\n table: snapshot.table,\n id: snapshot.id,\n version: snapshot.version,\n census_modified_at: row?.modified_at ?? null,\n derivative_modified_at: snapshot.modified_at,\n },\n },\n );\n }\n }\n}\n\nexport async function validateProtectedBeforeState(\n options: ValidateProtectedBeforeStateOptions,\n): Promise<ProtectedBeforeValidationResult> {\n const projected = assertStrictBeforeState({\n plan: options.plan,\n planDir: options.planDir,\n actorUserId: options.actorUserId,\n currentRows: options.currentRows,\n completeness: options.completeness,\n });\n const support = await assertSupportSnapshots({\n plan: options.plan,\n actorUserId: options.actorUserId,\n context: options.context,\n dependencies: options.dependencies,\n });\n const derivatives =\n options.derivativeMode === 'capture'\n ? await captureDerivativeSnapshots({\n actorUserId: options.actorUserId,\n context: options.context,\n derivativeTargets: options.derivativeTargets,\n dependencies: options.dependencies,\n })\n : await assertDerivativeBaselines({\n actorUserId: options.actorUserId,\n context: options.context,\n derivativeTargets: options.derivativeTargets,\n dependencies: options.dependencies,\n });\n assertDerivativeCensusBindings({\n actorUserId: options.actorUserId,\n currentRows: options.currentRows,\n derivativeSnapshots: derivatives,\n });\n return {\n projected_rows: projected,\n support_snapshots: support,\n derivative_snapshots: derivatives,\n derivative_mode: options.derivativeMode,\n };\n}\n"]}
1
+ {"version":3,"file":"dataset-maintenance-protected-before.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-protected-before.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadMaintenanceDesiredPayload } from './dataset-maintenance-alias-request.js';\nimport {\n MAINTENANCE_SCAN_TABLES,\n maintenanceRowKey,\n sha256Json,\n snapshotRemoteRow,\n type DatasetMaintenancePlan,\n type DatasetMaintenanceRemoteRow,\n type DatasetMaintenanceRowSnapshot,\n} from './dataset-maintenance-contract.js';\nimport {\n PROTECTED_EXECUTION_COUNTS,\n parseProtectedDerivativeSnapshot,\n type ProtectedDerivativeSnapshot,\n type ProtectedDerivativeTarget,\n} from './dataset-maintenance-protected-contract.js';\nimport { maintenanceProjectedReferenceFingerprint } from './dataset-maintenance-plan.js';\nimport { isSnapshotCompletenessCompatible } from './dataset-maintenance-pagination.js';\nimport {\n fetchMaintenanceDerivativeSnapshot,\n fetchMaintenanceExactRows,\n type DatasetMaintenanceRemoteContext,\n} from './dataset-maintenance-remote.js';\nimport { CliError } from './errors.js';\n\nconst DERIVATIVE_READ_CONCURRENCY = 5;\n\nexport type ProtectedDerivativeSnapshotTarget = Omit<\n ProtectedDerivativeTarget,\n 'baseline_snapshot_sha256'\n> & {\n baseline_snapshot_sha256?: string;\n};\n\nexport type ProtectedBeforeReadDependencies = {\n fetchExactRows: typeof fetchMaintenanceExactRows;\n fetchDerivativeSnapshot: typeof fetchMaintenanceDerivativeSnapshot;\n parseDerivativeSnapshot: typeof parseProtectedDerivativeSnapshot;\n};\n\nexport type ProtectedBeforeReadDependencyOverrides = Partial<ProtectedBeforeReadDependencies>;\n\nexport type ProtectedBeforeValidationResult = {\n projected_rows: DatasetMaintenanceRemoteRow[];\n support_snapshots: DatasetMaintenanceRowSnapshot[];\n derivative_snapshots: ProtectedDerivativeSnapshot[];\n derivative_mode: 'capture' | 'compare';\n};\n\ntype ProtectedBeforeBaseOptions = {\n plan: DatasetMaintenancePlan;\n planDir: string;\n actorUserId: string;\n currentRows: DatasetMaintenanceRemoteRow[];\n completeness: unknown;\n context: DatasetMaintenanceRemoteContext;\n dependencies?: ProtectedBeforeReadDependencyOverrides;\n};\n\nexport type ValidateProtectedBeforeStateOptions = ProtectedBeforeBaseOptions &\n (\n | {\n derivativeMode: 'capture';\n derivativeTargets: ProtectedDerivativeSnapshotTarget[];\n }\n | {\n derivativeMode: 'compare';\n derivativeTargets: ProtectedDerivativeTarget[];\n }\n );\n\nfunction readDependencies(\n overrides: ProtectedBeforeReadDependencyOverrides = {},\n): ProtectedBeforeReadDependencies {\n return {\n fetchExactRows: overrides.fetchExactRows ?? fetchMaintenanceExactRows,\n fetchDerivativeSnapshot:\n overrides.fetchDerivativeSnapshot ?? fetchMaintenanceDerivativeSnapshot,\n parseDerivativeSnapshot: overrides.parseDerivativeSnapshot ?? parseProtectedDerivativeSnapshot,\n };\n}\n\nfunction actorMismatch(message: string): never {\n throw new CliError(message, {\n code: 'DATASET_MAINTENANCE_PROTECTED_ACTOR_MISMATCH',\n exitCode: 1,\n });\n}\n\nfunction assertPlanActor(plan: DatasetMaintenancePlan, actorUserId: string): void {\n if (\n !actorUserId.trim() ||\n plan.account.user_id !== actorUserId ||\n plan.actions.some((action) => action.expected_user_id !== actorUserId)\n ) {\n actorMismatch('Protected preparation plan and actions must belong to the exact actor.');\n }\n}\n\nfunction assertReadContextActor(\n context: DatasetMaintenanceRemoteContext,\n actorUserId: string,\n): void {\n if (context.account.user_id !== actorUserId) {\n actorMismatch('Authenticated read context does not match the protected preparation actor.');\n }\n}\n\nexport function projectedRows(options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n currentRows: DatasetMaintenanceRemoteRow[];\n}): DatasetMaintenanceRemoteRow[] {\n const projected = new Map(options.currentRows.map((row) => [maintenanceRowKey(row), { ...row }]));\n for (const action of options.plan.actions) {\n const key = maintenanceRowKey(action);\n const row = projected.get(key);\n if (row) {\n projected.set(key, {\n ...row,\n json_ordered: loadMaintenanceDesiredPayload(options.planDir, action),\n });\n }\n }\n return [...projected.values()].sort((left, right) =>\n maintenanceRowKey(left).localeCompare(maintenanceRowKey(right)),\n );\n}\n\nexport function assertStrictBeforeState(options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n actorUserId: string;\n currentRows: DatasetMaintenanceRemoteRow[];\n completeness: unknown;\n}): DatasetMaintenanceRemoteRow[] {\n const { plan } = options;\n assertPlanActor(plan, options.actorUserId);\n if (\n !plan.snapshot_completeness ||\n !isSnapshotCompletenessCompatible(\n options.completeness,\n plan.snapshot_completeness,\n MAINTENANCE_SCAN_TABLES,\n )\n ) {\n throw new CliError('Production RLS census does not match the frozen complete snapshot.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_SNAPSHOT_INCOMPLETE',\n exitCode: 1,\n });\n }\n\n const snapshots = options.currentRows\n .map(snapshotRemoteRow)\n .sort((left, right) => maintenanceRowKey(left).localeCompare(maintenanceRowKey(right)));\n if (sha256Json(snapshots) !== plan.visible_snapshot_sha256) {\n throw new CliError('Production RLS visible snapshot drifted after the freeze.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_VISIBLE_SNAPSHOT_DRIFT',\n exitCode: 1,\n });\n }\n\n const expectedKeys = new Set([\n ...plan.actions.map(maintenanceRowKey),\n ...plan.protected_rows.map(maintenanceRowKey),\n ]);\n const currentKeys = options.currentRows.map(maintenanceRowKey);\n if (\n expectedKeys.size !== options.currentRows.length ||\n new Set(currentKeys).size !== options.currentRows.length ||\n options.currentRows.some(\n (row) => row.user_id !== options.actorUserId || !expectedKeys.has(maintenanceRowKey(row)),\n )\n ) {\n throw new CliError('Production owner account contains missing or unexpected rows.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_ACCOUNT_CENSUS_DRIFT',\n exitCode: 1,\n });\n }\n\n const current = new Map(options.currentRows.map((row) => [maintenanceRowKey(row), row]));\n for (const row of plan.protected_rows) {\n const observed = current.get(maintenanceRowKey(row))!;\n if (snapshotRemoteRow(observed).row_sha256 !== row.row_sha256) {\n throw new CliError(`Protected row drifted: ${row.id}`, {\n code: 'DATASET_MAINTENANCE_PROTECTED_ROW_DRIFT',\n exitCode: 1,\n details: row,\n });\n }\n }\n\n for (const action of plan.actions) {\n const observed = current.get(maintenanceRowKey(action))!;\n if (\n !action.before ||\n observed.user_id !== options.actorUserId ||\n observed.user_id !== action.expected_user_id ||\n observed.state_code !== 0 ||\n snapshotRemoteRow(observed).row_sha256 !== action.before.row_sha256\n ) {\n throw new CliError(\n `Action row is no longer in the exact frozen before state: ${action.action_id}`,\n {\n code: 'DATASET_MAINTENANCE_PROTECTED_ACTION_DRIFT',\n exitCode: 1,\n },\n );\n }\n }\n\n const finalRows = projectedRows({\n plan,\n planDir: options.planDir,\n currentRows: options.currentRows,\n });\n if (\n sha256Json(maintenanceProjectedReferenceFingerprint(finalRows)) !==\n plan.projected_reference_sha256\n ) {\n throw new CliError('Projected reference closure drifted before protected execution.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_REFERENCE_DRIFT',\n exitCode: 1,\n });\n }\n return finalRows;\n}\n\nexport async function assertSupportSnapshots(options: {\n plan: DatasetMaintenancePlan;\n actorUserId: string;\n context: DatasetMaintenanceRemoteContext;\n dependencies?: ProtectedBeforeReadDependencyOverrides;\n}): Promise<DatasetMaintenanceRowSnapshot[]> {\n assertPlanActor(options.plan, options.actorUserId);\n assertReadContextActor(options.context, options.actorUserId);\n const dependencies = readDependencies(options.dependencies);\n const verified: DatasetMaintenanceRowSnapshot[] = [];\n for (const batch of options.plan.alias_batches ?? []) {\n for (const snapshot of [\n batch.target_snapshots.unitgroup,\n batch.target_snapshots.flowproperty,\n batch.target_snapshots.source_unitgroup,\n ]) {\n if (!snapshot) {\n throw new CliError(`Alias support snapshot is absent for ${batch.batch_id}.`, {\n code: 'DATASET_MAINTENANCE_PROTECTED_SUPPORT_DRIFT',\n exitCode: 1,\n });\n }\n const exact = await dependencies.fetchExactRows({\n context: options.context,\n table: snapshot.table,\n id: snapshot.id,\n version: snapshot.version,\n });\n const row = exact.rows.length === 1 ? exact.rows[0] : null;\n if (\n !row ||\n row.user_id !== options.actorUserId ||\n row.state_code !== 0 ||\n snapshotRemoteRow(row).row_sha256 !== snapshot.row_sha256\n ) {\n throw new CliError(`Alias support row drifted for ${batch.batch_id}.`, {\n code: 'DATASET_MAINTENANCE_PROTECTED_SUPPORT_DRIFT',\n exitCode: 1,\n details: { table: snapshot.table, id: snapshot.id, version: snapshot.version },\n });\n }\n verified.push(snapshotRemoteRow(row));\n }\n }\n return verified;\n}\n\nfunction derivativeTargetKey(target: ProtectedDerivativeSnapshotTarget): string {\n return `${target.table}\\u0000${target.id}\\u0000${target.version}`;\n}\n\nfunction stableDerivativeTargets(\n targets: ProtectedDerivativeSnapshotTarget[],\n actorUserId: string,\n): ProtectedDerivativeSnapshotTarget[] {\n const keys = targets.map(derivativeTargetKey);\n if (\n targets.length !== PROTECTED_EXECUTION_COUNTS.derivative_target_count ||\n new Set(keys).size !== targets.length ||\n targets.filter((target) => target.table === 'flows').length !==\n PROTECTED_EXECUTION_COUNTS.flow_count ||\n targets.filter((target) => target.table === 'processes').length !==\n PROTECTED_EXECUTION_COUNTS.process_count ||\n targets.some(\n (target) =>\n !target.id.trim() ||\n !target.version.trim() ||\n target.user_id !== actorUserId ||\n target.state_code !== 0,\n )\n ) {\n throw new CliError('Protected derivative targets are incomplete, duplicate, or foreign.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_DERIVATIVE_TARGET_INVALID',\n exitCode: 1,\n });\n }\n return [...targets].sort((left, right) =>\n derivativeTargetKey(left).localeCompare(derivativeTargetKey(right)),\n );\n}\n\nexport async function captureDerivativeSnapshots(options: {\n actorUserId: string;\n context: DatasetMaintenanceRemoteContext;\n derivativeTargets: ProtectedDerivativeSnapshotTarget[];\n dependencies?: ProtectedBeforeReadDependencyOverrides;\n}): Promise<ProtectedDerivativeSnapshot[]> {\n assertReadContextActor(options.context, options.actorUserId);\n const targets = stableDerivativeTargets(options.derivativeTargets, options.actorUserId);\n const dependencies = readDependencies(options.dependencies);\n const verified: ProtectedDerivativeSnapshot[] = [];\n for (let offset = 0; offset < targets.length; offset += DERIVATIVE_READ_CONCURRENCY) {\n const chunk = targets.slice(offset, offset + DERIVATIVE_READ_CONCURRENCY);\n const snapshots = await Promise.all(\n chunk.map(async (target) =>\n dependencies.parseDerivativeSnapshot(\n await dependencies.fetchDerivativeSnapshot({\n context: options.context,\n table: target.table,\n id: target.id,\n version: target.version,\n }),\n {\n table: target.table,\n id: target.id,\n version: target.version,\n userId: target.user_id,\n },\n ),\n ),\n );\n verified.push(...snapshots);\n }\n return verified;\n}\n\nexport async function assertDerivativeBaselines(options: {\n actorUserId: string;\n context: DatasetMaintenanceRemoteContext;\n derivativeTargets: ProtectedDerivativeTarget[];\n dependencies?: ProtectedBeforeReadDependencyOverrides;\n}): Promise<ProtectedDerivativeSnapshot[]> {\n const snapshots = await captureDerivativeSnapshots({\n actorUserId: options.actorUserId,\n context: options.context,\n derivativeTargets: options.derivativeTargets,\n dependencies: options.dependencies,\n });\n const expectedByKey = new Map(\n options.derivativeTargets.map((target) => [derivativeTargetKey(target), target]),\n );\n for (const snapshot of snapshots) {\n const target = expectedByKey.get(derivativeTargetKey(snapshot));\n if (!target || snapshot.snapshot_sha256 !== target.baseline_snapshot_sha256) {\n throw new CliError('A protected derivative baseline drifted before preflight.', {\n code: 'DATASET_MAINTENANCE_PROTECTED_DERIVATIVE_BASELINE_DRIFT',\n exitCode: 1,\n details: { table: snapshot.table, id: snapshot.id, version: snapshot.version },\n });\n }\n }\n return snapshots;\n}\n\nexport function assertDerivativeCensusBindings(options: {\n actorUserId: string;\n currentRows: DatasetMaintenanceRemoteRow[];\n derivativeSnapshots: ProtectedDerivativeSnapshot[];\n}): void {\n const current = new Map(\n options.currentRows\n .filter((row) => row.table === 'flows' || row.table === 'processes')\n .map((row) => [maintenanceRowKey(row), row]),\n );\n for (const snapshot of options.derivativeSnapshots) {\n const row = current.get(maintenanceRowKey(snapshot));\n if (\n !row ||\n row.user_id !== options.actorUserId ||\n row.state_code !== 0 ||\n row.modified_at !== snapshot.modified_at\n ) {\n throw new CliError(\n 'A protected derivative snapshot does not match the immediately preceding account census.',\n {\n code: 'DATASET_MAINTENANCE_PROTECTED_DERIVATIVE_CENSUS_DRIFT',\n exitCode: 1,\n details: {\n table: snapshot.table,\n id: snapshot.id,\n version: snapshot.version,\n census_modified_at: row?.modified_at ?? null,\n derivative_modified_at: snapshot.modified_at,\n },\n },\n );\n }\n }\n}\n\nexport async function validateProtectedBeforeState(\n options: ValidateProtectedBeforeStateOptions,\n): Promise<ProtectedBeforeValidationResult> {\n const projected = assertStrictBeforeState({\n plan: options.plan,\n planDir: options.planDir,\n actorUserId: options.actorUserId,\n currentRows: options.currentRows,\n completeness: options.completeness,\n });\n const support = await assertSupportSnapshots({\n plan: options.plan,\n actorUserId: options.actorUserId,\n context: options.context,\n dependencies: options.dependencies,\n });\n const derivatives =\n options.derivativeMode === 'capture'\n ? await captureDerivativeSnapshots({\n actorUserId: options.actorUserId,\n context: options.context,\n derivativeTargets: options.derivativeTargets,\n dependencies: options.dependencies,\n })\n : await assertDerivativeBaselines({\n actorUserId: options.actorUserId,\n context: options.context,\n derivativeTargets: options.derivativeTargets,\n dependencies: options.dependencies,\n });\n assertDerivativeCensusBindings({\n actorUserId: options.actorUserId,\n currentRows: options.currentRows,\n derivativeSnapshots: derivatives,\n });\n return {\n projected_rows: projected,\n support_snapshots: support,\n derivative_snapshots: derivatives,\n derivative_mode: options.derivativeMode,\n };\n}\n"]}
@@ -154,7 +154,6 @@ export function parseProtectedDerivativeSnapshot(value, expected) {
154
154
  modified_at: timestamp(value.modified_at, 'derivative_snapshot.modified_at'),
155
155
  json_sha256: hash(value.json_sha256, 'derivative_snapshot.json_sha256'),
156
156
  json_ordered_sha256: hash(value.json_ordered_sha256, 'derivative_snapshot.json_ordered_sha256'),
157
- extracted_text_sha256: hash(value.extracted_text_sha256, 'derivative_snapshot.extracted_text_sha256'),
158
157
  extracted_md_sha256: nullableHash(value.extracted_md_sha256, 'derivative_snapshot.extracted_md_sha256'),
159
158
  embedding_ft_sha256: nullableHash(value.embedding_ft_sha256, 'derivative_snapshot.embedding_ft_sha256'),
160
159
  embedding_ft_at: nullableTimestamp(value.embedding_ft_at, 'derivative_snapshot.embedding_ft_at'),