@abloatai/ablo 0.34.1 → 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 +2 -1
- package/CHANGELOG.md +674 -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 +3344 -1073
- 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 -86
- 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 +3 -1
- 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
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* live backend. Each successful commit hands back an incrementing `lastSyncId`,
|
|
6
6
|
* so tests can drive the delta-confirmation flow that depends on those ids.
|
|
7
7
|
*/
|
|
8
|
-
import { AbloError } from '../../errors.js';
|
|
8
|
+
import { AbloError } from '../../transaction/errors.js';
|
|
9
9
|
export class MockMutationExecutor {
|
|
10
10
|
/** Every captured call, in the order it was made. Assertions read from this list. */
|
|
11
11
|
calls = [];
|
|
@@ -25,7 +25,7 @@ export class MockMutationExecutor {
|
|
|
25
25
|
this._syncId = options.initialSyncId ?? 1;
|
|
26
26
|
this._shouldSucceed = options.shouldSucceed ?? true;
|
|
27
27
|
this._latencyMs = options.latencyMs ?? 0;
|
|
28
|
-
this._status = options.status;
|
|
28
|
+
this._status = options.status ?? 'confirmed';
|
|
29
29
|
this._correlationId = options.correlationId;
|
|
30
30
|
this._notifications = options.notifications;
|
|
31
31
|
this._missingIds = options.missingIds;
|
|
@@ -91,7 +91,7 @@ export class MockMutationExecutor {
|
|
|
91
91
|
this._syncId = options?.initialSyncId ?? 1;
|
|
92
92
|
this._shouldSucceed = options?.shouldSucceed ?? true;
|
|
93
93
|
this._latencyMs = options?.latencyMs ?? 0;
|
|
94
|
-
this._status = options?.status;
|
|
94
|
+
this._status = options?.status ?? 'confirmed';
|
|
95
95
|
this._correlationId = options?.correlationId;
|
|
96
96
|
this._notifications = options?.notifications;
|
|
97
97
|
this._missingIds = options?.missingIds;
|
|
@@ -118,19 +118,13 @@ export class MockMutationExecutor {
|
|
|
118
118
|
...(this._missingIds ? { missingIds: this._missingIds } : {}),
|
|
119
119
|
};
|
|
120
120
|
}
|
|
121
|
-
|
|
121
|
+
return {
|
|
122
|
+
lastSyncId: syncId,
|
|
123
|
+
status: 'confirmed',
|
|
124
|
+
...(this._correlationId ? { correlationId: this._correlationId } : {}),
|
|
122
125
|
...(this._notifications ? { notifications: this._notifications } : {}),
|
|
123
126
|
...(this._missingIds ? { missingIds: this._missingIds } : {}),
|
|
124
127
|
};
|
|
125
|
-
if (this._status === 'confirmed') {
|
|
126
|
-
return {
|
|
127
|
-
lastSyncId: syncId,
|
|
128
|
-
status: 'confirmed',
|
|
129
|
-
...(this._correlationId ? { correlationId: this._correlationId } : {}),
|
|
130
|
-
...evidence,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
return { lastSyncId: syncId, ...evidence };
|
|
134
128
|
}
|
|
135
129
|
async executeCreate(modelName, id, input, clientMutationId) {
|
|
136
130
|
this._capture('executeCreate', { modelName, modelId: id, input, clientMutationId });
|
|
@@ -141,7 +135,7 @@ export class MockMutationExecutor {
|
|
|
141
135
|
this._capture('executeUpdate', { modelName, modelId, input: data, clientMutationId });
|
|
142
136
|
await this._maybeDelay();
|
|
143
137
|
this._maybeThrow('executeUpdate');
|
|
144
|
-
return { lastSyncId: this._syncId
|
|
138
|
+
return { lastSyncId: this._syncId++, status: 'confirmed' };
|
|
145
139
|
}
|
|
146
140
|
async executeDelete(modelName, modelId, clientMutationId) {
|
|
147
141
|
this._capture('executeDelete', { modelName, modelId, clientMutationId });
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Assembles a ready-to-use {@link
|
|
2
|
+
* Assembles a ready-to-use {@link RuntimeContext} for tests. The context
|
|
3
3
|
* bundles every dependency the engine needs — logger, network monitor,
|
|
4
4
|
* mutation executor, and configuration — so a test can start the engine
|
|
5
5
|
* without a real backend. {@link createTestContext} is the entry point: it
|
|
6
|
-
* wires the mocks, installs the context globally through {@link
|
|
6
|
+
* wires the mocks, installs the context globally through {@link initRuntime},
|
|
7
7
|
* and returns handles to each mock for assertions.
|
|
8
8
|
*/
|
|
9
|
-
import type {
|
|
10
|
-
import type {
|
|
9
|
+
import type { RuntimeContext } from '../../RuntimeContext.js';
|
|
10
|
+
import type { Logger, ObservabilityProvider, SessionErrorDetector, RuntimeConfig } from '../../interfaces/index.js';
|
|
11
11
|
import { MockMutationExecutor } from './MockMutationExecutor.js';
|
|
12
12
|
import { MockNetworkMonitor } from './MockNetworkMonitor.js';
|
|
13
13
|
export interface TestContextOptions {
|
|
14
14
|
/** Replaces the default no-op logger. */
|
|
15
|
-
logger?:
|
|
15
|
+
logger?: Logger;
|
|
16
16
|
/** Replaces the default no-op observability provider. */
|
|
17
|
-
observability?:
|
|
17
|
+
observability?: ObservabilityProvider;
|
|
18
18
|
/** Replaces the detector that decides whether an error means the session has expired. */
|
|
19
19
|
sessionErrorDetector?: SessionErrorDetector;
|
|
20
20
|
/** Options forwarded to the {@link MockMutationExecutor} that the context creates. */
|
|
21
21
|
mutationExecutorOptions?: ConstructorParameters<typeof MockMutationExecutor>[0];
|
|
22
|
-
/** A partial {@link
|
|
23
|
-
config?: Partial<
|
|
22
|
+
/** A partial {@link RuntimeConfig} merged over the defaults. */
|
|
23
|
+
config?: Partial<RuntimeConfig>;
|
|
24
24
|
/** Starts the network monitor offline. Defaults to online. */
|
|
25
25
|
startOffline?: boolean;
|
|
26
26
|
}
|
|
27
27
|
export interface TestContextResult {
|
|
28
28
|
/** The assembled context that {@link createTestContext} installed globally. */
|
|
29
|
-
context:
|
|
29
|
+
context: RuntimeContext;
|
|
30
30
|
/** Handles to the underlying mocks, so tests can drive them and assert on them. */
|
|
31
31
|
mocks: {
|
|
32
32
|
mutationExecutor: MockMutationExecutor;
|
|
@@ -36,8 +36,8 @@ export interface TestContextResult {
|
|
|
36
36
|
cleanup: () => void;
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
* Builds a {@link
|
|
40
|
-
* globally through {@link
|
|
39
|
+
* Builds a {@link RuntimeContext} with every mock pre-wired and installs it
|
|
40
|
+
* globally through {@link initRuntime}, so code under test reaches the engine
|
|
41
41
|
* the same way it would in production. Returns the context, the mock handles,
|
|
42
42
|
* and a cleanup function to call when the test finishes.
|
|
43
43
|
*
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Assembles a ready-to-use {@link
|
|
2
|
+
* Assembles a ready-to-use {@link RuntimeContext} for tests. The context
|
|
3
3
|
* bundles every dependency the engine needs — logger, network monitor,
|
|
4
4
|
* mutation executor, and configuration — so a test can start the engine
|
|
5
5
|
* without a real backend. {@link createTestContext} is the entry point: it
|
|
6
|
-
* wires the mocks, installs the context globally through {@link
|
|
6
|
+
* wires the mocks, installs the context globally through {@link initRuntime},
|
|
7
7
|
* and returns handles to each mock for assertions.
|
|
8
8
|
*/
|
|
9
|
-
import { noopLogger, noopObservability, noopAnalytics, defaultSessionErrorDetector, emptyConfig, } from '../../
|
|
10
|
-
import {
|
|
11
|
-
import { ModelRegistry, setActiveRegistry, hasActiveRegistry, clearActiveRegistry, } from '../../ModelRegistry.js';
|
|
9
|
+
import { noopLogger, noopObservability, noopAnalytics, defaultSessionErrorDetector, emptyConfig, } from '../../RuntimeContext.js';
|
|
10
|
+
import { initRuntime, resetRuntime } from '../../context.js';
|
|
11
|
+
import { ModelRegistry, getActiveRegistry, setActiveRegistry, hasActiveRegistry, clearActiveRegistry, } from '../../ModelRegistry.js';
|
|
12
12
|
import { registerTestModels } from '../fixtures/models.js';
|
|
13
13
|
import { MockMutationExecutor } from './MockMutationExecutor.js';
|
|
14
14
|
import { MockNetworkMonitor } from './MockNetworkMonitor.js';
|
|
15
15
|
/**
|
|
16
|
-
* Builds a {@link
|
|
17
|
-
* globally through {@link
|
|
16
|
+
* Builds a {@link RuntimeContext} with every mock pre-wired and installs it
|
|
17
|
+
* globally through {@link initRuntime}, so code under test reaches the engine
|
|
18
18
|
* the same way it would in production. Returns the context, the mock handles,
|
|
19
19
|
* and a cleanup function to call when the test finishes.
|
|
20
20
|
*
|
|
@@ -35,6 +35,7 @@ export function createTestContext(options = {}) {
|
|
|
35
35
|
modelCreatePriority: options.config?.modelCreatePriority ?? emptyConfig.modelCreatePriority,
|
|
36
36
|
};
|
|
37
37
|
const context = {
|
|
38
|
+
getModelMetadata: (name) => (hasActiveRegistry() ? getActiveRegistry().getMetadata(name) : undefined),
|
|
38
39
|
logger: options.logger ?? noopLogger,
|
|
39
40
|
observability: options.observability ?? noopObservability,
|
|
40
41
|
analytics: noopAnalytics,
|
|
@@ -43,7 +44,7 @@ export function createTestContext(options = {}) {
|
|
|
43
44
|
mutationExecutor,
|
|
44
45
|
config,
|
|
45
46
|
};
|
|
46
|
-
|
|
47
|
+
initRuntime(context);
|
|
47
48
|
// Bootstrap a default ModelRegistry with test models if none is active.
|
|
48
49
|
// Tests that manage their own registry call setActiveRegistry before this.
|
|
49
50
|
const bootstrappedRegistry = !hasActiveRegistry();
|
|
@@ -59,7 +60,7 @@ export function createTestContext(options = {}) {
|
|
|
59
60
|
networkMonitor,
|
|
60
61
|
},
|
|
61
62
|
cleanup: () => {
|
|
62
|
-
|
|
63
|
+
resetRuntime();
|
|
63
64
|
// Leave the active ModelRegistry in place on purpose. Async callbacks
|
|
64
65
|
// from in-flight transactions can call Model.toJSON() after a test's
|
|
65
66
|
// teardown has run; keeping the default registry available keeps those
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* test made — all without a real sync backend.
|
|
5
5
|
*/
|
|
6
6
|
import { ViewRegistry } from '../../core/ViewRegistry.js';
|
|
7
|
-
import { AbloValidationError } from '../../errors.js';
|
|
7
|
+
import { AbloValidationError } from '../../transaction/errors.js';
|
|
8
8
|
/**
|
|
9
9
|
* An in-memory implementation of {@link SyncStoreContract}. Seed rows with
|
|
10
10
|
* {@link MockSyncStore.setModels}, then read and write through the contract
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* event interface of the real connection without opening a socket, so tests
|
|
4
4
|
* can drive connection changes, deltas, and bootstrap hints by hand.
|
|
5
5
|
*/
|
|
6
|
-
import type { SyncActionType } from '../../
|
|
7
|
-
import type { BootstrapReason } from '../../wire/bootstrapReason.js';
|
|
6
|
+
import type { SyncActionType } from '../../stores/syncAction.js';
|
|
7
|
+
import type { BootstrapReason } from '../../transaction/wire/bootstrapReason.js';
|
|
8
8
|
/** The shape of a single delta — one change the server pushes to the client. */
|
|
9
9
|
export interface MockDelta {
|
|
10
10
|
id: number;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Ablo` — the entry point to the coordination layer.
|
|
3
|
+
*
|
|
4
|
+
* The factory constructs the stateless client: typed model resources, commits,
|
|
5
|
+
* claims, and session minting over request/response HTTP. It holds no socket,
|
|
6
|
+
* no store, and no local copy of anything — the bearer credential is the
|
|
7
|
+
* identity and the server resolves it on every request. This is the client a
|
|
8
|
+
* server-side actor installs: an agent, a worker, a cron job, a route handler.
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Ablo } from '@abloatai/ablo';
|
|
12
|
+
* import { schema } from './schema';
|
|
13
|
+
*
|
|
14
|
+
* const ablo = Ablo({ schema, apiKey: process.env.ABLO_API_KEY, transport: 'http' });
|
|
15
|
+
* await ablo.tasks.update({ id: taskId, data: { status: 'done' } });
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* The reactive materialiser — local store, live queries, presence rendering —
|
|
19
|
+
* is the consumer package's entry point (`@abloatai/ablo`), which layers
|
|
20
|
+
* above this one and shares the same `ablo.<model>` surface (ADR 0016).
|
|
21
|
+
*/
|
|
22
|
+
import { type AbloHttpClient, type AbloHttpClientOptions } from './transport/httpClient.js';
|
|
23
|
+
import type { SchemaRecord } from './schema/schema.js';
|
|
24
|
+
import type * as _Streams from './types/streams.js';
|
|
25
|
+
import type * as _SchemaTypes from './schema/schema.js';
|
|
26
|
+
import type * as _Global from './types/global.js';
|
|
27
|
+
import type * as _Policy from './policy/types.js';
|
|
28
|
+
import type * as _Http from './resources/httpResources.js';
|
|
29
|
+
/**
|
|
30
|
+
* Create a coordination-layer client in one call.
|
|
31
|
+
*
|
|
32
|
+
* The core carries one transport today — request/response HTTP — so
|
|
33
|
+
* `transport: 'http'` is accepted for symmetry with the reactive package's
|
|
34
|
+
* factory and may be omitted. The duplex transport joins this slot when the
|
|
35
|
+
* socket carve lands (ADR 0016, follow-up 3a).
|
|
36
|
+
*/
|
|
37
|
+
export declare function Ablo<const S extends SchemaRecord>(options: AbloHttpClientOptions<S> & {
|
|
38
|
+
transport?: 'http';
|
|
39
|
+
}): AbloHttpClient<S>;
|
|
40
|
+
export declare namespace Ablo {
|
|
41
|
+
type ClaimTarget = _Streams.ClaimTarget;
|
|
42
|
+
type PresenceTarget = _Streams.PresenceTarget;
|
|
43
|
+
type Duration = _Streams.Duration;
|
|
44
|
+
type Peer = _Streams.Peer;
|
|
45
|
+
type Activity = _Streams.Activity;
|
|
46
|
+
type Claim = _Streams.Claim;
|
|
47
|
+
type ClaimHeartbeat = _Streams.ClaimHeartbeat;
|
|
48
|
+
type ClaimHeartbeatOptions = _Streams.ClaimHeartbeatOptions;
|
|
49
|
+
namespace Claim {
|
|
50
|
+
type Held<T = Record<string, unknown>, M = _Global.ResolveClaimMeta> = _Streams.HeldClaim<T, M>;
|
|
51
|
+
type WaitOptions = _Streams.ClaimWaitOptions;
|
|
52
|
+
type LeaseOptions = _Streams.ClaimLeaseOptions;
|
|
53
|
+
}
|
|
54
|
+
type Schema<S extends _SchemaTypes.SchemaRecord = _SchemaTypes.SchemaRecord> = _SchemaTypes.Schema<S>;
|
|
55
|
+
/**
|
|
56
|
+
* The schema this program has registered via `interface Register { Schema }`
|
|
57
|
+
* (falls back to a loose shape when unregistered). Use it where shared code
|
|
58
|
+
* needs "this app's schema" without importing a specific one.
|
|
59
|
+
*/
|
|
60
|
+
type ResolveSchema = _Global.ResolveSchema;
|
|
61
|
+
/**
|
|
62
|
+
* The claim metadata shape this program has registered via
|
|
63
|
+
* `interface Register { ClaimMeta }` (falls back to a loose record when
|
|
64
|
+
* unregistered). Every claim surface reads `target.meta` as this.
|
|
65
|
+
*/
|
|
66
|
+
type ResolveClaimMeta = _Global.ResolveClaimMeta;
|
|
67
|
+
namespace Schema {
|
|
68
|
+
type Model<S extends _SchemaTypes.Schema, K extends keyof S['models']> = _SchemaTypes.Model<S, K>;
|
|
69
|
+
type InferCreate<S extends _SchemaTypes.Schema, K extends keyof S['models']> = _SchemaTypes.InferCreate<S, K>;
|
|
70
|
+
type InferModelNames<S extends _SchemaTypes.Schema> = _SchemaTypes.InferModelNames<S>;
|
|
71
|
+
}
|
|
72
|
+
type Conflict = _Policy.Conflict;
|
|
73
|
+
namespace Conflict {
|
|
74
|
+
type Kind = _Policy.ConflictKind;
|
|
75
|
+
type Operation = _Policy.ConflictOperation;
|
|
76
|
+
type Decision = _Policy.ConflictDecision;
|
|
77
|
+
type Policy = _Policy.ConflictPolicy;
|
|
78
|
+
type Axis = _Policy.ConflictAxis;
|
|
79
|
+
}
|
|
80
|
+
namespace Commit {
|
|
81
|
+
type Wait = _Http.CommitWait;
|
|
82
|
+
type OperationAction = _Http.ModelOperationAction;
|
|
83
|
+
type OperationInput = _Http.CommitOperationInput;
|
|
84
|
+
type CreateOptions = _Http.CommitCreateOptions;
|
|
85
|
+
type Receipt = _Http.CommitReceipt;
|
|
86
|
+
type Client = _Http.CommitResource;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Ablo` — the entry point to the coordination layer.
|
|
3
|
+
*
|
|
4
|
+
* The factory constructs the stateless client: typed model resources, commits,
|
|
5
|
+
* claims, and session minting over request/response HTTP. It holds no socket,
|
|
6
|
+
* no store, and no local copy of anything — the bearer credential is the
|
|
7
|
+
* identity and the server resolves it on every request. This is the client a
|
|
8
|
+
* server-side actor installs: an agent, a worker, a cron job, a route handler.
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Ablo } from '@abloatai/ablo';
|
|
12
|
+
* import { schema } from './schema';
|
|
13
|
+
*
|
|
14
|
+
* const ablo = Ablo({ schema, apiKey: process.env.ABLO_API_KEY, transport: 'http' });
|
|
15
|
+
* await ablo.tasks.update({ id: taskId, data: { status: 'done' } });
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* The reactive materialiser — local store, live queries, presence rendering —
|
|
19
|
+
* is the consumer package's entry point (`@abloatai/ablo`), which layers
|
|
20
|
+
* above this one and shares the same `ablo.<model>` surface (ADR 0016).
|
|
21
|
+
*/
|
|
22
|
+
import { createAbloHttpClient, } from './transport/httpClient.js';
|
|
23
|
+
/**
|
|
24
|
+
* Create a coordination-layer client in one call.
|
|
25
|
+
*
|
|
26
|
+
* The core carries one transport today — request/response HTTP — so
|
|
27
|
+
* `transport: 'http'` is accepted for symmetry with the reactive package's
|
|
28
|
+
* factory and may be omitted. The duplex transport joins this slot when the
|
|
29
|
+
* socket carve lands (ADR 0016, follow-up 3a).
|
|
30
|
+
*/
|
|
31
|
+
export function Ablo(options) {
|
|
32
|
+
return createAbloHttpClient(options);
|
|
33
|
+
}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* override is an explicit option, so an app never picks up hidden behavior from
|
|
12
12
|
* a stray environment variable.
|
|
13
13
|
*/
|
|
14
|
+
import type { KeyEnvironment } from '../environment.js';
|
|
14
15
|
/**
|
|
15
16
|
* The credential-resolver callable type. It is defined alongside
|
|
16
17
|
* {@link createEndpointCredentialResolver} in `./credentialEndpoint` and
|
|
@@ -19,19 +20,31 @@
|
|
|
19
20
|
*/
|
|
20
21
|
import type { ApiKeySetter } from './credentialEndpoint.js';
|
|
21
22
|
export type { ApiKeySetter };
|
|
23
|
+
/**
|
|
24
|
+
* The client options that decide a credential.
|
|
25
|
+
*
|
|
26
|
+
* This is the ONE declaration of that set. The resolvers below read it, and the
|
|
27
|
+
* transport configs that accept these options derive from it rather than listing
|
|
28
|
+
* the fields again — a second list is how `authEndpoint` came to be supported at
|
|
29
|
+
* runtime, named in an error message, and absent from the type a caller writes
|
|
30
|
+
* against.
|
|
31
|
+
*/
|
|
32
|
+
export interface AuthClientOptions {
|
|
33
|
+
readonly apiKey?: string | ApiKeySetter | null;
|
|
34
|
+
/** A route that mints the token, instead of a key the process holds. */
|
|
35
|
+
readonly authEndpoint?: string | ApiKeySetter | null;
|
|
36
|
+
/** A token the caller already has, used as-is. */
|
|
37
|
+
readonly authToken?: string | null;
|
|
38
|
+
readonly baseURL?: string | null;
|
|
39
|
+
readonly dangerouslyAllowBrowser?: boolean;
|
|
40
|
+
}
|
|
22
41
|
export interface AuthResolveInput {
|
|
23
42
|
/**
|
|
24
43
|
* The full set of options the caller passed to the client constructor. Each
|
|
25
44
|
* resolver reads only the fields it needs; passing the whole object avoids
|
|
26
45
|
* threading many separate parameters through every helper.
|
|
27
46
|
*/
|
|
28
|
-
readonly options:
|
|
29
|
-
readonly apiKey?: string | ApiKeySetter | null;
|
|
30
|
-
readonly authEndpoint?: string | ApiKeySetter | null;
|
|
31
|
-
readonly authToken?: string | null;
|
|
32
|
-
readonly baseURL?: string | null;
|
|
33
|
-
readonly dangerouslyAllowBrowser?: boolean;
|
|
34
|
-
};
|
|
47
|
+
readonly options: AuthClientOptions;
|
|
35
48
|
readonly env: Record<string, string | undefined>;
|
|
36
49
|
}
|
|
37
50
|
/**
|
|
@@ -41,8 +54,30 @@ export interface AuthResolveInput {
|
|
|
41
54
|
*/
|
|
42
55
|
export declare function readProcessEnv(): Record<string, string | undefined>;
|
|
43
56
|
export declare function resolveApiKey(input: AuthResolveInput): string | ApiKeySetter | null;
|
|
57
|
+
/**
|
|
58
|
+
* Narrow a resolved `apiKey` to the single resolver the credential lifecycle
|
|
59
|
+
* needs: an async `() => token | null`, or `null` when auth is static — a plain
|
|
60
|
+
* long-lived key string with no refresh, which is the common case.
|
|
61
|
+
*
|
|
62
|
+
* The short-lived per-user browser path passes a function `apiKey` (an
|
|
63
|
+
* {@link ApiKeySetter}), and the SDK then drives the whole credential lifecycle
|
|
64
|
+
* from it: mint-before-connect, the proactive refresh timer with its
|
|
65
|
+
* wake/online/focus re-mint, and the reactive `credential_stale` re-mint. The
|
|
66
|
+
* resolver follows the `ApiKeySetter` contract end to end: resolve a token,
|
|
67
|
+
* resolve `null` when the login is gone (terminal — surfaces `session_expired`
|
|
68
|
+
* and signs the user out), or throw on a transient failure (backs off, without
|
|
69
|
+
* signing out).
|
|
70
|
+
*/
|
|
71
|
+
export declare function resolveCredentialResolver(apiKey: string | ApiKeySetter | null): (() => Promise<string | null>) | null;
|
|
44
72
|
export declare function resolveAuthToken(input: AuthResolveInput): string | null;
|
|
45
|
-
|
|
73
|
+
/**
|
|
74
|
+
* The credential axis, not a second copy of it. `environment.ts` documents two
|
|
75
|
+
* incidents caused by conflating the plane a request runs on with the mode a
|
|
76
|
+
* credential was minted in, and states the credential axis must not grow when
|
|
77
|
+
* planes do — so the CLI mismatch path reads the canonical vocabulary rather
|
|
78
|
+
* than restating its members here.
|
|
79
|
+
*/
|
|
80
|
+
type CliMode = KeyEnvironment;
|
|
46
81
|
type StaticApiKeySource = 'option' | 'env';
|
|
47
82
|
interface StaticApiKey {
|
|
48
83
|
readonly key: string;
|
|
@@ -56,6 +56,25 @@ export function resolveApiKey(input) {
|
|
|
56
56
|
}
|
|
57
57
|
return configured ?? input.env.ABLO_API_KEY ?? null;
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Narrow a resolved `apiKey` to the single resolver the credential lifecycle
|
|
61
|
+
* needs: an async `() => token | null`, or `null` when auth is static — a plain
|
|
62
|
+
* long-lived key string with no refresh, which is the common case.
|
|
63
|
+
*
|
|
64
|
+
* The short-lived per-user browser path passes a function `apiKey` (an
|
|
65
|
+
* {@link ApiKeySetter}), and the SDK then drives the whole credential lifecycle
|
|
66
|
+
* from it: mint-before-connect, the proactive refresh timer with its
|
|
67
|
+
* wake/online/focus re-mint, and the reactive `credential_stale` re-mint. The
|
|
68
|
+
* resolver follows the `ApiKeySetter` contract end to end: resolve a token,
|
|
69
|
+
* resolve `null` when the login is gone (terminal — surfaces `session_expired`
|
|
70
|
+
* and signs the user out), or throw on a transient failure (backs off, without
|
|
71
|
+
* signing out).
|
|
72
|
+
*/
|
|
73
|
+
export function resolveCredentialResolver(apiKey) {
|
|
74
|
+
if (typeof apiKey === 'function')
|
|
75
|
+
return apiKey;
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
59
78
|
export function resolveAuthToken(input) {
|
|
60
79
|
return input.options.authToken ?? null;
|
|
61
80
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The hand-off the identity flow performs once a credential resolves: it names
|
|
3
|
+
* the account scope and the sync groups everything downstream should read under.
|
|
4
|
+
*
|
|
5
|
+
* The core defines the port; the consumer supplies the implementation. That
|
|
6
|
+
* keeps identity resolution — which is settlement's business — from depending on
|
|
7
|
+
* whatever happens to materialise rows on the other side of it (ADR 0016). The
|
|
8
|
+
* reactive engine's `BootstrapFetcher` satisfies this structurally.
|
|
9
|
+
*/
|
|
10
|
+
export interface BootstrapScope {
|
|
11
|
+
/** Bind subsequent reads to one account's cache partition. */
|
|
12
|
+
setCacheScope(cacheScope: string): void;
|
|
13
|
+
/** Narrow subsequent reads to the sync groups the credential authorises. */
|
|
14
|
+
setSyncGroups(syncGroups: readonly string[] | undefined): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability — the one definition of what a credential may do.
|
|
3
|
+
*
|
|
4
|
+
* A grant is declared once, in the vocabulary a developer writes:
|
|
5
|
+
*
|
|
6
|
+
* can: { documents: ['read', 'update'] }
|
|
7
|
+
*
|
|
8
|
+
* Everything downstream derives from that declaration: the wire spelling
|
|
9
|
+
* (`documents.update`) stored on the key row, the typed `can` a schema narrows
|
|
10
|
+
* to its own models, the request body the mint route parses, the pattern the
|
|
11
|
+
* published contract advertises, and the scope block echoed back on the minted
|
|
12
|
+
* session.
|
|
13
|
+
*
|
|
14
|
+
* Before this module the same grant was spelled five times — a literal union in
|
|
15
|
+
* the resource types, a `z.array(z.string())` on the wire, a hand-rolled
|
|
16
|
+
* field-by-field parser in the mint route, an object literal in the response
|
|
17
|
+
* type, and a hand-written `model.verb` array at each caller that mints without
|
|
18
|
+
* the SDK. Nothing failed when they drifted; the drift surfaced as
|
|
19
|
+
* `capability_scope_denied` on a grant the caller believed it held.
|
|
20
|
+
*
|
|
21
|
+
* Two axes decide blast radius. VERBS come from `can`; ROWS come from
|
|
22
|
+
* `syncGroups`. They belong to one grant, which is why they are declared
|
|
23
|
+
* together here rather than meeting for the first time on the wire.
|
|
24
|
+
*/
|
|
25
|
+
import { z } from 'zod';
|
|
26
|
+
/**
|
|
27
|
+
* The verbs a grant can name — the whole vocabulary, in one place. Every other
|
|
28
|
+
* spelling of an operation in the system derives from this enum: the SDK's
|
|
29
|
+
* `can` values, the wire's `model.verb` pattern, and the JSON Schema the
|
|
30
|
+
* published contract advertises.
|
|
31
|
+
*/
|
|
32
|
+
export declare const capabilityOperationSchema: z.ZodEnum<{
|
|
33
|
+
update: "update";
|
|
34
|
+
create: "create";
|
|
35
|
+
delete: "delete";
|
|
36
|
+
read: "read";
|
|
37
|
+
}>;
|
|
38
|
+
export type CapabilityOperation = z.infer<typeof capabilityOperationSchema>;
|
|
39
|
+
/**
|
|
40
|
+
* One granted operation in its wire spelling: `<model>.<verb>`, lowercased.
|
|
41
|
+
*
|
|
42
|
+
* The template literal derives both halves — the verb set from
|
|
43
|
+
* {@link capabilityOperationSchema}, the pattern in the published contract from
|
|
44
|
+
* the template — so tightening the verb vocabulary can never leave a stale
|
|
45
|
+
* regex or a stale doc behind. The model half is the name the server matches
|
|
46
|
+
* against a model's registered aliases (type name, schema key, or table name),
|
|
47
|
+
* so it stays permissive here and is resolved at the gate.
|
|
48
|
+
*/
|
|
49
|
+
export declare const grantedOperationSchema: z.ZodTemplateLiteral<`${string}.update` | `${string}.create` | `${string}.delete` | `${string}.read`>;
|
|
50
|
+
export type GrantedOperation = z.infer<typeof grantedOperationSchema>;
|
|
51
|
+
/**
|
|
52
|
+
* The declared grant, per model — the runtime shape of `can`. Model keys are
|
|
53
|
+
* free-form at runtime because the server resolves them against the schema it
|
|
54
|
+
* has; {@link CapabilityCan} narrows them to a known schema's models at the
|
|
55
|
+
* type level.
|
|
56
|
+
*/
|
|
57
|
+
export declare const capabilityCanSchema: z.ZodRecord<z.ZodString, z.ZodReadonly<z.ZodArray<z.ZodEnum<{
|
|
58
|
+
update: "update";
|
|
59
|
+
create: "create";
|
|
60
|
+
delete: "delete";
|
|
61
|
+
read: "read";
|
|
62
|
+
}>>>>;
|
|
63
|
+
/**
|
|
64
|
+
* `can`, narrowed to one schema's model names. A projection of
|
|
65
|
+
* {@link capabilityCanSchema} — the value type is the operation enum, the key
|
|
66
|
+
* domain is the schema's models, so `can: { tasks: ['update'] }` fails to
|
|
67
|
+
* compile against a schema with no `tasks` model.
|
|
68
|
+
*/
|
|
69
|
+
export type CapabilityCan<S> = Partial<Record<keyof S & string, readonly CapabilityOperation[]>>;
|
|
70
|
+
/**
|
|
71
|
+
* Read-your-writes expansion: append `<model>.read` for every model the grant
|
|
72
|
+
* can write.
|
|
73
|
+
*
|
|
74
|
+
* A scoped agent that may update a row must be able to read it, or the read
|
|
75
|
+
* gate (query / bootstrap / entity self-heal / delta fan-out) starves the very
|
|
76
|
+
* writes the grant allows. The write verbs stay the source of truth; reads are
|
|
77
|
+
* derived and deduped, and models the grant cannot write stay unreadable —
|
|
78
|
+
* that is the read-side blast-radius reduction.
|
|
79
|
+
*
|
|
80
|
+
* It lives beside the declaration, so it applies wherever a grant is built,
|
|
81
|
+
* rather than only at whichever mint the callers happen to share. The server
|
|
82
|
+
* applies it again at the mint chokepoint for callers that post raw JSON; the
|
|
83
|
+
* function is idempotent, so the second application is a no-op.
|
|
84
|
+
*/
|
|
85
|
+
export declare function expandReadYourWrites(operations: readonly GrantedOperation[]): GrantedOperation[];
|
|
86
|
+
/**
|
|
87
|
+
* The parts of a model definition a grant can name. Structural, so both the
|
|
88
|
+
* SDK (which holds a `Schema`) and the mint route (which holds the tenant's
|
|
89
|
+
* pushed artifact) derive names from the same rule.
|
|
90
|
+
*/
|
|
91
|
+
export interface CapabilityModelShape {
|
|
92
|
+
readonly typename?: string;
|
|
93
|
+
readonly tableName?: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Schema key → the wire name a grant must be minted with.
|
|
97
|
+
*
|
|
98
|
+
* THE derivation. A model whose type name is overridden — schema key
|
|
99
|
+
* `documents`, type name `Document` — has to mint `document.update`, not
|
|
100
|
+
* `documents.update`, and a caller who works that out by hand gets it wrong
|
|
101
|
+
* once and learns at `capability_scope_denied`. Callers pass their schema's
|
|
102
|
+
* models, never a map they assembled themselves.
|
|
103
|
+
*/
|
|
104
|
+
export declare function modelWireNames(models: Readonly<Record<string, CapabilityModelShape>>): Record<string, string>;
|
|
105
|
+
/**
|
|
106
|
+
* Every name the enforcement gates accept for a model, lowercased. Three
|
|
107
|
+
* vocabularies name one logical model — the wire type name (`lineitem`), the
|
|
108
|
+
* schema key (`lineItems`), and the table name (`line_items`) — so a grant
|
|
109
|
+
* minted in any of them is honored, and the mint can tell a real model from a
|
|
110
|
+
* typo without guessing which vocabulary the caller used.
|
|
111
|
+
*/
|
|
112
|
+
export declare function capabilityModelAliases(models: Readonly<Record<string, CapabilityModelShape>>): Set<string>;
|
|
113
|
+
/**
|
|
114
|
+
* The granted operations whose model half names nothing in the schema.
|
|
115
|
+
*
|
|
116
|
+
* A grant is checked against the schema at MINT, the way a write to an unpushed
|
|
117
|
+
* model already fails with `server_execute_unknown_model` — so a typo in
|
|
118
|
+
* `lineitem.update` is a rejected mint rather than a credential that looks
|
|
119
|
+
* healthy and is denied on its first write. Without this the `model` half is a
|
|
120
|
+
* hole: an opaque string nothing validates until enforcement time.
|
|
121
|
+
*/
|
|
122
|
+
export declare function unresolvableOperations(operations: readonly GrantedOperation[], aliases: ReadonlySet<string>): GrantedOperation[];
|
|
123
|
+
/**
|
|
124
|
+
* Serializes a declared `can` into the wire allowlist — the ONE translation
|
|
125
|
+
* from what a developer writes to what the server stores and enforces.
|
|
126
|
+
*
|
|
127
|
+
* `wireNames` comes from {@link modelWireNames} over the client's own schema.
|
|
128
|
+
* It is required rather than optional: an omitted map silently mints the schema
|
|
129
|
+
* key verbatim, which is right for most models and wrong for every model with
|
|
130
|
+
* a type-name override — the kind of default that is correct until it isn't.
|
|
131
|
+
*/
|
|
132
|
+
export declare function grantedOperations(can: Readonly<Record<string, readonly CapabilityOperation[] | undefined>>, wireNames: Readonly<Record<string, string>>): GrantedOperation[];
|
|
133
|
+
/**
|
|
134
|
+
* The grant at rest: what the credential ended up with, on both axes, plus the
|
|
135
|
+
* participant it acts as. The mint echoes this block, the key row stores it,
|
|
136
|
+
* and the gates read it — so a session's reported scope and its enforced scope
|
|
137
|
+
* are the same shape by construction.
|
|
138
|
+
*/
|
|
139
|
+
export declare const capabilityScopeSchema: z.ZodObject<{
|
|
140
|
+
organizationId: z.ZodString;
|
|
141
|
+
syncGroups: z.ZodArray<z.ZodString>;
|
|
142
|
+
operations: z.ZodArray<z.ZodTemplateLiteral<`${string}.update` | `${string}.create` | `${string}.delete` | `${string}.read`>>;
|
|
143
|
+
participantKind: z.ZodEnum<{
|
|
144
|
+
user: "user";
|
|
145
|
+
agent: "agent";
|
|
146
|
+
system: "system";
|
|
147
|
+
}>;
|
|
148
|
+
participantId: z.ZodString;
|
|
149
|
+
}, z.core.$strip>;
|
|
150
|
+
export type CapabilityScope = z.infer<typeof capabilityScopeSchema>;
|
|
151
|
+
/**
|
|
152
|
+
* `POST /v1/capabilities` — mint a capability for a participant.
|
|
153
|
+
*
|
|
154
|
+
* Where an ephemeral key is a session for a person, a capability is a scoped,
|
|
155
|
+
* revocable grant for an agent or a system. Narrow by default: an agent or
|
|
156
|
+
* system capability must name its `operations` unless the caller explicitly
|
|
157
|
+
* asks for `wideScope`, which is itself privileged.
|
|
158
|
+
*
|
|
159
|
+
* This is the parsed body — the mint route validates against it rather than
|
|
160
|
+
* reading fields one at a time, so the shape and the validation rules cannot
|
|
161
|
+
* drift from each other or from the published contract.
|
|
162
|
+
*/
|
|
163
|
+
export declare const capabilityRequestSchema: z.ZodObject<{
|
|
164
|
+
participantKind: z.ZodEnum<{
|
|
165
|
+
user: "user";
|
|
166
|
+
agent: "agent";
|
|
167
|
+
system: "system";
|
|
168
|
+
}>;
|
|
169
|
+
participantId: z.ZodOptional<z.ZodString>;
|
|
170
|
+
syncGroups: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodUnion<readonly [z.ZodLiteral<"default">, z.core.$ZodBranded<z.ZodTemplateLiteral<`${string}:${string}`>, "SyncGroup", "out">]>>>>;
|
|
171
|
+
operations: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodTemplateLiteral<`${string}.update` | `${string}.create` | `${string}.delete` | `${string}.read`>>>>;
|
|
172
|
+
ttlSeconds: z.ZodNumber;
|
|
173
|
+
label: z.ZodOptional<z.ZodString>;
|
|
174
|
+
wideScope: z.ZodOptional<z.ZodBoolean>;
|
|
175
|
+
userMeta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
176
|
+
}, z.core.$strip>;
|
|
177
|
+
export type CapabilityRequest = z.infer<typeof capabilityRequestSchema>;
|