hikoutei 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.ja.md +135 -0
- package/README.ko.md +138 -0
- package/README.md +143 -0
- package/apps-script/gateway/Code.gs +412 -0
- package/dist/adapter/persistence/contracts/index.d.ts +3 -0
- package/dist/adapter/persistence/contracts/index.d.ts.map +1 -0
- package/dist/adapter/persistence/contracts/index.js +3 -0
- package/dist/adapter/persistence/contracts/index.js.map +1 -0
- package/dist/adapter/persistence/contracts/sql.d.ts +50 -0
- package/dist/adapter/persistence/contracts/sql.d.ts.map +1 -0
- package/dist/adapter/persistence/contracts/sql.js +9 -0
- package/dist/adapter/persistence/contracts/sql.js.map +1 -0
- package/dist/adapter/persistence/index.d.ts +2 -0
- package/dist/adapter/persistence/index.d.ts.map +1 -0
- package/dist/adapter/persistence/index.js +2 -0
- package/dist/adapter/persistence/index.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.d.ts +53 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.js +105 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts +39 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.js +54 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.d.ts +38 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.js +55 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.d.ts +16 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.js +9 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.d.ts +27 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.js +67 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.d.ts +19 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.js +67 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.d.ts +78 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.js +121 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.d.ts +20 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.js +125 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.d.ts +42 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.js +51 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts +22 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.js +12 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.d.ts +42 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.js +161 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.d.ts +3 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.js +692 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.d.ts +29 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.js +538 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.d.ts +12 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js +190 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.d.ts +23 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.js +166 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.d.ts +50 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.js +60 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.d.ts +44 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.js +40 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.d.ts +7 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.js +47 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.d.ts +5 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.js +54 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.d.ts +5 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.js +2 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.d.ts +10 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.js +35 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.d.ts +67 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.js +204 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts +78 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js +343 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js.map +1 -0
- package/dist/application/index.d.ts +4 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +4 -0
- package/dist/application/index.js.map +1 -0
- package/dist/application/orm/api/TypedSheetsOrm.d.ts +71 -0
- package/dist/application/orm/api/TypedSheetsOrm.d.ts.map +1 -0
- package/dist/application/orm/api/TypedSheetsOrm.js +116 -0
- package/dist/application/orm/api/TypedSheetsOrm.js.map +1 -0
- package/dist/application/orm/api/contracts.d.ts +118 -0
- package/dist/application/orm/api/contracts.d.ts.map +1 -0
- package/dist/application/orm/api/contracts.js +21 -0
- package/dist/application/orm/api/contracts.js.map +1 -0
- package/dist/application/orm/errors.d.ts +35 -0
- package/dist/application/orm/errors.d.ts.map +1 -0
- package/dist/application/orm/errors.js +35 -0
- package/dist/application/orm/errors.js.map +1 -0
- package/dist/application/orm/index.d.ts +13 -0
- package/dist/application/orm/index.d.ts.map +1 -0
- package/dist/application/orm/index.js +7 -0
- package/dist/application/orm/index.js.map +1 -0
- package/dist/application/orm/mapping/contracts.d.ts +113 -0
- package/dist/application/orm/mapping/contracts.d.ts.map +1 -0
- package/dist/application/orm/mapping/contracts.js +8 -0
- package/dist/application/orm/mapping/contracts.js.map +1 -0
- package/dist/application/orm/mapping/definition.d.ts +16 -0
- package/dist/application/orm/mapping/definition.d.ts.map +1 -0
- package/dist/application/orm/mapping/definition.js +145 -0
- package/dist/application/orm/mapping/definition.js.map +1 -0
- package/dist/application/orm/mapping/entityMapping.d.ts +13 -0
- package/dist/application/orm/mapping/entityMapping.d.ts.map +1 -0
- package/dist/application/orm/mapping/entityMapping.js +13 -0
- package/dist/application/orm/mapping/entityMapping.js.map +1 -0
- package/dist/application/orm/mapping/identity.d.ts +14 -0
- package/dist/application/orm/mapping/identity.d.ts.map +1 -0
- package/dist/application/orm/mapping/identity.js +37 -0
- package/dist/application/orm/mapping/identity.js.map +1 -0
- package/dist/application/orm/mapping/observationMapping.d.ts +42 -0
- package/dist/application/orm/mapping/observationMapping.d.ts.map +1 -0
- package/dist/application/orm/mapping/observationMapping.js +65 -0
- package/dist/application/orm/mapping/observationMapping.js.map +1 -0
- package/dist/application/orm/mapping/projection.d.ts +22 -0
- package/dist/application/orm/mapping/projection.d.ts.map +1 -0
- package/dist/application/orm/mapping/projection.js +74 -0
- package/dist/application/orm/mapping/projection.js.map +1 -0
- package/dist/application/orm/mapping/registry.d.ts +15 -0
- package/dist/application/orm/mapping/registry.d.ts.map +1 -0
- package/dist/application/orm/mapping/registry.js +38 -0
- package/dist/application/orm/mapping/registry.js.map +1 -0
- package/dist/application/orm/mapping/values.d.ts +17 -0
- package/dist/application/orm/mapping/values.d.ts.map +1 -0
- package/dist/application/orm/mapping/values.js +141 -0
- package/dist/application/orm/mapping/values.js.map +1 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.d.ts +28 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.d.ts.map +1 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.js +170 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.js.map +1 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.d.ts +9 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.d.ts.map +1 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.js +8 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.js.map +1 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.d.ts +12 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.d.ts.map +1 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.js +134 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.js.map +1 -0
- package/dist/application/orm/persistence/projection/projectionEffects.d.ts +21 -0
- package/dist/application/orm/persistence/projection/projectionEffects.d.ts.map +1 -0
- package/dist/application/orm/persistence/projection/projectionEffects.js +203 -0
- package/dist/application/orm/persistence/projection/projectionEffects.js.map +1 -0
- package/dist/application/orm/persistence/support/businessKeys.d.ts +17 -0
- package/dist/application/orm/persistence/support/businessKeys.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/businessKeys.js +72 -0
- package/dist/application/orm/persistence/support/businessKeys.js.map +1 -0
- package/dist/application/orm/persistence/support/canonicalState.d.ts +22 -0
- package/dist/application/orm/persistence/support/canonicalState.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/canonicalState.js +88 -0
- package/dist/application/orm/persistence/support/canonicalState.js.map +1 -0
- package/dist/application/orm/persistence/support/contracts.d.ts +139 -0
- package/dist/application/orm/persistence/support/contracts.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/contracts.js +93 -0
- package/dist/application/orm/persistence/support/contracts.js.map +1 -0
- package/dist/application/orm/persistence/support/helpers.d.ts +32 -0
- package/dist/application/orm/persistence/support/helpers.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/helpers.js +66 -0
- package/dist/application/orm/persistence/support/helpers.js.map +1 -0
- package/dist/application/orm/persistence/support/timing.d.ts +20 -0
- package/dist/application/orm/persistence/support/timing.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/timing.js +55 -0
- package/dist/application/orm/persistence/support/timing.js.map +1 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.d.ts +46 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.d.ts.map +1 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.js +93 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.js.map +1 -0
- package/dist/application/sync/gateway/constants.d.ts +65 -0
- package/dist/application/sync/gateway/constants.d.ts.map +1 -0
- package/dist/application/sync/gateway/constants.js +57 -0
- package/dist/application/sync/gateway/constants.js.map +1 -0
- package/dist/application/sync/gateway/errors.d.ts +15 -0
- package/dist/application/sync/gateway/errors.d.ts.map +1 -0
- package/dist/application/sync/gateway/errors.js +16 -0
- package/dist/application/sync/gateway/errors.js.map +1 -0
- package/dist/application/sync/gateway/syncGateway.d.ts +313 -0
- package/dist/application/sync/gateway/syncGateway.d.ts.map +1 -0
- package/dist/application/sync/gateway/syncGateway.js +202 -0
- package/dist/application/sync/gateway/syncGateway.js.map +1 -0
- package/dist/application/sync/gateway/validation.d.ts +17 -0
- package/dist/application/sync/gateway/validation.d.ts.map +1 -0
- package/dist/application/sync/gateway/validation.js +60 -0
- package/dist/application/sync/gateway/validation.js.map +1 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts +72 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts.map +1 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.js +272 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.js.map +1 -0
- package/dist/application/sync/index.d.ts +16 -0
- package/dist/application/sync/index.d.ts.map +1 -0
- package/dist/application/sync/index.js +9 -0
- package/dist/application/sync/index.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts +106 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js +297 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts +100 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.js +345 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts +46 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js +63 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts +20 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js +102 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts +19 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js +32 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts +30 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js +202 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts +17 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js +80 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts +13 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js +205 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js.map +1 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts +81 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts.map +1 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js +245 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js.map +1 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts +77 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts.map +1 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js +518 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js.map +1 -0
- package/dist/application/sync/telemetry/syncTiming.d.ts +50 -0
- package/dist/application/sync/telemetry/syncTiming.d.ts.map +1 -0
- package/dist/application/sync/telemetry/syncTiming.js +22 -0
- package/dist/application/sync/telemetry/syncTiming.js.map +1 -0
- package/dist/domain/conflict/errors.d.ts +42 -0
- package/dist/domain/conflict/errors.d.ts.map +1 -0
- package/dist/domain/conflict/errors.js +36 -0
- package/dist/domain/conflict/errors.js.map +1 -0
- package/dist/domain/conflict/index.d.ts +5 -0
- package/dist/domain/conflict/index.d.ts.map +1 -0
- package/dist/domain/conflict/index.js +3 -0
- package/dist/domain/conflict/index.js.map +1 -0
- package/dist/domain/conflict/transitions.d.ts +52 -0
- package/dist/domain/conflict/transitions.d.ts.map +1 -0
- package/dist/domain/conflict/transitions.js +115 -0
- package/dist/domain/conflict/transitions.js.map +1 -0
- package/dist/domain/errors/evaluation.d.ts +13 -0
- package/dist/domain/errors/evaluation.d.ts.map +1 -0
- package/dist/domain/errors/evaluation.js +14 -0
- package/dist/domain/errors/evaluation.js.map +1 -0
- package/dist/domain/errors/identity.d.ts +12 -0
- package/dist/domain/errors/identity.d.ts.map +1 -0
- package/dist/domain/errors/identity.js +15 -0
- package/dist/domain/errors/identity.js.map +1 -0
- package/dist/domain/errors/index.d.ts +7 -0
- package/dist/domain/errors/index.d.ts.map +1 -0
- package/dist/domain/errors/index.js +5 -0
- package/dist/domain/errors/index.js.map +1 -0
- package/dist/domain/errors/stableEncoding.d.ts +7 -0
- package/dist/domain/errors/stableEncoding.d.ts.map +1 -0
- package/dist/domain/errors/stableEncoding.js +8 -0
- package/dist/domain/errors/stableEncoding.js.map +1 -0
- package/dist/domain/errors/types.d.ts +20 -0
- package/dist/domain/errors/types.d.ts.map +1 -0
- package/dist/domain/errors/types.js +18 -0
- package/dist/domain/errors/types.js.map +1 -0
- package/dist/domain/evaluate/constants.d.ts +55 -0
- package/dist/domain/evaluate/constants.d.ts.map +1 -0
- package/dist/domain/evaluate/constants.js +41 -0
- package/dist/domain/evaluate/constants.js.map +1 -0
- package/dist/domain/evaluate/contracts.d.ts +125 -0
- package/dist/domain/evaluate/contracts.d.ts.map +1 -0
- package/dist/domain/evaluate/contracts.js +8 -0
- package/dist/domain/evaluate/contracts.js.map +1 -0
- package/dist/domain/evaluate/evaluateBatch.d.ts +11 -0
- package/dist/domain/evaluate/evaluateBatch.d.ts.map +1 -0
- package/dist/domain/evaluate/evaluateBatch.js +91 -0
- package/dist/domain/evaluate/evaluateBatch.js.map +1 -0
- package/dist/domain/evaluate/fieldEvaluation.d.ts +14 -0
- package/dist/domain/evaluate/fieldEvaluation.d.ts.map +1 -0
- package/dist/domain/evaluate/fieldEvaluation.js +133 -0
- package/dist/domain/evaluate/fieldEvaluation.js.map +1 -0
- package/dist/domain/evaluate/identity.d.ts +21 -0
- package/dist/domain/evaluate/identity.d.ts.map +1 -0
- package/dist/domain/evaluate/identity.js +72 -0
- package/dist/domain/evaluate/identity.js.map +1 -0
- package/dist/domain/evaluate/index.d.ts +4 -0
- package/dist/domain/evaluate/index.d.ts.map +1 -0
- package/dist/domain/evaluate/index.js +3 -0
- package/dist/domain/evaluate/index.js.map +1 -0
- package/dist/domain/evaluate/preconditions.d.ts +30 -0
- package/dist/domain/evaluate/preconditions.d.ts.map +1 -0
- package/dist/domain/evaluate/preconditions.js +389 -0
- package/dist/domain/evaluate/preconditions.js.map +1 -0
- package/dist/domain/evaluate/quarantine.d.ts +15 -0
- package/dist/domain/evaluate/quarantine.d.ts.map +1 -0
- package/dist/domain/evaluate/quarantine.js +185 -0
- package/dist/domain/evaluate/quarantine.js.map +1 -0
- package/dist/domain/index.d.ts +7 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +7 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/model/constants.d.ts +73 -0
- package/dist/domain/model/constants.d.ts.map +1 -0
- package/dist/domain/model/constants.js +59 -0
- package/dist/domain/model/constants.js.map +1 -0
- package/dist/domain/model/index.d.ts +3 -0
- package/dist/domain/model/index.d.ts.map +1 -0
- package/dist/domain/model/index.js +2 -0
- package/dist/domain/model/index.js.map +1 -0
- package/dist/domain/model/types.d.ts +330 -0
- package/dist/domain/model/types.d.ts.map +1 -0
- package/dist/domain/model/types.js +8 -0
- package/dist/domain/model/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +3 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +3 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/infrastructure/storage/constants.d.ts +4 -0
- package/dist/infrastructure/storage/constants.d.ts.map +1 -0
- package/dist/infrastructure/storage/constants.js +4 -0
- package/dist/infrastructure/storage/constants.js.map +1 -0
- package/dist/infrastructure/storage/errors.d.ts +55 -0
- package/dist/infrastructure/storage/errors.d.ts.map +1 -0
- package/dist/infrastructure/storage/errors.js +58 -0
- package/dist/infrastructure/storage/errors.js.map +1 -0
- package/dist/infrastructure/storage/index.d.ts +23 -0
- package/dist/infrastructure/storage/index.d.ts.map +1 -0
- package/dist/infrastructure/storage/index.js +13 -0
- package/dist/infrastructure/storage/index.js.map +1 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.d.ts +64 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.d.ts.map +1 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.js +148 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/schema.d.ts +49 -0
- package/dist/infrastructure/storage/sqlite/schema.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/schema.js +529 -0
- package/dist/infrastructure/storage/sqlite/schema.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.d.ts +5 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.js +2 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.d.ts +9 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.js +122 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlState.d.ts +6 -0
- package/dist/infrastructure/storage/sqlite/sqlState.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlState.js +14 -0
- package/dist/infrastructure/storage/sqlite/sqlState.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.d.ts +6 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.js +24 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.d.ts +44 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.js +66 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.js.map +1 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts +101 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.js +417 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.d.ts +16 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.js +85 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts +31 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.js +439 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.d.ts +53 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.js +41 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.d.ts +49 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.js +537 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts +15 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.js +100 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.d.ts +124 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.js +13 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.d.ts +28 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.js +223 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.d.ts +28 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.js +293 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.js.map +1 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.d.ts +58 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.js +195 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts +31 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.js +563 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts +118 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.js +18 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts +23 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js +84 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts +16 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js +97 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts +137 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.js +396 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts +101 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js +9 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts +21 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js +184 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts +25 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js +158 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js.map +1 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts +69 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.js +272 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.js.map +1 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.d.ts +90 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.js +282 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.js.map +1 -0
- package/dist/shared/constants.d.ts +8 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +8 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/encoding/constants.d.ts +45 -0
- package/dist/shared/encoding/constants.d.ts.map +1 -0
- package/dist/shared/encoding/constants.js +37 -0
- package/dist/shared/encoding/constants.js.map +1 -0
- package/dist/shared/encoding/index.d.ts +6 -0
- package/dist/shared/encoding/index.d.ts.map +1 -0
- package/dist/shared/encoding/index.js +4 -0
- package/dist/shared/encoding/index.js.map +1 -0
- package/dist/shared/encoding/stableEncode.d.ts +34 -0
- package/dist/shared/encoding/stableEncode.d.ts.map +1 -0
- package/dist/shared/encoding/stableEncode.js +210 -0
- package/dist/shared/encoding/stableEncode.js.map +1 -0
- package/dist/shared/encoding/typeGuards.d.ts +15 -0
- package/dist/shared/encoding/typeGuards.d.ts.map +1 -0
- package/dist/shared/encoding/typeGuards.js +11 -0
- package/dist/shared/encoding/typeGuards.js.map +1 -0
- package/dist/shared/encoding/types.d.ts +52 -0
- package/dist/shared/encoding/types.d.ts.map +1 -0
- package/dist/shared/encoding/types.js +8 -0
- package/dist/shared/encoding/types.js.map +1 -0
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +6 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/state/constants.d.ts +16 -0
- package/dist/shared/state/constants.d.ts.map +1 -0
- package/dist/shared/state/constants.js +16 -0
- package/dist/shared/state/constants.js.map +1 -0
- package/dist/shared/state/index.d.ts +3 -0
- package/dist/shared/state/index.d.ts.map +1 -0
- package/dist/shared/state/index.js +2 -0
- package/dist/shared/state/index.js.map +1 -0
- package/dist/shared/state/types.d.ts +23 -0
- package/dist/shared/state/types.d.ts.map +1 -0
- package/dist/shared/state/types.js +2 -0
- package/dist/shared/state/types.js.map +1 -0
- package/dist/shared/validation.d.ts +9 -0
- package/dist/shared/validation.d.ts.map +1 -0
- package/dist/shared/validation.js +25 -0
- package/dist/shared/validation.js.map +1 -0
- package/docs/architecture.md +72 -0
- package/docs/code-guidelines.md +256 -0
- package/docs/development.md +48 -0
- package/docs/git-workflow.md +224 -0
- package/docs/mikro-orm-adapter-spike.md +248 -0
- package/docs/quick-start.md +102 -0
- package/docs/sql-layer-plan.md +59 -0
- package/docs/sync-bulk-write-benchmark.md +1036 -0
- package/docs/sync-observability.md +71 -0
- package/docs/task-queue-write-model.md +640 -0
- package/docs/typed-sheets-mvp-scope-2026-06-29.md +490 -0
- package/docs/typed-sheets-plan.md +417 -0
- package/docs/write-and-synchronization-flow.md +71 -0
- package/package.json +68 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fenced observation-to-storage composer for the SQLite-authoritative phase.
|
|
3
|
+
*
|
|
4
|
+
* It persists one already-normalized, already-evaluated row per immediate
|
|
5
|
+
* transaction. The focused modules it calls own validation, receipt/event
|
|
6
|
+
* ledgering, canonical state, conflicts, and quarantine evidence.
|
|
7
|
+
*/
|
|
8
|
+
import { APPLICABILITY_KINDS, LOOKUP_RESULT_KINDS, PRESENCE_KINDS, } from "../../../../domain/index.js";
|
|
9
|
+
import { ROW_OUTCOMES } from "../../../../domain/evaluate/constants.js";
|
|
10
|
+
import { EMPTY_ARRAY_LENGTH_ZERO, EXPECTED_SINGLE_ROW_CHANGE_COUNT } from "../../constants.js";
|
|
11
|
+
import { STORAGE_ERROR_CODES, StorageError } from "../../errors.js";
|
|
12
|
+
import { appendPendingEffects, appendPendingEffectsWithSql, } from "../../sync/outbound/effectOutbox.js";
|
|
13
|
+
import { withImmediateTransaction } from "../../sqlite/sqliteBridge.js";
|
|
14
|
+
import { withSqlSavepoint } from "../../sqlite/sqlTransaction.js";
|
|
15
|
+
import { isFencingValid, isFencingValidWithSql, } from "../../sync/shared/writerLease.js";
|
|
16
|
+
import { applyCanonicalMutation, applyCanonicalMutationWithSql, persistConflictAttempts, persistConflictAttemptsWithSql, requirePersistedOutcome, } from "./observationCanonical.js";
|
|
17
|
+
import { appendObservation, appendObservationWithSql, completeObservation, completeObservationWithSql, createEvent, createEventWithSql, findEventByKey, findEventByKeyWithSql, findMatchingCandidateEventId, findMatchingCandidateEventIdWithSql, persistObservedHashes, persistObservedHashesWithSql, requireKnownBinding, requireKnownBindingWithSql, } from "./observationLedger.js";
|
|
18
|
+
import { persistIntegrityQuarantine, persistIntegrityQuarantineWithSql, persistQuarantine, persistQuarantineWithSql, } from "./observationQuarantine.js";
|
|
19
|
+
import { OBSERVATION_APPEND_RESULT_KINDS, OBSERVATION_COMPLETION_STATES, OBSERVATION_DUPLICATE_REASONS, OBSERVATION_INTEGRITY_DISCRIMINATORS, OBSERVATION_WRITE_RESULT_KINDS, } from "./observationConstants.js";
|
|
20
|
+
import { CanonicalStaleError, FenceLostError, } from "./observationTypes.js";
|
|
21
|
+
import { ensureEffectsTargetRegistered, ensureEffectsTargetRegisteredWithSql, ensureRegisteredProjection, ensureRegisteredProjectionWithSql, requireBatchRow, validatePersistObservedRowInput, } from "./observationValidation.js";
|
|
22
|
+
const UPDATE_EVENT_STATUS_SQL = `
|
|
23
|
+
UPDATE event_log
|
|
24
|
+
SET status = ?
|
|
25
|
+
WHERE event_id = ?
|
|
26
|
+
`;
|
|
27
|
+
const ABSENT_EVENT_ID = { kind: PRESENCE_KINDS.ABSENT };
|
|
28
|
+
/**
|
|
29
|
+
* Persists one normalized row outcome at the writer-RPC boundary.
|
|
30
|
+
*
|
|
31
|
+
* No Sheet call is made here. A stale fence or canonical CAS rolls back the
|
|
32
|
+
* whole transaction so the adapter can re-read and submit again.
|
|
33
|
+
*/
|
|
34
|
+
export function persistObservedRow(db, fence, input) {
|
|
35
|
+
validatePersistObservedRowInput(input);
|
|
36
|
+
if (!isFencingValid(db, fence)) {
|
|
37
|
+
return { kind: OBSERVATION_WRITE_RESULT_KINDS.FENCED_OUT };
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
return withImmediateTransaction(db, () => {
|
|
41
|
+
assertCurrentFence(db, fence);
|
|
42
|
+
const row = requireBatchRow(input.batch, input.rowIndex);
|
|
43
|
+
ensureRegisteredProjection(db, input.batch, input.physicalSheetId);
|
|
44
|
+
ensureEffectsTargetRegistered(db, input.batch.sheetId, input.effects);
|
|
45
|
+
if (input.canonical.kind === PRESENCE_KINDS.PRESENT) {
|
|
46
|
+
ensureEffectsTargetRegistered(db, input.batch.sheetId, input.canonical.value.commit.effects);
|
|
47
|
+
}
|
|
48
|
+
const observation = appendObservation(db, input.batch, input.physicalSheetId, input.observation);
|
|
49
|
+
if (observation.kind === OBSERVATION_APPEND_RESULT_KINDS.DUPLICATE) {
|
|
50
|
+
return {
|
|
51
|
+
kind: OBSERVATION_WRITE_RESULT_KINDS.DUPLICATE,
|
|
52
|
+
observationId: input.observation.observationId,
|
|
53
|
+
eventId: observation.eventId,
|
|
54
|
+
reason: OBSERVATION_DUPLICATE_REASONS.OBSERVATION,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (observation.kind === OBSERVATION_APPEND_RESULT_KINDS.INTEGRITY_COLLISION) {
|
|
58
|
+
const quarantineId = persistIntegrityQuarantine(db, input, row, ABSENT_EVENT_ID, OBSERVATION_INTEGRITY_DISCRIMINATORS.OBSERVATION_KEY_PAYLOAD_MISMATCH);
|
|
59
|
+
return completeQuarantine(db, fence, input, quarantineId, ABSENT_EVENT_ID, []);
|
|
60
|
+
}
|
|
61
|
+
if (input.event.kind === PRESENCE_KINDS.ABSENT) {
|
|
62
|
+
if (input.evaluation.outcome !== ROW_OUTCOMES.QUARANTINE) {
|
|
63
|
+
throw new StorageError(STORAGE_ERROR_CODES.INVALID_OBSERVATION_INPUT, "an unresolved observation must have a core quarantine plan");
|
|
64
|
+
}
|
|
65
|
+
const quarantineId = persistQuarantine(db, input, input.evaluation.quarantine, ABSENT_EVENT_ID);
|
|
66
|
+
return completeQuarantine(db, fence, input, quarantineId, ABSENT_EVENT_ID, input.effects);
|
|
67
|
+
}
|
|
68
|
+
const binding = requireKnownBinding(db, input.batch.sheetId, row.rowBindingId);
|
|
69
|
+
const matchingCandidateEventId = findMatchingCandidateEventId(db, input, row, binding);
|
|
70
|
+
if (matchingCandidateEventId.kind === LOOKUP_RESULT_KINDS.FOUND) {
|
|
71
|
+
completeObservation(db, input.batch.sheetId, input.observation, presentEventId(matchingCandidateEventId.value), OBSERVATION_COMPLETION_STATES.DUPLICATE);
|
|
72
|
+
return {
|
|
73
|
+
kind: OBSERVATION_WRITE_RESULT_KINDS.DUPLICATE,
|
|
74
|
+
observationId: input.observation.observationId,
|
|
75
|
+
eventId: presentEventId(matchingCandidateEventId.value),
|
|
76
|
+
reason: OBSERVATION_DUPLICATE_REASONS.CANDIDATE,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const eventIdentity = input.event.value;
|
|
80
|
+
const existingEvent = findEventByKey(db, input.batch.sheetId, eventIdentity.eventKey);
|
|
81
|
+
if (existingEvent.kind === LOOKUP_RESULT_KINDS.FOUND) {
|
|
82
|
+
if (existingEvent.value.payload_hash === eventIdentity.payloadHash) {
|
|
83
|
+
completeObservation(db, input.batch.sheetId, input.observation, presentEventId(existingEvent.value.event_id), OBSERVATION_COMPLETION_STATES.DUPLICATE);
|
|
84
|
+
return {
|
|
85
|
+
kind: OBSERVATION_WRITE_RESULT_KINDS.DUPLICATE,
|
|
86
|
+
observationId: input.observation.observationId,
|
|
87
|
+
eventId: presentEventId(existingEvent.value.event_id),
|
|
88
|
+
reason: OBSERVATION_DUPLICATE_REASONS.EVENT,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const quarantineId = persistIntegrityQuarantine(db, input, row, ABSENT_EVENT_ID, OBSERVATION_INTEGRITY_DISCRIMINATORS.EVENT_KEY_PAYLOAD_MISMATCH);
|
|
92
|
+
return completeQuarantine(db, fence, input, quarantineId, ABSENT_EVENT_ID, []);
|
|
93
|
+
}
|
|
94
|
+
const createdEvent = createEvent(db, input, row);
|
|
95
|
+
persistObservedHashes(db, input, row);
|
|
96
|
+
if (input.evaluation.outcome === ROW_OUTCOMES.QUARANTINE) {
|
|
97
|
+
const quarantineId = persistQuarantine(db, input, input.evaluation.quarantine, presentEventId(createdEvent.eventId));
|
|
98
|
+
return completeQuarantine(db, fence, input, quarantineId, presentEventId(createdEvent.eventId), input.effects);
|
|
99
|
+
}
|
|
100
|
+
const canonicalResult = applyCanonicalMutation(db, fence, input, row, binding);
|
|
101
|
+
const conflictIds = persistConflictAttempts(db, input, row, binding, createdEvent.eventId);
|
|
102
|
+
appendAdditionalEffectsOrThrow(db, fence, input.effects);
|
|
103
|
+
const eventStatus = input.evaluation.conflicts.length === EMPTY_ARRAY_LENGTH_ZERO
|
|
104
|
+
? ROW_OUTCOMES.ACCEPTED
|
|
105
|
+
: ROW_OUTCOMES.CONFLICT;
|
|
106
|
+
const statusResult = db.prepare(UPDATE_EVENT_STATUS_SQL)
|
|
107
|
+
.run(eventStatus, createdEvent.eventId);
|
|
108
|
+
if (statusResult.changes !== EXPECTED_SINGLE_ROW_CHANGE_COUNT) {
|
|
109
|
+
throw new StorageError(STORAGE_ERROR_CODES.OBSERVATION_STORAGE_INCONSISTENT, `could not complete event ${createdEvent.eventId}`);
|
|
110
|
+
}
|
|
111
|
+
completeObservation(db, input.batch.sheetId, input.observation, presentEventId(createdEvent.eventId), OBSERVATION_COMPLETION_STATES.EVALUATED);
|
|
112
|
+
const entityRevision = canonicalResult.kind === PRESENCE_KINDS.PRESENT
|
|
113
|
+
? { kind: APPLICABILITY_KINDS.APPLICABLE, value: canonicalResult.value.entityRevision }
|
|
114
|
+
: { kind: APPLICABILITY_KINDS.NOT_APPLICABLE };
|
|
115
|
+
return {
|
|
116
|
+
kind: OBSERVATION_WRITE_RESULT_KINDS.PERSISTED,
|
|
117
|
+
observationId: input.observation.observationId,
|
|
118
|
+
eventId: createdEvent.eventId,
|
|
119
|
+
eventSequence: createdEvent.eventSequence,
|
|
120
|
+
outcome: requirePersistedOutcome(input.evaluation),
|
|
121
|
+
entityRevision,
|
|
122
|
+
conflictIds,
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (error instanceof FenceLostError) {
|
|
128
|
+
return { kind: OBSERVATION_WRITE_RESULT_KINDS.FENCED_OUT };
|
|
129
|
+
}
|
|
130
|
+
if (error instanceof CanonicalStaleError) {
|
|
131
|
+
return { kind: OBSERVATION_WRITE_RESULT_KINDS.STALE };
|
|
132
|
+
}
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Persists one normalized row outcome inside an already-active async SQL
|
|
138
|
+
* transaction. It mirrors the legacy writer semantics while allowing the
|
|
139
|
+
* caller to keep a user entity mutation and its sync records atomic.
|
|
140
|
+
*/
|
|
141
|
+
export async function persistObservedRowWithSql(sql, fence, input) {
|
|
142
|
+
validatePersistObservedRowInput(input);
|
|
143
|
+
if (!(await isFencingValidWithSql(sql, fence))) {
|
|
144
|
+
return { kind: OBSERVATION_WRITE_RESULT_KINDS.FENCED_OUT };
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
return await withSqlSavepoint(sql, "persist_observed_row", async () => {
|
|
148
|
+
await assertCurrentFenceWithSql(sql, fence);
|
|
149
|
+
const row = requireBatchRow(input.batch, input.rowIndex);
|
|
150
|
+
await ensureRegisteredProjectionWithSql(sql, input.batch, input.physicalSheetId);
|
|
151
|
+
await ensureEffectsTargetRegisteredWithSql(sql, input.batch.sheetId, input.effects);
|
|
152
|
+
if (input.canonical.kind === PRESENCE_KINDS.PRESENT) {
|
|
153
|
+
await ensureEffectsTargetRegisteredWithSql(sql, input.batch.sheetId, input.canonical.value.commit.effects);
|
|
154
|
+
}
|
|
155
|
+
const observation = await appendObservationWithSql(sql, input.batch, input.physicalSheetId, input.observation);
|
|
156
|
+
if (observation.kind === OBSERVATION_APPEND_RESULT_KINDS.DUPLICATE) {
|
|
157
|
+
return {
|
|
158
|
+
kind: OBSERVATION_WRITE_RESULT_KINDS.DUPLICATE,
|
|
159
|
+
observationId: input.observation.observationId,
|
|
160
|
+
eventId: observation.eventId,
|
|
161
|
+
reason: OBSERVATION_DUPLICATE_REASONS.OBSERVATION,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
if (observation.kind === OBSERVATION_APPEND_RESULT_KINDS.INTEGRITY_COLLISION) {
|
|
165
|
+
const quarantineId = await persistIntegrityQuarantineWithSql(sql, input, row, ABSENT_EVENT_ID, OBSERVATION_INTEGRITY_DISCRIMINATORS.OBSERVATION_KEY_PAYLOAD_MISMATCH);
|
|
166
|
+
return completeQuarantineWithSql(sql, fence, input, quarantineId, ABSENT_EVENT_ID, []);
|
|
167
|
+
}
|
|
168
|
+
if (input.event.kind === PRESENCE_KINDS.ABSENT) {
|
|
169
|
+
if (input.evaluation.outcome !== ROW_OUTCOMES.QUARANTINE) {
|
|
170
|
+
throw new StorageError(STORAGE_ERROR_CODES.INVALID_OBSERVATION_INPUT, "an unresolved observation must have a core quarantine plan");
|
|
171
|
+
}
|
|
172
|
+
const quarantineId = await persistQuarantineWithSql(sql, input, input.evaluation.quarantine, ABSENT_EVENT_ID);
|
|
173
|
+
return completeQuarantineWithSql(sql, fence, input, quarantineId, ABSENT_EVENT_ID, input.effects);
|
|
174
|
+
}
|
|
175
|
+
const binding = await requireKnownBindingWithSql(sql, input.batch.sheetId, row.rowBindingId);
|
|
176
|
+
const matchingCandidateEventId = await findMatchingCandidateEventIdWithSql(sql, input, row, binding);
|
|
177
|
+
if (matchingCandidateEventId.kind === LOOKUP_RESULT_KINDS.FOUND) {
|
|
178
|
+
await completeObservationWithSql(sql, input.batch.sheetId, input.observation, presentEventId(matchingCandidateEventId.value), OBSERVATION_COMPLETION_STATES.DUPLICATE);
|
|
179
|
+
return {
|
|
180
|
+
kind: OBSERVATION_WRITE_RESULT_KINDS.DUPLICATE,
|
|
181
|
+
observationId: input.observation.observationId,
|
|
182
|
+
eventId: presentEventId(matchingCandidateEventId.value),
|
|
183
|
+
reason: OBSERVATION_DUPLICATE_REASONS.CANDIDATE,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
const eventIdentity = input.event.value;
|
|
187
|
+
const existingEvent = await findEventByKeyWithSql(sql, input.batch.sheetId, eventIdentity.eventKey);
|
|
188
|
+
if (existingEvent.kind === LOOKUP_RESULT_KINDS.FOUND) {
|
|
189
|
+
if (existingEvent.value.payload_hash === eventIdentity.payloadHash) {
|
|
190
|
+
await completeObservationWithSql(sql, input.batch.sheetId, input.observation, presentEventId(existingEvent.value.event_id), OBSERVATION_COMPLETION_STATES.DUPLICATE);
|
|
191
|
+
return {
|
|
192
|
+
kind: OBSERVATION_WRITE_RESULT_KINDS.DUPLICATE,
|
|
193
|
+
observationId: input.observation.observationId,
|
|
194
|
+
eventId: presentEventId(existingEvent.value.event_id),
|
|
195
|
+
reason: OBSERVATION_DUPLICATE_REASONS.EVENT,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
const quarantineId = await persistIntegrityQuarantineWithSql(sql, input, row, ABSENT_EVENT_ID, OBSERVATION_INTEGRITY_DISCRIMINATORS.EVENT_KEY_PAYLOAD_MISMATCH);
|
|
199
|
+
return completeQuarantineWithSql(sql, fence, input, quarantineId, ABSENT_EVENT_ID, []);
|
|
200
|
+
}
|
|
201
|
+
const createdEvent = await createEventWithSql(sql, input, row);
|
|
202
|
+
await persistObservedHashesWithSql(sql, input, row);
|
|
203
|
+
if (input.evaluation.outcome === ROW_OUTCOMES.QUARANTINE) {
|
|
204
|
+
const quarantineId = await persistQuarantineWithSql(sql, input, input.evaluation.quarantine, presentEventId(createdEvent.eventId));
|
|
205
|
+
return completeQuarantineWithSql(sql, fence, input, quarantineId, presentEventId(createdEvent.eventId), input.effects);
|
|
206
|
+
}
|
|
207
|
+
const canonicalResult = await applyCanonicalMutationWithSql(sql, fence, input, row, binding);
|
|
208
|
+
const conflictIds = await persistConflictAttemptsWithSql(sql, input, row, binding, createdEvent.eventId);
|
|
209
|
+
await appendAdditionalEffectsOrThrowWithSql(sql, fence, input.effects);
|
|
210
|
+
const eventStatus = input.evaluation.conflicts.length === EMPTY_ARRAY_LENGTH_ZERO
|
|
211
|
+
? ROW_OUTCOMES.ACCEPTED
|
|
212
|
+
: ROW_OUTCOMES.CONFLICT;
|
|
213
|
+
const statusResult = await sql.run(UPDATE_EVENT_STATUS_SQL, [
|
|
214
|
+
eventStatus,
|
|
215
|
+
createdEvent.eventId,
|
|
216
|
+
]);
|
|
217
|
+
if (statusResult.changes !== EXPECTED_SINGLE_ROW_CHANGE_COUNT) {
|
|
218
|
+
throw new StorageError(STORAGE_ERROR_CODES.OBSERVATION_STORAGE_INCONSISTENT, `could not complete event ${createdEvent.eventId}`);
|
|
219
|
+
}
|
|
220
|
+
await completeObservationWithSql(sql, input.batch.sheetId, input.observation, presentEventId(createdEvent.eventId), OBSERVATION_COMPLETION_STATES.EVALUATED);
|
|
221
|
+
const entityRevision = canonicalResult.kind === PRESENCE_KINDS.PRESENT
|
|
222
|
+
? { kind: APPLICABILITY_KINDS.APPLICABLE, value: canonicalResult.value.entityRevision }
|
|
223
|
+
: { kind: APPLICABILITY_KINDS.NOT_APPLICABLE };
|
|
224
|
+
return {
|
|
225
|
+
kind: OBSERVATION_WRITE_RESULT_KINDS.PERSISTED,
|
|
226
|
+
observationId: input.observation.observationId,
|
|
227
|
+
eventId: createdEvent.eventId,
|
|
228
|
+
eventSequence: createdEvent.eventSequence,
|
|
229
|
+
outcome: requirePersistedOutcome(input.evaluation),
|
|
230
|
+
entityRevision,
|
|
231
|
+
conflictIds,
|
|
232
|
+
};
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (error instanceof FenceLostError) {
|
|
237
|
+
return { kind: OBSERVATION_WRITE_RESULT_KINDS.FENCED_OUT };
|
|
238
|
+
}
|
|
239
|
+
if (error instanceof CanonicalStaleError) {
|
|
240
|
+
return { kind: OBSERVATION_WRITE_RESULT_KINDS.STALE };
|
|
241
|
+
}
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/** Persists one observed row in an adapter-owned transaction. */
|
|
246
|
+
export async function persistObservedRowWithAdapter(storage, fence, input) {
|
|
247
|
+
return storage.transaction(({ sql }) => persistObservedRowWithSql(sql, fence, input));
|
|
248
|
+
}
|
|
249
|
+
/** Persists the remaining effects and closes a quarantined observation receipt. */
|
|
250
|
+
function completeQuarantine(db, fence, input, quarantineId, eventId, effects) {
|
|
251
|
+
appendAdditionalEffectsOrThrow(db, fence, effects);
|
|
252
|
+
completeObservation(db, input.batch.sheetId, input.observation, eventId, OBSERVATION_COMPLETION_STATES.QUARANTINED);
|
|
253
|
+
return {
|
|
254
|
+
kind: OBSERVATION_WRITE_RESULT_KINDS.QUARANTINED,
|
|
255
|
+
observationId: input.observation.observationId,
|
|
256
|
+
eventId,
|
|
257
|
+
quarantineId,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/** Appends quarantine effects and closes the receipt through active async SQL. */
|
|
261
|
+
async function completeQuarantineWithSql(sql, fence, input, quarantineId, eventId, effects) {
|
|
262
|
+
await appendAdditionalEffectsOrThrowWithSql(sql, fence, effects);
|
|
263
|
+
await completeObservationWithSql(sql, input.batch.sheetId, input.observation, eventId, OBSERVATION_COMPLETION_STATES.QUARANTINED);
|
|
264
|
+
return {
|
|
265
|
+
kind: OBSERVATION_WRITE_RESULT_KINDS.QUARANTINED,
|
|
266
|
+
observationId: input.observation.observationId,
|
|
267
|
+
eventId,
|
|
268
|
+
quarantineId,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function appendAdditionalEffectsOrThrow(db, fence, effects) {
|
|
272
|
+
if (!appendPendingEffects(db, fence, effects))
|
|
273
|
+
throw new FenceLostError();
|
|
274
|
+
}
|
|
275
|
+
/** Appends additional effects through active async SQL or signals a lost fence. */
|
|
276
|
+
async function appendAdditionalEffectsOrThrowWithSql(sql, fence, effects) {
|
|
277
|
+
if (!(await appendPendingEffectsWithSql(sql, fence, effects)))
|
|
278
|
+
throw new FenceLostError();
|
|
279
|
+
}
|
|
280
|
+
/** Wraps a newly created event ID in the storage presence contract. */
|
|
281
|
+
function presentEventId(eventId) {
|
|
282
|
+
return { kind: PRESENCE_KINDS.PRESENT, value: eventId };
|
|
283
|
+
}
|
|
284
|
+
function assertCurrentFence(db, fence) {
|
|
285
|
+
if (!isFencingValid(db, fence))
|
|
286
|
+
throw new FenceLostError();
|
|
287
|
+
}
|
|
288
|
+
/** Requires the writer fence to remain current within the active async transaction. */
|
|
289
|
+
async function assertCurrentFenceWithSql(sql, fence) {
|
|
290
|
+
if (!(await isFencingValidWithSql(sql, fence)))
|
|
291
|
+
throw new FenceLostError();
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=observationWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observationWriter.js","sourceRoot":"","sources":["../../../../../src/infrastructure/storage/state/observation/observationWriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw snapshot-ingestion ledger for the read-only Sheet integration phase.
|
|
3
|
+
*
|
|
4
|
+
* It persists authenticated snapshot evidence without creating a canonical
|
|
5
|
+
* event or a Sheet effect. Later evaluator work can consume the pending
|
|
6
|
+
* observation receipt; a no-write shadow pass therefore never becomes a
|
|
7
|
+
* hidden projection writer.
|
|
8
|
+
*/
|
|
9
|
+
import { type DatabaseSyncLike } from "../../sqlite/sqliteBridge.js";
|
|
10
|
+
import { type FencingContext } from "../../sync/shared/writerLease.js";
|
|
11
|
+
import type { Presence } from "../../../../shared/state/types.js";
|
|
12
|
+
import type { SqlExecutor, SqlStorageAdapter } from "../../../../adapter/persistence/contracts/sql.js";
|
|
13
|
+
/** One normalized snapshot evidence record captured from a registered projection. */
|
|
14
|
+
export interface ReadOnlySnapshotObservationInput {
|
|
15
|
+
readonly observationId: string;
|
|
16
|
+
readonly physicalSheetId: string;
|
|
17
|
+
readonly logicalSheetId: string;
|
|
18
|
+
readonly observationKey: string;
|
|
19
|
+
readonly payloadJson: string;
|
|
20
|
+
readonly payloadHash: string;
|
|
21
|
+
readonly source: "polling" | "onEdit";
|
|
22
|
+
readonly detectedAt: number;
|
|
23
|
+
readonly receivedAt: number;
|
|
24
|
+
readonly ingressActorId: string;
|
|
25
|
+
readonly editorActorId: Presence<string>;
|
|
26
|
+
readonly editorActorSource: "google_active_user" | "unavailable";
|
|
27
|
+
}
|
|
28
|
+
/** Durable outcome of appending raw, not-yet-evaluated snapshot evidence. */
|
|
29
|
+
export type ReadOnlySnapshotObservationResult = {
|
|
30
|
+
readonly kind: "fenced_out";
|
|
31
|
+
} | {
|
|
32
|
+
readonly kind: "captured";
|
|
33
|
+
readonly observationId: string;
|
|
34
|
+
} | {
|
|
35
|
+
readonly kind: "duplicate";
|
|
36
|
+
readonly observationId: string;
|
|
37
|
+
} | {
|
|
38
|
+
readonly kind: "integrity_collision";
|
|
39
|
+
readonly observationId: string;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Appends a snapshot occurrence and maintains its representative receipt.
|
|
43
|
+
*
|
|
44
|
+
* The same observation key/payload is retained as another occurrence for
|
|
45
|
+
* audit; a different payload under the same key is never silently deduped.
|
|
46
|
+
*/
|
|
47
|
+
export declare function persistReadOnlySnapshotObservation(db: DatabaseSyncLike, fence: FencingContext, input: ReadOnlySnapshotObservationInput): ReadOnlySnapshotObservationResult;
|
|
48
|
+
/**
|
|
49
|
+
* Persists raw Sheet observation evidence through the active async adapter.
|
|
50
|
+
*
|
|
51
|
+
* This keeps the observation receipt and event-evidence insert in the same
|
|
52
|
+
* adapter transaction used by the MikroORM-backed runtime. It does not
|
|
53
|
+
* evaluate a user edit or create a projection effect.
|
|
54
|
+
*/
|
|
55
|
+
export declare function persistReadOnlySnapshotObservationWithAdapter(storage: SqlStorageAdapter, fence: FencingContext, input: ReadOnlySnapshotObservationInput): Promise<ReadOnlySnapshotObservationResult>;
|
|
56
|
+
/** Persists one raw observation occurrence inside an existing SQL transaction. */
|
|
57
|
+
export declare function persistReadOnlySnapshotObservationWithSql(sql: SqlExecutor, fence: FencingContext, input: ReadOnlySnapshotObservationInput): Promise<ReadOnlySnapshotObservationResult>;
|
|
58
|
+
//# sourceMappingURL=readOnlyObservation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readOnlyObservation.d.ts","sourceRoot":"","sources":["../../../../../src/infrastructure/storage/state/readonly/readOnlyObservation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA4B,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE/F,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AAqCvG,qFAAqF;AACrF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,iBAAiB,EAAE,oBAAoB,GAAG,aAAa,CAAC;CAClE;AAED,6EAA6E;AAC7E,MAAM,MAAM,iCAAiC,GACzC;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAChD,EAAE,EAAE,gBAAgB,EACpB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,gCAAgC,GACtC,iCAAiC,CA8CnC;AAED;;;;;;GAMG;AACH,wBAAsB,6CAA6C,CACjE,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,iCAAiC,CAAC,CAK5C;AAED,kFAAkF;AAClF,wBAAsB,yCAAyC,CAC7D,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,iCAAiC,CAAC,CAoD5C"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw snapshot-ingestion ledger for the read-only Sheet integration phase.
|
|
3
|
+
*
|
|
4
|
+
* It persists authenticated snapshot evidence without creating a canonical
|
|
5
|
+
* event or a Sheet effect. Later evaluator work can consume the pending
|
|
6
|
+
* observation receipt; a no-write shadow pass therefore never becomes a
|
|
7
|
+
* hidden projection writer.
|
|
8
|
+
*/
|
|
9
|
+
import { withImmediateTransaction } from "../../sqlite/sqliteBridge.js";
|
|
10
|
+
import { STORAGE_ERROR_CODES, StorageError } from "../../errors.js";
|
|
11
|
+
import { isFencingValid, isFencingValidWithAdapter, isFencingValidWithSql, } from "../../sync/shared/writerLease.js";
|
|
12
|
+
import { withSqlSavepoint } from "../../sqlite/sqlTransaction.js";
|
|
13
|
+
import { PRESENCE_KINDS } from "../../../../shared/state/constants.js";
|
|
14
|
+
const READ_OBSERVATION_RECEIPT_SQL = `
|
|
15
|
+
SELECT representative_payload_hash, event_id
|
|
16
|
+
FROM observation_receipt
|
|
17
|
+
WHERE logical_sheet_id = ? AND observation_key = ?
|
|
18
|
+
`;
|
|
19
|
+
const INSERT_EVENT_OBSERVATION_SQL = `
|
|
20
|
+
INSERT INTO event_observation (
|
|
21
|
+
observation_id, logical_sheet_id, physical_sheet_id, observation_key, event_id,
|
|
22
|
+
source, payload_json, payload_hash, detected_at, received_at, ingress_actor_id,
|
|
23
|
+
editor_actor_id, editor_actor_source
|
|
24
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
25
|
+
`;
|
|
26
|
+
const INSERT_OBSERVATION_RECEIPT_SQL = `
|
|
27
|
+
INSERT INTO observation_receipt (
|
|
28
|
+
logical_sheet_id, observation_key, representative_payload_hash,
|
|
29
|
+
first_observation_id, last_observation_id, event_id, state,
|
|
30
|
+
first_seen_at, last_seen_at
|
|
31
|
+
) VALUES (?, ?, ?, ?, ?, NULL, 'pending', ?, ?)
|
|
32
|
+
`;
|
|
33
|
+
const UPDATE_OBSERVATION_RECEIPT_SQL = `
|
|
34
|
+
UPDATE observation_receipt SET last_observation_id = ?, last_seen_at = ?
|
|
35
|
+
WHERE logical_sheet_id = ? AND observation_key = ?
|
|
36
|
+
`;
|
|
37
|
+
const READ_REGISTERED_OBSERVATION_TARGET_SQL = `
|
|
38
|
+
SELECT physical.enabled AS physical_enabled, physical.logical_sheet_id,
|
|
39
|
+
logical.enabled AS logical_enabled
|
|
40
|
+
FROM physical_sheet_registry AS physical
|
|
41
|
+
JOIN sheet_registry AS logical ON logical.sheet_id = physical.logical_sheet_id
|
|
42
|
+
WHERE physical.physical_sheet_id = ?
|
|
43
|
+
`;
|
|
44
|
+
/**
|
|
45
|
+
* Appends a snapshot occurrence and maintains its representative receipt.
|
|
46
|
+
*
|
|
47
|
+
* The same observation key/payload is retained as another occurrence for
|
|
48
|
+
* audit; a different payload under the same key is never silently deduped.
|
|
49
|
+
*/
|
|
50
|
+
export function persistReadOnlySnapshotObservation(db, fence, input) {
|
|
51
|
+
validateInput(input);
|
|
52
|
+
if (!isFencingValid(db, fence))
|
|
53
|
+
return { kind: "fenced_out" };
|
|
54
|
+
return withImmediateTransaction(db, () => {
|
|
55
|
+
if (!isFencingValid(db, fence))
|
|
56
|
+
return { kind: "fenced_out" };
|
|
57
|
+
ensureRegisteredTarget(db, input);
|
|
58
|
+
const receipt = db.prepare(READ_OBSERVATION_RECEIPT_SQL)
|
|
59
|
+
.get(input.logicalSheetId, input.observationKey);
|
|
60
|
+
const kind = receipt === undefined
|
|
61
|
+
? "captured"
|
|
62
|
+
: receipt.representative_payload_hash === input.payloadHash
|
|
63
|
+
? "duplicate"
|
|
64
|
+
: "integrity_collision";
|
|
65
|
+
db.prepare(INSERT_EVENT_OBSERVATION_SQL).run(input.observationId, input.logicalSheetId, input.physicalSheetId, input.observationKey, receipt?.event_id ?? null, input.source, input.payloadJson, input.payloadHash, input.detectedAt, input.receivedAt, input.ingressActorId, input.editorActorId.kind === PRESENCE_KINDS.PRESENT
|
|
66
|
+
? input.editorActorId.value
|
|
67
|
+
: null, input.editorActorSource);
|
|
68
|
+
if (receipt === undefined) {
|
|
69
|
+
db.prepare(INSERT_OBSERVATION_RECEIPT_SQL).run(input.logicalSheetId, input.observationKey, input.payloadHash, input.observationId, input.observationId, input.receivedAt, input.receivedAt);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
db.prepare(UPDATE_OBSERVATION_RECEIPT_SQL)
|
|
73
|
+
.run(input.observationId, input.receivedAt, input.logicalSheetId, input.observationKey);
|
|
74
|
+
}
|
|
75
|
+
return { kind, observationId: input.observationId };
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Persists raw Sheet observation evidence through the active async adapter.
|
|
80
|
+
*
|
|
81
|
+
* This keeps the observation receipt and event-evidence insert in the same
|
|
82
|
+
* adapter transaction used by the MikroORM-backed runtime. It does not
|
|
83
|
+
* evaluate a user edit or create a projection effect.
|
|
84
|
+
*/
|
|
85
|
+
export async function persistReadOnlySnapshotObservationWithAdapter(storage, fence, input) {
|
|
86
|
+
validateInput(input);
|
|
87
|
+
if (!(await isFencingValidWithAdapter(storage, fence)))
|
|
88
|
+
return { kind: "fenced_out" };
|
|
89
|
+
return storage.transaction(({ sql }) => persistReadOnlySnapshotObservationWithSql(sql, fence, input));
|
|
90
|
+
}
|
|
91
|
+
/** Persists one raw observation occurrence inside an existing SQL transaction. */
|
|
92
|
+
export async function persistReadOnlySnapshotObservationWithSql(sql, fence, input) {
|
|
93
|
+
validateInput(input);
|
|
94
|
+
if (!(await isFencingValidWithSql(sql, fence)))
|
|
95
|
+
return { kind: "fenced_out" };
|
|
96
|
+
return withSqlSavepoint(sql, "persist_read_only_observation", async () => {
|
|
97
|
+
if (!(await isFencingValidWithSql(sql, fence)))
|
|
98
|
+
return { kind: "fenced_out" };
|
|
99
|
+
await ensureRegisteredTargetWithSql(sql, input);
|
|
100
|
+
const receipt = await sql.get(READ_OBSERVATION_RECEIPT_SQL, [
|
|
101
|
+
input.logicalSheetId,
|
|
102
|
+
input.observationKey,
|
|
103
|
+
]);
|
|
104
|
+
const kind = receipt === undefined
|
|
105
|
+
? "captured"
|
|
106
|
+
: receipt.representative_payload_hash === input.payloadHash
|
|
107
|
+
? "duplicate"
|
|
108
|
+
: "integrity_collision";
|
|
109
|
+
await sql.run(INSERT_EVENT_OBSERVATION_SQL, [
|
|
110
|
+
input.observationId,
|
|
111
|
+
input.logicalSheetId,
|
|
112
|
+
input.physicalSheetId,
|
|
113
|
+
input.observationKey,
|
|
114
|
+
receipt?.event_id ?? null,
|
|
115
|
+
input.source,
|
|
116
|
+
input.payloadJson,
|
|
117
|
+
input.payloadHash,
|
|
118
|
+
input.detectedAt,
|
|
119
|
+
input.receivedAt,
|
|
120
|
+
input.ingressActorId,
|
|
121
|
+
input.editorActorId.kind === PRESENCE_KINDS.PRESENT
|
|
122
|
+
? input.editorActorId.value
|
|
123
|
+
: null,
|
|
124
|
+
input.editorActorSource,
|
|
125
|
+
]);
|
|
126
|
+
if (receipt === undefined) {
|
|
127
|
+
await sql.run(INSERT_OBSERVATION_RECEIPT_SQL, [
|
|
128
|
+
input.logicalSheetId,
|
|
129
|
+
input.observationKey,
|
|
130
|
+
input.payloadHash,
|
|
131
|
+
input.observationId,
|
|
132
|
+
input.observationId,
|
|
133
|
+
input.receivedAt,
|
|
134
|
+
input.receivedAt,
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
await sql.run(UPDATE_OBSERVATION_RECEIPT_SQL, [
|
|
139
|
+
input.observationId,
|
|
140
|
+
input.receivedAt,
|
|
141
|
+
input.logicalSheetId,
|
|
142
|
+
input.observationKey,
|
|
143
|
+
]);
|
|
144
|
+
}
|
|
145
|
+
return { kind, observationId: input.observationId };
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
function ensureRegisteredTarget(db, input) {
|
|
149
|
+
const row = db.prepare(READ_REGISTERED_OBSERVATION_TARGET_SQL)
|
|
150
|
+
.get(input.physicalSheetId);
|
|
151
|
+
if (row === undefined || row.physical_enabled !== 1 || row.logical_enabled !== 1 ||
|
|
152
|
+
row.logical_sheet_id !== input.logicalSheetId) {
|
|
153
|
+
throw new StorageError(STORAGE_ERROR_CODES.SYNC_REGISTRY_TARGET_UNAVAILABLE, "read-only snapshot target is not an enabled registered projection");
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function ensureRegisteredTargetWithSql(sql, input) {
|
|
157
|
+
const row = await sql.get(READ_REGISTERED_OBSERVATION_TARGET_SQL, [input.physicalSheetId]);
|
|
158
|
+
if (row === undefined || row.physical_enabled !== 1 || row.logical_enabled !== 1 ||
|
|
159
|
+
row.logical_sheet_id !== input.logicalSheetId) {
|
|
160
|
+
throw new StorageError(STORAGE_ERROR_CODES.SYNC_REGISTRY_TARGET_UNAVAILABLE, "read-only snapshot target is not an enabled registered projection");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function validateInput(input) {
|
|
164
|
+
for (const [label, value] of [
|
|
165
|
+
["observation ID", input.observationId],
|
|
166
|
+
["physical sheet ID", input.physicalSheetId],
|
|
167
|
+
["logical sheet ID", input.logicalSheetId],
|
|
168
|
+
["observation key", input.observationKey],
|
|
169
|
+
["payload JSON", input.payloadJson],
|
|
170
|
+
["payload hash", input.payloadHash],
|
|
171
|
+
["ingress actor ID", input.ingressActorId],
|
|
172
|
+
]) {
|
|
173
|
+
if (value.length === 0) {
|
|
174
|
+
throw new StorageError(STORAGE_ERROR_CODES.INVALID_READ_ONLY_OBSERVATION, label + " is required");
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (input.source !== "polling" && input.source !== "onEdit") {
|
|
178
|
+
throw new StorageError(STORAGE_ERROR_CODES.INVALID_READ_ONLY_OBSERVATION, "invalid observation source");
|
|
179
|
+
}
|
|
180
|
+
for (const [label, value] of [["detectedAt", input.detectedAt], ["receivedAt", input.receivedAt]]) {
|
|
181
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
182
|
+
throw new StorageError(STORAGE_ERROR_CODES.INVALID_READ_ONLY_OBSERVATION, label + " must be a non-negative safe integer");
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (input.editorActorSource === "google_active_user" &&
|
|
186
|
+
(input.editorActorId.kind !== PRESENCE_KINDS.PRESENT ||
|
|
187
|
+
input.editorActorId.value.length === 0)) {
|
|
188
|
+
throw new StorageError(STORAGE_ERROR_CODES.INVALID_READ_ONLY_OBSERVATION, "verified editor source requires an editor actor ID");
|
|
189
|
+
}
|
|
190
|
+
if (input.editorActorSource === "unavailable" &&
|
|
191
|
+
input.editorActorId.kind === PRESENCE_KINDS.PRESENT) {
|
|
192
|
+
throw new StorageError(STORAGE_ERROR_CODES.INVALID_READ_ONLY_OBSERVATION, "unavailable editor source cannot include an editor actor ID");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=readOnlyObservation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readOnlyObservation.js","sourceRoot":"","sources":["../../../../../src/infrastructure/storage/state/readonly/readOnlyObservation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable, fenced storage mapping for trusted conflict-resolution commands.
|
|
3
|
+
*
|
|
4
|
+
* The pure core decides whether an acknowledgement is resolved, stale, or
|
|
5
|
+
* rejected. This module records that decision with the command receipt,
|
|
6
|
+
* clears only the currently active candidate pointer, and queues any
|
|
7
|
+
* resolution projection effect in one SQLite transaction.
|
|
8
|
+
*/
|
|
9
|
+
import { type DatabaseSyncLike } from "../../sqlite/sqliteBridge.js";
|
|
10
|
+
import { type FencingContext } from "../../sync/shared/writerLease.js";
|
|
11
|
+
import type { SqlExecutor, SqlStorageAdapter } from "../../../../adapter/persistence/contracts/sql.js";
|
|
12
|
+
import type { PersistResolutionCommandInput, PersistResolutionCommandResult } from "./resolutionWriterContracts.js";
|
|
13
|
+
export { PERSIST_RESOLUTION_RESULT_KINDS, RESOLUTION_COMMAND_STATUSES, } from "./resolutionWriterContracts.js";
|
|
14
|
+
export type { PersistResolutionCommandInput, PersistResolutionCommandResult, } from "./resolutionWriterContracts.js";
|
|
15
|
+
/**
|
|
16
|
+
* Persists a resolution command at the writer-RPC boundary.
|
|
17
|
+
*
|
|
18
|
+
* An old command is stale unless the target conflict is still the active
|
|
19
|
+
* candidate pointer for its field. That extra pointer check closes the
|
|
20
|
+
* storage-level ABA gap that a historical conflict row alone cannot detect.
|
|
21
|
+
*/
|
|
22
|
+
export declare function persistResolutionCommand(db: DatabaseSyncLike, fence: FencingContext, input: PersistResolutionCommandInput): PersistResolutionCommandResult;
|
|
23
|
+
/**
|
|
24
|
+
* Persists one trusted resolution command through an already-active async SQL
|
|
25
|
+
* transaction. A command receipt, its conflict transition, and any effects
|
|
26
|
+
* remain atomic with an ORM-managed user-entity mutation.
|
|
27
|
+
*/
|
|
28
|
+
export declare function persistResolutionCommandWithSql(sql: SqlExecutor, fence: FencingContext, input: PersistResolutionCommandInput): Promise<PersistResolutionCommandResult>;
|
|
29
|
+
/** Persists one resolution command in an adapter-owned transaction. */
|
|
30
|
+
export declare function persistResolutionCommandWithAdapter(storage: SqlStorageAdapter, fence: FencingContext, input: PersistResolutionCommandInput): Promise<PersistResolutionCommandResult>;
|
|
31
|
+
//# sourceMappingURL=resolutionWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolutionWriter.d.ts","sourceRoot":"","sources":["../../../../../src/infrastructure/storage/state/resolution/resolutionWriter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH,OAAO,EAA4B,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE/F,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AAKvG,OAAO,KAAK,EAKV,6BAA6B,EAC7B,8BAA8B,EAE/B,MAAM,gCAAgC,CAAC;AA0BxC,OAAO,EACL,+BAA+B,EAC/B,2BAA2B,GAC5B,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,gCAAgC,CAAC;AAIxC;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,gBAAgB,EACpB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,6BAA6B,GACnC,8BAA8B,CA0EhC;AAED;;;;GAIG;AACH,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,8BAA8B,CAAC,CA8EzC;AAED,uEAAuE;AACvE,wBAAsB,mCAAmC,CACvD,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,8BAA8B,CAAC,CAEzC"}
|