@abloatai/ablo 0.34.1 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +674 -5
- package/README.md +39 -22
- package/dist/BaseSyncedStore.d.ts +152 -44
- package/dist/BaseSyncedStore.js +300 -184
- package/dist/Database.d.ts +9 -24
- package/dist/Database.js +37 -22
- package/dist/InstanceCache.d.ts +25 -4
- package/dist/InstanceCache.js +48 -15
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +6 -6
- package/dist/Model.js +10 -10
- package/dist/ModelRegistry.d.ts +4 -4
- package/dist/ModelRegistry.js +3 -3
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +42 -32
- package/dist/SyncClient.js +166 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
- package/dist/ai-sdk/coordinatedTool.js +1 -1
- package/dist/ai-sdk/coordinationContext.d.ts +2 -2
- package/dist/ai-sdk/coordinationContext.js +1 -1
- package/dist/ai-sdk/wrap.d.ts +3 -3
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/index.d.ts +1 -156
- package/dist/auth/index.js +8 -301
- package/dist/cli.cjs +3344 -1073
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +118 -963
- package/dist/client/abloClient.d.ts +309 -0
- package/dist/client/abloClient.js +13 -0
- package/dist/client/clientPrelude.d.ts +52 -0
- package/dist/client/clientPrelude.js +60 -0
- package/dist/client/consoleLogger.d.ts +2 -2
- package/dist/client/coreClient.d.ts +60 -0
- package/dist/client/coreClient.js +118 -0
- package/dist/client/createInternalComponents.d.ts +4 -4
- package/dist/client/createInternalComponents.js +9 -8
- package/dist/client/createModelProxy.d.ts +78 -373
- package/dist/client/createModelProxy.js +114 -86
- package/dist/client/humans.d.ts +48 -0
- package/dist/client/humans.js +52 -0
- package/dist/client/modelRegistration.d.ts +1 -1
- package/dist/client/modelRegistration.js +9 -9
- package/dist/client/options.d.ts +73 -17
- package/dist/client/reactiveEngine.d.ts +48 -0
- package/dist/client/reactiveEngine.js +910 -0
- package/dist/client/resourceTypes.d.ts +9 -250
- package/dist/client/resourceTypes.js +8 -5
- package/dist/client/schemaConfig.d.ts +4 -4
- package/dist/client/schemaConfig.js +6 -2
- package/dist/client/validateAbloOptions.d.ts +3 -2
- package/dist/client/validateAbloOptions.js +1 -1
- package/dist/client/wsMutationExecutor.d.ts +3 -3
- package/dist/client/wsMutationExecutor.js +3 -3
- package/dist/context.d.ts +9 -9
- package/dist/context.js +10 -9
- package/dist/coordination/ClaimLog.d.ts +26 -0
- package/dist/coordination/ClaimLog.js +32 -0
- package/dist/coordination/index.d.ts +1 -15
- package/dist/coordination/index.js +8 -31
- package/dist/core/DatabaseManager.js +1 -1
- package/dist/core/QueryView.d.ts +1 -1
- package/dist/core/QueryView.js +1 -1
- package/dist/core/StoreManager.d.ts +4 -23
- package/dist/core/StoreManager.js +5 -55
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +2 -2
- package/dist/core/storeContract.d.ts +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +227 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +10 -0
- package/dist/environment.d.ts +1 -40
- package/dist/environment.js +8 -37
- package/dist/index.d.ts +40 -34
- package/dist/index.js +26 -20
- package/dist/interfaces/index.d.ts +44 -134
- package/dist/keys/index.d.ts +1 -77
- package/dist/keys/index.js +8 -190
- package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
- package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
- package/dist/mutators/Transaction.d.ts +1 -1
- package/dist/mutators/Transaction.js +1 -1
- package/dist/mutators/UndoManager.d.ts +6 -6
- package/dist/mutators/UndoManager.js +5 -5
- package/dist/mutators/defineMutators.d.ts +3 -3
- package/dist/mutators/defineMutators.js +1 -1
- package/dist/mutators/inverseOp.js +2 -2
- package/dist/mutators/mutateActions.d.ts +3 -3
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +1 -1
- package/dist/mutators/undoApply.d.ts +1 -1
- package/dist/mutators/undoApply.js +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/query/client.d.ts +2 -2
- package/dist/query/client.js +4 -4
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +6 -8
- package/dist/react/AbloProvider.js +5 -7
- package/dist/react/context.d.ts +1 -1
- package/dist/react/context.js +1 -1
- package/dist/react/index.d.ts +5 -5
- package/dist/react/index.js +3 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +3 -3
- package/dist/react/useAblo.js +1 -1
- package/dist/react/useCurrentUserId.js +1 -1
- package/dist/react/useErrorListener.js +1 -1
- package/dist/react/useMutationFailureListener.d.ts +2 -2
- package/dist/react/useMutationFailureListener.js +1 -1
- package/dist/react/useMutators.d.ts +3 -3
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useUndoScope.d.ts +5 -5
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +69 -10
- package/dist/schema/coordination.js +86 -9
- package/dist/schema/ddl.js +2 -2
- package/dist/schema/diff.d.ts +1 -1
- package/dist/schema/generate.js +1 -1
- package/dist/schema/index.d.ts +10 -10
- package/dist/schema/index.js +18 -18
- package/dist/schema/queries.d.ts +27 -27
- package/dist/schema/queries.js +23 -23
- package/dist/schema/select.d.ts +3 -3
- package/dist/schema/select.js +3 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +17 -3
- package/dist/schema/sugar.d.ts +6 -7
- package/dist/schema/sugar.js +9 -12
- package/dist/schema/syncDeltaRow.d.ts +4 -152
- package/dist/schema/syncDeltaRow.js +4 -105
- package/dist/server/adapter.d.ts +18 -1
- package/dist/server/commit.d.ts +10 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +1 -1
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.js +2 -2
- package/dist/source/adapters/kysely.d.ts +1 -1
- package/dist/source/adapters/kysely.js +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +2 -2
- package/dist/source/adapters/memory.js +1 -1
- package/dist/source/adapters/prisma.d.ts +8 -3
- package/dist/source/adapters/prisma.js +1 -1
- package/dist/source/connector.js +1 -1
- package/dist/source/connectorProtocol.d.ts +2 -8
- package/dist/source/connectorProtocol.js +3 -2
- package/dist/source/contract.d.ts +29 -17
- package/dist/source/contract.js +27 -22
- package/dist/source/factory.d.ts +1 -1
- package/dist/source/footprint.d.ts +111 -0
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.js +2 -2
- package/dist/source/index.d.ts +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/next.d.ts +1 -1
- package/dist/source/signing.d.ts +9 -2
- package/dist/source/signing.js +4 -1
- package/dist/source/types.d.ts +6 -4
- package/dist/source/types.js +1 -1
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/stores/SyncActionStore.d.ts +1 -1
- package/dist/stores/SyncActionStore.js +2 -10
- package/dist/stores/syncAction.d.ts +26 -0
- package/dist/stores/syncAction.js +16 -0
- package/dist/surface.d.ts +3 -3
- package/dist/surface.js +6 -4
- package/dist/sync/BootstrapFetcher.d.ts +123 -6
- package/dist/sync/BootstrapFetcher.js +492 -66
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +2 -2
- package/dist/sync/OnDemandLoader.js +60 -21
- package/dist/sync/SubscriptionManager.d.ts +13 -2
- package/dist/sync/SubscriptionManager.js +23 -5
- package/dist/sync/SyncWebSocket.d.ts +27 -510
- package/dist/sync/SyncWebSocket.js +76 -954
- package/dist/sync/awaitClaimGrant.d.ts +4 -44
- package/dist/sync/awaitClaimGrant.js +4 -109
- package/dist/sync/commitFrames.d.ts +6 -40
- package/dist/sync/commitFrames.js +6 -97
- package/dist/sync/contextPorts.d.ts +18 -0
- package/dist/sync/contextPorts.js +31 -0
- package/dist/sync/createClaimStream.d.ts +5 -49
- package/dist/sync/createClaimStream.js +5 -469
- package/dist/sync/createPresenceStream.d.ts +26 -4
- package/dist/sync/createPresenceStream.js +28 -20
- package/dist/sync/createSnapshot.d.ts +2 -2
- package/dist/sync/createSnapshot.js +1 -1
- package/dist/sync/credentialLifecycle.d.ts +5 -173
- package/dist/sync/credentialLifecycle.js +5 -320
- package/dist/sync/deltaPipeline.d.ts +1 -1
- package/dist/sync/participants.d.ts +5 -4
- package/dist/sync/participants.js +29 -22
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +21 -32
- package/dist/sync/schemas.js +26 -17
- package/dist/sync/syncPlan.d.ts +3 -3
- package/dist/sync/wsFrameHandlers.d.ts +6 -114
- package/dist/sync/wsFrameHandlers.js +6 -392
- package/dist/testing/fixtures/bootstrap.d.ts +1 -1
- package/dist/testing/fixtures/deltas.d.ts +1 -1
- package/dist/testing/fixtures/httpResponses.d.ts +70 -0
- package/dist/testing/fixtures/httpResponses.js +90 -0
- package/dist/testing/fixtures/models.js +1 -1
- package/dist/testing/helpers/wait.js +1 -1
- package/dist/testing/mocks/MockMutationExecutor.d.ts +2 -2
- package/dist/testing/mocks/MockMutationExecutor.js +8 -14
- package/dist/testing/mocks/MockSyncContext.d.ts +11 -11
- package/dist/testing/mocks/MockSyncContext.js +10 -9
- package/dist/testing/mocks/MockSyncStore.js +1 -1
- package/dist/testing/mocks/MockWebSocket.d.ts +2 -2
- package/dist/transaction/ablo.d.ts +88 -0
- package/dist/transaction/ablo.js +33 -0
- package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
- package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
- package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
- package/dist/transaction/auth/bootstrapScope.js +1 -0
- package/dist/transaction/auth/capability.d.ts +177 -0
- package/dist/transaction/auth/capability.js +199 -0
- package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
- package/dist/{client → transaction/auth}/identity.d.ts +8 -7
- package/dist/{client → transaction/auth}/identity.js +1 -1
- package/dist/transaction/auth/index.d.ts +162 -0
- package/dist/transaction/auth/index.js +304 -0
- package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
- package/dist/{auth → transaction/auth}/schemas.js +13 -13
- package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
- package/dist/{client → transaction/auth}/sessionMint.js +4 -7
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +49 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +112 -0
- package/dist/transaction/coordination/claimMeta.d.ts +49 -0
- package/dist/transaction/coordination/claimMeta.js +52 -0
- package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
- package/dist/transaction/coordination/createClaimStream.js +475 -0
- package/dist/transaction/coordination/events.d.ts +74 -0
- package/dist/transaction/coordination/events.js +7 -0
- package/dist/transaction/coordination/index.d.ts +19 -0
- package/dist/transaction/coordination/index.js +44 -0
- package/dist/transaction/coordination/locator.d.ts +83 -0
- package/dist/transaction/coordination/locator.js +82 -0
- package/dist/transaction/coordination/schema.d.ts +1473 -0
- package/dist/{coordination → transaction/coordination}/schema.js +490 -55
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +103 -0
- package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
- package/dist/{coordination → transaction/coordination}/trace.js +18 -25
- package/dist/transaction/durableWrites.d.ts +62 -0
- package/dist/{client → transaction}/durableWrites.js +28 -3
- package/dist/transaction/environment.d.ts +105 -0
- package/dist/transaction/environment.js +108 -0
- package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +11 -11
- package/dist/{errorCodes.js → transaction/errorCodes.js} +35 -12
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/index.d.ts +20 -0
- package/dist/transaction/index.js +20 -0
- package/dist/transaction/keys/index.d.ts +87 -0
- package/dist/transaction/keys/index.js +207 -0
- package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
- package/dist/transaction/log/syncDeltaRow.js +95 -0
- package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
- package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
- package/dist/transaction/logger.d.ts +16 -0
- package/dist/transaction/logger.js +7 -0
- package/dist/transaction/observability.d.ts +53 -0
- package/dist/transaction/observability.js +19 -0
- package/dist/transaction/plugin.d.ts +192 -0
- package/dist/transaction/plugin.js +87 -0
- package/dist/{policy → transaction/policy}/types.d.ts +3 -3
- package/dist/{policy → transaction/policy}/types.js +2 -0
- package/dist/transaction/resources/httpResources.d.ts +266 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +319 -0
- package/dist/transaction/resources/modelOperations.js +12 -0
- package/dist/transaction/resources/mutationOptions.d.ts +66 -0
- package/dist/transaction/resources/mutationOptions.js +9 -0
- package/dist/transaction/resources/where.d.ts +85 -0
- package/dist/transaction/resources/where.js +70 -0
- package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
- package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
- package/dist/{schema → transaction/schema}/field.d.ts +5 -5
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/loadStrategy.d.ts +45 -0
- package/dist/transaction/schema/loadStrategy.js +46 -0
- package/dist/{schema → transaction/schema}/model.d.ts +50 -35
- package/dist/{schema → transaction/schema}/model.js +30 -20
- package/dist/transaction/schema/openapi.d.ts +57 -0
- package/dist/transaction/schema/openapi.js +340 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +14 -14
- package/dist/{schema → transaction/schema}/relation.js +7 -7
- package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
- package/dist/{schema → transaction/schema}/residency.js +0 -5
- package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
- package/dist/{schema → transaction/schema}/roles.js +5 -5
- package/dist/{schema → transaction/schema}/schema.d.ts +12 -10
- package/dist/{schema → transaction/schema}/schema.js +4 -3
- package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
- package/dist/{schema → transaction/schema}/tenancy.js +7 -4
- package/dist/transaction/transactionLayer.d.ts +82 -0
- package/dist/transaction/transactionLayer.js +24 -0
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +4 -5
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
- package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +10 -36
- package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
- package/dist/transaction/transport/commitFrames.d.ts +90 -0
- package/dist/transaction/transport/commitFrames.js +134 -0
- package/dist/transaction/transport/connectionManager.d.ts +215 -0
- package/dist/transaction/transport/connectionManager.js +673 -0
- package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
- package/dist/transaction/transport/credentialLifecycle.js +324 -0
- package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
- package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
- package/dist/{client → transaction/transport}/httpClient.d.ts +59 -16
- package/dist/{client → transaction/transport}/httpClient.js +5 -5
- package/dist/transaction/transport/httpOptions.d.ts +33 -0
- package/dist/transaction/transport/httpOptions.js +12 -0
- package/dist/{client → transaction/transport}/httpTransport.js +171 -85
- package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
- package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
- package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
- package/dist/transaction/transport/wsFrameHandlers.js +429 -0
- package/dist/transaction/transport/wsTransport.d.ts +576 -0
- package/dist/transaction/transport/wsTransport.js +1017 -0
- package/dist/transaction/types/assertExact.d.ts +17 -0
- package/dist/transaction/types/assertExact.js +1 -0
- package/dist/{types → transaction/types}/global.d.ts +17 -2
- package/dist/{types → transaction/types}/global.js +2 -1
- package/dist/{types → transaction/types}/index.d.ts +14 -46
- package/dist/{types → transaction/types}/index.js +7 -16
- package/dist/{types → transaction/types}/streams.d.ts +63 -45
- package/dist/{utils → transaction/utils}/json.d.ts +18 -0
- package/dist/transaction/utils/json.js +276 -0
- package/dist/transaction/wire/accountResponses.d.ts +351 -0
- package/dist/transaction/wire/accountResponses.js +255 -0
- package/dist/transaction/wire/auth.d.ts +49 -0
- package/dist/transaction/wire/auth.js +57 -0
- package/dist/transaction/wire/claimEvent.d.ts +76 -0
- package/dist/transaction/wire/claimEvent.js +73 -0
- package/dist/transaction/wire/claims.d.ts +463 -0
- package/dist/transaction/wire/claims.js +229 -0
- package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
- package/dist/{wire → transaction/wire}/commit.js +68 -47
- package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
- package/dist/{wire → transaction/wire}/delta.js +37 -13
- package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
- package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
- package/dist/transaction/wire/feedCursor.d.ts +60 -0
- package/dist/transaction/wire/feedCursor.js +82 -0
- package/dist/transaction/wire/feedEvent.d.ts +177 -0
- package/dist/transaction/wire/feedEvent.js +39 -0
- package/dist/transaction/wire/frames.d.ts +194 -0
- package/dist/transaction/wire/frames.js +50 -0
- package/dist/transaction/wire/inboundFrames.d.ts +552 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +50 -0
- package/dist/transaction/wire/index.js +74 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +79 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +110 -59
- package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
- package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
- package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
- package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
- package/dist/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/transactions/mutations/commitLatency.js +130 -0
- package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
- package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
- package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +16 -15
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +12 -12
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +11 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +7 -7
- package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
- package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +3 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +4 -3
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/webhooks/events.d.ts +2 -2
- package/dist/wire/index.d.ts +1 -34
- package/dist/wire/index.js +8 -49
- package/docs/agent-messaging.md +3 -3
- package/docs/agents.md +19 -12
- package/docs/api-keys.md +8 -4
- package/docs/api.md +22 -18
- package/docs/audit.md +2 -0
- package/docs/cli.md +31 -3
- package/docs/client-behavior.md +8 -6
- package/docs/concurrency-convention.md +30 -24
- package/docs/coordination.md +48 -38
- package/docs/data-sources.md +3 -1
- package/docs/debugging.md +5 -3
- package/docs/deployment.md +267 -0
- package/docs/examples/agent-human.md +49 -42
- package/docs/examples/ai-sdk-tool.md +69 -44
- package/docs/examples/existing-python-backend.md +8 -6
- package/docs/examples/nextjs.md +129 -47
- package/docs/examples/scoped-agent.md +45 -44
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +32 -29
- package/docs/guarantees.md +4 -2
- package/docs/how-it-works.md +9 -7
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +58 -54
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +17 -16
- package/docs/interaction-model.md +6 -4
- package/docs/mcp.md +41 -16
- package/docs/migration.md +63 -5
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +2 -0
- package/docs/quickstart.md +22 -5
- package/docs/react.md +12 -10
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +3 -1
- package/docs/webhooks.md +3 -1
- package/llms.txt +47 -17
- package/package.json +10 -8
- package/dist/agent/Agent.d.ts +0 -366
- package/dist/agent/Agent.js +0 -514
- package/dist/agent/index.d.ts +0 -115
- package/dist/agent/index.js +0 -128
- package/dist/agent/session.d.ts +0 -93
- package/dist/agent/session.js +0 -149
- package/dist/agent/types.d.ts +0 -68
- package/dist/agent/types.js +0 -9
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- package/dist/transactions/durableWriteStore.js +0 -30
- package/dist/utils/json.js +0 -88
- package/dist/wire/errorEnvelope.d.ts +0 -55
- package/dist/wire/frames.d.ts +0 -197
- package/dist/wire/frames.js +0 -49
- package/dist/wire/listEnvelope.js +0 -18
- /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
- /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +0 -0
- /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +0 -0
- /package/dist/{client → transaction}/persistence.d.ts +0 -0
- /package/dist/{client → transaction}/persistence.js +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
- /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.js +0 -0
- /package/dist/{types → transaction/types}/participant.d.ts +0 -0
- /package/dist/{types → transaction/types}/participant.js +0 -0
- /package/dist/{types → transaction/types}/streams.js +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
- /package/dist/{utils → transaction/utils}/duration.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/duration.js +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
- /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocol.js +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
- /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
- /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
- /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { syncGroupInputSchema } from '../schema/roles.js';
|
|
3
3
|
/**
|
|
4
|
-
* The wire schemas for coordination — the shapes that keep
|
|
4
|
+
* The wire schemas for coordination — the shapes that keep agents and people
|
|
5
5
|
* from overwriting each other on a shared row. Coordination works in three
|
|
6
6
|
* layers, from outermost to innermost:
|
|
7
7
|
*
|
|
@@ -19,7 +19,7 @@ import { syncGroupInputSchema } from '../schema/roles.js';
|
|
|
19
19
|
// ─────────────────────────────────────────────────────────────────────────
|
|
20
20
|
// Shared primitives
|
|
21
21
|
// ─────────────────────────────────────────────────────────────────────────
|
|
22
|
-
/** A line/column span within a text-bearing field (
|
|
22
|
+
/** A line/column span within a text-bearing field (section body, doc, cell). */
|
|
23
23
|
export const targetRangeSchema = z.object({
|
|
24
24
|
startLine: z.number(),
|
|
25
25
|
endLine: z.number(),
|
|
@@ -27,6 +27,8 @@ export const targetRangeSchema = z.object({
|
|
|
27
27
|
endColumn: z.number().optional(),
|
|
28
28
|
});
|
|
29
29
|
export const participantKindSchema = z.enum(['user', 'agent', 'system']);
|
|
30
|
+
const _participantKindContract = true;
|
|
31
|
+
void _participantKindContract;
|
|
30
32
|
/**
|
|
31
33
|
* Parses a participant kind from an inbound frame, tolerating an older wire
|
|
32
34
|
* dialect. Some presence and claim frames label a non-agent participant
|
|
@@ -54,9 +56,43 @@ export function participantKindFromWire(wireKind, isAgent) {
|
|
|
54
56
|
* opaque `meta.description`. This is the single place that unpacks that field.
|
|
55
57
|
* A caller that has an explicit `description` should prefer it
|
|
56
58
|
* (`explicit ?? fromMeta`).
|
|
59
|
+
*
|
|
60
|
+
* The parameter is `unknown` because that is the honest requirement: this reads
|
|
61
|
+
* one optional string off a value it does not own. Demanding the wire's open
|
|
62
|
+
* record instead forced every caller holding a claim's *declared* `meta` — the
|
|
63
|
+
* shape registered on `Register`'s `ClaimMeta` slot — through a conversion to
|
|
64
|
+
* ask a question that never needed one.
|
|
57
65
|
*/
|
|
58
66
|
export function descriptionFromMeta(meta) {
|
|
59
|
-
|
|
67
|
+
if (typeof meta !== 'object' || meta === null)
|
|
68
|
+
return undefined;
|
|
69
|
+
if (!('description' in meta))
|
|
70
|
+
return undefined;
|
|
71
|
+
const { description } = meta;
|
|
72
|
+
return typeof description === 'string' ? description : undefined;
|
|
73
|
+
}
|
|
74
|
+
/** The default a claim carries when its holder describes no work. */
|
|
75
|
+
export const DEFAULT_CLAIM_DESCRIPTION = 'editing';
|
|
76
|
+
/**
|
|
77
|
+
* Resolves the peer-visible description of a claim from the places a caller may
|
|
78
|
+
* have put it, falling back to a plain default.
|
|
79
|
+
*
|
|
80
|
+
* `reason` was this field's name before it was renamed, and the rename shipped
|
|
81
|
+
* without leaving anything behind — so the wire kept accepting both spellings
|
|
82
|
+
* while the SDK type quietly offered only one, and two branches "fixed" the
|
|
83
|
+
* gap in opposite directions without either being contradicted by a compiler.
|
|
84
|
+
* The precedence is declared once, here, and both the client and the server
|
|
85
|
+
* read it from this function rather than each spelling out the same `??` chain.
|
|
86
|
+
*
|
|
87
|
+
* A caller whose default differs — a claim taken around a `create` describes
|
|
88
|
+
* itself as `'creating'` — passes that word as `fallback`; the precedence above
|
|
89
|
+
* it stays this function's.
|
|
90
|
+
*/
|
|
91
|
+
export function claimDescription(source, fallback = DEFAULT_CLAIM_DESCRIPTION) {
|
|
92
|
+
return (source.description ??
|
|
93
|
+
descriptionFromMeta(source.meta) ??
|
|
94
|
+
source.reason ??
|
|
95
|
+
fallback);
|
|
60
96
|
}
|
|
61
97
|
/**
|
|
62
98
|
* What a coordination event points at — the locator shared by all three
|
|
@@ -69,8 +105,34 @@ export const targetRefSchema = z.object({
|
|
|
69
105
|
path: z.string().optional(),
|
|
70
106
|
range: targetRangeSchema.optional(),
|
|
71
107
|
field: z.string().optional(),
|
|
108
|
+
/**
|
|
109
|
+
* Several named parts of one row, claimed together — three sections of a
|
|
110
|
+
* document, two cells of a table.
|
|
111
|
+
*
|
|
112
|
+
* This exists because there was no way to say it. A caller who needed it
|
|
113
|
+
* packed the set into `field` as one delimited string, and the conflict rule
|
|
114
|
+
* compares `field` for equality: `blocks:b_1` and `blocks:b_1,b_2` read as
|
|
115
|
+
* unrelated targets, so both writers were granted a lease on `b_1` and one
|
|
116
|
+
* of their updates was lost with nothing raised. A set compares as a set —
|
|
117
|
+
* overlapping sets conflict, disjoint sets do not.
|
|
118
|
+
*
|
|
119
|
+
* `field` remains for the single-field case and is read as a set of one, so
|
|
120
|
+
* a claim naming `field` and a claim naming `fields` still compare correctly
|
|
121
|
+
* against each other.
|
|
122
|
+
*/
|
|
123
|
+
fields: z.array(z.string()).readonly().optional(),
|
|
72
124
|
meta: z.record(z.string(), z.unknown()).optional(),
|
|
73
125
|
});
|
|
126
|
+
/**
|
|
127
|
+
* The same locator in the spelling the wait line and the claim handle use —
|
|
128
|
+
* `{ type, id }` for the entity, the sub-entity half unchanged. It is a
|
|
129
|
+
* projection of {@link targetRefSchema} rather than a second declaration, so a
|
|
130
|
+
* member added to the locator reaches the wait line without anyone editing it;
|
|
131
|
+
* a hand-written copy here is how `fields` came to be missing from queue frames.
|
|
132
|
+
*/
|
|
133
|
+
const streamTargetSchema = targetRefSchema
|
|
134
|
+
.omit({ entityType: true, entityId: true })
|
|
135
|
+
.extend({ type: z.string(), id: z.string() });
|
|
74
136
|
// ─────────────────────────────────────────────────────────────────────────
|
|
75
137
|
// Layer 3 — optimistic stale-context (the write guard)
|
|
76
138
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -143,8 +205,8 @@ export const staleNotificationSchema = z.object({
|
|
|
143
205
|
id: z.string(),
|
|
144
206
|
}),
|
|
145
207
|
/**
|
|
146
|
-
* Set when this notification is for a GROUP
|
|
147
|
-
* `
|
|
208
|
+
* Set when this notification is for a GROUP premise (e.g. `report:abc`,
|
|
209
|
+
* `section:s1`) rather than a single row — "something in the group you read
|
|
148
210
|
* changed." For a group notification `conflictingFields`/`currentValues` are
|
|
149
211
|
* empty (the change could span many rows); re-read the group at
|
|
150
212
|
* `observedSyncId` to reconcile. Absent ⇒ a row-scoped notification.
|
|
@@ -152,18 +214,18 @@ export const staleNotificationSchema = z.object({
|
|
|
152
214
|
group: z.string().optional(),
|
|
153
215
|
});
|
|
154
216
|
/**
|
|
155
|
-
*
|
|
156
|
-
* anything I looked at change?" — broader than the
|
|
157
|
-
* only validates the rows being written. The server
|
|
158
|
-
* against each
|
|
159
|
-
* `onStale` disposition (default `reject`) across the whole
|
|
160
|
-
* holds every write and notifies, `reject` aborts, `overwrite`
|
|
161
|
-
* silently).
|
|
217
|
+
* One entry in a commit's batch premise — a read it was based on, so the
|
|
218
|
+
* server can ask "did anything I looked at change?" — broader than the
|
|
219
|
+
* write-target check, which only validates the rows being written. The server
|
|
220
|
+
* re-runs stale detection against each entry at its `readAt`; a moved premise
|
|
221
|
+
* fires the entry's `onStale` disposition (default `reject`) across the whole
|
|
222
|
+
* batch (`notify` holds every write and notifies, `reject` aborts, `overwrite`
|
|
223
|
+
* proceeds silently). An entry comes at one of two granularities:
|
|
162
224
|
*
|
|
163
225
|
* • Row — `{ model, id, readAt, fields? }`: did this specific row, or these
|
|
164
226
|
* specific fields, change?
|
|
165
227
|
* • Group — `{ group, readAt }`: did anything in this sync group change?
|
|
166
|
-
* `group` is a sync-group key such as `
|
|
228
|
+
* `group` is a sync-group key such as `report:abc` or `section:s1`, the
|
|
167
229
|
* same unit a participant watches and claims.
|
|
168
230
|
*
|
|
169
231
|
* See `packages/sync-engine/docs/concurrency-convention.md` (§4) for the
|
|
@@ -174,7 +236,7 @@ export const readDependencySchema = z.union([
|
|
|
174
236
|
model: z.string(),
|
|
175
237
|
id: z.string(),
|
|
176
238
|
readAt: z.number(),
|
|
177
|
-
fields: z.array(z.string()).optional(),
|
|
239
|
+
fields: z.array(z.string()).readonly().optional(),
|
|
178
240
|
onStale: onStaleModeSchema.optional(),
|
|
179
241
|
}),
|
|
180
242
|
z.object({
|
|
@@ -184,15 +246,16 @@ export const readDependencySchema = z.union([
|
|
|
184
246
|
}),
|
|
185
247
|
]);
|
|
186
248
|
/**
|
|
187
|
-
* A durable
|
|
249
|
+
* A durable premise — what a participant is watching so that a later
|
|
188
250
|
* change to it opens a {@link StaleNotification}. It is the persisted sibling of
|
|
189
251
|
* a {@link ReadDependency}: the same reference shape, minus the disposition (a
|
|
190
252
|
* track always notifies — that is what tracking is), with an optional `readAt`
|
|
191
253
|
* that defaults to the watermark of the commit that registered it. The row form
|
|
192
254
|
* watches one object; the group form watches a whole sync group ("anything in
|
|
193
|
-
* `
|
|
194
|
-
* a `TrackDependency` is kept and re-checked against every future
|
|
195
|
-
* `packages/sync-engine/docs/groups.md` for how it drives change
|
|
255
|
+
* `report:abc`"). Where a `ReadDependency` is checked once at commit and
|
|
256
|
+
* discarded, a `TrackDependency` is kept and re-checked against every future
|
|
257
|
+
* delta. See `packages/sync-engine/docs/groups.md` for how it drives change
|
|
258
|
+
* propagation.
|
|
196
259
|
*/
|
|
197
260
|
export const trackDependencySchema = z.union([
|
|
198
261
|
z.object({
|
|
@@ -214,12 +277,37 @@ export const trackDependencySchema = z.union([
|
|
|
214
277
|
* and emits one terminal frame — `committed`, `canceled`, or `expired` — as the
|
|
215
278
|
* claim ends, so contenders learn how it resolved, not merely that it vanished.
|
|
216
279
|
*/
|
|
217
|
-
export const
|
|
280
|
+
export const wireClaimStatusSchema = z.enum([
|
|
218
281
|
'active',
|
|
219
282
|
'committed',
|
|
220
283
|
'expired',
|
|
221
284
|
'canceled',
|
|
222
285
|
]);
|
|
286
|
+
/**
|
|
287
|
+
* Every lifecycle state of a claim, as a caller sees it.
|
|
288
|
+
*
|
|
289
|
+
* `active` is the current holder — the lock itself. `queued` is waiting in line
|
|
290
|
+
* behind the holder and carries an advisory `position`. The rest are terminal
|
|
291
|
+
* and drop the claim from the synced set.
|
|
292
|
+
*
|
|
293
|
+
* Distinct from {@link wireClaimStatusSchema}, which never carries `queued`
|
|
294
|
+
* because the wire frame for a waiter is a different message. This is the one a
|
|
295
|
+
* published contract describes, so it is a schema rather than a bare TS union —
|
|
296
|
+
* a union cannot be derived into the API reference.
|
|
297
|
+
*/
|
|
298
|
+
export const publicClaimStatusSchema = z.enum([
|
|
299
|
+
'active',
|
|
300
|
+
'queued',
|
|
301
|
+
'committed',
|
|
302
|
+
'expired',
|
|
303
|
+
'canceled',
|
|
304
|
+
]);
|
|
305
|
+
/**
|
|
306
|
+
* @deprecated Renamed to {@link wireClaimStatusSchema} — this is the wire enum,
|
|
307
|
+
* which never carries `'queued'`; the five-state public status lives in
|
|
308
|
+
* types/streams. Removed in 0.36.0.
|
|
309
|
+
*/
|
|
310
|
+
export const claimStatusSchema = wireClaimStatusSchema;
|
|
223
311
|
/**
|
|
224
312
|
* Server-owned grant stamps — minted once when a claim is first granted and
|
|
225
313
|
* preserved verbatim across a re-announce of the same `claimId`, so neither a
|
|
@@ -242,7 +330,18 @@ const grantStampFields = {
|
|
|
242
330
|
*/
|
|
243
331
|
acquiredAt: z.number().optional(),
|
|
244
332
|
};
|
|
245
|
-
|
|
333
|
+
/**
|
|
334
|
+
* A holder as the participant blocked behind them sees it: who has the row,
|
|
335
|
+
* what they said they are doing, and until when.
|
|
336
|
+
*
|
|
337
|
+
* This is the smaller half of a claim, so it is declared first and the full
|
|
338
|
+
* claim extends it — the waiter's view cannot omit a member the holder's view
|
|
339
|
+
* has, because there is nowhere for it to be omitted. Listing what to keep was
|
|
340
|
+
* the bug: this named `field` and not `path`, `range`, or `fields`, so a waiter
|
|
341
|
+
* could see that a row was held but never which part of it, and every locator
|
|
342
|
+
* member added later would have been missing here too.
|
|
343
|
+
*/
|
|
344
|
+
export const wireClaimSummarySchema = targetRefSchema.extend({
|
|
246
345
|
claimId: z.string(),
|
|
247
346
|
/**
|
|
248
347
|
* Peer-visible description of the work being done (`'rewriting the risk
|
|
@@ -254,18 +353,30 @@ const wireClaimBaseSchema = targetRefSchema.extend({
|
|
|
254
353
|
declaredAt: z.number(),
|
|
255
354
|
/** Server-computed TTL deadline (epoch ms). Readers treat as advisory. */
|
|
256
355
|
expiresAt: z.number(),
|
|
257
|
-
|
|
258
|
-
|
|
356
|
+
/**
|
|
357
|
+
* On whose authority the holder acts, and under which grant — stamped by the
|
|
358
|
+
* server off the connection's credential, never accepted from the frame. The
|
|
359
|
+
* same three fields the delta this claim produces will record, so "who is
|
|
360
|
+
* doing this" and "who did this" answer in one vocabulary.
|
|
361
|
+
*
|
|
362
|
+
* On the summary rather than the full claim because this is precisely what a
|
|
363
|
+
* blocked waiter needs: yielding to a colleague and queuing behind another
|
|
364
|
+
* customer's agent are different decisions.
|
|
365
|
+
*
|
|
366
|
+
* All three optional and additive — an older server omits them, which is a
|
|
367
|
+
* different fact from a holder that has no delegator.
|
|
368
|
+
*/
|
|
369
|
+
onBehalfOfId: z.string().nullish(),
|
|
370
|
+
onBehalfOfKind: wireParticipantKindSchema.nullish(),
|
|
371
|
+
capabilityId: z.string().nullish(),
|
|
259
372
|
});
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
field: true,
|
|
268
|
-
meta: true,
|
|
373
|
+
/**
|
|
374
|
+
* The full claim as its holder's own frames carry it — the waiter's view plus
|
|
375
|
+
* the lifecycle and grant stamps that belong to the holding itself.
|
|
376
|
+
*/
|
|
377
|
+
const wireClaimBaseSchema = wireClaimSummarySchema.extend({
|
|
378
|
+
status: wireClaimStatusSchema.optional(),
|
|
379
|
+
...grantStampFields,
|
|
269
380
|
});
|
|
270
381
|
/** Why a claim ended in a non-success terminal state. */
|
|
271
382
|
export const claimErrorSchema = z.object({
|
|
@@ -296,6 +407,14 @@ export const claimRejectionSchema = z.object({
|
|
|
296
407
|
reason: z.string(),
|
|
297
408
|
target: targetRefSchema.optional(),
|
|
298
409
|
heldBy: z.string().optional(),
|
|
410
|
+
/**
|
|
411
|
+
* Whether the holder blocking this claim is a person, an agent, or the
|
|
412
|
+
* system. The server already derives this from the holder's id when it
|
|
413
|
+
* builds the conflict; carrying it means a caller can decide how to respond
|
|
414
|
+
* — yield to a person, queue behind an agent — without parsing an opaque id
|
|
415
|
+
* for a prefix and guessing. Additive: an older server omits it.
|
|
416
|
+
*/
|
|
417
|
+
heldByKind: wireParticipantKindSchema.optional(),
|
|
299
418
|
heldByClaimId: z.string().optional(),
|
|
300
419
|
heldByExpiresAt: z.number().optional(),
|
|
301
420
|
heldByClaim: wireClaimSummarySchema.optional(),
|
|
@@ -312,6 +431,120 @@ export const claimLostSchema = z.object({
|
|
|
312
431
|
reason: z.enum(['expired', 'preempted']),
|
|
313
432
|
target: targetRefSchema,
|
|
314
433
|
});
|
|
434
|
+
/**
|
|
435
|
+
* The lease is ours without waiting — the target was free when the claim
|
|
436
|
+
* arrived. `fenceToken` is present whenever the coordinator minted one, and a
|
|
437
|
+
* write carries it back so a lapsed lease cannot apply late.
|
|
438
|
+
*/
|
|
439
|
+
export const claimAcquiredSchema = z.object({
|
|
440
|
+
claimId: z.string(),
|
|
441
|
+
fenceToken: z.number().optional(),
|
|
442
|
+
target: targetRefSchema,
|
|
443
|
+
});
|
|
444
|
+
/**
|
|
445
|
+
* A queued claim reached the head of the line and the lease is now ours. The
|
|
446
|
+
* shape matches {@link claimAcquiredSchema} exactly — the two frames differ
|
|
447
|
+
* only in whether the caller waited — but they stay separate declarations
|
|
448
|
+
* because they are separate wire contracts, and collapsing them would let a
|
|
449
|
+
* change to one silently redefine the other.
|
|
450
|
+
*/
|
|
451
|
+
export const claimGrantedSchema = z.object({
|
|
452
|
+
claimId: z.string(),
|
|
453
|
+
fenceToken: z.number().optional(),
|
|
454
|
+
target: targetRefSchema,
|
|
455
|
+
});
|
|
456
|
+
/**
|
|
457
|
+
* Our claim is waiting in line behind a live holder — the same conflict
|
|
458
|
+
* {@link claimRejectionSchema} reports, delivered as a wait rather than a
|
|
459
|
+
* refusal, plus the caller's `position`.
|
|
460
|
+
*
|
|
461
|
+
* `reason` is the one member that does not carry over as required. A refusal
|
|
462
|
+
* states why it refused; a wait has only ever named the conflict through
|
|
463
|
+
* `heldBy`/`heldByClaim`, and no server has ever stamped `reason` on this
|
|
464
|
+
* frame. Requiring it here — inherited silently by extending the rejection
|
|
465
|
+
* schema — made the parse boundary reject every genuine `claim_queued` as
|
|
466
|
+
* malformed the moment frame validation went in. Optional is what the wire
|
|
467
|
+
* actually is, and it stays derived from the rejection field so the two cannot
|
|
468
|
+
* describe the value differently.
|
|
469
|
+
*
|
|
470
|
+
* `position` is advisory: a privileged reorder can move it up, so a caller
|
|
471
|
+
* that asserts monotonic position will fail in production. Only the arrival of
|
|
472
|
+
* a grant is authoritative.
|
|
473
|
+
*/
|
|
474
|
+
export const claimQueuedSchema = claimRejectionSchema.extend({
|
|
475
|
+
position: z.number(),
|
|
476
|
+
reason: claimRejectionSchema.shape.reason.optional(),
|
|
477
|
+
});
|
|
478
|
+
/**
|
|
479
|
+
* One entry in a wait-line snapshot.
|
|
480
|
+
*
|
|
481
|
+
* NOTE — this is the third spelling of a target locator on the wire: here it is
|
|
482
|
+
* `{ type, id }`, the HTTP claim DTO uses `{ model, id }`
|
|
483
|
+
* ({@link modelTargetSchema}), and the claim frames use
|
|
484
|
+
* `{ entityType, entityId }` ({@link targetRefSchema}). The schema describes
|
|
485
|
+
* what the server sends today rather than what it should send; unifying the
|
|
486
|
+
* three is a coordinated protocol change scheduled behind the protocol version.
|
|
487
|
+
* Until it happens, the translation between the spellings lives in one place —
|
|
488
|
+
* `wireTarget`, `modelTarget` and `streamTarget` in ./locator.ts — so no hop
|
|
489
|
+
* gets to invent a fourth.
|
|
490
|
+
*/
|
|
491
|
+
export const claimQueueEntrySchema = z.object({
|
|
492
|
+
object: z.literal('claim'),
|
|
493
|
+
id: z.string(),
|
|
494
|
+
status: z.literal('queued'),
|
|
495
|
+
target: streamTargetSchema,
|
|
496
|
+
/**
|
|
497
|
+
* Peer-visible description of the work. A claim may be declared without one,
|
|
498
|
+
* and the public `Claim` promises the field is always there — so the default
|
|
499
|
+
* lives here, applied as the frame is decoded, rather than being restated by
|
|
500
|
+
* each reader.
|
|
501
|
+
*/
|
|
502
|
+
description: z.string().default('editing'),
|
|
503
|
+
heldBy: z.string().optional(),
|
|
504
|
+
participantKind: wireParticipantKindSchema.optional(),
|
|
505
|
+
position: z.number(),
|
|
506
|
+
expiresAt: z.number(),
|
|
507
|
+
});
|
|
508
|
+
/**
|
|
509
|
+
* The whole wait line for one row, rebroadcast to that row's peers on every
|
|
510
|
+
* queue mutation. This is what backs the reactive
|
|
511
|
+
* `ablo.<model>.claim.queue({ id })` read, which is why it carries the full
|
|
512
|
+
* line rather than a delta against it.
|
|
513
|
+
*/
|
|
514
|
+
export const claimQueueSchema = z.object({
|
|
515
|
+
target: streamTargetSchema.pick({ type: true, id: true }),
|
|
516
|
+
queue: z.array(claimQueueEntrySchema),
|
|
517
|
+
});
|
|
518
|
+
/**
|
|
519
|
+
* A held claim's TTL lapsed server-side. The claim is already inactive by the
|
|
520
|
+
* time this arrives, so a consumer either re-claims with a fresh credential or
|
|
521
|
+
* accepts the drop; there is nothing to release.
|
|
522
|
+
*/
|
|
523
|
+
export const claimExpiredSchema = z.object({
|
|
524
|
+
claimId: z.string(),
|
|
525
|
+
});
|
|
526
|
+
/**
|
|
527
|
+
* Why a claim ended without its holder releasing it, or was refused.
|
|
528
|
+
*
|
|
529
|
+
* A closed set, because the two refusals are different guarantees and a reader
|
|
530
|
+
* has to be able to tell them apart: `conflict` means someone holds the row
|
|
531
|
+
* right now and you may queue behind them, while `coordination_unavailable`
|
|
532
|
+
* means the coordinator could not answer, so nothing is known about the row.
|
|
533
|
+
* `expired` and `preempted` are the two ways a lease you held ends.
|
|
534
|
+
*
|
|
535
|
+
* The rejection frame's `reason` stays a plain string on the wire — it is
|
|
536
|
+
* frozen, and an older server may send a word not listed here. This is the
|
|
537
|
+
* reader's side of it: a value that parses becomes the typed reason, and one
|
|
538
|
+
* that does not is simply absent rather than smuggled through as prose.
|
|
539
|
+
* {@link claimExpiredSchema} and {@link claimLostSchema} already spelled their
|
|
540
|
+
* reasons as enums; this brings the refusals into line.
|
|
541
|
+
*/
|
|
542
|
+
export const claimEventReasonSchema = z.enum([
|
|
543
|
+
'conflict',
|
|
544
|
+
'coordination_unavailable',
|
|
545
|
+
'expired',
|
|
546
|
+
'preempted',
|
|
547
|
+
]);
|
|
315
548
|
/**
|
|
316
549
|
* What a {@link ModelClaim} points at — the target locator as SDK callers see
|
|
317
550
|
* it, keyed by `model` and `id` rather than the wire schema's `entityType` and
|
|
@@ -324,38 +557,168 @@ export const modelTargetSchema = z
|
|
|
324
557
|
path: z.string().optional(),
|
|
325
558
|
range: targetRangeSchema.optional(),
|
|
326
559
|
field: z.string().optional(),
|
|
560
|
+
/** Several named parts at once — see {@link targetRefSchema}. */
|
|
561
|
+
fields: z.array(z.string()).readonly().optional(),
|
|
327
562
|
meta: z.record(z.string(), z.unknown()).optional(),
|
|
328
563
|
})
|
|
329
564
|
.readonly();
|
|
330
565
|
/**
|
|
331
|
-
*
|
|
332
|
-
* (`ablo.<model>.claim.state`, `/v1/claims`) — the resolved, peer-readable view
|
|
333
|
-
* of one active or queued claim. The client's `ModelClaim` type derives from
|
|
334
|
-
* this shape.
|
|
566
|
+
* The two states a claim can be observed in while it still exists.
|
|
335
567
|
*
|
|
336
|
-
*
|
|
337
|
-
*
|
|
338
|
-
*
|
|
339
|
-
*
|
|
340
|
-
*
|
|
568
|
+
* Derived from {@link publicClaimStatusSchema} rather than spelled again: the
|
|
569
|
+
* other three are terminal and drop the claim from the observable set, so a
|
|
570
|
+
* listing or a peer's view can only ever see these. Extracting them by name
|
|
571
|
+
* means a state added to the public vocabulary is a deliberate decision about
|
|
572
|
+
* whether it is observable, not a silent omission.
|
|
341
573
|
*/
|
|
342
|
-
export const
|
|
343
|
-
|
|
574
|
+
export const heldClaimStatusSchema = publicClaimStatusSchema.extract([
|
|
575
|
+
'active',
|
|
576
|
+
'queued',
|
|
577
|
+
]);
|
|
578
|
+
/**
|
|
579
|
+
* ONE CLAIM — everything true about a lease at a moment: what it points at, who
|
|
580
|
+
* holds it, what they said they are doing, where it stands, and until when.
|
|
581
|
+
*
|
|
582
|
+
* Every caller-facing surface that answers a question about a claim is a
|
|
583
|
+
* PROJECTION of this record, never a second object: {@link modelClaimSchema} is
|
|
584
|
+
* what a peer may see, and `claimStateSchema` (`wire/claims.ts`) is what a
|
|
585
|
+
* caller polls about a claim of its own. Each is pinned to this record, so a
|
|
586
|
+
* field added here either reaches the people it was declared for or fails to
|
|
587
|
+
* compile.
|
|
588
|
+
*
|
|
589
|
+
* Before this, the peer-visible shape was a standalone `z.object` deriving from
|
|
590
|
+
* nothing, and the polling shape was a third. That is why it took reading four
|
|
591
|
+
* files to answer whether a heartbeat's progress reaches an asker — the
|
|
592
|
+
* declaring surface and the observing surface were kept in step by hand, and
|
|
593
|
+
* three of their shared fields had already drifted on how strictly they parse.
|
|
594
|
+
*
|
|
595
|
+
* What this record deliberately does NOT unify is the socket family
|
|
596
|
+
* ({@link wireClaimSchema} and its base). Those carry the same claim under the
|
|
597
|
+
* `entityType`/`entityId` locator rather than `model`/`id`, and they already
|
|
598
|
+
* derive from one another; collapsing the two locator spellings is a wire
|
|
599
|
+
* rename, not a projection.
|
|
600
|
+
*/
|
|
601
|
+
export const claimRecordSchema = z.object({
|
|
602
|
+
/** The claim's identity. Spelled `claimId` where a message names a claim it
|
|
603
|
+
* is not itself, and `id` where the claim is the resource. */
|
|
344
604
|
id: z.string(),
|
|
605
|
+
/** Who holds it. */
|
|
345
606
|
actor: z.string(),
|
|
607
|
+
/** Parsed through {@link wireParticipantKindSchema}, so a legacy `'human'`
|
|
608
|
+
* frame normalizes to `'user'`. */
|
|
346
609
|
participantKind: wireParticipantKindSchema,
|
|
347
|
-
/**
|
|
348
|
-
*
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
610
|
+
/**
|
|
611
|
+
* On whose authority the holder acts — the same three fields, with the same
|
|
612
|
+
* meanings, that `deltaAttributionSchema` records on every delta the claim
|
|
613
|
+
* goes on to produce, and sourced the same way: off the credential the
|
|
614
|
+
* connection authenticated with, never from the caller.
|
|
615
|
+
*
|
|
616
|
+
* A claim that carries only `actor` can say who is doing something and not
|
|
617
|
+
* who asked for it. "What is agent a7f3 doing" is a debugging question;
|
|
618
|
+
* "what is running on behalf of this customer right now" is an operations
|
|
619
|
+
* question, and until these are here it is answerable only in hindsight,
|
|
620
|
+
* against the audit log, after the fact.
|
|
621
|
+
*
|
|
622
|
+
* Null rather than absent when there is genuinely no delegator or no grant —
|
|
623
|
+
* a person acting directly is their own principal, and a session holds no
|
|
624
|
+
* capability.
|
|
625
|
+
*/
|
|
626
|
+
onBehalfOfId: z.string().nullable(),
|
|
627
|
+
onBehalfOfKind: wireParticipantKindSchema.nullable(),
|
|
628
|
+
capabilityId: z.string().nullable(),
|
|
629
|
+
/**
|
|
630
|
+
* What the holder said they are doing (`'rewriting the risk section'`).
|
|
631
|
+
*
|
|
632
|
+
* A caller may declare it as `description`, as the older `reason`, or inside
|
|
633
|
+
* `meta`; {@link claimDescription} resolves those to this one field with a
|
|
634
|
+
* declared precedence, so only one of them is ever a shape.
|
|
635
|
+
*/
|
|
636
|
+
description: z.string(),
|
|
637
|
+
/** Holding the row, or waiting in line for it. */
|
|
638
|
+
status: heldClaimStatusSchema,
|
|
639
|
+
/**
|
|
640
|
+
* Place in the wait line. Advisory: a privileged caller can reorder the
|
|
641
|
+
* queue, so a position can go UP between reads — only `status` is
|
|
642
|
+
* authoritative.
|
|
643
|
+
*/
|
|
644
|
+
position: z.number().int().nonnegative(),
|
|
645
|
+
/**
|
|
646
|
+
* When the lease lapses without a heartbeat, in epoch milliseconds — the same
|
|
647
|
+
* encoding as the WebSocket {@link WireClaim}, so one timestamp
|
|
648
|
+
* representation spans the wire, the SDK, HTTP, and errors. There is no ISO
|
|
649
|
+
* string anywhere.
|
|
650
|
+
*/
|
|
651
|
+
expiresAt: z.number().int(),
|
|
652
|
+
/** The grant's fencing token, minted at acquisition. Present on a claim that
|
|
653
|
+
* is held, never on one that is queued. */
|
|
654
|
+
fenceToken: z.number().int(),
|
|
655
|
+
/** The row, and which part of it. */
|
|
356
656
|
target: modelTargetSchema,
|
|
657
|
+
/**
|
|
658
|
+
* The claim's metadata as an OPEN record — including what the coordinator
|
|
659
|
+
* writes there rather than the holder. A heartbeat's `details` lands here as
|
|
660
|
+
* `progress` (last beat wins), so an asker reads
|
|
661
|
+
* `claim.state({ id })?.meta.progress`. It is presence, not a checkpoint: it
|
|
662
|
+
* dies with the lease.
|
|
663
|
+
*
|
|
664
|
+
* This is the same bag the wire carries; what is new is that it has a home at
|
|
665
|
+
* the CLAIM level. Both projections used to file it under `target` alone, and
|
|
666
|
+
* `target.meta` is typed as the shape the program registered for its own claim
|
|
667
|
+
* metadata — so a server-written key was unreadable there by construction:
|
|
668
|
+
* `target.meta.progress` does not typecheck for any program that declared a
|
|
669
|
+
* shape, and the value was arriving in a slot whose type forbids it.
|
|
670
|
+
*
|
|
671
|
+
* Two views of one field, each typed for its reader: `target.meta` stays the
|
|
672
|
+
* holder's declared shape, and this stays open, because a peer reading someone
|
|
673
|
+
* else's claim has no grounds to assume the writer's declaration.
|
|
674
|
+
*/
|
|
675
|
+
meta: z.record(z.string(), z.unknown()).optional(),
|
|
676
|
+
});
|
|
677
|
+
/**
|
|
678
|
+
* A claim as SDK callers and the HTTP claim routes see it
|
|
679
|
+
* (`ablo.<model>.claim.state`, `GET /v1/claims`) — the resolved, peer-readable
|
|
680
|
+
* view of one active or queued claim. The client's `ModelClaim` type derives
|
|
681
|
+
* from this shape.
|
|
682
|
+
*
|
|
683
|
+
* Everything but the deprecated `field` is projected from
|
|
684
|
+
* {@link claimRecordSchema}. Four members are optional here and required on the
|
|
685
|
+
* record, and the split is the same in each case: the record says what a claim
|
|
686
|
+
* IS, while a peer's view of one may legitimately have been built without them
|
|
687
|
+
* — a queued claim has no `fenceToken`, a held one has no `position`, an older
|
|
688
|
+
* producer sends no `status`, and a claim may be declared with no description.
|
|
689
|
+
*/
|
|
690
|
+
export const modelClaimSchema = claimRecordSchema
|
|
691
|
+
.partial({
|
|
692
|
+
description: true,
|
|
693
|
+
status: true,
|
|
694
|
+
position: true,
|
|
695
|
+
fenceToken: true,
|
|
696
|
+
// Additive: a server that predates the delegation trio omits all three,
|
|
697
|
+
// which is a different fact from a claim that has no delegator (null).
|
|
698
|
+
onBehalfOfId: true,
|
|
699
|
+
onBehalfOfKind: true,
|
|
700
|
+
capabilityId: true,
|
|
701
|
+
})
|
|
702
|
+
.extend({
|
|
703
|
+
/**
|
|
704
|
+
* @deprecated Read `target.field` instead, and `target.fields` for a claim
|
|
705
|
+
* on several parts of the row. Removed in 0.36.0.
|
|
706
|
+
*
|
|
707
|
+
* This says the same thing as `target.field` and nothing keeps the two
|
|
708
|
+
* agreeing, so a producer that sets one and not the other publishes a
|
|
709
|
+
* claim that contradicts itself. It also cannot express a field set at
|
|
710
|
+
* all, which is the reason `target.fields` exists.
|
|
711
|
+
*/
|
|
712
|
+
field: z.string().optional(),
|
|
357
713
|
})
|
|
358
714
|
.readonly();
|
|
715
|
+
/**
|
|
716
|
+
* The peer-visible view covers the record. A field added to a claim is either
|
|
717
|
+
* projected to the people it was declared for, or deliberately dropped by an
|
|
718
|
+
* `.omit` here — never missing because nobody remembered the second object.
|
|
719
|
+
*/
|
|
720
|
+
const _modelClaimCoversRecord = true;
|
|
721
|
+
void _modelClaimCoversRecord;
|
|
359
722
|
/**
|
|
360
723
|
* The `claim_begin` payload a client sends. It carries the descriptive target
|
|
361
724
|
* and a `description` of the work, an optional duration hint, and the opt-in
|
|
@@ -548,19 +911,45 @@ export const commitOperationSchema = writeGuardSchema.extend({
|
|
|
548
911
|
// Layer 1 — presence (observation only; it never enforces)
|
|
549
912
|
// ─────────────────────────────────────────────────────────────────────────
|
|
550
913
|
export const presenceKindSchema = z.enum(['enter', 'update', 'leave']);
|
|
551
|
-
/**
|
|
914
|
+
/**
|
|
915
|
+
* What a participant is actively working on (agents fill this in).
|
|
916
|
+
*
|
|
917
|
+
* The two backpressure fields are part of the frame, not an extension of it:
|
|
918
|
+
* an agent worker announces them on every step, and an orchestrator reading
|
|
919
|
+
* peer activity routes work by them. They are declared here because a reader
|
|
920
|
+
* that validates this frame would otherwise drop them on the floor — the
|
|
921
|
+
* server passes both through without interpreting either.
|
|
922
|
+
*/
|
|
552
923
|
export const presenceActivitySchema = targetRefSchema.extend({
|
|
553
924
|
action: z.string(),
|
|
554
925
|
detail: z.string().optional(),
|
|
926
|
+
/** Backpressure signal in `[0, 1]`: `0` idle, `1` at capacity. */
|
|
927
|
+
loadFactor: z.number().optional(),
|
|
928
|
+
/** Gate for new assignments; absent means yes. */
|
|
929
|
+
acceptingNewWork: z.boolean().optional(),
|
|
555
930
|
});
|
|
556
931
|
/**
|
|
557
932
|
* Full `presence_update` frame as the server broadcasts it. The activity +
|
|
558
933
|
* `activeClaims` are the observation surface for the other two layers —
|
|
559
934
|
* rendered, never acted on as enforcement.
|
|
935
|
+
*
|
|
936
|
+
* Open for the same reason {@link presenceUpdatePayloadSchema} is, and it has to
|
|
937
|
+
* be the same in both directions: whatever vocabulary an application announces
|
|
938
|
+
* through presence, it reads back off its peers' frames. A reader that parsed
|
|
939
|
+
* this strictly would validate the frame and quietly discard the part the
|
|
940
|
+
* application actually came for.
|
|
560
941
|
*/
|
|
561
|
-
export const
|
|
942
|
+
export const presenceUpdateSchema = z.object({
|
|
562
943
|
kind: presenceKindSchema,
|
|
563
|
-
|
|
944
|
+
/**
|
|
945
|
+
* Who the frame is about. Required, because every one of the five sites that
|
|
946
|
+
* builds a presence frame stamps it from the connection's identity — an
|
|
947
|
+
* anonymous presence frame has never been sent and would say nothing. It was
|
|
948
|
+
* optional here for as long as nothing parsed the frame, and the hand-written
|
|
949
|
+
* copy the transport used to carry declared it required; two descriptions of
|
|
950
|
+
* one frame can disagree indefinitely while neither is ever checked.
|
|
951
|
+
*/
|
|
952
|
+
userId: z.string(),
|
|
564
953
|
syncGroups: z.array(z.string()).optional(),
|
|
565
954
|
timestamp: z.number().optional(),
|
|
566
955
|
status: z.string(),
|
|
@@ -575,4 +964,50 @@ export const presenceUpdateFrameSchema = z.object({
|
|
|
575
964
|
participantKind: wireParticipantKindSchema.optional(),
|
|
576
965
|
activeClaims: z.array(wireClaimSchema).optional(),
|
|
577
966
|
delegatedFrom: z.string().nullish(),
|
|
578
|
-
});
|
|
967
|
+
}).catchall(z.unknown());
|
|
968
|
+
/**
|
|
969
|
+
* @deprecated Renamed to {@link presenceUpdateSchema}. Removed in 0.36.0.
|
|
970
|
+
*
|
|
971
|
+
* `Frame` was the only such suffix in this vocabulary: every other frame the
|
|
972
|
+
* server sends is named plainly — {@link claimLostSchema},
|
|
973
|
+
* {@link claimAcquiredSchema}, {@link claimRejectionSchema} — and the client's
|
|
974
|
+
* half carries `Payload`. One name did not follow the rule the other fifteen do.
|
|
975
|
+
*/
|
|
976
|
+
export const presenceUpdateFrameSchema = presenceUpdateSchema;
|
|
977
|
+
/**
|
|
978
|
+
* The `presence_update` payload a client SENDS — deliberately much smaller
|
|
979
|
+
* than the frame the server broadcasts back.
|
|
980
|
+
*
|
|
981
|
+
* Everything that identifies or situates the participant is stamped by the
|
|
982
|
+
* server and cannot be declared here: `userId`, `participantKind`, `isAgent`,
|
|
983
|
+
* `syncGroups`, `timestamp`, `kind`, and `delegatedFrom` all come from the
|
|
984
|
+
* connection's own identity. A client that sends them is not believed — an
|
|
985
|
+
* older SDK once hardcoded `isAgent: true` on every announce, and because the
|
|
986
|
+
* payload was spread into the broadcast unfiltered, every human session
|
|
987
|
+
* rendered to its peers as an agent. Parsing an inbound payload through this
|
|
988
|
+
* schema and broadcasting the *result* is what makes that structurally
|
|
989
|
+
* impossible rather than a rule the broadcast has to remember.
|
|
990
|
+
*
|
|
991
|
+
* `status` is a plain string, matching the outbound frame: the three canonical
|
|
992
|
+
* values are conventions the presence UI understands, not a closed set the
|
|
993
|
+
* protocol enforces.
|
|
994
|
+
*
|
|
995
|
+
* The payload is deliberately OPEN — `catchall` keeps keys this schema does not
|
|
996
|
+
* name. Presence is the one frame an application extends: an agent mesh
|
|
997
|
+
* announces its own coordination vocabulary through it and reads it back off
|
|
998
|
+
* peer frames, without the protocol having to learn each app's words. So the
|
|
999
|
+
* fields named here are validated and typed, and anything else rides along
|
|
1000
|
+
* untouched. Openness is not the same as trust: the server-stamped identity
|
|
1001
|
+
* fields are applied AFTER this payload is spread into the broadcast, so a
|
|
1002
|
+
* client that sends its own `userId` or `isAgent` is overwritten either way.
|
|
1003
|
+
*/
|
|
1004
|
+
export const presenceUpdatePayloadSchema = z
|
|
1005
|
+
.object({
|
|
1006
|
+
status: z.string().optional(),
|
|
1007
|
+
activity: presenceActivitySchema.optional(),
|
|
1008
|
+
/** The sender's own open claims, which replace what the server holds. */
|
|
1009
|
+
activeClaims: z.array(wireClaimSchema).optional(),
|
|
1010
|
+
timezone: z.string().optional(),
|
|
1011
|
+
customStatus: z.string().optional(),
|
|
1012
|
+
})
|
|
1013
|
+
.catchall(z.unknown());
|