@abloatai/ablo 0.26.0 → 0.28.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 +42 -2
- package/README.md +102 -86
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +134 -151
- package/dist/Database.d.ts +68 -69
- package/dist/Database.js +316 -135
- 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 +54 -52
- package/dist/Model.js +78 -62
- 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 +122 -118
- package/dist/SyncClient.js +541 -245
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +10 -9
- package/dist/adapters/inMemoryStorage.js +21 -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 +173 -121
- package/dist/client/Ablo.d.ts +97 -74
- package/dist/client/Ablo.js +129 -163
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +442 -81
- 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 +16 -17
- package/dist/client/createInternalComponents.js +26 -31
- 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 +59 -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 +78 -87
- package/dist/client/options.d.ts +157 -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 +16 -20
- package/dist/client/wsMutationExecutor.js +18 -23
- package/dist/commit/contract.d.ts +493 -0
- package/dist/commit/contract.js +187 -0
- package/dist/commit/index.d.ts +6 -0
- package/dist/commit/index.js +5 -0
- 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 +14 -14
- package/dist/core/StoreManager.js +33 -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 +137 -134
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +36 -27
- package/dist/index.js +91 -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 +124 -131
- package/dist/mutators/UndoManager.js +177 -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 +28 -25
- package/dist/react/useAblo.js +41 -17
- 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 +3 -3
- 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 +64 -43
- 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 +24 -12
- package/dist/stores/ObjectStore.js +38 -16
- package/dist/stores/ObjectStoreContract.d.ts +14 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +29 -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 +141 -166
- 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/persistedPrefix.d.ts +12 -0
- package/dist/sync/persistedPrefix.js +22 -0
- 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 +5 -3
- package/dist/testing/index.js +3 -2
- package/dist/testing/mocks/FakeDatabase.d.ts +18 -0
- package/dist/testing/mocks/FakeDatabase.js +10 -0
- 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 +28 -23
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +244 -181
- package/dist/transactions/TransactionQueue.js +929 -423
- 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/commitEnvelope.d.ts +132 -0
- package/dist/transactions/commitEnvelope.js +139 -0
- package/dist/transactions/commitOutboxStore.d.ts +32 -0
- package/dist/transactions/commitOutboxStore.js +26 -0
- package/dist/transactions/commitPayload.d.ts +63 -52
- package/dist/transactions/commitPayload.js +54 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/httpCommitEnvelope.d.ts +43 -0
- package/dist/transactions/httpCommitEnvelope.js +179 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +182 -0
- package/dist/transactions/replayValidation.js +156 -0
- 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/wire/bootstrapReason.d.ts +9 -0
- package/dist/wire/bootstrapReason.js +8 -0
- 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 +315 -86
- package/dist/wire/frames.js +47 -33
- package/dist/wire/index.d.ts +18 -14
- package/dist/wire/index.js +32 -27
- 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/api.md +10 -10
- package/docs/coordination.md +59 -0
- package/docs/mcp.md +1 -1
- package/package.json +17 -11
- 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/transactions/persistedReplay.d.ts +0 -93
- package/dist/transactions/persistedReplay.js +0 -105
- package/dist/utils/mobx-setup.d.ts +0 -42
package/dist/types/streams.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The types for real-time multiplayer coordination.
|
|
3
3
|
*
|
|
4
|
-
* Ablo treats
|
|
5
|
-
* entities.
|
|
6
|
-
*
|
|
7
|
-
* long-running AI work.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* Ablo treats people and AI agents alike as participants working on live
|
|
5
|
+
* application entities. A participant announces what it is reading or editing,
|
|
6
|
+
* claims an entity before writing to it, and captures a context snapshot before
|
|
7
|
+
* starting long-running AI work. You keep your own schema, agent stack, tools,
|
|
8
|
+
* prompts, and product rules; this package provides the shared coordination
|
|
9
|
+
* layer underneath.
|
|
10
10
|
*/
|
|
11
11
|
export {};
|
|
@@ -1,41 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Turns a callback-based subscription into an async iterable that yields the
|
|
3
|
+
* latest snapshot each time the source changes. You supply two functions:
|
|
4
|
+
* `subscribe(listener)`, which registers your listener and returns a teardown
|
|
5
|
+
* function, and `getSnapshot()`, which reads the current value. On every change
|
|
6
|
+
* notification the iterator calls `getSnapshot()` and hands the result to the
|
|
7
|
+
* consumer's `for await` loop; when the loop ends, the iterator runs the
|
|
8
|
+
* teardown function.
|
|
4
9
|
*
|
|
5
|
-
*
|
|
10
|
+
* Because each notification yields the current snapshot rather than a specific
|
|
11
|
+
* event, bursts coalesce harmlessly — a consumer that falls behind still ends up
|
|
12
|
+
* with the freshest value. The queue is unbounded, so a consumer that never
|
|
13
|
+
* advances lets memory grow without limit. When individual events matter and
|
|
14
|
+
* must not be dropped, use {@link asyncIteratorFromEvents} instead.
|
|
6
15
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* we tear it down in `return()`.
|
|
11
|
-
* - `getSnapshot()` — read the latest value to hand to the
|
|
12
|
-
* consumer. Called on every mutation notification.
|
|
13
|
-
*
|
|
14
|
-
* Back-pressure: an unlimited queue. If the consumer is slower than
|
|
15
|
-
* the producer (rare for presence — mutations are <1/s per peer),
|
|
16
|
-
* memory grows monotonically inside the iterator. For the current
|
|
17
|
-
* presence workload this is fine; if we ever surface a high-frequency
|
|
18
|
-
* stream (deltas at full firehose) we can bound the queue or drop
|
|
19
|
-
* coalescable values.
|
|
20
|
-
*
|
|
21
|
-
* Multiple iterators: each call to the returned factory creates an
|
|
22
|
-
* independent iterator with its own subscription. Iterators don't
|
|
23
|
-
* steal values from each other — two `for await` loops on the same
|
|
24
|
-
* stream both observe every mutation.
|
|
16
|
+
* Each call to the factory creates an independent iterator with its own
|
|
17
|
+
* subscription. Two `for await` loops over the same source each observe every
|
|
18
|
+
* change; they do not take values from one another.
|
|
25
19
|
*/
|
|
26
20
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* pushed by each event. Use when the underlying stream delivers
|
|
33
|
-
* discrete events that must not be dropped — e.g. `DeltaEnvelope`
|
|
34
|
-
* firehose.
|
|
21
|
+
* Turns a callback-based subscription into an async iterable that yields each
|
|
22
|
+
* discrete event, in order, with none dropped. You supply a single
|
|
23
|
+
* `subscribe(push)` function: it registers your producer and returns a teardown
|
|
24
|
+
* function, and your producer calls `push(value)` once per event. The consumer's
|
|
25
|
+
* `for await` loop receives every pushed value.
|
|
35
26
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
27
|
+
* This is the counterpart to {@link asyncIteratorFrom}. Reach for that one when
|
|
28
|
+
* you only need the latest state and coalescing bursts is fine; reach for this
|
|
29
|
+
* one when every event is significant — for example a stream of change deltas
|
|
30
|
+
* where skipping one would lose data. The queue is unbounded, so a consumer that
|
|
31
|
+
* stops advancing lets memory grow without limit.
|
|
39
32
|
*/
|
|
40
33
|
export declare function asyncIteratorFromEvents<T>(subscribe: (push: (value: T) => void) => () => void): AsyncIterableIterator<T>;
|
|
41
34
|
export declare function asyncIteratorFrom<T>(subscribe: (listener: () => void) => () => void, getSnapshot: () => T): AsyncIterableIterator<T>;
|
|
@@ -1,41 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Turns a callback-based subscription into an async iterable that yields the
|
|
3
|
+
* latest snapshot each time the source changes. You supply two functions:
|
|
4
|
+
* `subscribe(listener)`, which registers your listener and returns a teardown
|
|
5
|
+
* function, and `getSnapshot()`, which reads the current value. On every change
|
|
6
|
+
* notification the iterator calls `getSnapshot()` and hands the result to the
|
|
7
|
+
* consumer's `for await` loop; when the loop ends, the iterator runs the
|
|
8
|
+
* teardown function.
|
|
4
9
|
*
|
|
5
|
-
*
|
|
10
|
+
* Because each notification yields the current snapshot rather than a specific
|
|
11
|
+
* event, bursts coalesce harmlessly — a consumer that falls behind still ends up
|
|
12
|
+
* with the freshest value. The queue is unbounded, so a consumer that never
|
|
13
|
+
* advances lets memory grow without limit. When individual events matter and
|
|
14
|
+
* must not be dropped, use {@link asyncIteratorFromEvents} instead.
|
|
6
15
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* we tear it down in `return()`.
|
|
11
|
-
* - `getSnapshot()` — read the latest value to hand to the
|
|
12
|
-
* consumer. Called on every mutation notification.
|
|
13
|
-
*
|
|
14
|
-
* Back-pressure: an unlimited queue. If the consumer is slower than
|
|
15
|
-
* the producer (rare for presence — mutations are <1/s per peer),
|
|
16
|
-
* memory grows monotonically inside the iterator. For the current
|
|
17
|
-
* presence workload this is fine; if we ever surface a high-frequency
|
|
18
|
-
* stream (deltas at full firehose) we can bound the queue or drop
|
|
19
|
-
* coalescable values.
|
|
20
|
-
*
|
|
21
|
-
* Multiple iterators: each call to the returned factory creates an
|
|
22
|
-
* independent iterator with its own subscription. Iterators don't
|
|
23
|
-
* steal values from each other — two `for await` loops on the same
|
|
24
|
-
* stream both observe every mutation.
|
|
16
|
+
* Each call to the factory creates an independent iterator with its own
|
|
17
|
+
* subscription. Two `for await` loops over the same source each observe every
|
|
18
|
+
* change; they do not take values from one another.
|
|
25
19
|
*/
|
|
26
20
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* pushed by each event. Use when the underlying stream delivers
|
|
33
|
-
* discrete events that must not be dropped — e.g. `DeltaEnvelope`
|
|
34
|
-
* firehose.
|
|
21
|
+
* Turns a callback-based subscription into an async iterable that yields each
|
|
22
|
+
* discrete event, in order, with none dropped. You supply a single
|
|
23
|
+
* `subscribe(push)` function: it registers your producer and returns a teardown
|
|
24
|
+
* function, and your producer calls `push(value)` once per event. The consumer's
|
|
25
|
+
* `for await` loop receives every pushed value.
|
|
35
26
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
27
|
+
* This is the counterpart to {@link asyncIteratorFrom}. Reach for that one when
|
|
28
|
+
* you only need the latest state and coalescing bursts is fine; reach for this
|
|
29
|
+
* one when every event is significant — for example a stream of change deltas
|
|
30
|
+
* where skipping one would lose data. The queue is unbounded, so a consumer that
|
|
31
|
+
* stops advancing lets memory grow without limit.
|
|
39
32
|
*/
|
|
40
33
|
export function asyncIteratorFromEvents(subscribe) {
|
|
41
34
|
const queue = [];
|
package/dist/utils/duration.d.ts
CHANGED
|
@@ -1,28 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* The same TTL flavor every config-driven tool uses (Vercel's `ms`,
|
|
5
|
-
* Zod's `.duration()`, a hundred CLIs). Zero deps, one regex, three
|
|
6
|
-
* units that cover everything the SDK needs:
|
|
2
|
+
* Parses a duration into milliseconds. A duration is either a number of seconds
|
|
3
|
+
* or a string with a unit suffix — milliseconds, seconds, minutes, or hours:
|
|
7
4
|
*
|
|
8
5
|
* - `'500ms'` → 500 ms
|
|
9
6
|
* - `'30s'` → 30 000 ms
|
|
10
7
|
* - `'3m'` → 180 000 ms
|
|
11
8
|
* - `'24h'` → 86 400 000 ms
|
|
12
9
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* the input type.
|
|
10
|
+
* A bare number is interpreted as seconds rather than milliseconds, matching the
|
|
11
|
+
* `ttlSeconds` fields used throughout the SDK, so a numeric caller and a string
|
|
12
|
+
* caller can pass the same field interchangeably. {@link toMs} returns
|
|
13
|
+
* milliseconds; {@link toSeconds} returns whole seconds.
|
|
18
14
|
*/
|
|
19
15
|
export type Duration = number | `${number}ms` | `${number}s` | `${number}m` | `${number}h`;
|
|
20
16
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
17
|
+
* Parses a duration and returns the equivalent number of milliseconds. Accepts
|
|
18
|
+
* either a bare number, interpreted as seconds, or a unit-suffixed string such
|
|
19
|
+
* as `'500ms'`, `'30s'`, `'3m'`, or `'24h'`. Throws an
|
|
20
|
+
* {@link AbloValidationError} with code `duration_invalid` when a string does
|
|
21
|
+
* not match a supported unit.
|
|
25
22
|
*/
|
|
26
23
|
export declare function toMs(input: Duration): number;
|
|
27
|
-
/**
|
|
24
|
+
/** Parses a duration like {@link toMs} but returns whole seconds, rounding down. */
|
|
28
25
|
export declare function toSeconds(input: Duration): number;
|
package/dist/utils/duration.js
CHANGED
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* The same TTL flavor every config-driven tool uses (Vercel's `ms`,
|
|
5
|
-
* Zod's `.duration()`, a hundred CLIs). Zero deps, one regex, three
|
|
6
|
-
* units that cover everything the SDK needs:
|
|
2
|
+
* Parses a duration into milliseconds. A duration is either a number of seconds
|
|
3
|
+
* or a string with a unit suffix — milliseconds, seconds, minutes, or hours:
|
|
7
4
|
*
|
|
8
5
|
* - `'500ms'` → 500 ms
|
|
9
6
|
* - `'30s'` → 30 000 ms
|
|
10
7
|
* - `'3m'` → 180 000 ms
|
|
11
8
|
* - `'24h'` → 86 400 000 ms
|
|
12
9
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* the input type.
|
|
10
|
+
* A bare number is interpreted as seconds rather than milliseconds, matching the
|
|
11
|
+
* `ttlSeconds` fields used throughout the SDK, so a numeric caller and a string
|
|
12
|
+
* caller can pass the same field interchangeably. {@link toMs} returns
|
|
13
|
+
* milliseconds; {@link toSeconds} returns whole seconds.
|
|
18
14
|
*/
|
|
19
15
|
import { AbloValidationError } from '../errors.js';
|
|
20
16
|
const PATTERN = /^(\d+(?:\.\d+)?)(ms|s|m|h)$/;
|
|
@@ -25,10 +21,11 @@ const UNIT_MS = {
|
|
|
25
21
|
h: 3_600_000,
|
|
26
22
|
};
|
|
27
23
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
24
|
+
* Parses a duration and returns the equivalent number of milliseconds. Accepts
|
|
25
|
+
* either a bare number, interpreted as seconds, or a unit-suffixed string such
|
|
26
|
+
* as `'500ms'`, `'30s'`, `'3m'`, or `'24h'`. Throws an
|
|
27
|
+
* {@link AbloValidationError} with code `duration_invalid` when a string does
|
|
28
|
+
* not match a supported unit.
|
|
32
29
|
*/
|
|
33
30
|
export function toMs(input) {
|
|
34
31
|
if (typeof input === 'number')
|
|
@@ -42,7 +39,7 @@ export function toMs(input) {
|
|
|
42
39
|
const unit = match[2];
|
|
43
40
|
return value * UNIT_MS[unit];
|
|
44
41
|
}
|
|
45
|
-
/**
|
|
42
|
+
/** Parses a duration like {@link toMs} but returns whole seconds, rounding down. */
|
|
46
43
|
export function toSeconds(input) {
|
|
47
44
|
return Math.floor(toMs(input) / 1_000);
|
|
48
45
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wires a model instance into MobX so its schema-defined fields become
|
|
3
|
+
* observable and its mutations are tracked. This module reads the property
|
|
4
|
+
* metadata generated from a schema and applies the matching MobX annotation to
|
|
5
|
+
* each field, leaving any hand-written getter or setter in place.
|
|
6
|
+
*/
|
|
7
|
+
import { type AnnotationMapEntry } from 'mobx';
|
|
8
|
+
import { type PropertyMetadata, type ReferenceMetadata } from '../types/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* The subset of a model instance that {@link M1} reads and writes. A model calls
|
|
11
|
+
* {@link M1} from its constructor, where these members exist on `this`;
|
|
12
|
+
* declaring them here lets {@link M1} reference them without loose casts. Every
|
|
13
|
+
* member is optional, so a partial model — such as a test fixture — still
|
|
14
|
+
* satisfies the type.
|
|
15
|
+
*/
|
|
16
|
+
interface M1Target {
|
|
17
|
+
_hasCustomObservability?: boolean;
|
|
18
|
+
_isConstructing?: boolean;
|
|
19
|
+
_extraMobxAnnotations?: Record<string, AnnotationMapEntry>;
|
|
20
|
+
setupObservability?(): void;
|
|
21
|
+
propertyChanged?(name: string, oldValue: unknown, newValue: unknown): void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Makes a model instance's schema-defined properties observable with MobX. For
|
|
25
|
+
* each field it reads the {@link PropertyMetadata} and applies the matching MobX
|
|
26
|
+
* annotation — a plain observable for stored values, a computed for derived
|
|
27
|
+
* getters, and an action for mutating methods — while leaving any field that
|
|
28
|
+
* already declares its own getter and setter untouched. If the model provides
|
|
29
|
+
* its own `setupObservability` or sets `_hasCustomObservability`, this function
|
|
30
|
+
* defers to it and does nothing.
|
|
31
|
+
*/
|
|
32
|
+
export declare function M1<T extends M1Target>(target: T, propertyMetadata: Map<string, PropertyMetadata>, referenceMetadata?: Map<string, ReferenceMetadata>): void;
|
|
33
|
+
/**
|
|
34
|
+
* Wraps a model class so every instance is made observable at construction time
|
|
35
|
+
* by calling {@link M1}. A class that manages its own observability — one whose
|
|
36
|
+
* prototype declares `setupObservability` or `_hasCustomObservability` — is
|
|
37
|
+
* returned unchanged. The wrapper preserves the original class name and its
|
|
38
|
+
* static members.
|
|
39
|
+
*/
|
|
40
|
+
export declare function makeModelObservable(modelClass: any, propertyMetadata: Map<string, PropertyMetadata>, referenceMetadata?: Map<string, any>): any;
|
|
41
|
+
/**
|
|
42
|
+
* Reports whether a named property is one that {@link M1} makes observable —
|
|
43
|
+
* that is, a stored value, an ephemeral value, a reference collection, or a
|
|
44
|
+
* reference array. Returns `false` for an unknown property and for a computed
|
|
45
|
+
* reference.
|
|
46
|
+
*/
|
|
47
|
+
export declare function isObservableProperty(target: any, propName: string, propertyMetadata: Map<string, PropertyMetadata>): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Returns the names of the properties that {@link M1} treats as computed: the
|
|
50
|
+
* referenced-model and back-reference fields derived from a foreign key.
|
|
51
|
+
*/
|
|
52
|
+
export declare function getComputedProperties(propertyMetadata: Map<string, PropertyMetadata>): string[];
|
|
53
|
+
export {};
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Wires a model instance into MobX so its schema-defined fields become
|
|
3
|
+
* observable and its mutations are tracked. This module reads the property
|
|
4
|
+
* metadata generated from a schema and applies the matching MobX annotation to
|
|
5
|
+
* each field, leaving any hand-written getter or setter in place.
|
|
5
6
|
*/
|
|
6
7
|
import { observable, makeObservable, action, computed, observe, } from 'mobx';
|
|
7
8
|
import { PropertyType } from '../types/index.js';
|
|
8
9
|
import { getContext } from '../context.js';
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* Makes a model instance's schema-defined properties observable with MobX. For
|
|
12
|
+
* each field it reads the {@link PropertyMetadata} and applies the matching MobX
|
|
13
|
+
* annotation — a plain observable for stored values, a computed for derived
|
|
14
|
+
* getters, and an action for mutating methods — while leaving any field that
|
|
15
|
+
* already declares its own getter and setter untouched. If the model provides
|
|
16
|
+
* its own `setupObservability` or sets `_hasCustomObservability`, this function
|
|
17
|
+
* defers to it and does nothing.
|
|
13
18
|
*/
|
|
14
19
|
export function M1(target, propertyMetadata, referenceMetadata) {
|
|
15
20
|
// MobX accepts an annotations map keyed by PropertyKey. We build it
|
|
@@ -168,27 +173,18 @@ export function M1(target, propertyMetadata, referenceMetadata) {
|
|
|
168
173
|
// Only apply if we have annotations to apply
|
|
169
174
|
if (Object.keys(annotations).length > 0) {
|
|
170
175
|
makeObservable(target, annotations);
|
|
171
|
-
// Bridge MobX's observable setter to `propertyChanged()` so
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
//
|
|
176
|
+
// Bridge MobX's observable setter to `propertyChanged()` so a direct
|
|
177
|
+
// assignment like `layer.position = newPos` still records a change for the
|
|
178
|
+
// transaction queue, and the update reaches the server. Product code
|
|
179
|
+
// assigns model properties directly in many places (drag, resize,
|
|
180
|
+
// formatting, keyboard nudge, AI tools), so those writes must sync.
|
|
175
181
|
//
|
|
176
|
-
//
|
|
177
|
-
//
|
|
178
|
-
//
|
|
179
|
-
//
|
|
180
|
-
//
|
|
181
|
-
//
|
|
182
|
-
// keyboard nudge, AI tools, etc.) still assigns properties directly,
|
|
183
|
-
// and making that silently not sync was the regression that broke
|
|
184
|
-
// all slide-layer edits.
|
|
185
|
-
//
|
|
186
|
-
// `observe()` attaches a post-set listener WITHOUT replacing MobX's
|
|
187
|
-
// accessors — so the observable keeps its normal reactivity and we
|
|
188
|
-
// get a synchronous change event we can forward to
|
|
189
|
-
// `propertyChanged()`. We scope it to `PropertyType.property`
|
|
190
|
-
// (persisted fields) so ephemeral UI state and computed/reference
|
|
191
|
-
// virtual fields don't leak into `modifiedProperties`.
|
|
182
|
+
// `observe()` attaches a post-set listener without replacing MobX's
|
|
183
|
+
// accessors, so the observable keeps its normal reactivity and we get a
|
|
184
|
+
// synchronous change event to forward to `propertyChanged()`. Only
|
|
185
|
+
// persisted fields (`PropertyType.property`) are observed, so ephemeral UI
|
|
186
|
+
// state and computed or reference fields do not leak into
|
|
187
|
+
// `modifiedProperties`.
|
|
192
188
|
//
|
|
193
189
|
// Construction-time writes (the constructor's initial field
|
|
194
190
|
// population from wire data) also fire `observe` — so we gate with
|
|
@@ -199,16 +195,15 @@ export function M1(target, propertyMetadata, referenceMetadata) {
|
|
|
199
195
|
for (const [propName, metadata] of propertyMetadata) {
|
|
200
196
|
if (metadata.type !== PropertyType.property)
|
|
201
197
|
continue;
|
|
202
|
-
// Only
|
|
203
|
-
//
|
|
204
|
-
// `Object.getOwnPropertyDescriptor(target, propName).get/set
|
|
205
|
-
// `makeObservable(target, annotations)` has
|
|
206
|
-
//
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
// send, and the server acked a no-op mutation.
|
|
198
|
+
// Only entries annotated as `observable` are safe to `observe()`. Do
|
|
199
|
+
// not gate on
|
|
200
|
+
// `Object.getOwnPropertyDescriptor(target, propName).get/set`:
|
|
201
|
+
// `makeObservable(target, annotations)` has already installed its own
|
|
202
|
+
// getter/setter by this point, so that descriptor check flags every
|
|
203
|
+
// field as custom and silently skips every observer. That mistake left
|
|
204
|
+
// `modifiedProperties` empty for dynamic models, so the transaction
|
|
205
|
+
// queue found no changes to send and the server acked a no-op
|
|
206
|
+
// mutation.
|
|
212
207
|
if (!(propName in annotations))
|
|
213
208
|
continue;
|
|
214
209
|
// Accept any flavor of `observable` (deep, ref, shallow). `observe()`
|
|
@@ -272,66 +267,11 @@ export function M1(target, propertyMetadata, referenceMetadata) {
|
|
|
272
267
|
}
|
|
273
268
|
}
|
|
274
269
|
/**
|
|
275
|
-
*
|
|
276
|
-
*
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
// Only track regular properties
|
|
281
|
-
if (metadata.type !== PropertyType.property &&
|
|
282
|
-
metadata.type !== PropertyType.ephemeralProperty) {
|
|
283
|
-
continue;
|
|
284
|
-
}
|
|
285
|
-
// Check if property already has custom getter/setter
|
|
286
|
-
const descriptor = Object.getOwnPropertyDescriptor(target, propName);
|
|
287
|
-
if (descriptor && (descriptor.get || descriptor.set)) {
|
|
288
|
-
// Property already managed, skip
|
|
289
|
-
continue;
|
|
290
|
-
}
|
|
291
|
-
// Check prototype chain
|
|
292
|
-
let proto = Object.getPrototypeOf(target);
|
|
293
|
-
let hasCustomAccessor = false;
|
|
294
|
-
while (proto && proto !== Object.prototype) {
|
|
295
|
-
const protoDescriptor = Object.getOwnPropertyDescriptor(proto, propName);
|
|
296
|
-
if (protoDescriptor && (protoDescriptor.get || protoDescriptor.set)) {
|
|
297
|
-
hasCustomAccessor = true;
|
|
298
|
-
break;
|
|
299
|
-
}
|
|
300
|
-
proto = Object.getPrototypeOf(proto);
|
|
301
|
-
}
|
|
302
|
-
if (hasCustomAccessor) {
|
|
303
|
-
continue;
|
|
304
|
-
}
|
|
305
|
-
// Only add tracking if property exists and isn't already tracked
|
|
306
|
-
if (propName in target) {
|
|
307
|
-
const currentValue = target[propName];
|
|
308
|
-
// Store value in a private field
|
|
309
|
-
const privateField = `_tracked_${propName}`;
|
|
310
|
-
target[privateField] = currentValue;
|
|
311
|
-
// Create simple getter/setter for tracking
|
|
312
|
-
Object.defineProperty(target, propName, {
|
|
313
|
-
get() {
|
|
314
|
-
return this[privateField];
|
|
315
|
-
},
|
|
316
|
-
set(newValue) {
|
|
317
|
-
const oldValue = this[privateField];
|
|
318
|
-
if (oldValue !== newValue) {
|
|
319
|
-
this[privateField] = newValue;
|
|
320
|
-
// Only track changes for non-ephemeral properties
|
|
321
|
-
if (metadata.type === PropertyType.property && this.propertyChanged) {
|
|
322
|
-
this.propertyChanged(propName, oldValue, newValue);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
},
|
|
326
|
-
enumerable: true,
|
|
327
|
-
configurable: true,
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Helper to make a class observable
|
|
334
|
-
* For classes that don't have custom observability
|
|
270
|
+
* Wraps a model class so every instance is made observable at construction time
|
|
271
|
+
* by calling {@link M1}. A class that manages its own observability — one whose
|
|
272
|
+
* prototype declares `setupObservability` or `_hasCustomObservability` — is
|
|
273
|
+
* returned unchanged. The wrapper preserves the original class name and its
|
|
274
|
+
* static members.
|
|
335
275
|
*/
|
|
336
276
|
export function makeModelObservable(modelClass, propertyMetadata, referenceMetadata) {
|
|
337
277
|
// Check if class already handles observability
|
|
@@ -355,7 +295,10 @@ export function makeModelObservable(modelClass, propertyMetadata, referenceMetad
|
|
|
355
295
|
return WrappedClass;
|
|
356
296
|
}
|
|
357
297
|
/**
|
|
358
|
-
*
|
|
298
|
+
* Reports whether a named property is one that {@link M1} makes observable —
|
|
299
|
+
* that is, a stored value, an ephemeral value, a reference collection, or a
|
|
300
|
+
* reference array. Returns `false` for an unknown property and for a computed
|
|
301
|
+
* reference.
|
|
359
302
|
*/
|
|
360
303
|
export function isObservableProperty(target, propName, propertyMetadata) {
|
|
361
304
|
const metadata = propertyMetadata.get(propName);
|
|
@@ -369,7 +312,8 @@ export function isObservableProperty(target, propName, propertyMetadata) {
|
|
|
369
312
|
].includes(metadata.type);
|
|
370
313
|
}
|
|
371
314
|
/**
|
|
372
|
-
*
|
|
315
|
+
* Returns the names of the properties that {@link M1} treats as computed: the
|
|
316
|
+
* referenced-model and back-reference fields derived from a foreign key.
|
|
373
317
|
*/
|
|
374
318
|
export function getComputedProperties(propertyMetadata) {
|
|
375
319
|
const computed = [];
|
|
@@ -1,38 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* A
|
|
3
|
-
*
|
|
2
|
+
* A webhook event delivered to a customer's endpoint, representing a single
|
|
3
|
+
* committed change to a row. {@link deltaToWebhookEvent} produces it, and the
|
|
4
|
+
* recipient verifies the delivery signature before trusting its contents.
|
|
4
5
|
*/
|
|
5
6
|
export interface AbloWebhookEvent {
|
|
6
|
-
/**
|
|
7
|
+
/** A stable, unique event identifier equal to `String(syncId)`. Use it to
|
|
8
|
+
* deduplicate deliveries. */
|
|
7
9
|
readonly id: string;
|
|
8
|
-
/** `<model>.<verb>`,
|
|
10
|
+
/** The event type, formatted as `<model>.<verb>`, such as `"slide.updated"`.
|
|
11
|
+
* Branch on this to route the event. */
|
|
9
12
|
readonly type: string;
|
|
10
|
-
/**
|
|
13
|
+
/** The name of the model whose row changed, such as `"Slide"`. */
|
|
11
14
|
readonly model: string;
|
|
12
|
-
/** The
|
|
15
|
+
/** The identifier of the row that changed. */
|
|
13
16
|
readonly objectId: string;
|
|
14
|
-
/**
|
|
17
|
+
/** The change's position in the transaction log, increasing monotonically.
|
|
18
|
+
* Order events by this value. */
|
|
15
19
|
readonly syncId: number;
|
|
16
|
-
/** The
|
|
17
|
-
*
|
|
20
|
+
/** The row as it stands after the change, or `null` when the change was a
|
|
21
|
+
* delete. */
|
|
18
22
|
readonly data: Record<string, unknown> | null;
|
|
19
|
-
/**
|
|
23
|
+
/** The time the change was committed, as an ISO 8601 timestamp. */
|
|
20
24
|
readonly createdAt: string;
|
|
21
25
|
}
|
|
22
|
-
/** The minimal delta shape
|
|
26
|
+
/** The minimal delta shape {@link deltaToWebhookEvent} reads; a full server-side
|
|
27
|
+
* delta record satisfies it. */
|
|
23
28
|
export interface WebhookSourceDelta {
|
|
24
29
|
readonly id: number;
|
|
25
30
|
readonly actionType: string;
|
|
26
31
|
readonly modelName: string;
|
|
27
32
|
readonly modelId: string;
|
|
28
|
-
/**
|
|
33
|
+
/** The row payload: an already-parsed object, a raw JSON string, or `null`. */
|
|
29
34
|
readonly data: Record<string, unknown> | string | null;
|
|
30
35
|
readonly createdAt: string;
|
|
31
36
|
}
|
|
32
37
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* the caller
|
|
36
|
-
*
|
|
38
|
+
* Converts a committed delta into an {@link AbloWebhookEvent}. Returns `null`
|
|
39
|
+
* when the delta records an internal permission or group change rather than a
|
|
40
|
+
* row-level change, in which case the caller emits no webhook. The mapping is
|
|
41
|
+
* deterministic: the event id and timestamp come directly from the delta.
|
|
37
42
|
*/
|
|
38
43
|
export declare function deltaToWebhookEvent(delta: WebhookSourceDelta): AbloWebhookEvent | null;
|
package/dist/webhooks/events.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Maps each delta action code to the verb that appears in an event type. Only
|
|
3
|
+
* the row-level create, update, delete, archive, and unarchive actions produce a
|
|
4
|
+
* webhook. The remaining action codes describe internal permission and
|
|
5
|
+
* visibility changes and are deliberately absent, so {@link deltaToWebhookEvent}
|
|
6
|
+
* returns `null` for them.
|
|
5
7
|
*/
|
|
6
8
|
const ACTION_VERB = {
|
|
7
9
|
I: 'created',
|
|
@@ -19,15 +21,15 @@ function parseRow(data) {
|
|
|
19
21
|
return data;
|
|
20
22
|
}
|
|
21
23
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* the caller
|
|
25
|
-
*
|
|
24
|
+
* Converts a committed delta into an {@link AbloWebhookEvent}. Returns `null`
|
|
25
|
+
* when the delta records an internal permission or group change rather than a
|
|
26
|
+
* row-level change, in which case the caller emits no webhook. The mapping is
|
|
27
|
+
* deterministic: the event id and timestamp come directly from the delta.
|
|
26
28
|
*/
|
|
27
29
|
export function deltaToWebhookEvent(delta) {
|
|
28
30
|
const verb = ACTION_VERB[delta.actionType];
|
|
29
31
|
if (!verb)
|
|
30
|
-
return null; //
|
|
32
|
+
return null; // an internal permission or group change, not a customer event
|
|
31
33
|
return {
|
|
32
34
|
id: String(delta.id),
|
|
33
35
|
type: `${delta.modelName.toLowerCase()}.${verb}`,
|
package/dist/webhooks/index.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* the open Standard Webhooks library (`svix` / `standardwebhooks`), so Ablo
|
|
8
|
-
* ships no crypto.
|
|
2
|
+
* The public entry point for webhooks. Import {@link AbloWebhookEvent} to type
|
|
3
|
+
* your event handler, and use {@link deltaToWebhookEvent} to turn a committed
|
|
4
|
+
* change from the transaction log into an event to deliver. This module does not
|
|
5
|
+
* verify signatures and ships no cryptography; recipients verify deliveries with
|
|
6
|
+
* a standard webhooks library.
|
|
9
7
|
*/
|
|
10
8
|
export { deltaToWebhookEvent, type AbloWebhookEvent, type WebhookSourceDelta, } from './events.js';
|