@abloatai/ablo 0.36.0 → 0.37.1
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 +55 -2014
- package/NOTICE +2 -2
- package/README.md +45 -63
- 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 -114
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -163
- 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 +1 -1
- package/docs/api-keys.md +7 -6
- package/docs/api.md +10 -10
- package/docs/client-behavior.md +5 -5
- package/docs/coordination.md +52 -62
- package/docs/data-sources.md +1 -1
- 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/server-agent.md +2 -2
- package/docs/how-it-works.md +4 -4
- package/docs/identity.md +2 -1
- package/docs/integration-guide.md +24 -13
- 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 +2 -2
- package/docs/migration.md +3 -3
- package/docs/quickstart.md +2 -2
- package/docs/react.md +5 -5
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- 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 +8 -8
- package/package.json +63 -166
- package/bin/ablo.cjs +0 -39
- package/dist/BaseSyncedStore.d.ts +0 -843
- package/dist/BaseSyncedStore.js +0 -1971
- package/dist/Database.d.ts +0 -323
- package/dist/Database.js +0 -1502
- package/dist/InstanceCache.d.ts +0 -237
- package/dist/InstanceCache.js +0 -1166
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -454
- package/dist/Model.js +0 -919
- package/dist/ModelRegistry.d.ts +0 -225
- package/dist/ModelRegistry.js +0 -539
- package/dist/NetworkMonitor.d.ts +0 -28
- package/dist/NetworkMonitor.js +0 -79
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -541
- package/dist/SyncClient.js +0 -2202
- 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/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -160
- 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 -50
- package/dist/client/createInternalComponents.js +0 -98
- package/dist/client/createModelProxy.d.ts +0 -248
- package/dist/client/createModelProxy.js +0 -884
- package/dist/client/humans.d.ts +0 -69
- package/dist/client/humans.js +0 -78
- 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 -53
- package/dist/client/reactiveEngine.js +0 -688
- 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/storeCluster.d.ts +0 -47
- package/dist/client/storeCluster.js +0 -118
- package/dist/client/storeLifecycle.d.ts +0 -61
- package/dist/client/storeLifecycle.js +0 -231
- 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 -42
- package/dist/context.js +0 -81
- 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/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -230
- 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/QueryProcessor.d.ts +0 -75
- package/dist/query/QueryProcessor.js +0 -255
- package/dist/query/client.d.ts +0 -64
- package/dist/query/client.js +0 -138
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -242
- package/dist/react/AbloProvider.js +0 -458
- 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/createAbloReact.d.ts +0 -56
- package/dist/react/createAbloReact.js +0 -51
- package/dist/react/index.d.ts +0 -62
- package/dist/react/index.js +0 -69
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -82
- package/dist/react/useAblo.js +0 -120
- 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 -133
- 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 -42
- package/dist/schema/index.js +0 -80
- 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 -90
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -265
- 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 -83
- package/dist/source/adapter.js +0 -24
- 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/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/storeContract.d.ts +0 -145
- package/dist/storeContract.js +0 -12
- package/dist/stores/DatabaseManager.d.ts +0 -107
- package/dist/stores/DatabaseManager.js +0 -388
- 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/StoreManager.d.ts +0 -114
- package/dist/stores/StoreManager.js +0 -304
- package/dist/stores/SyncActionStore.d.ts +0 -99
- package/dist/stores/SyncActionStore.js +0 -506
- package/dist/stores/openIDBWithTimeout.d.ts +0 -65
- package/dist/stores/openIDBWithTimeout.js +0 -153
- 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 -284
- package/dist/sync/BootstrapFetcher.js +0 -964
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -231
- package/dist/sync/OnDemandLoader.js +0 -743
- 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 -73
- 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 -114
- package/dist/sync/deltaPipeline.js +0 -278
- package/dist/sync/groupChange.d.ts +0 -116
- package/dist/sync/groupChange.js +0 -244
- package/dist/sync/participants.d.ts +0 -132
- package/dist/sync/participants.js +0 -346
- 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 -71
- 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/syncLog/contract.d.ts +0 -20
- package/dist/syncLog/contract.js +0 -19
- package/dist/syncLog/index.d.ts +0 -1
- package/dist/syncLog/index.js +0 -1
- 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 -212
- package/dist/transaction/auth/capability.js +0 -224
- 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 -56
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -124
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -84
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -108
- 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 -45
- package/dist/transaction/coordination/locator.d.ts +0 -104
- package/dist/transaction/coordination/locator.js +0 -102
- package/dist/transaction/coordination/schema.d.ts +0 -1536
- package/dist/transaction/coordination/schema.js +0 -1177
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -107
- 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 -484
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/footprint.d.ts +0 -111
- package/dist/transaction/footprint.js +0 -0
- 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 -285
- package/dist/transaction/plugin.js +0 -106
- 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 -321
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -427
- 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 -101
- package/dist/transaction/resources/where.js +0 -115
- 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 -120
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/fieldRef.d.ts +0 -38
- package/dist/transaction/schema/fieldRef.js +0 -11
- 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 -58
- package/dist/transaction/schema/openapi.js +0 -501
- package/dist/transaction/schema/relation.d.ts +0 -204
- 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 -351
- package/dist/transaction/schema/schema.js +0 -325
- 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 -131
- package/dist/transaction/transport/httpClient.js +0 -146
- 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 -1388
- 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 -574
- package/dist/transaction/transport/wsTransport.js +0 -1023
- 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 -550
- 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 -50
- package/dist/transaction/utils/duration.js +0 -77
- 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 -420
- package/dist/transaction/wire/accountResponses.js +0 -290
- package/dist/transaction/wire/auth.d.ts +0 -56
- package/dist/transaction/wire/auth.js +0 -63
- 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 -530
- package/dist/transaction/wire/claims.js +0 -327
- 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 -204
- package/dist/transaction/wire/feedEvent.js +0 -65
- 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 -562
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -54
- package/dist/transaction/wire/index.js +0 -83
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelMutations.d.ts +0 -31
- package/dist/transaction/wire/modelMutations.js +0 -52
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/modelShape.d.ts +0 -78
- package/dist/transaction/wire/modelShape.js +0 -74
- 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 -661
- package/dist/transactions/mutations/MutationQueue.js +0 -2807
- 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 -165
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -63
- package/dist/transactions/mutations/deltaConfirmation.js +0 -235
- 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 -187
- package/dist/transactions/mutations/replayValidation.js +0 -164
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/views/QueryView.d.ts +0 -79
- package/dist/views/QueryView.js +0 -218
- package/dist/views/ViewRegistry.d.ts +0 -20
- package/dist/views/ViewRegistry.js +0 -55
- package/dist/views/incrementalView.d.ts +0 -45
- package/dist/views/incrementalView.js +0 -69
- 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
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* An {@link OnlineStatusProvider} that always reports the client as online.
|
|
3
|
-
* Server-side runtimes — Node processes, agents, and sidecars — have no
|
|
4
|
-
* browser network stack to lose, so there is no offline state to track. A
|
|
5
|
-
* dropped database connection surfaces as a database error, not a network
|
|
6
|
-
* transition. This is the server-side counterpart to the browser's
|
|
7
|
-
* connectivity-aware provider, which watches the real online/offline signal.
|
|
8
|
-
*/
|
|
9
|
-
import type { OnlineStatusProvider } from '../interfaces/index.js';
|
|
10
|
-
/**
|
|
11
|
-
* Returns an OnlineStatusProvider that always reports online.
|
|
12
|
-
* `onStatusChange` never fires — the network never transitions.
|
|
13
|
-
*/
|
|
14
|
-
export declare function alwaysOnline(): OnlineStatusProvider;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* An {@link OnlineStatusProvider} that always reports the client as online.
|
|
3
|
-
* Server-side runtimes — Node processes, agents, and sidecars — have no
|
|
4
|
-
* browser network stack to lose, so there is no offline state to track. A
|
|
5
|
-
* dropped database connection surfaces as a database error, not a network
|
|
6
|
-
* transition. This is the server-side counterpart to the browser's
|
|
7
|
-
* connectivity-aware provider, which watches the real online/offline signal.
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Returns an OnlineStatusProvider that always reports online.
|
|
11
|
-
* `onStatusChange` never fires — the network never transitions.
|
|
12
|
-
*/
|
|
13
|
-
export function alwaysOnline() {
|
|
14
|
-
return {
|
|
15
|
-
isOnline: () => true,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* An in-memory {@link ObjectStoreContract} implementation for runtimes
|
|
3
|
-
* without IndexedDB, such as Node processes, agents, and tests. It keeps
|
|
4
|
-
* records in a map and maintains simple secondary indexes, satisfying the
|
|
5
|
-
* same contract the IndexedDB-backed store implements — so if the two ever
|
|
6
|
-
* diverge, the mismatch becomes a typecheck error here rather than a silent
|
|
7
|
-
* failure at a call site.
|
|
8
|
-
*
|
|
9
|
-
* Nothing is persisted; the data is cleared on process restart. That is
|
|
10
|
-
* deliberate: server-side runtimes and agent workers rebuild their state from
|
|
11
|
-
* the server's delta stream rather than from a local cache.
|
|
12
|
-
*/
|
|
13
|
-
import type { ObjectStoreContract } from '../stores/ObjectStoreContract.js';
|
|
14
|
-
export declare class InMemoryObjectStore implements ObjectStoreContract {
|
|
15
|
-
readonly modelName: string;
|
|
16
|
-
readonly storeName: string;
|
|
17
|
-
private data;
|
|
18
|
-
private indexes;
|
|
19
|
-
constructor(modelName: string, storeName: string, indexNames?: string[]);
|
|
20
|
-
add(record: Record<string, unknown>): Promise<void>;
|
|
21
|
-
put(record: Record<string, unknown>): Promise<void>;
|
|
22
|
-
get(id: string): Promise<Record<string, unknown> | undefined>;
|
|
23
|
-
getAll(): Promise<Record<string, unknown>[]>;
|
|
24
|
-
delete(id: string): Promise<void>;
|
|
25
|
-
getAllFromIndex(indexName: string, value: IDBValidKey): Promise<Record<string, unknown>[]>;
|
|
26
|
-
clear(): Promise<void>;
|
|
27
|
-
/** No-op — in-memory stores don't need closing. */
|
|
28
|
-
markAsClosing(): void;
|
|
29
|
-
private addToIndexes;
|
|
30
|
-
private removeFromIndexes;
|
|
31
|
-
}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* An in-memory {@link ObjectStoreContract} implementation for runtimes
|
|
3
|
-
* without IndexedDB, such as Node processes, agents, and tests. It keeps
|
|
4
|
-
* records in a map and maintains simple secondary indexes, satisfying the
|
|
5
|
-
* same contract the IndexedDB-backed store implements — so if the two ever
|
|
6
|
-
* diverge, the mismatch becomes a typecheck error here rather than a silent
|
|
7
|
-
* failure at a call site.
|
|
8
|
-
*
|
|
9
|
-
* Nothing is persisted; the data is cleared on process restart. That is
|
|
10
|
-
* deliberate: server-side runtimes and agent workers rebuild their state from
|
|
11
|
-
* the server's delta stream rather than from a local cache.
|
|
12
|
-
*/
|
|
13
|
-
export class InMemoryObjectStore {
|
|
14
|
-
modelName;
|
|
15
|
-
storeName;
|
|
16
|
-
data = new Map();
|
|
17
|
-
indexes = new Map();
|
|
18
|
-
constructor(modelName, storeName, indexNames = []) {
|
|
19
|
-
this.modelName = modelName;
|
|
20
|
-
this.storeName = storeName;
|
|
21
|
-
for (const name of indexNames) {
|
|
22
|
-
this.indexes.set(name, new Map());
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
add(record) {
|
|
26
|
-
const id = record.id;
|
|
27
|
-
if (!id)
|
|
28
|
-
throw new TypeError('In-memory record must carry an id');
|
|
29
|
-
if (this.data.has(id)) {
|
|
30
|
-
const error = new Error(`Record already exists: ${id}`);
|
|
31
|
-
error.name = 'ConstraintError';
|
|
32
|
-
throw error;
|
|
33
|
-
}
|
|
34
|
-
this.data.set(id, { ...record });
|
|
35
|
-
this.addToIndexes(id, record);
|
|
36
|
-
return Promise.resolve();
|
|
37
|
-
}
|
|
38
|
-
put(record) {
|
|
39
|
-
const id = record.id;
|
|
40
|
-
if (!id)
|
|
41
|
-
return Promise.resolve();
|
|
42
|
-
// Remove from old index entries if updating
|
|
43
|
-
const existing = this.data.get(id);
|
|
44
|
-
if (existing) {
|
|
45
|
-
this.removeFromIndexes(id, existing);
|
|
46
|
-
}
|
|
47
|
-
this.data.set(id, { ...record });
|
|
48
|
-
this.addToIndexes(id, record);
|
|
49
|
-
return Promise.resolve();
|
|
50
|
-
}
|
|
51
|
-
get(id) {
|
|
52
|
-
return Promise.resolve(this.data.get(id));
|
|
53
|
-
}
|
|
54
|
-
getAll() {
|
|
55
|
-
return Promise.resolve([...this.data.values()]);
|
|
56
|
-
}
|
|
57
|
-
delete(id) {
|
|
58
|
-
const existing = this.data.get(id);
|
|
59
|
-
if (existing) {
|
|
60
|
-
this.removeFromIndexes(id, existing);
|
|
61
|
-
this.data.delete(id);
|
|
62
|
-
}
|
|
63
|
-
return Promise.resolve();
|
|
64
|
-
}
|
|
65
|
-
getAllFromIndex(indexName, value) {
|
|
66
|
-
const index = this.indexes.get(indexName);
|
|
67
|
-
if (!index)
|
|
68
|
-
return Promise.resolve([]);
|
|
69
|
-
// The in-memory index stores values as strings (it doesn't support
|
|
70
|
-
// the full IDB key range — Date / BufferSource / arrays). For the
|
|
71
|
-
// overwhelmingly-common case of string FK ids, coercing through
|
|
72
|
-
// String() preserves the existing behavior while satisfying the
|
|
73
|
-
// shared `ObjectStoreContract` signature.
|
|
74
|
-
const ids = index.get(String(value));
|
|
75
|
-
if (!ids)
|
|
76
|
-
return Promise.resolve([]);
|
|
77
|
-
return Promise.resolve([...ids]
|
|
78
|
-
.map((id) => this.data.get(id))
|
|
79
|
-
.filter((r) => r != null));
|
|
80
|
-
}
|
|
81
|
-
clear() {
|
|
82
|
-
this.data.clear();
|
|
83
|
-
for (const index of this.indexes.values()) {
|
|
84
|
-
index.clear();
|
|
85
|
-
}
|
|
86
|
-
return Promise.resolve();
|
|
87
|
-
}
|
|
88
|
-
/** No-op — in-memory stores don't need closing. */
|
|
89
|
-
markAsClosing() { }
|
|
90
|
-
addToIndexes(id, record) {
|
|
91
|
-
for (const [indexName, indexMap] of this.indexes) {
|
|
92
|
-
const value = record[indexName];
|
|
93
|
-
if (value != null) {
|
|
94
|
-
const key = String(value);
|
|
95
|
-
if (!indexMap.has(key))
|
|
96
|
-
indexMap.set(key, new Set());
|
|
97
|
-
indexMap.get(key).add(id);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
removeFromIndexes(id, record) {
|
|
102
|
-
for (const [indexName, indexMap] of this.indexes) {
|
|
103
|
-
const value = record[indexName];
|
|
104
|
-
if (value != null) {
|
|
105
|
-
const key = String(value);
|
|
106
|
-
indexMap.get(key)?.delete(id);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Turns a write to one of your models into a Vercel AI SDK tool that handles
|
|
3
|
-
* multi-agent coordination for you, so an agent can contribute to shared state
|
|
4
|
-
* without silently overwriting another writer's concurrent change.
|
|
5
|
-
*
|
|
6
|
-
* The lower-level approach is to write your own `tool()` and call
|
|
7
|
-
* `ablo.<model>.update({ id, data, claim })` inside its `execute` — the right
|
|
8
|
-
* amount of control for a bespoke tool. This helper covers the common case
|
|
9
|
-
* instead: the agent produced some content and you want to save it into a shared
|
|
10
|
-
* row, without re-deriving optimistic concurrency each time. You declare the
|
|
11
|
-
* write:
|
|
12
|
-
*
|
|
13
|
-
* ```ts
|
|
14
|
-
* import { coordinatedTool } from '@abloatai/ablo/ai-sdk';
|
|
15
|
-
* import { z } from 'zod';
|
|
16
|
-
*
|
|
17
|
-
* const saveSection = coordinatedTool(ablo.documents, {
|
|
18
|
-
* description: 'Save your section into the shared document.',
|
|
19
|
-
* inputSchema: z.object({ text: z.string() }),
|
|
20
|
-
* id: () => DOC_ID,
|
|
21
|
-
* apply: (current, { text }) => ({ content: appendBlock(current.content, text) }),
|
|
22
|
-
* // strategy: 'merge' ← the default
|
|
23
|
-
* });
|
|
24
|
-
*
|
|
25
|
-
* await streamText({ model, messages, tools: { saveSection } });
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* The {@link CoordinatedToolOptions.apply} function is the whole API: a pure
|
|
29
|
-
* function from the freshest row and the tool input to a patch, in the same
|
|
30
|
-
* spirit as a functional state update. Everything beneath it — reading the latest
|
|
31
|
-
* row, the compare-and-swap, backing off between retries, and releasing claims —
|
|
32
|
-
* is the runtime's job.
|
|
33
|
-
*
|
|
34
|
-
* ## Strategies
|
|
35
|
-
*
|
|
36
|
-
* Choose a strategy by how you want concurrent writers to relate. Each is
|
|
37
|
-
* designed to converge under many agents writing at once.
|
|
38
|
-
*
|
|
39
|
-
* - `'merge'` (the default) delegates to the functional update
|
|
40
|
-
* `ablo.<model>.update(id, current => apply(current, input))`. The runtime
|
|
41
|
-
* re-reads and re-applies `apply` on top of every concurrent write, backing off
|
|
42
|
-
* between rounds, so many agents accumulate into one row and the model never
|
|
43
|
-
* sees a conflict. This requires the model's agent conflict policy to be
|
|
44
|
-
* `reject` (the default, or `agentsReject()`). A model that declares
|
|
45
|
-
* `agentsNotify()` holds the losing write instead of rejecting it, which
|
|
46
|
-
* defeats the reconcile loop — there, use `'claim'` or `'queue'`, or change the
|
|
47
|
-
* policy.
|
|
48
|
-
*
|
|
49
|
-
* - `'claim'` gives mutual exclusion. It takes a fail-fast claim; if another
|
|
50
|
-
* participant holds the row, it returns `{ status: 'claimed' }` and leaves the
|
|
51
|
-
* decision to retry up to the model. A visible signal serves the agent better
|
|
52
|
-
* than a hidden wait when it might spend its turn on something else. Works under
|
|
53
|
-
* any conflict policy.
|
|
54
|
-
*
|
|
55
|
-
* - `'queue'` serializes writers over stateless HTTP. The tool polls to acquire
|
|
56
|
-
* the claim until it is granted or `poll.timeoutMs` elapses, so the model calls
|
|
57
|
-
* once and the tool waits its turn. Ordering is approximate rather than strict
|
|
58
|
-
* first-in-first-out, which would require a persistent connection.
|
|
59
|
-
*/
|
|
60
|
-
import type { z } from 'zod';
|
|
61
|
-
import type { ClaimParams, ModelRetrieveParams, ModelUpdateParams } from '../client/createModelProxy.js';
|
|
62
|
-
import type { ModelUpdater, ContentionOptions } from '../transaction/resources/functionalUpdate.js';
|
|
63
|
-
import type { HeldClaim } from '../transaction/types/streams.js';
|
|
64
|
-
export type CoordinationStrategy = 'merge' | 'claim' | 'queue';
|
|
65
|
-
/** The structured result the tool hands back to the model (or the caller). */
|
|
66
|
-
export interface CoordinatedWriteResult<T> {
|
|
67
|
-
/**
|
|
68
|
-
* `'written'` means the change was saved. `'claimed'` means another participant
|
|
69
|
-
* holds the row, so nothing was saved and the model should try again.
|
|
70
|
-
* `'timeout'` means the `'queue'` strategy could not acquire the row within
|
|
71
|
-
* `poll.timeoutMs`.
|
|
72
|
-
*/
|
|
73
|
-
status: 'written' | 'claimed' | 'timeout';
|
|
74
|
-
/** The reconciled row, on `'written'`. */
|
|
75
|
-
row?: T;
|
|
76
|
-
message?: string;
|
|
77
|
-
/** On `'written'` via the `queue` strategy, how long the tool waited in line. */
|
|
78
|
-
waitedMs?: number;
|
|
79
|
-
}
|
|
80
|
-
export interface CoordinatedToolOptions<TInput, T> {
|
|
81
|
-
/** Tool description shown to the model. */
|
|
82
|
-
description: string;
|
|
83
|
-
/** The schema of what the model may send, as a standard AI SDK / Zod input schema. */
|
|
84
|
-
inputSchema: z.ZodType<TInput>;
|
|
85
|
-
/** Which row this write targets, derived from the tool input. */
|
|
86
|
-
id: (input: TInput) => string;
|
|
87
|
-
/**
|
|
88
|
-
* Produces the write patch from the freshest current row and the tool input, as
|
|
89
|
-
* a pure function of the two. Under `'merge'` it re-runs on top of every
|
|
90
|
-
* concurrent write, so it must be idempotent with respect to its own
|
|
91
|
-
* contribution — for example, skip its change when its marker is already
|
|
92
|
-
* present — to stay correct across retries.
|
|
93
|
-
*/
|
|
94
|
-
apply: (current: T, input: TInput) => Partial<T>;
|
|
95
|
-
/** How concurrent writers relate. Defaults to `'merge'`. */
|
|
96
|
-
strategy?: CoordinationStrategy;
|
|
97
|
-
/** Human-readable coordination metadata attached to the claim, used by the `'claim'` and `'queue'` strategies. */
|
|
98
|
-
claim?: {
|
|
99
|
-
description?: string;
|
|
100
|
-
};
|
|
101
|
-
/** How many reconcile rounds `'merge'` may take before it gives up with `AbloContentionError`. */
|
|
102
|
-
retries?: number;
|
|
103
|
-
/** Poll interval and overall timeout for `'queue'`. Defaults to 250ms and 30s. */
|
|
104
|
-
poll?: {
|
|
105
|
-
intervalMs?: number;
|
|
106
|
-
timeoutMs?: number;
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* The small model port this helper needs. Both typed transports implement this
|
|
111
|
-
* exact contract; local-cache methods, wire receipts, and transport lifecycle
|
|
112
|
-
* deliberately stay out of an AI tool's dependency surface.
|
|
113
|
-
*/
|
|
114
|
-
export interface CoordinatedModel<T> {
|
|
115
|
-
retrieve(params: ModelRetrieveParams): Promise<T | undefined>;
|
|
116
|
-
update(params: ModelUpdateParams<T>): Promise<T>;
|
|
117
|
-
update(id: string, updater: ModelUpdater<T>, options?: ContentionOptions): Promise<T | undefined>;
|
|
118
|
-
claim(params: ClaimParams<T>): Promise<HeldClaim<T>>;
|
|
119
|
-
}
|
|
120
|
-
export declare function coordinatedTool<TInput, T = Record<string, unknown>>(model: CoordinatedModel<T>, options: CoordinatedToolOptions<TInput, T>): import("ai").Tool<TInput, CoordinatedWriteResult<T>>;
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Turns a write to one of your models into a Vercel AI SDK tool that handles
|
|
3
|
-
* multi-agent coordination for you, so an agent can contribute to shared state
|
|
4
|
-
* without silently overwriting another writer's concurrent change.
|
|
5
|
-
*
|
|
6
|
-
* The lower-level approach is to write your own `tool()` and call
|
|
7
|
-
* `ablo.<model>.update({ id, data, claim })` inside its `execute` — the right
|
|
8
|
-
* amount of control for a bespoke tool. This helper covers the common case
|
|
9
|
-
* instead: the agent produced some content and you want to save it into a shared
|
|
10
|
-
* row, without re-deriving optimistic concurrency each time. You declare the
|
|
11
|
-
* write:
|
|
12
|
-
*
|
|
13
|
-
* ```ts
|
|
14
|
-
* import { coordinatedTool } from '@abloatai/ablo/ai-sdk';
|
|
15
|
-
* import { z } from 'zod';
|
|
16
|
-
*
|
|
17
|
-
* const saveSection = coordinatedTool(ablo.documents, {
|
|
18
|
-
* description: 'Save your section into the shared document.',
|
|
19
|
-
* inputSchema: z.object({ text: z.string() }),
|
|
20
|
-
* id: () => DOC_ID,
|
|
21
|
-
* apply: (current, { text }) => ({ content: appendBlock(current.content, text) }),
|
|
22
|
-
* // strategy: 'merge' ← the default
|
|
23
|
-
* });
|
|
24
|
-
*
|
|
25
|
-
* await streamText({ model, messages, tools: { saveSection } });
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* The {@link CoordinatedToolOptions.apply} function is the whole API: a pure
|
|
29
|
-
* function from the freshest row and the tool input to a patch, in the same
|
|
30
|
-
* spirit as a functional state update. Everything beneath it — reading the latest
|
|
31
|
-
* row, the compare-and-swap, backing off between retries, and releasing claims —
|
|
32
|
-
* is the runtime's job.
|
|
33
|
-
*
|
|
34
|
-
* ## Strategies
|
|
35
|
-
*
|
|
36
|
-
* Choose a strategy by how you want concurrent writers to relate. Each is
|
|
37
|
-
* designed to converge under many agents writing at once.
|
|
38
|
-
*
|
|
39
|
-
* - `'merge'` (the default) delegates to the functional update
|
|
40
|
-
* `ablo.<model>.update(id, current => apply(current, input))`. The runtime
|
|
41
|
-
* re-reads and re-applies `apply` on top of every concurrent write, backing off
|
|
42
|
-
* between rounds, so many agents accumulate into one row and the model never
|
|
43
|
-
* sees a conflict. This requires the model's agent conflict policy to be
|
|
44
|
-
* `reject` (the default, or `agentsReject()`). A model that declares
|
|
45
|
-
* `agentsNotify()` holds the losing write instead of rejecting it, which
|
|
46
|
-
* defeats the reconcile loop — there, use `'claim'` or `'queue'`, or change the
|
|
47
|
-
* policy.
|
|
48
|
-
*
|
|
49
|
-
* - `'claim'` gives mutual exclusion. It takes a fail-fast claim; if another
|
|
50
|
-
* participant holds the row, it returns `{ status: 'claimed' }` and leaves the
|
|
51
|
-
* decision to retry up to the model. A visible signal serves the agent better
|
|
52
|
-
* than a hidden wait when it might spend its turn on something else. Works under
|
|
53
|
-
* any conflict policy.
|
|
54
|
-
*
|
|
55
|
-
* - `'queue'` serializes writers over stateless HTTP. The tool polls to acquire
|
|
56
|
-
* the claim until it is granted or `poll.timeoutMs` elapses, so the model calls
|
|
57
|
-
* once and the tool waits its turn. Ordering is approximate rather than strict
|
|
58
|
-
* first-in-first-out, which would require a persistent connection.
|
|
59
|
-
*/
|
|
60
|
-
import { tool } from 'ai';
|
|
61
|
-
import { AbloClaimedError, AbloNotFoundError } from '../transaction/errors.js';
|
|
62
|
-
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
63
|
-
export function coordinatedTool(model, options) {
|
|
64
|
-
const strategy = options.strategy ?? 'merge';
|
|
65
|
-
return tool({
|
|
66
|
-
description: options.description,
|
|
67
|
-
inputSchema: options.inputSchema,
|
|
68
|
-
execute: async (input) => {
|
|
69
|
-
const id = options.id(input);
|
|
70
|
-
if (strategy === 'merge') {
|
|
71
|
-
// Read the freshest row, apply the patch, and commit it with a
|
|
72
|
-
// compare-and-swap; on any concurrent write, re-read and re-apply with
|
|
73
|
-
// backoff. The model never sees a conflict.
|
|
74
|
-
const row = await model.update(id, (current) => options.apply(current, input), {
|
|
75
|
-
retries: options.retries,
|
|
76
|
-
});
|
|
77
|
-
return { status: 'written', row: row ?? undefined };
|
|
78
|
-
}
|
|
79
|
-
// The 'claim' and 'queue' strategies both acquire a claim, write under it,
|
|
80
|
-
// and release it. They differ only in what they do when the row is already
|
|
81
|
-
// held: 'claim' returns a signal to the model, while 'queue' waits and
|
|
82
|
-
// retries by polling to acquire.
|
|
83
|
-
const acquireWriteRelease = async () => {
|
|
84
|
-
const claim = await model.claim({
|
|
85
|
-
id,
|
|
86
|
-
queue: false,
|
|
87
|
-
description: options.claim?.description,
|
|
88
|
-
});
|
|
89
|
-
try {
|
|
90
|
-
const current = await model.retrieve({ id });
|
|
91
|
-
if (current === undefined) {
|
|
92
|
-
throw new AbloNotFoundError(`Cannot write ${id}: it does not exist (or is outside this credential's scope).`, [id]);
|
|
93
|
-
}
|
|
94
|
-
const row = await model.update({ id, data: options.apply(current, input), claim, wait: 'confirmed' });
|
|
95
|
-
return { status: 'written', row };
|
|
96
|
-
}
|
|
97
|
-
finally {
|
|
98
|
-
await claim.release();
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
if (strategy === 'claim') {
|
|
102
|
-
try {
|
|
103
|
-
return await acquireWriteRelease();
|
|
104
|
-
}
|
|
105
|
-
catch (e) {
|
|
106
|
-
if (e instanceof AbloClaimedError) {
|
|
107
|
-
return { status: 'claimed', message: 'Another participant holds this row right now — it was NOT saved. Wait briefly and try again.' };
|
|
108
|
-
}
|
|
109
|
-
throw e;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
// strategy === 'queue': poll to acquire the claim over stateless HTTP.
|
|
113
|
-
const interval = options.poll?.intervalMs ?? 250;
|
|
114
|
-
const timeout = options.poll?.timeoutMs ?? 30_000;
|
|
115
|
-
const start = Date.now();
|
|
116
|
-
for (;;) {
|
|
117
|
-
try {
|
|
118
|
-
const result = await acquireWriteRelease();
|
|
119
|
-
return { ...result, waitedMs: Date.now() - start };
|
|
120
|
-
}
|
|
121
|
-
catch (e) {
|
|
122
|
-
if (e instanceof AbloClaimedError) {
|
|
123
|
-
if (Date.now() - start >= timeout) {
|
|
124
|
-
return { status: 'timeout', message: `Could not acquire the row within ${timeout}ms.` };
|
|
125
|
-
}
|
|
126
|
-
await sleep(interval);
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
throw e;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
},
|
|
133
|
-
});
|
|
134
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Language-model middleware that tells the model when other participants are
|
|
3
|
-
* editing the same entity. It reads peer claims on the target from the agent's
|
|
4
|
-
* live presence stream and, when it finds any, injects a short coordination note
|
|
5
|
-
* into the prompt before the model runs.
|
|
6
|
-
*
|
|
7
|
-
* This is the counterpart to the claim-broadcast middleware: that one announces
|
|
8
|
-
* what this agent is about to do, while this one reads what others are doing and
|
|
9
|
-
* passes it to the model. Together they let the model notice when a person or
|
|
10
|
-
* another agent is mid-edit and respond — deferring, framing its work as
|
|
11
|
-
* complementary, or suggesting it wait.
|
|
12
|
-
*
|
|
13
|
-
* It depends only on the AI SDK's provider types and a connected agent from this
|
|
14
|
-
* package, and you compose it with the AI SDK's `wrapLanguageModel`. Reading
|
|
15
|
-
* peers costs no extra model calls: the presence stream is already in memory from
|
|
16
|
-
* the agent's subscription. It adds only a few sentences to the system prompt,
|
|
17
|
-
* and only while peers are actively editing.
|
|
18
|
-
*/
|
|
19
|
-
import type { LanguageModelV3Middleware } from '@ai-sdk/provider';
|
|
20
|
-
import type { Ablo } from '../client/Ablo.js';
|
|
21
|
-
import type { SchemaRecord } from '../transaction/schema/schema.js';
|
|
22
|
-
import type { ClaimTarget } from '../transaction/types/streams.js';
|
|
23
|
-
export type { ClaimTarget };
|
|
24
|
-
export interface CoordinationContextMiddlewareOptions<R extends SchemaRecord = SchemaRecord> {
|
|
25
|
-
readonly agent: Ablo<R> | null;
|
|
26
|
-
readonly target: ClaimTarget | null;
|
|
27
|
-
/**
|
|
28
|
-
* Claim identifiers to leave out of the read, typically this agent's own active
|
|
29
|
-
* claim so the note doesn't report that the agent is editing against itself. In
|
|
30
|
-
* the usual composition with the claim-broadcast middleware, `transformParams`
|
|
31
|
-
* runs before that middleware declares its claim, so the agent's own claim
|
|
32
|
-
* isn't in the presence stream yet and no filtering is needed. This option is
|
|
33
|
-
* here for callers that compose the middleware differently, or that coordinate a
|
|
34
|
-
* fleet and want to exclude sibling workers' claims.
|
|
35
|
-
*/
|
|
36
|
-
readonly excludeClaimIds?: readonly string[];
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Builds the coordination-context middleware. If `agent` or `target` is null, the
|
|
40
|
-
* middleware passes the prompt through unchanged.
|
|
41
|
-
*
|
|
42
|
-
* The generic over the schema record matches the claim-broadcast middleware: a
|
|
43
|
-
* typed `Ablo<S>` and the widened `Ablo<SchemaRecord>` are not structurally
|
|
44
|
-
* assignable, so the parameter stays generic to spare callers a cast.
|
|
45
|
-
*/
|
|
46
|
-
export declare function coordinationContextMiddleware<R extends SchemaRecord = SchemaRecord>(options: CoordinationContextMiddlewareOptions<R>): LanguageModelV3Middleware;
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Language-model middleware that tells the model when other participants are
|
|
3
|
-
* editing the same entity. It reads peer claims on the target from the agent's
|
|
4
|
-
* live presence stream and, when it finds any, injects a short coordination note
|
|
5
|
-
* into the prompt before the model runs.
|
|
6
|
-
*
|
|
7
|
-
* This is the counterpart to the claim-broadcast middleware: that one announces
|
|
8
|
-
* what this agent is about to do, while this one reads what others are doing and
|
|
9
|
-
* passes it to the model. Together they let the model notice when a person or
|
|
10
|
-
* another agent is mid-edit and respond — deferring, framing its work as
|
|
11
|
-
* complementary, or suggesting it wait.
|
|
12
|
-
*
|
|
13
|
-
* It depends only on the AI SDK's provider types and a connected agent from this
|
|
14
|
-
* package, and you compose it with the AI SDK's `wrapLanguageModel`. Reading
|
|
15
|
-
* peers costs no extra model calls: the presence stream is already in memory from
|
|
16
|
-
* the agent's subscription. It adds only a few sentences to the system prompt,
|
|
17
|
-
* and only while peers are actively editing.
|
|
18
|
-
*/
|
|
19
|
-
/**
|
|
20
|
-
* Builds the coordination-context middleware. If `agent` or `target` is null, the
|
|
21
|
-
* middleware passes the prompt through unchanged.
|
|
22
|
-
*
|
|
23
|
-
* The generic over the schema record matches the claim-broadcast middleware: a
|
|
24
|
-
* typed `Ablo<S>` and the widened `Ablo<SchemaRecord>` are not structurally
|
|
25
|
-
* assignable, so the parameter stays generic to spare callers a cast.
|
|
26
|
-
*/
|
|
27
|
-
export function coordinationContextMiddleware(options) {
|
|
28
|
-
const { agent, target } = options;
|
|
29
|
-
const excludeClaimIds = new Set(options.excludeClaimIds ?? []);
|
|
30
|
-
return {
|
|
31
|
-
specificationVersion: 'v3',
|
|
32
|
-
transformParams: async ({ params }) => {
|
|
33
|
-
if (!agent || !target)
|
|
34
|
-
return params;
|
|
35
|
-
// Look up peer claims on the same target. This reads the agent's reactive
|
|
36
|
-
// `claims.others` array in memory, with no I/O. The type is compared
|
|
37
|
-
// case-insensitively: observed claims carry a lowercased type name (such as
|
|
38
|
-
// `report`) while callers write the schema's type name (`Report`).
|
|
39
|
-
const wantedType = target.type.toLowerCase();
|
|
40
|
-
const peerClaims = agent.claims.others.filter((claim) => claim.target.type.toLowerCase() === wantedType &&
|
|
41
|
-
claim.target.id === target.id &&
|
|
42
|
-
targetsOverlap(claim.target, target) &&
|
|
43
|
-
!excludeClaimIds.has(claim.id));
|
|
44
|
-
if (peerClaims.length === 0)
|
|
45
|
-
return params;
|
|
46
|
-
const note = formatCoordinationNote(peerClaims, target);
|
|
47
|
-
return injectSystemNote(params, note);
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
function hasSubtarget(target) {
|
|
52
|
-
return Boolean(target.path || target.field || target.range);
|
|
53
|
-
}
|
|
54
|
-
function rangesOverlap(a, b) {
|
|
55
|
-
return a.startLine <= b.endLine && b.startLine <= a.endLine;
|
|
56
|
-
}
|
|
57
|
-
function targetsOverlap(claimTarget, target) {
|
|
58
|
-
if (!hasSubtarget(claimTarget) || !hasSubtarget(target))
|
|
59
|
-
return true;
|
|
60
|
-
if (claimTarget.path &&
|
|
61
|
-
target.path &&
|
|
62
|
-
claimTarget.path.toLowerCase() !== target.path.toLowerCase()) {
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
const fieldOverlaps = !claimTarget.field ||
|
|
66
|
-
!target.field ||
|
|
67
|
-
claimTarget.field.toLowerCase() === target.field.toLowerCase();
|
|
68
|
-
const rangeOverlaps = !claimTarget.range ||
|
|
69
|
-
!target.range ||
|
|
70
|
-
rangesOverlap(claimTarget.range, target.range);
|
|
71
|
-
return fieldOverlaps && rangeOverlaps;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Formats a one-paragraph coordination note for the model. It names who is
|
|
75
|
-
* editing and, when known, what they are doing. The note stays short: the goal is
|
|
76
|
-
* to make the model aware, not to flood the prompt.
|
|
77
|
-
*/
|
|
78
|
-
function formatCoordinationNote(claims, target) {
|
|
79
|
-
const entityLabel = target.type.toLowerCase();
|
|
80
|
-
const c = claims.length === 1 ? claims[0] : undefined;
|
|
81
|
-
if (c) {
|
|
82
|
-
return (`<multiplayer_context>\n` +
|
|
83
|
-
`Another participant is currently editing this ${entityLabel}. ` +
|
|
84
|
-
`Declared work: ${c.description}. ` +
|
|
85
|
-
`Defer to their concurrent changes when reasonable, or note your work as complementary to theirs. ` +
|
|
86
|
-
`Avoid stomping their in-flight edits.\n` +
|
|
87
|
-
`</multiplayer_context>`);
|
|
88
|
-
}
|
|
89
|
-
const descriptions = Array.from(new Set(claims.map((c) => c.description).filter(Boolean))).join('; ');
|
|
90
|
-
return (`<multiplayer_context>\n` +
|
|
91
|
-
`${claims.length} other participants are currently editing this ${entityLabel}. ` +
|
|
92
|
-
(descriptions ? `Declared work: ${descriptions}. ` : '') +
|
|
93
|
-
`Coordinate with their in-flight work — defer where reasonable, ` +
|
|
94
|
-
`or describe your work as complementary.\n` +
|
|
95
|
-
`</multiplayer_context>`);
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Append a system-role message to the prompt array. The AI SDK's
|
|
99
|
-
* `LanguageModelV3Prompt` is an ordered list of messages.
|
|
100
|
-
*/
|
|
101
|
-
function injectSystemNote(params, note) {
|
|
102
|
-
return {
|
|
103
|
-
...params,
|
|
104
|
-
prompt: [...params.prompt, { role: 'system', content: note }],
|
|
105
|
-
};
|
|
106
|
-
}
|