@abloatai/ablo 0.26.0 → 0.27.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/CHANGELOG.md +14 -0
- package/README.md +101 -85
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +131 -147
- package/dist/Database.d.ts +54 -68
- package/dist/Database.js +97 -113
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +12 -16
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +46 -61
- package/dist/ModelRegistry.d.ts +21 -19
- package/dist/ModelRegistry.js +23 -27
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +5 -6
- package/dist/SyncClient.d.ts +112 -112
- package/dist/SyncClient.js +165 -172
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +9 -9
- package/dist/adapters/inMemoryStorage.js +9 -9
- package/dist/agent/Agent.d.ts +27 -32
- package/dist/agent/Agent.js +18 -19
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +6 -7
- package/dist/ai-sdk/wrap.js +1 -1
- package/dist/auth/credentialPolicy.d.ts +69 -74
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +6 -5
- package/dist/auth/credentialSource.js +9 -10
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +31 -37
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +167 -119
- package/dist/client/Ablo.d.ts +73 -73
- package/dist/client/Ablo.js +125 -160
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +133 -38
- package/dist/client/auth.d.ts +47 -47
- package/dist/client/auth.js +108 -117
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +5 -6
- package/dist/client/consoleLogger.js +5 -6
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +25 -30
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +152 -122
- package/dist/client/credentialEndpoint.d.ts +40 -42
- package/dist/client/credentialEndpoint.js +35 -36
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +9 -12
- package/dist/client/hostedEndpoints.js +9 -12
- package/dist/client/httpClient.d.ts +57 -53
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +47 -58
- package/dist/client/modelRegistration.d.ts +5 -9
- package/dist/client/modelRegistration.js +67 -87
- package/dist/client/options.d.ts +134 -157
- package/dist/client/options.js +3 -7
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +64 -75
- package/dist/client/resourceTypes.js +4 -10
- package/dist/client/schemaConfig.d.ts +31 -43
- package/dist/client/schemaConfig.js +38 -50
- package/dist/client/sessionMint.d.ts +16 -12
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +8 -9
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +15 -20
- package/dist/client/wsMutationExecutor.js +17 -23
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -4
- package/dist/coordination/index.d.ts +10 -8
- package/dist/coordination/index.js +14 -12
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -10
- package/dist/coordination/trace.js +13 -14
- package/dist/core/DatabaseManager.d.ts +5 -7
- package/dist/core/DatabaseManager.js +15 -19
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +22 -28
- package/dist/core/QueryView.d.ts +8 -8
- package/dist/core/QueryView.js +2 -2
- package/dist/core/StoreManager.d.ts +12 -14
- package/dist/core/StoreManager.js +21 -24
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +17 -12
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +42 -43
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +63 -61
- package/dist/core/storeContract.js +8 -12
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +107 -99
- package/dist/errorCodes.js +131 -132
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +30 -27
- package/dist/index.js +89 -86
- package/dist/interfaces/index.d.ts +102 -113
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +41 -40
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +122 -131
- package/dist/mutators/UndoManager.js +145 -156
- package/dist/mutators/defineMutators.d.ts +23 -34
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +104 -100
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +28 -23
- package/dist/query/client.js +45 -43
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +1 -1
- package/dist/react/AbloProvider.js +2 -2
- package/dist/react/context.d.ts +25 -28
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +23 -22
- package/dist/react/useAblo.js +16 -14
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +10 -11
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +8 -8
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useReactive.js +2 -2
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +20 -24
- package/dist/schema/ddlLock.js +18 -23
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +35 -48
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +2 -2
- package/dist/schema/index.js +21 -23
- package/dist/schema/model.d.ts +118 -143
- package/dist/schema/model.js +22 -33
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +5 -3
- package/dist/schema/queries.d.ts +29 -31
- package/dist/schema/queries.js +23 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +16 -13
- package/dist/schema/residency.js +16 -13
- package/dist/schema/roles.d.ts +36 -43
- package/dist/schema/roles.js +31 -37
- package/dist/schema/schema.d.ts +33 -42
- package/dist/schema/schema.js +31 -32
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +28 -31
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +30 -25
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +30 -25
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +24 -23
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +9 -8
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +22 -25
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +17 -11
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +28 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +46 -58
- package/dist/source/factory.js +22 -27
- package/dist/source/index.d.ts +7 -9
- package/dist/source/index.js +12 -14
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +9 -10
- package/dist/source/next.js +6 -7
- package/dist/source/pushQueue.d.ts +69 -47
- package/dist/source/pushQueue.js +32 -28
- package/dist/source/signing.d.ts +46 -17
- package/dist/source/signing.js +28 -11
- package/dist/source/types.d.ts +121 -104
- package/dist/source/types.js +13 -14
- package/dist/stores/ObjectStore.d.ts +10 -11
- package/dist/stores/ObjectStore.js +11 -12
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +27 -20
- package/dist/surface.js +27 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
- package/dist/sync/ConnectionManager.d.ts +39 -50
- package/dist/sync/ConnectionManager.js +55 -66
- package/dist/sync/NetworkProbe.d.ts +24 -29
- package/dist/sync/NetworkProbe.js +63 -69
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
- package/dist/sync/SyncWebSocket.d.ts +139 -165
- package/dist/sync/SyncWebSocket.js +191 -223
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +11 -11
- package/dist/sync/bootstrapApply.d.ts +34 -24
- package/dist/sync/bootstrapApply.js +27 -19
- package/dist/sync/commitFrames.d.ts +21 -20
- package/dist/sync/commitFrames.js +18 -18
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +105 -23
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +12 -14
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +104 -104
- package/dist/sync/credentialLifecycle.js +140 -147
- package/dist/sync/deltaPipeline.d.ts +36 -34
- package/dist/sync/deltaPipeline.js +64 -65
- package/dist/sync/groupChange.d.ts +63 -61
- package/dist/sync/groupChange.js +74 -78
- package/dist/sync/heartbeat.d.ts +34 -33
- package/dist/sync/heartbeat.js +31 -31
- package/dist/sync/participants.d.ts +19 -19
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +17 -21
- package/dist/sync/syncCursor.js +17 -21
- package/dist/sync/syncPlan.d.ts +28 -36
- package/dist/sync/syncPlan.js +18 -19
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +35 -36
- package/dist/sync/wsFrameHandlers.js +63 -67
- package/dist/testing/fixtures/bootstrap.d.ts +12 -6
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +30 -33
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +11 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +3 -3
- package/dist/testing/index.js +2 -2
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
- package/dist/testing/mocks/MockSyncContext.js +15 -13
- package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +181 -176
- package/dist/transactions/TransactionQueue.js +338 -350
- package/dist/transactions/TransactionStore.d.ts +6 -4
- package/dist/transactions/TransactionStore.js +6 -4
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +41 -17
- package/dist/transactions/coalesceRules.js +40 -17
- package/dist/transactions/commitPayload.d.ts +48 -52
- package/dist/transactions/commitPayload.js +48 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
- package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +71 -77
- package/dist/types/index.js +22 -22
- package/dist/types/modelData.d.ts +6 -8
- package/dist/types/modelData.js +5 -7
- package/dist/types/participant.d.ts +10 -11
- package/dist/types/participant.js +6 -8
- package/dist/types/streams.d.ts +208 -195
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +30 -31
- package/dist/wire/errorEnvelope.js +34 -40
- package/dist/wire/frames.d.ts +79 -86
- package/dist/wire/frames.js +26 -33
- package/dist/wire/index.d.ts +14 -12
- package/dist/wire/index.js +30 -26
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +25 -32
- package/dist/wire/protocol.js +25 -32
- package/dist/wire/protocolVersion.d.ts +44 -40
- package/dist/wire/protocolVersion.js +44 -40
- package/docs/coordination.md +59 -0
- package/package.json +11 -10
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -8
- package/dist/server/storage-mode.js +0 -28
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/transactions/optimistic.d.ts +0 -24
- package/dist/transactions/optimistic.js +0 -45
- package/dist/utils/mobx-setup.d.ts +0 -42
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Coordination context middleware — reads peer claims on the same
|
|
3
|
-
* entity from the sync engine's presence stream and injects a brief
|
|
4
|
-
* coordination note into the prompt before the LLM call.
|
|
5
|
-
*
|
|
6
|
-
* The complement of `claim-broadcast.ts`: that one declares what
|
|
7
|
-
* THIS agent is about to do; this one reads what OTHERS are doing
|
|
8
|
-
* and tells the LLM about it. Together they make multiplayer-with-
|
|
9
|
-
* AI structurally real — the AI knows when a human or another
|
|
10
|
-
* agent is mid-edit and can defer / phrase its work as
|
|
11
|
-
* "while you finish that, I'll …" / suggest waiting / coordinate
|
|
12
|
-
* explicitly.
|
|
13
|
-
*
|
|
14
|
-
* Open-source-clean: depends only on `@ai-sdk/provider` types and
|
|
15
|
-
* the package's own `SyncAgent`. Consumers compose via the AI
|
|
16
|
-
* SDK's `wrapLanguageModel`.
|
|
17
|
-
*
|
|
18
|
-
* Cost: zero extra LLM calls (read happens locally from the agent's
|
|
19
|
-
* cached presence stream — already in memory from the WS subscription).
|
|
20
|
-
* Adds a few sentences to the system prompt (typically <100 tokens)
|
|
21
|
-
* only when peers are actively editing.
|
|
22
|
-
*/
|
|
23
|
-
import type { LanguageModelV3Middleware } from '@ai-sdk/provider';
|
|
24
|
-
import type { Ablo } from '../client/Ablo.js';
|
|
25
|
-
import type { SchemaRecord } from '../schema/schema.js';
|
|
26
|
-
import type { ClaimTarget } from '../types/streams.js';
|
|
27
|
-
export type { ClaimTarget };
|
|
28
|
-
export interface CoordinationContextMiddlewareOptions<R extends SchemaRecord = SchemaRecord> {
|
|
29
|
-
readonly agent: Ablo<R> | null;
|
|
30
|
-
readonly target: ClaimTarget | null;
|
|
31
|
-
/**
|
|
32
|
-
* Optional claimId(s) to exclude from the read — typically this
|
|
33
|
-
* agent's own active claim so the coordination note doesn't tell
|
|
34
|
-
* the AI "you yourself are editing this." When middleware is
|
|
35
|
-
* composed with `claimBroadcastMiddleware` in the standard order,
|
|
36
|
-
* `transformParams` runs BEFORE the broadcast's `wrapStream`
|
|
37
|
-
* declares its claim, so the agent's own claim isn't yet in the
|
|
38
|
-
* cached presence and self-filtering isn't needed. The hook is
|
|
39
|
-
* here for callers that compose differently or for fleet
|
|
40
|
-
* coordination (filter sibling worker claims).
|
|
41
|
-
*/
|
|
42
|
-
readonly excludeClaimIds?: readonly string[];
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Build the middleware. When `agent` or `target` is null, returns a
|
|
46
|
-
* pass-through.
|
|
47
|
-
*
|
|
48
|
-
* Generic over the schema record — see `claimBroadcastMiddleware`
|
|
49
|
-
* for why `Ablo<S>` and `Ablo<SchemaRecord>` aren't structurally
|
|
50
|
-
* assignable.
|
|
51
|
-
*/
|
|
52
|
-
export declare function coordinationContextMiddleware<R extends SchemaRecord = SchemaRecord>(options: CoordinationContextMiddlewareOptions<R>): LanguageModelV3Middleware;
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* query-utils — Pure query helpers for the MobX `QueryView`. One source of
|
|
3
|
-
* truth for sort, filter, and binary insertion logic.
|
|
4
|
-
*
|
|
5
|
-
* No MobX, no ObjectPool, no Model — just arrays and values.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* The incremental-update contract a view satisfies. `ViewRegistry` stores views
|
|
9
|
-
* as this base type so it can dispatch to many views with different `T`
|
|
10
|
-
* parameters from one Set — `View<T>` is invariant in T, so without this shared
|
|
11
|
-
* base the registry would have to widen via `unknown as View<Record<...>>` at
|
|
12
|
-
* every register/unregister/notify call.
|
|
13
|
-
*/
|
|
14
|
-
export interface IncrementalView {
|
|
15
|
-
handleAdded(entity: Record<string, unknown>): void;
|
|
16
|
-
handleUpdated(entity: Record<string, unknown>): void;
|
|
17
|
-
handleRemoved(id: string): void;
|
|
18
|
-
}
|
|
19
|
-
/** Compare two values for sorting, null-safe. Returns -1 | 0 | 1. */
|
|
20
|
-
export declare function compareValues(a: unknown, b: unknown, dir: 1 | -1): number;
|
|
21
|
-
/**
|
|
22
|
-
* Binary search for the correct insertion index in a sorted array.
|
|
23
|
-
* Returns the index at which `item` should be inserted.
|
|
24
|
-
*/
|
|
25
|
-
export declare function binaryInsertionIndex<T>(arr: ArrayLike<T>, item: T, sortKey: string, dir: 1 | -1): number;
|
|
26
|
-
/**
|
|
27
|
-
* Check whether an entity matches a declarative `where` clause.
|
|
28
|
-
* Every key in `where` must exactly match the entity's value.
|
|
29
|
-
*/
|
|
30
|
-
export declare function matchesWhere<T extends Record<string, unknown>>(entity: T, where: Partial<T>): boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Find the index of an entity by id in an array. Returns -1 if not found.
|
|
33
|
-
*/
|
|
34
|
-
export declare function findIndexById<T extends Record<string, unknown>>(arr: ArrayLike<T>, id: string): number;
|
package/dist/core/query-utils.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* query-utils — Pure query helpers for the MobX `QueryView`. One source of
|
|
3
|
-
* truth for sort, filter, and binary insertion logic.
|
|
4
|
-
*
|
|
5
|
-
* No MobX, no ObjectPool, no Model — just arrays and values.
|
|
6
|
-
*/
|
|
7
|
-
/** Compare two values for sorting, null-safe. Returns -1 | 0 | 1. */
|
|
8
|
-
export function compareValues(a, b, dir) {
|
|
9
|
-
if (a === b)
|
|
10
|
-
return 0;
|
|
11
|
-
if (a == null)
|
|
12
|
-
return 1;
|
|
13
|
-
if (b == null)
|
|
14
|
-
return -1;
|
|
15
|
-
return (a < b ? -1 : 1) * dir;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Binary search for the correct insertion index in a sorted array.
|
|
19
|
-
* Returns the index at which `item` should be inserted.
|
|
20
|
-
*/
|
|
21
|
-
export function binaryInsertionIndex(arr, item, sortKey, dir) {
|
|
22
|
-
let lo = 0;
|
|
23
|
-
let hi = arr.length;
|
|
24
|
-
const itemVal = item[sortKey];
|
|
25
|
-
while (lo < hi) {
|
|
26
|
-
const mid = (lo + hi) >>> 1;
|
|
27
|
-
const midVal = arr[mid][sortKey];
|
|
28
|
-
if (compareValues(midVal, itemVal, dir) <= 0) {
|
|
29
|
-
lo = mid + 1;
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
hi = mid;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return lo;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Check whether an entity matches a declarative `where` clause.
|
|
39
|
-
* Every key in `where` must exactly match the entity's value.
|
|
40
|
-
*/
|
|
41
|
-
export function matchesWhere(entity, where) {
|
|
42
|
-
for (const [key, value] of Object.entries(where)) {
|
|
43
|
-
if (value === undefined)
|
|
44
|
-
continue;
|
|
45
|
-
if (entity[key] !== value)
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Find the index of an entity by id in an array. Returns -1 if not found.
|
|
52
|
-
*/
|
|
53
|
-
export function findIndexById(arr, id) {
|
|
54
|
-
for (let i = 0; i < arr.length; i++) {
|
|
55
|
-
if (arr[i]?.id === id)
|
|
56
|
-
return i;
|
|
57
|
-
}
|
|
58
|
-
return -1;
|
|
59
|
-
}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical Zod description of the `sync_deltas` STORAGE ROW, decomposed by the
|
|
3
|
-
* subsystem it belongs to and the database plane it lives in.
|
|
4
|
-
*
|
|
5
|
-
* `sync_deltas` fuses five control-plane subsystems onto one denormalized row
|
|
6
|
-
* (see `docs/plans/sync-delta-zod-decomposition.md`). This module is **P0** of
|
|
7
|
-
* that decomposition: it DESCRIBES the existing columns as Zod schemas — no DB
|
|
8
|
-
* change, no rewiring — so the subsystem + plane boundaries become explicit and
|
|
9
|
-
* type-enforced:
|
|
10
|
-
*
|
|
11
|
-
* - {@link syncDeltaCoreSchema} — the SYNC-PROTOCOL slice. `tenant` plane:
|
|
12
|
-
* the only part that must be written
|
|
13
|
-
* atomically with the app row, and the shape
|
|
14
|
-
* a BYO outbox marker carries (the portable
|
|
15
|
-
* slice).
|
|
16
|
-
* - {@link deltaAttributionSchema} — who / on whose authority. `control` plane.
|
|
17
|
-
* - {@link deltaProvenanceSchema} — which AI task caused it. `control` plane.
|
|
18
|
-
*
|
|
19
|
-
* {@link syncDeltaRowSchema} is the full stored row (core ∪ attribution ∪
|
|
20
|
-
* provenance). {@link DELTA_RESIDENCY} declares each slice's plane so provisioning
|
|
21
|
-
* (P1) can derive "what a customer DB gets" from the schema, not hand-code it.
|
|
22
|
-
*
|
|
23
|
-
* Distinct from the WIRE `SyncDelta` (`sync/SyncWebSocket.ts`, client-facing) and
|
|
24
|
-
* `SourceDelta` (`source/index.ts`, source-mode input) — those are projections of
|
|
25
|
-
* this row. Field names mirror those + `AuditChainRow` (`@ablo/audit-chain`).
|
|
26
|
-
*
|
|
27
|
-
* Monorepo is on Zod v4 — `.extend(...).shape` (not deprecated `.merge`).
|
|
28
|
-
*/
|
|
29
|
-
import { z } from 'zod';
|
|
30
|
-
// ── Enums (mirror the Postgres enums; @@map name in the comment) ──────────────
|
|
31
|
-
/** `participant_kind` */
|
|
32
|
-
export const participantKindSchema = z.enum(['user', 'agent', 'system']);
|
|
33
|
-
/** `confirmation_state` */
|
|
34
|
-
export const confirmationStateSchema = z.enum([
|
|
35
|
-
'auto',
|
|
36
|
-
'previewed',
|
|
37
|
-
'approved',
|
|
38
|
-
'required_human_approval',
|
|
39
|
-
'auto_historical',
|
|
40
|
-
]);
|
|
41
|
-
/** `backfill_provenance` */
|
|
42
|
-
export const backfillProvenanceSchema = z.enum(['exact', 'inferred', 'unknown']);
|
|
43
|
-
/** A delta payload: the full post-mutation row (or null for deletes). */
|
|
44
|
-
const deltaDataSchema = z.record(z.string(), z.unknown()).nullable();
|
|
45
|
-
// ── Core — `tenant` plane (the sync-protocol slice) ───────────────────────────
|
|
46
|
-
/**
|
|
47
|
-
* Everything a client needs to materialize the change, plus the tenant key. The
|
|
48
|
-
* portable slice: the only part written atomically with the app row, and the
|
|
49
|
-
* shape a BYO outbox marker carries. `id` / `createdAt` / `syncGroups` are
|
|
50
|
-
* control-plane-assigned at enrich/append time, so they're optional here (an
|
|
51
|
-
* outbox marker doesn't have them yet).
|
|
52
|
-
*/
|
|
53
|
-
export const syncDeltaCoreSchema = z.object({
|
|
54
|
-
/** Monotonic sync id; assigned control-plane on append (absent on a marker). */
|
|
55
|
-
id: z.union([z.bigint(), z.number()]).optional(),
|
|
56
|
-
/** `action_type` — single char: `I` | `U` | `D`. */
|
|
57
|
-
actionType: z.string().min(1).max(1),
|
|
58
|
-
modelName: z.string().min(1),
|
|
59
|
-
modelId: z.string().min(1),
|
|
60
|
-
data: deltaDataSchema,
|
|
61
|
-
previousData: deltaDataSchema.optional(),
|
|
62
|
-
/** Sync-group routing keys; computed control-plane (`buildDeltaSyncGroups`). */
|
|
63
|
-
syncGroups: z.array(z.string()).optional(),
|
|
64
|
-
/** The TRUSTED committing org — the coarse tenant-isolation boundary. */
|
|
65
|
-
organizationId: z.string().nullable(),
|
|
66
|
-
/** ISO timestamp; control-plane-assigned at append. */
|
|
67
|
-
createdAt: z.string().optional(),
|
|
68
|
-
transactionId: z.string().nullable(),
|
|
69
|
-
});
|
|
70
|
-
// ── Attribution — `control` plane ─────────────────────────────────────────────
|
|
71
|
-
export const deltaAttributionSchema = z.object({
|
|
72
|
-
/** Legacy single-actor column, derived during the dual-write window. */
|
|
73
|
-
createdBy: z.string().nullable(),
|
|
74
|
-
actorId: z.string().nullable(),
|
|
75
|
-
actorKind: participantKindSchema.nullable(),
|
|
76
|
-
onBehalfOfId: z.string().nullable(),
|
|
77
|
-
onBehalfOfKind: participantKindSchema.nullable(),
|
|
78
|
-
capabilityId: z.string().nullable(),
|
|
79
|
-
delegationChainRootUserId: z.string().nullable().optional(),
|
|
80
|
-
confirmationState: confirmationStateSchema.nullable(),
|
|
81
|
-
backfillProvenance: backfillProvenanceSchema.nullable(),
|
|
82
|
-
});
|
|
83
|
-
// ── Provenance — `control` plane (→ tasks) ────────────────────────────────────
|
|
84
|
-
export const deltaProvenanceSchema = z.object({
|
|
85
|
-
/** FK to `Task.id` — the LLM turn that produced this commit. */
|
|
86
|
-
causedByTaskId: z.string().nullable(),
|
|
87
|
-
});
|
|
88
|
-
// ── Full stored row + plane map ───────────────────────────────────────────────
|
|
89
|
-
/** The complete `sync_deltas` row as stored today (core ∪ attribution ∪ provenance). */
|
|
90
|
-
export const syncDeltaRowSchema = syncDeltaCoreSchema
|
|
91
|
-
.extend(deltaAttributionSchema.shape)
|
|
92
|
-
.extend(deltaProvenanceSchema.shape);
|
|
93
|
-
/**
|
|
94
|
-
* Each slice's database plane. The durable answer to "what does a BYO customer DB
|
|
95
|
-
* get?" — only `tenant`-plane slices. Provisioning (P1) reads this instead of
|
|
96
|
-
* hand-coding the boundary; the BYO outbox writes the `tenant` slice and the
|
|
97
|
-
* relay enriches the `control` slices in Ablo's own database.
|
|
98
|
-
*/
|
|
99
|
-
export const DELTA_RESIDENCY = {
|
|
100
|
-
core: 'tenant',
|
|
101
|
-
attribution: 'control',
|
|
102
|
-
provenance: 'control',
|
|
103
|
-
};
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical Zod contract for the WIRE delta — the broadcast object that travels
|
|
3
|
-
* server → client (the `delta` / `sync_response` frame payload). This is the
|
|
4
|
-
* "same contract across both" seam: the SDK client and the sync-server each
|
|
5
|
-
* derive their `SyncDelta` type from THESE schemas via `z.infer`, instead of
|
|
6
|
-
* hand-maintaining two interfaces that drift (they had: the server typed
|
|
7
|
-
* `actionType` as `string` and `createdBy` as a nested ref; the client typed
|
|
8
|
-
* `actionType` as the 8-value union and `createdBy` as a flat string — a silent
|
|
9
|
-
* divergence the client never noticed because it ignores attribution).
|
|
10
|
-
*
|
|
11
|
-
* Distinct from {@link import('./sync-delta-row.js').syncDeltaRowSchema} — that
|
|
12
|
-
* is the STORED ROW (has `organizationId`, flat `actor_id`/`actor_kind`
|
|
13
|
-
* columns, single-char action). The wire delta is a PROJECTION: no
|
|
14
|
-
* `organizationId` (the server-trusted isolation predicate is never broadcast),
|
|
15
|
-
* the full Linear action vocabulary, and attribution hydrated into nested
|
|
16
|
-
* {@link ParticipantRef}s.
|
|
17
|
-
*
|
|
18
|
-
* Shape (per the "shared core + layer extensions" decision):
|
|
19
|
-
* - {@link syncDeltaWireCoreSchema} — the fields BOTH sides agree on.
|
|
20
|
-
* - {@link clientSyncDeltaSchema} — core + the SDK-only extras.
|
|
21
|
-
* - {@link serverSyncDeltaSchema} — core + the audit attribution the server
|
|
22
|
-
* enriches each broadcast with (the client
|
|
23
|
-
* structurally ignores these).
|
|
24
|
-
*
|
|
25
|
-
* Monorepo is on Zod v4.
|
|
26
|
-
*/
|
|
27
|
-
import { z } from 'zod';
|
|
28
|
-
import { participantKindSchema, confirmationStateSchema } from './sync-delta-row.js';
|
|
29
|
-
/**
|
|
30
|
-
* `action_type` on the WIRE — the full Linear-compatible vocabulary a broadcast
|
|
31
|
-
* carries (vs the stored row's core CRUD). `I`nsert, `U`pdate, `D`elete,
|
|
32
|
-
* `A`rchive, `V` reVive/unarchive, `C`overing (gained visibility), `G`roupAdded,
|
|
33
|
-
* `S` groupRemoved.
|
|
34
|
-
*/
|
|
35
|
-
export const syncDeltaActionSchema = z.enum(['I', 'U', 'D', 'A', 'V', 'C', 'G', 'S']);
|
|
36
|
-
/**
|
|
37
|
-
* A wire delta payload: the post-mutation row object, a control-frame STRING
|
|
38
|
-
* (e.g. a serialized group-change payload on `G`/`S` deltas), or `null` (on
|
|
39
|
-
* deletes). Wider than the stored `data` (row-or-null) precisely because the
|
|
40
|
-
* group/permission frames serialize a string.
|
|
41
|
-
*/
|
|
42
|
-
export const wireDeltaDataSchema = z
|
|
43
|
-
.union([z.record(z.string(), z.unknown()), z.string()])
|
|
44
|
-
.nullable();
|
|
45
|
-
/**
|
|
46
|
-
* A nested participant reference as carried on a BROADCAST delta. The server
|
|
47
|
-
* hydrates the flat `actor_id`/`actor_kind` stored columns into this.
|
|
48
|
-
*/
|
|
49
|
-
export const participantRefSchema = z.object({
|
|
50
|
-
kind: participantKindSchema,
|
|
51
|
-
id: z.string(),
|
|
52
|
-
});
|
|
53
|
-
/**
|
|
54
|
-
* The fields BOTH server and client agree on for a broadcast delta — the shared
|
|
55
|
-
* contract. `transactionId` is modelled as the client sees it (optional string);
|
|
56
|
-
* the server projection widens it to nullable. No `organizationId` (never
|
|
57
|
-
* broadcast). No `createdBy`/attribution here — those types differ per layer and
|
|
58
|
-
* live in the extensions below.
|
|
59
|
-
*/
|
|
60
|
-
export const syncDeltaWireCoreSchema = z.object({
|
|
61
|
-
id: z.number(),
|
|
62
|
-
actionType: syncDeltaActionSchema,
|
|
63
|
-
modelName: z.string().min(1),
|
|
64
|
-
modelId: z.string().min(1),
|
|
65
|
-
data: wireDeltaDataSchema,
|
|
66
|
-
previousData: wireDeltaDataSchema.optional(),
|
|
67
|
-
syncGroups: z.array(z.string()),
|
|
68
|
-
transactionId: z.string().optional(),
|
|
69
|
-
createdAt: z.string(),
|
|
70
|
-
});
|
|
71
|
-
/**
|
|
72
|
-
* Client projection — core + the SDK-only fields the client reads locally.
|
|
73
|
-
* `z.infer` of this is the SDK's `SyncDelta` (see `sync/SyncWebSocket.ts`).
|
|
74
|
-
*/
|
|
75
|
-
export const clientSyncDeltaSchema = syncDeltaWireCoreSchema.extend({
|
|
76
|
-
/** @deprecated Flat actor id; superseded by the server's nested `actor`. The
|
|
77
|
-
* client never reads it — kept only so the wire shape round-trips. */
|
|
78
|
-
createdBy: z.string().optional(),
|
|
79
|
-
/** Client-only payload slot (e.g. legacy group-change metadata). */
|
|
80
|
-
metadata: wireDeltaDataSchema.optional(),
|
|
81
|
-
/** Echo-matching id the client correlates against its optimistic mutation. */
|
|
82
|
-
clientMutationId: z.string().optional(),
|
|
83
|
-
});
|
|
84
|
-
/**
|
|
85
|
-
* Server projection — core + the audit attribution the server enriches each
|
|
86
|
-
* broadcast with (for the audit pane). The client ignores all of it. Overrides
|
|
87
|
-
* `transactionId` to nullable (the server's stored-column reality).
|
|
88
|
-
*/
|
|
89
|
-
export const serverSyncDeltaSchema = syncDeltaWireCoreSchema.extend({
|
|
90
|
-
transactionId: z.string().nullable(),
|
|
91
|
-
/** @deprecated Mirrors `actor` 1:1. */
|
|
92
|
-
createdBy: participantRefSchema.nullable(),
|
|
93
|
-
/** Who DID the action. */
|
|
94
|
-
actor: participantRefSchema.nullable(),
|
|
95
|
-
/** On WHOSE AUTHORITY they acted (equals `actor` for human-direct commits). */
|
|
96
|
-
onBehalfOf: participantRefSchema.nullable(),
|
|
97
|
-
/** FK to AgentCapabilityRoot.capabilityId; non-null for agent/system commits. */
|
|
98
|
-
capabilityId: z.string().nullable(),
|
|
99
|
-
confirmationState: confirmationStateSchema.nullable(),
|
|
100
|
-
/** FK to AgentTurn.id — the prompt that caused this delta. */
|
|
101
|
-
causedByTaskId: z.string().nullable(),
|
|
102
|
-
});
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `@abloatai/ablo/server` — per-model READ configuration the bootstrap
|
|
3
|
-
* reader consumes. Host-side type config (physical table, tenancy column,
|
|
4
|
-
* parent-scoping) — pure data, no `postgres` — so it lives in the server
|
|
5
|
-
* subpath and feeds the `DataAdapter` read contract. The SQL that consumes it
|
|
6
|
-
* (the bootstrap query builder) stays host-side.
|
|
7
|
-
*/
|
|
8
|
-
/** A field→column mapping with an explicit post-`SELECT *` alias. */
|
|
9
|
-
export interface ColumnOverride {
|
|
10
|
-
readonly field: string;
|
|
11
|
-
readonly column: string;
|
|
12
|
-
readonly alias: string;
|
|
13
|
-
}
|
|
14
|
-
export interface BootstrapModel {
|
|
15
|
-
name: string;
|
|
16
|
-
/**
|
|
17
|
-
* Additional names accepted for request-side lookup/filtering. In DB-canonical
|
|
18
|
-
* mode `name` stays the physical table name, while aliases cover generated
|
|
19
|
-
* compatibility names such as `WeatherReports` / `weatherReports`.
|
|
20
|
-
*/
|
|
21
|
-
aliases?: readonly string[];
|
|
22
|
-
/**
|
|
23
|
-
* Schema key used by source endpoints. `name` remains the wire/result model
|
|
24
|
-
* name, usually the typename; source handlers are keyed by the developer's
|
|
25
|
-
* schema object (`files`, `slideLayers`, ...).
|
|
26
|
-
*/
|
|
27
|
-
sourceModel?: string;
|
|
28
|
-
table: string;
|
|
29
|
-
syncGroups?: string[];
|
|
30
|
-
enabled?: boolean;
|
|
31
|
-
/** Max rows to return. Omit for unlimited. Maps to schema's bootstrapLimit. */
|
|
32
|
-
limit?: number;
|
|
33
|
-
/** SQL ORDER BY clause. Default: 'id'. Maps to schema's bootstrapOrderBy. */
|
|
34
|
-
orderBy?: string;
|
|
35
|
-
/** Whether the table has organization_id. Default: true. */
|
|
36
|
-
orgScoped?: boolean;
|
|
37
|
-
/** Physical tenancy column (default `organization_id`, configurable per model). */
|
|
38
|
-
orgColumn?: string;
|
|
39
|
-
/**
|
|
40
|
-
* Parent-table scoping for rows with no `organization_id` column. Mirrors the
|
|
41
|
-
* schema's `scopedVia` option. When set, the bootstrap query emits:
|
|
42
|
-
*
|
|
43
|
-
* WHERE <table>.<localKey> IN
|
|
44
|
-
* (SELECT <parentKey> FROM <parentTable> WHERE <parentOrgColumn> = $1)
|
|
45
|
-
*
|
|
46
|
-
* Applied IN ADDITION TO whatever `orgScoped` dictates — so a table can have
|
|
47
|
-
* its own `organization_id` AND further narrow via a parent, though the common
|
|
48
|
-
* use is `orgScoped: false` + `scopedVia` on tables that lack the column.
|
|
49
|
-
*/
|
|
50
|
-
scopedVia?: {
|
|
51
|
-
localKey: string;
|
|
52
|
-
parentTable: string;
|
|
53
|
-
parentKey?: string;
|
|
54
|
-
parentOrgColumn?: string;
|
|
55
|
-
};
|
|
56
|
-
/** Client-facing field name → physical DB column for declared fields. */
|
|
57
|
-
fieldColumns?: Record<string, string>;
|
|
58
|
-
/** Physical-column aliases needed after SELECT * for `.from(...)` fields. */
|
|
59
|
-
columnOverrides?: readonly ColumnOverride[];
|
|
60
|
-
/**
|
|
61
|
-
* Physical columns the schema declares as `json` (`field.json()`). A json
|
|
62
|
-
* field stored in a TEXT column comes back from `row_to_json` as a serialized
|
|
63
|
-
* string; the bootstrap re-parses these so the wire is the canonical object
|
|
64
|
-
* regardless of physical column type (jsonb returns objects natively → no-op).
|
|
65
|
-
*/
|
|
66
|
-
jsonColumns?: readonly string[];
|
|
67
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `@abloatai/ablo/server` — per-model READ configuration the bootstrap
|
|
3
|
-
* reader consumes. Host-side type config (physical table, tenancy column,
|
|
4
|
-
* parent-scoping) — pure data, no `postgres` — so it lives in the server
|
|
5
|
-
* subpath and feeds the `DataAdapter` read contract. The SQL that consumes it
|
|
6
|
-
* (the bootstrap query builder) stays host-side.
|
|
7
|
-
*/
|
|
8
|
-
export {};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/** See module note — host-deployment vocabulary, never customer-facing. */
|
|
2
|
-
export declare const storageModeSchema: z.ZodEnum<{
|
|
3
|
-
source: "source";
|
|
4
|
-
hosted: "hosted";
|
|
5
|
-
selfHosted: "selfHosted";
|
|
6
|
-
}>;
|
|
7
|
-
/** See module note — host-deployment vocabulary, never customer-facing. */
|
|
8
|
-
export type StorageMode = z.infer<typeof storageModeSchema>;
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `@abloatai/ablo/server` — the storage-mode vocabulary the `DataAdapter`
|
|
3
|
-
* contract supports. Analogous to Better Auth's adapter `id`/`adapterId`: a
|
|
4
|
-
* diagnostic discriminator on the adapter, NOT a routing switch (routing goes
|
|
5
|
-
* through the resolver/factory). The package owns this enum so the contract and
|
|
6
|
-
* every host adapter agree on the closed set:
|
|
7
|
-
* - `hosted` — Ablo's control-plane database.
|
|
8
|
-
* - `selfHosted` — the customer's database, same execution path as hosted.
|
|
9
|
-
* - `source` — a customer-owned endpoint (credentialless ingestion).
|
|
10
|
-
*
|
|
11
|
-
* Deployment topology, not product vocabulary. Customers never see a
|
|
12
|
-
* "storage mode" — their story is `ablo connect` (WAL replication: reads tail
|
|
13
|
-
* their database's logical-replication stream, the data stays in their DB)
|
|
14
|
-
* with the signed `dataSource()` endpoint as the marked fallback (ADR 0002,
|
|
15
|
-
* docs/decisions/0002-read-path-logical-replication-vs-data-hosting.md).
|
|
16
|
-
* The `databaseUrl` dial-in that this enum's `selfHosted` arm serves is
|
|
17
|
-
* DEPRECATED pending the WAL read cutover — do not build on it.
|
|
18
|
-
* This export exists for the sync-server host only.
|
|
19
|
-
*
|
|
20
|
-
* NOT `@internal`-tagged: tsconfig.build.json sets `stripInternal`, and these
|
|
21
|
-
* symbols are re-exported by `server/index.ts` — tagging them strips them from
|
|
22
|
-
* the emitted d.ts, leaving an empty `export {}` module behind a live
|
|
23
|
-
* re-export. `skipLibCheck` masks the break and `StorageMode` silently
|
|
24
|
-
* degrades to an error-any for every dist consumer (the sync-server host).
|
|
25
|
-
*/
|
|
26
|
-
import { z } from 'zod';
|
|
27
|
-
/** See module note — host-deployment vocabulary, never customer-facing. */
|
|
28
|
-
export const storageModeSchema = z.enum(['hosted', 'source', 'selfHosted']);
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Data Source reverse-channel wire protocol.
|
|
3
|
-
*
|
|
4
|
-
* The `commit`/`load`/`list` leg of Data Source mode is normally an INBOUND
|
|
5
|
-
* webhook (Ablo Cloud → your HTTPS endpoint). That requires a public URL, so it
|
|
6
|
-
* doesn't work on `localhost` or inside a locked-down VPC with no inbound path.
|
|
7
|
-
*
|
|
8
|
-
* The reverse channel inverts the direction: the customer's connector dials OUT
|
|
9
|
-
* to Ablo Cloud over a WebSocket and serves those same requests over the open
|
|
10
|
-
* socket — the Stripe-CLI `stripe listen` pattern. This module defines the
|
|
11
|
-
* frames that travel over that socket.
|
|
12
|
-
*
|
|
13
|
-
* Trust model is unchanged. A `request` frame carries the SAME Standard Webhooks
|
|
14
|
-
* signature headers (`webhook-id` / `webhook-timestamp` / `webhook-signature`)
|
|
15
|
-
* and the SAME raw body Ablo would have POSTed, so the connector verifies it
|
|
16
|
-
* through the unchanged `verifyAbloSourceRequest`. Only the transport differs.
|
|
17
|
-
*
|
|
18
|
-
* Frames are validated with zod at the boundary (matching `contract.ts`): a
|
|
19
|
-
* malformed frame is rejected at the edge, and every wire type is inferred from
|
|
20
|
-
* one schema so the two sides can never silently drift.
|
|
21
|
-
*/
|
|
22
|
-
import { z } from 'zod';
|
|
23
|
-
/**
|
|
24
|
-
* Wire-protocol version. Bumped on any breaking frame-shape change so an old
|
|
25
|
-
* connector talking to a new server (or vice-versa) fails fast at `register`
|
|
26
|
-
* instead of misparsing a frame mid-stream.
|
|
27
|
-
*/
|
|
28
|
-
export declare const SOURCE_CONNECTOR_PROTOCOL_VERSION = 1;
|
|
29
|
-
/** Path the connector dials. Appended to the connector's `baseURL`. */
|
|
30
|
-
export declare const SOURCE_CONNECTOR_WS_PATH = "/v1/source/listen";
|
|
31
|
-
/**
|
|
32
|
-
* Negotiated WebSocket subprotocol that marks a reverse-channel source
|
|
33
|
-
* connector (vs. the SDK sync client's `ablo.sync.v1`). The server selects and
|
|
34
|
-
* echoes back ONLY this value, never the token-bearing subprotocol — keeping the
|
|
35
|
-
* credential out of ALB / proxy logs exactly like the sync socket does.
|
|
36
|
-
*/
|
|
37
|
-
export declare const WS_SOURCE_SUBPROTOCOL = "ablo.source.v1";
|
|
38
|
-
/**
|
|
39
|
-
* Build the `Sec-WebSocket-Protocol` list a connector offers: the source
|
|
40
|
-
* protocol plus the bearer credential (`ablo.bearer.<apiKey>`). Browsers can't
|
|
41
|
-
* set an `Authorization` header on a WebSocket, so the API key rides as a
|
|
42
|
-
* subprotocol — the same mechanism the SDK sync client uses, read server-side by
|
|
43
|
-
* the shared `extractBearer`.
|
|
44
|
-
*/
|
|
45
|
-
export declare function sourceConnectorSubprotocols(apiKey: string): string[];
|
|
46
|
-
/**
|
|
47
|
-
* Connector → server, first frame after the socket opens and authenticates.
|
|
48
|
-
* Auth and source resolution happen at the WS handshake from the API key; this
|
|
49
|
-
* frame only carries protocol negotiation + advisory metadata.
|
|
50
|
-
*/
|
|
51
|
-
export declare const registerFrameSchema: z.ZodObject<{
|
|
52
|
-
type: z.ZodLiteral<"register">;
|
|
53
|
-
protocolVersion: z.ZodNumber;
|
|
54
|
-
client: z.ZodOptional<z.ZodString>;
|
|
55
|
-
}, z.core.$strip>;
|
|
56
|
-
export type RegisterFrame = z.infer<typeof registerFrameSchema>;
|
|
57
|
-
/**
|
|
58
|
-
* Server → connector, acknowledges a successful `register`. Echoes the resolved
|
|
59
|
-
* source identity so the connector can log/verify which source it is serving.
|
|
60
|
-
*/
|
|
61
|
-
export declare const readyFrameSchema: z.ZodObject<{
|
|
62
|
-
type: z.ZodLiteral<"ready">;
|
|
63
|
-
protocolVersion: z.ZodNumber;
|
|
64
|
-
sourceId: z.ZodOptional<z.ZodString>;
|
|
65
|
-
organizationId: z.ZodOptional<z.ZodString>;
|
|
66
|
-
environment: z.ZodOptional<z.ZodEnum<{
|
|
67
|
-
production: "production";
|
|
68
|
-
sandbox: "sandbox";
|
|
69
|
-
}>>;
|
|
70
|
-
}, z.core.$strip>;
|
|
71
|
-
export type ReadyFrame = z.infer<typeof readyFrameSchema>;
|
|
72
|
-
/**
|
|
73
|
-
* Server → connector, one drained `commit`/`load`/`list` request. `headers` and
|
|
74
|
-
* `body` are byte-identical to what the inbound webhook path would have sent —
|
|
75
|
-
* the connector replays them into a synthesized `Request` so the unchanged
|
|
76
|
-
* handler verifies the signature exactly as in production.
|
|
77
|
-
*/
|
|
78
|
-
export declare const requestFrameSchema: z.ZodObject<{
|
|
79
|
-
type: z.ZodLiteral<"request">;
|
|
80
|
-
id: z.ZodString;
|
|
81
|
-
method: z.ZodLiteral<"POST">;
|
|
82
|
-
url: z.ZodString;
|
|
83
|
-
headers: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
84
|
-
body: z.ZodString;
|
|
85
|
-
}, z.core.$strip>;
|
|
86
|
-
export type RequestFrame = z.infer<typeof requestFrameSchema>;
|
|
87
|
-
/**
|
|
88
|
-
* Connector → server, the handler's `Response` for one `request`. The server
|
|
89
|
-
* resolves the pending request keyed by `id` and feeds `status`/`body` back to
|
|
90
|
-
* the `SourceClient` as if an HTTP response had returned.
|
|
91
|
-
*/
|
|
92
|
-
export declare const responseFrameSchema: z.ZodObject<{
|
|
93
|
-
type: z.ZodLiteral<"response">;
|
|
94
|
-
id: z.ZodString;
|
|
95
|
-
status: z.ZodNumber;
|
|
96
|
-
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
97
|
-
body: z.ZodString;
|
|
98
|
-
}, z.core.$strip>;
|
|
99
|
-
export type ResponseFrame = z.infer<typeof responseFrameSchema>;
|
|
100
|
-
/**
|
|
101
|
-
* Either direction, out-of-band failure not tied to a single request body
|
|
102
|
-
* (auth rejected, unsupported protocol version, malformed frame). When `id` is
|
|
103
|
-
* present the error pertains to that pending request and fails it; otherwise it
|
|
104
|
-
* is a connection-level error.
|
|
105
|
-
*/
|
|
106
|
-
export declare const errorFrameSchema: z.ZodObject<{
|
|
107
|
-
type: z.ZodLiteral<"error">;
|
|
108
|
-
id: z.ZodOptional<z.ZodString>;
|
|
109
|
-
code: z.ZodString;
|
|
110
|
-
message: z.ZodString;
|
|
111
|
-
}, z.core.$strip>;
|
|
112
|
-
export type ErrorFrame = z.infer<typeof errorFrameSchema>;
|
|
113
|
-
export declare const connectorFrameSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
114
|
-
type: z.ZodLiteral<"register">;
|
|
115
|
-
protocolVersion: z.ZodNumber;
|
|
116
|
-
client: z.ZodOptional<z.ZodString>;
|
|
117
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
118
|
-
type: z.ZodLiteral<"ready">;
|
|
119
|
-
protocolVersion: z.ZodNumber;
|
|
120
|
-
sourceId: z.ZodOptional<z.ZodString>;
|
|
121
|
-
organizationId: z.ZodOptional<z.ZodString>;
|
|
122
|
-
environment: z.ZodOptional<z.ZodEnum<{
|
|
123
|
-
production: "production";
|
|
124
|
-
sandbox: "sandbox";
|
|
125
|
-
}>>;
|
|
126
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
127
|
-
type: z.ZodLiteral<"request">;
|
|
128
|
-
id: z.ZodString;
|
|
129
|
-
method: z.ZodLiteral<"POST">;
|
|
130
|
-
url: z.ZodString;
|
|
131
|
-
headers: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
132
|
-
body: z.ZodString;
|
|
133
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
134
|
-
type: z.ZodLiteral<"response">;
|
|
135
|
-
id: z.ZodString;
|
|
136
|
-
status: z.ZodNumber;
|
|
137
|
-
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
138
|
-
body: z.ZodString;
|
|
139
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
140
|
-
type: z.ZodLiteral<"error">;
|
|
141
|
-
id: z.ZodOptional<z.ZodString>;
|
|
142
|
-
code: z.ZodString;
|
|
143
|
-
message: z.ZodString;
|
|
144
|
-
}, z.core.$strip>], "type">;
|
|
145
|
-
export type ConnectorFrame = z.infer<typeof connectorFrameSchema>;
|
|
146
|
-
/** Thrown when an incoming frame fails to parse or validate. */
|
|
147
|
-
export declare class ConnectorProtocolError extends Error {
|
|
148
|
-
readonly code = "source_connector_protocol_error";
|
|
149
|
-
constructor(message: string);
|
|
150
|
-
}
|
|
151
|
-
/** Serialize a frame for transmission. */
|
|
152
|
-
export declare function encodeFrame(frame: ConnectorFrame): string;
|
|
153
|
-
/**
|
|
154
|
-
* Parse + validate an incoming frame. Accepts the string or binary payloads the
|
|
155
|
-
* `ws` library / WebSocket `message` events deliver. Throws
|
|
156
|
-
* `ConnectorProtocolError` on any malformed or unknown frame so callers can
|
|
157
|
-
* reject the connection rather than act on garbage.
|
|
158
|
-
*/
|
|
159
|
-
export declare function decodeFrame(raw: string | ArrayBuffer | Uint8Array): ConnectorFrame;
|