@tiangong-lca/cli 0.0.27 → 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -2
- package/dist/src/cli.js +544 -3
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-contract.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-flow-identity-approval-claim.js +175 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-approval-claim.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-capture.js +511 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-capture.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-command.js +26 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-command.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-contract.js +784 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-contract.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-execution-contract.js +1317 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-execution-contract.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-freeze.js +342 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-freeze.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-plan.js +900 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-plan.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-recovery.js +688 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-recovery.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-run.js +1369 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-run.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-seal.js +144 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-seal.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-verify.js +377 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-verify.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-wire.js +178 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-wire.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-protected-verify.js +76 -1
- package/dist/src/lib/dataset-maintenance-protected-verify.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-remote.js +156 -10
- package/dist/src/lib/dataset-maintenance-remote.js.map +1 -1
- package/dist/src/lib/http.js.map +1 -1
- package/dist/src/lib/lca-release.js +683 -0
- package/dist/src/lib/lca-release.js.map +1 -0
- package/package.json +1 -1
|
@@ -11,6 +11,72 @@ function issue(code, message, details) {
|
|
|
11
11
|
function requiredString(value) {
|
|
12
12
|
return typeof value === 'string' && value.trim() ? value : null;
|
|
13
13
|
}
|
|
14
|
+
function parsePrimaryActionEvidence(value) {
|
|
15
|
+
if (!isJsonObject(value))
|
|
16
|
+
return null;
|
|
17
|
+
const actionId = requiredString(value.action_id);
|
|
18
|
+
const id = requiredString(value.id);
|
|
19
|
+
const version = requiredString(value.version);
|
|
20
|
+
const desiredJsonOrderedSha256 = requiredString(value.desired_json_ordered_sha256);
|
|
21
|
+
const liveJsonSha256 = requiredString(value.live_json_sha256);
|
|
22
|
+
const liveJsonOrderedSha256 = requiredString(value.live_json_ordered_sha256);
|
|
23
|
+
if (!actionId ||
|
|
24
|
+
(value.table !== 'flowproperties' && value.table !== 'flows' && value.table !== 'processes') ||
|
|
25
|
+
!id ||
|
|
26
|
+
!version ||
|
|
27
|
+
value.row_found !== true ||
|
|
28
|
+
value.owner_matches !== true ||
|
|
29
|
+
value.state_code_matches !== true ||
|
|
30
|
+
value.json_matches !== true ||
|
|
31
|
+
value.json_ordered_matches !== true ||
|
|
32
|
+
!desiredJsonOrderedSha256 ||
|
|
33
|
+
!SHA256.test(desiredJsonOrderedSha256) ||
|
|
34
|
+
!liveJsonSha256 ||
|
|
35
|
+
!SHA256.test(liveJsonSha256) ||
|
|
36
|
+
!liveJsonOrderedSha256 ||
|
|
37
|
+
!SHA256.test(liveJsonOrderedSha256) ||
|
|
38
|
+
value.valid !== true) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
action_id: actionId,
|
|
43
|
+
table: value.table,
|
|
44
|
+
id,
|
|
45
|
+
version,
|
|
46
|
+
row_found: true,
|
|
47
|
+
owner_matches: true,
|
|
48
|
+
state_code_matches: true,
|
|
49
|
+
json_matches: true,
|
|
50
|
+
json_ordered_matches: true,
|
|
51
|
+
desired_json_ordered_sha256: desiredJsonOrderedSha256,
|
|
52
|
+
live_json_sha256: liveJsonSha256,
|
|
53
|
+
live_json_ordered_sha256: liveJsonOrderedSha256,
|
|
54
|
+
valid: true,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function indexPrimaryActionEvidence(options) {
|
|
58
|
+
if (!isJsonObject(options.closure) || !Array.isArray(options.closure.action_evidence)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
if (options.closure.action_evidence.length !== options.plan.actions.length)
|
|
62
|
+
return null;
|
|
63
|
+
const byKey = new Map();
|
|
64
|
+
const actionIds = new Set();
|
|
65
|
+
for (const raw of options.closure.action_evidence) {
|
|
66
|
+
const evidence = parsePrimaryActionEvidence(raw);
|
|
67
|
+
if (!evidence)
|
|
68
|
+
return null;
|
|
69
|
+
const key = maintenanceRowKey(evidence);
|
|
70
|
+
if (byKey.has(key) || actionIds.has(evidence.action_id))
|
|
71
|
+
return null;
|
|
72
|
+
byKey.set(key, evidence);
|
|
73
|
+
actionIds.add(evidence.action_id);
|
|
74
|
+
}
|
|
75
|
+
if (options.plan.actions.some((action) => byKey.get(maintenanceRowKey(action))?.action_id !== action.action_id)) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return byKey;
|
|
79
|
+
}
|
|
14
80
|
export function inspectProtectedLiveDerivative(row) {
|
|
15
81
|
const raw = row.raw;
|
|
16
82
|
const jsonOrdered = isJsonObject(raw.json_ordered) ? raw.json_ordered : null;
|
|
@@ -254,6 +320,10 @@ function matchLiveTargets(options) {
|
|
|
254
320
|
const snapshots = new Map(options.snapshots.map((snapshot) => [terminalTargetKey(snapshot), snapshot]));
|
|
255
321
|
const live = new Map(options.live.map((row) => [terminalTargetKey(row), row]));
|
|
256
322
|
const actions = new Map(options.plan.actions.map((action) => [maintenanceRowKey(action), action]));
|
|
323
|
+
const primaryEvidence = indexPrimaryActionEvidence({
|
|
324
|
+
closure: options.primaryClosure,
|
|
325
|
+
plan: options.plan,
|
|
326
|
+
});
|
|
257
327
|
const issues = [];
|
|
258
328
|
const expectedKeys = new Set(options.identity.derivative_targets.map(terminalTargetKey));
|
|
259
329
|
const liveKeys = options.live.map(terminalTargetKey);
|
|
@@ -271,16 +341,20 @@ function matchLiveTargets(options) {
|
|
|
271
341
|
const proof = proofs.get(key);
|
|
272
342
|
const snapshot = snapshots.get(key);
|
|
273
343
|
const action = actions.get(key);
|
|
344
|
+
const evidence = primaryEvidence?.get(key);
|
|
274
345
|
if (!row ||
|
|
275
346
|
!proof ||
|
|
276
347
|
!snapshot ||
|
|
277
348
|
!action?.desired_payload ||
|
|
349
|
+
!evidence ||
|
|
278
350
|
row.user_id !== options.identity.actor.user_id ||
|
|
279
351
|
row.state_code !== 0 ||
|
|
280
352
|
snapshot.user_id !== options.identity.actor.user_id ||
|
|
281
353
|
snapshot.state_code !== 0 ||
|
|
282
354
|
row.json_ordered_sha256 !== action.desired_payload.sha256 ||
|
|
283
|
-
|
|
355
|
+
evidence.live_json_sha256 !== evidence.desired_json_ordered_sha256 ||
|
|
356
|
+
evidence.live_json_ordered_sha256 !== evidence.desired_json_ordered_sha256 ||
|
|
357
|
+
snapshot.json_ordered_sha256 !== evidence.desired_json_ordered_sha256 ||
|
|
284
358
|
snapshot.snapshot_sha256 !== proof.completed_snapshot_sha256 ||
|
|
285
359
|
!snapshot.extracted_md_sha256 ||
|
|
286
360
|
!snapshot.embedding_ft_sha256 ||
|
|
@@ -395,6 +469,7 @@ async function verifyProtectedExecutionWithDependencies(options, dependencies) {
|
|
|
395
469
|
proofs: terminalProofs,
|
|
396
470
|
live: validLive,
|
|
397
471
|
snapshots,
|
|
472
|
+
primaryClosure: options.proof.primary_readback?.closure,
|
|
398
473
|
plan: options.plan,
|
|
399
474
|
identity: options.identity,
|
|
400
475
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-maintenance-protected-verify.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-protected-verify.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadMaintenanceDesiredPayload } from './dataset-maintenance-alias-request.js';\nimport {\n isJsonObject,\n maintenanceRowKey,\n sha256Json,\n snapshotRemoteRow,\n type DatasetMaintenancePlan,\n type DatasetMaintenanceRemoteRow,\n} from './dataset-maintenance-contract.js';\nimport {\n PROTECTED_EXECUTION_COUNTS,\n parseProtectedDerivativeSnapshot,\n type ProtectedDerivativeSnapshot,\n type ProtectedExecutionIdentity,\n type ProtectedExecutionStatusProof,\n type ProtectedReportStatus,\n type ProtectedTerminalTargetProof,\n} from './dataset-maintenance-protected-contract.js';\nimport { maintenanceProjectedReferenceFingerprint } from './dataset-maintenance-plan.js';\nimport { isSnapshotCompletenessCompatible } from './dataset-maintenance-pagination.js';\nimport {\n fetchMaintenanceAccountRows,\n fetchMaintenanceDerivativeSnapshot,\n fetchMaintenanceDerivativeTargetRows,\n type DatasetMaintenanceDerivativeRemoteRow,\n type DatasetMaintenanceRemoteContext,\n} from './dataset-maintenance-remote.js';\n\nconst SHA256 = /^[a-f0-9]{64}$/u;\n\nexport type ProtectedVerificationIssue = {\n code: string;\n message: string;\n details?: unknown;\n};\n\nexport type ProtectedLiveDerivativeReadback = {\n table: 'flows' | 'processes';\n id: string;\n version: string;\n user_id: string;\n state_code: 0;\n json_ordered_sha256: string;\n extracted_text_present: true;\n extracted_md_present: true;\n embedding_ft_present: true;\n embedding_ft_at: string;\n};\n\nexport type ProtectedVerificationResult = {\n status: ProtectedReportStatus;\n issues: ProtectedVerificationIssue[];\n account_readback: {\n rows: DatasetMaintenanceRemoteRow[];\n source_urls: string[];\n completeness: unknown;\n } | null;\n derivative_readback: {\n rows: ProtectedLiveDerivativeReadback[];\n snapshots: ProtectedDerivativeSnapshot[];\n source_urls: string[];\n } | null;\n};\n\nfunction issue(code: string, message: string, details?: unknown): ProtectedVerificationIssue {\n return { code, message, ...(details === undefined ? {} : { details }) };\n}\n\nfunction requiredString(value: unknown): string | null {\n return typeof value === 'string' && value.trim() ? value : null;\n}\n\nexport function inspectProtectedLiveDerivative(\n row: DatasetMaintenanceDerivativeRemoteRow,\n): ProtectedLiveDerivativeReadback | null {\n const raw = row.raw;\n const jsonOrdered = isJsonObject(raw.json_ordered) ? raw.json_ordered : null;\n const extractedText = requiredString(raw.extracted_text);\n const extractedMd = requiredString(raw.extracted_md);\n const embeddingAt = requiredString(raw.embedding_ft_at);\n if (\n row.state_code !== 0 ||\n !jsonOrdered ||\n !extractedText ||\n !extractedMd ||\n raw.embedding_ft === null ||\n raw.embedding_ft === undefined ||\n !embeddingAt ||\n !Number.isFinite(Date.parse(embeddingAt))\n ) {\n return null;\n }\n return {\n table: row.table,\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: 0 as const,\n json_ordered_sha256: sha256Json(jsonOrdered),\n extracted_text_present: true,\n extracted_md_present: true,\n embedding_ft_present: true,\n embedding_ft_at: embeddingAt,\n };\n}\n\nfunction expectedFinalRows(options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n rows: DatasetMaintenanceRemoteRow[];\n}): DatasetMaintenanceRemoteRow[] {\n const rows = new Map(options.rows.map((row) => [maintenanceRowKey(row), { ...row }]));\n for (const action of options.plan.actions) {\n const current = rows.get(maintenanceRowKey(action));\n if (current) {\n rows.set(maintenanceRowKey(action), {\n ...current,\n json_ordered: loadMaintenanceDesiredPayload(options.planDir, action),\n });\n }\n }\n return [...rows.values()].sort((left, right) =>\n maintenanceRowKey(left).localeCompare(maintenanceRowKey(right)),\n );\n}\n\nfunction verifyStatusStructure(options: {\n identity: ProtectedExecutionIdentity;\n proof: ProtectedExecutionStatusProof;\n}): ProtectedVerificationIssue[] {\n const { identity, proof } = options;\n const issues: ProtectedVerificationIssue[] = [];\n const notAdmitted = proof.execution_status === 'not_admitted';\n const dispatchCountValid =\n proof.dispatch_count === 1 ||\n (proof.dispatch_count === 0 &&\n (proof.execution_status === 'failed' || proof.execution_status === 'indeterminate'));\n if (\n (notAdmitted && (proof.attempt_count !== 0 || proof.dispatch_count !== 0)) ||\n (!notAdmitted && (proof.attempt_count !== 1 || !dispatchCountValid))\n ) {\n issues.push(\n issue(\n 'PROTECTED_ATTEMPT_DISPATCH_COUNT_INVALID',\n 'Database did not prove the one-attempt, at-most-one-dispatch execution policy.',\n { attempt_count: proof.attempt_count, dispatch_count: proof.dispatch_count },\n ),\n );\n }\n if (proof.plan_sha256 !== identity.plan_sha256 || proof.operation_id !== identity.operation_id) {\n issues.push(\n issue(\n 'PROTECTED_EXECUTION_IDENTITY_MISMATCH',\n 'Database status does not round-trip the sealed plan identity.',\n ),\n );\n }\n const categoryMatches =\n (proof.status === 'passed' && proof.execution_status === 'completed') ||\n (proof.status === 'failed' &&\n (proof.execution_status === 'failed' || proof.execution_status === 'completed')) ||\n (proof.status === 'indeterminate' &&\n (proof.execution_status === 'not_admitted' || proof.execution_status === 'indeterminate')) ||\n (proof.status === 'pending' &&\n ['dispatching', 'dispatched', 'running', 'derivatives_pending'].includes(\n proof.execution_status,\n ));\n if (!categoryMatches) {\n issues.push(\n issue(\n 'PROTECTED_STATUS_CATEGORY_INVALID',\n 'Database status category is inconsistent with its execution ledger state.',\n { status: proof.status, execution_status: proof.execution_status },\n ),\n );\n }\n if (!notAdmitted) {\n const gateNames = proof.gates.map((gate) => gate.gate);\n const receiptHashes = proof.gates.map((gate) => gate.receipt_sha256);\n const gateClosureValid =\n proof.gate_count === 3 &&\n proof.gates.length === 3 &&\n new Set(gateNames).size === 3 &&\n new Set(receiptHashes).size === 3 &&\n proof.gates.every(\n (gate) => gate.observed_sha256 === gate.expected_sha256 && gate.status === 'passed',\n );\n if (!gateClosureValid) {\n issues.push(\n issue(\n 'PROTECTED_GATE_CLOSURE_INVALID',\n 'Database did not round-trip three unique server-captured gate receipts.',\n proof.gates,\n ),\n );\n }\n }\n return issues;\n}\n\nfunction verifyAuditClosure(proof: ProtectedExecutionStatusProof): ProtectedVerificationIssue[] {\n const audit = proof.primary_readback;\n const closure = audit?.closure;\n let closureHashMatches = false;\n if (isJsonObject(closure) && typeof closure.live_closure_proof_sha256 === 'string') {\n const proofMaterial = { ...closure };\n const closureSha256 = String(proofMaterial.live_closure_proof_sha256);\n delete proofMaterial.ok;\n delete proofMaterial.row_count;\n delete proofMaterial.exchange_count;\n delete proofMaterial.live_closure_proof_sha256;\n closureHashMatches = sha256Json(proofMaterial) === closureSha256;\n }\n if (\n !audit ||\n audit.row_count !== PROTECTED_EXECUTION_COUNTS.action_count ||\n audit.exchange_count !== PROTECTED_EXECUTION_COUNTS.exchange_count ||\n audit.alias_audit_count !== PROTECTED_EXECUTION_COUNTS.audit_count ||\n audit.live_closure_proof !== true ||\n !isJsonObject(closure) ||\n closure.schema_version !== 'dataset-alias-primary-closure.v1' ||\n closure.ok !== true ||\n closure.actor_user_id !== proof.actor_user_id ||\n closure.batch_count !== PROTECTED_EXECUTION_COUNTS.batch_count ||\n closure.action_count !== PROTECTED_EXECUTION_COUNTS.action_count ||\n closure.distinct_action_count !== PROTECTED_EXECUTION_COUNTS.action_count ||\n closure.flowproperty_count !== PROTECTED_EXECUTION_COUNTS.flowproperty_count ||\n closure.flow_count !== PROTECTED_EXECUTION_COUNTS.flow_count ||\n closure.process_count !== PROTECTED_EXECUTION_COUNTS.process_count ||\n closure.support_reference_count !== 6 ||\n closure.flowproperty_support_count !== 2 ||\n closure.unitgroup_support_count !== 2 ||\n closure.source_unitgroup_support_count !== 2 ||\n closure.invalid_action_count !== 0 ||\n closure.invalid_support_count !== 0 ||\n !Array.isArray(closure.action_evidence) ||\n closure.action_evidence.length !== PROTECTED_EXECUTION_COUNTS.action_count ||\n closure.action_evidence.some((entry) => !isJsonObject(entry)) ||\n !Array.isArray(closure.support_evidence) ||\n closure.support_evidence.length !== 6 ||\n closure.support_evidence.some((entry) => !isJsonObject(entry)) ||\n closure.row_count !== PROTECTED_EXECUTION_COUNTS.action_count ||\n closure.exchange_count !== PROTECTED_EXECUTION_COUNTS.exchange_count ||\n closure.live_closure_proof !== true ||\n !closureHashMatches\n ) {\n return [\n issue(\n 'PROTECTED_AUDIT_CLOSURE_INVALID',\n 'Terminal execution did not prove the exact 52-row, 59-exchange, 55-audit primary closure.',\n audit,\n ),\n ];\n }\n return [];\n}\n\nfunction terminalTargetKey(target: { table: string; id: string; version: string }): string {\n return `${target.table}\\u0000${target.id}\\u0000${target.version}`;\n}\n\nfunction verifyTerminalTargets(options: {\n identity: ProtectedExecutionIdentity;\n proof: ProtectedExecutionStatusProof;\n}): ProtectedVerificationIssue[] {\n const issues: ProtectedVerificationIssue[] = [];\n const batch = options.proof.derivative_readback;\n if (batch.proof_level !== 'causal_terminal' || batch.proof_deferred !== false) {\n return [\n issue(\n 'PROTECTED_DERIVATIVE_TARGET_CLOSURE_INVALID',\n 'Terminal proof must use the full causal-terminal evidence level.',\n ),\n ];\n }\n const targets = batch.targets;\n const keys = targets.map(terminalTargetKey);\n if (\n batch.schema_version !== 'dataset-derivative-rebuild-batch-status.v1' ||\n batch.batch_id !== options.identity.request_id ||\n batch.status !== 'completed' ||\n batch.code !== 'DERIVATIVE_BATCH_COMPLETED' ||\n batch.causal_terminal_proof !== true ||\n batch.target_count !== PROTECTED_EXECUTION_COUNTS.derivative_target_count ||\n batch.flow_count !== PROTECTED_EXECUTION_COUNTS.flow_count ||\n batch.process_count !== PROTECTED_EXECUTION_COUNTS.process_count ||\n batch.completed_count !== PROTECTED_EXECUTION_COUNTS.derivative_target_count ||\n batch.nonterminal_count !== 0 ||\n batch.failed_count !== 0 ||\n batch.invalid_proof_count !== 0 ||\n targets.length !== PROTECTED_EXECUTION_COUNTS.derivative_target_count ||\n new Set(keys).size !== PROTECTED_EXECUTION_COUNTS.derivative_target_count ||\n new Set(targets.map((target) => target.ordinal)).size !==\n PROTECTED_EXECUTION_COUNTS.derivative_target_count\n ) {\n return [\n issue(\n 'PROTECTED_DERIVATIVE_TARGET_CLOSURE_INVALID',\n 'Terminal proof must contain exactly 50 unique derivative targets.',\n ),\n ];\n }\n const frozen = new Map(\n options.identity.derivative_targets.map((target) => [terminalTargetKey(target), target]),\n );\n for (const [index, target] of targets.entries()) {\n const expected = frozen.get(terminalTargetKey(target));\n if (\n !expected ||\n target.ordinal !== index + 1 ||\n target.request_id === options.identity.request_id ||\n target.source_baseline_snapshot_sha256 !== expected.baseline_snapshot_sha256\n ) {\n issues.push(\n issue(\n 'PROTECTED_DERIVATIVE_TARGET_IDENTITY_MISMATCH',\n 'Terminal derivative proof contains a foreign or changed target.',\n { table: target.table, id: target.id, version: target.version },\n ),\n );\n continue;\n }\n if (\n target.status !== 'completed' ||\n !target.phase ||\n !target.completed_snapshot_sha256 ||\n !SHA256.test(target.expected_snapshot_sha256) ||\n !SHA256.test(target.completed_snapshot_sha256) ||\n target.completed_snapshot_sha256 === target.expected_snapshot_sha256 ||\n !target.primary_matches ||\n !target.terminal_snapshot_matches ||\n !target.proposals_committed ||\n !target.derivative_fresh ||\n !target.lifecycle_complete ||\n !target.terminal_audit_present ||\n Object.values(target.residue).some((count) => count !== 0) ||\n !target.causal_terminal_proof\n ) {\n issues.push(\n issue(\n 'PROTECTED_DERIVATIVE_TARGET_NOT_TERMINAL',\n 'Derivative target lacks causal completed/live equality or retains queue, failure, or fence state.',\n { table: target.table, id: target.id, version: target.version },\n ),\n );\n }\n }\n return issues;\n}\n\nfunction verifyFinalAccountRows(options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n rows: DatasetMaintenanceRemoteRow[];\n completeness: unknown;\n}): ProtectedVerificationIssue[] {\n const issues: ProtectedVerificationIssue[] = [];\n if (\n !options.plan.snapshot_completeness ||\n !isSnapshotCompletenessCompatible(\n options.completeness,\n options.plan.snapshot_completeness,\n Object.keys(options.plan.snapshot_completeness.entity_counts),\n )\n ) {\n issues.push(\n issue(\n 'PROTECTED_FINAL_SNAPSHOT_INCOMPLETE',\n 'Final RLS account scan does not prove the same complete table census as the plan.',\n ),\n );\n return issues;\n }\n const expectedKeys = new Set([\n ...options.plan.actions.map(maintenanceRowKey),\n ...options.plan.protected_rows.map(maintenanceRowKey),\n ]);\n const actualKeys = new Set(options.rows.map(maintenanceRowKey));\n if (\n expectedKeys.size !== actualKeys.size ||\n [...expectedKeys].some((key) => !actualKeys.has(key))\n ) {\n issues.push(\n issue(\n 'PROTECTED_FINAL_ACCOUNT_CENSUS_DRIFT',\n 'Final RLS account rows contain missing or unexpected entities.',\n ),\n );\n }\n const current = new Map(options.rows.map((row) => [maintenanceRowKey(row), row]));\n for (const protectedRow of options.plan.protected_rows) {\n const row = current.get(maintenanceRowKey(protectedRow));\n if (!row || snapshotRemoteRow(row).row_sha256 !== protectedRow.row_sha256) {\n issues.push(\n issue('PROTECTED_ROW_DRIFT', 'A protected non-action row changed.', protectedRow),\n );\n }\n }\n for (const action of options.plan.actions) {\n const row = current.get(maintenanceRowKey(action));\n const desired = loadMaintenanceDesiredPayload(options.planDir, action);\n if (\n !row ||\n row.user_id !== action.expected_user_id ||\n row.state_code !== 0 ||\n sha256Json(row.json_ordered) !== sha256Json(desired) ||\n row.model_id !== action.before?.model_id ||\n row.rule_verification !== action.before?.rule_verification\n ) {\n issues.push(\n issue(\n 'PROTECTED_ACTION_READBACK_MISMATCH',\n 'An action row does not match the desired owner-draft payload.',\n { action_id: action.action_id },\n ),\n );\n }\n }\n const projected = expectedFinalRows({\n plan: options.plan,\n planDir: options.planDir,\n rows: options.rows,\n });\n if (\n sha256Json(maintenanceProjectedReferenceFingerprint(projected)) !==\n options.plan.projected_reference_sha256\n ) {\n issues.push(\n issue(\n 'PROTECTED_REFERENCE_CLOSURE_MISMATCH',\n 'Final reference closure does not match the frozen projected closure.',\n ),\n );\n }\n return issues;\n}\n\nfunction matchLiveTargets(options: {\n proofs: ProtectedTerminalTargetProof[];\n live: ProtectedLiveDerivativeReadback[];\n snapshots: ProtectedDerivativeSnapshot[];\n plan: DatasetMaintenancePlan;\n identity: ProtectedExecutionIdentity;\n}): ProtectedVerificationIssue[] {\n const proofs = new Map(options.proofs.map((proof) => [terminalTargetKey(proof), proof]));\n const snapshots = new Map(\n options.snapshots.map((snapshot) => [terminalTargetKey(snapshot), snapshot]),\n );\n const live = new Map(options.live.map((row) => [terminalTargetKey(row), row]));\n const actions = new Map(\n options.plan.actions.map((action) => [maintenanceRowKey(action), action]),\n );\n const issues: ProtectedVerificationIssue[] = [];\n const expectedKeys = new Set(options.identity.derivative_targets.map(terminalTargetKey));\n const liveKeys = options.live.map(terminalTargetKey);\n const snapshotKeys = options.snapshots.map(terminalTargetKey);\n if (\n liveKeys.length !== expectedKeys.size ||\n new Set(liveKeys).size !== expectedKeys.size ||\n snapshotKeys.length !== expectedKeys.size ||\n new Set(snapshotKeys).size !== expectedKeys.size ||\n [...expectedKeys].some((key) => !live.has(key) || !snapshots.has(key))\n ) {\n issues.push(\n issue(\n 'PROTECTED_DERIVATIVE_LIVE_SET_MISMATCH',\n 'Independent derivative rows and snapshots must be unique and exactly match all 50 frozen targets.',\n ),\n );\n }\n for (const target of options.identity.derivative_targets) {\n const key = terminalTargetKey(target);\n const row = live.get(key);\n const proof = proofs.get(key);\n const snapshot = snapshots.get(key);\n const action = actions.get(key);\n if (\n !row ||\n !proof ||\n !snapshot ||\n !action?.desired_payload ||\n row.user_id !== options.identity.actor.user_id ||\n row.state_code !== 0 ||\n snapshot.user_id !== options.identity.actor.user_id ||\n snapshot.state_code !== 0 ||\n row.json_ordered_sha256 !== action.desired_payload.sha256 ||\n snapshot.json_ordered_sha256 !== row.json_ordered_sha256 ||\n snapshot.snapshot_sha256 !== proof.completed_snapshot_sha256 ||\n !snapshot.extracted_md_sha256 ||\n !snapshot.embedding_ft_sha256 ||\n !snapshot.embedding_ft_at\n ) {\n issues.push(\n issue(\n 'PROTECTED_DERIVATIVE_LIVE_MISMATCH',\n 'Independent RLS derivative readback does not match the terminal database proof.',\n { table: target.table, id: target.id, version: target.version },\n ),\n );\n }\n }\n return issues;\n}\n\nasync function fetchProtectedDerivativeSnapshots(options: {\n context: DatasetMaintenanceRemoteContext;\n identity: ProtectedExecutionIdentity;\n}): Promise<ProtectedDerivativeSnapshot[]> {\n const snapshots: ProtectedDerivativeSnapshot[] = [];\n const targets = options.identity.derivative_targets;\n for (let offset = 0; offset < targets.length; offset += 5) {\n const chunk = targets.slice(offset, offset + 5);\n snapshots.push(\n ...(await Promise.all(\n chunk.map(async (target) =>\n parseProtectedDerivativeSnapshot(\n await fetchMaintenanceDerivativeSnapshot({\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 );\n }\n return snapshots;\n}\n\ntype ProtectedVerificationDependencies = {\n fetchAccountRows: typeof fetchMaintenanceAccountRows;\n fetchDerivativeRows: typeof fetchMaintenanceDerivativeTargetRows;\n fetchSnapshots: typeof fetchProtectedDerivativeSnapshots;\n};\n\nasync function verifyProtectedExecutionWithDependencies(\n options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n identity: ProtectedExecutionIdentity;\n proof: ProtectedExecutionStatusProof;\n context: DatasetMaintenanceRemoteContext;\n pageSize?: number;\n },\n dependencies: ProtectedVerificationDependencies,\n): Promise<ProtectedVerificationResult> {\n const { fetchAccountRows, fetchDerivativeRows, fetchSnapshots } = dependencies;\n const structuralIssues = verifyStatusStructure({\n identity: options.identity,\n proof: options.proof,\n });\n if (structuralIssues.length) {\n return {\n status: options.proof.status === 'indeterminate' ? 'indeterminate' : 'failed',\n issues: structuralIssues,\n account_readback: null,\n derivative_readback: null,\n };\n }\n if (options.proof.execution_status === 'not_admitted') {\n return {\n status: 'indeterminate',\n issues: [\n issue(\n 'PROTECTED_EXECUTION_NOT_FOUND',\n 'The server has a protected preflight but no admitted execution; admission must not be retried.',\n ),\n ],\n account_readback: null,\n derivative_readback: null,\n };\n }\n if (options.proof.status === 'pending') {\n return { status: 'pending', issues: [], account_readback: null, derivative_readback: null };\n }\n if (options.proof.status === 'indeterminate') {\n return {\n status: 'indeterminate',\n issues: [\n issue(\n 'PROTECTED_EXECUTION_INDETERMINATE',\n 'Database reported an indeterminate terminal execution; admission must not be retried.',\n options.proof.failure,\n ),\n ],\n account_readback: null,\n derivative_readback: null,\n };\n }\n if (options.proof.status === 'failed') {\n return {\n status: 'failed',\n issues: [\n issue(\n 'PROTECTED_EXECUTION_FAILED',\n 'Database reported a definitive protected execution failure.',\n options.proof.failure,\n ),\n ],\n account_readback: null,\n derivative_readback: null,\n };\n }\n\n const issues = [\n ...verifyAuditClosure(options.proof),\n ...verifyTerminalTargets({ identity: options.identity, proof: options.proof }),\n ];\n if (issues.length) {\n return { status: 'failed', issues, account_readback: null, derivative_readback: null };\n }\n const account = await fetchAccountRows({\n context: options.context,\n userId: options.identity.actor.user_id,\n pageSize: options.pageSize,\n });\n issues.push(\n ...verifyFinalAccountRows({\n plan: options.plan,\n planDir: options.planDir,\n rows: account.rows,\n completeness: account.completeness,\n }),\n );\n const derivative = await fetchDerivativeRows({\n context: options.context,\n targets: options.identity.derivative_targets,\n });\n const live = derivative.rows.map(inspectProtectedLiveDerivative);\n if (live.some((row) => row === null)) {\n issues.push(\n issue(\n 'PROTECTED_DERIVATIVE_LIVE_INVALID',\n 'A live derivative row lacks primary JSON, extracted markdown, embedding, or timestamps.',\n ),\n );\n }\n const validLive = live.filter((row): row is ProtectedLiveDerivativeReadback => row !== null);\n const snapshots = await fetchSnapshots({\n context: options.context,\n identity: options.identity,\n });\n if (validLive.length === PROTECTED_EXECUTION_COUNTS.derivative_target_count) {\n const terminalProofs =\n options.proof.derivative_readback.proof_level === 'causal_terminal'\n ? options.proof.derivative_readback.targets\n : [];\n issues.push(\n ...matchLiveTargets({\n proofs: terminalProofs,\n live: validLive,\n snapshots,\n plan: options.plan,\n identity: options.identity,\n }),\n );\n }\n return {\n status: issues.length ? 'failed' : 'passed',\n issues,\n account_readback: {\n rows: account.rows,\n source_urls: account.source_urls,\n completeness: account.completeness,\n },\n derivative_readback: {\n rows: validLive,\n snapshots,\n source_urls: derivative.source_urls,\n },\n };\n}\n\nexport async function verifyProtectedExecution(options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n identity: ProtectedExecutionIdentity;\n proof: ProtectedExecutionStatusProof;\n context: DatasetMaintenanceRemoteContext;\n pageSize?: number;\n}): Promise<ProtectedVerificationResult> {\n return verifyProtectedExecutionWithDependencies(options, {\n fetchAccountRows: fetchMaintenanceAccountRows,\n fetchDerivativeRows: fetchMaintenanceDerivativeTargetRows,\n fetchSnapshots: fetchProtectedDerivativeSnapshots,\n });\n}\n\nexport const __testInternals = {\n expectedFinalRows,\n fetchProtectedDerivativeSnapshots,\n inspectProtectedLiveDerivative,\n matchLiveTargets,\n verifyAuditClosure,\n verifyFinalAccountRows,\n verifyStatusStructure,\n verifyTerminalTargets,\n verifyProtectedExecutionWithDependencies,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"dataset-maintenance-protected-verify.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-protected-verify.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadMaintenanceDesiredPayload } from './dataset-maintenance-alias-request.js';\nimport {\n isJsonObject,\n maintenanceRowKey,\n sha256Json,\n snapshotRemoteRow,\n type DatasetMaintenancePlan,\n type DatasetMaintenanceRemoteRow,\n} from './dataset-maintenance-contract.js';\nimport {\n PROTECTED_EXECUTION_COUNTS,\n parseProtectedDerivativeSnapshot,\n type ProtectedDerivativeSnapshot,\n type ProtectedExecutionIdentity,\n type ProtectedExecutionStatusProof,\n type ProtectedReportStatus,\n type ProtectedTerminalTargetProof,\n} from './dataset-maintenance-protected-contract.js';\nimport { maintenanceProjectedReferenceFingerprint } from './dataset-maintenance-plan.js';\nimport { isSnapshotCompletenessCompatible } from './dataset-maintenance-pagination.js';\nimport {\n fetchMaintenanceAccountRows,\n fetchMaintenanceDerivativeSnapshot,\n fetchMaintenanceDerivativeTargetRows,\n type DatasetMaintenanceDerivativeRemoteRow,\n type DatasetMaintenanceRemoteContext,\n} from './dataset-maintenance-remote.js';\n\nconst SHA256 = /^[a-f0-9]{64}$/u;\n\nexport type ProtectedVerificationIssue = {\n code: string;\n message: string;\n details?: unknown;\n};\n\nexport type ProtectedLiveDerivativeReadback = {\n table: 'flows' | 'processes';\n id: string;\n version: string;\n user_id: string;\n state_code: 0;\n json_ordered_sha256: string;\n extracted_text_present: true;\n extracted_md_present: true;\n embedding_ft_present: true;\n embedding_ft_at: string;\n};\n\ntype ProtectedPrimaryActionEvidence = {\n action_id: string;\n table: 'flowproperties' | 'flows' | 'processes';\n id: string;\n version: string;\n row_found: true;\n owner_matches: true;\n state_code_matches: true;\n json_matches: true;\n json_ordered_matches: true;\n desired_json_ordered_sha256: string;\n live_json_sha256: string;\n live_json_ordered_sha256: string;\n valid: true;\n};\n\nexport type ProtectedVerificationResult = {\n status: ProtectedReportStatus;\n issues: ProtectedVerificationIssue[];\n account_readback: {\n rows: DatasetMaintenanceRemoteRow[];\n source_urls: string[];\n completeness: unknown;\n } | null;\n derivative_readback: {\n rows: ProtectedLiveDerivativeReadback[];\n snapshots: ProtectedDerivativeSnapshot[];\n source_urls: string[];\n } | null;\n};\n\nfunction issue(code: string, message: string, details?: unknown): ProtectedVerificationIssue {\n return { code, message, ...(details === undefined ? {} : { details }) };\n}\n\nfunction requiredString(value: unknown): string | null {\n return typeof value === 'string' && value.trim() ? value : null;\n}\n\nfunction parsePrimaryActionEvidence(value: unknown): ProtectedPrimaryActionEvidence | null {\n if (!isJsonObject(value)) return null;\n const actionId = requiredString(value.action_id);\n const id = requiredString(value.id);\n const version = requiredString(value.version);\n const desiredJsonOrderedSha256 = requiredString(value.desired_json_ordered_sha256);\n const liveJsonSha256 = requiredString(value.live_json_sha256);\n const liveJsonOrderedSha256 = requiredString(value.live_json_ordered_sha256);\n if (\n !actionId ||\n (value.table !== 'flowproperties' && value.table !== 'flows' && value.table !== 'processes') ||\n !id ||\n !version ||\n value.row_found !== true ||\n value.owner_matches !== true ||\n value.state_code_matches !== true ||\n value.json_matches !== true ||\n value.json_ordered_matches !== true ||\n !desiredJsonOrderedSha256 ||\n !SHA256.test(desiredJsonOrderedSha256) ||\n !liveJsonSha256 ||\n !SHA256.test(liveJsonSha256) ||\n !liveJsonOrderedSha256 ||\n !SHA256.test(liveJsonOrderedSha256) ||\n value.valid !== true\n ) {\n return null;\n }\n return {\n action_id: actionId,\n table: value.table,\n id,\n version,\n row_found: true,\n owner_matches: true,\n state_code_matches: true,\n json_matches: true,\n json_ordered_matches: true,\n desired_json_ordered_sha256: desiredJsonOrderedSha256,\n live_json_sha256: liveJsonSha256,\n live_json_ordered_sha256: liveJsonOrderedSha256,\n valid: true,\n };\n}\n\nfunction indexPrimaryActionEvidence(options: {\n closure: unknown;\n plan: DatasetMaintenancePlan;\n}): Map<string, ProtectedPrimaryActionEvidence> | null {\n if (!isJsonObject(options.closure) || !Array.isArray(options.closure.action_evidence)) {\n return null;\n }\n if (options.closure.action_evidence.length !== options.plan.actions.length) return null;\n const byKey = new Map<string, ProtectedPrimaryActionEvidence>();\n const actionIds = new Set<string>();\n for (const raw of options.closure.action_evidence) {\n const evidence = parsePrimaryActionEvidence(raw);\n if (!evidence) return null;\n const key = maintenanceRowKey(evidence);\n if (byKey.has(key) || actionIds.has(evidence.action_id)) return null;\n byKey.set(key, evidence);\n actionIds.add(evidence.action_id);\n }\n if (\n options.plan.actions.some(\n (action) => byKey.get(maintenanceRowKey(action))?.action_id !== action.action_id,\n )\n ) {\n return null;\n }\n return byKey;\n}\n\nexport function inspectProtectedLiveDerivative(\n row: DatasetMaintenanceDerivativeRemoteRow,\n): ProtectedLiveDerivativeReadback | null {\n const raw = row.raw;\n const jsonOrdered = isJsonObject(raw.json_ordered) ? raw.json_ordered : null;\n const extractedText = requiredString(raw.extracted_text);\n const extractedMd = requiredString(raw.extracted_md);\n const embeddingAt = requiredString(raw.embedding_ft_at);\n if (\n row.state_code !== 0 ||\n !jsonOrdered ||\n !extractedText ||\n !extractedMd ||\n raw.embedding_ft === null ||\n raw.embedding_ft === undefined ||\n !embeddingAt ||\n !Number.isFinite(Date.parse(embeddingAt))\n ) {\n return null;\n }\n return {\n table: row.table,\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: 0 as const,\n json_ordered_sha256: sha256Json(jsonOrdered),\n extracted_text_present: true,\n extracted_md_present: true,\n embedding_ft_present: true,\n embedding_ft_at: embeddingAt,\n };\n}\n\nfunction expectedFinalRows(options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n rows: DatasetMaintenanceRemoteRow[];\n}): DatasetMaintenanceRemoteRow[] {\n const rows = new Map(options.rows.map((row) => [maintenanceRowKey(row), { ...row }]));\n for (const action of options.plan.actions) {\n const current = rows.get(maintenanceRowKey(action));\n if (current) {\n rows.set(maintenanceRowKey(action), {\n ...current,\n json_ordered: loadMaintenanceDesiredPayload(options.planDir, action),\n });\n }\n }\n return [...rows.values()].sort((left, right) =>\n maintenanceRowKey(left).localeCompare(maintenanceRowKey(right)),\n );\n}\n\nfunction verifyStatusStructure(options: {\n identity: ProtectedExecutionIdentity;\n proof: ProtectedExecutionStatusProof;\n}): ProtectedVerificationIssue[] {\n const { identity, proof } = options;\n const issues: ProtectedVerificationIssue[] = [];\n const notAdmitted = proof.execution_status === 'not_admitted';\n const dispatchCountValid =\n proof.dispatch_count === 1 ||\n (proof.dispatch_count === 0 &&\n (proof.execution_status === 'failed' || proof.execution_status === 'indeterminate'));\n if (\n (notAdmitted && (proof.attempt_count !== 0 || proof.dispatch_count !== 0)) ||\n (!notAdmitted && (proof.attempt_count !== 1 || !dispatchCountValid))\n ) {\n issues.push(\n issue(\n 'PROTECTED_ATTEMPT_DISPATCH_COUNT_INVALID',\n 'Database did not prove the one-attempt, at-most-one-dispatch execution policy.',\n { attempt_count: proof.attempt_count, dispatch_count: proof.dispatch_count },\n ),\n );\n }\n if (proof.plan_sha256 !== identity.plan_sha256 || proof.operation_id !== identity.operation_id) {\n issues.push(\n issue(\n 'PROTECTED_EXECUTION_IDENTITY_MISMATCH',\n 'Database status does not round-trip the sealed plan identity.',\n ),\n );\n }\n const categoryMatches =\n (proof.status === 'passed' && proof.execution_status === 'completed') ||\n (proof.status === 'failed' &&\n (proof.execution_status === 'failed' || proof.execution_status === 'completed')) ||\n (proof.status === 'indeterminate' &&\n (proof.execution_status === 'not_admitted' || proof.execution_status === 'indeterminate')) ||\n (proof.status === 'pending' &&\n ['dispatching', 'dispatched', 'running', 'derivatives_pending'].includes(\n proof.execution_status,\n ));\n if (!categoryMatches) {\n issues.push(\n issue(\n 'PROTECTED_STATUS_CATEGORY_INVALID',\n 'Database status category is inconsistent with its execution ledger state.',\n { status: proof.status, execution_status: proof.execution_status },\n ),\n );\n }\n if (!notAdmitted) {\n const gateNames = proof.gates.map((gate) => gate.gate);\n const receiptHashes = proof.gates.map((gate) => gate.receipt_sha256);\n const gateClosureValid =\n proof.gate_count === 3 &&\n proof.gates.length === 3 &&\n new Set(gateNames).size === 3 &&\n new Set(receiptHashes).size === 3 &&\n proof.gates.every(\n (gate) => gate.observed_sha256 === gate.expected_sha256 && gate.status === 'passed',\n );\n if (!gateClosureValid) {\n issues.push(\n issue(\n 'PROTECTED_GATE_CLOSURE_INVALID',\n 'Database did not round-trip three unique server-captured gate receipts.',\n proof.gates,\n ),\n );\n }\n }\n return issues;\n}\n\nfunction verifyAuditClosure(proof: ProtectedExecutionStatusProof): ProtectedVerificationIssue[] {\n const audit = proof.primary_readback;\n const closure = audit?.closure;\n let closureHashMatches = false;\n if (isJsonObject(closure) && typeof closure.live_closure_proof_sha256 === 'string') {\n const proofMaterial = { ...closure };\n const closureSha256 = String(proofMaterial.live_closure_proof_sha256);\n delete proofMaterial.ok;\n delete proofMaterial.row_count;\n delete proofMaterial.exchange_count;\n delete proofMaterial.live_closure_proof_sha256;\n closureHashMatches = sha256Json(proofMaterial) === closureSha256;\n }\n if (\n !audit ||\n audit.row_count !== PROTECTED_EXECUTION_COUNTS.action_count ||\n audit.exchange_count !== PROTECTED_EXECUTION_COUNTS.exchange_count ||\n audit.alias_audit_count !== PROTECTED_EXECUTION_COUNTS.audit_count ||\n audit.live_closure_proof !== true ||\n !isJsonObject(closure) ||\n closure.schema_version !== 'dataset-alias-primary-closure.v1' ||\n closure.ok !== true ||\n closure.actor_user_id !== proof.actor_user_id ||\n closure.batch_count !== PROTECTED_EXECUTION_COUNTS.batch_count ||\n closure.action_count !== PROTECTED_EXECUTION_COUNTS.action_count ||\n closure.distinct_action_count !== PROTECTED_EXECUTION_COUNTS.action_count ||\n closure.flowproperty_count !== PROTECTED_EXECUTION_COUNTS.flowproperty_count ||\n closure.flow_count !== PROTECTED_EXECUTION_COUNTS.flow_count ||\n closure.process_count !== PROTECTED_EXECUTION_COUNTS.process_count ||\n closure.support_reference_count !== 6 ||\n closure.flowproperty_support_count !== 2 ||\n closure.unitgroup_support_count !== 2 ||\n closure.source_unitgroup_support_count !== 2 ||\n closure.invalid_action_count !== 0 ||\n closure.invalid_support_count !== 0 ||\n !Array.isArray(closure.action_evidence) ||\n closure.action_evidence.length !== PROTECTED_EXECUTION_COUNTS.action_count ||\n closure.action_evidence.some((entry) => !isJsonObject(entry)) ||\n !Array.isArray(closure.support_evidence) ||\n closure.support_evidence.length !== 6 ||\n closure.support_evidence.some((entry) => !isJsonObject(entry)) ||\n closure.row_count !== PROTECTED_EXECUTION_COUNTS.action_count ||\n closure.exchange_count !== PROTECTED_EXECUTION_COUNTS.exchange_count ||\n closure.live_closure_proof !== true ||\n !closureHashMatches\n ) {\n return [\n issue(\n 'PROTECTED_AUDIT_CLOSURE_INVALID',\n 'Terminal execution did not prove the exact 52-row, 59-exchange, 55-audit primary closure.',\n audit,\n ),\n ];\n }\n return [];\n}\n\nfunction terminalTargetKey(target: { table: string; id: string; version: string }): string {\n return `${target.table}\\u0000${target.id}\\u0000${target.version}`;\n}\n\nfunction verifyTerminalTargets(options: {\n identity: ProtectedExecutionIdentity;\n proof: ProtectedExecutionStatusProof;\n}): ProtectedVerificationIssue[] {\n const issues: ProtectedVerificationIssue[] = [];\n const batch = options.proof.derivative_readback;\n if (batch.proof_level !== 'causal_terminal' || batch.proof_deferred !== false) {\n return [\n issue(\n 'PROTECTED_DERIVATIVE_TARGET_CLOSURE_INVALID',\n 'Terminal proof must use the full causal-terminal evidence level.',\n ),\n ];\n }\n const targets = batch.targets;\n const keys = targets.map(terminalTargetKey);\n if (\n batch.schema_version !== 'dataset-derivative-rebuild-batch-status.v1' ||\n batch.batch_id !== options.identity.request_id ||\n batch.status !== 'completed' ||\n batch.code !== 'DERIVATIVE_BATCH_COMPLETED' ||\n batch.causal_terminal_proof !== true ||\n batch.target_count !== PROTECTED_EXECUTION_COUNTS.derivative_target_count ||\n batch.flow_count !== PROTECTED_EXECUTION_COUNTS.flow_count ||\n batch.process_count !== PROTECTED_EXECUTION_COUNTS.process_count ||\n batch.completed_count !== PROTECTED_EXECUTION_COUNTS.derivative_target_count ||\n batch.nonterminal_count !== 0 ||\n batch.failed_count !== 0 ||\n batch.invalid_proof_count !== 0 ||\n targets.length !== PROTECTED_EXECUTION_COUNTS.derivative_target_count ||\n new Set(keys).size !== PROTECTED_EXECUTION_COUNTS.derivative_target_count ||\n new Set(targets.map((target) => target.ordinal)).size !==\n PROTECTED_EXECUTION_COUNTS.derivative_target_count\n ) {\n return [\n issue(\n 'PROTECTED_DERIVATIVE_TARGET_CLOSURE_INVALID',\n 'Terminal proof must contain exactly 50 unique derivative targets.',\n ),\n ];\n }\n const frozen = new Map(\n options.identity.derivative_targets.map((target) => [terminalTargetKey(target), target]),\n );\n for (const [index, target] of targets.entries()) {\n const expected = frozen.get(terminalTargetKey(target));\n if (\n !expected ||\n target.ordinal !== index + 1 ||\n target.request_id === options.identity.request_id ||\n target.source_baseline_snapshot_sha256 !== expected.baseline_snapshot_sha256\n ) {\n issues.push(\n issue(\n 'PROTECTED_DERIVATIVE_TARGET_IDENTITY_MISMATCH',\n 'Terminal derivative proof contains a foreign or changed target.',\n { table: target.table, id: target.id, version: target.version },\n ),\n );\n continue;\n }\n if (\n target.status !== 'completed' ||\n !target.phase ||\n !target.completed_snapshot_sha256 ||\n !SHA256.test(target.expected_snapshot_sha256) ||\n !SHA256.test(target.completed_snapshot_sha256) ||\n target.completed_snapshot_sha256 === target.expected_snapshot_sha256 ||\n !target.primary_matches ||\n !target.terminal_snapshot_matches ||\n !target.proposals_committed ||\n !target.derivative_fresh ||\n !target.lifecycle_complete ||\n !target.terminal_audit_present ||\n Object.values(target.residue).some((count) => count !== 0) ||\n !target.causal_terminal_proof\n ) {\n issues.push(\n issue(\n 'PROTECTED_DERIVATIVE_TARGET_NOT_TERMINAL',\n 'Derivative target lacks causal completed/live equality or retains queue, failure, or fence state.',\n { table: target.table, id: target.id, version: target.version },\n ),\n );\n }\n }\n return issues;\n}\n\nfunction verifyFinalAccountRows(options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n rows: DatasetMaintenanceRemoteRow[];\n completeness: unknown;\n}): ProtectedVerificationIssue[] {\n const issues: ProtectedVerificationIssue[] = [];\n if (\n !options.plan.snapshot_completeness ||\n !isSnapshotCompletenessCompatible(\n options.completeness,\n options.plan.snapshot_completeness,\n Object.keys(options.plan.snapshot_completeness.entity_counts),\n )\n ) {\n issues.push(\n issue(\n 'PROTECTED_FINAL_SNAPSHOT_INCOMPLETE',\n 'Final RLS account scan does not prove the same complete table census as the plan.',\n ),\n );\n return issues;\n }\n const expectedKeys = new Set([\n ...options.plan.actions.map(maintenanceRowKey),\n ...options.plan.protected_rows.map(maintenanceRowKey),\n ]);\n const actualKeys = new Set(options.rows.map(maintenanceRowKey));\n if (\n expectedKeys.size !== actualKeys.size ||\n [...expectedKeys].some((key) => !actualKeys.has(key))\n ) {\n issues.push(\n issue(\n 'PROTECTED_FINAL_ACCOUNT_CENSUS_DRIFT',\n 'Final RLS account rows contain missing or unexpected entities.',\n ),\n );\n }\n const current = new Map(options.rows.map((row) => [maintenanceRowKey(row), row]));\n for (const protectedRow of options.plan.protected_rows) {\n const row = current.get(maintenanceRowKey(protectedRow));\n if (!row || snapshotRemoteRow(row).row_sha256 !== protectedRow.row_sha256) {\n issues.push(\n issue('PROTECTED_ROW_DRIFT', 'A protected non-action row changed.', protectedRow),\n );\n }\n }\n for (const action of options.plan.actions) {\n const row = current.get(maintenanceRowKey(action));\n const desired = loadMaintenanceDesiredPayload(options.planDir, action);\n if (\n !row ||\n row.user_id !== action.expected_user_id ||\n row.state_code !== 0 ||\n sha256Json(row.json_ordered) !== sha256Json(desired) ||\n row.model_id !== action.before?.model_id ||\n row.rule_verification !== action.before?.rule_verification\n ) {\n issues.push(\n issue(\n 'PROTECTED_ACTION_READBACK_MISMATCH',\n 'An action row does not match the desired owner-draft payload.',\n { action_id: action.action_id },\n ),\n );\n }\n }\n const projected = expectedFinalRows({\n plan: options.plan,\n planDir: options.planDir,\n rows: options.rows,\n });\n if (\n sha256Json(maintenanceProjectedReferenceFingerprint(projected)) !==\n options.plan.projected_reference_sha256\n ) {\n issues.push(\n issue(\n 'PROTECTED_REFERENCE_CLOSURE_MISMATCH',\n 'Final reference closure does not match the frozen projected closure.',\n ),\n );\n }\n return issues;\n}\n\nfunction matchLiveTargets(options: {\n proofs: ProtectedTerminalTargetProof[];\n live: ProtectedLiveDerivativeReadback[];\n snapshots: ProtectedDerivativeSnapshot[];\n primaryClosure: unknown;\n plan: DatasetMaintenancePlan;\n identity: ProtectedExecutionIdentity;\n}): ProtectedVerificationIssue[] {\n const proofs = new Map(options.proofs.map((proof) => [terminalTargetKey(proof), proof]));\n const snapshots = new Map(\n options.snapshots.map((snapshot) => [terminalTargetKey(snapshot), snapshot]),\n );\n const live = new Map(options.live.map((row) => [terminalTargetKey(row), row]));\n const actions = new Map(\n options.plan.actions.map((action) => [maintenanceRowKey(action), action]),\n );\n const primaryEvidence = indexPrimaryActionEvidence({\n closure: options.primaryClosure,\n plan: options.plan,\n });\n const issues: ProtectedVerificationIssue[] = [];\n const expectedKeys = new Set(options.identity.derivative_targets.map(terminalTargetKey));\n const liveKeys = options.live.map(terminalTargetKey);\n const snapshotKeys = options.snapshots.map(terminalTargetKey);\n if (\n liveKeys.length !== expectedKeys.size ||\n new Set(liveKeys).size !== expectedKeys.size ||\n snapshotKeys.length !== expectedKeys.size ||\n new Set(snapshotKeys).size !== expectedKeys.size ||\n [...expectedKeys].some((key) => !live.has(key) || !snapshots.has(key))\n ) {\n issues.push(\n issue(\n 'PROTECTED_DERIVATIVE_LIVE_SET_MISMATCH',\n 'Independent derivative rows and snapshots must be unique and exactly match all 50 frozen targets.',\n ),\n );\n }\n for (const target of options.identity.derivative_targets) {\n const key = terminalTargetKey(target);\n const row = live.get(key);\n const proof = proofs.get(key);\n const snapshot = snapshots.get(key);\n const action = actions.get(key);\n const evidence = primaryEvidence?.get(key);\n if (\n !row ||\n !proof ||\n !snapshot ||\n !action?.desired_payload ||\n !evidence ||\n row.user_id !== options.identity.actor.user_id ||\n row.state_code !== 0 ||\n snapshot.user_id !== options.identity.actor.user_id ||\n snapshot.state_code !== 0 ||\n row.json_ordered_sha256 !== action.desired_payload.sha256 ||\n evidence.live_json_sha256 !== evidence.desired_json_ordered_sha256 ||\n evidence.live_json_ordered_sha256 !== evidence.desired_json_ordered_sha256 ||\n snapshot.json_ordered_sha256 !== evidence.desired_json_ordered_sha256 ||\n snapshot.snapshot_sha256 !== proof.completed_snapshot_sha256 ||\n !snapshot.extracted_md_sha256 ||\n !snapshot.embedding_ft_sha256 ||\n !snapshot.embedding_ft_at\n ) {\n issues.push(\n issue(\n 'PROTECTED_DERIVATIVE_LIVE_MISMATCH',\n 'Independent RLS derivative readback does not match the terminal database proof.',\n { table: target.table, id: target.id, version: target.version },\n ),\n );\n }\n }\n return issues;\n}\n\nasync function fetchProtectedDerivativeSnapshots(options: {\n context: DatasetMaintenanceRemoteContext;\n identity: ProtectedExecutionIdentity;\n}): Promise<ProtectedDerivativeSnapshot[]> {\n const snapshots: ProtectedDerivativeSnapshot[] = [];\n const targets = options.identity.derivative_targets;\n for (let offset = 0; offset < targets.length; offset += 5) {\n const chunk = targets.slice(offset, offset + 5);\n snapshots.push(\n ...(await Promise.all(\n chunk.map(async (target) =>\n parseProtectedDerivativeSnapshot(\n await fetchMaintenanceDerivativeSnapshot({\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 );\n }\n return snapshots;\n}\n\ntype ProtectedVerificationDependencies = {\n fetchAccountRows: typeof fetchMaintenanceAccountRows;\n fetchDerivativeRows: typeof fetchMaintenanceDerivativeTargetRows;\n fetchSnapshots: typeof fetchProtectedDerivativeSnapshots;\n};\n\nasync function verifyProtectedExecutionWithDependencies(\n options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n identity: ProtectedExecutionIdentity;\n proof: ProtectedExecutionStatusProof;\n context: DatasetMaintenanceRemoteContext;\n pageSize?: number;\n },\n dependencies: ProtectedVerificationDependencies,\n): Promise<ProtectedVerificationResult> {\n const { fetchAccountRows, fetchDerivativeRows, fetchSnapshots } = dependencies;\n const structuralIssues = verifyStatusStructure({\n identity: options.identity,\n proof: options.proof,\n });\n if (structuralIssues.length) {\n return {\n status: options.proof.status === 'indeterminate' ? 'indeterminate' : 'failed',\n issues: structuralIssues,\n account_readback: null,\n derivative_readback: null,\n };\n }\n if (options.proof.execution_status === 'not_admitted') {\n return {\n status: 'indeterminate',\n issues: [\n issue(\n 'PROTECTED_EXECUTION_NOT_FOUND',\n 'The server has a protected preflight but no admitted execution; admission must not be retried.',\n ),\n ],\n account_readback: null,\n derivative_readback: null,\n };\n }\n if (options.proof.status === 'pending') {\n return { status: 'pending', issues: [], account_readback: null, derivative_readback: null };\n }\n if (options.proof.status === 'indeterminate') {\n return {\n status: 'indeterminate',\n issues: [\n issue(\n 'PROTECTED_EXECUTION_INDETERMINATE',\n 'Database reported an indeterminate terminal execution; admission must not be retried.',\n options.proof.failure,\n ),\n ],\n account_readback: null,\n derivative_readback: null,\n };\n }\n if (options.proof.status === 'failed') {\n return {\n status: 'failed',\n issues: [\n issue(\n 'PROTECTED_EXECUTION_FAILED',\n 'Database reported a definitive protected execution failure.',\n options.proof.failure,\n ),\n ],\n account_readback: null,\n derivative_readback: null,\n };\n }\n\n const issues = [\n ...verifyAuditClosure(options.proof),\n ...verifyTerminalTargets({ identity: options.identity, proof: options.proof }),\n ];\n if (issues.length) {\n return { status: 'failed', issues, account_readback: null, derivative_readback: null };\n }\n const account = await fetchAccountRows({\n context: options.context,\n userId: options.identity.actor.user_id,\n pageSize: options.pageSize,\n });\n issues.push(\n ...verifyFinalAccountRows({\n plan: options.plan,\n planDir: options.planDir,\n rows: account.rows,\n completeness: account.completeness,\n }),\n );\n const derivative = await fetchDerivativeRows({\n context: options.context,\n targets: options.identity.derivative_targets,\n });\n const live = derivative.rows.map(inspectProtectedLiveDerivative);\n if (live.some((row) => row === null)) {\n issues.push(\n issue(\n 'PROTECTED_DERIVATIVE_LIVE_INVALID',\n 'A live derivative row lacks primary JSON, extracted markdown, embedding, or timestamps.',\n ),\n );\n }\n const validLive = live.filter((row): row is ProtectedLiveDerivativeReadback => row !== null);\n const snapshots = await fetchSnapshots({\n context: options.context,\n identity: options.identity,\n });\n if (validLive.length === PROTECTED_EXECUTION_COUNTS.derivative_target_count) {\n const terminalProofs =\n options.proof.derivative_readback.proof_level === 'causal_terminal'\n ? options.proof.derivative_readback.targets\n : [];\n issues.push(\n ...matchLiveTargets({\n proofs: terminalProofs,\n live: validLive,\n snapshots,\n primaryClosure: options.proof.primary_readback?.closure,\n plan: options.plan,\n identity: options.identity,\n }),\n );\n }\n return {\n status: issues.length ? 'failed' : 'passed',\n issues,\n account_readback: {\n rows: account.rows,\n source_urls: account.source_urls,\n completeness: account.completeness,\n },\n derivative_readback: {\n rows: validLive,\n snapshots,\n source_urls: derivative.source_urls,\n },\n };\n}\n\nexport async function verifyProtectedExecution(options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n identity: ProtectedExecutionIdentity;\n proof: ProtectedExecutionStatusProof;\n context: DatasetMaintenanceRemoteContext;\n pageSize?: number;\n}): Promise<ProtectedVerificationResult> {\n return verifyProtectedExecutionWithDependencies(options, {\n fetchAccountRows: fetchMaintenanceAccountRows,\n fetchDerivativeRows: fetchMaintenanceDerivativeTargetRows,\n fetchSnapshots: fetchProtectedDerivativeSnapshots,\n });\n}\n\nexport const __testInternals = {\n expectedFinalRows,\n fetchProtectedDerivativeSnapshots,\n inspectProtectedLiveDerivative,\n matchLiveTargets,\n verifyAuditClosure,\n verifyFinalAccountRows,\n verifyStatusStructure,\n verifyTerminalTargets,\n verifyProtectedExecutionWithDependencies,\n};\n"]}
|
|
@@ -3,6 +3,7 @@ import { buildSnapshotCompleteness, fetchCompletePostgrestPages, } from './datas
|
|
|
3
3
|
import { buildSupabaseAuthHeaders, deriveSupabaseProjectBaseUrl, requireSupabaseRestRuntime, } from './supabase-client.js';
|
|
4
4
|
import { resolveSupabaseUserSession } from './supabase-session.js';
|
|
5
5
|
import { isJsonObject, MAINTENANCE_SCAN_TABLES, } from './dataset-maintenance-contract.js';
|
|
6
|
+
import { assertFlowIdentityWireJson } from './dataset-maintenance-flow-identity-wire.js';
|
|
6
7
|
const DEFAULT_PAGE_SIZE = 1_000;
|
|
7
8
|
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
8
9
|
function trimToken(value) {
|
|
@@ -56,7 +57,9 @@ async function fetchJsonResponse(options) {
|
|
|
56
57
|
throw new CliError(`HTTP ${response.status} returned from ${options.label}`, {
|
|
57
58
|
code: 'DATASET_MAINTENANCE_REMOTE_REQUEST_FAILED',
|
|
58
59
|
exitCode: 1,
|
|
59
|
-
details:
|
|
60
|
+
details: options.redactResponseDetails
|
|
61
|
+
? { url: options.url, response_redacted: true }
|
|
62
|
+
: { url: options.url, response: text },
|
|
60
63
|
});
|
|
61
64
|
}
|
|
62
65
|
if (!text.trim()) {
|
|
@@ -79,11 +82,11 @@ async function fetchJsonResponse(options) {
|
|
|
79
82
|
async function fetchJson(options) {
|
|
80
83
|
return (await fetchJsonResponse(options)).body;
|
|
81
84
|
}
|
|
82
|
-
function selectForTable(table) {
|
|
83
|
-
const common =
|
|
85
|
+
function selectForTable(table, includeJson = false) {
|
|
86
|
+
const common = `id,version,user_id,state_code,modified_at,${includeJson ? 'json,' : ''}json_ordered,rule_verification`;
|
|
84
87
|
return table === 'processes' ? `${common},model_id` : common;
|
|
85
88
|
}
|
|
86
|
-
function normalizeRemoteRow(table, value) {
|
|
89
|
+
function normalizeRemoteRow(table, value, includeJson = false) {
|
|
87
90
|
if (!isJsonObject(value)) {
|
|
88
91
|
return null;
|
|
89
92
|
}
|
|
@@ -99,12 +102,13 @@ function normalizeRemoteRow(table, value) {
|
|
|
99
102
|
user_id: trimToken(value.user_id),
|
|
100
103
|
state_code: normalizeStateCode(value.state_code),
|
|
101
104
|
modified_at: trimToken(value.modified_at),
|
|
105
|
+
...(includeJson ? { json: isJsonObject(value.json) ? value.json : null } : {}),
|
|
102
106
|
json_ordered: isJsonObject(value.json_ordered) ? value.json_ordered : null,
|
|
103
107
|
model_id: trimToken(value.model_id),
|
|
104
108
|
rule_verification: typeof value.rule_verification === 'boolean' ? value.rule_verification : null,
|
|
105
109
|
};
|
|
106
110
|
}
|
|
107
|
-
function normalizeRemoteRows(table, value, label) {
|
|
111
|
+
function normalizeRemoteRows(table, value, label, includeJson = false) {
|
|
108
112
|
if (!Array.isArray(value)) {
|
|
109
113
|
throw new CliError(`Remote response was not an array for ${label}.`, {
|
|
110
114
|
code: 'DATASET_MAINTENANCE_REMOTE_ROWS_INVALID',
|
|
@@ -112,7 +116,7 @@ function normalizeRemoteRows(table, value, label) {
|
|
|
112
116
|
details: value,
|
|
113
117
|
});
|
|
114
118
|
}
|
|
115
|
-
const rows = value.map((entry) => normalizeRemoteRow(table, entry));
|
|
119
|
+
const rows = value.map((entry) => normalizeRemoteRow(table, entry, includeJson));
|
|
116
120
|
if (rows.some((row) => row === null)) {
|
|
117
121
|
throw new CliError(`Remote response contained an invalid row for ${label}.`, {
|
|
118
122
|
code: 'DATASET_MAINTENANCE_REMOTE_ROW_INVALID',
|
|
@@ -172,7 +176,7 @@ export async function resolveMaintenanceRemoteContext(options) {
|
|
|
172
176
|
}
|
|
173
177
|
export async function fetchMaintenanceExactRows(options) {
|
|
174
178
|
const url = new URL(`${options.context.rest_base_url}/${options.table}`);
|
|
175
|
-
url.searchParams.set('select', selectForTable(options.table));
|
|
179
|
+
url.searchParams.set('select', selectForTable(options.table, options.includeJson));
|
|
176
180
|
url.searchParams.set('id', `eq.${options.id}`);
|
|
177
181
|
url.searchParams.set('version', `eq.${options.version}`);
|
|
178
182
|
url.searchParams.set('limit', '2');
|
|
@@ -183,7 +187,7 @@ export async function fetchMaintenanceExactRows(options) {
|
|
|
183
187
|
label: `${options.table} exact maintenance lookup`,
|
|
184
188
|
});
|
|
185
189
|
return {
|
|
186
|
-
rows: normalizeRemoteRows(options.table, body, sourceUrl),
|
|
190
|
+
rows: normalizeRemoteRows(options.table, body, sourceUrl, options.includeJson),
|
|
187
191
|
source_url: sourceUrl,
|
|
188
192
|
};
|
|
189
193
|
}
|
|
@@ -235,8 +239,48 @@ export async function fetchMaintenanceAccountRows(options) {
|
|
|
235
239
|
}),
|
|
236
240
|
};
|
|
237
241
|
}
|
|
242
|
+
export async function fetchMaintenanceAccountTableRows(options) {
|
|
243
|
+
const pageSize = normalizeMaintenancePageSize(options.pageSize);
|
|
244
|
+
return fetchCompletePostgrestPages({
|
|
245
|
+
table: options.table,
|
|
246
|
+
requestedPageSize: pageSize,
|
|
247
|
+
rowIdentity: (row) => `${row.id}\u0000${row.version}`,
|
|
248
|
+
fetchPage: async (offset) => {
|
|
249
|
+
const url = new URL(`${options.context.rest_base_url}/${options.table}`);
|
|
250
|
+
url.searchParams.set('select', selectForTable(options.table, options.includeJson));
|
|
251
|
+
url.searchParams.set('user_id', `eq.${options.userId}`);
|
|
252
|
+
if (options.stateCode !== undefined) {
|
|
253
|
+
url.searchParams.set('state_code', `eq.${options.stateCode}`);
|
|
254
|
+
}
|
|
255
|
+
url.searchParams.set('order', 'id.asc,version.asc');
|
|
256
|
+
url.searchParams.set('limit', String(pageSize));
|
|
257
|
+
url.searchParams.set('offset', String(offset));
|
|
258
|
+
const sourceUrl = url.toString();
|
|
259
|
+
const response = await fetchJsonResponse({
|
|
260
|
+
context: options.context,
|
|
261
|
+
url: sourceUrl,
|
|
262
|
+
init: { headers: { Prefer: 'count=exact' } },
|
|
263
|
+
label: `${options.table} account maintenance snapshot`,
|
|
264
|
+
});
|
|
265
|
+
const rows = normalizeRemoteRows(options.table, response.body, sourceUrl, options.includeJson);
|
|
266
|
+
if (rows.some((row) => row.user_id !== options.userId ||
|
|
267
|
+
(options.stateCode !== undefined && row.state_code !== options.stateCode))) {
|
|
268
|
+
throw new CliError(`Remote ${options.table} snapshot violated the account/state fence.`, {
|
|
269
|
+
code: 'DATASET_MAINTENANCE_REMOTE_ROW_INVALID',
|
|
270
|
+
exitCode: 1,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
rows,
|
|
275
|
+
source_url: sourceUrl,
|
|
276
|
+
content_range: response.headers.get('content-range'),
|
|
277
|
+
};
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
}
|
|
238
281
|
async function invokeMaintenanceRpc(options) {
|
|
239
282
|
const url = `${options.context.rest_base_url}/rpc/${options.rpc}`;
|
|
283
|
+
const redactResponseDetails = options.rpc.startsWith('cmd_dataset_flow_identity_');
|
|
240
284
|
const body = await fetchJson({
|
|
241
285
|
context: {
|
|
242
286
|
...options.context,
|
|
@@ -249,16 +293,37 @@ async function invokeMaintenanceRpc(options) {
|
|
|
249
293
|
body: JSON.stringify(options.body),
|
|
250
294
|
},
|
|
251
295
|
label: options.rpc,
|
|
296
|
+
redactResponseDetails,
|
|
252
297
|
});
|
|
253
|
-
if (
|
|
298
|
+
if (redactResponseDetails &&
|
|
299
|
+
isJsonObject(body) &&
|
|
300
|
+
body.ok !== true &&
|
|
301
|
+
Object.hasOwn(body, 'execution_permit')) {
|
|
302
|
+
throw new CliError(`${options.rpc} returned an invalid rejection envelope.`, {
|
|
303
|
+
code: 'DATASET_MAINTENANCE_RPC_FAILED',
|
|
304
|
+
exitCode: 1,
|
|
305
|
+
details: { rpc: options.rpc, response_redacted: true },
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
if (!isJsonObject(body) ||
|
|
309
|
+
(body.ok !== true &&
|
|
310
|
+
!(options.allowDomainFailure === true && isMaintenanceRpcDomainFailure(body)))) {
|
|
254
311
|
throw new CliError(`${options.rpc} returned an unexpected response.`, {
|
|
255
312
|
code: 'DATASET_MAINTENANCE_RPC_FAILED',
|
|
256
313
|
exitCode: 1,
|
|
257
|
-
details: body,
|
|
314
|
+
details: redactResponseDetails ? { rpc: options.rpc, response_redacted: true } : body,
|
|
258
315
|
});
|
|
259
316
|
}
|
|
260
317
|
return body;
|
|
261
318
|
}
|
|
319
|
+
export function isMaintenanceRpcDomainFailure(value) {
|
|
320
|
+
return Boolean(isJsonObject(value) &&
|
|
321
|
+
value.ok === false &&
|
|
322
|
+
typeof value.code === 'string' &&
|
|
323
|
+
value.code.trim() &&
|
|
324
|
+
((typeof value.status === 'number' && Number.isSafeInteger(value.status)) ||
|
|
325
|
+
(typeof value.status === 'string' && value.status.trim())));
|
|
326
|
+
}
|
|
262
327
|
export async function preflightMaintenanceAliasExecution(options) {
|
|
263
328
|
return invokeMaintenanceRpc({
|
|
264
329
|
context: options.context,
|
|
@@ -397,6 +462,87 @@ export async function applyMaintenanceAliasPlan(options) {
|
|
|
397
462
|
body: { p_plan: options.plan },
|
|
398
463
|
});
|
|
399
464
|
}
|
|
465
|
+
export async function preflightMaintenanceFlowIdentityScope(options) {
|
|
466
|
+
const body = assertFlowIdentityWireJson({ p_request: options.request });
|
|
467
|
+
return invokeMaintenanceRpc({
|
|
468
|
+
context: options.context,
|
|
469
|
+
rpc: 'cmd_dataset_flow_identity_scope_preflight_guarded',
|
|
470
|
+
body,
|
|
471
|
+
minimumTimeoutMs: 130_000,
|
|
472
|
+
allowDomainFailure: true,
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
export async function lookupMaintenanceFlowIdentityScope(options) {
|
|
476
|
+
const body = assertFlowIdentityWireJson({ p_request: options.request });
|
|
477
|
+
return invokeMaintenanceRpc({
|
|
478
|
+
context: options.context,
|
|
479
|
+
rpc: 'cmd_dataset_flow_identity_scope_lookup',
|
|
480
|
+
body,
|
|
481
|
+
minimumTimeoutMs: 90_000,
|
|
482
|
+
allowDomainFailure: true,
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
export async function rewriteMaintenanceFlowIdentityProcess(options) {
|
|
486
|
+
const body = assertFlowIdentityWireJson({
|
|
487
|
+
p_scope_id: options.scopeId,
|
|
488
|
+
p_request: options.request,
|
|
489
|
+
p_authorization: options.authorization,
|
|
490
|
+
});
|
|
491
|
+
return invokeMaintenanceRpc({
|
|
492
|
+
context: options.context,
|
|
493
|
+
rpc: 'cmd_dataset_flow_identity_process_rewrite_guarded',
|
|
494
|
+
body,
|
|
495
|
+
minimumTimeoutMs: 90_000,
|
|
496
|
+
allowDomainFailure: true,
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
export async function readMaintenanceFlowIdentityScope(options) {
|
|
500
|
+
const body = assertFlowIdentityWireJson({ p_scope_id: options.scopeId });
|
|
501
|
+
return invokeMaintenanceRpc({
|
|
502
|
+
context: options.context,
|
|
503
|
+
rpc: 'cmd_dataset_flow_identity_scope_read',
|
|
504
|
+
body,
|
|
505
|
+
minimumTimeoutMs: 90_000,
|
|
506
|
+
allowDomainFailure: true,
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
export async function finalizeMaintenanceFlowIdentityScope(options) {
|
|
510
|
+
const body = assertFlowIdentityWireJson({
|
|
511
|
+
p_scope_id: options.scopeId,
|
|
512
|
+
p_request: options.request,
|
|
513
|
+
p_authorization: options.authorization,
|
|
514
|
+
});
|
|
515
|
+
return invokeMaintenanceRpc({
|
|
516
|
+
context: options.context,
|
|
517
|
+
rpc: 'cmd_dataset_flow_identity_scope_finalize_guarded',
|
|
518
|
+
body,
|
|
519
|
+
minimumTimeoutMs: 190_000,
|
|
520
|
+
allowDomainFailure: true,
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
export async function recoverMaintenanceFlowIdentityScope(options) {
|
|
524
|
+
const body = assertFlowIdentityWireJson({
|
|
525
|
+
p_scope_id: options.scopeId,
|
|
526
|
+
p_request: options.request,
|
|
527
|
+
});
|
|
528
|
+
return invokeMaintenanceRpc({
|
|
529
|
+
context: options.context,
|
|
530
|
+
rpc: 'cmd_dataset_flow_identity_scope_recover_guarded',
|
|
531
|
+
body,
|
|
532
|
+
minimumTimeoutMs: 130_000,
|
|
533
|
+
allowDomainFailure: true,
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
export async function attestMaintenanceFlowIdentityCapture(options) {
|
|
537
|
+
const body = assertFlowIdentityWireJson({ p_request: options.request });
|
|
538
|
+
return invokeMaintenanceRpc({
|
|
539
|
+
context: options.context,
|
|
540
|
+
rpc: 'cmd_dataset_flow_identity_capture_attest_guarded',
|
|
541
|
+
body,
|
|
542
|
+
minimumTimeoutMs: 190_000,
|
|
543
|
+
allowDomainFailure: true,
|
|
544
|
+
});
|
|
545
|
+
}
|
|
400
546
|
export async function saveDraftMaintenanceRow(options) {
|
|
401
547
|
return invokeMaintenanceRpc({
|
|
402
548
|
context: options.context,
|