hikoutei 0.5.2 → 0.5.3
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/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts.map +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmScalarRuntime.js +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmScalarRuntime.js.map +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPolling.d.ts +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPolling.d.ts.map +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPolling.js +2 -2
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPolling.js.map +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingFastPath.d.ts +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingFastPath.d.ts.map +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingFastPath.js +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingFastPath.js.map +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingInspection.d.ts +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingInspection.d.ts.map +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingInspection.js +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingInspection.js.map +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingPersistence.js +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingPersistence.js.map +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingSql.js +1 -1
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingSql.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts +2 -2
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/errors.js +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/errors.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/observation.d.ts +2 -2
- package/dist/adapter/sheets/providers/google-sheets-api/model/observation.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/observation.js +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/observation.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/planner.d.ts +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/planner.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/planner.js +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/planner.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/plannerDeletion.d.ts +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/plannerDeletion.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.d.ts +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.js +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.d.ts +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.js +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/postcondition.d.ts +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/postcondition.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/tableRead.d.ts +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/model/tableRead.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/anchors.d.ts +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/anchors.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.d.ts +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.js +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.d.ts +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.js +3 -3
- package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.d.ts +2 -2
- package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.js +3 -3
- package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/provisioning.d.ts +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/provisioning.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.d.ts +2 -2
- package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.js +2 -2
- package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.d.ts +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.js +2 -2
- package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.js.map +1 -1
- package/dist/application/orm/mapping/contracts.d.ts +1 -1
- package/dist/application/orm/mapping/contracts.d.ts.map +1 -1
- package/dist/application/orm/mapping/definition.js +1 -1
- package/dist/application/orm/mapping/definition.js.map +1 -1
- package/dist/application/orm/mapping/projection.js +1 -1
- package/dist/application/orm/mapping/projection.js.map +1 -1
- package/dist/application/orm/persistence/flush/flushCoordinator.d.ts +1 -1
- package/dist/application/orm/persistence/flush/flushCoordinator.d.ts.map +1 -1
- package/dist/application/orm/persistence/projection/projectionEffects.js +2 -2
- package/dist/application/orm/persistence/projection/projectionEffects.js.map +1 -1
- package/dist/application/orm/persistence/support/contracts.d.ts +1 -1
- package/dist/application/orm/persistence/support/contracts.d.ts.map +1 -1
- package/dist/application/sync/inbound/autoSystemConflictResolution.js +3 -3
- package/dist/application/sync/inbound/autoSystemConflictResolution.js.map +1 -1
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts +2 -2
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts.map +1 -1
- package/dist/application/sync/outbound/SheetsEffectDispatcher.d.ts +1 -1
- package/dist/application/sync/outbound/SheetsEffectDispatcher.d.ts.map +1 -1
- package/dist/application/sync/outbound/SheetsEffectDispatcher.js +3 -3
- package/dist/application/sync/outbound/SheetsEffectDispatcher.js.map +1 -1
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts +2 -2
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts.map +1 -1
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js +2 -2
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js.map +1 -1
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts +7 -3
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts.map +1 -1
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js +10 -413
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js.map +1 -1
- package/dist/application/sync/outbound/reconciliation/diff.d.ts +35 -0
- package/dist/application/sync/outbound/reconciliation/diff.d.ts.map +1 -0
- package/dist/application/sync/outbound/reconciliation/diff.js +199 -0
- package/dist/application/sync/outbound/reconciliation/diff.js.map +1 -0
- package/dist/application/sync/outbound/reconciliation/repair.d.ts +30 -0
- package/dist/application/sync/outbound/reconciliation/repair.d.ts.map +1 -0
- package/dist/application/sync/outbound/reconciliation/repair.js +142 -0
- package/dist/application/sync/outbound/reconciliation/repair.js.map +1 -0
- package/dist/application/sync/outbound/reconciliation/shared.d.ts +69 -0
- package/dist/application/sync/outbound/reconciliation/shared.d.ts.map +1 -0
- package/dist/application/sync/outbound/reconciliation/shared.js +111 -0
- package/dist/application/sync/outbound/reconciliation/shared.js.map +1 -0
- package/dist/application/sync/service/SyncServiceBootstrap.d.ts +3 -3
- package/dist/application/sync/service/SyncServiceBootstrap.d.ts.map +1 -1
- package/dist/application/sync/service/SyncServiceBootstrap.js +3 -3
- package/dist/application/sync/service/SyncServiceBootstrap.js.map +1 -1
- package/dist/application/sync/service/syncAutoStart.js +2 -2
- package/dist/application/sync/service/syncAutoStart.js.map +1 -1
- package/dist/application/sync/sheetsContract/conflictProjection.d.ts.map +1 -0
- package/dist/application/sync/sheetsContract/conflictProjection.js.map +1 -0
- package/dist/application/sync/sheetsContract/conflictProjectionRegistration.d.ts.map +1 -0
- package/dist/application/sync/sheetsContract/conflictProjectionRegistration.js.map +1 -0
- package/dist/application/sync/sheetsContract/constants.d.ts.map +1 -0
- package/dist/application/sync/sheetsContract/constants.js.map +1 -0
- package/dist/application/sync/sheetsContract/errors.d.ts.map +1 -0
- package/dist/application/sync/sheetsContract/errors.js.map +1 -0
- package/dist/application/sync/sheetsContract/mutationCoordinator/CoordinatedSheetsProvider.d.ts.map +1 -0
- package/dist/application/sync/sheetsContract/mutationCoordinator/CoordinatedSheetsProvider.js.map +1 -0
- package/dist/application/sync/sheetsContract/mutationCoordinator/asyncMutex.d.ts.map +1 -0
- package/dist/application/sync/sheetsContract/mutationCoordinator/asyncMutex.js.map +1 -0
- package/dist/application/sync/sheetsContract/mutationCoordinator/laneTelemetry.d.ts.map +1 -0
- package/dist/application/sync/sheetsContract/mutationCoordinator/laneTelemetry.js.map +1 -0
- package/dist/application/sync/sheetsContract/sheetsProvisioning.d.ts.map +1 -0
- package/dist/application/sync/sheetsContract/sheetsProvisioning.js.map +1 -0
- package/dist/application/sync/sheetsContract/syncSheets.d.ts.map +1 -0
- package/dist/application/sync/sheetsContract/syncSheets.js.map +1 -0
- package/dist/application/sync/sheetsContract/transportOutcome.d.ts.map +1 -0
- package/dist/application/sync/sheetsContract/transportOutcome.js.map +1 -0
- package/dist/application/sync/sheetsContract/validation.d.ts.map +1 -0
- package/dist/application/sync/sheetsContract/validation.js.map +1 -0
- package/package.json +1 -1
- package/dist/application/sync/sheets/conflictProjection.d.ts.map +0 -1
- package/dist/application/sync/sheets/conflictProjection.js.map +0 -1
- package/dist/application/sync/sheets/conflictProjectionRegistration.d.ts.map +0 -1
- package/dist/application/sync/sheets/conflictProjectionRegistration.js.map +0 -1
- package/dist/application/sync/sheets/constants.d.ts.map +0 -1
- package/dist/application/sync/sheets/constants.js.map +0 -1
- package/dist/application/sync/sheets/errors.d.ts.map +0 -1
- package/dist/application/sync/sheets/errors.js.map +0 -1
- package/dist/application/sync/sheets/mutationCoordinator/CoordinatedSheetsProvider.d.ts.map +0 -1
- package/dist/application/sync/sheets/mutationCoordinator/CoordinatedSheetsProvider.js.map +0 -1
- package/dist/application/sync/sheets/mutationCoordinator/asyncMutex.d.ts.map +0 -1
- package/dist/application/sync/sheets/mutationCoordinator/asyncMutex.js.map +0 -1
- package/dist/application/sync/sheets/mutationCoordinator/laneTelemetry.d.ts.map +0 -1
- package/dist/application/sync/sheets/mutationCoordinator/laneTelemetry.js.map +0 -1
- package/dist/application/sync/sheets/sheetsProvisioning.d.ts.map +0 -1
- package/dist/application/sync/sheets/sheetsProvisioning.js.map +0 -1
- package/dist/application/sync/sheets/syncSheets.d.ts.map +0 -1
- package/dist/application/sync/sheets/syncSheets.js.map +0 -1
- package/dist/application/sync/sheets/transportOutcome.d.ts.map +0 -1
- package/dist/application/sync/sheets/transportOutcome.js.map +0 -1
- package/dist/application/sync/sheets/validation.d.ts.map +0 -1
- package/dist/application/sync/sheets/validation.js.map +0 -1
- /package/dist/application/sync/{sheets → sheetsContract}/conflictProjection.d.ts +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/conflictProjection.js +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/conflictProjectionRegistration.d.ts +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/conflictProjectionRegistration.js +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/constants.d.ts +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/constants.js +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/errors.d.ts +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/errors.js +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/mutationCoordinator/CoordinatedSheetsProvider.d.ts +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/mutationCoordinator/CoordinatedSheetsProvider.js +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/mutationCoordinator/asyncMutex.d.ts +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/mutationCoordinator/asyncMutex.js +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/mutationCoordinator/laneTelemetry.d.ts +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/mutationCoordinator/laneTelemetry.js +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/sheetsProvisioning.d.ts +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/sheetsProvisioning.js +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/syncSheets.d.ts +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/syncSheets.js +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/transportOutcome.d.ts +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/transportOutcome.js +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/validation.d.ts +0 -0
- /package/dist/application/sync/{sheets → sheetsContract}/validation.js +0 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift detection for the System_State reconciliation scan.
|
|
3
|
+
*
|
|
4
|
+
* Compares one provider snapshot against the durable desired state and
|
|
5
|
+
* classifies every desired row as matched, drifted, or missing. Anchor and
|
|
6
|
+
* identity duplicates quarantine the affected locators instead of letting the
|
|
7
|
+
* last row win silently, so a corrupted anchor or duplicated business key can
|
|
8
|
+
* never prove ownership of a row.
|
|
9
|
+
*/
|
|
10
|
+
import { EMPTY_STRING_LENGTH_ZERO, } from "../../../../domain/index.js";
|
|
11
|
+
import { PRESENCE_KINDS } from "../../../../shared/state/index.js";
|
|
12
|
+
import { NORMALIZED_CELL_KINDS } from "../../../../shared/encoding/constants.js";
|
|
13
|
+
import { computeSyncVisibleHash, } from "../../sheetsContract/syncSheets.js";
|
|
14
|
+
export function computeDrifts(args) {
|
|
15
|
+
const rowsByAnchor = new Map();
|
|
16
|
+
const ambiguousAnchors = new Set();
|
|
17
|
+
const rowsByIdentity = new Map();
|
|
18
|
+
const ambiguousIdentities = new Set();
|
|
19
|
+
for (const row of args.snapshot.rows) {
|
|
20
|
+
if (row.physicalAnchor.kind === PRESENCE_KINDS.PRESENT) {
|
|
21
|
+
// A duplicated physical anchor is an anomaly, never a row choice: drop
|
|
22
|
+
// the anchor index entry instead of letting the last row win silently.
|
|
23
|
+
if (ambiguousAnchors.has(row.physicalAnchor.value))
|
|
24
|
+
continue;
|
|
25
|
+
if (rowsByAnchor.has(row.physicalAnchor.value)) {
|
|
26
|
+
rowsByAnchor.delete(row.physicalAnchor.value);
|
|
27
|
+
ambiguousAnchors.add(row.physicalAnchor.value);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
rowsByAnchor.set(row.physicalAnchor.value, row);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const identity = snapshotIdentity(row, args.sheet.businessKeyField);
|
|
34
|
+
if (identity === undefined || ambiguousIdentities.has(identity))
|
|
35
|
+
continue;
|
|
36
|
+
if (rowsByIdentity.has(identity)) {
|
|
37
|
+
rowsByIdentity.delete(identity);
|
|
38
|
+
ambiguousIdentities.add(identity);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
rowsByIdentity.set(identity, row);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const drifts = [];
|
|
45
|
+
for (const desiredRow of args.desired) {
|
|
46
|
+
const identity = desiredRowIdentity(desiredRow, args.sheet.businessKeyField);
|
|
47
|
+
// The primary locator's ambiguity is fatal: when the desired anchor is
|
|
48
|
+
// duplicated, identity fallback would silently pick one of the rows that
|
|
49
|
+
// the corrupted anchor cannot distinguish, so the binding is unmatched.
|
|
50
|
+
// The same quarantine applies to a desired identity that appears in the
|
|
51
|
+
// snapshot's duplicate set: the duplicated business key cannot prove that
|
|
52
|
+
// this binding owns even its unique anchor, so neither locator may match.
|
|
53
|
+
const identityAmbiguous = identity !== undefined && ambiguousIdentities.has(identity);
|
|
54
|
+
const observed = ambiguousAnchors.has(desiredRow.anchorReference) || identityAmbiguous
|
|
55
|
+
? undefined
|
|
56
|
+
: rowsByAnchor.get(desiredRow.anchorReference) ??
|
|
57
|
+
(identity === undefined ? undefined : rowsByIdentity.get(identity));
|
|
58
|
+
if (observed === undefined) {
|
|
59
|
+
drifts.push({ kind: "missing", desired: desiredRow });
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const observedHash = computeObservedHash(observed, args.systemFields);
|
|
63
|
+
const desiredHash = computeSyncVisibleHash(desiredRow.fields);
|
|
64
|
+
if (observedHash !== desiredHash) {
|
|
65
|
+
drifts.push({ kind: "drifted", desired: desiredRow });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return drifts;
|
|
69
|
+
}
|
|
70
|
+
/** Reads a business-key value from a snapshot row for unanchored fast appends. */
|
|
71
|
+
export function snapshotIdentity(row, identityField) {
|
|
72
|
+
return normalizedCellIdentity(row.cells[identityField]?.normalizedCell);
|
|
73
|
+
}
|
|
74
|
+
/** Reads the same visible business-key value from canonical desired state. */
|
|
75
|
+
export function desiredRowIdentity(row, identityField) {
|
|
76
|
+
return normalizedCellIdentity(row.fields[identityField]) ?? row.entityId;
|
|
77
|
+
}
|
|
78
|
+
export function normalizedCellIdentity(cell) {
|
|
79
|
+
if (cell === undefined || cell === null)
|
|
80
|
+
return undefined;
|
|
81
|
+
switch (cell.kind) {
|
|
82
|
+
case NORMALIZED_CELL_KINDS.STRING:
|
|
83
|
+
return cell.value.length === EMPTY_STRING_LENGTH_ZERO ? undefined : cell.value;
|
|
84
|
+
case NORMALIZED_CELL_KINDS.NUMBER:
|
|
85
|
+
return Number.isFinite(cell.value) ? String(cell.value) : undefined;
|
|
86
|
+
case NORMALIZED_CELL_KINDS.BOOLEAN:
|
|
87
|
+
return String(cell.value);
|
|
88
|
+
case NORMALIZED_CELL_KINDS.DATE:
|
|
89
|
+
return cell.value;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function computeObservedHash(row, systemFields) {
|
|
93
|
+
const values = {};
|
|
94
|
+
for (const fieldName of systemFields) {
|
|
95
|
+
const cell = row.cells[fieldName];
|
|
96
|
+
values[fieldName] = cell === undefined ? null : cell.normalizedCell;
|
|
97
|
+
}
|
|
98
|
+
return computeSyncVisibleHash(values);
|
|
99
|
+
}
|
|
100
|
+
export function countMatchedRows(snapshot, desired, identityField) {
|
|
101
|
+
const anchors = new Set();
|
|
102
|
+
const ambiguousAnchors = new Set();
|
|
103
|
+
const identities = new Set();
|
|
104
|
+
const duplicateIdentities = new Set();
|
|
105
|
+
for (const row of snapshot.rows) {
|
|
106
|
+
if (row.physicalAnchor.kind === PRESENCE_KINDS.PRESENT) {
|
|
107
|
+
if (ambiguousAnchors.has(row.physicalAnchor.value))
|
|
108
|
+
continue;
|
|
109
|
+
if (anchors.has(row.physicalAnchor.value)) {
|
|
110
|
+
anchors.delete(row.physicalAnchor.value);
|
|
111
|
+
ambiguousAnchors.add(row.physicalAnchor.value);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
anchors.add(row.physicalAnchor.value);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const identity = snapshotIdentity(row, identityField);
|
|
118
|
+
if (identity === undefined || duplicateIdentities.has(identity))
|
|
119
|
+
continue;
|
|
120
|
+
if (identities.has(identity)) {
|
|
121
|
+
identities.delete(identity);
|
|
122
|
+
duplicateIdentities.add(identity);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
identities.add(identity);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
let matched = 0;
|
|
129
|
+
for (const row of desired) {
|
|
130
|
+
const identity = desiredRowIdentity(row, identityField);
|
|
131
|
+
const anchorAmbiguous = ambiguousAnchors.has(row.anchorReference);
|
|
132
|
+
// A desired identity duplicated in the sheet quarantines the binding:
|
|
133
|
+
// neither its unique anchor nor its identity may count as matched.
|
|
134
|
+
const identityAmbiguous = identity !== undefined && duplicateIdentities.has(identity);
|
|
135
|
+
if ((!anchorAmbiguous && !identityAmbiguous && anchors.has(row.anchorReference)) ||
|
|
136
|
+
(!anchorAmbiguous && !identityAmbiguous && identity !== undefined && identities.has(identity))) {
|
|
137
|
+
matched += 1;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return matched;
|
|
141
|
+
}
|
|
142
|
+
export function countExtraRows(snapshot, desired, identityField) {
|
|
143
|
+
// Identities that appear more than once in the snapshot cannot prove
|
|
144
|
+
// ownership. A desired row carrying one of these identities is quarantined:
|
|
145
|
+
// its anchor never suppresses the extra count, and the duplicated identity
|
|
146
|
+
// itself never suppresses it either.
|
|
147
|
+
const duplicateIdentities = new Set();
|
|
148
|
+
{
|
|
149
|
+
const seen = new Set();
|
|
150
|
+
for (const row of snapshot.rows) {
|
|
151
|
+
const identity = snapshotIdentity(row, identityField);
|
|
152
|
+
if (identity === undefined)
|
|
153
|
+
continue;
|
|
154
|
+
if (seen.has(identity))
|
|
155
|
+
duplicateIdentities.add(identity);
|
|
156
|
+
seen.add(identity);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const desiredByAnchor = new Map();
|
|
160
|
+
const desiredIdentities = new Set();
|
|
161
|
+
for (const row of desired) {
|
|
162
|
+
if (!desiredByAnchor.has(row.anchorReference))
|
|
163
|
+
desiredByAnchor.set(row.anchorReference, row);
|
|
164
|
+
const identity = desiredRowIdentity(row, identityField);
|
|
165
|
+
if (identity !== undefined)
|
|
166
|
+
desiredIdentities.add(identity);
|
|
167
|
+
}
|
|
168
|
+
const anchorCounts = new Map();
|
|
169
|
+
for (const row of snapshot.rows) {
|
|
170
|
+
if (row.physicalAnchor.kind !== PRESENCE_KINDS.PRESENT)
|
|
171
|
+
continue;
|
|
172
|
+
anchorCounts.set(row.physicalAnchor.value, (anchorCounts.get(row.physicalAnchor.value) ?? 0) + 1);
|
|
173
|
+
}
|
|
174
|
+
let extra = 0;
|
|
175
|
+
for (const row of snapshot.rows) {
|
|
176
|
+
// A duplicated anchor cannot prove which row the desired binding owns, so
|
|
177
|
+
// it never suppresses the extra count; the business key decides instead.
|
|
178
|
+
// A quarantined desired identity (duplicated in the sheet) blocks the
|
|
179
|
+
// anchor suppression too, because the anchor cannot prove ownership of a
|
|
180
|
+
// business key that appears elsewhere.
|
|
181
|
+
if (row.physicalAnchor.kind === PRESENCE_KINDS.PRESENT &&
|
|
182
|
+
(anchorCounts.get(row.physicalAnchor.value) ?? 0) === 1) {
|
|
183
|
+
const desiredRow = desiredByAnchor.get(row.physicalAnchor.value);
|
|
184
|
+
const desiredIdentity = desiredRow === undefined
|
|
185
|
+
? undefined
|
|
186
|
+
: desiredRowIdentity(desiredRow, identityField);
|
|
187
|
+
if (desiredRow !== undefined &&
|
|
188
|
+
(desiredIdentity === undefined || !duplicateIdentities.has(desiredIdentity))) {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const identity = snapshotIdentity(row, identityField);
|
|
193
|
+
if (identity !== undefined && !duplicateIdentities.has(identity) && desiredIdentities.has(identity))
|
|
194
|
+
continue;
|
|
195
|
+
extra += 1;
|
|
196
|
+
}
|
|
197
|
+
return extra;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Correction effect generation for the reconciliation scanner.
|
|
3
|
+
*
|
|
4
|
+
* Plans a normal system_projection effect per drift against the latest outbox
|
|
5
|
+
* and visible-state evidence, so the correction is applied by the same
|
|
6
|
+
* CAS-guarded slow path as regular writes. The expected visible hash/revision
|
|
7
|
+
* in each effect comes from the most recent outbox item (an in-flight or
|
|
8
|
+
* uncertain write) or from the confirmed visible state, never from the stale
|
|
9
|
+
* snapshot that triggered the drift.
|
|
10
|
+
*/
|
|
11
|
+
import type { NewEffect } from "../../../../infrastructure/storage/index.js";
|
|
12
|
+
import type { SqlExecutor } from "../../../../adapter/persistence/contracts/sql.js";
|
|
13
|
+
import { type DesiredRow, type LatestVisibleSqlShape, type ScanContext } from "./shared.js";
|
|
14
|
+
import type { DriftTarget } from "./diff.js";
|
|
15
|
+
export declare function buildCorrectionEffects(context: ScanContext, sheet: {
|
|
16
|
+
readonly tabName: string;
|
|
17
|
+
readonly registeredRange: string;
|
|
18
|
+
}, drifts: readonly DriftTarget[]): Promise<readonly NewEffect[]>;
|
|
19
|
+
export interface CorrectionBaseline {
|
|
20
|
+
readonly skip: boolean;
|
|
21
|
+
readonly expectedVisibleRevision: number;
|
|
22
|
+
readonly expectedVisibleHash: string;
|
|
23
|
+
readonly createIfMissing: boolean;
|
|
24
|
+
readonly streamSequence: number;
|
|
25
|
+
}
|
|
26
|
+
export declare function resolveCorrectionBaseline(context: ScanContext, desired: DesiredRow): Promise<CorrectionBaseline>;
|
|
27
|
+
export declare function resolveCorrectionBaselineWithSql(sql: SqlExecutor, context: ScanContext, desired: DesiredRow): Promise<CorrectionBaseline>;
|
|
28
|
+
export declare function baselineFromVisible(visible: LatestVisibleSqlShape | undefined, streamSequence: number): CorrectionBaseline;
|
|
29
|
+
export declare function extractTargetVisibleHash(payloadJson: string): string;
|
|
30
|
+
//# sourceMappingURL=repair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAC;AAIpF,OAAO,EAGL,KAAK,UAAU,EAEf,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CAAE,EACrE,MAAM,EAAE,SAAS,WAAW,EAAE,GAC7B,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAuC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAI7B;AAED,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAmD7B;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,cAAc,EAAE,MAAM,GACrB,kBAAkB,CAsBpB;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQpE"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Correction effect generation for the reconciliation scanner.
|
|
3
|
+
*
|
|
4
|
+
* Plans a normal system_projection effect per drift against the latest outbox
|
|
5
|
+
* and visible-state evidence, so the correction is applied by the same
|
|
6
|
+
* CAS-guarded slow path as regular writes. The expected visible hash/revision
|
|
7
|
+
* in each effect comes from the most recent outbox item (an in-flight or
|
|
8
|
+
* uncertain write) or from the confirmed visible state, never from the stale
|
|
9
|
+
* snapshot that triggered the drift.
|
|
10
|
+
*/
|
|
11
|
+
import { POSITIVE_SAFE_INTEGER_MINIMUM } from "../../../../domain/index.js";
|
|
12
|
+
import { APPLICABILITY_KINDS, PRESENCE_KINDS, } from "../../../../shared/state/index.js";
|
|
13
|
+
import { isRecord } from "../../../../shared/encoding/typeGuards.js";
|
|
14
|
+
import { computeSyncVisibleHash } from "../../sheetsContract/syncSheets.js";
|
|
15
|
+
import { SYNC_PROJECTIONS } from "../../sheetsContract/constants.js";
|
|
16
|
+
import { createSystemProjectionEffect } from "../projection/ProjectionEffectFactory.js";
|
|
17
|
+
import { READ_LATEST_EFFECT_SQL, READ_LATEST_VISIBLE_STATE_SQL, } from "./shared.js";
|
|
18
|
+
export async function buildCorrectionEffects(context, sheet, drifts) {
|
|
19
|
+
const effects = [];
|
|
20
|
+
const commitId = "reconciliation:" + context.createId();
|
|
21
|
+
for (const drift of drifts) {
|
|
22
|
+
const baseline = await resolveCorrectionBaseline(context, drift.desired);
|
|
23
|
+
if (baseline.skip)
|
|
24
|
+
continue;
|
|
25
|
+
const effect = createSystemProjectionEffect({
|
|
26
|
+
effectId: "effect:" + context.createId(),
|
|
27
|
+
commitId,
|
|
28
|
+
logicalSheetId: context.logicalSheetId,
|
|
29
|
+
physicalSheetId: context.physicalSheetId,
|
|
30
|
+
sheetName: sheet.tabName,
|
|
31
|
+
registeredRange: sheet.registeredRange,
|
|
32
|
+
projection: SYNC_PROJECTIONS.SYSTEM_STATE,
|
|
33
|
+
schemaVersion: context.schemaVersion,
|
|
34
|
+
targetKind: "entity",
|
|
35
|
+
targetId: drift.desired.entityId,
|
|
36
|
+
rowBindingId: { kind: PRESENCE_KINDS.PRESENT, value: drift.desired.rowBindingId },
|
|
37
|
+
conflictId: { kind: PRESENCE_KINDS.ABSENT },
|
|
38
|
+
targetAnchor: drift.desired.anchorReference,
|
|
39
|
+
fields: drift.desired.fields,
|
|
40
|
+
createIfMissing: baseline.createIfMissing,
|
|
41
|
+
expectedVisibleRevision: baseline.expectedVisibleRevision,
|
|
42
|
+
expectedVisibleHash: baseline.expectedVisibleHash,
|
|
43
|
+
targetEntityRevision: {
|
|
44
|
+
kind: APPLICABILITY_KINDS.APPLICABLE,
|
|
45
|
+
value: drift.desired.entityRevision,
|
|
46
|
+
},
|
|
47
|
+
targetFieldRevisionHash: {
|
|
48
|
+
kind: APPLICABILITY_KINDS.APPLICABLE,
|
|
49
|
+
value: drift.desired.fieldRevisionHash,
|
|
50
|
+
},
|
|
51
|
+
targetCanonicalCommitId: { kind: APPLICABILITY_KINDS.APPLICABLE, value: commitId },
|
|
52
|
+
streamSequence: baseline.streamSequence,
|
|
53
|
+
});
|
|
54
|
+
effects.push(effect);
|
|
55
|
+
}
|
|
56
|
+
return effects;
|
|
57
|
+
}
|
|
58
|
+
export async function resolveCorrectionBaseline(context, desired) {
|
|
59
|
+
return context.storage.read(({ sql }) => resolveCorrectionBaselineWithSql(sql, context, desired));
|
|
60
|
+
}
|
|
61
|
+
export async function resolveCorrectionBaselineWithSql(sql, context, desired) {
|
|
62
|
+
const latestEffect = await sql.get(READ_LATEST_EFFECT_SQL, [
|
|
63
|
+
context.logicalSheetId,
|
|
64
|
+
desired.entityId,
|
|
65
|
+
]);
|
|
66
|
+
if (latestEffect !== undefined && latestEffect.stream_sequence !== null) {
|
|
67
|
+
const streamSequence = latestEffect.stream_sequence + 1;
|
|
68
|
+
// delivery_uncertain counts as in-flight: the predecessor may still commit
|
|
69
|
+
// remotely after a lost response, and the outbox claim ordering keeps any
|
|
70
|
+
// successor pending until that effect is probe-settled. Planning a
|
|
71
|
+
// correction against the uncertain target (rather than stale visible
|
|
72
|
+
// state) is what makes the eventual guard match the committed write.
|
|
73
|
+
if (latestEffect.status === "pending" ||
|
|
74
|
+
latestEffect.status === "processing" ||
|
|
75
|
+
latestEffect.status === "delivery_uncertain") {
|
|
76
|
+
const payload = latestEffect.payload_json;
|
|
77
|
+
const expectedHash = payload === null ? "" : extractTargetVisibleHash(payload);
|
|
78
|
+
if (expectedHash === computeSyncVisibleHash(desired.fields)) {
|
|
79
|
+
// A canonical write already has an equivalent correction in flight.
|
|
80
|
+
// Do not append another stream item on every periodic scan while the
|
|
81
|
+
// first item is waiting for the provider or its recovery read-back.
|
|
82
|
+
return {
|
|
83
|
+
skip: true,
|
|
84
|
+
expectedVisibleRevision: (latestEffect.expected_visible_revision ?? 0) + 1,
|
|
85
|
+
expectedVisibleHash: expectedHash,
|
|
86
|
+
createIfMissing: false,
|
|
87
|
+
streamSequence,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
skip: false,
|
|
92
|
+
expectedVisibleRevision: (latestEffect.expected_visible_revision ?? 0) + 1,
|
|
93
|
+
expectedVisibleHash: expectedHash,
|
|
94
|
+
createIfMissing: false,
|
|
95
|
+
streamSequence,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const visible = await sql.get(READ_LATEST_VISIBLE_STATE_SQL, [
|
|
99
|
+
context.physicalSheetId,
|
|
100
|
+
desired.rowBindingId,
|
|
101
|
+
]);
|
|
102
|
+
return baselineFromVisible(visible, streamSequence);
|
|
103
|
+
}
|
|
104
|
+
const visible = await sql.get(READ_LATEST_VISIBLE_STATE_SQL, [
|
|
105
|
+
context.physicalSheetId,
|
|
106
|
+
desired.rowBindingId,
|
|
107
|
+
]);
|
|
108
|
+
return baselineFromVisible(visible, POSITIVE_SAFE_INTEGER_MINIMUM);
|
|
109
|
+
}
|
|
110
|
+
export function baselineFromVisible(visible, streamSequence) {
|
|
111
|
+
if (visible === undefined ||
|
|
112
|
+
visible.confirmed_visible_revision === null ||
|
|
113
|
+
visible.confirmed_snapshot_hash === null ||
|
|
114
|
+
visible.confirmed_snapshot_hash.length === 0) {
|
|
115
|
+
return {
|
|
116
|
+
skip: false,
|
|
117
|
+
expectedVisibleRevision: 0,
|
|
118
|
+
expectedVisibleHash: "",
|
|
119
|
+
createIfMissing: true,
|
|
120
|
+
streamSequence,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
skip: false,
|
|
125
|
+
expectedVisibleRevision: visible.confirmed_visible_revision,
|
|
126
|
+
expectedVisibleHash: visible.confirmed_snapshot_hash,
|
|
127
|
+
createIfMissing: false,
|
|
128
|
+
streamSequence,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export function extractTargetVisibleHash(payloadJson) {
|
|
132
|
+
try {
|
|
133
|
+
const parsed = JSON.parse(payloadJson);
|
|
134
|
+
if (!isRecord(parsed))
|
|
135
|
+
return "";
|
|
136
|
+
return typeof parsed.targetVisibleHash === "string" ? parsed.targetVisibleHash : "";
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return "";
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/repair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared contracts and helpers for the reconciliation scanner modules.
|
|
3
|
+
*
|
|
4
|
+
* The drift detector (diff.ts), the correction builder (repair.ts), and the
|
|
5
|
+
* scan orchestrator (ReconciliationScanner.ts) all operate on the durable
|
|
6
|
+
* desired state, the visible state, and the outbox. This module owns those
|
|
7
|
+
* shared types, the SQL statements that read them, and the small helpers that
|
|
8
|
+
* decode canonical rows into the internal desired-row shape, so the role
|
|
9
|
+
* modules can import from one place without importing each other.
|
|
10
|
+
*/
|
|
11
|
+
import { type NormalizedCell } from "../../../../domain/index.js";
|
|
12
|
+
import type { SqlExecutor, SqlStorageAdapter } from "../../../../adapter/persistence/contracts/sql.js";
|
|
13
|
+
import type { SyncSheetsProvider } from "../../sheetsContract/syncSheets.js";
|
|
14
|
+
export declare const DEFAULT_RECONCILIATION_ROLE = "typed-sheets-reconciler";
|
|
15
|
+
export declare const DEFAULT_RECONCILIATION_LEASE_MS = 60000;
|
|
16
|
+
export declare const DEFAULT_SYSTEM_TOMBSTONE_FIELD = "_deleted";
|
|
17
|
+
/** Builder used by the scanner to produce fresh effect/commit identifiers. */
|
|
18
|
+
export type ReconciliationIdFactory = () => string;
|
|
19
|
+
export interface DesiredRow {
|
|
20
|
+
readonly entityId: string;
|
|
21
|
+
readonly rowBindingId: string;
|
|
22
|
+
readonly anchorReference: string;
|
|
23
|
+
readonly entityRevision: number;
|
|
24
|
+
readonly fields: Record<string, NormalizedCell>;
|
|
25
|
+
readonly fieldRevisionHash: string;
|
|
26
|
+
}
|
|
27
|
+
export interface DesiredRowSqlShape {
|
|
28
|
+
readonly entity_id: string;
|
|
29
|
+
readonly row_binding_id: string;
|
|
30
|
+
readonly anchor_reference: string;
|
|
31
|
+
readonly entity_revision: number;
|
|
32
|
+
readonly field_name: string;
|
|
33
|
+
readonly normalized_value: string;
|
|
34
|
+
readonly ownership: string;
|
|
35
|
+
}
|
|
36
|
+
export interface LatestVisibleSqlShape {
|
|
37
|
+
readonly confirmed_visible_revision: number | null;
|
|
38
|
+
readonly confirmed_snapshot_hash: string | null;
|
|
39
|
+
}
|
|
40
|
+
export interface LatestEffectSqlShape {
|
|
41
|
+
readonly stream_sequence: number | null;
|
|
42
|
+
readonly expected_visible_revision: number | null;
|
|
43
|
+
readonly expected_visible_hash: string | null;
|
|
44
|
+
readonly status: string;
|
|
45
|
+
readonly payload_json: string | null;
|
|
46
|
+
}
|
|
47
|
+
export declare const READ_DESIRED_SYSTEM_STATE_SQL = "\n SELECT\n entity.entity_id AS entity_id,\n binding.row_binding_id AS row_binding_id,\n binding.anchor_reference AS anchor_reference,\n entity.entity_revision AS entity_revision,\n field.field_name AS field_name,\n field.normalized_value AS normalized_value,\n field.ownership AS ownership\n FROM entity_state AS entity\n JOIN row_binding AS binding\n ON binding.entity_id = entity.entity_id\n AND binding.logical_sheet_id = ?\n AND binding.state = 'active'\n JOIN entity_field_state AS field\n ON field.entity_id = entity.entity_id\n WHERE entity.status = 'active'\n ORDER BY entity.entity_id, field.field_name\n";
|
|
48
|
+
export declare const READ_LATEST_VISIBLE_STATE_SQL = "\n SELECT confirmed_visible_revision, confirmed_snapshot_hash\n FROM sheet_visible_state\n WHERE physical_sheet_id = ? AND projection = 'system_state' AND row_binding_id = ?\n";
|
|
49
|
+
export declare const READ_LATEST_EFFECT_SQL = "\n SELECT stream_sequence, expected_visible_revision, expected_visible_hash, status, payload_json\n FROM sheet_effect_outbox\n WHERE logical_sheet_id = ? AND target_kind = 'entity' AND target_id = ?\n ORDER BY stream_sequence DESC\n LIMIT 1\n";
|
|
50
|
+
export interface ScanContext {
|
|
51
|
+
readonly storage: SqlStorageAdapter;
|
|
52
|
+
readonly provider: SyncSheetsProvider;
|
|
53
|
+
readonly physicalSheetId: string;
|
|
54
|
+
readonly logicalSheetId: string;
|
|
55
|
+
readonly systemFields: readonly string[];
|
|
56
|
+
readonly tombstoneField: string | undefined;
|
|
57
|
+
readonly schemaVersion: number;
|
|
58
|
+
readonly writerId: string;
|
|
59
|
+
readonly now: () => number;
|
|
60
|
+
readonly createId: ReconciliationIdFactory;
|
|
61
|
+
readonly role: string;
|
|
62
|
+
readonly leaseDurationMs: number;
|
|
63
|
+
}
|
|
64
|
+
export declare function readDesiredSystemState(context: ScanContext): Promise<readonly DesiredRow[]>;
|
|
65
|
+
export declare function readDesiredSystemStateWithSql(sql: SqlExecutor, context: ScanContext): Promise<readonly DesiredRow[]>;
|
|
66
|
+
export declare function ensureTombstoneField(row: DesiredRow, tombstoneField: string | undefined): void;
|
|
67
|
+
export declare function computeFieldRevisionHash(fields: Readonly<Record<string, NormalizedCell>>): string;
|
|
68
|
+
export declare function decodeNormalizedCell(value: string): NormalizedCell;
|
|
69
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared contracts and helpers for the reconciliation scanner modules.
|
|
3
|
+
*
|
|
4
|
+
* The drift detector (diff.ts), the correction builder (repair.ts), and the
|
|
5
|
+
* scan orchestrator (ReconciliationScanner.ts) all operate on the durable
|
|
6
|
+
* desired state, the visible state, and the outbox. This module owns those
|
|
7
|
+
* shared types, the SQL statements that read them, and the small helpers that
|
|
8
|
+
* decode canonical rows into the internal desired-row shape, so the role
|
|
9
|
+
* modules can import from one place without importing each other.
|
|
10
|
+
*/
|
|
11
|
+
import { stableHash } from "../../../../domain/index.js";
|
|
12
|
+
import { NORMALIZED_CELL_KINDS } from "../../../../shared/encoding/constants.js";
|
|
13
|
+
import { isNormalizedCell } from "../../../../shared/encoding/normalizedCell.js";
|
|
14
|
+
import { STORAGE_ERROR_CODES, StorageError } from "../../../../infrastructure/storage/errors.js";
|
|
15
|
+
export const DEFAULT_RECONCILIATION_ROLE = "typed-sheets-reconciler";
|
|
16
|
+
export const DEFAULT_RECONCILIATION_LEASE_MS = 60_000;
|
|
17
|
+
export const DEFAULT_SYSTEM_TOMBSTONE_FIELD = "_deleted";
|
|
18
|
+
export const READ_DESIRED_SYSTEM_STATE_SQL = `
|
|
19
|
+
SELECT
|
|
20
|
+
entity.entity_id AS entity_id,
|
|
21
|
+
binding.row_binding_id AS row_binding_id,
|
|
22
|
+
binding.anchor_reference AS anchor_reference,
|
|
23
|
+
entity.entity_revision AS entity_revision,
|
|
24
|
+
field.field_name AS field_name,
|
|
25
|
+
field.normalized_value AS normalized_value,
|
|
26
|
+
field.ownership AS ownership
|
|
27
|
+
FROM entity_state AS entity
|
|
28
|
+
JOIN row_binding AS binding
|
|
29
|
+
ON binding.entity_id = entity.entity_id
|
|
30
|
+
AND binding.logical_sheet_id = ?
|
|
31
|
+
AND binding.state = 'active'
|
|
32
|
+
JOIN entity_field_state AS field
|
|
33
|
+
ON field.entity_id = entity.entity_id
|
|
34
|
+
WHERE entity.status = 'active'
|
|
35
|
+
ORDER BY entity.entity_id, field.field_name
|
|
36
|
+
`;
|
|
37
|
+
export const READ_LATEST_VISIBLE_STATE_SQL = `
|
|
38
|
+
SELECT confirmed_visible_revision, confirmed_snapshot_hash
|
|
39
|
+
FROM sheet_visible_state
|
|
40
|
+
WHERE physical_sheet_id = ? AND projection = 'system_state' AND row_binding_id = ?
|
|
41
|
+
`;
|
|
42
|
+
export const READ_LATEST_EFFECT_SQL = `
|
|
43
|
+
SELECT stream_sequence, expected_visible_revision, expected_visible_hash, status, payload_json
|
|
44
|
+
FROM sheet_effect_outbox
|
|
45
|
+
WHERE logical_sheet_id = ? AND target_kind = 'entity' AND target_id = ?
|
|
46
|
+
ORDER BY stream_sequence DESC
|
|
47
|
+
LIMIT 1
|
|
48
|
+
`;
|
|
49
|
+
export async function readDesiredSystemState(context) {
|
|
50
|
+
return context.storage.read(({ sql }) => readDesiredSystemStateWithSql(sql, context));
|
|
51
|
+
}
|
|
52
|
+
export async function readDesiredSystemStateWithSql(sql, context) {
|
|
53
|
+
const rows = await sql.all(READ_DESIRED_SYSTEM_STATE_SQL, [
|
|
54
|
+
context.logicalSheetId,
|
|
55
|
+
]);
|
|
56
|
+
const byEntity = new Map();
|
|
57
|
+
for (const row of rows) {
|
|
58
|
+
const existing = byEntity.get(row.entity_id);
|
|
59
|
+
const cell = decodeNormalizedCell(row.normalized_value);
|
|
60
|
+
if (existing === undefined) {
|
|
61
|
+
const fields = {};
|
|
62
|
+
fields[row.field_name] = cell;
|
|
63
|
+
byEntity.set(row.entity_id, {
|
|
64
|
+
entityId: row.entity_id,
|
|
65
|
+
rowBindingId: row.row_binding_id,
|
|
66
|
+
anchorReference: row.anchor_reference,
|
|
67
|
+
entityRevision: row.entity_revision,
|
|
68
|
+
fields,
|
|
69
|
+
fieldRevisionHash: "",
|
|
70
|
+
});
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
existing.fields[row.field_name] = cell;
|
|
74
|
+
}
|
|
75
|
+
const desired = [];
|
|
76
|
+
for (const row of byEntity.values()) {
|
|
77
|
+
ensureTombstoneField(row, context.tombstoneField);
|
|
78
|
+
const hash = computeFieldRevisionHash(row.fields);
|
|
79
|
+
desired.push({ ...row, fieldRevisionHash: hash });
|
|
80
|
+
}
|
|
81
|
+
return desired;
|
|
82
|
+
}
|
|
83
|
+
export function ensureTombstoneField(row, tombstoneField) {
|
|
84
|
+
if (tombstoneField === undefined)
|
|
85
|
+
return;
|
|
86
|
+
const fields = row.fields;
|
|
87
|
+
if (fields[tombstoneField] === undefined) {
|
|
88
|
+
fields[tombstoneField] = { kind: NORMALIZED_CELL_KINDS.BOOLEAN, value: false };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function computeFieldRevisionHash(fields) {
|
|
92
|
+
const entries = Object.entries(fields)
|
|
93
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
94
|
+
.map(([fieldName, value]) => ({ fieldName, value }));
|
|
95
|
+
return stableHash({ fields: entries });
|
|
96
|
+
}
|
|
97
|
+
export function decodeNormalizedCell(value) {
|
|
98
|
+
try {
|
|
99
|
+
const parsed = JSON.parse(value);
|
|
100
|
+
if (!isNormalizedCell(parsed)) {
|
|
101
|
+
throw new StorageError(STORAGE_ERROR_CODES.OBSERVATION_STORAGE_INCONSISTENT, "entity_field_state.normalized_value is not a normalized cell");
|
|
102
|
+
}
|
|
103
|
+
return parsed;
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if (error instanceof StorageError)
|
|
107
|
+
throw error;
|
|
108
|
+
throw new StorageError(STORAGE_ERROR_CODES.OBSERVATION_STORAGE_INCONSISTENT, "entity_field_state.normalized_value is not valid JSON");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
import type { HikouteiEntity } from "../../../api/entity.js";
|
|
15
15
|
import { type Hikoutei } from "../../../api/Hikoutei.js";
|
|
16
16
|
import type { MikroOrmSqliteAdapter } from "../../../adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.js";
|
|
17
|
-
import type { SyncSheetsProvisioner, RegisteredSyncProjectionDefinition } from "../
|
|
18
|
-
import type { SyncSheetsProvider, SyncSheetsTableReader } from "../
|
|
19
|
-
import type { CoordinatorLaneEvent } from "../
|
|
17
|
+
import type { SyncSheetsProvisioner, RegisteredSyncProjectionDefinition } from "../sheetsContract/sheetsProvisioning.js";
|
|
18
|
+
import type { SyncSheetsProvider, SyncSheetsTableReader } from "../sheetsContract/syncSheets.js";
|
|
19
|
+
import type { CoordinatorLaneEvent } from "../sheetsContract/mutationCoordinator/laneTelemetry.js";
|
|
20
20
|
import { type GoogleSheetsApiProviderOptions } from "../../../adapter/sheets/providers/google-sheets-api/index.js";
|
|
21
21
|
import { type EffectWorkerSupervisor, type WorkerReport } from "@hikoutei/ikisaki";
|
|
22
22
|
import { type MappedUserInputPollingReport } from "../../../adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPolling.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncServiceBootstrap.d.ts","sourceRoot":"","sources":["../../../../src/application/sync/service/SyncServiceBootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAoC,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAEL,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAmBlC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mFAAmF,CAAC;AAK/H,OAAO,KAAK,EACV,qBAAqB,EACrB,kCAAkC,EACnC,MAAM,
|
|
1
|
+
{"version":3,"file":"SyncServiceBootstrap.d.ts","sourceRoot":"","sources":["../../../../src/application/sync/service/SyncServiceBootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAoC,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAEL,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAmBlC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mFAAmF,CAAC;AAK/H,OAAO,KAAK,EACV,qBAAqB,EACrB,kCAAkC,EACnC,MAAM,yCAAyC,CAAC;AAWjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAIjG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wDAAwD,CAAC;AACnG,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,8DAA8D,CAAC;AAEtE,OAAO,EAUL,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,0FAA0F,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAKjE,OAAO,KAAK,EAEV,4BAA4B,EAC7B,MAAM,gBAAgB,CAAC;AAIxB,oFAAoF;AACpF,MAAM,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,qBAAqB,CAAC;AAE9E,gFAAgF;AAChF,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,4BAA4B,CAAC;IACnD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IACzC,yEAAyE;IACzE,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,8BAA8B,CAAC;IAC1D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,gFAAgF;IAChF,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,iEAAiE;IACjE,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAC5C,kFAAkF;IAClF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM,CAAC;IAClF,yEAAyE;IACzE,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACxE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,4BAA4B,KAAK,IAAI,CAAC;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpD;AAED,iFAAiF;AACjF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,qBAAqB,EAAE,SAAS,kCAAkC,EAAE,CAAC;IAC9E,2EAA2E;IAC3E,QAAQ,CAAC,sBAAsB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;IAClD,QAAQ,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,4BAA4B,CAAC,CAAC;IAChF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAmJ9B"}
|