@abloatai/ablo 0.35.0 → 0.37.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 -2
- package/CHANGELOG.md +71 -1929
- package/NOTICE +2 -2
- package/README.md +23 -532
- package/assets/banner.png +0 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +2 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -0
- package/dist/coordination.d.ts +2 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +2 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -112
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -161
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +3 -0
- package/dist/react.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/source-conformance.d.ts +2 -0
- package/dist/source-conformance.d.ts.map +1 -0
- package/dist/source-conformance.js +2 -0
- package/dist/source-conformance.js.map +1 -0
- package/dist/source-drizzle.d.ts +2 -0
- package/dist/source-drizzle.d.ts.map +1 -0
- package/dist/source-drizzle.js +2 -0
- package/dist/source-drizzle.js.map +1 -0
- package/dist/source-kysely.d.ts +2 -0
- package/dist/source-kysely.d.ts.map +1 -0
- package/dist/source-kysely.js +2 -0
- package/dist/source-kysely.js.map +1 -0
- package/dist/source-next.d.ts +2 -0
- package/dist/source-next.d.ts.map +1 -0
- package/dist/source-next.js +2 -0
- package/dist/source-next.js.map +1 -0
- package/dist/source.d.ts +2 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +2 -0
- package/dist/source.js.map +1 -0
- package/dist/wire.d.ts +2 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +2 -0
- package/dist/wire.js.map +1 -0
- package/docs/agents.md +2 -2
- package/docs/api-keys.md +13 -12
- package/docs/api.md +15 -53
- package/docs/audit.md +4 -3
- package/docs/cli.md +11 -11
- package/docs/client-behavior.md +9 -9
- package/docs/concurrency-convention.md +28 -42
- package/docs/coordination.md +228 -86
- package/docs/data-sources.md +5 -5
- package/docs/debugging.md +34 -12
- package/docs/deployment.md +8 -8
- package/docs/examples/agent-human.md +4 -4
- package/docs/examples/ai-sdk-tool.md +1 -1
- package/docs/examples/existing-python-backend.md +15 -4
- package/docs/examples/nextjs.md +27 -6
- package/docs/examples/scoped-agent.md +3 -3
- package/docs/examples/server-agent.md +2 -2
- package/docs/groups.md +57 -3
- package/docs/guarantees.md +37 -10
- package/docs/how-it-works.md +32 -8
- package/docs/idempotency.md +6 -6
- package/docs/identity.md +24 -24
- package/docs/index.md +8 -8
- package/docs/integration-guide.md +38 -16
- package/docs/internal/README.md +18 -0
- package/docs/internal/agent-fleet-coordination-design.md +171 -0
- package/docs/internal/agent-orchestration.md +58 -0
- package/docs/internal/commit-identifiers.md +91 -0
- package/docs/internal/concurrency-open-decisions.md +37 -0
- package/docs/internal/data-source-reverse-channel.md +150 -0
- package/docs/internal/per-field-conflict-detection.md +165 -0
- package/docs/internal/postgres-replication.md +64 -0
- package/docs/internal/serializable-schema.md +119 -0
- package/docs/internal/structure.md +32 -0
- package/docs/mcp.md +9 -9
- package/docs/migration.md +37 -18
- package/docs/projects.md +1 -1
- package/docs/quickstart.md +2 -2
- package/docs/react.md +24 -13
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- package/docs/webhooks.md +9 -9
- package/examples/README.md +2 -2
- package/examples/data-source/README.md +1 -1
- package/examples/data-source/ablo-driver.ts +1 -1
- package/examples/data-source/customer-server.ts +1 -1
- package/examples/data-source/run.ts +1 -1
- package/examples/data-source/schema.ts +1 -1
- package/examples/quickstart.ts +2 -2
- package/llms.txt +12 -12
- package/package.json +64 -174
- package/dist/BaseSyncedStore.d.ts +0 -823
- package/dist/BaseSyncedStore.js +0 -1955
- package/dist/Database.d.ts +0 -335
- package/dist/Database.js +0 -1500
- package/dist/InstanceCache.d.ts +0 -233
- package/dist/InstanceCache.js +0 -1164
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -444
- package/dist/Model.js +0 -909
- package/dist/ModelRegistry.d.ts +0 -221
- package/dist/ModelRegistry.js +0 -537
- package/dist/NetworkMonitor.d.ts +0 -26
- package/dist/NetworkMonitor.js +0 -77
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -551
- package/dist/SyncClient.js +0 -2199
- package/dist/adapters/alwaysOnline.d.ts +0 -14
- package/dist/adapters/alwaysOnline.js +0 -17
- package/dist/adapters/inMemoryStorage.d.ts +0 -31
- package/dist/adapters/inMemoryStorage.js +0 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
- package/dist/ai-sdk/coordinatedTool.js +0 -134
- package/dist/ai-sdk/coordinationContext.d.ts +0 -46
- package/dist/ai-sdk/coordinationContext.js +0 -106
- package/dist/ai-sdk/index.d.ts +0 -121
- package/dist/ai-sdk/index.js +0 -121
- package/dist/ai-sdk/wrap.d.ts +0 -65
- package/dist/ai-sdk/wrap.js +0 -39
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.js +0 -8
- package/dist/batching/index.d.ts +0 -55
- package/dist/batching/index.js +0 -147
- package/dist/cli.cjs +0 -288600
- package/dist/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -149
- package/dist/client/abloClient.d.ts +0 -309
- package/dist/client/abloClient.js +0 -13
- package/dist/client/clientPrelude.d.ts +0 -52
- package/dist/client/clientPrelude.js +0 -60
- package/dist/client/consoleLogger.d.ts +0 -35
- package/dist/client/consoleLogger.js +0 -44
- package/dist/client/coreClient.d.ts +0 -60
- package/dist/client/coreClient.js +0 -118
- package/dist/client/createInternalComponents.d.ts +0 -46
- package/dist/client/createInternalComponents.js +0 -92
- package/dist/client/createModelProxy.d.ts +0 -228
- package/dist/client/createModelProxy.js +0 -818
- package/dist/client/humans.d.ts +0 -48
- package/dist/client/humans.js +0 -52
- package/dist/client/modelRegistration.d.ts +0 -10
- package/dist/client/modelRegistration.js +0 -312
- package/dist/client/options.d.ts +0 -461
- package/dist/client/options.js +0 -7
- package/dist/client/reactiveEngine.d.ts +0 -48
- package/dist/client/reactiveEngine.js +0 -910
- package/dist/client/resourceTypes.d.ts +0 -12
- package/dist/client/resourceTypes.js +0 -10
- package/dist/client/schemaConfig.d.ts +0 -44
- package/dist/client/schemaConfig.js +0 -185
- package/dist/client/validateAbloOptions.d.ts +0 -42
- package/dist/client/validateAbloOptions.js +0 -43
- package/dist/client/wsMutationExecutor.d.ts +0 -27
- package/dist/client/wsMutationExecutor.js +0 -72
- package/dist/context.d.ts +0 -29
- package/dist/context.js +0 -58
- package/dist/coordination/ClaimLog.d.ts +0 -26
- package/dist/coordination/ClaimLog.js +0 -32
- package/dist/coordination/index.d.ts +0 -1
- package/dist/coordination/index.js +0 -8
- package/dist/core/DatabaseManager.d.ts +0 -105
- package/dist/core/DatabaseManager.js +0 -387
- package/dist/core/QueryProcessor.d.ts +0 -75
- package/dist/core/QueryProcessor.js +0 -255
- package/dist/core/QueryView.d.ts +0 -79
- package/dist/core/QueryView.js +0 -218
- package/dist/core/StoreManager.d.ts +0 -112
- package/dist/core/StoreManager.js +0 -302
- package/dist/core/ViewRegistry.d.ts +0 -20
- package/dist/core/ViewRegistry.js +0 -55
- package/dist/core/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/core/openIDBWithTimeout.d.ts +0 -65
- package/dist/core/openIDBWithTimeout.js +0 -153
- package/dist/core/queryUtils.d.ts +0 -45
- package/dist/core/queryUtils.js +0 -69
- package/dist/core/storeContract.d.ts +0 -145
- package/dist/core/storeContract.js +0 -12
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -227
- package/dist/docs/index.d.ts +0 -10
- package/dist/docs/index.js +0 -10
- package/dist/environment.d.ts +0 -1
- package/dist/environment.js +0 -8
- package/dist/interfaces/index.d.ts +0 -311
- package/dist/interfaces/index.js +0 -9
- package/dist/keys/index.d.ts +0 -1
- package/dist/keys/index.js +0 -8
- package/dist/mutators/RecordingMutation.d.ts +0 -36
- package/dist/mutators/RecordingMutation.js +0 -182
- package/dist/mutators/Transaction.d.ts +0 -40
- package/dist/mutators/Transaction.js +0 -58
- package/dist/mutators/UndoManager.d.ts +0 -258
- package/dist/mutators/UndoManager.js +0 -658
- package/dist/mutators/defineMutators.d.ts +0 -60
- package/dist/mutators/defineMutators.js +0 -18
- package/dist/mutators/inverseOp.d.ts +0 -126
- package/dist/mutators/inverseOp.js +0 -71
- package/dist/mutators/mutateActions.d.ts +0 -45
- package/dist/mutators/mutateActions.js +0 -105
- package/dist/mutators/readerActions.d.ts +0 -33
- package/dist/mutators/readerActions.js +0 -57
- package/dist/mutators/undoApply.d.ts +0 -51
- package/dist/mutators/undoApply.js +0 -117
- package/dist/policy/index.d.ts +0 -21
- package/dist/policy/index.js +0 -20
- package/dist/query/client.d.ts +0 -61
- package/dist/query/client.js +0 -137
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -230
- package/dist/react/AbloProvider.js +0 -455
- package/dist/react/ClientSideSuspense.d.ts +0 -36
- package/dist/react/ClientSideSuspense.js +0 -17
- package/dist/react/DefaultFallback.d.ts +0 -24
- package/dist/react/DefaultFallback.js +0 -43
- package/dist/react/context.d.ts +0 -55
- package/dist/react/context.js +0 -29
- package/dist/react/index.d.ts +0 -61
- package/dist/react/index.js +0 -66
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -75
- package/dist/react/useAblo.js +0 -102
- package/dist/react/useCurrentUserId.d.ts +0 -22
- package/dist/react/useCurrentUserId.js +0 -34
- package/dist/react/useErrorListener.d.ts +0 -20
- package/dist/react/useErrorListener.js +0 -38
- package/dist/react/useMutationFailureListener.d.ts +0 -26
- package/dist/react/useMutationFailureListener.js +0 -38
- package/dist/react/useMutators.d.ts +0 -56
- package/dist/react/useMutators.js +0 -84
- package/dist/react/useReactive.d.ts +0 -35
- package/dist/react/useReactive.js +0 -123
- package/dist/react/useSyncStatus.d.ts +0 -59
- package/dist/react/useSyncStatus.js +0 -76
- package/dist/react/useUndoScope.d.ts +0 -34
- package/dist/react/useUndoScope.js +0 -81
- package/dist/schema/coordination.d.ts +0 -112
- package/dist/schema/coordination.js +0 -129
- package/dist/schema/ddl.d.ts +0 -97
- package/dist/schema/ddl.js +0 -491
- package/dist/schema/ddlLock.d.ts +0 -35
- package/dist/schema/ddlLock.js +0 -46
- package/dist/schema/diff.d.ts +0 -225
- package/dist/schema/diff.js +0 -289
- package/dist/schema/generate.d.ts +0 -19
- package/dist/schema/generate.js +0 -86
- package/dist/schema/index.d.ts +0 -41
- package/dist/schema/index.js +0 -76
- package/dist/schema/queries.d.ts +0 -201
- package/dist/schema/queries.js +0 -144
- package/dist/schema/select.d.ts +0 -40
- package/dist/schema/select.js +0 -87
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -262
- package/dist/schema/sugar.d.ts +0 -109
- package/dist/schema/sugar.js +0 -83
- package/dist/schema/syncDeltaRow.d.ts +0 -6
- package/dist/schema/syncDeltaRow.js +0 -6
- package/dist/server/adapter.d.ts +0 -173
- package/dist/server/adapter.js +0 -18
- package/dist/server/commit.d.ts +0 -107
- package/dist/server/commit.js +0 -1
- package/dist/server/index.d.ts +0 -14
- package/dist/server/index.js +0 -2
- package/dist/server/readConfig.d.ts +0 -80
- package/dist/server/readConfig.js +0 -8
- package/dist/server/storageMode.d.ts +0 -23
- package/dist/server/storageMode.js +0 -17
- package/dist/source/adapter.d.ts +0 -81
- package/dist/source/adapter.js +0 -22
- package/dist/source/adapters/drizzle.d.ts +0 -48
- package/dist/source/adapters/drizzle.js +0 -219
- package/dist/source/adapters/kysely.d.ts +0 -42
- package/dist/source/adapters/kysely.js +0 -205
- package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
- package/dist/source/adapters/kyselyMutationCore.js +0 -125
- package/dist/source/adapters/memory.d.ts +0 -13
- package/dist/source/adapters/memory.js +0 -130
- package/dist/source/adapters/prisma.d.ts +0 -63
- package/dist/source/adapters/prisma.js +0 -202
- package/dist/source/conformance.d.ts +0 -37
- package/dist/source/conformance.js +0 -215
- package/dist/source/connector.d.ts +0 -95
- package/dist/source/connector.js +0 -266
- package/dist/source/connectorProtocol.d.ts +0 -154
- package/dist/source/connectorProtocol.js +0 -163
- package/dist/source/contract.d.ts +0 -195
- package/dist/source/contract.js +0 -164
- package/dist/source/factory.d.ts +0 -92
- package/dist/source/factory.js +0 -286
- package/dist/source/footprint.d.ts +0 -111
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.d.ts +0 -61
- package/dist/source/idempotency.js +0 -144
- package/dist/source/index.d.ts +0 -23
- package/dist/source/index.js +0 -30
- package/dist/source/migrations.d.ts +0 -21
- package/dist/source/migrations.js +0 -103
- package/dist/source/next.d.ts +0 -32
- package/dist/source/next.js +0 -25
- package/dist/source/pushQueue.d.ts +0 -134
- package/dist/source/pushQueue.js +0 -256
- package/dist/source/signing.d.ts +0 -92
- package/dist/source/signing.js +0 -162
- package/dist/source/types.d.ts +0 -401
- package/dist/source/types.js +0 -59
- package/dist/stores/ObjectStore.d.ts +0 -115
- package/dist/stores/ObjectStore.js +0 -393
- package/dist/stores/ObjectStoreContract.d.ts +0 -38
- package/dist/stores/ObjectStoreContract.js +0 -1
- package/dist/stores/SyncActionStore.d.ts +0 -97
- package/dist/stores/SyncActionStore.js +0 -504
- package/dist/stores/syncAction.d.ts +0 -26
- package/dist/stores/syncAction.js +0 -16
- package/dist/surface.d.ts +0 -36
- package/dist/surface.js +0 -75
- package/dist/sync/BootstrapFetcher.d.ts +0 -280
- package/dist/sync/BootstrapFetcher.js +0 -962
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -228
- package/dist/sync/OnDemandLoader.js +0 -742
- package/dist/sync/SubscriptionManager.d.ts +0 -159
- package/dist/sync/SubscriptionManager.js +0 -243
- package/dist/sync/SyncWebSocket.d.ts +0 -173
- package/dist/sync/SyncWebSocket.js +0 -438
- package/dist/sync/awaitClaimGrant.d.ts +0 -6
- package/dist/sync/awaitClaimGrant.js +0 -6
- package/dist/sync/bootstrapApply.d.ts +0 -70
- package/dist/sync/bootstrapApply.js +0 -73
- package/dist/sync/commitFrames.d.ts +0 -8
- package/dist/sync/commitFrames.js +0 -8
- package/dist/sync/contextPorts.d.ts +0 -18
- package/dist/sync/contextPorts.js +0 -31
- package/dist/sync/createClaimStream.d.ts +0 -7
- package/dist/sync/createClaimStream.js +0 -7
- package/dist/sync/createPresenceStream.d.ts +0 -69
- package/dist/sync/createPresenceStream.js +0 -200
- package/dist/sync/createSnapshot.d.ts +0 -29
- package/dist/sync/createSnapshot.js +0 -118
- package/dist/sync/credentialLifecycle.d.ts +0 -7
- package/dist/sync/credentialLifecycle.js +0 -7
- package/dist/sync/deltaPipeline.d.ts +0 -113
- package/dist/sync/deltaPipeline.js +0 -261
- package/dist/sync/groupChange.d.ts +0 -113
- package/dist/sync/groupChange.js +0 -242
- package/dist/sync/participants.d.ts +0 -115
- package/dist/sync/participants.js +0 -344
- package/dist/sync/persistedPrefix.d.ts +0 -12
- package/dist/sync/persistedPrefix.js +0 -22
- package/dist/sync/schemaDrift.d.ts +0 -55
- package/dist/sync/schemaDrift.js +0 -53
- package/dist/sync/schemas.d.ts +0 -70
- package/dist/sync/schemas.js +0 -94
- package/dist/sync/syncCursor.d.ts +0 -40
- package/dist/sync/syncCursor.js +0 -55
- package/dist/sync/syncPlan.d.ts +0 -54
- package/dist/sync/syncPlan.js +0 -50
- package/dist/sync/wsFrameHandlers.d.ts +0 -8
- package/dist/sync/wsFrameHandlers.js +0 -8
- 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/httpResponses.d.ts +0 -70
- package/dist/testing/fixtures/httpResponses.js +0 -90
- 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 -186
- 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 -72
- 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/transaction/ablo.d.ts +0 -88
- package/dist/transaction/ablo.js +0 -33
- package/dist/transaction/auth/apiKey.d.ts +0 -152
- package/dist/transaction/auth/apiKey.js +0 -419
- package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
- package/dist/transaction/auth/bootstrapScope.js +0 -1
- package/dist/transaction/auth/capability.d.ts +0 -177
- package/dist/transaction/auth/capability.js +0 -199
- package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
- package/dist/transaction/auth/credentialEndpoint.js +0 -86
- package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
- package/dist/transaction/auth/credentialPolicy.js +0 -125
- package/dist/transaction/auth/credentialSource.d.ts +0 -30
- package/dist/transaction/auth/credentialSource.js +0 -55
- package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
- package/dist/transaction/auth/hostedEndpoints.js +0 -21
- package/dist/transaction/auth/identity.d.ts +0 -55
- package/dist/transaction/auth/identity.js +0 -210
- package/dist/transaction/auth/index.d.ts +0 -162
- package/dist/transaction/auth/index.js +0 -304
- package/dist/transaction/auth/schemas.d.ts +0 -59
- package/dist/transaction/auth/schemas.js +0 -85
- package/dist/transaction/auth/sessionMint.d.ts +0 -28
- package/dist/transaction/auth/sessionMint.js +0 -85
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
- package/dist/transaction/coordination/claimMeta.d.ts +0 -49
- package/dist/transaction/coordination/claimMeta.js +0 -52
- package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
- package/dist/transaction/coordination/createClaimStream.js +0 -475
- package/dist/transaction/coordination/events.d.ts +0 -74
- package/dist/transaction/coordination/events.js +0 -7
- package/dist/transaction/coordination/index.d.ts +0 -19
- package/dist/transaction/coordination/index.js +0 -44
- package/dist/transaction/coordination/locator.d.ts +0 -83
- package/dist/transaction/coordination/locator.js +0 -82
- package/dist/transaction/coordination/schema.d.ts +0 -1473
- package/dist/transaction/coordination/schema.js +0 -1013
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -103
- package/dist/transaction/coordination/trace.d.ts +0 -78
- package/dist/transaction/coordination/trace.js +0 -138
- package/dist/transaction/durableWrites.d.ts +0 -62
- package/dist/transaction/durableWrites.js +0 -71
- package/dist/transaction/environment.d.ts +0 -105
- package/dist/transaction/environment.js +0 -108
- package/dist/transaction/errorCodes.d.ts +0 -403
- package/dist/transaction/errorCodes.js +0 -480
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/index.d.ts +0 -20
- package/dist/transaction/index.js +0 -20
- package/dist/transaction/keys/index.d.ts +0 -87
- package/dist/transaction/keys/index.js +0 -207
- package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
- package/dist/transaction/log/syncDeltaRow.js +0 -95
- package/dist/transaction/logPosition.d.ts +0 -97
- package/dist/transaction/logPosition.js +0 -125
- package/dist/transaction/logger.d.ts +0 -16
- package/dist/transaction/logger.js +0 -7
- package/dist/transaction/observability.d.ts +0 -53
- package/dist/transaction/observability.js +0 -19
- package/dist/transaction/persistence.d.ts +0 -12
- package/dist/transaction/persistence.js +0 -11
- package/dist/transaction/plugin.d.ts +0 -192
- package/dist/transaction/plugin.js +0 -87
- package/dist/transaction/policy/types.d.ts +0 -217
- package/dist/transaction/policy/types.js +0 -126
- package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
- package/dist/transaction/resources/functionalUpdate.js +0 -87
- package/dist/transaction/resources/httpResources.d.ts +0 -266
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -319
- package/dist/transaction/resources/modelOperations.js +0 -12
- package/dist/transaction/resources/mutationOptions.d.ts +0 -66
- package/dist/transaction/resources/mutationOptions.js +0 -9
- package/dist/transaction/resources/where.d.ts +0 -85
- package/dist/transaction/resources/where.js +0 -70
- package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
- package/dist/transaction/resources/writeOptionsSchema.js +0 -73
- package/dist/transaction/schema/field.d.ts +0 -126
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/loadStrategy.d.ts +0 -45
- package/dist/transaction/schema/loadStrategy.js +0 -46
- package/dist/transaction/schema/model.d.ts +0 -379
- package/dist/transaction/schema/model.js +0 -123
- package/dist/transaction/schema/openapi.d.ts +0 -57
- package/dist/transaction/schema/openapi.js +0 -340
- package/dist/transaction/schema/relation.d.ts +0 -199
- package/dist/transaction/schema/relation.js +0 -104
- package/dist/transaction/schema/residency.d.ts +0 -29
- package/dist/transaction/schema/residency.js +0 -25
- package/dist/transaction/schema/roles.d.ts +0 -249
- package/dist/transaction/schema/roles.js +0 -230
- package/dist/transaction/schema/schema.d.ts +0 -324
- package/dist/transaction/schema/schema.js +0 -305
- package/dist/transaction/schema/tenancy.d.ts +0 -139
- package/dist/transaction/schema/tenancy.js +0 -190
- package/dist/transaction/transactionLayer.d.ts +0 -82
- package/dist/transaction/transactionLayer.js +0 -24
- package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
- package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
- package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
- package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
- package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
- package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
- package/dist/transaction/transport/commitFrames.d.ts +0 -90
- package/dist/transaction/transport/commitFrames.js +0 -134
- package/dist/transaction/transport/connectionManager.d.ts +0 -215
- package/dist/transaction/transport/connectionManager.js +0 -673
- package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
- package/dist/transaction/transport/credentialLifecycle.js +0 -324
- package/dist/transaction/transport/heartbeat.d.ts +0 -65
- package/dist/transaction/transport/heartbeat.js +0 -93
- package/dist/transaction/transport/httpClient.d.ts +0 -123
- package/dist/transaction/transport/httpClient.js +0 -145
- package/dist/transaction/transport/httpOptions.d.ts +0 -33
- package/dist/transaction/transport/httpOptions.js +0 -12
- package/dist/transaction/transport/httpTransport.d.ts +0 -8
- package/dist/transaction/transport/httpTransport.js +0 -1276
- package/dist/transaction/transport/networkProbe.d.ts +0 -84
- package/dist/transaction/transport/networkProbe.js +0 -207
- package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
- package/dist/transaction/transport/wsFrameHandlers.js +0 -429
- package/dist/transaction/transport/wsTransport.d.ts +0 -576
- package/dist/transaction/transport/wsTransport.js +0 -1017
- package/dist/transaction/types/assertExact.d.ts +0 -17
- package/dist/transaction/types/assertExact.js +0 -1
- package/dist/transaction/types/global.d.ts +0 -107
- package/dist/transaction/types/global.js +0 -40
- package/dist/transaction/types/index.d.ts +0 -205
- package/dist/transaction/types/index.js +0 -56
- package/dist/transaction/types/modelData.d.ts +0 -10
- package/dist/transaction/types/modelData.js +0 -9
- package/dist/transaction/types/participant.d.ts +0 -20
- package/dist/transaction/types/participant.js +0 -10
- package/dist/transaction/types/streams.d.ts +0 -540
- package/dist/transaction/types/streams.js +0 -11
- package/dist/transaction/utils/asyncIterator.d.ts +0 -34
- package/dist/transaction/utils/asyncIterator.js +0 -135
- package/dist/transaction/utils/duration.d.ts +0 -25
- package/dist/transaction/utils/duration.js +0 -45
- package/dist/transaction/utils/json.d.ts +0 -57
- package/dist/transaction/utils/json.js +0 -276
- package/dist/transaction/wire/accountResponses.d.ts +0 -351
- package/dist/transaction/wire/accountResponses.js +0 -255
- package/dist/transaction/wire/auth.d.ts +0 -49
- package/dist/transaction/wire/auth.js +0 -57
- package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
- package/dist/transaction/wire/bootstrapReason.js +0 -8
- package/dist/transaction/wire/claimEvent.d.ts +0 -76
- package/dist/transaction/wire/claimEvent.js +0 -73
- package/dist/transaction/wire/claims.d.ts +0 -463
- package/dist/transaction/wire/claims.js +0 -229
- package/dist/transaction/wire/commit.d.ts +0 -603
- package/dist/transaction/wire/commit.js +0 -321
- package/dist/transaction/wire/delta.d.ts +0 -250
- package/dist/transaction/wire/delta.js +0 -147
- package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
- package/dist/transaction/wire/errorEnvelope.js +0 -123
- package/dist/transaction/wire/feedCursor.d.ts +0 -60
- package/dist/transaction/wire/feedCursor.js +0 -82
- package/dist/transaction/wire/feedEvent.d.ts +0 -177
- package/dist/transaction/wire/feedEvent.js +0 -39
- package/dist/transaction/wire/frames.d.ts +0 -194
- package/dist/transaction/wire/frames.js +0 -50
- package/dist/transaction/wire/inboundFrames.d.ts +0 -552
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -50
- package/dist/transaction/wire/index.js +0 -74
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/protocol.d.ts +0 -38
- package/dist/transaction/wire/protocol.js +0 -38
- package/dist/transaction/wire/protocolVersion.d.ts +0 -73
- package/dist/transaction/wire/protocolVersion.js +0 -83
- package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
- package/dist/transactions/mutations/MutationQueue.js +0 -2797
- package/dist/transactions/mutations/MutationStore.d.ts +0 -20
- package/dist/transactions/mutations/MutationStore.js +0 -53
- package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
- package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
- package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
- package/dist/transactions/mutations/coalesceRules.js +0 -140
- package/dist/transactions/mutations/commitLatency.d.ts +0 -52
- package/dist/transactions/mutations/commitLatency.js +0 -130
- package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
- package/dist/transactions/mutations/commitOutboxStore.js +0 -26
- package/dist/transactions/mutations/commitPayload.d.ts +0 -164
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
- package/dist/transactions/mutations/deltaConfirmation.js +0 -233
- package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
- package/dist/transactions/mutations/durableWriteStore.js +0 -12
- package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
- package/dist/transactions/mutations/optimisticApply.js +0 -65
- package/dist/transactions/mutations/replayValidation.d.ts +0 -186
- package/dist/transactions/mutations/replayValidation.js +0 -163
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/webhooks/events.d.ts +0 -43
- package/dist/webhooks/events.js +0 -42
- package/dist/webhooks/index.d.ts +0 -8
- package/dist/webhooks/index.js +0 -8
- package/dist/wire/index.d.ts +0 -1
- package/dist/wire/index.js +0 -8
- package/docs/interaction-model.md +0 -99
package/docs/mcp.md
CHANGED
|
@@ -6,7 +6,7 @@ Ablo publishes **two** MCP servers for two different jobs. Don't confuse them:
|
|
|
6
6
|
|
|
7
7
|
| Server | Purpose | Auth | Tools |
|
|
8
8
|
|---|---|---|---|
|
|
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
|
|
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 |
|
|
10
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 |
|
|
11
11
|
|
|
12
12
|
The coordination server manages your account **and is the data plane** — it is
|
|
@@ -37,7 +37,7 @@ claude mcp add ablo -- npx -y @abloatai/mcp
|
|
|
37
37
|
| `list_projects` | `ablo projects list` | the org's projects (needs `sk_`) |
|
|
38
38
|
| `create_project` | `ablo projects create` | create one (needs `sk_`) |
|
|
39
39
|
| `tail_logs` | `ablo logs` | recent commits and the actor behind each |
|
|
40
|
-
| `get_usage`
|
|
40
|
+
| `get_usage` |: | usage in daily buckets |
|
|
41
41
|
|
|
42
42
|
There are no key-management tools. A mint returns the plaintext once — only a
|
|
43
43
|
hash is kept — so no tool can hand it back later, and returning it at mint time
|
|
@@ -57,13 +57,13 @@ Each tool mirrors an SDK verb, scoped to a model + id. Model names come from
|
|
|
57
57
|
|
|
58
58
|
| Tool | Mirrors | Does |
|
|
59
59
|
|---|---|---|
|
|
60
|
-
| `get_model` | `ablo.<model>.local.
|
|
60
|
+
| `get_model` | `ablo.<model>.local.get(id)` | read latest state + active claims |
|
|
61
61
|
| `list_records` | `ablo.<model>.list({…})` | cursor-paginated list with filters |
|
|
62
62
|
| `create_model` | `ablo.<model>.create({ data })` | guarded create |
|
|
63
63
|
| `update_model` | `ablo.<model>.update({ id, … })` | guarded update |
|
|
64
64
|
| `delete_model` | `ablo.<model>.delete({ id })` | guarded delete |
|
|
65
65
|
| `claim_model` | `ablo.<model>.claim({ id })` | acquire / queue a coordination lease |
|
|
66
|
-
| `release_claim`
|
|
66
|
+
| `release_claim` |: | release the lease so others proceed |
|
|
67
67
|
|
|
68
68
|
The agent-facing contract — the safe loop, the "derive idempotency keys from
|
|
69
69
|
the business event" rule, and the error-code playbook — ships as a loadable
|
|
@@ -94,9 +94,9 @@ claude mcp add --transport http ablo https://<your-app>/api/mcp
|
|
|
94
94
|
|
|
95
95
|
The endpoint is identical for every client — only the config surface differs:
|
|
96
96
|
|
|
97
|
-
- **Claude Code
|
|
98
|
-
- **Cursor
|
|
99
|
-
- **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.
|
|
100
100
|
|
|
101
101
|
Cursor and Windsurf use the same config shape:
|
|
102
102
|
|
|
@@ -120,7 +120,7 @@ Each client then lists the Ablo tools (`search_ablo_docs`, `get_recipe`, `get_ap
|
|
|
120
120
|
| `get_recipe` | Returns the full markdown of one doc by name (e.g. `readme`, `quickstart`, `schema-contract`, `integration-guide`, `api`, `guarantees`). |
|
|
121
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. |
|
|
122
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. |
|
|
123
|
-
| `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. |
|
|
124
124
|
|
|
125
125
|
#### Resources
|
|
126
126
|
|
|
@@ -132,7 +132,7 @@ loading everything into context.
|
|
|
132
132
|
|
|
133
133
|
Reusable, parameterised templates that drive an end-to-end flow:
|
|
134
134
|
|
|
135
|
-
- `integrate-
|
|
135
|
+
- `integrate-ablo` — wire the SDK into an existing project.
|
|
136
136
|
- `add-agent` — add an agent worker that coordinates via claims and
|
|
137
137
|
conflict-safe writes.
|
|
138
138
|
- `define-schema` — design a Zod-first schema from a description, then run
|
package/docs/migration.md
CHANGED
|
@@ -13,7 +13,8 @@ change when you upgrade.
|
|
|
13
13
|
|
|
14
14
|
| Version | What changed | What to do |
|
|
15
15
|
|---|---|---|
|
|
16
|
-
| **0.
|
|
16
|
+
| **0.36.0** | `ttlSeconds` deprecated on the join surfaces in favour of `ttl` | `useJoin({ scope, ttlSeconds: '5m' })` → `useJoin({ scope, ttl: '5m' })`; same for `ParticipantJoinOptions`. Both spellings work until 0.37.0 |
|
|
17
|
+
| **0.35.0** | Synchronous reads moved under `local`, mirroring the async verbs | `get(id)` → `local.get(id)`; `getAll(options)` → `local.list(options)`; `getCount(options)` → `local.count(options)` |
|
|
17
18
|
| **0.35.0** | `causedByTaskId` write option + seven `turn_*` error codes removed | Delete the `causedByTaskId` argument from writes; a branch on `turn_validation_failed` was unreachable and can go with it |
|
|
18
19
|
| **0.34.0** | Presence verb renamed `watch` → `join` | `ablo.<model>.watch(ids)` → `ablo.<model>.join(ids)`; `useWatch` → `useJoin`; the `WatchOptions` / `UseWatchOptions` / `UseWatchReturn` types → `JoinOptions` / `UseJoinOptions` / `UseJoinReturn`; error code `model_watch_not_configured` → `model_join_not_configured` |
|
|
19
20
|
| **0.28.0** | Removed React placeholders that had no working runtime | `usePresence` → `usePeers` or `useJoin`; `useClaim` → `ablo.<model>.claim`; `SyncGroupProvider` / `useSyncGroup` → `useJoin({ scope })` |
|
|
@@ -31,13 +32,31 @@ change when you upgrade.
|
|
|
31
32
|
|
|
32
33
|
---
|
|
33
34
|
|
|
34
|
-
## 0.
|
|
35
|
+
## 0.36.0: one lease is spelled `ttl`
|
|
36
|
+
|
|
37
|
+
```diff
|
|
38
|
+
- useJoin({ scope: { documents: [id] }, ttlSeconds: '5m' })
|
|
39
|
+
+ useJoin({ scope: { documents: [id] }, ttl: '5m' })
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`ablo.<model>.join(ids, { ttl })` has always said `ttl`, and so does every other
|
|
43
|
+
lease in the SDK: `claim`'s `ttl`, `ClaimLeaseOptions.ttl`. The lower-level join
|
|
44
|
+
surfaces said `ttlSeconds` while accepting exactly the same values, including
|
|
45
|
+
duration strings, so a `ttl: '5m'` handed down from the model verb arrived as
|
|
46
|
+
`ttlSeconds: '5m'`, a field asserting a unit its value did not carry.
|
|
47
|
+
|
|
48
|
+
Both spellings work until 0.37.0, and `ttl` wins if you pass both. The wire is
|
|
49
|
+
unchanged: it has always carried seconds and still does.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 0.35.0: the synchronous reads move under `local`
|
|
35
54
|
|
|
36
55
|
```diff
|
|
37
56
|
- const task = ablo.tasks.get(id);
|
|
38
57
|
- const open = ablo.tasks.getAll({ where: { status: 'open' } });
|
|
39
58
|
- const count = ablo.tasks.getCount({ where: { status: 'open' } });
|
|
40
|
-
+ const task = ablo.tasks.local.
|
|
59
|
+
+ const task = ablo.tasks.local.get(id);
|
|
41
60
|
+ const open = ablo.tasks.local.list({ where: { status: 'open' } });
|
|
42
61
|
+ const count = ablo.tasks.local.count({ where: { status: 'open' } });
|
|
43
62
|
```
|
|
@@ -53,7 +72,7 @@ in most codebases it is outnumbered many times over by `Map.get` and
|
|
|
53
72
|
the compiler name the sites — each one is a type error at exactly the call that
|
|
54
73
|
has to move.
|
|
55
74
|
|
|
56
|
-
## 0.35.0
|
|
75
|
+
## 0.35.0: `causedByTaskId` and the `turn_*` error codes removed
|
|
57
76
|
|
|
58
77
|
0.9.2 retired the `turn` primitive but left one field standing: `causedByTaskId`
|
|
59
78
|
on the write options bag. It was never usable. The server validated it against a
|
|
@@ -85,7 +104,7 @@ migration of its own.
|
|
|
85
104
|
|
|
86
105
|
---
|
|
87
106
|
|
|
88
|
-
## 0.34.0
|
|
107
|
+
## 0.34.0: presence verb renamed `watch` → `join`
|
|
89
108
|
|
|
90
109
|
The model-level presence verb read like a data subscription but delivered
|
|
91
110
|
presence — who else is on a row and what they hold — so it now says what it
|
|
@@ -108,7 +127,7 @@ no compatibility alias — rename the call sites and the `WatchOptions` /
|
|
|
108
127
|
|
|
109
128
|
---
|
|
110
129
|
|
|
111
|
-
## 0.28.0
|
|
130
|
+
## 0.28.0: dead React multiplayer placeholders removed
|
|
112
131
|
|
|
113
132
|
Four React exports looked usable but had no live implementation:
|
|
114
133
|
|
|
@@ -123,7 +142,7 @@ Four React exports looked usable but had no live implementation:
|
|
|
123
142
|
There is no compatibility alias: the replacement APIs were already the only
|
|
124
143
|
working paths.
|
|
125
144
|
|
|
126
|
-
## 0.11.0
|
|
145
|
+
## 0.11.0: `intent` → `claim` rename completed
|
|
127
146
|
|
|
128
147
|
> **Historical note:** this section documents the 0.11.0 transition.
|
|
129
148
|
> `useClaim` was subsequently removed in 0.28.0 because its provider callback
|
|
@@ -166,7 +185,7 @@ contending holders (`AbloClaimedError.claims` and a policy reason folded into th
|
|
|
166
185
|
message), and `participantKind` is the canonical `'user' | 'agent' | 'system'`
|
|
167
186
|
on presence and claim state.
|
|
168
187
|
|
|
169
|
-
## 0.10.0
|
|
188
|
+
## 0.10.0: environment enum `sandbox` / `production`; stateless HTTP transport
|
|
170
189
|
|
|
171
190
|
### Environment enum rename (the only breaking change)
|
|
172
191
|
|
|
@@ -222,7 +241,7 @@ await ablo.tasks.update({ id, data: { status: 'done' } });
|
|
|
222
241
|
|
|
223
242
|
---
|
|
224
243
|
|
|
225
|
-
## 0.9.2
|
|
244
|
+
## 0.9.2: `turn` / agent-`tasks` removed; `intents` deprecated
|
|
226
245
|
|
|
227
246
|
The SDK's coordination surface is now exactly two things: `ablo.<model>` writes
|
|
228
247
|
and `claim`. The parallel `turn` / agent-`tasks` mechanism was redundant —
|
|
@@ -271,7 +290,7 @@ everywhere you coordinate concurrent work.
|
|
|
271
290
|
|
|
272
291
|
---
|
|
273
292
|
|
|
274
|
-
## 0.9.0
|
|
293
|
+
## 0.9.0: one options object per verb; disposable `claim`
|
|
275
294
|
|
|
276
295
|
Every model verb takes a single options object, so the id, the data, and every
|
|
277
296
|
modifier are named siblings. Reactive local reads stay on the synchronous
|
|
@@ -285,7 +304,7 @@ modifier are named siblings. Reactive local reads stay on the synchronous
|
|
|
285
304
|
+ await ablo.tasks.retrieve({ id })
|
|
286
305
|
|
|
287
306
|
- useAblo((ablo) => ablo.tasks.retrieve(id)) ?? serverTask
|
|
288
|
-
+ useAblo((ablo) => ablo.tasks.local.
|
|
307
|
+
+ useAblo((ablo) => ablo.tasks.local.get(id)) ?? serverTask
|
|
289
308
|
```
|
|
290
309
|
|
|
291
310
|
`claim` now returns a disposable handle instead of taking a callback. The handle
|
|
@@ -305,7 +324,7 @@ options object.
|
|
|
305
324
|
|
|
306
325
|
---
|
|
307
326
|
|
|
308
|
-
## 0.8.0
|
|
327
|
+
## 0.8.0: callable `claim` namespace
|
|
309
328
|
|
|
310
329
|
The flat coordination methods are gone; everything lives under `claim`.
|
|
311
330
|
|
|
@@ -318,7 +337,7 @@ The flat coordination methods are gone; everything lives under `claim`.
|
|
|
318
337
|
|
|
319
338
|
---
|
|
320
339
|
|
|
321
|
-
## 0.7.0
|
|
340
|
+
## 0.7.0: legacy React hooks removed
|
|
322
341
|
|
|
323
342
|
The query/mutation hooks were replaced by the single `useAblo()` accessor over
|
|
324
343
|
typed model methods.
|
|
@@ -340,7 +359,7 @@ shape with the canonical `{ type, code, message, doc_url, request_id }` envelope
|
|
|
340
359
|
|
|
341
360
|
---
|
|
342
361
|
|
|
343
|
-
## 0.6.0
|
|
362
|
+
## 0.6.0: `onChange` and the Resource → Model rename
|
|
344
363
|
|
|
345
364
|
```diff
|
|
346
365
|
- ablo.tasks.subscribe(cb)
|
|
@@ -356,7 +375,7 @@ Also renamed: `Ablo.Resource.*` → `Ablo.Model.*`, `ModelTarget.resource` →
|
|
|
356
375
|
|
|
357
376
|
---
|
|
358
377
|
|
|
359
|
-
## 0.5.0
|
|
378
|
+
## 0.5.0: intent-handle method renames
|
|
360
379
|
|
|
361
380
|
On the model intent handle (`ablo.<model>.intent(id)`):
|
|
362
381
|
|
|
@@ -373,7 +392,7 @@ unchanged at this release. (They were later folded under `claim` in 0.9.2.)
|
|
|
373
392
|
|
|
374
393
|
---
|
|
375
394
|
|
|
376
|
-
## 0.3.0
|
|
395
|
+
## 0.3.0: umbrella `<AbloProvider>`
|
|
377
396
|
|
|
378
397
|
One provider component now owns the full React lifecycle. `<SyncProvider>`,
|
|
379
398
|
`createAbloContext()`, and `withSync` were removed.
|
|
@@ -407,10 +426,10 @@ old code or old docs, this is the through-line:
|
|
|
407
426
|
|
|
408
427
|
| Release | State of coordination |
|
|
409
428
|
|---|---|
|
|
410
|
-
| 0.4.0 | `ablo.<model>.intent(id)` introduced
|
|
429
|
+
| 0.4.0 | `ablo.<model>.intent(id)` introduced: per-entity intent handle |
|
|
411
430
|
| 0.5.0 | Intent-handle methods renamed to claim vocabulary (`acquire`→`claim`, …) |
|
|
412
431
|
| 0.8.0 | Callable `claim` namespace (`claim(id)`, `claim.state`, `claim.queue`, …) |
|
|
413
432
|
| 0.9.0 | `claim` returns an `await using` disposable handle |
|
|
414
|
-
| 0.9.2 | `intents` deprecated and made `@internal
|
|
433
|
+
| 0.9.2 | `intents` deprecated and made `@internal`: **`claim` is the one coordination API** |
|
|
415
434
|
|
|
416
435
|
For the full chronological history, see the [Changelog](../CHANGELOG.md).
|
package/docs/projects.md
CHANGED
|
@@ -95,5 +95,5 @@ another org's project ids 404 — never confirm existence across orgs.
|
|
|
95
95
|
|
|
96
96
|
| Code | Status | Meaning |
|
|
97
97
|
|------|--------|---------|
|
|
98
|
-
| `project_scope_denied` | 403 | The model/resource belongs to another project in your org
|
|
98
|
+
| `project_scope_denied` | 403 | The model/resource belongs to another project in your org: use a key minted for that project. |
|
|
99
99
|
| `project_slug_taken` | 409 | A project with this slug already exists in the organization. |
|
package/docs/quickstart.md
CHANGED
|
@@ -215,12 +215,12 @@ const updated = await ablo.weatherReports.update({
|
|
|
215
215
|
console.log({ id: updated.id, status: updated.status }); // { id: '...', status: 'ready' }
|
|
216
216
|
```
|
|
217
217
|
|
|
218
|
-
Read a single row back with `
|
|
218
|
+
Read a single row back with `get({ id })`. It resolves to the row, or to
|
|
219
219
|
`undefined` when no row has that id — so narrow it once, then the fields are
|
|
220
220
|
fully typed:
|
|
221
221
|
|
|
222
222
|
```ts
|
|
223
|
-
const report = await ablo.weatherReports.
|
|
223
|
+
const report = await ablo.weatherReports.get({ id: created.id });
|
|
224
224
|
if (!report) throw new Error(`weatherReports ${created.id} not found`);
|
|
225
225
|
|
|
226
226
|
console.log(report.status); // 'ready'
|
package/docs/react.md
CHANGED
|
@@ -27,6 +27,7 @@ the thing, then pass it.
|
|
|
27
27
|
```ts
|
|
28
28
|
// lib/ablo.ts
|
|
29
29
|
import Ablo from '@abloatai/ablo';
|
|
30
|
+
import { createAbloReact } from '@abloatai/ablo/react';
|
|
30
31
|
import { schema } from '@/ablo/schema';
|
|
31
32
|
|
|
32
33
|
// The browser never holds your API key. It mints a short-lived session token
|
|
@@ -35,8 +36,18 @@ export const ablo = Ablo({
|
|
|
35
36
|
schema,
|
|
36
37
|
authEndpoint: '/api/ablo-session',
|
|
37
38
|
});
|
|
39
|
+
|
|
40
|
+
// The typed binding: capture the schema once, and every component imports
|
|
41
|
+
// born-typed hooks from this file — `useAblo()` takes no type arguments,
|
|
42
|
+
// and a selector's `ablo` parameter knows your models.
|
|
43
|
+
export const { AbloProvider, useAblo } = createAbloReact(schema);
|
|
38
44
|
```
|
|
39
45
|
|
|
46
|
+
Import `AbloProvider` and `useAblo` from `lib/ablo` rather than from the
|
|
47
|
+
package, and the schema generic never appears at a call site again — the
|
|
48
|
+
same one-binding-file convention as tRPC's `createTRPCReact` or
|
|
49
|
+
react-redux's typed hooks.
|
|
50
|
+
|
|
40
51
|
## AbloProvider
|
|
41
52
|
|
|
42
53
|
Mount it once near the root of your tree. It owns the connection, the local
|
|
@@ -67,10 +78,10 @@ export function Providers({
|
|
|
67
78
|
|
|
68
79
|
| Prop | Default | Purpose |
|
|
69
80
|
| ----------- | ---------------- | --------------------------------------------------------------------------------------------------------- |
|
|
70
|
-
| `client`
|
|
81
|
+
| `client` |: | **Required.** The `Ablo({ schema, apiKey })` instance. It carries the schema and connection config. |
|
|
71
82
|
| `userId` | resolved from auth | App participant id for app-owned fields and your `identityRoles`. Not the security boundary. |
|
|
72
83
|
| `fallback` | neutral spinner | Rendered during the *first* bootstrap only. Pass a branded skeleton, `null`, or `'passthrough'`. |
|
|
73
|
-
| `onError`
|
|
84
|
+
| `onError` |: | Engine / WebSocket / bootstrap errors. Wire to Sentry / Datadog. |
|
|
74
85
|
|
|
75
86
|
Everything that used to be a provider prop — `schema`, `url`, `apiKey`,
|
|
76
87
|
`teamIds`, `syncGroups`, `persistence`, `bootstrapMode` — now lives on
|
|
@@ -79,7 +90,7 @@ identity comes from, and why the API key never reaches the browser, is the whole
|
|
|
79
90
|
of [Identity & Sync Groups](./identity.md) — read that if it isn't obvious how
|
|
80
91
|
org / team / user map to what a participant can see.
|
|
81
92
|
|
|
82
|
-
## useAblo
|
|
93
|
+
## useAblo: model client
|
|
83
94
|
|
|
84
95
|
```tsx
|
|
85
96
|
'use client';
|
|
@@ -87,7 +98,7 @@ org / team / user map to what a participant can see.
|
|
|
87
98
|
import { useAblo } from '@abloatai/ablo/react';
|
|
88
99
|
|
|
89
100
|
export function ReportView({ report: serverReport }: { report: { id: string; location: string } }) {
|
|
90
|
-
const report = useAblo((ablo) => ablo.weatherReports.local.
|
|
101
|
+
const report = useAblo((ablo) => ablo.weatherReports.local.get(serverReport.id)) ?? serverReport;
|
|
91
102
|
const active = useAblo((ablo) => ablo.weatherReports.claim.state({ id: serverReport.id }));
|
|
92
103
|
const claimed = Boolean(active);
|
|
93
104
|
|
|
@@ -97,7 +108,7 @@ export function ReportView({ report: serverReport }: { report: { id: string; loc
|
|
|
97
108
|
|
|
98
109
|
The hook:
|
|
99
110
|
|
|
100
|
-
1. Uses the same `ablo.<model>.local.
|
|
111
|
+
1. Uses the same `ablo.<model>.local.get(id)` / `.local.list()` methods you'd call anywhere
|
|
101
112
|
else in the SDK — the hook just makes them reactive.
|
|
102
113
|
2. Tracks the model fields read by the selector and re-renders when confirmed
|
|
103
114
|
deltas arrive.
|
|
@@ -112,7 +123,7 @@ effects, or writes:
|
|
|
112
123
|
const abloClient = useAblo();
|
|
113
124
|
```
|
|
114
125
|
|
|
115
|
-
Prefer selector reads like `useAblo((ablo) => ablo.<model>.local.
|
|
126
|
+
Prefer selector reads like `useAblo((ablo) => ablo.<model>.local.get(id))`. Older hooks
|
|
116
127
|
also accept a string model name; prefer the selector form shown above.
|
|
117
128
|
|
|
118
129
|
For collections, keep the selector on the model client too:
|
|
@@ -130,12 +141,12 @@ const reports = useAblo((ablo) =>
|
|
|
130
141
|
## Server Load
|
|
131
142
|
|
|
132
143
|
```tsx
|
|
133
|
-
const report = await ablo.weatherReports.
|
|
144
|
+
const report = await ablo.weatherReports.get({ id });
|
|
134
145
|
```
|
|
135
146
|
|
|
136
147
|
Use `retrieve` in Server Components when the row may not be in the local pool
|
|
137
148
|
yet — it hydrates from the local store and the server, and returns a Promise, so
|
|
138
|
-
`await` it. (Server reads come in two shapes: `
|
|
149
|
+
`await` it. (Server reads come in two shapes: `get({ id })` for one row and
|
|
139
150
|
`list({ where })` for many; both are async. The synchronous local reads are
|
|
140
151
|
the `local` reads, used in render below.)
|
|
141
152
|
|
|
@@ -180,7 +191,7 @@ imperative work after an event or effect.
|
|
|
180
191
|
|
|
181
192
|
See [API reference](/docs/api) for the full options surface.
|
|
182
193
|
|
|
183
|
-
## useJoin
|
|
194
|
+
## useJoin: scoped presence + read interest
|
|
184
195
|
|
|
185
196
|
`useJoin` is the React form of `ablo.<model>.join`. It joins multiplayer for a
|
|
186
197
|
scope on the engine's existing socket (one TCP connection, N logical
|
|
@@ -209,10 +220,10 @@ Options (`UseJoinOptions`):
|
|
|
209
220
|
|
|
210
221
|
| Option | Default | Effect |
|
|
211
222
|
| --- | --- | --- |
|
|
212
|
-
| `scope`
|
|
213
|
-
| `claim` | `false` | Acquire a write-claim on the scope (sent so peers observe it; pins the scope so it never warm-drops while held). A viewer is not a claimant
|
|
223
|
+
| `scope` |: | Model-form scope (`{ slideDecks: id }`), resolved through the schema. Omit for engine-wide. |
|
|
224
|
+
| `claim` | `false` | Acquire a write-claim on the scope (sent so peers observe it; pins the scope so it never warm-drops while held). A viewer is not a claimant: leave `false` for read-only. |
|
|
214
225
|
| `hydrate` | `false` | Backfill the scope's current rows into the pool once on enter, then keep them fresh via the live tail. Set `true` for deep-linked / never-opened entities. Single-flight; soft-fails. |
|
|
215
|
-
| `ttlSeconds`
|
|
226
|
+
| `ttlSeconds` |: | Lease TTL for the scope claim. |
|
|
216
227
|
| `paused` | `false` | Tear down and don't re-join while true. |
|
|
217
228
|
|
|
218
229
|
Returns (`UseJoinReturn`): `{ participant, peers, claims, status, error }`.
|
|
@@ -220,7 +231,7 @@ Returns (`UseJoinReturn`): `{ participant, peers, claims, status, error }`.
|
|
|
220
231
|
write-claims; `status` is the join lifecycle. Auto-cleans up on unmount or when
|
|
221
232
|
`paused` flips true.
|
|
222
233
|
|
|
223
|
-
## usePeers
|
|
234
|
+
## usePeers: read-only presence
|
|
224
235
|
|
|
225
236
|
`usePeers` is a *pure reader* of the presence stream already flowing on the
|
|
226
237
|
connection. Unlike `useJoin`, it does **not** enter/leave a scope (no
|
package/docs/schema-contract.md
CHANGED
|
@@ -12,7 +12,7 @@ defineSchema(...) -> ablo.<model>.create/retrieve/update/claim(...)
|
|
|
12
12
|
That one object drives:
|
|
13
13
|
|
|
14
14
|
- typed model clients in trusted server runtimes,
|
|
15
|
-
- React selectors through `useAblo((ablo) => ablo.<model>.local.
|
|
15
|
+
- React selectors through `useAblo((ablo) => ablo.<model>.local.get(id))`,
|
|
16
16
|
- agent and background-worker writes,
|
|
17
17
|
- Data Source request/response shape when your database stays canonical,
|
|
18
18
|
- hosted schema push, migration planning, and schema-version gating.
|
|
@@ -70,14 +70,14 @@ readable, you just don't author them.
|
|
|
70
70
|
Use async reads when the row may not be local:
|
|
71
71
|
|
|
72
72
|
```ts
|
|
73
|
-
const report = await ablo.weatherReports.
|
|
73
|
+
const report = await ablo.weatherReports.get({ id: reportId });
|
|
74
74
|
const ready = await ablo.weatherReports.list({ where: { status: 'ready' } });
|
|
75
75
|
```
|
|
76
76
|
|
|
77
77
|
Use synchronous local reads in render after data has synced:
|
|
78
78
|
|
|
79
79
|
```ts
|
|
80
|
-
const report = ablo.weatherReports.local.
|
|
80
|
+
const report = ablo.weatherReports.local.get(reportId);
|
|
81
81
|
const pending = ablo.weatherReports.local.list({ where: { status: 'pending' } });
|
|
82
82
|
```
|
|
83
83
|
|
package/docs/sessions.md
CHANGED
|
@@ -10,20 +10,23 @@ difference is the subject and how much authority it carries.
|
|
|
10
10
|
One resource mints both:
|
|
11
11
|
|
|
12
12
|
```ts Your backend (sk_)
|
|
13
|
-
// A logged-in person's browser session —
|
|
13
|
+
// A logged-in person's browser session — only the operations this UI needs.
|
|
14
14
|
const userSession = await ablo.sessions.create({
|
|
15
15
|
user: { id: currentUser.id },
|
|
16
|
+
can: { tasks: ['read', 'update'], workspaces: ['read'] },
|
|
16
17
|
});
|
|
17
18
|
|
|
18
|
-
//
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
can: {
|
|
19
|
+
// Recommended agent path — returns a ready, scoped client.
|
|
20
|
+
const agent = await ablo.agents.create({
|
|
21
|
+
name: 'task-writer',
|
|
22
|
+
can: { tasks: ['read', 'update'], workspaces: ['read'] },
|
|
22
23
|
});
|
|
23
24
|
```
|
|
24
25
|
|
|
25
|
-
`user
|
|
26
|
-
|
|
26
|
+
`sessions.create({ user, can })` mints an `ek_` (ephemeral key).
|
|
27
|
+
`agents.create({ can })` mints and manages an `rk_` (restricted key). Use the
|
|
28
|
+
lower-level `sessions.create({ agent, can })` only when another runtime needs
|
|
29
|
+
the raw agent token.
|
|
27
30
|
|
|
28
31
|
It exists because of one rule: **the browser can never hold a secret.** Your
|
|
29
32
|
`sk_` lives on the server; the browser only ever holds a minted session token
|
|
@@ -45,15 +48,24 @@ For a logged-in person using your app. Mint on a backend route that has already
|
|
|
45
48
|
authenticated the user:
|
|
46
49
|
|
|
47
50
|
```ts Your backend route (session-authed)
|
|
48
|
-
|
|
51
|
+
import { credentialEndpointSuccessSchema } from '@abloatai/ablo/auth';
|
|
52
|
+
|
|
53
|
+
const { token, expiresAt } = await ablo.sessions.create({
|
|
49
54
|
user: { id: currentUser.id }, // who the session acts as
|
|
55
|
+
can: { tasks: ['read', 'update'] },
|
|
50
56
|
// syncGroups: [...], // optional; defaults to the user's org + user
|
|
51
57
|
});
|
|
52
|
-
return Response.json(
|
|
58
|
+
return Response.json(
|
|
59
|
+
credentialEndpointSuccessSchema.parse({
|
|
60
|
+
token,
|
|
61
|
+
expiresAt,
|
|
62
|
+
credentialKind: 'ephemeral',
|
|
63
|
+
}),
|
|
64
|
+
{ headers: { 'Cache-Control': 'no-store' } },
|
|
65
|
+
);
|
|
53
66
|
```
|
|
54
67
|
|
|
55
|
-
|
|
56
|
-
allowlist. It's the human acting as themselves.
|
|
68
|
+
`can` is required. The mint fails closed when the grant is absent or empty.
|
|
57
69
|
|
|
58
70
|
Point a browser `Ablo` client's `authEndpoint` at that route, and pass
|
|
59
71
|
the **instance** to [`<AbloProvider>`](/react). The client fetches the token,
|
|
@@ -84,7 +96,7 @@ the socket. Need custom headers or a
|
|
|
84
96
|
body on the exchange? `authEndpoint` also accepts an async resolver that
|
|
85
97
|
returns the token.
|
|
86
98
|
|
|
87
|
-
##
|
|
99
|
+
## Agents (`rk_`)
|
|
88
100
|
|
|
89
101
|
For a non-human actor — an agent or automation that should only do **specific**
|
|
90
102
|
operations. The `can` map is the permission boundary, and it's **typed against
|
|
@@ -92,23 +104,45 @@ your schema** — the model keys are your schema's models, so a typo is a compil
|
|
|
92
104
|
error, not a silent over-grant:
|
|
93
105
|
|
|
94
106
|
```ts
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
can: {
|
|
107
|
+
const agent = await ablo.agents.create({
|
|
108
|
+
name: 'task-writer',
|
|
109
|
+
can: { tasks: ['update'] }, // typed off the schema — no magic strings
|
|
98
110
|
ttlSeconds: 600,
|
|
99
111
|
});
|
|
100
112
|
|
|
101
|
-
|
|
113
|
+
await agent.tasks.update({ id, data });
|
|
114
|
+
await agent.dispose();
|
|
102
115
|
```
|
|
103
116
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
`
|
|
117
|
+
The returned client refreshes its own short-lived credential. A write grant
|
|
118
|
+
automatically includes the corresponding read, so
|
|
119
|
+
`can: { tasks: ['update'] }` is enforced as `task.update` plus `task.read`.
|
|
120
|
+
Operations are `'read' | 'create' | 'update' | 'delete'`.
|
|
121
|
+
|
|
122
|
+
For a reusable grant, use TypeScript's `satisfies`. It checks the object against
|
|
123
|
+
the schema while preserving its narrow literals—there is no string parser or
|
|
124
|
+
second permission model:
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
import type { CapabilityGrant } from '@abloatai/ablo/auth';
|
|
128
|
+
import { schema } from './ablo.schema';
|
|
129
|
+
|
|
130
|
+
const taskWriterCan = {
|
|
131
|
+
tasks: ['update'],
|
|
132
|
+
} satisfies CapabilityGrant<typeof schema>;
|
|
133
|
+
|
|
134
|
+
const agent = await ablo.agents.create({ can: taskWriterCan });
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
`documents` instead of `tasks`, or `'write'` instead of `'update'`, is a compile
|
|
138
|
+
error. At runtime the SDK parses the same grant with the schema-bound Zod
|
|
139
|
+
contract before minting, and the server validates it again against the active
|
|
140
|
+
pushed schema.
|
|
107
141
|
|
|
108
142
|
<Note>
|
|
109
|
-
Use `sessions.create({ agent })`
|
|
110
|
-
|
|
111
|
-
|
|
143
|
+
Use `sessions.create({ agent, can })` when a separate runtime, MCP process, or
|
|
144
|
+
protocol integration needs the raw token. For an agent running in the current
|
|
145
|
+
server process, prefer `agents.create({ can })`.
|
|
112
146
|
</Note>
|
|
113
147
|
|
|
114
148
|
## Mint
|
|
@@ -120,7 +154,7 @@ for the actor.
|
|
|
120
154
|
| Param | For | Meaning |
|
|
121
155
|
|---|---|---|
|
|
122
156
|
| `user` / `agent` | both | The actor. `id` becomes the token's `participantId`. Pass exactly one. |
|
|
123
|
-
| `can` |
|
|
157
|
+
| `can` | both | Required non-empty per-model operation allowlist, typed off the schema. |
|
|
124
158
|
| `syncGroups` | both | Narrow the session below its default scope. Omit to inherit. |
|
|
125
159
|
| `ttlSeconds` | both | Lifetime in seconds. Defaults to `900` (15m). |
|
|
126
160
|
| `userMeta` | both | Opaque identity blob echoed back to the client. |
|
|
@@ -129,8 +163,28 @@ for the actor.
|
|
|
129
163
|
|
|
130
164
|
Sessions are **short-lived by design** (~15 minutes) and, for browsers,
|
|
131
165
|
**auto-refreshed** — the provider re-mints ahead of expiry, so a session never
|
|
132
|
-
drops at the boundary.
|
|
133
|
-
|
|
166
|
+
drops at the boundary. Signing out stops refresh and the old token expires on
|
|
167
|
+
its own.
|
|
168
|
+
|
|
169
|
+
Revoke immediately when a token is exposed or an actor loses access:
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
await ablo.sessions.revoke({ id: session.id });
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Agent sessions can rotate with overlap so a worker can adopt the replacement
|
|
176
|
+
before the previous token expires:
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
const replacement = await ablo.sessions.rotate({
|
|
180
|
+
id: session.id,
|
|
181
|
+
graceSeconds: 300,
|
|
182
|
+
ttlSeconds: 900,
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Browser `ek_` sessions rotate through `authEndpoint`; do not distribute rotated
|
|
187
|
+
browser tokens manually.
|
|
134
188
|
|
|
135
189
|
### Offline & sign-out
|
|
136
190
|
|
|
@@ -145,20 +199,19 @@ those two lifetimes separate, which means:
|
|
|
145
199
|
connectivity or tab focus returns. The user stays signed in for as long as
|
|
146
200
|
your underlying session is valid, however brief or long the network drop.
|
|
147
201
|
- **The user is signed out only when the underlying session is genuinely
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
202
|
+
gone** — your `authEndpoint` responds `401` with the canonical
|
|
203
|
+
`{ error: { code: 'session_expired' } }` body. An unrelated `401` or `403`
|
|
204
|
+
is a policy/configuration failure, not proof that the login ended.
|
|
151
205
|
|
|
152
206
|
This mirrors the OAuth refresh-token rule (Okta/Auth0/Authgear): only a
|
|
153
207
|
rejection of the *long-lived* credential ends the session — a network failure
|
|
154
208
|
never does.
|
|
155
209
|
|
|
156
210
|
<Note>
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
network/`5xx` failures surface as
|
|
160
|
-
|
|
161
|
-
bounce a still-valid user to your sign-in page.
|
|
211
|
+
Use `credentialEndpointSuccessSchema` and `credentialEndpointErrorSchema` from
|
|
212
|
+
`@abloatai/ablo/auth` on the route. Return `session_expired` only when the
|
|
213
|
+
application login is actually gone, and let network/`5xx` failures surface as
|
|
214
|
+
errors.
|
|
162
215
|
</Note>
|
|
163
216
|
|
|
164
217
|
## Scope
|
|
@@ -175,8 +228,8 @@ Your schema lives in a **project** — you push it once (`npx ablo push`) and ev
|
|
|
175
228
|
session you mint resolves against it. The flow for serving end-users:
|
|
176
229
|
|
|
177
230
|
1. **Push your schema** to your project.
|
|
178
|
-
2. **Mint an `ek_` per user
|
|
179
|
-
commit to that one schema
|
|
231
|
+
2. **Mint an `ek_` per user:** `sessions.create({ user: { id }, can })`. Your
|
|
232
|
+
users commit to that one schema with only the operations in `can`.
|
|
180
233
|
|
|
181
234
|
**Your users do not have Ablo accounts.** You authenticate them however you
|
|
182
235
|
already do; your server's `sk_` mints the `ek_`. By default the session lands in
|
|
@@ -205,6 +258,7 @@ const { token } = await mintUserSessionKey({
|
|
|
205
258
|
organizationId: schemaOwnerOrgId,
|
|
206
259
|
projectId: schemaProjectId,
|
|
207
260
|
},
|
|
261
|
+
operations: ['task.read', 'task.update'],
|
|
208
262
|
ttlSeconds: 3600,
|
|
209
263
|
});
|
|
210
264
|
```
|
|
@@ -234,6 +288,6 @@ compromise — which is exactly why it never leaves your server.
|
|
|
234
288
|
| | User session (`ek_`) | Agent session (`rk_`) |
|
|
235
289
|
|---|---|---|
|
|
236
290
|
| For | a **person** in the browser | an **agent** / automation |
|
|
237
|
-
| Authority |
|
|
238
|
-
| Mint | `ablo.sessions.create({ user: { id } })` | `ablo.sessions.create({ agent: { id }, can })` |
|
|
291
|
+
| Authority | narrow (explicit `can` allowlist) | narrow (explicit `can` allowlist) |
|
|
292
|
+
| Mint | `ablo.sessions.create({ user: { id }, can })` | `ablo.sessions.create({ agent: { id }, can })` |
|
|
239
293
|
| Lives where | the user's **browser** | the agent runtime |
|