@abloatai/ablo 0.34.1 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +758 -5
- package/README.md +56 -502
- package/bin/ablo.cjs +39 -0
- package/dist/BaseSyncedStore.d.ts +176 -48
- package/dist/BaseSyncedStore.js +346 -214
- package/dist/Database.d.ts +17 -44
- package/dist/Database.js +96 -79
- package/dist/InstanceCache.d.ts +31 -6
- package/dist/InstanceCache.js +65 -30
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +23 -13
- package/dist/Model.js +27 -17
- package/dist/ModelRegistry.d.ts +8 -4
- package/dist/ModelRegistry.js +20 -18
- package/dist/NetworkMonitor.d.ts +3 -1
- package/dist/NetworkMonitor.js +7 -5
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +47 -47
- package/dist/SyncClient.js +215 -156
- package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
- package/dist/ai-sdk/coordinatedTool.js +1 -1
- package/dist/ai-sdk/coordinationContext.d.ts +2 -2
- package/dist/ai-sdk/coordinationContext.js +1 -1
- package/dist/ai-sdk/wrap.d.ts +3 -3
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/index.d.ts +1 -156
- package/dist/auth/index.js +8 -301
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +129 -963
- package/dist/client/abloClient.d.ts +309 -0
- package/dist/client/abloClient.js +13 -0
- package/dist/client/clientPrelude.d.ts +52 -0
- package/dist/client/clientPrelude.js +60 -0
- package/dist/client/consoleLogger.d.ts +2 -2
- package/dist/client/coreClient.d.ts +60 -0
- package/dist/client/coreClient.js +118 -0
- package/dist/client/createInternalComponents.d.ts +8 -4
- package/dist/client/createInternalComponents.js +17 -10
- package/dist/client/createModelProxy.d.ts +98 -373
- package/dist/client/createModelProxy.js +233 -139
- package/dist/client/humans.d.ts +69 -0
- package/dist/client/humans.js +78 -0
- package/dist/client/modelRegistration.d.ts +1 -1
- package/dist/client/modelRegistration.js +9 -9
- package/dist/client/options.d.ts +73 -17
- package/dist/client/reactiveEngine.d.ts +53 -0
- package/dist/client/reactiveEngine.js +688 -0
- package/dist/client/resourceTypes.d.ts +9 -250
- package/dist/client/resourceTypes.js +8 -5
- package/dist/client/schemaConfig.d.ts +4 -4
- package/dist/client/schemaConfig.js +6 -2
- package/dist/client/storeCluster.d.ts +47 -0
- package/dist/client/storeCluster.js +118 -0
- package/dist/client/storeLifecycle.d.ts +61 -0
- package/dist/client/storeLifecycle.js +231 -0
- package/dist/client/validateAbloOptions.d.ts +3 -2
- package/dist/client/validateAbloOptions.js +1 -1
- package/dist/client/wsMutationExecutor.d.ts +3 -3
- package/dist/client/wsMutationExecutor.js +3 -3
- package/dist/context.d.ts +22 -9
- package/dist/context.js +33 -9
- package/dist/coordination/ClaimLog.d.ts +26 -0
- package/dist/coordination/ClaimLog.js +32 -0
- package/dist/coordination/index.d.ts +1 -15
- package/dist/coordination/index.js +8 -31
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.js +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +230 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +10 -0
- package/dist/environment.d.ts +1 -40
- package/dist/environment.js +8 -37
- package/dist/index.d.ts +44 -36
- package/dist/index.js +30 -22
- package/dist/interfaces/index.d.ts +44 -134
- package/dist/keys/index.d.ts +1 -77
- package/dist/keys/index.js +8 -190
- package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
- package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
- package/dist/mutators/Transaction.d.ts +1 -1
- package/dist/mutators/Transaction.js +1 -1
- package/dist/mutators/UndoManager.d.ts +6 -6
- package/dist/mutators/UndoManager.js +5 -5
- package/dist/mutators/defineMutators.d.ts +3 -3
- package/dist/mutators/defineMutators.js +1 -1
- package/dist/mutators/inverseOp.js +2 -2
- package/dist/mutators/mutateActions.d.ts +3 -3
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +1 -1
- package/dist/mutators/undoApply.d.ts +1 -1
- package/dist/mutators/undoApply.js +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/query/client.d.ts +5 -2
- package/dist/query/client.js +10 -9
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +18 -8
- package/dist/react/AbloProvider.js +10 -9
- package/dist/react/context.d.ts +3 -3
- package/dist/react/context.js +1 -1
- package/dist/react/createAbloReact.d.ts +56 -0
- package/dist/react/createAbloReact.js +51 -0
- package/dist/react/index.d.ts +6 -5
- package/dist/react/index.js +6 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +12 -5
- package/dist/react/useAblo.js +26 -8
- package/dist/react/useCurrentUserId.js +1 -1
- package/dist/react/useErrorListener.js +1 -1
- package/dist/react/useMutationFailureListener.d.ts +2 -2
- package/dist/react/useMutationFailureListener.js +1 -1
- package/dist/react/useMutators.d.ts +3 -3
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useUndoScope.d.ts +5 -5
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +69 -10
- package/dist/schema/coordination.js +90 -9
- package/dist/schema/ddl.js +2 -2
- package/dist/schema/diff.d.ts +1 -1
- package/dist/schema/generate.js +1 -1
- package/dist/schema/index.d.ts +11 -10
- package/dist/schema/index.js +22 -18
- package/dist/schema/queries.d.ts +27 -27
- package/dist/schema/queries.js +23 -23
- package/dist/schema/select.d.ts +3 -3
- package/dist/schema/select.js +6 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +20 -3
- package/dist/schema/sugar.d.ts +6 -7
- package/dist/schema/sugar.js +9 -12
- package/dist/schema/syncDeltaRow.d.ts +4 -152
- package/dist/schema/syncDeltaRow.js +4 -105
- package/dist/server/adapter.d.ts +18 -1
- package/dist/server/commit.d.ts +10 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +1 -1
- package/dist/source/adapter.d.ts +7 -5
- package/dist/source/adapter.js +7 -5
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.js +2 -2
- package/dist/source/adapters/kysely.d.ts +1 -1
- package/dist/source/adapters/kysely.js +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +2 -2
- package/dist/source/adapters/memory.js +1 -1
- package/dist/source/adapters/prisma.d.ts +8 -3
- package/dist/source/adapters/prisma.js +1 -1
- package/dist/source/connector.js +1 -1
- package/dist/source/connectorProtocol.d.ts +2 -8
- package/dist/source/connectorProtocol.js +3 -2
- package/dist/source/contract.d.ts +29 -17
- package/dist/source/contract.js +27 -22
- package/dist/source/factory.d.ts +1 -1
- package/dist/source/idempotency.js +2 -2
- package/dist/source/index.d.ts +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/next.d.ts +1 -1
- package/dist/source/signing.d.ts +9 -2
- package/dist/source/signing.js +4 -1
- package/dist/source/types.d.ts +6 -4
- package/dist/source/types.js +1 -1
- package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
- package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
- package/dist/{core → stores}/DatabaseManager.js +14 -13
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/{core → stores}/StoreManager.d.ts +9 -26
- package/dist/{core → stores}/StoreManager.js +29 -77
- package/dist/stores/SyncActionStore.d.ts +4 -2
- package/dist/stores/SyncActionStore.js +11 -17
- package/dist/stores/syncAction.d.ts +26 -0
- package/dist/stores/syncAction.js +16 -0
- package/dist/surface.d.ts +3 -3
- package/dist/surface.js +6 -4
- package/dist/sync/BootstrapFetcher.d.ts +127 -6
- package/dist/sync/BootstrapFetcher.js +511 -83
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +5 -2
- package/dist/sync/OnDemandLoader.js +61 -21
- package/dist/sync/SubscriptionManager.d.ts +13 -2
- package/dist/sync/SubscriptionManager.js +23 -5
- package/dist/sync/SyncWebSocket.d.ts +27 -510
- package/dist/sync/SyncWebSocket.js +76 -954
- package/dist/sync/awaitClaimGrant.d.ts +4 -44
- package/dist/sync/awaitClaimGrant.js +4 -109
- package/dist/sync/bootstrapApply.d.ts +3 -0
- package/dist/sync/bootstrapApply.js +2 -2
- package/dist/sync/commitFrames.d.ts +6 -40
- package/dist/sync/commitFrames.js +6 -97
- package/dist/sync/contextPorts.d.ts +18 -0
- package/dist/sync/contextPorts.js +31 -0
- package/dist/sync/createClaimStream.d.ts +5 -49
- package/dist/sync/createClaimStream.js +5 -469
- package/dist/sync/createPresenceStream.d.ts +26 -4
- package/dist/sync/createPresenceStream.js +28 -20
- package/dist/sync/createSnapshot.d.ts +2 -2
- package/dist/sync/createSnapshot.js +1 -1
- package/dist/sync/credentialLifecycle.d.ts +5 -173
- package/dist/sync/credentialLifecycle.js +5 -320
- package/dist/sync/deltaPipeline.d.ts +13 -12
- package/dist/sync/deltaPipeline.js +21 -4
- package/dist/sync/groupChange.d.ts +3 -0
- package/dist/sync/groupChange.js +16 -14
- package/dist/sync/participants.d.ts +24 -6
- package/dist/sync/participants.js +32 -23
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +23 -33
- package/dist/sync/schemas.js +29 -20
- package/dist/sync/syncPlan.d.ts +3 -3
- package/dist/sync/wsFrameHandlers.d.ts +6 -114
- package/dist/sync/wsFrameHandlers.js +6 -392
- package/dist/syncLog/contract.d.ts +20 -0
- package/dist/syncLog/contract.js +19 -0
- package/dist/syncLog/index.d.ts +1 -0
- package/dist/syncLog/index.js +1 -0
- package/dist/transaction/ablo.d.ts +88 -0
- package/dist/transaction/ablo.js +33 -0
- package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
- package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
- package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
- package/dist/transaction/auth/bootstrapScope.js +1 -0
- package/dist/transaction/auth/capability.d.ts +212 -0
- package/dist/transaction/auth/capability.js +224 -0
- package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
- package/dist/{client → transaction/auth}/identity.d.ts +8 -7
- package/dist/{client → transaction/auth}/identity.js +1 -1
- package/dist/transaction/auth/index.d.ts +162 -0
- package/dist/transaction/auth/index.js +304 -0
- package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
- package/dist/{auth → transaction/auth}/schemas.js +13 -13
- package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
- package/dist/{client → transaction/auth}/sessionMint.js +4 -7
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
- package/dist/transaction/coordination/claimMeta.d.ts +49 -0
- package/dist/transaction/coordination/claimMeta.js +52 -0
- package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
- package/dist/transaction/coordination/createClaimStream.js +475 -0
- package/dist/transaction/coordination/events.d.ts +74 -0
- package/dist/transaction/coordination/events.js +7 -0
- package/dist/transaction/coordination/index.d.ts +19 -0
- package/dist/transaction/coordination/index.js +45 -0
- package/dist/transaction/coordination/locator.d.ts +104 -0
- package/dist/transaction/coordination/locator.js +102 -0
- package/dist/transaction/coordination/schema.d.ts +1536 -0
- package/dist/transaction/coordination/schema.js +1177 -0
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +107 -0
- package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
- package/dist/{coordination → transaction/coordination}/trace.js +18 -25
- package/dist/transaction/durableWrites.d.ts +62 -0
- package/dist/{client → transaction}/durableWrites.js +28 -3
- package/dist/transaction/environment.d.ts +105 -0
- package/dist/transaction/environment.js +108 -0
- package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
- package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/footprint.d.ts +111 -0
- package/dist/transaction/footprint.js +0 -0
- package/dist/transaction/index.d.ts +20 -0
- package/dist/transaction/index.js +20 -0
- package/dist/transaction/keys/index.d.ts +87 -0
- package/dist/transaction/keys/index.js +207 -0
- package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
- package/dist/transaction/log/syncDeltaRow.js +95 -0
- package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
- package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
- package/dist/transaction/logger.d.ts +16 -0
- package/dist/transaction/logger.js +7 -0
- package/dist/transaction/observability.d.ts +53 -0
- package/dist/transaction/observability.js +19 -0
- package/dist/transaction/plugin.d.ts +285 -0
- package/dist/transaction/plugin.js +106 -0
- package/dist/{policy → transaction/policy}/types.d.ts +3 -3
- package/dist/{policy → transaction/policy}/types.js +2 -0
- package/dist/transaction/resources/httpResources.d.ts +321 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +427 -0
- package/dist/transaction/resources/modelOperations.js +12 -0
- package/dist/transaction/resources/mutationOptions.d.ts +66 -0
- package/dist/transaction/resources/mutationOptions.js +9 -0
- package/dist/transaction/resources/where.d.ts +101 -0
- package/dist/transaction/resources/where.js +115 -0
- package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
- package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
- package/dist/{schema → transaction/schema}/field.d.ts +17 -23
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/fieldRef.d.ts +38 -0
- package/dist/transaction/schema/fieldRef.js +11 -0
- package/dist/transaction/schema/loadStrategy.d.ts +45 -0
- package/dist/transaction/schema/loadStrategy.js +46 -0
- package/dist/{schema → transaction/schema}/model.d.ts +50 -35
- package/dist/{schema → transaction/schema}/model.js +30 -20
- package/dist/transaction/schema/openapi.d.ts +58 -0
- package/dist/transaction/schema/openapi.js +501 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
- package/dist/{schema → transaction/schema}/relation.js +7 -7
- package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
- package/dist/{schema → transaction/schema}/residency.js +0 -5
- package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
- package/dist/{schema → transaction/schema}/roles.js +5 -5
- package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
- package/dist/{schema → transaction/schema}/schema.js +24 -3
- package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
- package/dist/{schema → transaction/schema}/tenancy.js +7 -4
- package/dist/transaction/transactionLayer.d.ts +82 -0
- package/dist/transaction/transactionLayer.js +24 -0
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
- package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
- package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
- package/dist/transaction/transport/commitFrames.d.ts +90 -0
- package/dist/transaction/transport/commitFrames.js +134 -0
- package/dist/transaction/transport/connectionManager.d.ts +215 -0
- package/dist/transaction/transport/connectionManager.js +673 -0
- package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
- package/dist/transaction/transport/credentialLifecycle.js +324 -0
- package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
- package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
- package/dist/transaction/transport/httpClient.d.ts +131 -0
- package/dist/{client → transaction/transport}/httpClient.js +6 -5
- package/dist/transaction/transport/httpOptions.d.ts +33 -0
- package/dist/transaction/transport/httpOptions.js +12 -0
- package/dist/{client → transaction/transport}/httpTransport.js +295 -97
- package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
- package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
- package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
- package/dist/transaction/transport/wsFrameHandlers.js +429 -0
- package/dist/transaction/transport/wsTransport.d.ts +574 -0
- package/dist/transaction/transport/wsTransport.js +1023 -0
- package/dist/transaction/types/assertExact.d.ts +17 -0
- package/dist/transaction/types/assertExact.js +1 -0
- package/dist/{types → transaction/types}/global.d.ts +17 -2
- package/dist/{types → transaction/types}/global.js +2 -1
- package/dist/{types → transaction/types}/index.d.ts +14 -46
- package/dist/{types → transaction/types}/index.js +7 -16
- package/dist/{types → transaction/types}/streams.d.ts +73 -45
- package/dist/transaction/utils/duration.d.ts +50 -0
- package/dist/{utils → transaction/utils}/duration.js +32 -0
- package/dist/{utils → transaction/utils}/json.d.ts +18 -0
- package/dist/transaction/utils/json.js +276 -0
- package/dist/transaction/wire/accountResponses.d.ts +420 -0
- package/dist/transaction/wire/accountResponses.js +290 -0
- package/dist/transaction/wire/auth.d.ts +56 -0
- package/dist/transaction/wire/auth.js +63 -0
- package/dist/transaction/wire/claimEvent.d.ts +76 -0
- package/dist/transaction/wire/claimEvent.js +73 -0
- package/dist/transaction/wire/claims.d.ts +530 -0
- package/dist/transaction/wire/claims.js +327 -0
- package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
- package/dist/{wire → transaction/wire}/commit.js +68 -47
- package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
- package/dist/{wire → transaction/wire}/delta.js +37 -13
- package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
- package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
- package/dist/transaction/wire/feedCursor.d.ts +60 -0
- package/dist/transaction/wire/feedCursor.js +82 -0
- package/dist/transaction/wire/feedEvent.d.ts +204 -0
- package/dist/transaction/wire/feedEvent.js +65 -0
- package/dist/transaction/wire/frames.d.ts +194 -0
- package/dist/transaction/wire/frames.js +50 -0
- package/dist/transaction/wire/inboundFrames.d.ts +562 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +54 -0
- package/dist/transaction/wire/index.js +83 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelMutations.d.ts +31 -0
- package/dist/transaction/wire/modelMutations.js +52 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transaction/wire/modelShape.d.ts +78 -0
- package/dist/transaction/wire/modelShape.js +74 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
- package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
- package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
- package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
- package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
- package/dist/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/transactions/mutations/commitLatency.js +130 -0
- package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
- package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
- package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
- package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
- package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/{core → views}/QueryView.d.ts +2 -2
- package/dist/{core → views}/QueryView.js +2 -2
- package/dist/{core → views}/ViewRegistry.d.ts +1 -1
- package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
- package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
- package/dist/webhooks/events.d.ts +2 -2
- package/dist/wire/index.d.ts +1 -34
- package/dist/wire/index.js +8 -49
- package/docs/agent-messaging.md +3 -3
- package/docs/agents.md +20 -13
- package/docs/api-keys.md +14 -10
- package/docs/api.md +27 -61
- package/docs/audit.md +6 -3
- package/docs/cli.md +41 -13
- package/docs/client-behavior.md +11 -9
- package/docs/concurrency-convention.md +49 -57
- package/docs/coordination.md +283 -121
- package/docs/data-sources.md +7 -5
- package/docs/debugging.md +39 -15
- package/docs/deployment.md +267 -0
- package/docs/examples/agent-human.md +49 -42
- package/docs/examples/ai-sdk-tool.md +69 -44
- package/docs/examples/existing-python-backend.md +8 -6
- package/docs/examples/nextjs.md +129 -47
- package/docs/examples/scoped-agent.md +46 -45
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +87 -30
- package/docs/guarantees.md +41 -12
- package/docs/how-it-works.md +38 -12
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +77 -74
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +31 -19
- package/docs/mcp.md +46 -21
- package/docs/migration.md +95 -18
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +3 -1
- package/docs/quickstart.md +22 -5
- package/docs/react.md +31 -18
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +4 -2
- package/docs/webhooks.md +12 -10
- package/llms.txt +48 -18
- package/package.json +21 -26
- package/dist/agent/Agent.d.ts +0 -366
- package/dist/agent/Agent.js +0 -514
- package/dist/agent/index.d.ts +0 -115
- package/dist/agent/index.js +0 -128
- package/dist/agent/session.d.ts +0 -93
- package/dist/agent/session.js +0 -149
- package/dist/agent/types.d.ts +0 -68
- package/dist/agent/types.js +0 -9
- package/dist/cli.cjs +0 -286329
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/client/httpClient.d.ts +0 -80
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/coordination/schema.js +0 -578
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -192
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -71
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transactions/durableWriteStore.js +0 -30
- package/dist/utils/duration.d.ts +0 -25
- package/dist/utils/json.js +0 -88
- package/dist/wire/errorEnvelope.d.ts +0 -55
- package/dist/wire/frames.d.ts +0 -197
- package/dist/wire/frames.js +0 -49
- package/dist/wire/listEnvelope.js +0 -18
- package/docs/interaction-model.md +0 -97
- /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
- /package/dist/{core → query}/QueryProcessor.js +0 -0
- /package/dist/{core/storeContract.js → storeContract.js} +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
- /package/dist/{client → transaction}/persistence.d.ts +0 -0
- /package/dist/{client → transaction}/persistence.js +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
- /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.js +0 -0
- /package/dist/{types → transaction/types}/participant.d.ts +0 -0
- /package/dist/{types → transaction/types}/participant.js +0 -0
- /package/dist/{types → transaction/types}/streams.js +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
- /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocol.js +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
- /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
- /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
- /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
- /package/dist/{core → views}/ViewRegistry.js +0 -0
package/dist/agent/index.js
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @abloatai/ablo/agent — Agent SDK helpers
|
|
3
|
-
*
|
|
4
|
-
* Two entry points depending on agent lifetime:
|
|
5
|
-
*
|
|
6
|
-
* ─────────────────────────────────────────────────────────────────────────
|
|
7
|
-
* Long-lived agents (browser, daemon, persistent Node process)
|
|
8
|
-
* ─────────────────────────────────────────────────────────────────────────
|
|
9
|
-
* Use the unified `Ablo({...})` factory directly with `kind: 'agent'`.
|
|
10
|
-
* The factory holds the WebSocket, reactive subscriptions, mutations, and
|
|
11
|
-
* presence/claims — same surface as a browser user, just with a
|
|
12
|
-
* server-issued capability token instead of session cookies.
|
|
13
|
-
*
|
|
14
|
-
* ```ts
|
|
15
|
-
* import Ablo from '@abloatai/ablo';
|
|
16
|
-
*
|
|
17
|
-
* const ablo = Ablo({
|
|
18
|
-
* schema,
|
|
19
|
-
* url: 'wss://api.example.com',
|
|
20
|
-
* organizationId,
|
|
21
|
-
* kind: 'agent',
|
|
22
|
-
* agentId: 'reviewer-bot',
|
|
23
|
-
* capabilityToken: mintedToken,
|
|
24
|
-
* syncGroups: [`org:${organizationId}`],
|
|
25
|
-
* inMemory: true, // Node has no IndexedDB
|
|
26
|
-
* });
|
|
27
|
-
*
|
|
28
|
-
* await ablo.ready();
|
|
29
|
-
* for (const task of ablo.tasks.list({ where: { status: 'pending_review' } })) {
|
|
30
|
-
* await ablo.tasks.update(task.id, { status: 'reviewed' });
|
|
31
|
-
* }
|
|
32
|
-
* ```
|
|
33
|
-
*
|
|
34
|
-
* For server-side caching across requests, use {@link Agent.session}
|
|
35
|
-
* — it caches one engine per identity and refreshes capability tokens
|
|
36
|
-
* before expiry.
|
|
37
|
-
*
|
|
38
|
-
* ─────────────────────────────────────────────────────────────────────────
|
|
39
|
-
* Short-lived agents (queue consumer, serverless, API route)
|
|
40
|
-
* ─────────────────────────────────────────────────────────────────────────
|
|
41
|
-
* Use {@link Agent}. Stateless REST hooks that slot directly into
|
|
42
|
-
* the Vercel AI SDK's `generateText` / `streamText`. No WebSocket. Ideal
|
|
43
|
-
* for agent-worker jobs that process one task and exit.
|
|
44
|
-
*
|
|
45
|
-
* ```ts
|
|
46
|
-
* import { generateText, tool, stepCountIs } from 'ai';
|
|
47
|
-
* import { Agent } from '@abloatai/ablo/agent';
|
|
48
|
-
*
|
|
49
|
-
* const perception = new Agent({
|
|
50
|
-
* syncServerUrl: 'http://localhost:8080',
|
|
51
|
-
* agentId: job.id,
|
|
52
|
-
* organizationId: job.organizationId,
|
|
53
|
-
* syncGroups: [`org:${job.organizationId}`],
|
|
54
|
-
* });
|
|
55
|
-
*
|
|
56
|
-
* await generateText({
|
|
57
|
-
* model: 'anthropic/claude-sonnet-4.5',
|
|
58
|
-
* messages,
|
|
59
|
-
* stopWhen: stepCountIs(10),
|
|
60
|
-
* tools: {
|
|
61
|
-
* updateSlide: perception.wrapTool(tool({ ... }), {
|
|
62
|
-
* entityType: 'Slide',
|
|
63
|
-
* getEntityId: (args) => args.id,
|
|
64
|
-
* }),
|
|
65
|
-
* },
|
|
66
|
-
* prepareStep: perception.prepareStep(),
|
|
67
|
-
* onStepFinish: perception.onStepFinish(),
|
|
68
|
-
* });
|
|
69
|
-
* ```
|
|
70
|
-
*
|
|
71
|
-
* ─────────────────────────────────────────────────────────────────────────
|
|
72
|
-
* Idiomatic tool pattern
|
|
73
|
-
* ─────────────────────────────────────────────────────────────────────────
|
|
74
|
-
* Tools are factory functions that pull ambient state from
|
|
75
|
-
* `experimental_context`. The caller builds an {@link AgentContext} once
|
|
76
|
-
* and passes it to `generateText`; every tool reaches in.
|
|
77
|
-
*
|
|
78
|
-
* ```ts
|
|
79
|
-
* import { tool } from 'ai';
|
|
80
|
-
* import { z } from 'zod';
|
|
81
|
-
* import { Agent, type AgentContext } from '@abloatai/ablo/agent';
|
|
82
|
-
*
|
|
83
|
-
* export const updateSlideTool = () => tool({
|
|
84
|
-
* description: 'Update a slide title',
|
|
85
|
-
* inputSchema: z.object({ id: z.string(), title: z.string() }),
|
|
86
|
-
* execute: async (args, { experimental_context }) => {
|
|
87
|
-
* const perception = Agent.fromContext(experimental_context, 'updateSlide');
|
|
88
|
-
* const check = await perception.checkFreshness('Slide', args.id, Date.now() - 5000);
|
|
89
|
-
* if (check.stale) return check.summary;
|
|
90
|
-
* return { ok: true };
|
|
91
|
-
* },
|
|
92
|
-
* });
|
|
93
|
-
* ```
|
|
94
|
-
*
|
|
95
|
-
* ─────────────────────────────────────────────────────────────────────────
|
|
96
|
-
* Composed usage (a long-lived `Ablo({kind:'agent'})` plus an Agent)
|
|
97
|
-
* ─────────────────────────────────────────────────────────────────────────
|
|
98
|
-
* If you have a long-lived `Ablo` instance AND want AI SDK hooks, pass it
|
|
99
|
-
* as the `announcer` to Agent — presence announcements route
|
|
100
|
-
* through the existing WebSocket instead of opening new HTTP calls.
|
|
101
|
-
*
|
|
102
|
-
* ```ts
|
|
103
|
-
* const ablo = Ablo({ kind: 'agent', schema, capabilityToken, ... });
|
|
104
|
-
* await ablo.ready();
|
|
105
|
-
*
|
|
106
|
-
* const perception = new Agent({
|
|
107
|
-
* ...sharedConfig,
|
|
108
|
-
* announcer: ablo, // reuse the WebSocket
|
|
109
|
-
* });
|
|
110
|
-
* ```
|
|
111
|
-
*
|
|
112
|
-
* Both `Ablo` and `Agent` implement the
|
|
113
|
-
* {@link PresenceAnnouncer} interface.
|
|
114
|
-
*/
|
|
115
|
-
// ── The entire `/agent` surface — one symbol ────────────────────────────
|
|
116
|
-
//
|
|
117
|
-
// `Agent` is both the class and the namespace for its types. Reach for
|
|
118
|
-
// options, context, and session options via dot access:
|
|
119
|
-
//
|
|
120
|
-
// import { Agent } from '@abloatai/ablo/agent';
|
|
121
|
-
// const opts: Agent.Options = { ... };
|
|
122
|
-
// const ctx: Agent.Context = { perception };
|
|
123
|
-
// const s: Agent.SessionOptions = { ... };
|
|
124
|
-
//
|
|
125
|
-
// Everything else (Activity, Claim, Peer, ActiveClaim, ...)
|
|
126
|
-
// lives on the `Ablo.*` namespace via
|
|
127
|
-
// `import type { Ablo } from '@abloatai/ablo'`.
|
|
128
|
-
export { Agent } from './Agent.js';
|
package/dist/agent/session.d.ts
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Caches and manages the lifecycle of long-lived agent connections on a server.
|
|
3
|
-
*
|
|
4
|
-
* Server code that runs AI agents typically needs the same four things, and this
|
|
5
|
-
* module handles all of them:
|
|
6
|
-
* 1. Reuse one connected agent per (organization, user, surface, target)
|
|
7
|
-
* instead of connecting anew on every request.
|
|
8
|
-
* 2. Re-issue the agent's capability token before it expires.
|
|
9
|
-
* 3. Request exactly the sync groups the token allows, so the two lists
|
|
10
|
-
* overlap. If they don't, the agent subscribes to nothing and every
|
|
11
|
-
* broadcast is silently filtered out.
|
|
12
|
-
* 4. Connect, disconnect, and dispose cleanly.
|
|
13
|
-
*
|
|
14
|
-
* Everything except obtaining the token is the same for every caller and lives
|
|
15
|
-
* here. Obtaining the token depends on how you authenticate — cookie forwarding,
|
|
16
|
-
* API-key exchange, OAuth, and so on — so you supply that step through the
|
|
17
|
-
* {@link AgentSessionOptions.issueToken} callback. The module itself depends on
|
|
18
|
-
* nothing outside this package.
|
|
19
|
-
*/
|
|
20
|
-
import { Ablo } from '../client/Ablo.js';
|
|
21
|
-
import type { Schema, SchemaRecord } from '../schema/schema.js';
|
|
22
|
-
interface IssuedToken {
|
|
23
|
-
readonly token: string;
|
|
24
|
-
readonly expiresAtMs: number;
|
|
25
|
-
/**
|
|
26
|
-
* The sync groups this token grants access to. It must include every group the
|
|
27
|
-
* agent needs to subscribe to. The agent's effective subscription is the
|
|
28
|
-
* overlap between the groups it requests and the groups listed here, so a list
|
|
29
|
-
* that omits a needed group leaves the agent subscribed to nothing and silently
|
|
30
|
-
* receiving no broadcasts.
|
|
31
|
-
*/
|
|
32
|
-
readonly syncGroups: readonly string[];
|
|
33
|
-
}
|
|
34
|
-
interface AgentIdentity {
|
|
35
|
-
readonly userId: string;
|
|
36
|
-
readonly organizationId: string;
|
|
37
|
-
/**
|
|
38
|
-
* The kind of surface making the request, such as `'chat'`, `'mcp'`, or
|
|
39
|
-
* `'agent_worker'`. The cache keys on this value, so two surfaces never share a
|
|
40
|
-
* token or a WebSocket connection.
|
|
41
|
-
*/
|
|
42
|
-
readonly surfaceClass: string;
|
|
43
|
-
readonly target?: {
|
|
44
|
-
readonly entityType: string;
|
|
45
|
-
readonly entityId: string;
|
|
46
|
-
} | null;
|
|
47
|
-
}
|
|
48
|
-
export interface AgentSessionOptions<R extends SchemaRecord = SchemaRecord> {
|
|
49
|
-
/** WebSocket URL of your sync server, such as `wss://sync.example.com` or `ws://localhost:3001`. */
|
|
50
|
-
readonly syncServerUrl: string;
|
|
51
|
-
/**
|
|
52
|
-
* Your schema, used to build the typed model proxy on the returned client. The
|
|
53
|
-
* agent client exposes it as `agent.<model>.create/update/delete`.
|
|
54
|
-
*/
|
|
55
|
-
readonly schema: Schema<R>;
|
|
56
|
-
/**
|
|
57
|
-
* Issues a capability token for the given identity. The session calls it on a
|
|
58
|
-
* cache miss or when the current token is near expiry. Because this callback
|
|
59
|
-
* carries out your authentication flow — cookie forwarding, API-key exchange,
|
|
60
|
-
* OAuth, and so on — the rest of the session stays independent of how you
|
|
61
|
-
* authenticate.
|
|
62
|
-
*/
|
|
63
|
-
readonly issueToken: (identity: AgentIdentity) => Promise<IssuedToken>;
|
|
64
|
-
/**
|
|
65
|
-
* How long before a token's true expiry the session should re-issue it, in
|
|
66
|
-
* milliseconds. Defaults to 30 seconds. The buffer absorbs clock skew so a
|
|
67
|
-
* token never expires mid-use.
|
|
68
|
-
*/
|
|
69
|
-
readonly reissueBufferMs?: number;
|
|
70
|
-
/**
|
|
71
|
-
* How to derive the agent's identifier from the request identity. Defaults to
|
|
72
|
-
* `${surfaceClass}:${userId}`. Override it when you want a different shape for
|
|
73
|
-
* attribution.
|
|
74
|
-
*/
|
|
75
|
-
readonly agentIdFor?: (identity: AgentIdentity) => string;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Creates a session that hands out connected agents on demand. Its `getAgent`
|
|
79
|
-
* method handles caching, token issuance, sync-group alignment, and connection
|
|
80
|
-
* lifecycle; call `disposeAll` from your process's shutdown hook to close every
|
|
81
|
-
* open connection.
|
|
82
|
-
*
|
|
83
|
-
* Treat the session as a long-lived singleton shared across requests. The cache
|
|
84
|
-
* key combines organization, user, surface, and target, so two concurrent
|
|
85
|
-
* requests for the same combination share one agent and one WebSocket, while
|
|
86
|
-
* requests for different combinations get independent agents.
|
|
87
|
-
*/
|
|
88
|
-
export declare function createAgentSession<R extends SchemaRecord = SchemaRecord>(options: AgentSessionOptions<R>): {
|
|
89
|
-
getAgent: (identity: AgentIdentity) => Promise<Ablo<R>>;
|
|
90
|
-
evict: (identity: AgentIdentity) => void;
|
|
91
|
-
disposeAll: () => void;
|
|
92
|
-
};
|
|
93
|
-
export {};
|
package/dist/agent/session.js
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Caches and manages the lifecycle of long-lived agent connections on a server.
|
|
3
|
-
*
|
|
4
|
-
* Server code that runs AI agents typically needs the same four things, and this
|
|
5
|
-
* module handles all of them:
|
|
6
|
-
* 1. Reuse one connected agent per (organization, user, surface, target)
|
|
7
|
-
* instead of connecting anew on every request.
|
|
8
|
-
* 2. Re-issue the agent's capability token before it expires.
|
|
9
|
-
* 3. Request exactly the sync groups the token allows, so the two lists
|
|
10
|
-
* overlap. If they don't, the agent subscribes to nothing and every
|
|
11
|
-
* broadcast is silently filtered out.
|
|
12
|
-
* 4. Connect, disconnect, and dispose cleanly.
|
|
13
|
-
*
|
|
14
|
-
* Everything except obtaining the token is the same for every caller and lives
|
|
15
|
-
* here. Obtaining the token depends on how you authenticate — cookie forwarding,
|
|
16
|
-
* API-key exchange, OAuth, and so on — so you supply that step through the
|
|
17
|
-
* {@link AgentSessionOptions.issueToken} callback. The module itself depends on
|
|
18
|
-
* nothing outside this package.
|
|
19
|
-
*/
|
|
20
|
-
import { Ablo } from '../client/Ablo.js';
|
|
21
|
-
import { AbloConnectionError } from '../errors.js';
|
|
22
|
-
import { getContext } from '../context.js';
|
|
23
|
-
/**
|
|
24
|
-
* Creates a session that hands out connected agents on demand. Its `getAgent`
|
|
25
|
-
* method handles caching, token issuance, sync-group alignment, and connection
|
|
26
|
-
* lifecycle; call `disposeAll` from your process's shutdown hook to close every
|
|
27
|
-
* open connection.
|
|
28
|
-
*
|
|
29
|
-
* Treat the session as a long-lived singleton shared across requests. The cache
|
|
30
|
-
* key combines organization, user, surface, and target, so two concurrent
|
|
31
|
-
* requests for the same combination share one agent and one WebSocket, while
|
|
32
|
-
* requests for different combinations get independent agents.
|
|
33
|
-
*/
|
|
34
|
-
export function createAgentSession(options) {
|
|
35
|
-
const reissueBufferMs = options.reissueBufferMs ?? 30_000;
|
|
36
|
-
const agentIdFor = options.agentIdFor ??
|
|
37
|
-
((id) => `${id.surfaceClass}:${id.userId}`);
|
|
38
|
-
const cacheByKey = new Map();
|
|
39
|
-
function cacheKey(id) {
|
|
40
|
-
const targetSeg = id.target
|
|
41
|
-
? `:${id.target.entityType}:${id.target.entityId}`
|
|
42
|
-
: '';
|
|
43
|
-
return `${id.organizationId}:${id.userId}:${id.surfaceClass}${targetSeg}`;
|
|
44
|
-
}
|
|
45
|
-
async function getAgent(identity) {
|
|
46
|
-
const key = cacheKey(identity);
|
|
47
|
-
const cached = cacheByKey.get(key);
|
|
48
|
-
if (cached && cached.expiresAtMs - Date.now() > reissueBufferMs) {
|
|
49
|
-
return cached.agent;
|
|
50
|
-
}
|
|
51
|
-
// Best-effort cleanup of stale agent — don't let a stuck cached
|
|
52
|
-
// entry block fresh issuance.
|
|
53
|
-
if (cached) {
|
|
54
|
-
try {
|
|
55
|
-
await cached.agent.dispose();
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
/* ignore */
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
const minted = await options.issueToken(identity);
|
|
62
|
-
// Request the same sync groups the token grants. The groups requested here
|
|
63
|
-
// and the groups the token allows must overlap; otherwise their intersection
|
|
64
|
-
// is empty and every broadcast is filtered out. The token's allowed list is
|
|
65
|
-
// exactly what to request, since the caller decided what went into it.
|
|
66
|
-
//
|
|
67
|
-
// Pass the URL as `baseURL`, the field the client reads. Any other field name
|
|
68
|
-
// is ignored, in which case the client would fall back to its default host,
|
|
69
|
-
// so `baseURL` keeps the caller's URL the single source of truth.
|
|
70
|
-
const wsUrl = toWsUrl(options.syncServerUrl);
|
|
71
|
-
const agentOptions = {
|
|
72
|
-
baseURL: wsUrl,
|
|
73
|
-
schema: options.schema,
|
|
74
|
-
kind: 'agent',
|
|
75
|
-
capabilityToken: minted.token,
|
|
76
|
-
agentId: agentIdFor(identity),
|
|
77
|
-
organizationId: identity.organizationId,
|
|
78
|
-
syncGroups: [...minted.syncGroups],
|
|
79
|
-
// Agents run in Node — no IDB available, no need for it.
|
|
80
|
-
inMemory: true,
|
|
81
|
-
};
|
|
82
|
-
const agent = Ablo(agentOptions);
|
|
83
|
-
try {
|
|
84
|
-
await agent.ready();
|
|
85
|
-
}
|
|
86
|
-
catch (err) {
|
|
87
|
-
const e = err;
|
|
88
|
-
const code = e.cause?.code;
|
|
89
|
-
const causeMsg = e.cause?.message;
|
|
90
|
-
// Best-effort dispose so the failed agent doesn't leak ws state.
|
|
91
|
-
try {
|
|
92
|
-
await agent.dispose();
|
|
93
|
-
}
|
|
94
|
-
catch { /* ignore */ }
|
|
95
|
-
// Log through the level-gated logger so it honors ABLO_LOG_LEVEL: an
|
|
96
|
-
// `error` headline naming the unreachable URL and code, plus a `debug`
|
|
97
|
-
// companion carrying the structured fields for deeper diagnosis.
|
|
98
|
-
const log = getContext().logger;
|
|
99
|
-
log.error(`Agent could not connect to the sync server at ${wsUrl}${code ? ` (${code})` : ''}.`);
|
|
100
|
-
log.debug('[Agent.session] ws bootstrap failed', {
|
|
101
|
-
url: wsUrl,
|
|
102
|
-
surfaceClass: identity.surfaceClass,
|
|
103
|
-
orgId: identity.organizationId,
|
|
104
|
-
userId: identity.userId,
|
|
105
|
-
code,
|
|
106
|
-
causeMsg,
|
|
107
|
-
err,
|
|
108
|
-
});
|
|
109
|
-
throw new AbloConnectionError(`ws bootstrap ${wsUrl} failed: ${e.message ?? 'bootstrap failed'}` +
|
|
110
|
-
(code ? ` (${code})` : ''), { code: 'bootstrap_fetch_timeout', cause: err });
|
|
111
|
-
}
|
|
112
|
-
cacheByKey.set(key, { agent, expiresAtMs: minted.expiresAtMs });
|
|
113
|
-
return agent;
|
|
114
|
-
}
|
|
115
|
-
function disposeAll() {
|
|
116
|
-
for (const { agent } of cacheByKey.values()) {
|
|
117
|
-
try {
|
|
118
|
-
void agent.dispose();
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
/* ignore */
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
cacheByKey.clear();
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Removes and disposes one cached agent. Call it when you know the agent's
|
|
128
|
-
* token is no longer valid — after a revocation or role change, for example —
|
|
129
|
-
* so the next `getAgent` call issues a fresh one.
|
|
130
|
-
*/
|
|
131
|
-
function evict(identity) {
|
|
132
|
-
const key = cacheKey(identity);
|
|
133
|
-
const cached = cacheByKey.get(key);
|
|
134
|
-
if (cached) {
|
|
135
|
-
try {
|
|
136
|
-
void cached.agent.dispose();
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
/* ignore */
|
|
140
|
-
}
|
|
141
|
-
cacheByKey.delete(key);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return { getAgent, evict, disposeAll };
|
|
145
|
-
}
|
|
146
|
-
/** `https://host` → `wss://host`; `http://host` → `ws://host`. */
|
|
147
|
-
function toWsUrl(url) {
|
|
148
|
-
return url.replace(/^http/, 'ws');
|
|
149
|
-
}
|
package/dist/agent/types.d.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Types specific to running AI agents. The shared data vocabulary — `Peer`,
|
|
3
|
-
* {@link Activity}, `Claim`, `ActiveClaim`, `PresenceUpdatePayload`, and
|
|
4
|
-
* `PresenceKind` — lives in the streams module. This file adds only the two
|
|
5
|
-
* pieces the agent layer needs on top of it: {@link PresenceAnnouncer}, a
|
|
6
|
-
* transport-agnostic way to announce presence, and {@link AgentContext}, the bag
|
|
7
|
-
* of ambient state passed to AI SDK tools.
|
|
8
|
-
*/
|
|
9
|
-
import type { Activity } from '../types/streams.js';
|
|
10
|
-
/**
|
|
11
|
-
* A minimal interface for announcing an agent's presence, independent of how it
|
|
12
|
-
* connects. Both the WebSocket-based agent client and the REST-based agent
|
|
13
|
-
* implement it, so higher-level code can depend on this interface without caring
|
|
14
|
-
* which transport is in use.
|
|
15
|
-
*/
|
|
16
|
-
export interface PresenceAnnouncer {
|
|
17
|
-
announce(status: 'online' | 'away' | 'offline', activity?: Activity): Promise<void>;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* The ambient state passed to AI SDK tools through the AI SDK's
|
|
21
|
-
* `experimental_context`. Build one {@link AgentContext} per agent invocation and
|
|
22
|
-
* pass it as `experimental_context`; each tool's `execute` function then reads
|
|
23
|
-
* what it needs from `options.experimental_context` rather than closing over
|
|
24
|
-
* shared module state.
|
|
25
|
-
*
|
|
26
|
-
* Passing context this way, rather than capturing it in each tool's closure,
|
|
27
|
-
* keeps tools as plain module exports that any agent can reuse, types the context
|
|
28
|
-
* in one place, and lets a new tool read any field without changing its
|
|
29
|
-
* signature.
|
|
30
|
-
*
|
|
31
|
-
* ```ts
|
|
32
|
-
* import { generateText, tool } from 'ai';
|
|
33
|
-
* import { Agent, type AgentContext } from '@abloatai/ablo/agent';
|
|
34
|
-
*
|
|
35
|
-
* const updateSlideTool = () => tool({
|
|
36
|
-
* inputSchema: z.object({ id: z.string(), title: z.string() }),
|
|
37
|
-
* execute: async (args, { experimental_context }) => {
|
|
38
|
-
* const perception = Agent.fromContext(experimental_context);
|
|
39
|
-
* const check = await perception.checkFreshness('Slide', args.id, Date.now() - 5000);
|
|
40
|
-
* if (check.stale) return check.summary;
|
|
41
|
-
* // ... actual mutation
|
|
42
|
-
* },
|
|
43
|
-
* });
|
|
44
|
-
*
|
|
45
|
-
* await generateText({
|
|
46
|
-
* model: 'anthropic/claude-sonnet-4.5',
|
|
47
|
-
* tools: { updateSlide: updateSlideTool() },
|
|
48
|
-
* experimental_context: { perception, organizationId, userId } satisfies AgentContext,
|
|
49
|
-
* });
|
|
50
|
-
* ```
|
|
51
|
-
*
|
|
52
|
-
* Extend {@link AgentContext} with your own fields through module augmentation or
|
|
53
|
-
* by intersecting it with your own context type.
|
|
54
|
-
*/
|
|
55
|
-
export interface AgentContext {
|
|
56
|
-
/** Announces presence and checks whether an entity has changed since a given time. Required. */
|
|
57
|
-
perception: PresenceAnnouncer & {
|
|
58
|
-
checkFreshness?: (entityType: string, entityId: string, lastSeenAt: number) => Promise<unknown>;
|
|
59
|
-
};
|
|
60
|
-
/** The organization every operation is scoped to. */
|
|
61
|
-
organizationId?: string;
|
|
62
|
-
/** Identifier for the user or agent. Agents use the form `agent:<id>`. */
|
|
63
|
-
userId?: string;
|
|
64
|
-
/** The sync groups this agent belongs to. */
|
|
65
|
-
syncGroups?: string[];
|
|
66
|
-
/** Room for your own product-specific fields. */
|
|
67
|
-
[key: string]: unknown;
|
|
68
|
-
}
|
package/dist/agent/types.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Types specific to running AI agents. The shared data vocabulary — `Peer`,
|
|
3
|
-
* {@link Activity}, `Claim`, `ActiveClaim`, `PresenceUpdatePayload`, and
|
|
4
|
-
* `PresenceKind` — lives in the streams module. This file adds only the two
|
|
5
|
-
* pieces the agent layer needs on top of it: {@link PresenceAnnouncer}, a
|
|
6
|
-
* transport-agnostic way to announce presence, and {@link AgentContext}, the bag
|
|
7
|
-
* of ambient state passed to AI SDK tools.
|
|
8
|
-
*/
|
|
9
|
-
export {};
|