@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
|
@@ -1,578 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { syncGroupInputSchema } from '../schema/roles.js';
|
|
3
|
-
/**
|
|
4
|
-
* The wire schemas for coordination — the shapes that keep humans and agents
|
|
5
|
-
* from overwriting each other on a shared row. Coordination works in three
|
|
6
|
-
* layers, from outermost to innermost:
|
|
7
|
-
*
|
|
8
|
-
* 1. Presence (observation): who is working where. It reports, never blocks.
|
|
9
|
-
* 2. Claims (pessimistic leases): `claim_begin` / `claim_abandon` grant one
|
|
10
|
-
* participant exclusive intent on a target while others wait.
|
|
11
|
-
* 3. Stale-context (optimistic): a `readAt` watermark plus an `onStale` write
|
|
12
|
-
* guard that catches a lost update when the row moved after you read it.
|
|
13
|
-
*
|
|
14
|
-
* These Zod schemas are the single definition of each shape. Both the client
|
|
15
|
-
* SDK and the server derive their TypeScript types from them with `z.infer`
|
|
16
|
-
* rather than re-declaring the shapes, and the server validates inbound frames
|
|
17
|
-
* against them at runtime.
|
|
18
|
-
*/
|
|
19
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
20
|
-
// Shared primitives
|
|
21
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
22
|
-
/** A line/column span within a text-bearing field (slide body, doc, cell). */
|
|
23
|
-
export const targetRangeSchema = z.object({
|
|
24
|
-
startLine: z.number(),
|
|
25
|
-
endLine: z.number(),
|
|
26
|
-
startColumn: z.number().optional(),
|
|
27
|
-
endColumn: z.number().optional(),
|
|
28
|
-
});
|
|
29
|
-
export const participantKindSchema = z.enum(['user', 'agent', 'system']);
|
|
30
|
-
/**
|
|
31
|
-
* Parses a participant kind from an inbound frame, tolerating an older wire
|
|
32
|
-
* dialect. Some presence and claim frames label a non-agent participant
|
|
33
|
-
* `'human'`, while the rest of the surface uses `'user'` for the same
|
|
34
|
-
* participant. This normalizes `'human'` to `'user'` on read so every consumer
|
|
35
|
-
* switches on one vocabulary. Producers emit the canonical
|
|
36
|
-
* {@link participantKindSchema} values, and the output union is never widened.
|
|
37
|
-
*/
|
|
38
|
-
export const wireParticipantKindSchema = z.preprocess((value) => (value === 'human' ? 'user' : value), participantKindSchema);
|
|
39
|
-
/**
|
|
40
|
-
* Resolves a peer's kind from an inbound presence or claim frame. It prefers
|
|
41
|
-
* the server-stamped `participantKind` (normalized through
|
|
42
|
-
* {@link wireParticipantKindSchema}). A frame from an older server that omits
|
|
43
|
-
* that field falls back to the `isAgent` boolean, which can tell 'agent' from
|
|
44
|
-
* 'user' but can never report 'system'.
|
|
45
|
-
*/
|
|
46
|
-
export function participantKindFromWire(wireKind, isAgent) {
|
|
47
|
-
const parsed = wireParticipantKindSchema.safeParse(wireKind);
|
|
48
|
-
if (parsed.success)
|
|
49
|
-
return parsed.data;
|
|
50
|
-
return isAgent ? 'agent' : 'user';
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Reads the peer-visible description a claim or presence frame carries in its
|
|
54
|
-
* opaque `meta.description`. This is the single place that unpacks that field.
|
|
55
|
-
* A caller that has an explicit `description` should prefer it
|
|
56
|
-
* (`explicit ?? fromMeta`).
|
|
57
|
-
*/
|
|
58
|
-
export function descriptionFromMeta(meta) {
|
|
59
|
-
return typeof meta?.description === 'string' ? meta.description : undefined;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* What a coordination event points at — the locator shared by all three
|
|
63
|
-
* layers. It names an entity, optionally narrowed to a path, range, or field,
|
|
64
|
-
* and carries opaque application metadata.
|
|
65
|
-
*/
|
|
66
|
-
export const targetRefSchema = z.object({
|
|
67
|
-
entityType: z.string(),
|
|
68
|
-
entityId: z.string(),
|
|
69
|
-
path: z.string().optional(),
|
|
70
|
-
range: targetRangeSchema.optional(),
|
|
71
|
-
field: z.string().optional(),
|
|
72
|
-
meta: z.record(z.string(), z.unknown()).optional(),
|
|
73
|
-
});
|
|
74
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
75
|
-
// Layer 3 — optimistic stale-context (the write guard)
|
|
76
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
77
|
-
/**
|
|
78
|
-
* How the server treats a write whose snapshot watermark (`readAt`) is older
|
|
79
|
-
* than the target row's latest change. There are three dispositions:
|
|
80
|
-
* • `notify` — hold the write and return a {@link StaleNotification}
|
|
81
|
-
* carrying the current value, so the actor (agent or human)
|
|
82
|
-
* can resolve it.
|
|
83
|
-
* • `reject` — throw `AbloStaleContextError`, the default when `readAt`
|
|
84
|
-
* is present.
|
|
85
|
-
* • `overwrite` — apply the write blindly, last write wins, with no signal.
|
|
86
|
-
*/
|
|
87
|
-
export const onStaleModeSchema = z.enum(['reject', 'overwrite', 'notify']);
|
|
88
|
-
/**
|
|
89
|
-
* The optimistic guard carried on a commit operation. `readAt` is the
|
|
90
|
-
* snapshot watermark from `context.capture` (null/absent ⇒ unguarded write).
|
|
91
|
-
* `bypass` is the explicit, recorded override of a *foreign* pessimistic
|
|
92
|
-
* claim — see the claim layer below.
|
|
93
|
-
*/
|
|
94
|
-
export const writeGuardSchema = z.object({
|
|
95
|
-
readAt: z.number().nullish(),
|
|
96
|
-
onStale: onStaleModeSchema.nullish(),
|
|
97
|
-
bypass: z.boolean().optional(),
|
|
98
|
-
});
|
|
99
|
-
/**
|
|
100
|
-
* The advisory returned to a committer whose write hit a stale-context
|
|
101
|
-
* conflict under `onStale: 'notify'` — it reports that the value the committer
|
|
102
|
-
* reasoned against changed while they were away. Rather than throwing, the
|
|
103
|
-
* server hands back the conflicting field's current value as data so the
|
|
104
|
-
* actor — an agent or a human — can reconcile and re-commit. A claim is the
|
|
105
|
-
* prospective form of the same idea (coordinate before acting); this
|
|
106
|
-
* notification is the in-flight form (here is what changed, you resolve). It
|
|
107
|
-
* rides on the commit acknowledgement alongside `lastSyncId`; an empty or
|
|
108
|
-
* absent array means nothing the committer depended on moved.
|
|
109
|
-
*
|
|
110
|
-
* Only `onStale: 'notify'` produces this. The conflicting operation was held,
|
|
111
|
-
* not written, and the actor reconciles against `currentValues` and
|
|
112
|
-
* re-commits. `reject` throws instead, and `overwrite` proceeds silently —
|
|
113
|
-
* neither notifies.
|
|
114
|
-
*/
|
|
115
|
-
export const staleNotificationSchema = z.object({
|
|
116
|
-
/** Names this object's type; every returned object carries such a tag. */
|
|
117
|
-
object: z.literal('stale_notification').optional(),
|
|
118
|
-
/** Model name of the conflicting row. */
|
|
119
|
-
model: z.string(),
|
|
120
|
-
/** Row id. */
|
|
121
|
-
id: z.string(),
|
|
122
|
-
/** The watermark the committer reasoned against (its `readAt`). */
|
|
123
|
-
readAt: z.number(),
|
|
124
|
-
/**
|
|
125
|
-
* Newest delta id on the row — the committer's new watermark. Re-capture
|
|
126
|
-
* context at/after this id to reconcile.
|
|
127
|
-
*/
|
|
128
|
-
observedSyncId: z.number(),
|
|
129
|
-
/**
|
|
130
|
-
* Fields whose concurrent change collided with this write (intersection of
|
|
131
|
-
* the committer's written columns and a newer delta's `changed_fields`).
|
|
132
|
-
* Empty ⇒ a whole-entity change (CREATE/DELETE/legacy delta).
|
|
133
|
-
*/
|
|
134
|
-
conflictingFields: z.array(z.string()),
|
|
135
|
-
/**
|
|
136
|
-
* The live values of `conflictingFields` after the conflict — the piece a
|
|
137
|
-
* plain stale error omits. It lets the actor reconcile without a follow-up read.
|
|
138
|
-
*/
|
|
139
|
-
currentValues: z.record(z.string(), z.unknown()),
|
|
140
|
-
/** Who wrote the conflicting delta. */
|
|
141
|
-
writtenBy: z.object({
|
|
142
|
-
kind: participantKindSchema,
|
|
143
|
-
id: z.string(),
|
|
144
|
-
}),
|
|
145
|
-
/**
|
|
146
|
-
* Set when this notification is for a GROUP read-dependency (e.g. `deck:abc`,
|
|
147
|
-
* `slide:s1`) rather than a single row — "something in the group you read
|
|
148
|
-
* changed." For a group notification `conflictingFields`/`currentValues` are
|
|
149
|
-
* empty (the change could span many rows); re-read the group at
|
|
150
|
-
* `observedSyncId` to reconcile. Absent ⇒ a row-scoped notification.
|
|
151
|
-
*/
|
|
152
|
-
group: z.string().optional(),
|
|
153
|
-
});
|
|
154
|
-
/**
|
|
155
|
-
* A read that a commit declares it depended on, so the server can ask "did
|
|
156
|
-
* anything I looked at change?" — broader than the write-target check, which
|
|
157
|
-
* only validates the rows being written. The server re-runs stale detection
|
|
158
|
-
* against each declared read at its `readAt`; a moved premise fires the entry's
|
|
159
|
-
* `onStale` disposition (default `reject`) across the whole batch (`notify`
|
|
160
|
-
* holds every write and notifies, `reject` aborts, `overwrite` proceeds
|
|
161
|
-
* silently). A dependency comes at one of two granularities:
|
|
162
|
-
*
|
|
163
|
-
* • Row — `{ model, id, readAt, fields? }`: did this specific row, or these
|
|
164
|
-
* specific fields, change?
|
|
165
|
-
* • Group — `{ group, readAt }`: did anything in this sync group change?
|
|
166
|
-
* `group` is a sync-group key such as `deck:abc` or `slide:s1`, the
|
|
167
|
-
* same unit a participant watches and claims.
|
|
168
|
-
*
|
|
169
|
-
* See `packages/sync-engine/docs/concurrency-convention.md` (§4) for the
|
|
170
|
-
* governing convention and the receive → reconcile loop.
|
|
171
|
-
*/
|
|
172
|
-
export const readDependencySchema = z.union([
|
|
173
|
-
z.object({
|
|
174
|
-
model: z.string(),
|
|
175
|
-
id: z.string(),
|
|
176
|
-
readAt: z.number(),
|
|
177
|
-
fields: z.array(z.string()).optional(),
|
|
178
|
-
onStale: onStaleModeSchema.optional(),
|
|
179
|
-
}),
|
|
180
|
-
z.object({
|
|
181
|
-
group: z.string(),
|
|
182
|
-
readAt: z.number(),
|
|
183
|
-
onStale: onStaleModeSchema.optional(),
|
|
184
|
-
}),
|
|
185
|
-
]);
|
|
186
|
-
/**
|
|
187
|
-
* A durable read-dependency — what a participant is watching so that a later
|
|
188
|
-
* change to it opens a {@link StaleNotification}. It is the persisted sibling of
|
|
189
|
-
* a {@link ReadDependency}: the same reference shape, minus the disposition (a
|
|
190
|
-
* track always notifies — that is what tracking is), with an optional `readAt`
|
|
191
|
-
* that defaults to the watermark of the commit that registered it. The row form
|
|
192
|
-
* watches one object; the group form watches a whole sync group ("anything in
|
|
193
|
-
* `deck:abc`"). Where a `ReadDependency` is checked once at commit and discarded,
|
|
194
|
-
* a `TrackDependency` is kept and re-checked against every future delta. See
|
|
195
|
-
* `packages/sync-engine/docs/groups.md` for how it drives change propagation.
|
|
196
|
-
*/
|
|
197
|
-
export const trackDependencySchema = z.union([
|
|
198
|
-
z.object({
|
|
199
|
-
model: z.string(),
|
|
200
|
-
id: z.string(),
|
|
201
|
-
readAt: z.number().optional(),
|
|
202
|
-
}),
|
|
203
|
-
z.object({
|
|
204
|
-
group: z.string(),
|
|
205
|
-
readAt: z.number().optional(),
|
|
206
|
-
}),
|
|
207
|
-
]);
|
|
208
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
209
|
-
// Layer 2 — pessimistic claims and leases
|
|
210
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
211
|
-
/**
|
|
212
|
-
* The lifecycle of a claim. When absent on the wire it means `'active'` (an
|
|
213
|
-
* additive back-compat default). The server stamps `'active'` on `claim_begin`
|
|
214
|
-
* and emits one terminal frame — `committed`, `canceled`, or `expired` — as the
|
|
215
|
-
* claim ends, so contenders learn how it resolved, not merely that it vanished.
|
|
216
|
-
*/
|
|
217
|
-
export const claimStatusSchema = z.enum([
|
|
218
|
-
'active',
|
|
219
|
-
'committed',
|
|
220
|
-
'expired',
|
|
221
|
-
'canceled',
|
|
222
|
-
]);
|
|
223
|
-
/**
|
|
224
|
-
* Server-owned grant stamps — minted once when a claim is first granted and
|
|
225
|
-
* preserved verbatim across a re-announce of the same `claimId`, so neither a
|
|
226
|
-
* reconnect nor a client-supplied value can move them (unlike `declaredAt`,
|
|
227
|
-
* which the client sends afresh each announce). Both optional: a frame without
|
|
228
|
-
* them stays valid, and the feature each backs simply does not engage.
|
|
229
|
-
*/
|
|
230
|
-
const grantStampFields = {
|
|
231
|
-
/**
|
|
232
|
-
* The monotonic fencing token minted for this grant (Option B). Strictly
|
|
233
|
-
* increasing per entity across successive grants, so a write that carries it
|
|
234
|
-
* is rejected at commit if a later holder already advanced the entity's
|
|
235
|
-
* high-water. A token-less write is simply not fence-checked.
|
|
236
|
-
*/
|
|
237
|
-
fenceToken: z.number().optional(),
|
|
238
|
-
/**
|
|
239
|
-
* Lease origin (epoch ms): when THIS holding was acquired. The cumulative-
|
|
240
|
-
* hold ceiling measures a holder's fair share from here — and because it
|
|
241
|
-
* survives a re-announce, a reconnect cannot rewind the clock.
|
|
242
|
-
*/
|
|
243
|
-
acquiredAt: z.number().optional(),
|
|
244
|
-
};
|
|
245
|
-
const wireClaimBaseSchema = targetRefSchema.extend({
|
|
246
|
-
claimId: z.string(),
|
|
247
|
-
/**
|
|
248
|
-
* Peer-visible description of the work being done (`'rewriting the risk
|
|
249
|
-
* section to match Q3'`). The server stamps a default when a frame carries
|
|
250
|
-
* none.
|
|
251
|
-
*/
|
|
252
|
-
description: z.string().optional(),
|
|
253
|
-
/** Server-stamped declaration time (epoch ms). */
|
|
254
|
-
declaredAt: z.number(),
|
|
255
|
-
/** Server-computed TTL deadline (epoch ms). Readers treat as advisory. */
|
|
256
|
-
expiresAt: z.number(),
|
|
257
|
-
status: claimStatusSchema.optional(),
|
|
258
|
-
...grantStampFields,
|
|
259
|
-
});
|
|
260
|
-
export const wireClaimSummarySchema = wireClaimBaseSchema.pick({
|
|
261
|
-
claimId: true,
|
|
262
|
-
description: true,
|
|
263
|
-
declaredAt: true,
|
|
264
|
-
expiresAt: true,
|
|
265
|
-
entityType: true,
|
|
266
|
-
entityId: true,
|
|
267
|
-
field: true,
|
|
268
|
-
meta: true,
|
|
269
|
-
});
|
|
270
|
-
/** Why a claim ended in a non-success terminal state. */
|
|
271
|
-
export const claimErrorSchema = z.object({
|
|
272
|
-
code: z.string(),
|
|
273
|
-
message: z.string().optional(),
|
|
274
|
-
/** Participant already holding the target (conflict rejections). */
|
|
275
|
-
heldBy: z.string().optional(),
|
|
276
|
-
heldByClaimId: z.string().optional(),
|
|
277
|
-
heldByExpiresAt: z.number().optional(),
|
|
278
|
-
/** Rich holder context for conflict rejections. Additive: older frames omit it. */
|
|
279
|
-
heldByClaim: wireClaimSummarySchema.optional(),
|
|
280
|
-
/** Optional conflict-policy explanation. Additive: older frames omit it. */
|
|
281
|
-
policyReason: z.string().optional(),
|
|
282
|
-
});
|
|
283
|
-
/**
|
|
284
|
-
* A declared, pending-mutation claim — the unit broadcast inside a presence
|
|
285
|
-
* frame's `activeClaims`. The client supplies the descriptive `targetRef`
|
|
286
|
-
* fields, a `description` of the work, and a chosen `claimId`; the server stamps
|
|
287
|
-
* `declaredAt` and `expiresAt` and may set `status` and `error`. Those last
|
|
288
|
-
* two are optional, so one shape serves both the server, which sets them, and
|
|
289
|
-
* the leaner SDK view, which reads a claim without them.
|
|
290
|
-
*/
|
|
291
|
-
export const wireClaimSchema = wireClaimBaseSchema.extend({
|
|
292
|
-
error: claimErrorSchema.optional(),
|
|
293
|
-
});
|
|
294
|
-
export const claimRejectionSchema = z.object({
|
|
295
|
-
claimId: z.string(),
|
|
296
|
-
reason: z.string(),
|
|
297
|
-
target: targetRefSchema.optional(),
|
|
298
|
-
heldBy: z.string().optional(),
|
|
299
|
-
heldByClaimId: z.string().optional(),
|
|
300
|
-
heldByExpiresAt: z.number().optional(),
|
|
301
|
-
heldByClaim: wireClaimSummarySchema.optional(),
|
|
302
|
-
policyReason: z.string().optional(),
|
|
303
|
-
});
|
|
304
|
-
/**
|
|
305
|
-
* The point-to-point notification sent to a holder whose lease ended without
|
|
306
|
-
* a successful commit. This remains a wire-shaped target because it arrives
|
|
307
|
-
* directly from the WebSocket; the schema is the single validation boundary
|
|
308
|
-
* before the event reaches public `claims.onLost` listeners.
|
|
309
|
-
*/
|
|
310
|
-
export const claimLostSchema = z.object({
|
|
311
|
-
claimId: z.string(),
|
|
312
|
-
reason: z.enum(['expired', 'preempted']),
|
|
313
|
-
target: targetRefSchema,
|
|
314
|
-
});
|
|
315
|
-
/**
|
|
316
|
-
* What a {@link ModelClaim} points at — the target locator as SDK callers see
|
|
317
|
-
* it, keyed by `model` and `id` rather than the wire schema's `entityType` and
|
|
318
|
-
* `entityId`. This is the public `ModelTarget` shape.
|
|
319
|
-
*/
|
|
320
|
-
export const modelTargetSchema = z
|
|
321
|
-
.object({
|
|
322
|
-
model: z.string(),
|
|
323
|
-
id: z.string(),
|
|
324
|
-
path: z.string().optional(),
|
|
325
|
-
range: targetRangeSchema.optional(),
|
|
326
|
-
field: z.string().optional(),
|
|
327
|
-
meta: z.record(z.string(), z.unknown()).optional(),
|
|
328
|
-
})
|
|
329
|
-
.readonly();
|
|
330
|
-
/**
|
|
331
|
-
* A claim as SDK callers and the HTTP claim routes see it
|
|
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.
|
|
335
|
-
*
|
|
336
|
-
* `expiresAt` is epoch milliseconds (a number), the same encoding as the
|
|
337
|
-
* WebSocket {@link WireClaim}, so one timestamp representation spans the wire,
|
|
338
|
-
* the SDK, HTTP, and errors — there is no ISO string anywhere.
|
|
339
|
-
* `participantKind` is parsed through {@link wireParticipantKindSchema}, so a
|
|
340
|
-
* legacy `'human'` frame normalizes to `'user'`.
|
|
341
|
-
*/
|
|
342
|
-
export const modelClaimSchema = z
|
|
343
|
-
.object({
|
|
344
|
-
id: z.string(),
|
|
345
|
-
actor: z.string(),
|
|
346
|
-
participantKind: wireParticipantKindSchema,
|
|
347
|
-
/** Peer-visible description of the work (`'rewriting the risk section'`).
|
|
348
|
-
* Optional: a claim may be declared without one. */
|
|
349
|
-
description: z.string().optional(),
|
|
350
|
-
field: z.string().optional(),
|
|
351
|
-
status: z.enum(['active', 'queued']).optional(),
|
|
352
|
-
position: z.number().optional(),
|
|
353
|
-
expiresAt: z.number(),
|
|
354
|
-
/** The grant's fencing token (Option B), present on a claim you hold. */
|
|
355
|
-
fenceToken: z.number().optional(),
|
|
356
|
-
target: modelTargetSchema,
|
|
357
|
-
})
|
|
358
|
-
.readonly();
|
|
359
|
-
/**
|
|
360
|
-
* The `claim_begin` payload a client sends. It carries the descriptive target
|
|
361
|
-
* and a `description` of the work, an optional duration hint, and the opt-in
|
|
362
|
-
* fair-queue flag. The server stamps the lifecycle and timestamp fields, so they
|
|
363
|
-
* are not part of this inbound shape — this is exactly what the server validates
|
|
364
|
-
* on ingest.
|
|
365
|
-
*/
|
|
366
|
-
export const claimBeginPayloadSchema = targetRefSchema.extend({
|
|
367
|
-
claimId: z.string(),
|
|
368
|
-
/** Peer-visible description of the work. The server stamps `'editing'` when a
|
|
369
|
-
* frame carries none. */
|
|
370
|
-
description: z.string().optional(),
|
|
371
|
-
/** Hint for `expiresAt`; the server caps it. */
|
|
372
|
-
estimatedMs: z.number().optional(),
|
|
373
|
-
/**
|
|
374
|
-
* Opt into the fair wait queue. When the target is already held, the server
|
|
375
|
-
* enqueues this claim in FIFO order and replies `claim_queued`, then
|
|
376
|
-
* `claim_granted` later, instead of `claim_rejected`. A client that sets this
|
|
377
|
-
* must be ready to handle the grant.
|
|
378
|
-
*/
|
|
379
|
-
queue: z.boolean().optional(),
|
|
380
|
-
});
|
|
381
|
-
/**
|
|
382
|
-
* The `claim_abandon` payload a client sends. `entityType` and `entityId` let
|
|
383
|
-
* the server dequeue a claim that is still waiting (not yet held) from the FIFO
|
|
384
|
-
* line; abandoning a claim that is already held needs only `claimId`.
|
|
385
|
-
*/
|
|
386
|
-
export const claimAbandonPayloadSchema = z.object({
|
|
387
|
-
claimId: z.string(),
|
|
388
|
-
entityType: z.string().optional(),
|
|
389
|
-
entityId: z.string().optional(),
|
|
390
|
-
});
|
|
391
|
-
/**
|
|
392
|
-
* The `claim_reorder` payload a client sends. A privileged participant, such as
|
|
393
|
-
* a supervisor over its sub-agents, re-ranks the FIFO wait queue for an entity:
|
|
394
|
-
* `order` lists waiters by `heldBy` and `claimId` in the desired priority, and
|
|
395
|
-
* any waiter not listed keeps its relative order behind those that are. The
|
|
396
|
-
* server gates who may call this and drops an unauthorized sender. Where
|
|
397
|
-
* `claim_abandon` acts on the caller's own entry, a reorder acts on other
|
|
398
|
-
* participants' queue positions — which is why it is gated.
|
|
399
|
-
*/
|
|
400
|
-
export const claimReorderPayloadSchema = z.object({
|
|
401
|
-
entityType: z.string(),
|
|
402
|
-
entityId: z.string(),
|
|
403
|
-
order: z.array(z.object({ heldBy: z.string(), claimId: z.string() })),
|
|
404
|
-
});
|
|
405
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
406
|
-
// Heartbeat — the async / long-running-work surface of a claim.
|
|
407
|
-
//
|
|
408
|
-
// A claim's TTL is crash cleanup, not a work-duration estimate. Work that
|
|
409
|
-
// outlives it — an agent run, a background worker's job — keeps its lease by
|
|
410
|
-
// BEATING: request `claim_heartbeat`, reply `claim_heartbeat_ack`. One field
|
|
411
|
-
// set serves every shape; the single and batched payloads are both derived
|
|
412
|
-
// from it, and the WebSocket frame and HTTP routes are two encodings of the
|
|
413
|
-
// same messages. Everything long-running-work-related on the wire lives in
|
|
414
|
-
// this block.
|
|
415
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
416
|
-
/**
|
|
417
|
-
* The one field set behind every heartbeat message. The single-claim payload
|
|
418
|
-
* refines it; the batched payload picks from it — there is deliberately no
|
|
419
|
-
* second shape to keep in sync.
|
|
420
|
-
*/
|
|
421
|
-
const claimHeartbeatFieldsSchema = z.object({
|
|
422
|
-
claimId: z.string().optional(),
|
|
423
|
-
entityType: z.string().optional(),
|
|
424
|
-
entityId: z.string().optional(),
|
|
425
|
-
/** Requested extension from now; the server clamps it, and an extension
|
|
426
|
-
* never shortens a lease. */
|
|
427
|
-
ttlMs: z.number().positive().optional(),
|
|
428
|
-
/**
|
|
429
|
-
* Lightweight progress the beat carries along ("42/100 pages") — stored
|
|
430
|
-
* as the claim's `meta.progress` (last beat wins) and peer-visible via
|
|
431
|
-
* `claim.state` while the lease is held. This is presence, not a
|
|
432
|
-
* checkpoint: it dies with the lease. Crash-recoverable progress belongs
|
|
433
|
-
* in the data itself — write a row, and every subscriber already sees it.
|
|
434
|
-
*/
|
|
435
|
-
details: z.record(z.string(), z.unknown()).optional(),
|
|
436
|
-
});
|
|
437
|
-
/**
|
|
438
|
-
* The `claim_heartbeat` payload a client sends to extend a lease it holds (or
|
|
439
|
-
* refresh its slot in the wait queue) past the liveness window — the
|
|
440
|
-
* work-duration signal for long-running holders, distinct from the connection
|
|
441
|
-
* keepalive.
|
|
442
|
-
*
|
|
443
|
-
* The claim is identified either way: by `claimId`, or — since a claim is
|
|
444
|
-
* singular per (actor, entity) — by the full `entityType`/`entityId` target
|
|
445
|
-
* ("my claim on this row"). At least one of the two must be present. The
|
|
446
|
-
* target also lets the server resolve without a scan and is required to
|
|
447
|
-
* refresh a *queued* claim (a waiter is not in the holder set the server
|
|
448
|
-
* would otherwise search).
|
|
449
|
-
*/
|
|
450
|
-
export const claimHeartbeatPayloadSchema = claimHeartbeatFieldsSchema.refine((payload) => payload.claimId !== undefined ||
|
|
451
|
-
(payload.entityType !== undefined && payload.entityId !== undefined), {
|
|
452
|
-
message: 'a heartbeat must identify its claim — pass claimId, or entityType and entityId together',
|
|
453
|
-
});
|
|
454
|
-
/**
|
|
455
|
-
* The server's reply to a `claim_heartbeat`. For a socketless worker the
|
|
456
|
-
* heartbeat reply is the only inbound signal path, so it carries the lease's
|
|
457
|
-
* fate rather than a bare ok: `held` (extended to `expiresAt`), `queued`
|
|
458
|
-
* (slot refreshed; `position` is the current place in line), or `lost` (the
|
|
459
|
-
* lease expired and the queue moved on — the worker should abandon or
|
|
460
|
-
* re-queue, and any write it still attempts is caught by its `readAt` guard).
|
|
461
|
-
*/
|
|
462
|
-
export const claimHeartbeatAckPayloadSchema = z.object({
|
|
463
|
-
claimId: z.string(),
|
|
464
|
-
status: z.enum(['held', 'queued', 'lost']),
|
|
465
|
-
expiresAt: z.number().optional(),
|
|
466
|
-
position: z.number().optional(),
|
|
467
|
-
/**
|
|
468
|
-
* How many participants are waiting in line behind a held lease — the
|
|
469
|
-
* cooperative-yield pressure signal (present on `held`). A worker that can
|
|
470
|
-
* checkpoint may choose to release early when others wait. Hard
|
|
471
|
-
* cancellation needs no extra field: a preempted, expired, or revoked
|
|
472
|
-
* lease answers the next beat with `lost`.
|
|
473
|
-
*/
|
|
474
|
-
queueDepth: z.number().optional(),
|
|
475
|
-
});
|
|
476
|
-
/**
|
|
477
|
-
* The batched heartbeat — one request extends every lease the caller holds
|
|
478
|
-
* on its plane (the socketless twin of the WebSocket keepalive, which renews
|
|
479
|
-
* all held leases on every ping). For a worker holding many rows this is one
|
|
480
|
-
* round trip per cadence instead of one per claim. Queued slots are not
|
|
481
|
-
* batch-refreshed: a waiter knows its target and beats it directly.
|
|
482
|
-
*/
|
|
483
|
-
export const claimHeartbeatBatchPayloadSchema = claimHeartbeatFieldsSchema.pick({ ttlMs: true });
|
|
484
|
-
/** Reply to a batched heartbeat: one ack entry per lease that was extended. */
|
|
485
|
-
export const claimHeartbeatBatchAckPayloadSchema = z.object({
|
|
486
|
-
results: z.array(claimHeartbeatAckPayloadSchema),
|
|
487
|
-
});
|
|
488
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
489
|
-
// Read interest — area-of-interest navigation (update_subscription)
|
|
490
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
491
|
-
/**
|
|
492
|
-
* The `update_subscription` payload a client sends. It replaces the
|
|
493
|
-
* connection's read interest with the complete set of sync groups — the read
|
|
494
|
-
* counterpart to a claim, with no write lock and no TTL. Each entry is a
|
|
495
|
-
* {@link syncGroupInputSchema} (`'default'` or a branded `kind:id`), so a
|
|
496
|
-
* malformed group is rejected on ingest rather than silently indexed. The
|
|
497
|
-
* element type is strict because this is untrusted client input.
|
|
498
|
-
*/
|
|
499
|
-
export const updateSubscriptionPayloadSchema = z.object({
|
|
500
|
-
syncGroups: z.array(syncGroupInputSchema),
|
|
501
|
-
});
|
|
502
|
-
/**
|
|
503
|
-
* `subscription_ack` payload (server → client). Echoes the connection's
|
|
504
|
-
* effective read set after the update (unchanged on rejection — the update is
|
|
505
|
-
* atomic). `error` is present iff `success` is false (e.g. a scoped key
|
|
506
|
-
* requesting a group outside its grant). `syncGroups` is lenient
|
|
507
|
-
* (`z.string()`) here, not branded: it is the server's own echo for display,
|
|
508
|
-
* not untrusted input, and includes base anchors like `org:<id>`.
|
|
509
|
-
*/
|
|
510
|
-
export const subscriptionAckPayloadSchema = z.object({
|
|
511
|
-
success: z.boolean(),
|
|
512
|
-
syncGroups: z.array(z.string()),
|
|
513
|
-
error: z.object({ code: z.string(), message: z.string() }).optional(),
|
|
514
|
-
});
|
|
515
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
516
|
-
// Commit operation — carries the optimistic write-guard (Layer 3)
|
|
517
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
518
|
-
export const commitOperationTypeSchema = z.enum([
|
|
519
|
-
'CREATE',
|
|
520
|
-
'UPDATE',
|
|
521
|
-
'DELETE',
|
|
522
|
-
'ARCHIVE',
|
|
523
|
-
'UNARCHIVE',
|
|
524
|
-
]);
|
|
525
|
-
/**
|
|
526
|
-
* A single mutation in a commit batch, as it arrives on the wire. Extends the
|
|
527
|
-
* optimistic `writeGuard` (`readAt`/`onStale`/`bypass`) — the structural link
|
|
528
|
-
* that makes "every write is stale-guarded" legible in the type, not just in
|
|
529
|
-
* prose.
|
|
530
|
-
*/
|
|
531
|
-
export const commitOperationSchema = writeGuardSchema.extend({
|
|
532
|
-
type: commitOperationTypeSchema,
|
|
533
|
-
model: z.string(),
|
|
534
|
-
id: z.string().nullish(),
|
|
535
|
-
input: z.record(z.string(), z.unknown()).nullish(),
|
|
536
|
-
/** Per-op client tx id, echoed on the broadcast delta. */
|
|
537
|
-
transactionId: z.string().nullish(),
|
|
538
|
-
/**
|
|
539
|
-
* The fencing token from the held claim this write belongs to (Option B).
|
|
540
|
-
* Present only on a write issued under a claim that was granted one; the
|
|
541
|
-
* server checks it against the entity's persisted high-water and rejects a
|
|
542
|
-
* stale token. Absent (nullish) on every unclaimed write — those are governed
|
|
543
|
-
* by version-CAS and the Option A blind-write guard, unchanged.
|
|
544
|
-
*/
|
|
545
|
-
fenceToken: z.number().nullish(),
|
|
546
|
-
});
|
|
547
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
548
|
-
// Layer 1 — presence (observation only; it never enforces)
|
|
549
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
550
|
-
export const presenceKindSchema = z.enum(['enter', 'update', 'leave']);
|
|
551
|
-
/** What a participant is actively working on (agents fill this in). */
|
|
552
|
-
export const presenceActivitySchema = targetRefSchema.extend({
|
|
553
|
-
action: z.string(),
|
|
554
|
-
detail: z.string().optional(),
|
|
555
|
-
});
|
|
556
|
-
/**
|
|
557
|
-
* Full `presence_update` frame as the server broadcasts it. The activity +
|
|
558
|
-
* `activeClaims` are the observation surface for the other two layers —
|
|
559
|
-
* rendered, never acted on as enforcement.
|
|
560
|
-
*/
|
|
561
|
-
export const presenceUpdateFrameSchema = z.object({
|
|
562
|
-
kind: presenceKindSchema,
|
|
563
|
-
userId: z.string().optional(),
|
|
564
|
-
syncGroups: z.array(z.string()).optional(),
|
|
565
|
-
timestamp: z.number().optional(),
|
|
566
|
-
status: z.string(),
|
|
567
|
-
timezone: z.string().optional(),
|
|
568
|
-
customStatus: z.string().optional(),
|
|
569
|
-
activity: presenceActivitySchema.optional(),
|
|
570
|
-
isAgent: z.boolean().optional(),
|
|
571
|
-
/**
|
|
572
|
-
* Server-stamped canonical kind. Additive — older servers omit it and
|
|
573
|
-
* readers fall back to `isAgent` (see {@link participantKindFromWire}).
|
|
574
|
-
*/
|
|
575
|
-
participantKind: wireParticipantKindSchema.optional(),
|
|
576
|
-
activeClaims: z.array(wireClaimSchema).optional(),
|
|
577
|
-
delegatedFrom: z.string().nullish(),
|
|
578
|
-
});
|
package/dist/schema/openapi.d.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generates an OpenAPI 3.1 specification from a pushed schema, so the API reference
|
|
3
|
-
* describes your own models rather than a fixed set. The API surface is the schema:
|
|
4
|
-
* defining a `task` model is what makes `/v1/models/task` exist. This walks each
|
|
5
|
-
* model's `fields` (the introspectable {@link FieldMeta}) and emits, per model, the
|
|
6
|
-
* CRUD and coordination routes the API serves:
|
|
7
|
-
* GET/POST /v1/models/{model}
|
|
8
|
-
* GET/PATCH/DELETE /v1/models/{model}/{id}
|
|
9
|
-
* POST/DELETE /v1/models/{model}/{id}/claim
|
|
10
|
-
* POST /v1/models/{model}/{id}/claim/heartbeat
|
|
11
|
-
* POST /v1/models/{model}/{id}/claim/reorder
|
|
12
|
-
* plus POST /v1/commits. Authentication is a single Bearer scheme, your API key.
|
|
13
|
-
*
|
|
14
|
-
* Feed it into codegen (for example `ablo openapi > openapi.json`) or serve it
|
|
15
|
-
* directly; the return value is a plain JSON-serializable object.
|
|
16
|
-
*/
|
|
17
|
-
import type { Schema, SchemaRecord } from './schema.js';
|
|
18
|
-
/** Options for {@link schemaToOpenApi} — the metadata stamped into the generated spec. */
|
|
19
|
-
export interface SchemaToOpenApiOptions {
|
|
20
|
-
/** Spec title. Default `"Ablo API"`. */
|
|
21
|
-
readonly title?: string;
|
|
22
|
-
/** Spec version. Default `"1.0.0"`. */
|
|
23
|
-
readonly version?: string;
|
|
24
|
-
/** API base URL. Default `"https://api.abloatai.com/api"`. */
|
|
25
|
-
readonly serverUrl?: string;
|
|
26
|
-
}
|
|
27
|
-
type Json = Record<string, unknown>;
|
|
28
|
-
export declare function schemaToOpenApi<S extends SchemaRecord>(schema: Schema<S>, options?: SchemaToOpenApiOptions): Json;
|
|
29
|
-
export {};
|