@abloatai/ablo 0.34.1 → 0.36.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 +758 -5
- package/README.md +56 -502
- package/bin/ablo.cjs +39 -0
- package/dist/BaseSyncedStore.d.ts +176 -48
- package/dist/BaseSyncedStore.js +346 -214
- package/dist/Database.d.ts +17 -44
- package/dist/Database.js +96 -79
- package/dist/InstanceCache.d.ts +31 -6
- package/dist/InstanceCache.js +65 -30
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +23 -13
- package/dist/Model.js +27 -17
- package/dist/ModelRegistry.d.ts +8 -4
- package/dist/ModelRegistry.js +20 -18
- package/dist/NetworkMonitor.d.ts +3 -1
- package/dist/NetworkMonitor.js +7 -5
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +47 -47
- package/dist/SyncClient.js +215 -156
- 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/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +129 -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 +8 -4
- package/dist/client/createInternalComponents.js +17 -10
- package/dist/client/createModelProxy.d.ts +98 -373
- package/dist/client/createModelProxy.js +233 -139
- package/dist/client/humans.d.ts +69 -0
- package/dist/client/humans.js +78 -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 +53 -0
- package/dist/client/reactiveEngine.js +688 -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/storeCluster.d.ts +47 -0
- package/dist/client/storeCluster.js +118 -0
- package/dist/client/storeLifecycle.d.ts +61 -0
- package/dist/client/storeLifecycle.js +231 -0
- 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 +22 -9
- package/dist/context.js +33 -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/index.d.ts +3 -3
- package/dist/core/index.js +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +230 -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 +44 -36
- package/dist/index.js +30 -22
- 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 +5 -2
- package/dist/query/client.js +10 -9
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +18 -8
- package/dist/react/AbloProvider.js +10 -9
- package/dist/react/context.d.ts +3 -3
- package/dist/react/context.js +1 -1
- package/dist/react/createAbloReact.d.ts +56 -0
- package/dist/react/createAbloReact.js +51 -0
- package/dist/react/index.d.ts +6 -5
- package/dist/react/index.js +6 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +12 -5
- package/dist/react/useAblo.js +26 -8
- 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 +90 -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 +11 -10
- package/dist/schema/index.js +22 -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 +6 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +20 -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/adapter.d.ts +7 -5
- package/dist/source/adapter.js +7 -5
- 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/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/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
- package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
- package/dist/{core → stores}/DatabaseManager.js +14 -13
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/{core → stores}/StoreManager.d.ts +9 -26
- package/dist/{core → stores}/StoreManager.js +29 -77
- package/dist/stores/SyncActionStore.d.ts +4 -2
- package/dist/stores/SyncActionStore.js +11 -17
- 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 +127 -6
- package/dist/sync/BootstrapFetcher.js +511 -83
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +5 -2
- package/dist/sync/OnDemandLoader.js +61 -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/bootstrapApply.d.ts +3 -0
- package/dist/sync/bootstrapApply.js +2 -2
- 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 +13 -12
- package/dist/sync/deltaPipeline.js +21 -4
- package/dist/sync/groupChange.d.ts +3 -0
- package/dist/sync/groupChange.js +16 -14
- package/dist/sync/participants.d.ts +24 -6
- package/dist/sync/participants.js +32 -23
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +23 -33
- package/dist/sync/schemas.js +29 -20
- 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/syncLog/contract.d.ts +20 -0
- package/dist/syncLog/contract.js +19 -0
- package/dist/syncLog/index.d.ts +1 -0
- package/dist/syncLog/index.js +1 -0
- 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 +212 -0
- package/dist/transaction/auth/capability.js +224 -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 +56 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -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 +45 -0
- package/dist/transaction/coordination/locator.d.ts +104 -0
- package/dist/transaction/coordination/locator.js +102 -0
- package/dist/transaction/coordination/schema.d.ts +1536 -0
- package/dist/transaction/coordination/schema.js +1177 -0
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +107 -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} +12 -12
- package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/footprint.d.ts +111 -0
- package/dist/transaction/footprint.js +0 -0
- 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 +285 -0
- package/dist/transaction/plugin.js +106 -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 +321 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +427 -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 +101 -0
- package/dist/transaction/resources/where.js +115 -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 +17 -23
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/fieldRef.d.ts +38 -0
- package/dist/transaction/schema/fieldRef.js +11 -0
- 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 +58 -0
- package/dist/transaction/schema/openapi.js +501 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
- 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 +39 -10
- package/dist/{schema → transaction/schema}/schema.js +24 -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 +5 -6
- 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} +11 -37
- 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/transaction/transport/httpClient.d.ts +131 -0
- package/dist/{client → transaction/transport}/httpClient.js +6 -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 +295 -97
- 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 +574 -0
- package/dist/transaction/transport/wsTransport.js +1023 -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 +73 -45
- package/dist/transaction/utils/duration.d.ts +50 -0
- package/dist/{utils → transaction/utils}/duration.js +32 -0
- 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 +420 -0
- package/dist/transaction/wire/accountResponses.js +290 -0
- package/dist/transaction/wire/auth.d.ts +56 -0
- package/dist/transaction/wire/auth.js +63 -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 +530 -0
- package/dist/transaction/wire/claims.js +327 -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 +204 -0
- package/dist/transaction/wire/feedEvent.js +65 -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 +562 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +54 -0
- package/dist/transaction/wire/index.js +83 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelMutations.d.ts +31 -0
- package/dist/transaction/wire/modelMutations.js +52 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transaction/wire/modelShape.d.ts +78 -0
- package/dist/transaction/wire/modelShape.js +74 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
- 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} +18 -16
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
- 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} +4 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/{core → views}/QueryView.d.ts +2 -2
- package/dist/{core → views}/QueryView.js +2 -2
- package/dist/{core → views}/ViewRegistry.d.ts +1 -1
- package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
- package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
- 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 +20 -13
- package/docs/api-keys.md +14 -10
- package/docs/api.md +27 -61
- package/docs/audit.md +6 -3
- package/docs/cli.md +41 -13
- package/docs/client-behavior.md +11 -9
- package/docs/concurrency-convention.md +49 -57
- package/docs/coordination.md +283 -121
- package/docs/data-sources.md +7 -5
- package/docs/debugging.md +39 -15
- 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 +46 -45
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +87 -30
- package/docs/guarantees.md +41 -12
- package/docs/how-it-works.md +38 -12
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +77 -74
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +31 -19
- package/docs/mcp.md +46 -21
- package/docs/migration.md +95 -18
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +3 -1
- package/docs/quickstart.md +22 -5
- package/docs/react.md +31 -18
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +4 -2
- package/docs/webhooks.md +12 -10
- package/llms.txt +48 -18
- package/package.json +21 -26
- 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/cli.cjs +0 -286329
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/client/httpClient.d.ts +0 -80
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/coordination/schema.js +0 -578
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -192
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -71
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transactions/durableWriteStore.js +0 -30
- package/dist/utils/duration.d.ts +0 -25
- 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/docs/interaction-model.md +0 -97
- /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
- /package/dist/{core → query}/QueryProcessor.js +0 -0
- /package/dist/{core/storeContract.js → storeContract.js} +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
- /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}/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/{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
- /package/dist/{core → views}/ViewRegistry.js +0 -0
package/docs/index.md
CHANGED
|
@@ -1,103 +1,189 @@
|
|
|
1
1
|
# Ablo Docs
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
users are editing — without the two clobbering each other's work. Ablo gives
|
|
5
|
-
the agent a narrow, audited write path: you declare your models, then everyone
|
|
6
|
-
(React components, server actions, and agents) calls the same
|
|
7
|
-
`ablo.deck.update(...)`. Ablo streams confirmed changes to everyone live and
|
|
8
|
-
rejects any write based on stale data.
|
|
3
|
+
> Collaboration infrastructure for AI agents: one API for agents, apps, and services to claim, change, and confirm the same rows.
|
|
9
4
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
Two agents reach for the same row. One claims it, does slow work — an LLM call,
|
|
6
|
+
a fetch, a chain of tools — and commits. The second is neither rejected nor
|
|
7
|
+
allowed to clobber: it waits in line, is handed the row as it now stands, and
|
|
8
|
+
proceeds. Contention becomes an ordering problem instead of a retry loop.
|
|
13
9
|
|
|
14
10
|
```ts
|
|
15
|
-
//
|
|
16
|
-
await ablo.
|
|
11
|
+
// Take the row. Anyone else who wants it waits, then reads it fresh.
|
|
12
|
+
await using claim = await ablo.reports.claim({ id: reportId });
|
|
13
|
+
|
|
14
|
+
await ablo.reports.update({
|
|
15
|
+
id: claim.data.id,
|
|
16
|
+
data: { forecast: await generateForecast(claim.data) },
|
|
17
|
+
wait: 'confirmed',
|
|
18
|
+
});
|
|
17
19
|
```
|
|
18
20
|
|
|
19
|
-
Claims
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
## What you get
|
|
24
|
-
|
|
25
|
-
Three things stay true no matter how you use Ablo:
|
|
26
|
-
|
|
27
|
-
- **One model API for every actor.** `ablo.<model>.update(...)` is the
|
|
28
|
-
call from React components, server actions, background workers, and
|
|
29
|
-
AI agents alike. No separate "agent SDK," no parallel mutation path.
|
|
30
|
-
Attribution comes from the credential, not the call site.
|
|
31
|
-
- **You declare tenancy scopes once.** Tenancy / per-entity scope
|
|
32
|
-
prefixes (`org:`, `deck:`, or your own `region:` / `customer:`) are
|
|
33
|
-
declared once on the schema's `identityRoles`, so application code
|
|
34
|
-
never builds an `org:123` string by hand — which keeps tenant
|
|
35
|
-
boundaries from leaking.
|
|
36
|
-
- **Stale writes are rejected.** If the row changed after you read it,
|
|
37
|
-
your write is turned away instead of silently overwriting the change
|
|
38
|
-
you didn't see.
|
|
39
|
-
|
|
40
|
-
## Start here
|
|
41
|
-
|
|
42
|
-
- [Quickstart](./quickstart.md) — Make your first schema-backed write.
|
|
43
|
-
- [Schema Contract](./schema-contract.md) — One schema becomes typed model clients, React reads, agent writes, Data Source shape, and schema push.
|
|
44
|
-
- [CLI & Migrations](./cli.md) — `init` / `migrate` / `push` / `generate`, the shared Zod→Postgres type map, and structured migration errors.
|
|
45
|
-
- [Identity & Sync Groups](./identity.md) — Use your own authentication; tell Ablo who's connecting and how org / team / user map to sync-group scope.
|
|
46
|
-
- [Integration Guide](./integration-guide.md) — Connect your database via Data Source, plus React, multiplayer, and agent patterns.
|
|
47
|
-
- [Guarantees](./guarantees.md) — What confirmed writes, stale checks, and claims guarantee.
|
|
48
|
-
- [Interaction Model](./interaction-model.md) — The schema, claim, update, confirmation loop.
|
|
49
|
-
- [API Reference](./api.md) — Model-by-model method shape.
|
|
50
|
-
- [Client Behavior](./client-behavior.md) — Options, errors, retries, timeouts, and imports.
|
|
51
|
-
- [Debugging & Logs](./debugging.md) — Turn on the `[Ablo]` coordination trace (`debug` / `logLevel`) to watch claims, queueing, and grants while you build — or read the same activity in code via `ClaimLog` to render an activity feed.
|
|
52
|
-
- [Connect Your Database](./data-sources.md) — Keep canonical rows in your app database without giving Ablo database credentials.
|
|
53
|
-
- [Operating on Your Database](./operating-on-your-database.md) — Which actions run freely, which to verify first, and which belong to a human — and how to tell.
|
|
54
|
-
- [React](./react.md) — Provider, hooks, and reactive reads for React apps.
|
|
55
|
-
- [API Keys](./api-keys.md) — Bearer tokens for the public API.
|
|
56
|
-
|
|
57
|
-
## API shape
|
|
58
|
-
|
|
59
|
-
| Plane | Primitives | Purpose |
|
|
60
|
-
|---|---|---|
|
|
61
|
-
| State | `Schema`, `Model`, `Claim`, `Receipt` | The product path. Load, coordinate, write, confirm. |
|
|
62
|
-
| Storage | `Data Source` | Your rows live in your own database behind a signed Data Source endpoint. |
|
|
63
|
-
|
|
64
|
-
## Use cases
|
|
65
|
-
|
|
66
|
-
- **Let agents write to shared state** — Give an AI agent scoped, revocable write access to your typed data.
|
|
67
|
-
- **Coordinate multiple actors** — Use claims to show pre-write work across humans and agents.
|
|
68
|
-
- **Audit every agent action** — Trace any write back to a human in one query.
|
|
69
|
-
- **Build collaborative editors** — Humans and agents on the same record, with realtime updates and stale-read protection.
|
|
70
|
-
- **Meter and gate API usage** — Per-key, per-team usage reports and quota enforcement.
|
|
71
|
-
- **Integrate with A2A and MCP** — Speak the same protocols as Claude, Cursor, Gemini.
|
|
21
|
+
Claims do not lock. A lock is held against a caller who may never come back; a
|
|
22
|
+
claim is a durable lease with a wait-line behind it, so you can always ask who
|
|
23
|
+
holds a row and who is queued for it. The write returns a receipt, and a write
|
|
24
|
+
based on a row that has since changed is turned away rather than applied.
|
|
72
25
|
|
|
73
|
-
##
|
|
26
|
+
## What people build
|
|
74
27
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
- [Usage](./api.md#usage) — Metering and audit dimensions.
|
|
84
|
-
- [Audit Log](./audit.md) — Trace any confirmed write back to the human behind it.
|
|
85
|
-
- [MCP](./mcp.md) — Expose Ablo models to MCP clients (Claude, Cursor).
|
|
28
|
+
<Columns>
|
|
29
|
+
<Card title="Run agents in parallel" icon="users" href="/coordination">
|
|
30
|
+
Many agents over one dataset. Claims put them in a line instead of a race.
|
|
31
|
+
</Card>
|
|
32
|
+
|
|
33
|
+
<Card title="Hand work between agents" icon="arrow-left-right" href="/agent-messaging">
|
|
34
|
+
One agent claims, works, releases. The next picks up with the fresh row and a durable note about why.
|
|
35
|
+
</Card>
|
|
86
36
|
|
|
87
|
-
|
|
37
|
+
<Card title="Scope what an agent may write" icon="key-round" href="/api-keys">
|
|
38
|
+
A revocable key bound to one project's models. Attribution comes from the credential, not the call site.
|
|
39
|
+
</Card>
|
|
40
|
+
|
|
41
|
+
<Card title="Confirm what landed" icon="receipt" href="/guarantees">
|
|
42
|
+
Every write returns a receipt. Nothing is fire-and-forget, and stale writes are rejected.
|
|
43
|
+
</Card>
|
|
44
|
+
|
|
45
|
+
<Card title="Audit every agent action" icon="scroll-text" href="/audit">
|
|
46
|
+
Trace any committed change back to the key that made it, and to the person who authorized that key.
|
|
47
|
+
</Card>
|
|
48
|
+
|
|
49
|
+
<Card title="Keep a person in the loop" icon="hand" href="/react">
|
|
50
|
+
Add the `humans()` plugin and people get presence and live queries. A person's claim is just another holder the agent waits behind.
|
|
51
|
+
</Card>
|
|
52
|
+
</Columns>
|
|
53
|
+
|
|
54
|
+
## Using Ablo
|
|
55
|
+
|
|
56
|
+
<Steps>
|
|
57
|
+
<Step title="Declare the models agents share">
|
|
58
|
+
`npx ablo init` scaffolds `ablo/schema.ts`, the typed client, and the type registration.
|
|
59
|
+
Declare only the models agents coordinate over — your auth, billing, and everything else
|
|
60
|
+
stay in your own migrations.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
npx ablo init && npx ablo push
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`push` is the step everything depends on: the server keeps its own copy of the schema, and
|
|
67
|
+
until it has yours, a write to a new model fails with `server_execute_unknown_model`.
|
|
68
|
+
</Step>
|
|
69
|
+
|
|
70
|
+
<Step title="Connect the database the rows live in">
|
|
71
|
+
Ablo writes through a scoped role and confirms by tailing your write-ahead log. It runs no
|
|
72
|
+
DDL and owns no schema — your migration tool stays in charge of the shape of your database.
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
npx ablo connect
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
No database yet? Pass an `apiKey` only and Ablo keeps the rows in its own log, so you can
|
|
79
|
+
build the whole system today and point it at Postgres when you are ready.
|
|
80
|
+
</Step>
|
|
81
|
+
|
|
82
|
+
<Step title="Build with Ablo">
|
|
83
|
+
You are writing the agent yourself — a worker, a job handler, a tool inside a model loop.
|
|
84
|
+
Agents hold no socket; the credential is the identity.
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
const ablo = Ablo({ schema, apiKey: process.env.ABLO_API_KEY, transport: 'http' });
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Read with `list` / `retrieve`, coordinate with `claim`, write with `create` / `update` /
|
|
91
|
+
`delete`. See [Agents](./agents.md) for the loop and [API Reference](./api.md) for the shape.
|
|
92
|
+
</Step>
|
|
88
93
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
- [Server Agent](./examples/server-agent.md) — Schema-backed worker.
|
|
93
|
-
- [Next.js](./examples/nextjs.md) — App-router setup with React bindings.
|
|
94
|
+
<Step title="Or point an MCP host at it">
|
|
95
|
+
The agent is Claude, Cursor, or another MCP host, and you want it operating your data
|
|
96
|
+
directly. The coordination server exposes the same claim-and-commit loop as tools.
|
|
94
97
|
|
|
95
|
-
|
|
98
|
+
```bash
|
|
99
|
+
claude mcp add ablo -- npx -y @abloatai/mcp
|
|
100
|
+
```
|
|
96
101
|
|
|
97
|
-
|
|
102
|
+
See [Model Context Protocol](./mcp.md) — and read the surface table below before you pick,
|
|
103
|
+
because Ablo publishes two MCP servers and only one of them is a data plane.
|
|
104
|
+
</Step>
|
|
105
|
+
</Steps>
|
|
106
|
+
|
|
107
|
+
## Surfaces
|
|
108
|
+
|
|
109
|
+
Every surface reaches the same coordinated state. Pick by who is calling.
|
|
110
|
+
|
|
111
|
+
| Surface | Use it for |
|
|
112
|
+
|---|---|
|
|
113
|
+
| **SDK**: `@abloatai/ablo`, `transport: 'http'` | The agents themselves. Stateless, request/response, nothing held open. The main path. |
|
|
114
|
+
| **Coordination MCP**: `@abloatai/mcp` | An agent living inside an MCP host that needs claim and commit as tools. A data plane. |
|
|
115
|
+
| **`humans()`**: with `@abloatai/ablo/react` | The interfaces a person watches agent work arrive in: presence, live queries, a local copy. |
|
|
116
|
+
| **CLI**: `ablo` | Scaffolding, schema push, connecting a database. Terminals and CI. |
|
|
117
|
+
| **REST**: `/api/v1` | Runtimes with no SDK. |
|
|
118
|
+
| **Integration-helper MCP**: hosted `/api/mcp` | Teaching a coding assistant the SDK while you build. Docs, lint, and scaffolds only. |
|
|
119
|
+
|
|
120
|
+
The two MCP servers are not interchangeable. The coordination server changes
|
|
121
|
+
your data; the integration-helper server serves documentation and has no
|
|
122
|
+
per-model data tools at all. An agent that edits rows uses the SDK or the
|
|
123
|
+
coordination server — never the helper.
|
|
124
|
+
|
|
125
|
+
### Where people fit
|
|
126
|
+
|
|
127
|
+
The bare client is the coordination layer: commit, read, observe, claim. People
|
|
128
|
+
are something you add to it. `humans()` is the plugin that declares the local,
|
|
129
|
+
watchable copy — the offline store, live queries, presence, and the framework
|
|
130
|
+
bindings — and it needs a duplex connection, so a stateless agent cannot install
|
|
131
|
+
it and is told so at construction rather than left with a subscription that never
|
|
132
|
+
delivers.
|
|
133
|
+
|
|
134
|
+
There is no `agents()` plugin, and the absence is the point: agents are the
|
|
135
|
+
default caller, not a special one.
|
|
136
|
+
|
|
137
|
+
## Concepts
|
|
138
|
+
|
|
139
|
+
- [How Ablo Works](./how-it-works.md) — the mental model in one page: you write through Ablo, it lands in your Postgres, the write-ahead log confirms it. **Read this first.**
|
|
140
|
+
- [Coordination](./coordination.md) — `claim`, `claim.state`, and `claim.queue`: who holds a row, and who is waiting.
|
|
141
|
+
- [Concurrency Convention](./concurrency-convention.md) — the governing rule for how concurrent writes resolve.
|
|
142
|
+
- [Guarantees](./guarantees.md) — what a confirmed write, a stale-write rejection, and a claim each promise.
|
|
143
|
+
- [Idempotency](./idempotency.md) — make a retried write safe; what replays, what re-runs, and for how long.
|
|
144
|
+
- [Schema Contract](./schema-contract.md) — one schema becomes typed clients, agent writes, React reads, and the push.
|
|
145
|
+
- [Agents](./agents.md) — the stateless participant: wake, read, claim, commit, idle.
|
|
146
|
+
- [Agent Messaging](./agent-messaging.md) — durable handoffs between agents, linked to the claim they discuss.
|
|
147
|
+
- [Identity & Sync Groups](./identity.md) — who is connecting, and which slice of state they see.
|
|
148
|
+
- [Change Propagation](./groups.md) — how one row's change reaches the actors that depend on it.
|
|
149
|
+
- [Client Behavior](./client-behavior.md) — options, errors, retries, timeouts, and imports.
|
|
150
|
+
|
|
151
|
+
## Authority
|
|
152
|
+
|
|
153
|
+
- [Projects](./projects.md) — one organization, many apps; each with its own schema, planes, and keys.
|
|
154
|
+
- [API Keys](./api-keys.md) — the credential that carries an agent's identity and its scopes.
|
|
155
|
+
- [Sessions](./sessions.md) — short-lived scoped credentials your backend mints.
|
|
156
|
+
- [Audit Log](./audit.md) — trace any confirmed write back to the person behind it.
|
|
157
|
+
- [Operating on Your Database](./operating-on-your-database.md) — which actions run freely, which to verify first, and which belong to a human.
|
|
158
|
+
- [Session Settings](./session-settings.md) — point your row-level-security policies at Ablo's writes, by naming the settings they already read.
|
|
159
|
+
|
|
160
|
+
## Build
|
|
161
|
+
|
|
162
|
+
- [Quickstart](./quickstart.md) — make your first coordinated write.
|
|
163
|
+
- [Integration Guide](./integration-guide.md) — the canonical end-to-end integration.
|
|
164
|
+
- [CLI & Migrations](./cli.md) — `init` / `connect` / `push` / `migrate` / `generate`.
|
|
165
|
+
- [Connect Your Database](./data-sources.md) — where rows land when your own database is canonical.
|
|
166
|
+
- [Deployment](./deployment.md) — the database, the keys, and the schema push that take an integration to production.
|
|
167
|
+
- [React](./react.md) — provider, hooks, and reactive reads.
|
|
168
|
+
- [Webhooks](./webhooks.md) — react to confirmed change from outside the SDK.
|
|
169
|
+
- [Debugging & Logs](./debugging.md) — watch claims, queueing, and grants while you build.
|
|
170
|
+
|
|
171
|
+
## Reference
|
|
172
|
+
|
|
173
|
+
- [API Reference](./api.md) — model-by-model method shape.
|
|
174
|
+
- [Errors](./errors.md) — the code registry, its categories, and what to do about each.
|
|
175
|
+
- [Version History & Migration](./migration.md) — every breaking change and its migration.
|
|
176
|
+
- [Changelog](../CHANGELOG.md) — what shipped recently.
|
|
177
|
+
|
|
178
|
+
## Examples
|
|
179
|
+
|
|
180
|
+
- [AI SDK Tool](./examples/ai-sdk-tool.md) — put Ablo inside a model's tool call.
|
|
181
|
+
- [Agent + Human](./examples/agent-human.md) — yield when a person is holding the same report.
|
|
182
|
+
- [Server Agent](./examples/server-agent.md) — a schema-backed worker.
|
|
183
|
+
- [Existing Python Backend](./examples/existing-python-backend.md) — add coordination without replacing your API server.
|
|
184
|
+
- [Next.js](./examples/nextjs.md) — app-router setup with React bindings.
|
|
98
185
|
|
|
99
186
|
## More
|
|
100
187
|
|
|
101
188
|
- [README](../README.md) — product overview and first example.
|
|
102
|
-
- [AGENTS.md](../AGENTS.md) —
|
|
103
|
-
- [Changelog](../CHANGELOG.md) — what shipped recently.
|
|
189
|
+
- [AGENTS.md](../AGENTS.md) — installation guidance for coding assistants.
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
# Integration Guide
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
> The canonical end-to-end integration, added to an existing product one model at a time.
|
|
4
|
+
|
|
5
|
+
When several AI agents edit the same records in your app — alongside any people
|
|
6
|
+
watching them work — they overwrite each other, and there is no good place to
|
|
7
|
+
coordinate. Ablo gives them one shared, typed write path: the same
|
|
8
|
+
`ablo.<model>.update(...)` call from an agent, a background worker, a server
|
|
9
|
+
action, or a React component. This guide adds it to a product that already has a
|
|
10
|
+
backend and a database, one model at a time.
|
|
9
11
|
|
|
10
12
|
Three things hold no matter which actor is writing:
|
|
11
13
|
|
|
12
|
-
- **One model API for every actor
|
|
14
|
+
- **One model API for every actor:** `ablo.<model>.update(...)` is what
|
|
13
15
|
React components, server actions, background workers, and AI agents
|
|
14
16
|
all call. No separate "agent SDK," no parallel mutation path. The
|
|
15
17
|
attribution comes from the credential, not the call site.
|
|
@@ -79,7 +81,7 @@ and write path are ready for production.
|
|
|
79
81
|
When handing this to a coding agent, give it a concrete target:
|
|
80
82
|
|
|
81
83
|
```txt
|
|
82
|
-
Add Ablo to this app for one model
|
|
84
|
+
Add Ablo to this app for one model your agents edit.
|
|
83
85
|
Use the org sandbox sk_test_* key. Declare schema, add the Ablo client, replace
|
|
84
86
|
one write with ablo.<model>.update(..., { readAt, onStale: 'reject',
|
|
85
87
|
wait: 'confirmed' }), and add a smoke test for two concurrent writers.
|
|
@@ -139,7 +141,6 @@ model(
|
|
|
139
141
|
{
|
|
140
142
|
/* fields */
|
|
141
143
|
},
|
|
142
|
-
/* relations */ {},
|
|
143
144
|
{
|
|
144
145
|
// Axis 1 — `policy`: who may READ a row (tenant isolation / RLS). A
|
|
145
146
|
// row-local `organization_id` column is the default, so you omit this for
|
|
@@ -256,7 +257,7 @@ refreshes before expiry.
|
|
|
256
257
|
Reads come in two flavors, and you pick based on whether you can wait.
|
|
257
258
|
`retrieve({ id })` and `list({ where })` hit the server (and hydrate the local
|
|
258
259
|
store) — they're async, so you `await` them. `get(id)` (positional),
|
|
259
|
-
`
|
|
260
|
+
`local.list({ where })`, and `local.count({ where })` read the already-synced local
|
|
260
261
|
graph synchronously, so they're the ones you call in render — and the ones you
|
|
261
262
|
use inside a `useAblo` selector, never the async `retrieve`/`list`.
|
|
262
263
|
|
|
@@ -270,12 +271,12 @@ const report = await ablo.weatherReports.retrieve({ id: 'report_stockholm' });
|
|
|
270
271
|
if (!report) throw new Error('report not found');
|
|
271
272
|
```
|
|
272
273
|
|
|
273
|
-
Use `
|
|
274
|
+
Use `local.retrieve`, `local.list`, and `local.count` for synchronous local-graph reads after
|
|
274
275
|
data has synced.
|
|
275
276
|
|
|
276
277
|
```ts
|
|
277
|
-
const report = ablo.weatherReports.
|
|
278
|
-
const activeReports = ablo.weatherReports.
|
|
278
|
+
const report = ablo.weatherReports.local.retrieve('report_stockholm');
|
|
279
|
+
const activeReports = ablo.weatherReports.local.list({
|
|
279
280
|
where: { projectId: 'proj_123' },
|
|
280
281
|
filter: (report) => report.status !== 'ready',
|
|
281
282
|
orderBy: { updatedAt: 'desc' },
|
|
@@ -295,7 +296,7 @@ export function ReportRow({
|
|
|
295
296
|
}: {
|
|
296
297
|
report: { id: string; location: string; status: string };
|
|
297
298
|
}) {
|
|
298
|
-
const report = useAblo((ablo) => ablo.weatherReports.
|
|
299
|
+
const report = useAblo((ablo) => ablo.weatherReports.local.retrieve(serverReport.id)) ?? serverReport;
|
|
299
300
|
const active = useAblo((ablo) => ablo.weatherReports.claim.state({ id: serverReport.id }));
|
|
300
301
|
|
|
301
302
|
return <button disabled={Boolean(active) || report.status === 'ready'}>{report.location}</button>;
|
|
@@ -350,8 +351,19 @@ server -> ablo.weatherReports.update(...)
|
|
|
350
351
|
Ablo coordinates those writes, fans out confirmed deltas, exposes active claims,
|
|
351
352
|
and lets callers reject stale writes with `readAt`.
|
|
352
353
|
|
|
353
|
-
|
|
354
|
-
|
|
354
|
+
A write that reaches your database some other way still reaches connected
|
|
355
|
+
clients. A `psql` session, a cron job, an admin tool, a legacy endpoint: Ablo
|
|
356
|
+
tails your write-ahead log, so a change it did not make is picked up and fanned
|
|
357
|
+
out like any other, attributed to the data source rather than to an agent.
|
|
358
|
+
|
|
359
|
+
What such a write does not get is the coordination. It never entered the commit
|
|
360
|
+
chokepoint, so no claim was checked, no `readAt` was compared, and no idempotency
|
|
361
|
+
key was honoured. It can land on top of a row an agent is holding. Route anything
|
|
362
|
+
that must respect a claim through `ablo.<model>`.
|
|
363
|
+
|
|
364
|
+
On the [Data Source endpoint fallback](./data-sources.md) there is no replication
|
|
365
|
+
stream to tail, and there the original caveat holds: a direct write stays
|
|
366
|
+
invisible until your app reports it through Data Source events.
|
|
355
367
|
|
|
356
368
|
## 6. Existing API Backend
|
|
357
369
|
|
|
@@ -375,7 +387,7 @@ The migration can be gradual:
|
|
|
375
387
|
|
|
376
388
|
1. Declare schema for one model, such as `reports`.
|
|
377
389
|
2. Keep existing server loads for first paint.
|
|
378
|
-
3. Add `useAblo((ablo) => ablo.weatherReports.
|
|
390
|
+
3. Add `useAblo((ablo) => ablo.weatherReports.local.retrieve(id)) ?? serverReport` for live rows.
|
|
379
391
|
4. Add one Data Source endpoint that calls the existing service layer.
|
|
380
392
|
5. Move one mutation button from `fetch('/api/reports/...')` to `ablo.weatherReports.update(...)`.
|
|
381
393
|
6. Add an outbox/events path for writes that still happen outside Ablo.
|
|
@@ -507,8 +519,8 @@ them.
|
|
|
507
519
|
| `retrieve({ id })` | Async read of one row from the server (await it). |
|
|
508
520
|
| `list({ where })` | Async read of many rows from the server (await it). |
|
|
509
521
|
| `get(id)` | Synchronous local read of one synced row (positional id; use in render). |
|
|
510
|
-
| `
|
|
511
|
-
| `
|
|
522
|
+
| `local.list({ where })` | Synchronous local read of many synced rows. |
|
|
523
|
+
| `local.count({ where })` | Synchronous local count of synced rows. |
|
|
512
524
|
| `create({ data, id? })` | Create through the model client. |
|
|
513
525
|
| `update({ id, data, ...opts })` | Update through the model client. |
|
|
514
526
|
| `delete({ id, ...opts })` | Delete through the model client. |
|
package/docs/mcp.md
CHANGED
|
@@ -1,48 +1,73 @@
|
|
|
1
1
|
# Model Context Protocol
|
|
2
2
|
|
|
3
|
+
> Two MCP servers for two different jobs — one of them is a data plane, one is not.
|
|
4
|
+
|
|
3
5
|
Ablo publishes **two** MCP servers for two different jobs. Don't confuse them:
|
|
4
6
|
|
|
5
7
|
| Server | Purpose | Auth | Tools |
|
|
6
8
|
|---|---|---|---|
|
|
7
|
-
| **Coordination** (`@
|
|
9
|
+
| **Coordination** (`@abloatai/mcp`) | Manage your Ablo the way the CLI does, and let an agent safely read & mutate application data | API key (`sk_…` / `rk_…`) | projects, schema, logs, usage: plus `get` / `list` / `create` / `update` / `delete` / `claim` / `release` over your rows |
|
|
8
10
|
| **Integration-helper** (hosted `/api/mcp`) | Help an AI coding assistant write SDK integration code that compiles | none (public docs) | doc search, export surface, schema lint, scaffold |
|
|
9
11
|
|
|
10
|
-
The coordination server **is the data plane** — it is
|
|
11
|
-
state. The integration-helper server only serves docs,
|
|
12
|
-
scaffolds; it does **not** read or write application data (there are no
|
|
12
|
+
The coordination server manages your account **and is the data plane** — it is
|
|
13
|
+
how an agent changes state. The integration-helper server only serves docs,
|
|
14
|
+
schema lint, and scaffolds; it does **not** read or write application data (there are no
|
|
13
15
|
per-model data tools on it). Pick by what you're doing: shipping an agent that
|
|
14
16
|
edits rows → coordination; teaching your IDE assistant the SDK → helper.
|
|
15
17
|
|
|
16
|
-
## Coordination server (`@
|
|
18
|
+
## Coordination server (`@abloatai/mcp`)
|
|
17
19
|
|
|
18
|
-
The coordination server
|
|
19
|
-
(`/api/v1/models/...`)
|
|
20
|
-
the
|
|
21
|
-
gets one safe loop: **claim → read → commit → release.**
|
|
20
|
+
The coordination server does two jobs: it manages your Ablo the way the `ablo`
|
|
21
|
+
CLI does, and it renders the model-scoped API (`/api/v1/models/...`) as tools —
|
|
22
|
+
the same surface as `ablo.<model>.create/update/claim`. An agent connects with
|
|
23
|
+
your API key and gets one safe loop: **claim → read → commit → release.**
|
|
22
24
|
|
|
23
25
|
Install over stdio; set your key in the host's MCP env:
|
|
24
26
|
|
|
25
27
|
```bash
|
|
26
|
-
claude mcp add ablo -- npx -y @
|
|
28
|
+
claude mcp add ablo -- npx -y @abloatai/mcp
|
|
27
29
|
# env: ABLO_API_KEY=sk_… (ABLO_API_URL optional; defaults to the hosted API)
|
|
28
30
|
```
|
|
29
31
|
|
|
30
|
-
|
|
32
|
+
### Managing your Ablo
|
|
33
|
+
|
|
34
|
+
| Tool | Mirrors | Does |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| `get_schema` | `ablo status` | the models this key can address, and its environment + project |
|
|
37
|
+
| `list_projects` | `ablo projects list` | the org's projects (needs `sk_`) |
|
|
38
|
+
| `create_project` | `ablo projects create` | create one (needs `sk_`) |
|
|
39
|
+
| `tail_logs` | `ablo logs` | recent commits and the actor behind each |
|
|
40
|
+
| `get_usage` |: | usage in daily buckets |
|
|
41
|
+
|
|
42
|
+
There are no key-management tools. A mint returns the plaintext once — only a
|
|
43
|
+
hash is kept — so no tool can hand it back later, and returning it at mint time
|
|
44
|
+
would write a live secret into the agent's context and the conversation
|
|
45
|
+
transcript, where it outlives any revocation. Listing and revoking will arrive
|
|
46
|
+
once a grant identifies the caller as a person rather than a key. Manage keys
|
|
47
|
+
with `ablo login` or the dashboard.
|
|
48
|
+
|
|
49
|
+
`ablo init`, `push`, `pull`, and `generate` have no tools: they read and write
|
|
50
|
+
files in your repo, which the server cannot see. Run those in a shell — then
|
|
51
|
+
call `get_schema` to see the result.
|
|
52
|
+
|
|
53
|
+
### Reading and changing rows
|
|
54
|
+
|
|
55
|
+
Each tool mirrors an SDK verb, scoped to a model + id. Model names come from
|
|
56
|
+
`get_schema`:
|
|
31
57
|
|
|
32
58
|
| Tool | Mirrors | Does |
|
|
33
59
|
|---|---|---|
|
|
34
|
-
| `get_model` | `ablo.<model>.
|
|
35
|
-
| `
|
|
60
|
+
| `get_model` | `ablo.<model>.local.retrieve(id)` | read latest state + active claims |
|
|
61
|
+
| `list_records` | `ablo.<model>.list({…})` | cursor-paginated list with filters |
|
|
36
62
|
| `create_model` | `ablo.<model>.create({ data })` | guarded create |
|
|
37
63
|
| `update_model` | `ablo.<model>.update({ id, … })` | guarded update |
|
|
38
64
|
| `delete_model` | `ablo.<model>.delete({ id })` | guarded delete |
|
|
39
65
|
| `claim_model` | `ablo.<model>.claim({ id })` | acquire / queue a coordination lease |
|
|
40
|
-
| `release_claim`
|
|
66
|
+
| `release_claim` |: | release the lease so others proceed |
|
|
41
67
|
|
|
42
68
|
The agent-facing contract — the safe loop, the "derive idempotency keys from
|
|
43
69
|
the business event" rule, and the error-code playbook — ships as a loadable
|
|
44
|
-
skill at `@
|
|
45
|
-
(`createCoordinationMcpServer`, `src/tools.ts`).
|
|
70
|
+
skill at `@abloatai/mcp/skill.md`.
|
|
46
71
|
|
|
47
72
|
## Integration-helper server
|
|
48
73
|
|
|
@@ -57,7 +82,7 @@ server above, never here.
|
|
|
57
82
|
> The `@abloatai/ablo` npm package itself bundles neither server — it has
|
|
58
83
|
> no `@modelcontextprotocol/sdk` dependency. The helper is a feature of Ablo's
|
|
59
84
|
> hosted app, mounted at `/api/mcp`; the coordination server is the separate
|
|
60
|
-
> `@
|
|
85
|
+
> `@abloatai/mcp` package.
|
|
61
86
|
|
|
62
87
|
### Install
|
|
63
88
|
|
|
@@ -69,9 +94,9 @@ claude mcp add --transport http ablo https://<your-app>/api/mcp
|
|
|
69
94
|
|
|
70
95
|
The endpoint is identical for every client — only the config surface differs:
|
|
71
96
|
|
|
72
|
-
- **Claude Code
|
|
73
|
-
- **Cursor
|
|
74
|
-
- **Windsurf
|
|
97
|
+
- **Claude Code:** run the `claude mcp add` command above; verify with `/mcp list`, remove with `claude mcp remove ablo`.
|
|
98
|
+
- **Cursor:** add the server to `~/.cursor/mcp.json` (macOS / Linux), then restart.
|
|
99
|
+
- **Windsurf:** add the same JSON via Settings → Cascade → MCP, then restart.
|
|
75
100
|
|
|
76
101
|
Cursor and Windsurf use the same config shape:
|
|
77
102
|
|
|
@@ -95,7 +120,7 @@ Each client then lists the Ablo tools (`search_ablo_docs`, `get_recipe`, `get_ap
|
|
|
95
120
|
| `get_recipe` | Returns the full markdown of one doc by name (e.g. `readme`, `quickstart`, `schema-contract`, `integration-guide`, `api`, `guarantees`). |
|
|
96
121
|
| `get_api_surface` | Returns the structured export list for an SDK subpath (`@abloatai/ablo`, `./react`, `./schema`, `./testing`, …). Call with no argument to list every subpath. |
|
|
97
122
|
| `validate_schema` | Lints `defineSchema` source against the DSL rules (camelCase fields, lowercase model keys, `scope`/`grants` sync groups, valid `load` strategies, no legacy builders) and returns a structured issue list. Runs no code. |
|
|
98
|
-
| `scaffold_app` | Emits a starter file tree for a schema-first integration
|
|
123
|
+
| `scaffold_app` | Emits a starter file tree for a schema-first integration: `next`, `node-agent`, or `plain`, with a `data-source` (your own database) endpoint. |
|
|
99
124
|
|
|
100
125
|
#### Resources
|
|
101
126
|
|