@abloatai/ablo 0.34.1 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +674 -5
- package/README.md +39 -22
- package/dist/BaseSyncedStore.d.ts +152 -44
- package/dist/BaseSyncedStore.js +300 -184
- package/dist/Database.d.ts +9 -24
- package/dist/Database.js +37 -22
- package/dist/InstanceCache.d.ts +25 -4
- package/dist/InstanceCache.js +48 -15
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +6 -6
- package/dist/Model.js +10 -10
- package/dist/ModelRegistry.d.ts +4 -4
- package/dist/ModelRegistry.js +3 -3
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +42 -32
- package/dist/SyncClient.js +166 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
- package/dist/ai-sdk/coordinatedTool.js +1 -1
- package/dist/ai-sdk/coordinationContext.d.ts +2 -2
- package/dist/ai-sdk/coordinationContext.js +1 -1
- package/dist/ai-sdk/wrap.d.ts +3 -3
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/index.d.ts +1 -156
- package/dist/auth/index.js +8 -301
- package/dist/cli.cjs +3344 -1073
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +118 -963
- package/dist/client/abloClient.d.ts +309 -0
- package/dist/client/abloClient.js +13 -0
- package/dist/client/clientPrelude.d.ts +52 -0
- package/dist/client/clientPrelude.js +60 -0
- package/dist/client/consoleLogger.d.ts +2 -2
- package/dist/client/coreClient.d.ts +60 -0
- package/dist/client/coreClient.js +118 -0
- package/dist/client/createInternalComponents.d.ts +4 -4
- package/dist/client/createInternalComponents.js +9 -8
- package/dist/client/createModelProxy.d.ts +78 -373
- package/dist/client/createModelProxy.js +114 -86
- package/dist/client/humans.d.ts +48 -0
- package/dist/client/humans.js +52 -0
- package/dist/client/modelRegistration.d.ts +1 -1
- package/dist/client/modelRegistration.js +9 -9
- package/dist/client/options.d.ts +73 -17
- package/dist/client/reactiveEngine.d.ts +48 -0
- package/dist/client/reactiveEngine.js +910 -0
- package/dist/client/resourceTypes.d.ts +9 -250
- package/dist/client/resourceTypes.js +8 -5
- package/dist/client/schemaConfig.d.ts +4 -4
- package/dist/client/schemaConfig.js +6 -2
- package/dist/client/validateAbloOptions.d.ts +3 -2
- package/dist/client/validateAbloOptions.js +1 -1
- package/dist/client/wsMutationExecutor.d.ts +3 -3
- package/dist/client/wsMutationExecutor.js +3 -3
- package/dist/context.d.ts +9 -9
- package/dist/context.js +10 -9
- package/dist/coordination/ClaimLog.d.ts +26 -0
- package/dist/coordination/ClaimLog.js +32 -0
- package/dist/coordination/index.d.ts +1 -15
- package/dist/coordination/index.js +8 -31
- package/dist/core/DatabaseManager.js +1 -1
- package/dist/core/QueryView.d.ts +1 -1
- package/dist/core/QueryView.js +1 -1
- package/dist/core/StoreManager.d.ts +4 -23
- package/dist/core/StoreManager.js +5 -55
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +2 -2
- package/dist/core/storeContract.d.ts +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +227 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +10 -0
- package/dist/environment.d.ts +1 -40
- package/dist/environment.js +8 -37
- package/dist/index.d.ts +40 -34
- package/dist/index.js +26 -20
- package/dist/interfaces/index.d.ts +44 -134
- package/dist/keys/index.d.ts +1 -77
- package/dist/keys/index.js +8 -190
- package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
- package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
- package/dist/mutators/Transaction.d.ts +1 -1
- package/dist/mutators/Transaction.js +1 -1
- package/dist/mutators/UndoManager.d.ts +6 -6
- package/dist/mutators/UndoManager.js +5 -5
- package/dist/mutators/defineMutators.d.ts +3 -3
- package/dist/mutators/defineMutators.js +1 -1
- package/dist/mutators/inverseOp.js +2 -2
- package/dist/mutators/mutateActions.d.ts +3 -3
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +1 -1
- package/dist/mutators/undoApply.d.ts +1 -1
- package/dist/mutators/undoApply.js +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/query/client.d.ts +2 -2
- package/dist/query/client.js +4 -4
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +6 -8
- package/dist/react/AbloProvider.js +5 -7
- package/dist/react/context.d.ts +1 -1
- package/dist/react/context.js +1 -1
- package/dist/react/index.d.ts +5 -5
- package/dist/react/index.js +3 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +3 -3
- package/dist/react/useAblo.js +1 -1
- package/dist/react/useCurrentUserId.js +1 -1
- package/dist/react/useErrorListener.js +1 -1
- package/dist/react/useMutationFailureListener.d.ts +2 -2
- package/dist/react/useMutationFailureListener.js +1 -1
- package/dist/react/useMutators.d.ts +3 -3
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useUndoScope.d.ts +5 -5
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +69 -10
- package/dist/schema/coordination.js +86 -9
- package/dist/schema/ddl.js +2 -2
- package/dist/schema/diff.d.ts +1 -1
- package/dist/schema/generate.js +1 -1
- package/dist/schema/index.d.ts +10 -10
- package/dist/schema/index.js +18 -18
- package/dist/schema/queries.d.ts +27 -27
- package/dist/schema/queries.js +23 -23
- package/dist/schema/select.d.ts +3 -3
- package/dist/schema/select.js +3 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +17 -3
- package/dist/schema/sugar.d.ts +6 -7
- package/dist/schema/sugar.js +9 -12
- package/dist/schema/syncDeltaRow.d.ts +4 -152
- package/dist/schema/syncDeltaRow.js +4 -105
- package/dist/server/adapter.d.ts +18 -1
- package/dist/server/commit.d.ts +10 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +1 -1
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.js +2 -2
- package/dist/source/adapters/kysely.d.ts +1 -1
- package/dist/source/adapters/kysely.js +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +2 -2
- package/dist/source/adapters/memory.js +1 -1
- package/dist/source/adapters/prisma.d.ts +8 -3
- package/dist/source/adapters/prisma.js +1 -1
- package/dist/source/connector.js +1 -1
- package/dist/source/connectorProtocol.d.ts +2 -8
- package/dist/source/connectorProtocol.js +3 -2
- package/dist/source/contract.d.ts +29 -17
- package/dist/source/contract.js +27 -22
- package/dist/source/factory.d.ts +1 -1
- package/dist/source/footprint.d.ts +111 -0
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.js +2 -2
- package/dist/source/index.d.ts +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/next.d.ts +1 -1
- package/dist/source/signing.d.ts +9 -2
- package/dist/source/signing.js +4 -1
- package/dist/source/types.d.ts +6 -4
- package/dist/source/types.js +1 -1
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/stores/SyncActionStore.d.ts +1 -1
- package/dist/stores/SyncActionStore.js +2 -10
- package/dist/stores/syncAction.d.ts +26 -0
- package/dist/stores/syncAction.js +16 -0
- package/dist/surface.d.ts +3 -3
- package/dist/surface.js +6 -4
- package/dist/sync/BootstrapFetcher.d.ts +123 -6
- package/dist/sync/BootstrapFetcher.js +492 -66
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +2 -2
- package/dist/sync/OnDemandLoader.js +60 -21
- package/dist/sync/SubscriptionManager.d.ts +13 -2
- package/dist/sync/SubscriptionManager.js +23 -5
- package/dist/sync/SyncWebSocket.d.ts +27 -510
- package/dist/sync/SyncWebSocket.js +76 -954
- package/dist/sync/awaitClaimGrant.d.ts +4 -44
- package/dist/sync/awaitClaimGrant.js +4 -109
- package/dist/sync/commitFrames.d.ts +6 -40
- package/dist/sync/commitFrames.js +6 -97
- package/dist/sync/contextPorts.d.ts +18 -0
- package/dist/sync/contextPorts.js +31 -0
- package/dist/sync/createClaimStream.d.ts +5 -49
- package/dist/sync/createClaimStream.js +5 -469
- package/dist/sync/createPresenceStream.d.ts +26 -4
- package/dist/sync/createPresenceStream.js +28 -20
- package/dist/sync/createSnapshot.d.ts +2 -2
- package/dist/sync/createSnapshot.js +1 -1
- package/dist/sync/credentialLifecycle.d.ts +5 -173
- package/dist/sync/credentialLifecycle.js +5 -320
- package/dist/sync/deltaPipeline.d.ts +1 -1
- package/dist/sync/participants.d.ts +5 -4
- package/dist/sync/participants.js +29 -22
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +21 -32
- package/dist/sync/schemas.js +26 -17
- package/dist/sync/syncPlan.d.ts +3 -3
- package/dist/sync/wsFrameHandlers.d.ts +6 -114
- package/dist/sync/wsFrameHandlers.js +6 -392
- package/dist/testing/fixtures/bootstrap.d.ts +1 -1
- package/dist/testing/fixtures/deltas.d.ts +1 -1
- package/dist/testing/fixtures/httpResponses.d.ts +70 -0
- package/dist/testing/fixtures/httpResponses.js +90 -0
- package/dist/testing/fixtures/models.js +1 -1
- package/dist/testing/helpers/wait.js +1 -1
- package/dist/testing/mocks/MockMutationExecutor.d.ts +2 -2
- package/dist/testing/mocks/MockMutationExecutor.js +8 -14
- package/dist/testing/mocks/MockSyncContext.d.ts +11 -11
- package/dist/testing/mocks/MockSyncContext.js +10 -9
- package/dist/testing/mocks/MockSyncStore.js +1 -1
- package/dist/testing/mocks/MockWebSocket.d.ts +2 -2
- package/dist/transaction/ablo.d.ts +88 -0
- package/dist/transaction/ablo.js +33 -0
- package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
- package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
- package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
- package/dist/transaction/auth/bootstrapScope.js +1 -0
- package/dist/transaction/auth/capability.d.ts +177 -0
- package/dist/transaction/auth/capability.js +199 -0
- package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
- package/dist/{client → transaction/auth}/identity.d.ts +8 -7
- package/dist/{client → transaction/auth}/identity.js +1 -1
- package/dist/transaction/auth/index.d.ts +162 -0
- package/dist/transaction/auth/index.js +304 -0
- package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
- package/dist/{auth → transaction/auth}/schemas.js +13 -13
- package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
- package/dist/{client → transaction/auth}/sessionMint.js +4 -7
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +49 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +112 -0
- package/dist/transaction/coordination/claimMeta.d.ts +49 -0
- package/dist/transaction/coordination/claimMeta.js +52 -0
- package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
- package/dist/transaction/coordination/createClaimStream.js +475 -0
- package/dist/transaction/coordination/events.d.ts +74 -0
- package/dist/transaction/coordination/events.js +7 -0
- package/dist/transaction/coordination/index.d.ts +19 -0
- package/dist/transaction/coordination/index.js +44 -0
- package/dist/transaction/coordination/locator.d.ts +83 -0
- package/dist/transaction/coordination/locator.js +82 -0
- package/dist/transaction/coordination/schema.d.ts +1473 -0
- package/dist/{coordination → transaction/coordination}/schema.js +490 -55
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +103 -0
- package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
- package/dist/{coordination → transaction/coordination}/trace.js +18 -25
- package/dist/transaction/durableWrites.d.ts +62 -0
- package/dist/{client → transaction}/durableWrites.js +28 -3
- package/dist/transaction/environment.d.ts +105 -0
- package/dist/transaction/environment.js +108 -0
- package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +11 -11
- package/dist/{errorCodes.js → transaction/errorCodes.js} +35 -12
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/index.d.ts +20 -0
- package/dist/transaction/index.js +20 -0
- package/dist/transaction/keys/index.d.ts +87 -0
- package/dist/transaction/keys/index.js +207 -0
- package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
- package/dist/transaction/log/syncDeltaRow.js +95 -0
- package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
- package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
- package/dist/transaction/logger.d.ts +16 -0
- package/dist/transaction/logger.js +7 -0
- package/dist/transaction/observability.d.ts +53 -0
- package/dist/transaction/observability.js +19 -0
- package/dist/transaction/plugin.d.ts +192 -0
- package/dist/transaction/plugin.js +87 -0
- package/dist/{policy → transaction/policy}/types.d.ts +3 -3
- package/dist/{policy → transaction/policy}/types.js +2 -0
- package/dist/transaction/resources/httpResources.d.ts +266 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +319 -0
- package/dist/transaction/resources/modelOperations.js +12 -0
- package/dist/transaction/resources/mutationOptions.d.ts +66 -0
- package/dist/transaction/resources/mutationOptions.js +9 -0
- package/dist/transaction/resources/where.d.ts +85 -0
- package/dist/transaction/resources/where.js +70 -0
- package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
- package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
- package/dist/{schema → transaction/schema}/field.d.ts +5 -5
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/loadStrategy.d.ts +45 -0
- package/dist/transaction/schema/loadStrategy.js +46 -0
- package/dist/{schema → transaction/schema}/model.d.ts +50 -35
- package/dist/{schema → transaction/schema}/model.js +30 -20
- package/dist/transaction/schema/openapi.d.ts +57 -0
- package/dist/transaction/schema/openapi.js +340 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +14 -14
- package/dist/{schema → transaction/schema}/relation.js +7 -7
- package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
- package/dist/{schema → transaction/schema}/residency.js +0 -5
- package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
- package/dist/{schema → transaction/schema}/roles.js +5 -5
- package/dist/{schema → transaction/schema}/schema.d.ts +12 -10
- package/dist/{schema → transaction/schema}/schema.js +4 -3
- package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
- package/dist/{schema → transaction/schema}/tenancy.js +7 -4
- package/dist/transaction/transactionLayer.d.ts +82 -0
- package/dist/transaction/transactionLayer.js +24 -0
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +4 -5
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
- package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +10 -36
- package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
- package/dist/transaction/transport/commitFrames.d.ts +90 -0
- package/dist/transaction/transport/commitFrames.js +134 -0
- package/dist/transaction/transport/connectionManager.d.ts +215 -0
- package/dist/transaction/transport/connectionManager.js +673 -0
- package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
- package/dist/transaction/transport/credentialLifecycle.js +324 -0
- package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
- package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
- package/dist/{client → transaction/transport}/httpClient.d.ts +59 -16
- package/dist/{client → transaction/transport}/httpClient.js +5 -5
- package/dist/transaction/transport/httpOptions.d.ts +33 -0
- package/dist/transaction/transport/httpOptions.js +12 -0
- package/dist/{client → transaction/transport}/httpTransport.js +171 -85
- package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
- package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
- package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
- package/dist/transaction/transport/wsFrameHandlers.js +429 -0
- package/dist/transaction/transport/wsTransport.d.ts +576 -0
- package/dist/transaction/transport/wsTransport.js +1017 -0
- package/dist/transaction/types/assertExact.d.ts +17 -0
- package/dist/transaction/types/assertExact.js +1 -0
- package/dist/{types → transaction/types}/global.d.ts +17 -2
- package/dist/{types → transaction/types}/global.js +2 -1
- package/dist/{types → transaction/types}/index.d.ts +14 -46
- package/dist/{types → transaction/types}/index.js +7 -16
- package/dist/{types → transaction/types}/streams.d.ts +63 -45
- package/dist/{utils → transaction/utils}/json.d.ts +18 -0
- package/dist/transaction/utils/json.js +276 -0
- package/dist/transaction/wire/accountResponses.d.ts +351 -0
- package/dist/transaction/wire/accountResponses.js +255 -0
- package/dist/transaction/wire/auth.d.ts +49 -0
- package/dist/transaction/wire/auth.js +57 -0
- package/dist/transaction/wire/claimEvent.d.ts +76 -0
- package/dist/transaction/wire/claimEvent.js +73 -0
- package/dist/transaction/wire/claims.d.ts +463 -0
- package/dist/transaction/wire/claims.js +229 -0
- package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
- package/dist/{wire → transaction/wire}/commit.js +68 -47
- package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
- package/dist/{wire → transaction/wire}/delta.js +37 -13
- package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
- package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
- package/dist/transaction/wire/feedCursor.d.ts +60 -0
- package/dist/transaction/wire/feedCursor.js +82 -0
- package/dist/transaction/wire/feedEvent.d.ts +177 -0
- package/dist/transaction/wire/feedEvent.js +39 -0
- package/dist/transaction/wire/frames.d.ts +194 -0
- package/dist/transaction/wire/frames.js +50 -0
- package/dist/transaction/wire/inboundFrames.d.ts +552 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +50 -0
- package/dist/transaction/wire/index.js +74 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +79 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +110 -59
- package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
- package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
- package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
- package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
- package/dist/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/transactions/mutations/commitLatency.js +130 -0
- package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
- package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
- package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +16 -15
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +12 -12
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +11 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +7 -7
- package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
- package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +3 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +4 -3
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/webhooks/events.d.ts +2 -2
- package/dist/wire/index.d.ts +1 -34
- package/dist/wire/index.js +8 -49
- package/docs/agent-messaging.md +3 -3
- package/docs/agents.md +19 -12
- package/docs/api-keys.md +8 -4
- package/docs/api.md +22 -18
- package/docs/audit.md +2 -0
- package/docs/cli.md +31 -3
- package/docs/client-behavior.md +8 -6
- package/docs/concurrency-convention.md +30 -24
- package/docs/coordination.md +48 -38
- package/docs/data-sources.md +3 -1
- package/docs/debugging.md +5 -3
- package/docs/deployment.md +267 -0
- package/docs/examples/agent-human.md +49 -42
- package/docs/examples/ai-sdk-tool.md +69 -44
- package/docs/examples/existing-python-backend.md +8 -6
- package/docs/examples/nextjs.md +129 -47
- package/docs/examples/scoped-agent.md +45 -44
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +32 -29
- package/docs/guarantees.md +4 -2
- package/docs/how-it-works.md +9 -7
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +58 -54
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +17 -16
- package/docs/interaction-model.md +6 -4
- package/docs/mcp.md +41 -16
- package/docs/migration.md +63 -5
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +2 -0
- package/docs/quickstart.md +22 -5
- package/docs/react.md +12 -10
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +3 -1
- package/docs/webhooks.md +3 -1
- package/llms.txt +47 -17
- package/package.json +10 -8
- package/dist/agent/Agent.d.ts +0 -366
- package/dist/agent/Agent.js +0 -514
- package/dist/agent/index.d.ts +0 -115
- package/dist/agent/index.js +0 -128
- package/dist/agent/session.d.ts +0 -93
- package/dist/agent/session.js +0 -149
- package/dist/agent/types.d.ts +0 -68
- package/dist/agent/types.js +0 -9
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- package/dist/transactions/durableWriteStore.js +0 -30
- package/dist/utils/json.js +0 -88
- package/dist/wire/errorEnvelope.d.ts +0 -55
- package/dist/wire/frames.d.ts +0 -197
- package/dist/wire/frames.js +0 -49
- package/dist/wire/listEnvelope.js +0 -18
- /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
- /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +0 -0
- /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +0 -0
- /package/dist/{client → transaction}/persistence.d.ts +0 -0
- /package/dist/{client → transaction}/persistence.js +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
- /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.js +0 -0
- /package/dist/{types → transaction/types}/participant.d.ts +0 -0
- /package/dist/{types → transaction/types}/participant.js +0 -0
- /package/dist/{types → transaction/types}/streams.js +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
- /package/dist/{utils → transaction/utils}/duration.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/duration.js +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
- /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocol.js +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
- /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
- /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
- /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
package/dist/core/QueryView.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { observable, runInAction } from 'mobx';
|
|
12
12
|
import { modelAsRow } from '../Model.js';
|
|
13
|
-
import { ModelScope } from '../types/index.js';
|
|
13
|
+
import { ModelScope } from '../transaction/types/index.js';
|
|
14
14
|
import { compareValues, binaryInsertionIndex, findIndexById, } from './queryUtils.js';
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
// QueryView
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
* browser — one per registered model — alongside the single
|
|
4
4
|
* {@link SyncActionStore} for pending changes. It creates each store from the
|
|
5
5
|
* model's metadata, tracks readiness, and provisions the underlying IndexedDB
|
|
6
|
-
* object stores. A model's load strategy
|
|
7
|
-
*
|
|
6
|
+
* object stores. A model's load strategy — instant or lazy — decides how and
|
|
7
|
+
* when its data is loaded.
|
|
8
8
|
*/
|
|
9
9
|
import { ModelRegistry } from '../ModelRegistry.js';
|
|
10
10
|
import { ObjectStore } from '../stores/ObjectStore.js';
|
|
11
11
|
import { SyncActionStore } from '../stores/SyncActionStore.js';
|
|
12
|
-
import { LoadStrategy } from '../types/index.js';
|
|
12
|
+
import { LoadStrategy } from '../transaction/types/index.js';
|
|
13
13
|
/**
|
|
14
14
|
* StoreManager - Central manager for all ObjectStore instances
|
|
15
15
|
*
|
|
@@ -39,7 +39,7 @@ export declare class StoreManager {
|
|
|
39
39
|
/**
|
|
40
40
|
* Create stores (tables) in IndexedDB
|
|
41
41
|
*/
|
|
42
|
-
createStores(db: IDBDatabase
|
|
42
|
+
createStores(db: IDBDatabase): Promise<void>;
|
|
43
43
|
/**
|
|
44
44
|
* Create special tables (sync_action_table, model_table, model_table_partial, __meta, __transactions)
|
|
45
45
|
*/
|
|
@@ -74,25 +74,10 @@ export declare class StoreManager {
|
|
|
74
74
|
* than scanning them all, and returns true as soon as one has records.
|
|
75
75
|
*/
|
|
76
76
|
hasAnyData(): Promise<boolean>;
|
|
77
|
-
/**
|
|
78
|
-
* Get store type distribution for debugging
|
|
79
|
-
*/
|
|
80
|
-
getStoreTypeDistribution(): {
|
|
81
|
-
full: number;
|
|
82
|
-
partial: number;
|
|
83
|
-
};
|
|
84
77
|
/**
|
|
85
78
|
* Get stores by load strategy
|
|
86
79
|
*/
|
|
87
80
|
getStoresByStrategy(strategy: LoadStrategy): ObjectStore[];
|
|
88
|
-
/**
|
|
89
|
-
* Get models to load for bootstrapping
|
|
90
|
-
*/
|
|
91
|
-
getModelsToLoad(): {
|
|
92
|
-
instant: string[];
|
|
93
|
-
lazy: string[];
|
|
94
|
-
partial: string[];
|
|
95
|
-
};
|
|
96
81
|
/**
|
|
97
82
|
* Perform maintenance on all stores
|
|
98
83
|
*/
|
|
@@ -111,10 +96,6 @@ export declare class StoreManager {
|
|
|
111
96
|
*/
|
|
112
97
|
getComprehensiveStats(): Promise<{
|
|
113
98
|
totalStores: number;
|
|
114
|
-
storeTypes: {
|
|
115
|
-
full: number;
|
|
116
|
-
partial: number;
|
|
117
|
-
};
|
|
118
99
|
readiness: {
|
|
119
100
|
ready: number;
|
|
120
101
|
notReady: number;
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
* browser — one per registered model — alongside the single
|
|
4
4
|
* {@link SyncActionStore} for pending changes. It creates each store from the
|
|
5
5
|
* model's metadata, tracks readiness, and provisions the underlying IndexedDB
|
|
6
|
-
* object stores. A model's load strategy
|
|
7
|
-
*
|
|
6
|
+
* object stores. A model's load strategy — instant or lazy — decides how and
|
|
7
|
+
* when its data is loaded.
|
|
8
8
|
*/
|
|
9
9
|
import { ModelRegistry } from '../ModelRegistry.js';
|
|
10
10
|
import { ObjectStore } from '../stores/ObjectStore.js';
|
|
11
11
|
import { SyncActionStore } from '../stores/SyncActionStore.js';
|
|
12
|
-
import { LoadStrategy } from '../types/index.js';
|
|
13
|
-
import { AbloValidationError } from '../errors.js';
|
|
12
|
+
import { LoadStrategy } from '../transaction/types/index.js';
|
|
13
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
14
14
|
/**
|
|
15
15
|
* StoreManager - Central manager for all ObjectStore instances
|
|
16
16
|
*
|
|
@@ -63,9 +63,6 @@ export class StoreManager {
|
|
|
63
63
|
count: this.stores.size,
|
|
64
64
|
ms: duration.toFixed(2),
|
|
65
65
|
});
|
|
66
|
-
// Log store distribution
|
|
67
|
-
const storeTypes = this.getStoreTypeDistribution();
|
|
68
|
-
getContext().logger.debug('Store distribution', storeTypes);
|
|
69
66
|
}
|
|
70
67
|
/**
|
|
71
68
|
* Create ObjectStore for a specific model
|
|
@@ -86,11 +83,10 @@ export class StoreManager {
|
|
|
86
83
|
/**
|
|
87
84
|
* Create stores (tables) in IndexedDB
|
|
88
85
|
*/
|
|
89
|
-
async createStores(db
|
|
86
|
+
async createStores(db) {
|
|
90
87
|
getContext().logger.info('Creating tables for all registered models');
|
|
91
88
|
for (const modelName of this.modelRegistry.getRegisteredModelNames()) {
|
|
92
89
|
const storeName = modelName;
|
|
93
|
-
const metadata = this.modelRegistry.getMetadata(modelName);
|
|
94
90
|
// Skip if store already exists
|
|
95
91
|
if (db.objectStoreNames.contains(storeName)) {
|
|
96
92
|
continue;
|
|
@@ -111,10 +107,6 @@ export class StoreManager {
|
|
|
111
107
|
getContext().logger.debug('Failed to create index', { store: storeName, prop: propName, error });
|
|
112
108
|
}
|
|
113
109
|
}
|
|
114
|
-
// For partial load strategy models, we'll create additional partial index database later
|
|
115
|
-
if (metadata?.loadStrategy === LoadStrategy.partial) {
|
|
116
|
-
getContext().logger.debug('Model will have additional partial index database', { modelName });
|
|
117
|
-
}
|
|
118
110
|
}
|
|
119
111
|
// Create special tables
|
|
120
112
|
this.createSpecialTables(db);
|
|
@@ -223,23 +215,6 @@ export class StoreManager {
|
|
|
223
215
|
}
|
|
224
216
|
return false;
|
|
225
217
|
}
|
|
226
|
-
/**
|
|
227
|
-
* Get store type distribution for debugging
|
|
228
|
-
*/
|
|
229
|
-
getStoreTypeDistribution() {
|
|
230
|
-
let full = 0;
|
|
231
|
-
let partial = 0;
|
|
232
|
-
for (const [modelName] of Array.from(this.stores)) {
|
|
233
|
-
const metadata = this.modelRegistry.getMetadata(modelName);
|
|
234
|
-
if (metadata?.loadStrategy === LoadStrategy.partial) {
|
|
235
|
-
partial++;
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
full++;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
return { full, partial };
|
|
242
|
-
}
|
|
243
218
|
/**
|
|
244
219
|
* Get stores by load strategy
|
|
245
220
|
*/
|
|
@@ -253,30 +228,6 @@ export class StoreManager {
|
|
|
253
228
|
}
|
|
254
229
|
return stores;
|
|
255
230
|
}
|
|
256
|
-
/**
|
|
257
|
-
* Get models to load for bootstrapping
|
|
258
|
-
*/
|
|
259
|
-
getModelsToLoad() {
|
|
260
|
-
const instant = [];
|
|
261
|
-
const lazy = [];
|
|
262
|
-
const partial = [];
|
|
263
|
-
for (const [modelName] of Array.from(this.stores)) {
|
|
264
|
-
const metadata = this.modelRegistry.getMetadata(modelName);
|
|
265
|
-
switch (metadata?.loadStrategy) {
|
|
266
|
-
case LoadStrategy.instant:
|
|
267
|
-
instant.push(modelName);
|
|
268
|
-
break;
|
|
269
|
-
case LoadStrategy.lazy:
|
|
270
|
-
lazy.push(modelName);
|
|
271
|
-
break;
|
|
272
|
-
case LoadStrategy.partial:
|
|
273
|
-
partial.push(modelName);
|
|
274
|
-
break;
|
|
275
|
-
// Skip explicitlyRequested and local
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
return { instant, lazy, partial };
|
|
279
|
-
}
|
|
280
231
|
/**
|
|
281
232
|
* Perform maintenance on all stores
|
|
282
233
|
*/
|
|
@@ -339,7 +290,6 @@ export class StoreManager {
|
|
|
339
290
|
}
|
|
340
291
|
return {
|
|
341
292
|
totalStores: this.stores.size,
|
|
342
|
-
storeTypes: this.getStoreTypeDistribution(),
|
|
343
293
|
readiness: {
|
|
344
294
|
ready: readyCount,
|
|
345
295
|
notReady: this.stores.size - readyCount,
|
package/dist/core/index.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ export { Model } from '../Model.js';
|
|
|
21
21
|
export { LazyReferenceCollection, type LazyCollectionOptions, } from '../LazyReferenceCollection.js';
|
|
22
22
|
export { ModelRegistry, getActiveRegistry, } from '../ModelRegistry.js';
|
|
23
23
|
export { postQuery, type PostQueryOptions } from '../query/client.js';
|
|
24
|
-
export { computeFKDepthPriority } from '../client/
|
|
24
|
+
export { computeFKDepthPriority } from '../client/schemaConfig.js';
|
|
25
25
|
export type { SyncLogger, SyncObservabilityProvider, MutationExecutor, SessionErrorDetector, OnlineStatusProvider, CommitResult, MutationOperation, } from '../interfaces/index.js';
|
|
26
26
|
export { SyncWebSocket, type SyncDelta, type SyncWebSocketOptions, } from '../sync/SyncWebSocket.js';
|
|
27
27
|
export { BootstrapFetcher } from '../sync/BootstrapFetcher.js';
|
|
@@ -30,4 +30,4 @@ export { BootstrapFetcher } from '../sync/BootstrapFetcher.js';
|
|
|
30
30
|
export { BootstrapFetcher as BootstrapHelper } from '../sync/BootstrapFetcher.js';
|
|
31
31
|
export { createClaimStream, type AttachableClaimStream, type ClaimStreamConfig, } from '../sync/createClaimStream.js';
|
|
32
32
|
export { awaitClaimGrant, type GrantTransport, } from '../sync/awaitClaimGrant.js';
|
|
33
|
-
export { LoadStrategy } from '../types/index.js';
|
|
33
|
+
export { LoadStrategy } from '../transaction/types/index.js';
|
package/dist/core/index.js
CHANGED
|
@@ -28,7 +28,7 @@ export { postQuery } from '../query/client.js';
|
|
|
28
28
|
// Computes a dependency-safe ordering for a set of models by walking their
|
|
29
29
|
// foreign-key relationships, so writes commit parents before children. Used by
|
|
30
30
|
// schema-aware test fixtures and scaffolding tools.
|
|
31
|
-
export { computeFKDepthPriority } from '../client/
|
|
31
|
+
export { computeFKDepthPriority } from '../client/schemaConfig.js';
|
|
32
32
|
// The sync layer: the WebSocket wrapper and the delta shape it carries. Needed
|
|
33
33
|
// when writing a sync adapter or a multi-participant test harness.
|
|
34
34
|
export { SyncWebSocket, } from '../sync/SyncWebSocket.js';
|
|
@@ -45,4 +45,4 @@ export { createClaimStream, } from '../sync/createClaimStream.js';
|
|
|
45
45
|
export { awaitClaimGrant, } from '../sync/awaitClaimGrant.js';
|
|
46
46
|
// An enum naming the strategies for loading a model's data. Referenced when
|
|
47
47
|
// registering models in extension code.
|
|
48
|
-
export { LoadStrategy } from '../types/index.js';
|
|
48
|
+
export { LoadStrategy } from '../transaction/types/index.js';
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* the runtime bundle beyond the erased interface declarations.
|
|
11
11
|
*/
|
|
12
12
|
import type { Model } from '../Model.js';
|
|
13
|
-
import type { ModelScope } from '../types/index.js';
|
|
13
|
+
import type { ModelScope } from '../transaction/types/index.js';
|
|
14
14
|
import type { QueryView, QueryViewOptions } from './QueryView.js';
|
|
15
15
|
import type { ViewRegistry } from './ViewRegistry.js';
|
|
16
16
|
import type { ParticipantScope } from '../sync/participants.js';
|
|
@@ -42,7 +42,7 @@ export interface SyncStatus {
|
|
|
42
42
|
*/
|
|
43
43
|
export interface LocalMutation {
|
|
44
44
|
type: 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
|
|
45
|
-
/** The registered name of the mutated model, for example `'
|
|
45
|
+
/** The registered name of the mutated model, for example `'Block'`. */
|
|
46
46
|
modelName: string;
|
|
47
47
|
modelId: string;
|
|
48
48
|
/** The new field values, for a create or an update. */
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The catalog of documentation this package ships.
|
|
3
|
+
*
|
|
4
|
+
* One definition of *which docs exist*, read from the files themselves. Every
|
|
5
|
+
* reader — `ablo docs`, the public `/api/docs/*` routes, the MCP docs tools —
|
|
6
|
+
* resolves through here rather than keeping its own list, because a
|
|
7
|
+
* hand-maintained index of a directory is a copy that drifts the moment a page
|
|
8
|
+
* is added and nothing fails when it does. Before this module the public web
|
|
9
|
+
* allowlist had fallen 21 pages behind the corpus, including `coordination`.
|
|
10
|
+
*
|
|
11
|
+
* Title and description are DERIVED from each file's own convention: an H1,
|
|
12
|
+
* then a one-paragraph blockquote stating what the page is for. That blockquote
|
|
13
|
+
* is the description everywhere it is needed — the site frontmatter lifts the
|
|
14
|
+
* same line — so a page states its own promise exactly once, in the source that
|
|
15
|
+
* ships in the npm tarball and still reads correctly as plain markdown.
|
|
16
|
+
*
|
|
17
|
+
* The published set mirrors the tarball's `files` globs (`docs/*.md`,
|
|
18
|
+
* `docs/examples/*.md`, plus the three root files). Anything else under `docs/`
|
|
19
|
+
* — `docs/internal/**` above all — is neither shipped nor catalogued, and that
|
|
20
|
+
* exclusion is the only thing keeping internal notes off the public routes now
|
|
21
|
+
* that they read from here.
|
|
22
|
+
*/
|
|
23
|
+
/** Where a page sits in the corpus, and how a reader should group it. */
|
|
24
|
+
export type DocKind = 'guide' | 'example' | 'package';
|
|
25
|
+
/** One documentation page, as shipped. */
|
|
26
|
+
export interface DocEntry {
|
|
27
|
+
/** Stable reference: `quickstart`, `examples/nextjs`, `agents`. */
|
|
28
|
+
readonly slug: string;
|
|
29
|
+
/** Human-readable title — the file's H1, or curated for the root files. */
|
|
30
|
+
readonly title: string;
|
|
31
|
+
/** One line stating what the page is for — the file's promise blockquote. */
|
|
32
|
+
readonly description: string;
|
|
33
|
+
readonly kind: DocKind;
|
|
34
|
+
/** Absolute path on disk. */
|
|
35
|
+
readonly path: string;
|
|
36
|
+
readonly mime: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Read the catalog from a package root — the directory holding `docs/` and the
|
|
40
|
+
* three root files.
|
|
41
|
+
*
|
|
42
|
+
* The root is a parameter rather than resolved here because each reader knows
|
|
43
|
+
* it differently and they are genuinely different facts: the CLI resolves it
|
|
44
|
+
* against its own bundle inside `node_modules`, while the web app resolves it
|
|
45
|
+
* against the monorepo checkout. Nothing is cached; callers that serve many
|
|
46
|
+
* requests should memoize the returned array.
|
|
47
|
+
*/
|
|
48
|
+
export declare function readDocsCatalog(packageRoot: string): Promise<DocEntry[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Pull a page's title and promise line out of its markdown.
|
|
51
|
+
*
|
|
52
|
+
* The convention every page follows: an H1, then a blockquote paragraph saying
|
|
53
|
+
* what the page is for. A page missing either simply reports what it has — the
|
|
54
|
+
* catalog never invents prose.
|
|
55
|
+
*/
|
|
56
|
+
export declare function parseDocHeader(body: string): {
|
|
57
|
+
readonly title: string | null;
|
|
58
|
+
readonly description: string;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Resolve a reference to a page. Accepts the slug (`coordination`), a curated
|
|
62
|
+
* alias (`storage`), or a repo-relative path (`docs/coordination.md`,
|
|
63
|
+
* `AGENTS.md`) — the three forms readers actually arrive with. Returns null
|
|
64
|
+
* rather than throwing so a caller can render its own not-found.
|
|
65
|
+
*/
|
|
66
|
+
export declare function findDoc(catalog: readonly DocEntry[], reference: string): DocEntry | null;
|
|
67
|
+
/**
|
|
68
|
+
* Slugs closest to a miss, for a "did you mean" line. Ranks by shared prefix,
|
|
69
|
+
* then substring containment — enough to catch a typo or a half-remembered
|
|
70
|
+
* name without pulling in a distance library.
|
|
71
|
+
*/
|
|
72
|
+
export declare function suggestSlugs(catalog: readonly DocEntry[], reference: string, limit?: number): string[];
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The catalog of documentation this package ships.
|
|
3
|
+
*
|
|
4
|
+
* One definition of *which docs exist*, read from the files themselves. Every
|
|
5
|
+
* reader — `ablo docs`, the public `/api/docs/*` routes, the MCP docs tools —
|
|
6
|
+
* resolves through here rather than keeping its own list, because a
|
|
7
|
+
* hand-maintained index of a directory is a copy that drifts the moment a page
|
|
8
|
+
* is added and nothing fails when it does. Before this module the public web
|
|
9
|
+
* allowlist had fallen 21 pages behind the corpus, including `coordination`.
|
|
10
|
+
*
|
|
11
|
+
* Title and description are DERIVED from each file's own convention: an H1,
|
|
12
|
+
* then a one-paragraph blockquote stating what the page is for. That blockquote
|
|
13
|
+
* is the description everywhere it is needed — the site frontmatter lifts the
|
|
14
|
+
* same line — so a page states its own promise exactly once, in the source that
|
|
15
|
+
* ships in the npm tarball and still reads correctly as plain markdown.
|
|
16
|
+
*
|
|
17
|
+
* The published set mirrors the tarball's `files` globs (`docs/*.md`,
|
|
18
|
+
* `docs/examples/*.md`, plus the three root files). Anything else under `docs/`
|
|
19
|
+
* — `docs/internal/**` above all — is neither shipped nor catalogued, and that
|
|
20
|
+
* exclusion is the only thing keeping internal notes off the public routes now
|
|
21
|
+
* that they read from here.
|
|
22
|
+
*/
|
|
23
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
24
|
+
import { basename, join } from 'node:path';
|
|
25
|
+
const MARKDOWN_MIME = 'text/markdown; charset=utf-8';
|
|
26
|
+
const TEXT_MIME = 'text/plain; charset=utf-8';
|
|
27
|
+
/**
|
|
28
|
+
* The three files that document the package itself rather than a topic. They
|
|
29
|
+
* live at the package root, not under `docs/`, and none follows the H1 +
|
|
30
|
+
* blockquote convention — `llms.txt` opens with a prose paragraph and
|
|
31
|
+
* `README.md` with a banner — so their titles and descriptions are curated
|
|
32
|
+
* here, the one place that knows they are a different kind of artifact.
|
|
33
|
+
*
|
|
34
|
+
* Their slug is their filename, because the filename IS how these are referred
|
|
35
|
+
* to everywhere (`AGENTS.md` is an ecosystem convention, not a topic name) and
|
|
36
|
+
* because a bare word would collide: `docs/agents.md` is a published guide that
|
|
37
|
+
* the docs index cross-links as `agents`, and whichever of the two won that
|
|
38
|
+
* name would silently shadow the other. Friendlier spellings are aliases below.
|
|
39
|
+
*/
|
|
40
|
+
const PACKAGE_FILES = [
|
|
41
|
+
{
|
|
42
|
+
filename: 'AGENTS.md',
|
|
43
|
+
title: 'AGENTS.md',
|
|
44
|
+
description: 'The playbook a coding agent follows to install and drive Ablo without hanging on a prompt.',
|
|
45
|
+
mime: MARKDOWN_MIME,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
filename: 'README.md',
|
|
49
|
+
title: 'README',
|
|
50
|
+
description: 'Package overview — what Ablo is and the shape of the API.',
|
|
51
|
+
mime: MARKDOWN_MIME,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
filename: 'llms.txt',
|
|
55
|
+
title: 'llms.txt',
|
|
56
|
+
description: 'The curated single-file index of the whole API, for machine readers.',
|
|
57
|
+
mime: TEXT_MIME,
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
/**
|
|
61
|
+
* Curated redirects for references that are not a slug: the friendly spellings
|
|
62
|
+
* of the root files, plus the renames the public URLs carried before this
|
|
63
|
+
* module existed, kept so old links and any agent working from a cached page
|
|
64
|
+
* still resolve. Identity mappings are NOT listed — a slug resolves to itself
|
|
65
|
+
* by derivation, and restating the other 30 here would rebuild the
|
|
66
|
+
* hand-maintained list this module exists to delete.
|
|
67
|
+
*/
|
|
68
|
+
const SLUG_ALIASES = {
|
|
69
|
+
readme: 'README.md',
|
|
70
|
+
overview: 'README.md',
|
|
71
|
+
llms: 'llms.txt',
|
|
72
|
+
storage: 'data-sources',
|
|
73
|
+
'docs/storage.md': 'data-sources',
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Read the catalog from a package root — the directory holding `docs/` and the
|
|
77
|
+
* three root files.
|
|
78
|
+
*
|
|
79
|
+
* The root is a parameter rather than resolved here because each reader knows
|
|
80
|
+
* it differently and they are genuinely different facts: the CLI resolves it
|
|
81
|
+
* against its own bundle inside `node_modules`, while the web app resolves it
|
|
82
|
+
* against the monorepo checkout. Nothing is cached; callers that serve many
|
|
83
|
+
* requests should memoize the returned array.
|
|
84
|
+
*/
|
|
85
|
+
export async function readDocsCatalog(packageRoot) {
|
|
86
|
+
const docsDir = join(packageRoot, 'docs');
|
|
87
|
+
const entries = [];
|
|
88
|
+
entries.push(...(await readDocsDirectory(docsDir, 'guide')));
|
|
89
|
+
entries.push(...(await readDocsDirectory(join(docsDir, 'examples'), 'example')));
|
|
90
|
+
for (const file of PACKAGE_FILES) {
|
|
91
|
+
const path = join(packageRoot, file.filename);
|
|
92
|
+
const body = await readFileOrNull(path);
|
|
93
|
+
if (body === null)
|
|
94
|
+
continue;
|
|
95
|
+
entries.push({
|
|
96
|
+
slug: file.filename,
|
|
97
|
+
title: file.title,
|
|
98
|
+
description: file.description,
|
|
99
|
+
kind: 'package',
|
|
100
|
+
path,
|
|
101
|
+
mime: file.mime,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return entries.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Read one flat directory of markdown. Deliberately non-recursive: the shipped
|
|
108
|
+
* set is `docs/*.md` plus `docs/examples/*.md`, so descending would catalogue
|
|
109
|
+
* `docs/internal/**` — notes that are not in the tarball and must not reach a
|
|
110
|
+
* public route.
|
|
111
|
+
*/
|
|
112
|
+
async function readDocsDirectory(dir, kind) {
|
|
113
|
+
let names;
|
|
114
|
+
try {
|
|
115
|
+
const found = await readdir(dir, { withFileTypes: true });
|
|
116
|
+
names = found.filter((e) => e.isFile() && e.name.endsWith('.md')).map((e) => e.name);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
const entries = [];
|
|
122
|
+
for (const name of names) {
|
|
123
|
+
const path = join(dir, name);
|
|
124
|
+
const body = await readFileOrNull(path);
|
|
125
|
+
if (body === null)
|
|
126
|
+
continue;
|
|
127
|
+
const stem = basename(name, '.md');
|
|
128
|
+
const { title, description } = parseDocHeader(body);
|
|
129
|
+
entries.push({
|
|
130
|
+
slug: kind === 'example' ? `examples/${stem}` : stem,
|
|
131
|
+
title: title ?? stem,
|
|
132
|
+
description,
|
|
133
|
+
kind,
|
|
134
|
+
path,
|
|
135
|
+
mime: MARKDOWN_MIME,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return entries;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Pull a page's title and promise line out of its markdown.
|
|
142
|
+
*
|
|
143
|
+
* The convention every page follows: an H1, then a blockquote paragraph saying
|
|
144
|
+
* what the page is for. A page missing either simply reports what it has — the
|
|
145
|
+
* catalog never invents prose.
|
|
146
|
+
*/
|
|
147
|
+
export function parseDocHeader(body) {
|
|
148
|
+
const heading = body.match(/^#[ \t]+(.+?)[ \t]*$/m);
|
|
149
|
+
const title = heading?.[1] ?? null;
|
|
150
|
+
const afterHeading = heading?.index === undefined ? body : body.slice(heading.index + heading[0].length);
|
|
151
|
+
const promise = afterHeading.match(/^\s*\n((?:>.*\n)+)/);
|
|
152
|
+
const description = promise?.[1]
|
|
153
|
+
?.split('\n')
|
|
154
|
+
.filter(Boolean)
|
|
155
|
+
.map((line) => line.replace(/^>\s?/, ''))
|
|
156
|
+
.join(' ')
|
|
157
|
+
.trim() ?? '';
|
|
158
|
+
return { title, description };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Resolve a reference to a page. Accepts the slug (`coordination`), a curated
|
|
162
|
+
* alias (`storage`), or a repo-relative path (`docs/coordination.md`,
|
|
163
|
+
* `AGENTS.md`) — the three forms readers actually arrive with. Returns null
|
|
164
|
+
* rather than throwing so a caller can render its own not-found.
|
|
165
|
+
*/
|
|
166
|
+
export function findDoc(catalog, reference) {
|
|
167
|
+
const trimmed = reference.trim();
|
|
168
|
+
if (trimmed === '')
|
|
169
|
+
return null;
|
|
170
|
+
const direct = matchSlug(catalog, trimmed);
|
|
171
|
+
if (direct)
|
|
172
|
+
return direct;
|
|
173
|
+
const aliased = SLUG_ALIASES[trimmed.toLowerCase()];
|
|
174
|
+
if (aliased) {
|
|
175
|
+
const target = matchSlug(catalog, aliased);
|
|
176
|
+
if (target)
|
|
177
|
+
return target;
|
|
178
|
+
}
|
|
179
|
+
// Path form: `docs/coordination.md`, `docs/examples/nextjs.md`, `llms.txt`.
|
|
180
|
+
const asSlug = trimmed
|
|
181
|
+
.replace(/^\.?\//, '')
|
|
182
|
+
.replace(/^docs\//, '')
|
|
183
|
+
.replace(/\.(md|txt)$/i, '');
|
|
184
|
+
return matchSlug(catalog, asSlug);
|
|
185
|
+
}
|
|
186
|
+
function matchSlug(catalog, slug) {
|
|
187
|
+
const needle = slug.toLowerCase();
|
|
188
|
+
return catalog.find((entry) => entry.slug.toLowerCase() === needle) ?? null;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Slugs closest to a miss, for a "did you mean" line. Ranks by shared prefix,
|
|
192
|
+
* then substring containment — enough to catch a typo or a half-remembered
|
|
193
|
+
* name without pulling in a distance library.
|
|
194
|
+
*/
|
|
195
|
+
export function suggestSlugs(catalog, reference, limit = 3) {
|
|
196
|
+
const needle = reference.trim().toLowerCase();
|
|
197
|
+
if (needle === '')
|
|
198
|
+
return [];
|
|
199
|
+
return catalog
|
|
200
|
+
.map((entry) => {
|
|
201
|
+
const slug = entry.slug.toLowerCase();
|
|
202
|
+
let score = 0;
|
|
203
|
+
if (slug.includes(needle) || needle.includes(slug))
|
|
204
|
+
score += 10;
|
|
205
|
+
score += sharedPrefixLength(slug, needle);
|
|
206
|
+
return { slug: entry.slug, score };
|
|
207
|
+
})
|
|
208
|
+
.filter(({ score }) => score > 2)
|
|
209
|
+
.sort((a, b) => b.score - a.score)
|
|
210
|
+
.slice(0, limit)
|
|
211
|
+
.map(({ slug }) => slug);
|
|
212
|
+
}
|
|
213
|
+
function sharedPrefixLength(a, b) {
|
|
214
|
+
const max = Math.min(a.length, b.length);
|
|
215
|
+
let i = 0;
|
|
216
|
+
while (i < max && a[i] === b[i])
|
|
217
|
+
i += 1;
|
|
218
|
+
return i;
|
|
219
|
+
}
|
|
220
|
+
async function readFileOrNull(path) {
|
|
221
|
+
try {
|
|
222
|
+
return await readFile(path, 'utf8');
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic access to the documentation this package ships.
|
|
3
|
+
*
|
|
4
|
+
* The docs travel in the npm tarball beside the code they describe, so a reader
|
|
5
|
+
* that resolves them through here is reading the pages for the version actually
|
|
6
|
+
* installed — not whatever the website is serving today. That is the whole
|
|
7
|
+
* point of the subpath: a published version is frozen, its docs are frozen with
|
|
8
|
+
* it, and `retrieve` never turns back into `get` behind a pinned dependency.
|
|
9
|
+
*/
|
|
10
|
+
export { readDocsCatalog, findDoc, parseDocHeader, suggestSlugs, type DocEntry, type DocKind, } from './catalog.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic access to the documentation this package ships.
|
|
3
|
+
*
|
|
4
|
+
* The docs travel in the npm tarball beside the code they describe, so a reader
|
|
5
|
+
* that resolves them through here is reading the pages for the version actually
|
|
6
|
+
* installed — not whatever the website is serving today. That is the whole
|
|
7
|
+
* point of the subpath: a published version is frozen, its docs are frozen with
|
|
8
|
+
* it, and `retrieve` never turns back into `get` behind a pinned dependency.
|
|
9
|
+
*/
|
|
10
|
+
export { readDocsCatalog, findDoc, parseDocHeader, suggestSlugs, } from './catalog.js';
|
package/dist/environment.d.ts
CHANGED
|
@@ -1,40 +1 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* The two environments an Ablo project runs in: `production` for live data and
|
|
4
|
-
* `sandbox` for isolated test data. Every credential and every stored row
|
|
5
|
-
* belongs to exactly one of them.
|
|
6
|
-
*/
|
|
7
|
-
export declare const ENVIRONMENTS: readonly ["production", "sandbox"];
|
|
8
|
-
/**
|
|
9
|
-
* How an environment is spelled inside an API-key prefix: a `live` key acts on
|
|
10
|
-
* the production environment and a `test` key acts on the sandbox. Convert
|
|
11
|
-
* between this spelling and {@link Environment} with
|
|
12
|
-
* {@link environmentFromKeyPrefix} and {@link environmentToKeyPrefix}.
|
|
13
|
-
*/
|
|
14
|
-
export type KeyPrefixEnvironment = 'live' | 'test';
|
|
15
|
-
/** A Zod schema that validates a value as one of the {@link ENVIRONMENTS}. */
|
|
16
|
-
export declare const environmentSchema: z.ZodEnum<{
|
|
17
|
-
production: "production";
|
|
18
|
-
sandbox: "sandbox";
|
|
19
|
-
}>;
|
|
20
|
-
/** One of the {@link ENVIRONMENTS} — either `'production'` or `'sandbox'`. */
|
|
21
|
-
export type Environment = z.infer<typeof environmentSchema>;
|
|
22
|
-
/**
|
|
23
|
-
* Coerces an untrusted value into a valid {@link Environment}, returning
|
|
24
|
-
* `fallback` (which defaults to `'production'`) when the value is not a
|
|
25
|
-
* recognized environment. Use it when reading an environment from configuration
|
|
26
|
-
* or off the wire.
|
|
27
|
-
*/
|
|
28
|
-
export declare function normalizeEnvironment(value: unknown, fallback?: Environment): Environment;
|
|
29
|
-
/**
|
|
30
|
-
* Maps an API-key prefix spelling to its {@link Environment}: a `'test'` key
|
|
31
|
-
* operates on the sandbox, and anything else on production.
|
|
32
|
-
*/
|
|
33
|
-
export declare function environmentFromKeyPrefix(value: KeyPrefixEnvironment): Environment;
|
|
34
|
-
/**
|
|
35
|
-
* Maps an {@link Environment} to the spelling used in an API-key prefix: the
|
|
36
|
-
* sandbox is `'test'` and production is `'live'`.
|
|
37
|
-
*/
|
|
38
|
-
export declare function environmentToKeyPrefix(value: Environment): KeyPrefixEnvironment;
|
|
39
|
-
/** Returns true when the given environment is the sandbox. */
|
|
40
|
-
export declare function isSandboxEnvironment(value: Environment): boolean;
|
|
1
|
+
export * from './transaction/environment.js';
|
package/dist/environment.js
CHANGED
|
@@ -1,37 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export const environmentSchema = z.enum(ENVIRONMENTS);
|
|
10
|
-
/**
|
|
11
|
-
* Coerces an untrusted value into a valid {@link Environment}, returning
|
|
12
|
-
* `fallback` (which defaults to `'production'`) when the value is not a
|
|
13
|
-
* recognized environment. Use it when reading an environment from configuration
|
|
14
|
-
* or off the wire.
|
|
15
|
-
*/
|
|
16
|
-
export function normalizeEnvironment(value, fallback = 'production') {
|
|
17
|
-
const parsed = environmentSchema.safeParse(value);
|
|
18
|
-
return parsed.success ? parsed.data : fallback;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Maps an API-key prefix spelling to its {@link Environment}: a `'test'` key
|
|
22
|
-
* operates on the sandbox, and anything else on production.
|
|
23
|
-
*/
|
|
24
|
-
export function environmentFromKeyPrefix(value) {
|
|
25
|
-
return value === 'test' ? 'sandbox' : 'production';
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Maps an {@link Environment} to the spelling used in an API-key prefix: the
|
|
29
|
-
* sandbox is `'test'` and production is `'live'`.
|
|
30
|
-
*/
|
|
31
|
-
export function environmentToKeyPrefix(value) {
|
|
32
|
-
return value === 'sandbox' ? 'test' : 'live';
|
|
33
|
-
}
|
|
34
|
-
/** Returns true when the given environment is the sandbox. */
|
|
35
|
-
export function isSandboxEnvironment(value) {
|
|
36
|
-
return value === 'sandbox';
|
|
37
|
-
}
|
|
1
|
+
// Moved to @ablo/transaction (ADR 0013 — the settlement core extraction).
|
|
2
|
+
// This shim re-exports it at the original path so in-package importers of
|
|
3
|
+
// `../environment.js` keep working; rewire to `@ablo/transaction/environment`
|
|
4
|
+
// and delete this shim once the core package is fully wired.
|
|
5
|
+
//
|
|
6
|
+
// Line comments on purpose: tsc copies a leading JSDoc block into the
|
|
7
|
+
// published `.d.ts`, and this note names a package npm has never heard of.
|
|
8
|
+
export * from './transaction/environment.js';
|