@abloatai/ablo 0.34.0 → 0.35.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/AGENTS.md +4 -1
- package/CHANGELOG.md +684 -5
- package/README.md +39 -22
- package/dist/BaseSyncedStore.d.ts +152 -44
- package/dist/BaseSyncedStore.js +300 -184
- package/dist/Database.d.ts +9 -24
- package/dist/Database.js +37 -22
- package/dist/InstanceCache.d.ts +25 -4
- package/dist/InstanceCache.js +48 -15
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +6 -6
- package/dist/Model.js +10 -10
- package/dist/ModelRegistry.d.ts +4 -4
- package/dist/ModelRegistry.js +3 -3
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +42 -32
- package/dist/SyncClient.js +166 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
- package/dist/ai-sdk/coordinatedTool.js +1 -1
- package/dist/ai-sdk/coordinationContext.d.ts +2 -2
- package/dist/ai-sdk/coordinationContext.js +1 -1
- package/dist/ai-sdk/wrap.d.ts +3 -3
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/index.d.ts +1 -156
- package/dist/auth/index.js +8 -301
- package/dist/cli.cjs +3459 -1126
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +118 -963
- package/dist/client/abloClient.d.ts +309 -0
- package/dist/client/abloClient.js +13 -0
- package/dist/client/clientPrelude.d.ts +52 -0
- package/dist/client/clientPrelude.js +60 -0
- package/dist/client/consoleLogger.d.ts +2 -2
- package/dist/client/coreClient.d.ts +60 -0
- package/dist/client/coreClient.js +118 -0
- package/dist/client/createInternalComponents.d.ts +4 -4
- package/dist/client/createInternalComponents.js +9 -8
- package/dist/client/createModelProxy.d.ts +78 -373
- package/dist/client/createModelProxy.js +114 -86
- package/dist/client/humans.d.ts +48 -0
- package/dist/client/humans.js +52 -0
- package/dist/client/modelRegistration.d.ts +1 -1
- package/dist/client/modelRegistration.js +9 -9
- package/dist/client/options.d.ts +73 -17
- package/dist/client/reactiveEngine.d.ts +48 -0
- package/dist/client/reactiveEngine.js +910 -0
- package/dist/client/resourceTypes.d.ts +9 -250
- package/dist/client/resourceTypes.js +8 -5
- package/dist/client/schemaConfig.d.ts +4 -4
- package/dist/client/schemaConfig.js +6 -2
- package/dist/client/validateAbloOptions.d.ts +3 -2
- package/dist/client/validateAbloOptions.js +1 -1
- package/dist/client/wsMutationExecutor.d.ts +3 -3
- package/dist/client/wsMutationExecutor.js +3 -3
- package/dist/context.d.ts +9 -9
- package/dist/context.js +10 -9
- package/dist/coordination/ClaimLog.d.ts +26 -0
- package/dist/coordination/ClaimLog.js +32 -0
- package/dist/coordination/index.d.ts +1 -15
- package/dist/coordination/index.js +8 -31
- package/dist/core/DatabaseManager.js +1 -1
- package/dist/core/QueryView.d.ts +1 -1
- package/dist/core/QueryView.js +1 -1
- package/dist/core/StoreManager.d.ts +4 -23
- package/dist/core/StoreManager.js +5 -55
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +2 -2
- package/dist/core/storeContract.d.ts +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +227 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +10 -0
- package/dist/environment.d.ts +1 -40
- package/dist/environment.js +8 -37
- package/dist/index.d.ts +40 -34
- package/dist/index.js +26 -20
- package/dist/interfaces/index.d.ts +44 -134
- package/dist/keys/index.d.ts +1 -77
- package/dist/keys/index.js +8 -190
- package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
- package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
- package/dist/mutators/Transaction.d.ts +1 -1
- package/dist/mutators/Transaction.js +1 -1
- package/dist/mutators/UndoManager.d.ts +6 -6
- package/dist/mutators/UndoManager.js +5 -5
- package/dist/mutators/defineMutators.d.ts +3 -3
- package/dist/mutators/defineMutators.js +1 -1
- package/dist/mutators/inverseOp.js +2 -2
- package/dist/mutators/mutateActions.d.ts +3 -3
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +1 -1
- package/dist/mutators/undoApply.d.ts +1 -1
- package/dist/mutators/undoApply.js +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/query/client.d.ts +2 -2
- package/dist/query/client.js +4 -4
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +6 -8
- package/dist/react/AbloProvider.js +5 -7
- package/dist/react/context.d.ts +1 -1
- package/dist/react/context.js +1 -1
- package/dist/react/index.d.ts +5 -5
- package/dist/react/index.js +3 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +3 -3
- package/dist/react/useAblo.js +1 -1
- package/dist/react/useCurrentUserId.js +1 -1
- package/dist/react/useErrorListener.js +1 -1
- package/dist/react/useMutationFailureListener.d.ts +2 -2
- package/dist/react/useMutationFailureListener.js +1 -1
- package/dist/react/useMutators.d.ts +3 -3
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useUndoScope.d.ts +5 -5
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +69 -10
- package/dist/schema/coordination.js +86 -9
- package/dist/schema/ddl.js +2 -2
- package/dist/schema/diff.d.ts +1 -1
- package/dist/schema/generate.js +1 -1
- package/dist/schema/index.d.ts +10 -10
- package/dist/schema/index.js +18 -18
- package/dist/schema/queries.d.ts +27 -27
- package/dist/schema/queries.js +23 -23
- package/dist/schema/select.d.ts +3 -3
- package/dist/schema/select.js +3 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +17 -3
- package/dist/schema/sugar.d.ts +6 -7
- package/dist/schema/sugar.js +9 -12
- package/dist/schema/syncDeltaRow.d.ts +4 -152
- package/dist/schema/syncDeltaRow.js +4 -105
- package/dist/server/adapter.d.ts +18 -1
- package/dist/server/commit.d.ts +10 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +1 -1
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.js +2 -2
- package/dist/source/adapters/kysely.d.ts +1 -1
- package/dist/source/adapters/kysely.js +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +2 -2
- package/dist/source/adapters/memory.js +1 -1
- package/dist/source/adapters/prisma.d.ts +8 -3
- package/dist/source/adapters/prisma.js +1 -1
- package/dist/source/connector.js +1 -1
- package/dist/source/connectorProtocol.d.ts +2 -8
- package/dist/source/connectorProtocol.js +3 -2
- package/dist/source/contract.d.ts +29 -17
- package/dist/source/contract.js +27 -22
- package/dist/source/factory.d.ts +1 -1
- package/dist/source/footprint.d.ts +111 -0
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.js +2 -2
- package/dist/source/index.d.ts +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/next.d.ts +1 -1
- package/dist/source/signing.d.ts +9 -2
- package/dist/source/signing.js +4 -1
- package/dist/source/types.d.ts +6 -4
- package/dist/source/types.js +1 -1
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/stores/SyncActionStore.d.ts +1 -1
- package/dist/stores/SyncActionStore.js +2 -10
- package/dist/stores/syncAction.d.ts +26 -0
- package/dist/stores/syncAction.js +16 -0
- package/dist/surface.d.ts +3 -3
- package/dist/surface.js +6 -4
- package/dist/sync/BootstrapFetcher.d.ts +123 -6
- package/dist/sync/BootstrapFetcher.js +492 -66
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +2 -2
- package/dist/sync/OnDemandLoader.js +60 -21
- package/dist/sync/SubscriptionManager.d.ts +13 -2
- package/dist/sync/SubscriptionManager.js +23 -5
- package/dist/sync/SyncWebSocket.d.ts +27 -510
- package/dist/sync/SyncWebSocket.js +76 -954
- package/dist/sync/awaitClaimGrant.d.ts +4 -44
- package/dist/sync/awaitClaimGrant.js +4 -109
- package/dist/sync/commitFrames.d.ts +6 -40
- package/dist/sync/commitFrames.js +6 -97
- package/dist/sync/contextPorts.d.ts +18 -0
- package/dist/sync/contextPorts.js +31 -0
- package/dist/sync/createClaimStream.d.ts +5 -49
- package/dist/sync/createClaimStream.js +5 -469
- package/dist/sync/createPresenceStream.d.ts +26 -4
- package/dist/sync/createPresenceStream.js +28 -20
- package/dist/sync/createSnapshot.d.ts +2 -2
- package/dist/sync/createSnapshot.js +1 -1
- package/dist/sync/credentialLifecycle.d.ts +5 -173
- package/dist/sync/credentialLifecycle.js +5 -320
- package/dist/sync/deltaPipeline.d.ts +1 -1
- package/dist/sync/participants.d.ts +5 -4
- package/dist/sync/participants.js +29 -22
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +21 -32
- package/dist/sync/schemas.js +26 -17
- package/dist/sync/syncPlan.d.ts +3 -3
- package/dist/sync/wsFrameHandlers.d.ts +6 -114
- package/dist/sync/wsFrameHandlers.js +6 -392
- package/dist/testing/fixtures/bootstrap.d.ts +1 -1
- package/dist/testing/fixtures/deltas.d.ts +1 -1
- package/dist/testing/fixtures/httpResponses.d.ts +70 -0
- package/dist/testing/fixtures/httpResponses.js +90 -0
- package/dist/testing/fixtures/models.js +1 -1
- package/dist/testing/helpers/wait.js +1 -1
- package/dist/testing/mocks/MockMutationExecutor.d.ts +2 -2
- package/dist/testing/mocks/MockMutationExecutor.js +8 -14
- package/dist/testing/mocks/MockSyncContext.d.ts +11 -11
- package/dist/testing/mocks/MockSyncContext.js +10 -9
- package/dist/testing/mocks/MockSyncStore.js +1 -1
- package/dist/testing/mocks/MockWebSocket.d.ts +2 -2
- package/dist/transaction/ablo.d.ts +88 -0
- package/dist/transaction/ablo.js +33 -0
- package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
- package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
- package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
- package/dist/transaction/auth/bootstrapScope.js +1 -0
- package/dist/transaction/auth/capability.d.ts +177 -0
- package/dist/transaction/auth/capability.js +199 -0
- package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
- package/dist/{client → transaction/auth}/identity.d.ts +8 -7
- package/dist/{client → transaction/auth}/identity.js +1 -1
- package/dist/transaction/auth/index.d.ts +162 -0
- package/dist/transaction/auth/index.js +304 -0
- package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
- package/dist/{auth → transaction/auth}/schemas.js +13 -13
- package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
- package/dist/{client → transaction/auth}/sessionMint.js +4 -7
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +49 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +112 -0
- package/dist/transaction/coordination/claimMeta.d.ts +49 -0
- package/dist/transaction/coordination/claimMeta.js +52 -0
- package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
- package/dist/transaction/coordination/createClaimStream.js +475 -0
- package/dist/transaction/coordination/events.d.ts +74 -0
- package/dist/transaction/coordination/events.js +7 -0
- package/dist/transaction/coordination/index.d.ts +19 -0
- package/dist/transaction/coordination/index.js +44 -0
- package/dist/transaction/coordination/locator.d.ts +83 -0
- package/dist/transaction/coordination/locator.js +82 -0
- package/dist/transaction/coordination/schema.d.ts +1473 -0
- package/dist/{coordination → transaction/coordination}/schema.js +490 -55
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +103 -0
- package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
- package/dist/{coordination → transaction/coordination}/trace.js +18 -25
- package/dist/transaction/durableWrites.d.ts +62 -0
- package/dist/{client → transaction}/durableWrites.js +28 -3
- package/dist/transaction/environment.d.ts +105 -0
- package/dist/transaction/environment.js +108 -0
- package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +11 -11
- package/dist/{errorCodes.js → transaction/errorCodes.js} +35 -12
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/index.d.ts +20 -0
- package/dist/transaction/index.js +20 -0
- package/dist/transaction/keys/index.d.ts +87 -0
- package/dist/transaction/keys/index.js +207 -0
- package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
- package/dist/transaction/log/syncDeltaRow.js +95 -0
- package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
- package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
- package/dist/transaction/logger.d.ts +16 -0
- package/dist/transaction/logger.js +7 -0
- package/dist/transaction/observability.d.ts +53 -0
- package/dist/transaction/observability.js +19 -0
- package/dist/transaction/plugin.d.ts +192 -0
- package/dist/transaction/plugin.js +87 -0
- package/dist/{policy → transaction/policy}/types.d.ts +3 -3
- package/dist/{policy → transaction/policy}/types.js +2 -0
- package/dist/transaction/resources/httpResources.d.ts +266 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +319 -0
- package/dist/transaction/resources/modelOperations.js +12 -0
- package/dist/transaction/resources/mutationOptions.d.ts +66 -0
- package/dist/transaction/resources/mutationOptions.js +9 -0
- package/dist/transaction/resources/where.d.ts +85 -0
- package/dist/transaction/resources/where.js +70 -0
- package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
- package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
- package/dist/{schema → transaction/schema}/field.d.ts +5 -5
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/loadStrategy.d.ts +45 -0
- package/dist/transaction/schema/loadStrategy.js +46 -0
- package/dist/{schema → transaction/schema}/model.d.ts +50 -35
- package/dist/{schema → transaction/schema}/model.js +30 -20
- package/dist/transaction/schema/openapi.d.ts +57 -0
- package/dist/transaction/schema/openapi.js +340 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +14 -14
- package/dist/{schema → transaction/schema}/relation.js +7 -7
- package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
- package/dist/{schema → transaction/schema}/residency.js +0 -5
- package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
- package/dist/{schema → transaction/schema}/roles.js +5 -5
- package/dist/{schema → transaction/schema}/schema.d.ts +12 -10
- package/dist/{schema → transaction/schema}/schema.js +4 -3
- package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
- package/dist/{schema → transaction/schema}/tenancy.js +7 -4
- package/dist/transaction/transactionLayer.d.ts +82 -0
- package/dist/transaction/transactionLayer.js +24 -0
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +4 -5
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
- package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +10 -36
- package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
- package/dist/transaction/transport/commitFrames.d.ts +90 -0
- package/dist/transaction/transport/commitFrames.js +134 -0
- package/dist/transaction/transport/connectionManager.d.ts +215 -0
- package/dist/transaction/transport/connectionManager.js +673 -0
- package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
- package/dist/transaction/transport/credentialLifecycle.js +324 -0
- package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
- package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
- package/dist/{client → transaction/transport}/httpClient.d.ts +59 -16
- package/dist/{client → transaction/transport}/httpClient.js +5 -5
- package/dist/transaction/transport/httpOptions.d.ts +33 -0
- package/dist/transaction/transport/httpOptions.js +12 -0
- package/dist/{client → transaction/transport}/httpTransport.js +171 -85
- package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
- package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
- package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
- package/dist/transaction/transport/wsFrameHandlers.js +429 -0
- package/dist/transaction/transport/wsTransport.d.ts +576 -0
- package/dist/transaction/transport/wsTransport.js +1017 -0
- package/dist/transaction/types/assertExact.d.ts +17 -0
- package/dist/transaction/types/assertExact.js +1 -0
- package/dist/{types → transaction/types}/global.d.ts +17 -2
- package/dist/{types → transaction/types}/global.js +2 -1
- package/dist/{types → transaction/types}/index.d.ts +14 -46
- package/dist/{types → transaction/types}/index.js +7 -16
- package/dist/{types → transaction/types}/streams.d.ts +63 -45
- package/dist/{utils → transaction/utils}/json.d.ts +18 -0
- package/dist/transaction/utils/json.js +276 -0
- package/dist/transaction/wire/accountResponses.d.ts +351 -0
- package/dist/transaction/wire/accountResponses.js +255 -0
- package/dist/transaction/wire/auth.d.ts +49 -0
- package/dist/transaction/wire/auth.js +57 -0
- package/dist/transaction/wire/claimEvent.d.ts +76 -0
- package/dist/transaction/wire/claimEvent.js +73 -0
- package/dist/transaction/wire/claims.d.ts +463 -0
- package/dist/transaction/wire/claims.js +229 -0
- package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
- package/dist/{wire → transaction/wire}/commit.js +68 -47
- package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
- package/dist/{wire → transaction/wire}/delta.js +37 -13
- package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
- package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
- package/dist/transaction/wire/feedCursor.d.ts +60 -0
- package/dist/transaction/wire/feedCursor.js +82 -0
- package/dist/transaction/wire/feedEvent.d.ts +177 -0
- package/dist/transaction/wire/feedEvent.js +39 -0
- package/dist/transaction/wire/frames.d.ts +194 -0
- package/dist/transaction/wire/frames.js +50 -0
- package/dist/transaction/wire/inboundFrames.d.ts +552 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +50 -0
- package/dist/transaction/wire/index.js +74 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +79 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +110 -59
- package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
- package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
- package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
- package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
- package/dist/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/transactions/mutations/commitLatency.js +130 -0
- package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
- package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
- package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +16 -15
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +12 -12
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +11 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +7 -7
- package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
- package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +3 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +4 -3
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/webhooks/events.d.ts +2 -2
- package/dist/wire/index.d.ts +1 -34
- package/dist/wire/index.js +8 -49
- package/docs/agent-messaging.md +3 -3
- package/docs/agents.md +19 -12
- package/docs/api-keys.md +8 -4
- package/docs/api.md +22 -18
- package/docs/audit.md +2 -0
- package/docs/cli.md +31 -3
- package/docs/client-behavior.md +8 -6
- package/docs/concurrency-convention.md +30 -24
- package/docs/coordination.md +48 -38
- package/docs/data-sources.md +3 -1
- package/docs/debugging.md +5 -3
- package/docs/deployment.md +267 -0
- package/docs/examples/agent-human.md +49 -42
- package/docs/examples/ai-sdk-tool.md +69 -44
- package/docs/examples/existing-python-backend.md +8 -6
- package/docs/examples/nextjs.md +129 -47
- package/docs/examples/scoped-agent.md +45 -44
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +32 -29
- package/docs/guarantees.md +4 -2
- package/docs/how-it-works.md +9 -7
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +58 -54
- package/docs/index.md +172 -84
- package/docs/integration-guide.md +17 -16
- package/docs/interaction-model.md +6 -4
- package/docs/mcp.md +41 -16
- package/docs/migration.md +63 -5
- package/docs/operating-on-your-database.md +111 -0
- package/docs/projects.md +2 -0
- package/docs/quickstart.md +22 -5
- package/docs/react.md +12 -10
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +3 -1
- package/docs/webhooks.md +3 -1
- package/llms.txt +47 -17
- package/package.json +10 -8
- package/dist/agent/Agent.d.ts +0 -366
- package/dist/agent/Agent.js +0 -514
- package/dist/agent/index.d.ts +0 -115
- package/dist/agent/index.js +0 -128
- package/dist/agent/session.d.ts +0 -93
- package/dist/agent/session.js +0 -149
- package/dist/agent/types.d.ts +0 -68
- package/dist/agent/types.js +0 -9
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- package/dist/transactions/durableWriteStore.js +0 -30
- package/dist/utils/json.js +0 -88
- package/dist/wire/errorEnvelope.d.ts +0 -55
- package/dist/wire/frames.d.ts +0 -197
- package/dist/wire/frames.js +0 -49
- package/dist/wire/listEnvelope.js +0 -18
- /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
- /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +0 -0
- /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +0 -0
- /package/dist/{client → transaction}/persistence.d.ts +0 -0
- /package/dist/{client → transaction}/persistence.js +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
- /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.js +0 -0
- /package/dist/{types → transaction/types}/participant.d.ts +0 -0
- /package/dist/{types → transaction/types}/participant.js +0 -0
- /package/dist/{types → transaction/types}/streams.js +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
- /package/dist/{utils → transaction/utils}/duration.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/duration.js +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
- /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocol.js +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
- /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
- /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
- /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit latency — how long a user's edit actually takes to land.
|
|
3
|
+
*
|
|
4
|
+
* The engine has never measured this. HUDs and dashboards reach for
|
|
5
|
+
* `window.fetch` timings, which the sync engine's WebSocket never touches, so
|
|
6
|
+
* the latency a user sees reported while editing has had nothing to do with
|
|
7
|
+
* the writes they are making. This module closes that gap without adding a
|
|
8
|
+
* single timestamp to the hot path: `MutationQueue` already emits the commit
|
|
9
|
+
* lifecycle, and the events already carry the correlation key.
|
|
10
|
+
*
|
|
11
|
+
* Three events, two intervals:
|
|
12
|
+
*
|
|
13
|
+
* commit:staging ──sealMs──▶ commit:created ──ackMs──▶ transaction:completed
|
|
14
|
+
*
|
|
15
|
+
* - `sealMs` is **local** — writing the durable envelope before the commit is
|
|
16
|
+
* allowed onto the wire. Slow here means storage (IndexedDB), not network.
|
|
17
|
+
* - `ackMs` is **remote** — dispatch, round-trip, and server work. For a
|
|
18
|
+
* commit routed at a connected source this also spans the wait for the
|
|
19
|
+
* correlated echo that promotes `queued` to `confirmed`, so it answers
|
|
20
|
+
* "when did my edit become real" rather than raw socket round-trip. Read a
|
|
21
|
+
* large `ackMs` against a small `sealMs` as a network or replication cost.
|
|
22
|
+
*
|
|
23
|
+
* Correlation is by `clientTxId`: `MutationQueue` uses it as the transaction
|
|
24
|
+
* id verbatim, so the staging event and the completion event share one key.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Cap on commits awaiting completion. A commit whose completion never arrives
|
|
28
|
+
* (connection dropped mid-flight, retry abandoned) would otherwise pin its
|
|
29
|
+
* entry forever, so the map is bounded rather than trusted to drain.
|
|
30
|
+
*/
|
|
31
|
+
const MAX_PENDING_COMMITS = 256;
|
|
32
|
+
function nowMs() {
|
|
33
|
+
return typeof performance !== 'undefined' ? performance.now() : Date.now();
|
|
34
|
+
}
|
|
35
|
+
/** Read `clientTxId` off a `commit:*` payload, or null if it isn't shaped so. */
|
|
36
|
+
function readClientTxId(payload) {
|
|
37
|
+
if (typeof payload !== 'object' || payload === null)
|
|
38
|
+
return null;
|
|
39
|
+
const { clientTxId } = payload;
|
|
40
|
+
return typeof clientTxId === 'string' ? clientTxId : null;
|
|
41
|
+
}
|
|
42
|
+
/** Read `id` off a transaction payload (`transaction:completed` sends the tx). */
|
|
43
|
+
function readTransactionId(payload) {
|
|
44
|
+
if (typeof payload !== 'object' || payload === null)
|
|
45
|
+
return null;
|
|
46
|
+
const { id } = payload;
|
|
47
|
+
return typeof id === 'string' ? id : null;
|
|
48
|
+
}
|
|
49
|
+
/** `transaction:failed` wraps the transaction rather than sending it bare. */
|
|
50
|
+
function readFailedTransactionId(payload) {
|
|
51
|
+
if (typeof payload !== 'object' || payload === null)
|
|
52
|
+
return null;
|
|
53
|
+
return readTransactionId(payload.transaction);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Pair commit lifecycle events into latency samples. Returns an unsubscribe
|
|
57
|
+
* function that also drops any still-pending timings.
|
|
58
|
+
*
|
|
59
|
+
* `onSample` fires once per commit that completes, in completion order.
|
|
60
|
+
*/
|
|
61
|
+
export function observeCommitLatency(source, onSample) {
|
|
62
|
+
const pending = new Map();
|
|
63
|
+
const handleStaging = (payload) => {
|
|
64
|
+
const id = readClientTxId(payload);
|
|
65
|
+
if (id === null)
|
|
66
|
+
return;
|
|
67
|
+
// Map preserves insertion order, so the first key is the stalest entry.
|
|
68
|
+
if (pending.size >= MAX_PENDING_COMMITS) {
|
|
69
|
+
const oldest = pending.keys().next();
|
|
70
|
+
if (!oldest.done)
|
|
71
|
+
pending.delete(oldest.value);
|
|
72
|
+
}
|
|
73
|
+
pending.set(id, { stagedAt: nowMs(), sealedAt: null });
|
|
74
|
+
};
|
|
75
|
+
const handleCreated = (payload) => {
|
|
76
|
+
const id = readClientTxId(payload);
|
|
77
|
+
if (id === null)
|
|
78
|
+
return;
|
|
79
|
+
const timing = pending.get(id);
|
|
80
|
+
if (timing === undefined)
|
|
81
|
+
return;
|
|
82
|
+
timing.sealedAt = nowMs();
|
|
83
|
+
};
|
|
84
|
+
const handleCompleted = (payload) => {
|
|
85
|
+
const id = readTransactionId(payload);
|
|
86
|
+
if (id === null)
|
|
87
|
+
return;
|
|
88
|
+
const timing = pending.get(id);
|
|
89
|
+
// `transaction:completed` also fires for local (non-commit) transactions
|
|
90
|
+
// and for mutation-log replay. Only ids we staged are commits, so an
|
|
91
|
+
// absent entry is the normal way those are filtered out.
|
|
92
|
+
if (timing === undefined)
|
|
93
|
+
return;
|
|
94
|
+
pending.delete(id);
|
|
95
|
+
const completedAt = nowMs();
|
|
96
|
+
// A commit can complete without an observed seal only if the listener was
|
|
97
|
+
// attached mid-flight; attributing the whole span to `ackMs` keeps
|
|
98
|
+
// `sealMs + ackMs === totalMs` true rather than reporting a bogus seal.
|
|
99
|
+
const sealedAt = timing.sealedAt ?? timing.stagedAt;
|
|
100
|
+
onSample({
|
|
101
|
+
clientTxId: id,
|
|
102
|
+
sealMs: sealedAt - timing.stagedAt,
|
|
103
|
+
ackMs: completedAt - sealedAt,
|
|
104
|
+
totalMs: completedAt - timing.stagedAt,
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
const handleSealFailed = (payload) => {
|
|
108
|
+
const id = readClientTxId(payload);
|
|
109
|
+
if (id !== null)
|
|
110
|
+
pending.delete(id);
|
|
111
|
+
};
|
|
112
|
+
const handleFailed = (payload) => {
|
|
113
|
+
const id = readFailedTransactionId(payload);
|
|
114
|
+
if (id !== null)
|
|
115
|
+
pending.delete(id);
|
|
116
|
+
};
|
|
117
|
+
source.on('commit:staging', handleStaging);
|
|
118
|
+
source.on('commit:created', handleCreated);
|
|
119
|
+
source.on('commit:seal_failed', handleSealFailed);
|
|
120
|
+
source.on('transaction:completed', handleCompleted);
|
|
121
|
+
source.on('transaction:failed', handleFailed);
|
|
122
|
+
return () => {
|
|
123
|
+
source.off('commit:staging', handleStaging);
|
|
124
|
+
source.off('commit:created', handleCreated);
|
|
125
|
+
source.off('commit:seal_failed', handleSealFailed);
|
|
126
|
+
source.off('transaction:completed', handleCompleted);
|
|
127
|
+
source.off('transaction:failed', handleFailed);
|
|
128
|
+
pending.clear();
|
|
129
|
+
};
|
|
130
|
+
}
|
|
@@ -3,13 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Browser clients use {@link DatabaseCommitOutboxStore}. Agent/Node hosts can
|
|
5
5
|
* inject a workflow-, SQLite-, or filesystem-backed implementation without
|
|
6
|
-
* coupling
|
|
6
|
+
* coupling MutationQueue to the browser database/cache implementation.
|
|
7
7
|
*/
|
|
8
8
|
import type { DurableWriteStore, PendingWrite } from './durableWriteStore.js';
|
|
9
|
-
/** @deprecated Use {@link PendingWrite}. */
|
|
10
|
-
export type CommitOutboxRecord = PendingWrite;
|
|
11
|
-
/** @deprecated Use {@link DurableWriteStore}. */
|
|
12
|
-
export type CommitOutboxStore = DurableWriteStore;
|
|
13
9
|
/**
|
|
14
10
|
* The exact subset of the browser `Database` that {@link DatabaseCommitOutboxStore}
|
|
15
11
|
* drives. Typing the adapter to this narrow port instead of importing the
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Browser clients use {@link DatabaseCommitOutboxStore}. Agent/Node hosts can
|
|
5
5
|
* inject a workflow-, SQLite-, or filesystem-backed implementation without
|
|
6
|
-
* coupling
|
|
6
|
+
* coupling MutationQueue to the browser database/cache implementation.
|
|
7
7
|
*/
|
|
8
8
|
/** Strict IndexedDB adapter backed by Database's `__transactions` store. */
|
|
9
9
|
export class DatabaseCommitOutboxStore {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The vocabulary a local transaction uses on the wire. This module defines the
|
|
3
|
-
* {@link
|
|
3
|
+
* {@link QueuedMutation} record and the helpers that turn a transaction into a
|
|
4
4
|
* wire-safe commit operation: schema-field projection
|
|
5
5
|
* ({@link projectCommitPayload}), write-option projection
|
|
6
6
|
* ({@link applyWriteOptions}), foreign-key-aware priority scoring
|
|
@@ -8,9 +8,10 @@
|
|
|
8
8
|
* transport errors. Nothing here holds queue state or timers, so the batched
|
|
9
9
|
* queue path and the HTTP commit path share the same projection.
|
|
10
10
|
*/
|
|
11
|
-
import { MutationOperationType } from '
|
|
12
|
-
import type {
|
|
13
|
-
import type {
|
|
11
|
+
import { MutationOperationType } from '../../transaction/types/index.js';
|
|
12
|
+
import type { OnStaleMode } from '../../transaction/coordination/schema.js';
|
|
13
|
+
import type { MutationOptions, WriteOptions } from '../../interfaces/index.js';
|
|
14
|
+
import type { CommitEnvelopeMember } from '../../transaction/transactions/settlement/commitEnvelope.js';
|
|
14
15
|
export interface UserContext {
|
|
15
16
|
userId: string;
|
|
16
17
|
organizationId: string;
|
|
@@ -25,22 +26,22 @@ export type MutationInput = Record<string, unknown>;
|
|
|
25
26
|
*
|
|
26
27
|
* 1. Drops framework-internal keys (`__class`, `__typename`, `clientId`,
|
|
27
28
|
* `syncStatus`) and anything not declared on the model's schema.
|
|
28
|
-
* 2.
|
|
29
|
-
*
|
|
30
|
-
*
|
|
29
|
+
* 2. Takes a fresh plain JSON snapshot of the projected values. JSON-typed
|
|
30
|
+
* fields stay objects rather than pre-serialized strings, while reactive
|
|
31
|
+
* proxies cannot leak into persistence or the wire payload.
|
|
31
32
|
*
|
|
32
33
|
* For updates (`dropUndefined: true`), `undefined` values are also removed so
|
|
33
34
|
* they are not written as `SET column = NULL` on the server.
|
|
34
35
|
*
|
|
35
36
|
* Field metadata comes from the model registry, populated when the schema is
|
|
36
37
|
* registered at initialization. If a model has no registered field metadata —
|
|
37
|
-
* for example a manually registered model — projection
|
|
38
|
-
* data
|
|
38
|
+
* for example a manually registered model — projection snapshots all serialized
|
|
39
|
+
* data apart from the framework keys.
|
|
39
40
|
*/
|
|
40
41
|
export declare function projectCommitPayload(modelName: string, source: Record<string, unknown>, opts: {
|
|
41
42
|
dropUndefined: boolean;
|
|
42
43
|
}): MutationInput;
|
|
43
|
-
export interface
|
|
44
|
+
export interface QueuedMutation {
|
|
44
45
|
id: string;
|
|
45
46
|
type: 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
|
|
46
47
|
modelName: string;
|
|
@@ -95,7 +96,7 @@ export interface Transaction {
|
|
|
95
96
|
* recovers. This gives a caller one place to await the answer to "did my write
|
|
96
97
|
* land?", matching the
|
|
97
98
|
* `commits.create({ wait: 'confirmed' })` and
|
|
98
|
-
* {@link
|
|
99
|
+
* {@link MutationQueue.waitForConfirmation} vocabulary, so a failure
|
|
99
100
|
* surfaces at the call site instead of only as a silent local rollback. The
|
|
100
101
|
* permanent-rejection value is the same {@link AbloError} carried on the
|
|
101
102
|
* queue's `transaction:failed` event.
|
|
@@ -117,14 +118,14 @@ export declare const stripModelSuffix: (modelName: string) => string;
|
|
|
117
118
|
* foreign-key ordering because the row already exists, so they all share the
|
|
118
119
|
* configured default non-create priority.
|
|
119
120
|
*/
|
|
120
|
-
export declare const computePriorityScore: (type:
|
|
121
|
-
export declare const TX_TYPE_TO_MUTATION_OP: Record<
|
|
121
|
+
export declare const computePriorityScore: (type: QueuedMutation["type"], modelName: string) => number;
|
|
122
|
+
export declare const TX_TYPE_TO_MUTATION_OP: Record<QueuedMutation['type'], MutationOperationType>;
|
|
122
123
|
export declare function hasStaleWriteOptions(options?: WriteOptions): boolean;
|
|
123
124
|
/** Options whose identity/audit semantics forbid merging two caller writes. */
|
|
124
125
|
export declare function hasCommitCoalescingBarrier(options?: WriteOptions): boolean;
|
|
125
126
|
export interface WriteOperationFields {
|
|
126
127
|
readAt?: number | null;
|
|
127
|
-
onStale?:
|
|
128
|
+
onStale?: OnStaleMode | null;
|
|
128
129
|
fenceToken?: number | null;
|
|
129
130
|
options?: Pick<MutationOptions, 'idempotencyKey' | 'label'>;
|
|
130
131
|
}
|
|
@@ -135,7 +136,7 @@ export interface WriteOperationFields {
|
|
|
135
136
|
* `mutation_log` cache key and audit tag. This is the one place caller-supplied
|
|
136
137
|
* write options cross onto the wire.
|
|
137
138
|
*/
|
|
138
|
-
export declare function applyWriteOptions<T extends object>(op: T, transaction:
|
|
139
|
+
export declare function applyWriteOptions<T extends object>(op: T, transaction: QueuedMutation): T & WriteOperationFields;
|
|
139
140
|
/**
|
|
140
141
|
* The structural shape used to inspect transport-layer errors. It covers the
|
|
141
142
|
* GraphQL-style and HTTP-style error shapes the mutation executor can surface,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The vocabulary a local transaction uses on the wire. This module defines the
|
|
3
|
-
* {@link
|
|
3
|
+
* {@link QueuedMutation} record and the helpers that turn a transaction into a
|
|
4
4
|
* wire-safe commit operation: schema-field projection
|
|
5
5
|
* ({@link projectCommitPayload}), write-option projection
|
|
6
6
|
* ({@link applyWriteOptions}), foreign-key-aware priority scoring
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* transport errors. Nothing here holds queue state or timers, so the batched
|
|
9
9
|
* queue path and the HTTP commit path share the same projection.
|
|
10
10
|
*/
|
|
11
|
-
import { getContext } from '
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
11
|
+
import { getContext } from '../../context.js';
|
|
12
|
+
import { MutationOperationType } from '../../transaction/types/index.js';
|
|
13
|
+
import { snapshotJsonValue } from '../../transaction/utils/json.js';
|
|
14
14
|
/**
|
|
15
15
|
* Framework-internal keys added by `Model.toJSON()` that must never
|
|
16
16
|
* reach the wire. The server treats each top-level key as a target
|
|
@@ -23,20 +23,20 @@ const FRAMEWORK_KEYS = new Set(['__class', '__typename', 'clientId', 'syncStatus
|
|
|
23
23
|
*
|
|
24
24
|
* 1. Drops framework-internal keys (`__class`, `__typename`, `clientId`,
|
|
25
25
|
* `syncStatus`) and anything not declared on the model's schema.
|
|
26
|
-
* 2.
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* 2. Takes a fresh plain JSON snapshot of the projected values. JSON-typed
|
|
27
|
+
* fields stay objects rather than pre-serialized strings, while reactive
|
|
28
|
+
* proxies cannot leak into persistence or the wire payload.
|
|
29
29
|
*
|
|
30
30
|
* For updates (`dropUndefined: true`), `undefined` values are also removed so
|
|
31
31
|
* they are not written as `SET column = NULL` on the server.
|
|
32
32
|
*
|
|
33
33
|
* Field metadata comes from the model registry, populated when the schema is
|
|
34
34
|
* registered at initialization. If a model has no registered field metadata —
|
|
35
|
-
* for example a manually registered model — projection
|
|
36
|
-
* data
|
|
35
|
+
* for example a manually registered model — projection snapshots all serialized
|
|
36
|
+
* data apart from the framework keys.
|
|
37
37
|
*/
|
|
38
38
|
export function projectCommitPayload(modelName, source, opts) {
|
|
39
|
-
const metadata =
|
|
39
|
+
const metadata = getContext().getModelMetadata(modelName);
|
|
40
40
|
const fields = metadata?.fields;
|
|
41
41
|
const out = {};
|
|
42
42
|
if (!fields) {
|
|
@@ -48,7 +48,7 @@ export function projectCommitPayload(modelName, source, opts) {
|
|
|
48
48
|
continue;
|
|
49
49
|
out[k] = v;
|
|
50
50
|
}
|
|
51
|
-
return out;
|
|
51
|
+
return snapshotJsonValue(out, '$.input');
|
|
52
52
|
}
|
|
53
53
|
for (const key of Object.keys(fields)) {
|
|
54
54
|
if (!(key in source))
|
|
@@ -73,7 +73,7 @@ export function projectCommitPayload(modelName, source, opts) {
|
|
|
73
73
|
// to jsonb correctly once the column is identified as jsonb.
|
|
74
74
|
out[key] = value;
|
|
75
75
|
}
|
|
76
|
-
return out;
|
|
76
|
+
return snapshotJsonValue(out, '$.input');
|
|
77
77
|
}
|
|
78
78
|
export const normalizeModelKey = (modelName) => modelName.replace('Model', '').toLowerCase();
|
|
79
79
|
export const stripModelSuffix = (modelName) => modelName.replace('Model', '');
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tracks whether the confirming delta for a write has arrived. It holds the
|
|
3
|
-
* acknowledgement watermark (through the shared {@link
|
|
3
|
+
* acknowledgement watermark (through the shared {@link LogPosition}), the
|
|
4
4
|
* per-transaction confirmation timeouts, and the retry-with-backoff and
|
|
5
5
|
* reconciliation policy for transactions in the `awaiting_delta` status. It
|
|
6
|
-
* reaches back to {@link
|
|
6
|
+
* reaches back to {@link MutationQueue} only through the small
|
|
7
7
|
* {@link DeltaConfirmationContext} interface, not the queue class itself, so it
|
|
8
8
|
* has no cyclic dependency and can be tested on its own.
|
|
9
9
|
*/
|
|
10
|
-
import type {
|
|
11
|
-
import type {
|
|
10
|
+
import type { LogPosition } from '../../transaction/logPosition.js';
|
|
11
|
+
import type { QueuedMutation } from './commitPayload.js';
|
|
12
12
|
/**
|
|
13
|
-
* The subset of {@link
|
|
13
|
+
* The subset of {@link MutationQueue} that the confirmation tracker needs:
|
|
14
14
|
* store lookups and status changes, removing optimistic entries once a write
|
|
15
15
|
* confirms, the queue's event emitter (`transaction:completed`,
|
|
16
16
|
* `reconciliation:needed`, and so on), a connection check (so timeouts
|
|
@@ -20,16 +20,16 @@ import type { Transaction } from './commitPayload.js';
|
|
|
20
20
|
*/
|
|
21
21
|
export interface DeltaConfirmationContext {
|
|
22
22
|
store: {
|
|
23
|
-
get(id: string):
|
|
24
|
-
getByStatus(status:
|
|
25
|
-
updateStatus(id: string, status:
|
|
23
|
+
get(id: string): QueuedMutation | undefined;
|
|
24
|
+
getByStatus(status: QueuedMutation['status']): QueuedMutation[];
|
|
25
|
+
updateStatus(id: string, status: QueuedMutation['status']): void;
|
|
26
26
|
};
|
|
27
27
|
optimisticUpdates: {
|
|
28
28
|
delete(id: string): boolean;
|
|
29
29
|
};
|
|
30
30
|
emit(event: string, payload?: unknown): void;
|
|
31
31
|
isConnected(): boolean;
|
|
32
|
-
position:
|
|
32
|
+
position: LogPosition;
|
|
33
33
|
}
|
|
34
34
|
export declare class DeltaConfirmationTracker {
|
|
35
35
|
private readonly ctx;
|
|
@@ -48,11 +48,11 @@ export declare class DeltaConfirmationTracker {
|
|
|
48
48
|
* @param syncId - The sync id of the received delta.
|
|
49
49
|
*/
|
|
50
50
|
onDeltaReceived(syncId: number, correlationId?: string): void;
|
|
51
|
-
scheduleDeltaConfirmationTimeout(tx:
|
|
51
|
+
scheduleDeltaConfirmationTimeout(tx: QueuedMutation, timeoutMs: number): void;
|
|
52
52
|
private cancelDeltaConfirmationTimeout;
|
|
53
53
|
/**
|
|
54
54
|
* Clears every armed confirmation timer, one per in-flight transaction.
|
|
55
|
-
* {@link
|
|
55
|
+
* {@link MutationQueue.dispose} calls this; without it a disposed queue
|
|
56
56
|
* would keep the process alive and fire callbacks against a cleared store.
|
|
57
57
|
*/
|
|
58
58
|
dispose(): void;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tracks whether the confirming delta for a write has arrived. It holds the
|
|
3
|
-
* acknowledgement watermark (through the shared {@link
|
|
3
|
+
* acknowledgement watermark (through the shared {@link LogPosition}), the
|
|
4
4
|
* per-transaction confirmation timeouts, and the retry-with-backoff and
|
|
5
5
|
* reconciliation policy for transactions in the `awaiting_delta` status. It
|
|
6
|
-
* reaches back to {@link
|
|
6
|
+
* reaches back to {@link MutationQueue} only through the small
|
|
7
7
|
* {@link DeltaConfirmationContext} interface, not the queue class itself, so it
|
|
8
8
|
* has no cyclic dependency and can be tested on its own.
|
|
9
9
|
*/
|
|
10
|
-
import { getContext } from '
|
|
10
|
+
import { getContext } from '../../context.js';
|
|
11
11
|
export class DeltaConfirmationTracker {
|
|
12
12
|
ctx;
|
|
13
13
|
// Retry configuration for delta confirmation, using exponential backoff.
|
|
@@ -118,7 +118,7 @@ export class DeltaConfirmationTracker {
|
|
|
118
118
|
// rejection instead of a catchable synchronous error.
|
|
119
119
|
const timeoutHandle = setTimeout(() => {
|
|
120
120
|
const currentTx = this.ctx.store.get(tx.id);
|
|
121
|
-
if (
|
|
121
|
+
if (currentTx?.status !== 'awaiting_delta') {
|
|
122
122
|
this.deltaConfirmationRetries.delete(tx.id);
|
|
123
123
|
return; // Already confirmed or failed
|
|
124
124
|
}
|
|
@@ -126,7 +126,7 @@ export class DeltaConfirmationTracker {
|
|
|
126
126
|
if (!this.ctx.isConnected()) {
|
|
127
127
|
// Self-healing: re-schedule the confirmation wait while offline, no
|
|
128
128
|
// consumer action needed → debug.
|
|
129
|
-
getContext().logger.debug('[
|
|
129
|
+
getContext().logger.debug('[MutationQueue] Timeout fired while disconnected - re-scheduling', {
|
|
130
130
|
txId: tx.id.slice(0, 8),
|
|
131
131
|
model: tx.modelName,
|
|
132
132
|
});
|
|
@@ -165,7 +165,7 @@ export class DeltaConfirmationTracker {
|
|
|
165
165
|
});
|
|
166
166
|
// Self-healing retry with backoff — the server already committed; we're
|
|
167
167
|
// just waiting on the delta. No consumer action → debug.
|
|
168
|
-
getContext().logger.debug('[
|
|
168
|
+
getContext().logger.debug('[MutationQueue] Re-scheduling with backoff', {
|
|
169
169
|
txId: tx.id.slice(0, 8),
|
|
170
170
|
model: tx.modelName,
|
|
171
171
|
nextTimeoutMs: nextTimeout,
|
|
@@ -220,7 +220,7 @@ export class DeltaConfirmationTracker {
|
|
|
220
220
|
}
|
|
221
221
|
/**
|
|
222
222
|
* Clears every armed confirmation timer, one per in-flight transaction.
|
|
223
|
-
* {@link
|
|
223
|
+
* {@link MutationQueue.dispose} calls this; without it a disposed queue
|
|
224
224
|
* would keep the process alive and fire callbacks against a cleared store.
|
|
225
225
|
*/
|
|
226
226
|
dispose() {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable-write port moved to the settlement core (ADR 0016): it is a
|
|
3
|
+
* contract over commit envelopes and holds no local rows. Re-exported here so
|
|
4
|
+
* the existing `transactions/mutations/durableWriteStore` import path keeps
|
|
5
|
+
* resolving for the queue, the outbox, and the client options.
|
|
6
|
+
*
|
|
7
|
+
* The port and its config live in the core's `durableWrites` module (a behavior
|
|
8
|
+
* contract, not a persisted shape); the records that cross it are owned by
|
|
9
|
+
* `transactions/settlement/pendingWrite`.
|
|
10
|
+
*/
|
|
11
|
+
export { durableWriteStoreSchema, durableWritesConfigSchema, } from '../../transaction/durableWrites.js';
|
|
12
|
+
export type { DurableWriteStore, DurableWritesConfig, } from '../../transaction/durableWrites.js';
|
|
13
|
+
export { pendingWriteSchema } from '../../transaction/transactions/settlement/pendingWrite.js';
|
|
14
|
+
export type { PendingWrite } from '../../transaction/transactions/settlement/pendingWrite.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable-write port moved to the settlement core (ADR 0016): it is a
|
|
3
|
+
* contract over commit envelopes and holds no local rows. Re-exported here so
|
|
4
|
+
* the existing `transactions/mutations/durableWriteStore` import path keeps
|
|
5
|
+
* resolving for the queue, the outbox, and the client options.
|
|
6
|
+
*
|
|
7
|
+
* The port and its config live in the core's `durableWrites` module (a behavior
|
|
8
|
+
* contract, not a persisted shape); the records that cross it are owned by
|
|
9
|
+
* `transactions/settlement/pendingWrite`.
|
|
10
|
+
*/
|
|
11
|
+
export { durableWriteStoreSchema, durableWritesConfigSchema, } from '../../transaction/durableWrites.js';
|
|
12
|
+
export { pendingWriteSchema } from '../../transaction/transactions/settlement/pendingWrite.js';
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
* than any larger object, so the rules have no dependencies of their own and
|
|
9
9
|
* can be tested in isolation.
|
|
10
10
|
*/
|
|
11
|
-
import type { Model } from '
|
|
12
|
-
import type { MutationInput,
|
|
11
|
+
import type { Model } from '../../Model.js';
|
|
12
|
+
import type { MutationInput, QueuedMutation } from './commitPayload.js';
|
|
13
13
|
/**
|
|
14
14
|
* One tracked optimistic mutation: the live model plus the value it held
|
|
15
15
|
* before the change, kept so a rollback can restore it.
|
|
@@ -17,7 +17,7 @@ import type { MutationInput, Transaction } from './commitPayload.js';
|
|
|
17
17
|
export interface OptimisticUpdateEntry {
|
|
18
18
|
model: Model;
|
|
19
19
|
previousState: MutationInput | null | undefined;
|
|
20
|
-
transaction:
|
|
20
|
+
transaction: QueuedMutation;
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* The event emitter these functions use to announce each optimistic change and
|
|
@@ -30,20 +30,20 @@ export interface OptimisticEmitter {
|
|
|
30
30
|
* Record an optimistic create and announce it. There is no prior value to
|
|
31
31
|
* restore, so the rollback pre-image is `null`.
|
|
32
32
|
*/
|
|
33
|
-
export declare function applyOptimisticCreate(optimisticUpdates: Map<string, OptimisticUpdateEntry>, emitter: OptimisticEmitter, model: Model, transaction:
|
|
33
|
+
export declare function applyOptimisticCreate(optimisticUpdates: Map<string, OptimisticUpdateEntry>, emitter: OptimisticEmitter, model: Model, transaction: QueuedMutation): void;
|
|
34
34
|
/**
|
|
35
35
|
* Record an optimistic update and announce it, keeping the row's prior value so
|
|
36
36
|
* a rollback can put it back.
|
|
37
37
|
*/
|
|
38
|
-
export declare function applyOptimisticUpdate(optimisticUpdates: Map<string, OptimisticUpdateEntry>, emitter: OptimisticEmitter, model: Model, transaction:
|
|
38
|
+
export declare function applyOptimisticUpdate(optimisticUpdates: Map<string, OptimisticUpdateEntry>, emitter: OptimisticEmitter, model: Model, transaction: QueuedMutation): void;
|
|
39
39
|
/**
|
|
40
40
|
* Record an optimistic delete and announce it, keeping the deleted row so a
|
|
41
41
|
* rollback can restore it.
|
|
42
42
|
*/
|
|
43
|
-
export declare function applyOptimisticDelete(optimisticUpdates: Map<string, OptimisticUpdateEntry>, emitter: OptimisticEmitter, model: Model, transaction:
|
|
43
|
+
export declare function applyOptimisticDelete(optimisticUpdates: Map<string, OptimisticUpdateEntry>, emitter: OptimisticEmitter, model: Model, transaction: QueuedMutation): void;
|
|
44
44
|
/**
|
|
45
45
|
* Undo an optimistic mutation by its transaction id: emit `optimistic:rollback`
|
|
46
46
|
* with the saved pre-image so listeners can restore the prior value, then drop
|
|
47
47
|
* the ledger entry. Does nothing if the transaction was never tracked.
|
|
48
48
|
*/
|
|
49
|
-
export declare function rollbackOptimistic(optimisticUpdates: Map<string, OptimisticUpdateEntry>, emitter: OptimisticEmitter, transaction:
|
|
49
|
+
export declare function rollbackOptimistic(optimisticUpdates: Map<string, OptimisticUpdateEntry>, emitter: OptimisticEmitter, transaction: QueuedMutation, reason?: string, error?: Error): Promise<void>;
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* quietly rather than flagged as corruption.
|
|
16
16
|
*/
|
|
17
17
|
import { z } from 'zod';
|
|
18
|
-
import type {
|
|
18
|
+
import type { QueuedMutation } from './commitPayload.js';
|
|
19
19
|
/**
|
|
20
20
|
* The shape of a persisted transaction that can be replayed: the fields the
|
|
21
21
|
* transaction queue reads when it re-enqueues the row — its id, operation type,
|
|
@@ -73,12 +73,12 @@ export type PersistedReplayableTransaction = z.infer<typeof persistedTransaction
|
|
|
73
73
|
*/
|
|
74
74
|
export declare function isNonReplayablePersistedRow(row: unknown): boolean;
|
|
75
75
|
/**
|
|
76
|
-
* Validates one stored row and rehydrates it into a {@link
|
|
76
|
+
* Validates one stored row and rehydrates it into a {@link QueuedMutation} ready
|
|
77
77
|
* to replay, or returns `null` when the row fails validation. Bookkeeping
|
|
78
78
|
* fields the stored row lacks — status, attempts, priority, timestamp — are
|
|
79
79
|
* re-derived the same way a freshly staged transaction derives them.
|
|
80
80
|
*/
|
|
81
|
-
export declare function deserializePersistedTransaction(row: unknown):
|
|
81
|
+
export declare function deserializePersistedTransaction(row: unknown): QueuedMutation | null;
|
|
82
82
|
/**
|
|
83
83
|
* The shape of one entry in the persisted offline mutation queue — an item of
|
|
84
84
|
* the `'queue'` row's `mutations` array, carrying the fields read when the
|
|
@@ -16,12 +16,13 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { z } from 'zod';
|
|
18
18
|
import { computePriorityScore, normalizeModelKey } from './commitPayload.js';
|
|
19
|
-
import { commitEnvelopeMemberSchema, commitOutboxScopeSchema, } from '
|
|
19
|
+
import { commitEnvelopeMemberSchema, commitOutboxScopeSchema, } from '../../transaction/transactions/settlement/commitEnvelope.js';
|
|
20
|
+
import { onStaleModeSchema } from '../../transaction/coordination/schema.js';
|
|
20
21
|
/** The subset of a write's options that is stored with each transaction or queued mutation. */
|
|
21
22
|
const persistedWriteOptionsSchema = z
|
|
22
23
|
.object({
|
|
23
24
|
readAt: z.number().nullable().optional(),
|
|
24
|
-
onStale:
|
|
25
|
+
onStale: onStaleModeSchema.nullable().optional(),
|
|
25
26
|
idempotencyKey: z.string().optional(),
|
|
26
27
|
label: z.string().optional(),
|
|
27
28
|
// Aligned with the `WriteOptions` type: a claimed write persisted offline
|
|
@@ -81,7 +82,7 @@ export function isNonReplayablePersistedRow(row) {
|
|
|
81
82
|
NON_REPLAYABLE_TYPES.has(row.type));
|
|
82
83
|
}
|
|
83
84
|
/**
|
|
84
|
-
* Validates one stored row and rehydrates it into a {@link
|
|
85
|
+
* Validates one stored row and rehydrates it into a {@link QueuedMutation} ready
|
|
85
86
|
* to replay, or returns `null` when the row fails validation. Bookkeeping
|
|
86
87
|
* fields the stored row lacks — status, attempts, priority, timestamp — are
|
|
87
88
|
* re-derived the same way a freshly staged transaction derives them.
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* each field, leaving any hand-written getter or setter in place.
|
|
6
6
|
*/
|
|
7
7
|
import { type AnnotationMapEntry } from 'mobx';
|
|
8
|
-
import { type PropertyMetadata, type ReferenceMetadata } from '../types/index.js';
|
|
8
|
+
import { type PropertyMetadata, type ReferenceMetadata } from '../transaction/types/index.js';
|
|
9
9
|
/**
|
|
10
10
|
* The subset of a model instance that {@link M1} reads and writes. A model calls
|
|
11
11
|
* {@link M1} from its constructor, where these members exist on `this`;
|
package/dist/utils/mobxSetup.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* each field, leaving any hand-written getter or setter in place.
|
|
6
6
|
*/
|
|
7
7
|
import { observable, makeObservable, action, computed, observe, } from 'mobx';
|
|
8
|
-
import { PropertyType } from '../types/index.js';
|
|
8
|
+
import { PropertyType } from '../transaction/types/index.js';
|
|
9
9
|
import { getContext } from '../context.js';
|
|
10
10
|
/**
|
|
11
11
|
* Makes a model instance's schema-defined properties observable with MobX. For
|
|
@@ -140,7 +140,10 @@ export function M1(target, propertyMetadata, referenceMetadata) {
|
|
|
140
140
|
annotations.updatedAt = observable;
|
|
141
141
|
}
|
|
142
142
|
if (!hasGetter('modifiedProperties') && !hasSetter('modifiedProperties')) {
|
|
143
|
-
|
|
143
|
+
// Track map membership, but keep change payloads as plain values. These
|
|
144
|
+
// entries are replaced rather than mutated and later cross IndexedDB's
|
|
145
|
+
// structured-clone boundary, where MobX's deep proxies are invalid.
|
|
146
|
+
annotations.modifiedProperties = observable.shallow;
|
|
144
147
|
}
|
|
145
148
|
// Add actions only if methods exist and aren't already actions.
|
|
146
149
|
// `Reflect.get` keeps the read typed without an index-signature
|
|
@@ -7,10 +7,10 @@ export interface AbloWebhookEvent {
|
|
|
7
7
|
/** A stable, unique event identifier equal to `String(syncId)`. Use it to
|
|
8
8
|
* deduplicate deliveries. */
|
|
9
9
|
readonly id: string;
|
|
10
|
-
/** The event type, formatted as `<model>.<verb>`, such as `"
|
|
10
|
+
/** The event type, formatted as `<model>.<verb>`, such as `"report.updated"`.
|
|
11
11
|
* Branch on this to route the event. */
|
|
12
12
|
readonly type: string;
|
|
13
|
-
/** The name of the model whose row changed, such as `"
|
|
13
|
+
/** The name of the model whose row changed, such as `"Report"`. */
|
|
14
14
|
readonly model: string;
|
|
15
15
|
/** The identifier of the row that changed. */
|
|
16
16
|
readonly objectId: string;
|
package/dist/wire/index.d.ts
CHANGED
|
@@ -1,34 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* The wire contract for the sync protocol: the HTTP envelope shapes and the
|
|
3
|
-
* write-path frames, with no dependency on the client runtime. A server — a
|
|
4
|
-
* route handler, an edge function — can import the envelope producers here
|
|
5
|
-
* without pulling in the full sync client.
|
|
6
|
-
*
|
|
7
|
-
* It has two halves, used across every endpoint:
|
|
8
|
-
* - Error responses — {@link errorEnvelope}, {@link ErrorEnvelope}, and
|
|
9
|
-
* {@link statusForType} turn any thrown value into the uniform
|
|
10
|
-
* `{ type, code, param, message, doc_url, request_id }` body.
|
|
11
|
-
* - List responses — {@link listEnvelope} and {@link ListEnvelope} stamp the
|
|
12
|
-
* uniform `{ object: 'list', data, has_more, next_cursor }` collection.
|
|
13
|
-
*
|
|
14
|
-
* The {@link AbloError} hierarchy, {@link docUrlForCode}, and the wire-parsing
|
|
15
|
-
* helpers are re-exported too, so a single import lets a route throw the right
|
|
16
|
-
* typed error and serialize it back out.
|
|
17
|
-
*/
|
|
18
|
-
export { errorEnvelope, statusForType } from './errorEnvelope.js';
|
|
19
|
-
export type { ErrorEnvelope } from './errorEnvelope.js';
|
|
20
|
-
export { listEnvelope } from './listEnvelope.js';
|
|
21
|
-
export type { ListEnvelope } from './listEnvelope.js';
|
|
22
|
-
export { bootstrapReasonSchema } from './bootstrapReason.js';
|
|
23
|
-
export type { BootstrapReason } from './bootstrapReason.js';
|
|
24
|
-
export { commitOperationSchema, commitPayloadSchema, } from './frames.js';
|
|
25
|
-
export { PROTOCOL_VERSION, MIN_SUPPORTED_PROTOCOL_VERSION, DEFAULT_PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS, WS_CLOSE_PROTOCOL_VERSION, PROTOCOL_VERSION_HEADER, protocolVersionProblem, resolveProtocolVersion, } from './protocolVersion.js';
|
|
26
|
-
export type { SupportedProtocolVersion, ProtocolVersionProblem, } from './protocolVersion.js';
|
|
27
|
-
export type { CommitOperation, CommitMessage, MutationResultMessage, } from './frames.js';
|
|
28
|
-
export { COMMIT_CORRELATION_ID_MAX_LENGTH, correlationIdSchema, commitStatusSchema, commitSettlementSchema, commitReceiptSchema, legacyCompatibleCommitReceiptSchema, rejectedCommitReceiptSchema, mutationResultPayloadSchema, mutationResultMessageSchema, commitAckSchema, mutationCommitResultSchema, } from './commit.js';
|
|
29
|
-
export type { CorrelationId, CommitStatus, CommitSettlement, CommitReceiptWire, RejectedCommitReceiptWire, MutationResultPayload, MutationResultMessageWire, CommitAck, MutationCommitResultInput, MutationCommitResult, } from './commit.js';
|
|
30
|
-
export { participantKindSchema, confirmationStateSchema, syncDeltaActionSchema, wireDeltaDataSchema, participantRefSchema, syncDeltaWireCoreSchema, clientSyncDeltaSchema, serverSyncDeltaSchema, } from './delta.js';
|
|
31
|
-
export type { ParticipantKind, ConfirmationState, SyncDeltaAction, WireDeltaData, ParticipantRef, SyncDeltaWireCore, ClientSyncDelta, ServerSyncDelta, } from './delta.js';
|
|
32
|
-
export { AbloError, AbloAuthenticationError, AbloPermissionError, AbloValidationError, AbloRateLimitError, AbloIdempotencyError, AbloConnectionError, AbloServerError, AbloStaleContextError, AbloClaimedError, CapabilityError, SyncSessionError, docUrlForCode, translateHttpError, errorFromWire, toAbloError, ERROR_CONTRACT_VERSION, errorCodeSpec, } from '../errors.js';
|
|
33
|
-
export type { ErrorCode, WireErrorCode } from '../errors.js';
|
|
34
|
-
export { PING_INTERVAL_MS, LEASE_TTL_MS, WS_BEARER_SUBPROTOCOL_PREFIX, WS_SYNC_SUBPROTOCOL, } from './protocol.js';
|
|
1
|
+
export * from '../transaction/wire/index.js';
|