@farukada/aws-langgraph-dynamodb-ts 0.9.0 → 1.0.0-rc.1
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/README.md +282 -49
- package/dist/checkpointer/actions/delete-thread.d.ts +3 -2
- package/dist/checkpointer/actions/delete-thread.js +5 -2
- package/dist/checkpointer/actions/get-tuple.d.ts +3 -2
- package/dist/checkpointer/actions/get-tuple.js +10 -4
- package/dist/checkpointer/actions/list.d.ts +14 -4
- package/dist/checkpointer/actions/list.js +89 -63
- package/dist/checkpointer/actions/put-writes.d.ts +5 -5
- package/dist/checkpointer/actions/put-writes.js +12 -41
- package/dist/checkpointer/actions/put.d.ts +10 -3
- package/dist/checkpointer/actions/put.js +42 -12
- package/dist/checkpointer/internal/assemble.d.ts +10 -3
- package/dist/checkpointer/internal/assemble.js +7 -6
- package/dist/checkpointer/internal/checkpoint-write-verify.d.ts +24 -0
- package/dist/checkpointer/internal/checkpoint-write-verify.js +67 -0
- package/dist/checkpointer/internal/configurable.d.ts +0 -1
- package/dist/checkpointer/internal/configurable.js +10 -9
- package/dist/checkpointer/internal/fetch.d.ts +14 -5
- package/dist/checkpointer/internal/fetch.js +56 -14
- package/dist/checkpointer/internal/filter-match.d.ts +3 -2
- package/dist/checkpointer/internal/filter-match.js +4 -3
- package/dist/checkpointer/internal/item-reader.d.ts +17 -6
- package/dist/checkpointer/internal/item-reader.js +39 -14
- package/dist/checkpointer/internal/item-writer.d.ts +12 -3
- package/dist/checkpointer/internal/item-writer.js +24 -9
- package/dist/checkpointer/internal/keys.d.ts +11 -1
- package/dist/checkpointer/internal/keys.js +33 -3
- package/dist/checkpointer/internal/list-scope.d.ts +61 -0
- package/dist/checkpointer/internal/list-scope.js +108 -0
- package/dist/checkpointer/internal/pending-sends.d.ts +13 -0
- package/dist/checkpointer/internal/pending-sends.js +29 -0
- package/dist/checkpointer/internal/query.d.ts +2 -1
- package/dist/checkpointer/internal/query.js +9 -3
- package/dist/checkpointer/internal/regular-write.d.ts +28 -0
- package/dist/checkpointer/internal/regular-write.js +66 -0
- package/dist/checkpointer/internal/setup.d.ts +3 -1
- package/dist/checkpointer/internal/setup.js +10 -8
- package/dist/checkpointer/internal/special-write-cas.d.ts +1 -2
- package/dist/checkpointer/internal/special-write-cas.js +9 -9
- package/dist/checkpointer/internal/special-write-cleanup.d.ts +1 -2
- package/dist/checkpointer/internal/special-write-cleanup.js +10 -7
- package/dist/checkpointer/internal/special-write-verify.d.ts +0 -1
- package/dist/checkpointer/internal/special-write-verify.js +18 -3
- package/dist/checkpointer/internal/stored-channels.d.ts +31 -0
- package/dist/checkpointer/internal/stored-channels.js +70 -0
- package/dist/checkpointer/internal/validation.d.ts +11 -6
- package/dist/checkpointer/internal/validation.js +19 -9
- package/dist/checkpointer/internal/write-guard.d.ts +8 -1
- package/dist/checkpointer/internal/write-guard.js +16 -7
- package/dist/checkpointer/internal/write-index.d.ts +0 -1
- package/dist/checkpointer/internal/write-index.js +0 -1
- package/dist/checkpointer/saver.d.ts +50 -10
- package/dist/checkpointer/saver.js +59 -17
- package/dist/checkpointer/types.d.ts +8 -1
- package/dist/checkpointer/types.js +0 -1
- package/dist/factory/factory.d.ts +22 -25
- package/dist/factory/factory.js +58 -18
- package/dist/factory/types.d.ts +57 -0
- package/dist/factory/types.js +2 -0
- package/dist/history/actions/add-messages.d.ts +1 -2
- package/dist/history/actions/add-messages.js +4 -4
- package/dist/history/actions/clear.d.ts +3 -2
- package/dist/history/actions/clear.js +5 -2
- package/dist/history/actions/get-messages.d.ts +13 -6
- package/dist/history/actions/get-messages.js +63 -42
- package/dist/history/actions/list-sessions.d.ts +1 -1
- package/dist/history/actions/list-sessions.js +8 -12
- package/dist/history/actions/reconcile-count.d.ts +1 -2
- package/dist/history/actions/reconcile-count.js +20 -7
- package/dist/history/chat-message-history.d.ts +51 -26
- package/dist/history/chat-message-history.js +60 -30
- package/dist/history/internal/append-saga.d.ts +7 -2
- package/dist/history/internal/append-saga.js +58 -14
- package/dist/history/internal/compensation.d.ts +6 -2
- package/dist/history/internal/compensation.js +14 -6
- package/dist/history/internal/item-mapper.d.ts +0 -3
- package/dist/history/internal/item-mapper.js +2 -8
- package/dist/history/internal/keys.d.ts +0 -1
- package/dist/history/internal/keys.js +0 -1
- package/dist/history/internal/message-chunker.d.ts +0 -1
- package/dist/history/internal/message-chunker.js +0 -1
- package/dist/history/internal/message-transaction.d.ts +0 -1
- package/dist/history/internal/message-transaction.js +3 -2
- package/dist/history/internal/message-window.d.ts +17 -0
- package/dist/history/internal/message-window.js +49 -0
- package/dist/history/internal/query.d.ts +16 -3
- package/dist/history/internal/query.js +13 -5
- package/dist/history/internal/session-count.d.ts +8 -2
- package/dist/history/internal/session-count.js +14 -8
- package/dist/history/internal/session-title.d.ts +0 -1
- package/dist/history/internal/session-title.js +1 -2
- package/dist/history/internal/session-update.d.ts +0 -1
- package/dist/history/internal/session-update.js +0 -1
- package/dist/history/internal/setup.d.ts +3 -1
- package/dist/history/internal/setup.js +16 -8
- package/dist/history/internal/title-generator.d.ts +0 -1
- package/dist/history/internal/title-generator.js +19 -3
- package/dist/history/internal/ttl-anchor.d.ts +1 -2
- package/dist/history/internal/ttl-anchor.js +5 -5
- package/dist/history/internal/validation.d.ts +19 -3
- package/dist/history/internal/validation.js +41 -4
- package/dist/history/session-adapter.d.ts +9 -3
- package/dist/history/session-adapter.js +6 -3
- package/dist/history/types.d.ts +23 -2
- package/dist/history/types.js +0 -1
- package/dist/index.d.ts +12 -5
- package/dist/index.js +5 -3
- package/dist/shared/clock.d.ts +6 -1
- package/dist/shared/clock.js +9 -1
- package/dist/shared/codec/codec.d.ts +26 -17
- package/dist/shared/codec/codec.js +46 -24
- package/dist/shared/codec/compression.d.ts +1 -2
- package/dist/shared/codec/compression.js +2 -3
- package/dist/shared/codec/descriptor-keys.d.ts +11 -3
- package/dist/shared/codec/descriptor-keys.js +2 -2
- package/dist/shared/codec/encode.d.ts +13 -0
- package/dist/shared/codec/encode.js +43 -0
- package/dist/shared/codec/json-serde.d.ts +0 -1
- package/dist/shared/codec/json-serde.js +0 -1
- package/dist/shared/codec/payload-loss.d.ts +12 -0
- package/dist/shared/codec/payload-loss.js +38 -0
- package/dist/shared/codec/s3/adapter-config.d.ts +13 -0
- package/dist/shared/codec/s3/adapter-config.js +22 -0
- package/dist/shared/codec/s3/bounded-body.d.ts +14 -0
- package/dist/shared/codec/s3/bounded-body.js +47 -0
- package/dist/shared/codec/s3/client-types.d.ts +34 -0
- package/dist/shared/codec/s3/client-types.js +7 -0
- package/dist/shared/codec/s3/client.d.ts +11 -5
- package/dist/shared/codec/s3/client.js +25 -3
- package/dist/shared/codec/s3/config.d.ts +32 -5
- package/dist/shared/codec/s3/config.js +37 -5
- package/dist/shared/codec/s3/delete.d.ts +0 -1
- package/dist/shared/codec/s3/delete.js +0 -1
- package/dist/shared/codec/s3/key-scope.d.ts +23 -0
- package/dist/shared/codec/s3/key-scope.js +44 -0
- package/dist/shared/codec/s3/lifecycle.d.ts +11 -5
- package/dist/shared/codec/s3/lifecycle.js +32 -16
- package/dist/shared/codec/s3/offloader.d.ts +6 -2
- package/dist/shared/codec/s3/offloader.js +21 -3
- package/dist/shared/codec/s3/orphans.d.ts +6 -1
- package/dist/shared/codec/s3/orphans.js +15 -2
- package/dist/shared/codec/s3/read-write.d.ts +7 -3
- package/dist/shared/codec/s3/read-write.js +16 -8
- package/dist/shared/codec/s3/retry.d.ts +4 -4
- package/dist/shared/codec/s3/retry.js +13 -16
- package/dist/shared/concurrency.d.ts +6 -0
- package/dist/shared/concurrency.js +30 -0
- package/dist/shared/constants.d.ts +53 -5
- package/dist/shared/constants.js +55 -7
- package/dist/shared/dynamodb/abort.d.ts +9 -0
- package/dist/shared/dynamodb/abort.js +27 -0
- package/dist/shared/dynamodb/backoff.d.ts +4 -4
- package/dist/shared/dynamodb/backoff.js +7 -7
- package/dist/shared/dynamodb/batch-write.d.ts +0 -1
- package/dist/shared/dynamodb/batch-write.js +0 -1
- package/dist/shared/dynamodb/cancellation.d.ts +0 -1
- package/dist/shared/dynamodb/cancellation.js +0 -1
- package/dist/shared/dynamodb/client.d.ts +9 -2
- package/dist/shared/dynamodb/client.js +24 -1
- package/dist/shared/dynamodb/conditional-put.d.ts +18 -2
- package/dist/shared/dynamodb/conditional-put.js +19 -2
- package/dist/shared/dynamodb/drain-unprocessed.d.ts +3 -1
- package/dist/shared/dynamodb/drain-unprocessed.js +1 -2
- package/dist/shared/dynamodb/expiry.d.ts +16 -0
- package/dist/shared/dynamodb/expiry.js +29 -0
- package/dist/shared/dynamodb/paginate-core.d.ts +5 -3
- package/dist/shared/dynamodb/paginate-core.js +47 -17
- package/dist/shared/dynamodb/paginate.d.ts +0 -1
- package/dist/shared/dynamodb/paginate.js +1 -2
- package/dist/shared/dynamodb/partition-delete.d.ts +7 -1
- package/dist/shared/dynamodb/partition-delete.js +4 -3
- package/dist/shared/dynamodb/retry-classifier.d.ts +10 -2
- package/dist/shared/dynamodb/retry-classifier.js +42 -11
- package/dist/shared/dynamodb/retry-policy.d.ts +26 -0
- package/dist/shared/dynamodb/retry-policy.js +22 -0
- package/dist/shared/dynamodb/retry.d.ts +14 -1
- package/dist/shared/dynamodb/retry.js +11 -7
- package/dist/shared/dynamodb/scan.d.ts +0 -1
- package/dist/shared/dynamodb/scan.js +1 -2
- package/dist/shared/dynamodb/types.d.ts +1 -2
- package/dist/shared/dynamodb/types.js +0 -1
- package/dist/shared/errors/base-error.d.ts +14 -6
- package/dist/shared/errors/base-error.js +8 -9
- package/dist/shared/errors/boundary.d.ts +18 -0
- package/dist/shared/errors/boundary.js +46 -0
- package/dist/shared/errors/error-code.d.ts +2 -2
- package/dist/shared/errors/error-code.js +1 -1
- package/dist/shared/errors/errors.d.ts +13 -13
- package/dist/shared/errors/errors.js +18 -16
- package/dist/shared/errors/upstream-error.d.ts +16 -0
- package/dist/shared/errors/upstream-error.js +27 -0
- package/dist/shared/errors/wrap-error.d.ts +0 -9
- package/dist/shared/errors/wrap-error.js +0 -15
- package/dist/shared/logging/logger.d.ts +6 -2
- package/dist/shared/logging/logger.js +0 -1
- package/dist/shared/logging/redaction-walk.d.ts +2 -2
- package/dist/shared/logging/redaction-walk.js +38 -18
- package/dist/shared/logging/redaction.d.ts +9 -5
- package/dist/shared/logging/redaction.js +19 -4
- package/dist/shared/logging/secret-patterns.d.ts +21 -3
- package/dist/shared/logging/secret-patterns.js +32 -6
- package/dist/shared/options.d.ts +9 -4
- package/dist/shared/options.js +0 -1
- package/dist/shared/ulid.d.ts +15 -2
- package/dist/shared/ulid.js +35 -3
- package/dist/shared/validation/options.d.ts +8 -0
- package/dist/shared/validation/options.js +90 -0
- package/dist/shared/validation/primitives.d.ts +14 -10
- package/dist/shared/validation/primitives.js +23 -25
- package/dist/shared/validation/ttl.d.ts +14 -7
- package/dist/shared/validation/ttl.js +29 -11
- package/dist/store/actions/get.d.ts +11 -3
- package/dist/store/actions/get.js +52 -14
- package/dist/store/actions/list-namespaces.d.ts +0 -1
- package/dist/store/actions/list-namespaces.js +10 -6
- package/dist/store/actions/put.d.ts +0 -1
- package/dist/store/actions/put.js +24 -13
- package/dist/store/actions/reconcile-vector-index.d.ts +3 -2
- package/dist/store/actions/reconcile-vector-index.js +2 -3
- package/dist/store/actions/search.d.ts +1 -2
- package/dist/store/actions/search.js +11 -38
- package/dist/store/internal/backend-search.d.ts +1 -2
- package/dist/store/internal/backend-search.js +12 -6
- package/dist/store/internal/batch-plan.d.ts +11 -0
- package/dist/store/internal/batch-plan.js +52 -0
- package/dist/store/internal/candidates.d.ts +23 -0
- package/dist/store/internal/candidates.js +94 -0
- package/dist/store/internal/filter.d.ts +0 -1
- package/dist/store/internal/filter.js +0 -1
- package/dist/store/internal/index-reconcile.d.ts +5 -6
- package/dist/store/internal/index-reconcile.js +25 -12
- package/dist/store/internal/index-sync.d.ts +0 -1
- package/dist/store/internal/index-sync.js +0 -1
- package/dist/store/internal/item-mapper.d.ts +5 -3
- package/dist/store/internal/item-mapper.js +14 -6
- package/dist/store/internal/keys.d.ts +0 -1
- package/dist/store/internal/keys.js +0 -1
- package/dist/store/internal/namespace-match.d.ts +0 -1
- package/dist/store/internal/namespace-match.js +0 -1
- package/dist/store/internal/option-validation.d.ts +13 -0
- package/dist/store/internal/option-validation.js +77 -0
- package/dist/store/internal/overwrite-swap.d.ts +0 -1
- package/dist/store/internal/overwrite-swap.js +10 -4
- package/dist/store/internal/persist.d.ts +3 -2
- package/dist/store/internal/persist.js +16 -11
- package/dist/store/internal/query.d.ts +6 -1
- package/dist/store/internal/query.js +17 -1
- package/dist/store/internal/ranker.d.ts +7 -2
- package/dist/store/internal/ranker.js +10 -2
- package/dist/store/internal/read-existing.d.ts +9 -5
- package/dist/store/internal/read-existing.js +22 -10
- package/dist/store/internal/score-direction.d.ts +0 -1
- package/dist/store/internal/score-direction.js +0 -1
- package/dist/store/internal/search-filter.d.ts +0 -1
- package/dist/store/internal/search-filter.js +0 -1
- package/dist/store/internal/semantic-search.d.ts +26 -5
- package/dist/store/internal/semantic-search.js +59 -19
- package/dist/store/internal/setup.d.ts +5 -13
- package/dist/store/internal/setup.js +11 -63
- package/dist/store/internal/text-path.d.ts +17 -0
- package/dist/store/internal/text-path.js +147 -0
- package/dist/store/internal/validation.d.ts +8 -3
- package/dist/store/internal/validation.js +21 -5
- package/dist/store/internal/write-verify.d.ts +15 -10
- package/dist/store/internal/write-verify.js +24 -21
- package/dist/store/store.d.ts +37 -9
- package/dist/store/store.js +52 -17
- package/dist/store/types.d.ts +6 -2
- package/dist/store/types.js +0 -1
- package/dist/store/vector-backend.d.ts +0 -1
- package/dist/store/vector-backend.js +0 -1
- package/package.json +21 -15
- package/dist/checkpointer/actions/delete-thread.d.ts.map +0 -1
- package/dist/checkpointer/actions/delete-thread.js.map +0 -1
- package/dist/checkpointer/actions/get-tuple.d.ts.map +0 -1
- package/dist/checkpointer/actions/get-tuple.js.map +0 -1
- package/dist/checkpointer/actions/list.d.ts.map +0 -1
- package/dist/checkpointer/actions/list.js.map +0 -1
- package/dist/checkpointer/actions/put-writes.d.ts.map +0 -1
- package/dist/checkpointer/actions/put-writes.js.map +0 -1
- package/dist/checkpointer/actions/put.d.ts.map +0 -1
- package/dist/checkpointer/actions/put.js.map +0 -1
- package/dist/checkpointer/internal/assemble.d.ts.map +0 -1
- package/dist/checkpointer/internal/assemble.js.map +0 -1
- package/dist/checkpointer/internal/configurable.d.ts.map +0 -1
- package/dist/checkpointer/internal/configurable.js.map +0 -1
- package/dist/checkpointer/internal/fetch.d.ts.map +0 -1
- package/dist/checkpointer/internal/fetch.js.map +0 -1
- package/dist/checkpointer/internal/filter-match.d.ts.map +0 -1
- package/dist/checkpointer/internal/filter-match.js.map +0 -1
- package/dist/checkpointer/internal/item-reader.d.ts.map +0 -1
- package/dist/checkpointer/internal/item-reader.js.map +0 -1
- package/dist/checkpointer/internal/item-writer.d.ts.map +0 -1
- package/dist/checkpointer/internal/item-writer.js.map +0 -1
- package/dist/checkpointer/internal/keys.d.ts.map +0 -1
- package/dist/checkpointer/internal/keys.js.map +0 -1
- package/dist/checkpointer/internal/query.d.ts.map +0 -1
- package/dist/checkpointer/internal/query.js.map +0 -1
- package/dist/checkpointer/internal/setup.d.ts.map +0 -1
- package/dist/checkpointer/internal/setup.js.map +0 -1
- package/dist/checkpointer/internal/special-write-cas.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-cas.js.map +0 -1
- package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-cleanup.js.map +0 -1
- package/dist/checkpointer/internal/special-write-verify.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-verify.js.map +0 -1
- package/dist/checkpointer/internal/validation.d.ts.map +0 -1
- package/dist/checkpointer/internal/validation.js.map +0 -1
- package/dist/checkpointer/internal/write-guard.d.ts.map +0 -1
- package/dist/checkpointer/internal/write-guard.js.map +0 -1
- package/dist/checkpointer/internal/write-index.d.ts.map +0 -1
- package/dist/checkpointer/internal/write-index.js.map +0 -1
- package/dist/checkpointer/saver.d.ts.map +0 -1
- package/dist/checkpointer/saver.js.map +0 -1
- package/dist/checkpointer/types.d.ts.map +0 -1
- package/dist/checkpointer/types.js.map +0 -1
- package/dist/factory/factory.d.ts.map +0 -1
- package/dist/factory/factory.js.map +0 -1
- package/dist/history/actions/add-messages.d.ts.map +0 -1
- package/dist/history/actions/add-messages.js.map +0 -1
- package/dist/history/actions/clear.d.ts.map +0 -1
- package/dist/history/actions/clear.js.map +0 -1
- package/dist/history/actions/get-messages.d.ts.map +0 -1
- package/dist/history/actions/get-messages.js.map +0 -1
- package/dist/history/actions/list-sessions.d.ts.map +0 -1
- package/dist/history/actions/list-sessions.js.map +0 -1
- package/dist/history/actions/reconcile-count.d.ts.map +0 -1
- package/dist/history/actions/reconcile-count.js.map +0 -1
- package/dist/history/chat-message-history.d.ts.map +0 -1
- package/dist/history/chat-message-history.js.map +0 -1
- package/dist/history/internal/append-saga.d.ts.map +0 -1
- package/dist/history/internal/append-saga.js.map +0 -1
- package/dist/history/internal/compensation.d.ts.map +0 -1
- package/dist/history/internal/compensation.js.map +0 -1
- package/dist/history/internal/item-mapper.d.ts.map +0 -1
- package/dist/history/internal/item-mapper.js.map +0 -1
- package/dist/history/internal/keys.d.ts.map +0 -1
- package/dist/history/internal/keys.js.map +0 -1
- package/dist/history/internal/message-chunker.d.ts.map +0 -1
- package/dist/history/internal/message-chunker.js.map +0 -1
- package/dist/history/internal/message-transaction.d.ts.map +0 -1
- package/dist/history/internal/message-transaction.js.map +0 -1
- package/dist/history/internal/query.d.ts.map +0 -1
- package/dist/history/internal/query.js.map +0 -1
- package/dist/history/internal/session-count.d.ts.map +0 -1
- package/dist/history/internal/session-count.js.map +0 -1
- package/dist/history/internal/session-title.d.ts.map +0 -1
- package/dist/history/internal/session-title.js.map +0 -1
- package/dist/history/internal/session-update.d.ts.map +0 -1
- package/dist/history/internal/session-update.js.map +0 -1
- package/dist/history/internal/setup.d.ts.map +0 -1
- package/dist/history/internal/setup.js.map +0 -1
- package/dist/history/internal/title-generator.d.ts.map +0 -1
- package/dist/history/internal/title-generator.js.map +0 -1
- package/dist/history/internal/ttl-anchor.d.ts.map +0 -1
- package/dist/history/internal/ttl-anchor.js.map +0 -1
- package/dist/history/internal/validation.d.ts.map +0 -1
- package/dist/history/internal/validation.js.map +0 -1
- package/dist/history/session-adapter.d.ts.map +0 -1
- package/dist/history/session-adapter.js.map +0 -1
- package/dist/history/types.d.ts.map +0 -1
- package/dist/history/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/shared/clock.d.ts.map +0 -1
- package/dist/shared/clock.js.map +0 -1
- package/dist/shared/codec/codec.d.ts.map +0 -1
- package/dist/shared/codec/codec.js.map +0 -1
- package/dist/shared/codec/compression.d.ts.map +0 -1
- package/dist/shared/codec/compression.js.map +0 -1
- package/dist/shared/codec/descriptor-keys.d.ts.map +0 -1
- package/dist/shared/codec/descriptor-keys.js.map +0 -1
- package/dist/shared/codec/json-serde.d.ts.map +0 -1
- package/dist/shared/codec/json-serde.js.map +0 -1
- package/dist/shared/codec/s3/client.d.ts.map +0 -1
- package/dist/shared/codec/s3/client.js.map +0 -1
- package/dist/shared/codec/s3/config.d.ts.map +0 -1
- package/dist/shared/codec/s3/config.js.map +0 -1
- package/dist/shared/codec/s3/delete.d.ts.map +0 -1
- package/dist/shared/codec/s3/delete.js.map +0 -1
- package/dist/shared/codec/s3/lifecycle.d.ts.map +0 -1
- package/dist/shared/codec/s3/lifecycle.js.map +0 -1
- package/dist/shared/codec/s3/offloader.d.ts.map +0 -1
- package/dist/shared/codec/s3/offloader.js.map +0 -1
- package/dist/shared/codec/s3/orphans.d.ts.map +0 -1
- package/dist/shared/codec/s3/orphans.js.map +0 -1
- package/dist/shared/codec/s3/read-write.d.ts.map +0 -1
- package/dist/shared/codec/s3/read-write.js.map +0 -1
- package/dist/shared/codec/s3/retry.d.ts.map +0 -1
- package/dist/shared/codec/s3/retry.js.map +0 -1
- package/dist/shared/constants.d.ts.map +0 -1
- package/dist/shared/constants.js.map +0 -1
- package/dist/shared/dynamodb/backoff.d.ts.map +0 -1
- package/dist/shared/dynamodb/backoff.js.map +0 -1
- package/dist/shared/dynamodb/batch-write.d.ts.map +0 -1
- package/dist/shared/dynamodb/batch-write.js.map +0 -1
- package/dist/shared/dynamodb/cancellation.d.ts.map +0 -1
- package/dist/shared/dynamodb/cancellation.js.map +0 -1
- package/dist/shared/dynamodb/client.d.ts.map +0 -1
- package/dist/shared/dynamodb/client.js.map +0 -1
- package/dist/shared/dynamodb/conditional-put.d.ts.map +0 -1
- package/dist/shared/dynamodb/conditional-put.js.map +0 -1
- package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +0 -1
- package/dist/shared/dynamodb/drain-unprocessed.js.map +0 -1
- package/dist/shared/dynamodb/paginate-core.d.ts.map +0 -1
- package/dist/shared/dynamodb/paginate-core.js.map +0 -1
- package/dist/shared/dynamodb/paginate.d.ts.map +0 -1
- package/dist/shared/dynamodb/paginate.js.map +0 -1
- package/dist/shared/dynamodb/partition-delete.d.ts.map +0 -1
- package/dist/shared/dynamodb/partition-delete.js.map +0 -1
- package/dist/shared/dynamodb/retry-classifier.d.ts.map +0 -1
- package/dist/shared/dynamodb/retry-classifier.js.map +0 -1
- package/dist/shared/dynamodb/retry.d.ts.map +0 -1
- package/dist/shared/dynamodb/retry.js.map +0 -1
- package/dist/shared/dynamodb/scan.d.ts.map +0 -1
- package/dist/shared/dynamodb/scan.js.map +0 -1
- package/dist/shared/dynamodb/types.d.ts.map +0 -1
- package/dist/shared/dynamodb/types.js.map +0 -1
- package/dist/shared/errors/base-error.d.ts.map +0 -1
- package/dist/shared/errors/base-error.js.map +0 -1
- package/dist/shared/errors/error-code.d.ts.map +0 -1
- package/dist/shared/errors/error-code.js.map +0 -1
- package/dist/shared/errors/errors.d.ts.map +0 -1
- package/dist/shared/errors/errors.js.map +0 -1
- package/dist/shared/errors/wrap-error.d.ts.map +0 -1
- package/dist/shared/errors/wrap-error.js.map +0 -1
- package/dist/shared/logging/logger.d.ts.map +0 -1
- package/dist/shared/logging/logger.js.map +0 -1
- package/dist/shared/logging/redaction-walk.d.ts.map +0 -1
- package/dist/shared/logging/redaction-walk.js.map +0 -1
- package/dist/shared/logging/redaction.d.ts.map +0 -1
- package/dist/shared/logging/redaction.js.map +0 -1
- package/dist/shared/logging/secret-patterns.d.ts.map +0 -1
- package/dist/shared/logging/secret-patterns.js.map +0 -1
- package/dist/shared/options.d.ts.map +0 -1
- package/dist/shared/options.js.map +0 -1
- package/dist/shared/ulid.d.ts.map +0 -1
- package/dist/shared/ulid.js.map +0 -1
- package/dist/shared/validation/primitives.d.ts.map +0 -1
- package/dist/shared/validation/primitives.js.map +0 -1
- package/dist/shared/validation/ttl.d.ts.map +0 -1
- package/dist/shared/validation/ttl.js.map +0 -1
- package/dist/store/actions/get.d.ts.map +0 -1
- package/dist/store/actions/get.js.map +0 -1
- package/dist/store/actions/list-namespaces.d.ts.map +0 -1
- package/dist/store/actions/list-namespaces.js.map +0 -1
- package/dist/store/actions/put.d.ts.map +0 -1
- package/dist/store/actions/put.js.map +0 -1
- package/dist/store/actions/reconcile-vector-index.d.ts.map +0 -1
- package/dist/store/actions/reconcile-vector-index.js.map +0 -1
- package/dist/store/actions/search.d.ts.map +0 -1
- package/dist/store/actions/search.js.map +0 -1
- package/dist/store/internal/backend-search.d.ts.map +0 -1
- package/dist/store/internal/backend-search.js.map +0 -1
- package/dist/store/internal/filter.d.ts.map +0 -1
- package/dist/store/internal/filter.js.map +0 -1
- package/dist/store/internal/index-reconcile.d.ts.map +0 -1
- package/dist/store/internal/index-reconcile.js.map +0 -1
- package/dist/store/internal/index-sync.d.ts.map +0 -1
- package/dist/store/internal/index-sync.js.map +0 -1
- package/dist/store/internal/item-mapper.d.ts.map +0 -1
- package/dist/store/internal/item-mapper.js.map +0 -1
- package/dist/store/internal/keys.d.ts.map +0 -1
- package/dist/store/internal/keys.js.map +0 -1
- package/dist/store/internal/namespace-match.d.ts.map +0 -1
- package/dist/store/internal/namespace-match.js.map +0 -1
- package/dist/store/internal/overwrite-swap.d.ts.map +0 -1
- package/dist/store/internal/overwrite-swap.js.map +0 -1
- package/dist/store/internal/persist.d.ts.map +0 -1
- package/dist/store/internal/persist.js.map +0 -1
- package/dist/store/internal/query.d.ts.map +0 -1
- package/dist/store/internal/query.js.map +0 -1
- package/dist/store/internal/ranker.d.ts.map +0 -1
- package/dist/store/internal/ranker.js.map +0 -1
- package/dist/store/internal/read-existing.d.ts.map +0 -1
- package/dist/store/internal/read-existing.js.map +0 -1
- package/dist/store/internal/score-direction.d.ts.map +0 -1
- package/dist/store/internal/score-direction.js.map +0 -1
- package/dist/store/internal/search-filter.d.ts.map +0 -1
- package/dist/store/internal/search-filter.js.map +0 -1
- package/dist/store/internal/semantic-search.d.ts.map +0 -1
- package/dist/store/internal/semantic-search.js.map +0 -1
- package/dist/store/internal/setup.d.ts.map +0 -1
- package/dist/store/internal/setup.js.map +0 -1
- package/dist/store/internal/validation.d.ts.map +0 -1
- package/dist/store/internal/validation.js.map +0 -1
- package/dist/store/internal/write-verify.d.ts.map +0 -1
- package/dist/store/internal/write-verify.js.map +0 -1
- package/dist/store/store.d.ts.map +0 -1
- package/dist/store/store.js.map +0 -1
- package/dist/store/types.d.ts.map +0 -1
- package/dist/store/types.js.map +0 -1
- package/dist/store/vector-backend.d.ts.map +0 -1
- package/dist/store/vector-backend.js.map +0 -1
|
@@ -4,14 +4,23 @@ exports.narrowStoreRecord = narrowStoreRecord;
|
|
|
4
4
|
exports.buildStoreItem = buildStoreItem;
|
|
5
5
|
exports.readStoreItem = readStoreItem;
|
|
6
6
|
const codec_1 = require("../../shared/codec/codec");
|
|
7
|
+
const encode_1 = require("../../shared/codec/encode");
|
|
7
8
|
const keys_1 = require("./keys");
|
|
8
9
|
/**
|
|
9
10
|
* Narrow a raw scanned row to a {@link StoreItemRecord}, or `undefined` for a
|
|
10
|
-
* foreign row on a shared table (no `namespace`)
|
|
11
|
-
*
|
|
11
|
+
* foreign row on a shared table (no `namespace`) — and for a row whose
|
|
12
|
+
* `namespace`/`key` attributes disagree with the DynamoDB key it was found at.
|
|
13
|
+
* The attributes name the S3 path the row may reference, so they must be bound
|
|
14
|
+
* to the partition the row actually lives in: a writer confined to its own
|
|
15
|
+
* partition can then never make a row speak for another tenant's objects.
|
|
12
16
|
*/
|
|
13
17
|
function narrowStoreRecord(raw) {
|
|
14
|
-
|
|
18
|
+
if (!Array.isArray(raw.namespace) || typeof raw.key !== 'string')
|
|
19
|
+
return undefined;
|
|
20
|
+
const record = raw;
|
|
21
|
+
const consistent = record.PK === (0, keys_1.partitionKey)(record.namespace) &&
|
|
22
|
+
record.SK === (0, keys_1.sortKey)(record.namespace, record.key);
|
|
23
|
+
return consistent ? record : undefined;
|
|
15
24
|
}
|
|
16
25
|
/** Map a store context to the codec collaborators. */
|
|
17
26
|
function storeCodecDeps(context) {
|
|
@@ -19,7 +28,7 @@ function storeCodecDeps(context) {
|
|
|
19
28
|
}
|
|
20
29
|
/** Encode a value into the DynamoDB record for a stored item. */
|
|
21
30
|
async function buildStoreItem(context, namespace, key, value, options) {
|
|
22
|
-
const descriptor = await (0,
|
|
31
|
+
const descriptor = await (0, encode_1.encodePayload)(value, storeCodecDeps(context), {
|
|
23
32
|
keyParts: options.nonce === undefined ? [...namespace, key] : [...namespace, key, options.nonce],
|
|
24
33
|
});
|
|
25
34
|
const record = {
|
|
@@ -41,7 +50,7 @@ async function buildStoreItem(context, namespace, key, value, options) {
|
|
|
41
50
|
}
|
|
42
51
|
/** Decode a DynamoDB record back into a store {@link Item}. */
|
|
43
52
|
async function readStoreItem(context, record) {
|
|
44
|
-
const value = await (0, codec_1.decodePayload)(record.value, storeCodecDeps(context));
|
|
53
|
+
const value = await (0, codec_1.decodePayload)(record.value, storeCodecDeps(context), [...record.namespace, record.key]);
|
|
45
54
|
return {
|
|
46
55
|
namespace: record.namespace,
|
|
47
56
|
key: record.key,
|
|
@@ -50,4 +59,3 @@ async function readStoreItem(context, record) {
|
|
|
50
59
|
updatedAt: new Date(record.updatedAt),
|
|
51
60
|
};
|
|
52
61
|
}
|
|
53
|
-
//# sourceMappingURL=item-mapper.js.map
|
|
@@ -15,4 +15,3 @@ export declare function sortKeyPrefix(prefix: string[]): string;
|
|
|
15
15
|
* as a string prefix, so ["userspace"] does not match prefix ["users"]).
|
|
16
16
|
*/
|
|
17
17
|
export declare function namespaceMatchesPrefix(namespace: string[], prefix: string[]): boolean;
|
|
18
|
-
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DynamoDBStoreOptions } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Validate every store option at construction, shared options first.
|
|
4
|
+
*
|
|
5
|
+
* A `vectorBackend` without an `index` is rejected outright rather than
|
|
6
|
+
* silently degrading: with no embeddings configured, every `put` would compute
|
|
7
|
+
* no vector and instruct the backend to *delete* the item's entry instead of
|
|
8
|
+
* indexing it, and `search()` would fall through to an unranked scan-order
|
|
9
|
+
* listing with no `.score` field and no error — a semantic query returning a
|
|
10
|
+
* normal-looking but meaningless response. `reconcileVectorIndex` already
|
|
11
|
+
* refused this exact misconfiguration.
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateStoreOptions(options: DynamoDBStoreOptions): void;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateStoreOptions = validateStoreOptions;
|
|
4
|
+
const errors_1 = require("../../shared/errors/errors");
|
|
5
|
+
const options_1 = require("../../shared/validation/options");
|
|
6
|
+
const primitives_1 = require("../../shared/validation/primitives");
|
|
7
|
+
const score_direction_1 = require("./score-direction");
|
|
8
|
+
/**
|
|
9
|
+
* Reject an `index` that cannot actually embed. `IndexConfig` mandates
|
|
10
|
+
* `embeddings`, but a JavaScript caller can omit it or pass the wrong shape,
|
|
11
|
+
* and the failure then surfaced as a raw `TypeError` deep inside the first
|
|
12
|
+
* `put()`/`search()` rather than this library's typed error at construction.
|
|
13
|
+
*
|
|
14
|
+
* Both methods are required: documents are embedded with `embedDocuments()`
|
|
15
|
+
* on `put()` and queries with `embedQuery()` on `search()`. `dims` is only
|
|
16
|
+
* compared against returned vectors when it is a positive integer, so a
|
|
17
|
+
* configuration that omits it keeps working.
|
|
18
|
+
*/
|
|
19
|
+
function assertUsableIndex(index) {
|
|
20
|
+
if (!index)
|
|
21
|
+
return;
|
|
22
|
+
const embeddings = index.embeddings;
|
|
23
|
+
const missing = ['embedQuery', 'embedDocuments'].find((method) => typeof embeddings?.[method] !== 'function');
|
|
24
|
+
if (missing === undefined)
|
|
25
|
+
return;
|
|
26
|
+
throw new errors_1.ValidationError(`\`index.embeddings\` must be an Embeddings implementation exposing ${missing}(); ` +
|
|
27
|
+
'documents are embedded with embedDocuments() on put() and queries with embedQuery() ' +
|
|
28
|
+
'on search()', 'index');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Reject a `vectorScoreDirection` outside the declared union.
|
|
32
|
+
*
|
|
33
|
+
* {@link toRelevanceScores} treats anything it does not recognise as a no-op —
|
|
34
|
+
* the only safe default, since guessing would invert a ranking — so a mistyped
|
|
35
|
+
* or config-file-sourced value would otherwise leave a distance backend ranked
|
|
36
|
+
* backwards with no error and no warning anywhere. Same premise as
|
|
37
|
+
* {@link assertUsableIndex}: a JavaScript caller can pass a string the type
|
|
38
|
+
* never admits.
|
|
39
|
+
*/
|
|
40
|
+
function assertScoreDirection(direction) {
|
|
41
|
+
if (direction === undefined || score_direction_1.VECTOR_SCORE_DIRECTIONS.includes(direction))
|
|
42
|
+
return;
|
|
43
|
+
throw new errors_1.ValidationError(`vectorScoreDirection must be one of ${score_direction_1.VECTOR_SCORE_DIRECTIONS.join(' | ')}; received ` +
|
|
44
|
+
`${JSON.stringify(direction)}, which would be left in the backend's own direction and ` +
|
|
45
|
+
'could rank a distance backend backwards', 'vectorScoreDirection');
|
|
46
|
+
}
|
|
47
|
+
/** Both in-memory caps must be positive integers; 0 would silently return nothing. */
|
|
48
|
+
function validateLimits(options) {
|
|
49
|
+
if (options.maxScanItems !== undefined) {
|
|
50
|
+
(0, primitives_1.validateInteger)(options.maxScanItems, 'maxScanItems', { min: 1 });
|
|
51
|
+
}
|
|
52
|
+
if (options.maxSearchCandidates !== undefined) {
|
|
53
|
+
(0, primitives_1.validateInteger)(options.maxSearchCandidates, 'maxSearchCandidates', { min: 1 });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Validate every store option at construction, shared options first.
|
|
58
|
+
*
|
|
59
|
+
* A `vectorBackend` without an `index` is rejected outright rather than
|
|
60
|
+
* silently degrading: with no embeddings configured, every `put` would compute
|
|
61
|
+
* no vector and instruct the backend to *delete* the item's entry instead of
|
|
62
|
+
* indexing it, and `search()` would fall through to an unranked scan-order
|
|
63
|
+
* listing with no `.score` field and no error — a semantic query returning a
|
|
64
|
+
* normal-looking but meaningless response. `reconcileVectorIndex` already
|
|
65
|
+
* refused this exact misconfiguration.
|
|
66
|
+
*/
|
|
67
|
+
function validateStoreOptions(options) {
|
|
68
|
+
(0, options_1.validateBaseAdapterOptions)(options);
|
|
69
|
+
validateLimits(options);
|
|
70
|
+
if (options.vectorBackend && !options.index) {
|
|
71
|
+
throw new errors_1.ValidationError('vectorBackend requires a configured `index` (embeddings); without one no embedding ' +
|
|
72
|
+
'is computed, every put would clear the item vector, and search would silently return ' +
|
|
73
|
+
'unranked, score-less results', 'vectorBackend');
|
|
74
|
+
}
|
|
75
|
+
assertUsableIndex(options.index);
|
|
76
|
+
assertScoreDirection(options.vectorScoreDirection);
|
|
77
|
+
}
|
|
@@ -30,4 +30,3 @@ import type { StoreContext } from './setup';
|
|
|
30
30
|
* each re-read so a row created by whoever won keeps its true creation time.
|
|
31
31
|
*/
|
|
32
32
|
export declare function putWithRevisionSwap(context: StoreContext, record: StoreItemRecord, existing: ExistingRecordMeta): Promise<ExistingRecordMeta>;
|
|
33
|
-
//# sourceMappingURL=overwrite-swap.d.ts.map
|
|
@@ -7,7 +7,7 @@ const read_existing_1 = require("./read-existing");
|
|
|
7
7
|
/** Put the record, optionally pinned to the revision the caller observed. */
|
|
8
8
|
async function put(context, record, observed) {
|
|
9
9
|
const guard = observed ? (0, conditional_put_1.revisionGuard)(conditional_put_1.REVISION_ATTRIBUTE, observed) : {};
|
|
10
|
-
await (0, retry_1.withDynamoDBRetry)(() => context.client.put({ TableName: context.tableName, Item: record, ...guard }));
|
|
10
|
+
await (0, retry_1.withDynamoDBRetry)(() => context.client.put({ TableName: context.tableName, Item: record, ...guard }), context.retry);
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
13
|
* Commit `record`, re-reading and retrying while another writer holds the row,
|
|
@@ -48,10 +48,17 @@ async function putWithRevisionSwap(context, record, existing) {
|
|
|
48
48
|
catch (error) {
|
|
49
49
|
if (!(0, conditional_put_1.isConditionalCheckFailed)(error))
|
|
50
50
|
throw error;
|
|
51
|
-
|
|
51
|
+
/** The rejection carries the row that turned it away; the read is spent only when it does not. */
|
|
52
|
+
const rejected = (0, conditional_put_1.rejectedItem)(error);
|
|
53
|
+
observed = rejected
|
|
54
|
+
? (0, read_existing_1.existingFrom)(rejected)
|
|
55
|
+
: await (0, read_existing_1.readExisting)(context, record.PK, record.SK);
|
|
52
56
|
if (record.rev !== undefined && observed.revision === record.rev)
|
|
53
57
|
return attempted;
|
|
54
|
-
|
|
58
|
+
/** A row that vanished between attempts (a concurrent delete) makes this a fresh creation. */
|
|
59
|
+
record.createdAt = observed.exists
|
|
60
|
+
? (observed.createdAt ?? record.createdAt)
|
|
61
|
+
: record.updatedAt;
|
|
55
62
|
}
|
|
56
63
|
}
|
|
57
64
|
context.logger.warn('store.put: compare-and-swap exhausted; overwriting unconditionally, which can orphan one ' +
|
|
@@ -59,4 +66,3 @@ async function putWithRevisionSwap(context, record, existing) {
|
|
|
59
66
|
await put(context, record);
|
|
60
67
|
return observed;
|
|
61
68
|
}
|
|
62
|
-
//# sourceMappingURL=overwrite-swap.js.map
|
|
@@ -21,7 +21,8 @@ import type { StoreContext } from './setup';
|
|
|
21
21
|
* `'landed'` cleans up the previous object like the success path and swallows
|
|
22
22
|
* the error, and an `'unverified'` read deletes nothing and rethrows — leaking
|
|
23
23
|
* one object at worst rather than stranding a live row pointing at a deleted
|
|
24
|
-
* one.
|
|
24
|
+
* one. The verification compares the per-call `rev`, so an inline record is
|
|
25
|
+
* verified too: a lost acknowledgement of an inline overwrite used to be
|
|
26
|
+
* reported as a failure while the previous offloaded object was never cleaned.
|
|
25
27
|
*/
|
|
26
28
|
export declare function persistRecord(context: StoreContext, record: StoreItemRecord, existing: ExistingRecordMeta): Promise<void>;
|
|
27
|
-
//# sourceMappingURL=persist.d.ts.map
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.persistRecord = persistRecord;
|
|
4
|
-
const codec_1 = require("../../shared/codec/codec");
|
|
5
4
|
const descriptor_keys_1 = require("../../shared/codec/descriptor-keys");
|
|
6
5
|
const orphans_1 = require("../../shared/codec/s3/orphans");
|
|
7
6
|
const retry_1 = require("../../shared/dynamodb/retry");
|
|
8
7
|
const overwrite_swap_1 = require("./overwrite-swap");
|
|
9
8
|
const write_verify_1 = require("./write-verify");
|
|
10
|
-
/**
|
|
11
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Best-effort delete of one descriptor's S3 object. `scope` is passed for a
|
|
11
|
+
* descriptor read back from the row (the superseded value) and omitted for
|
|
12
|
+
* this call's own upload.
|
|
13
|
+
*/
|
|
14
|
+
async function cleanUp(context, descriptor, label, scope) {
|
|
12
15
|
if (!context.offloader || !descriptor)
|
|
13
16
|
return;
|
|
14
|
-
await (0, orphans_1.cleanUpS3Orphans)(context.offloader, (0, descriptor_keys_1.collectS3Keys)([descriptor]), label, context.logger);
|
|
17
|
+
await (0, orphans_1.cleanUpS3Orphans)(context.offloader, (0, descriptor_keys_1.collectS3Keys)([descriptor]), label, context.logger, scope === undefined ? {} : { scope });
|
|
15
18
|
}
|
|
16
19
|
/**
|
|
17
20
|
* Put the record and clean up whichever side is now dead.
|
|
@@ -33,7 +36,9 @@ async function cleanUp(context, descriptor, label) {
|
|
|
33
36
|
* `'landed'` cleans up the previous object like the success path and swallows
|
|
34
37
|
* the error, and an `'unverified'` read deletes nothing and rethrows — leaking
|
|
35
38
|
* one object at worst rather than stranding a live row pointing at a deleted
|
|
36
|
-
* one.
|
|
39
|
+
* one. The verification compares the per-call `rev`, so an inline record is
|
|
40
|
+
* verified too: a lost acknowledgement of an inline overwrite used to be
|
|
41
|
+
* reported as a failure while the previous offloaded object was never cleaned.
|
|
37
42
|
*/
|
|
38
43
|
async function persistRecord(context, record, existing) {
|
|
39
44
|
let superseded = existing;
|
|
@@ -42,18 +47,18 @@ async function persistRecord(context, record, existing) {
|
|
|
42
47
|
superseded = await (0, overwrite_swap_1.putWithRevisionSwap)(context, record, existing);
|
|
43
48
|
}
|
|
44
49
|
else {
|
|
45
|
-
await (0, retry_1.withDynamoDBRetry)(() => context.client.put({ TableName: context.tableName, Item: record }));
|
|
50
|
+
await (0, retry_1.withDynamoDBRetry)(() => context.client.put({ TableName: context.tableName, Item: record }), context.retry);
|
|
46
51
|
}
|
|
47
52
|
}
|
|
48
53
|
catch (error) {
|
|
49
|
-
const verdict =
|
|
50
|
-
? await (0, write_verify_1.verifyWriteLanded)(context, record, record.value.s3Key)
|
|
51
|
-
: 'not-landed';
|
|
54
|
+
const verdict = await (0, write_verify_1.verifyWriteLanded)(context, record);
|
|
52
55
|
if (verdict === 'not-landed')
|
|
53
56
|
await cleanUp(context, record.value, 'store.put');
|
|
54
57
|
if (verdict !== 'landed')
|
|
55
58
|
throw error;
|
|
56
59
|
}
|
|
57
|
-
await cleanUp(context, superseded.value, 'store.put.overwrite'
|
|
60
|
+
await cleanUp(context, superseded.value, 'store.put.overwrite', [
|
|
61
|
+
...record.namespace,
|
|
62
|
+
record.key,
|
|
63
|
+
]);
|
|
58
64
|
}
|
|
59
|
-
//# sourceMappingURL=persist.js.map
|
|
@@ -3,4 +3,9 @@ import type { QueryCommandInput, ScanCommandInput } from '@aws-sdk/lib-dynamodb'
|
|
|
3
3
|
export declare function scopedQuery(tableName: string, prefix: string[]): QueryCommandInput;
|
|
4
4
|
/** Scan input for the rootless case, filtered to store items only. */
|
|
5
5
|
export declare function storeScan(tableName: string): ScanCommandInput;
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Restrict a Query/Scan to the attributes `narrowStoreRecord` needs, leaving the
|
|
8
|
+
* payload behind: a namespace listing never reads a value. RCU is billed on
|
|
9
|
+
* the stored size regardless, so the saving is transfer and unmarshalling.
|
|
10
|
+
*/
|
|
11
|
+
export declare function projectKeys<T extends QueryCommandInput | ScanCommandInput>(params: T): T;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.scopedQuery = scopedQuery;
|
|
4
4
|
exports.storeScan = storeScan;
|
|
5
|
+
exports.projectKeys = projectKeys;
|
|
5
6
|
const keys_1 = require("./keys");
|
|
6
7
|
/** Query input for a scoped prefix (PK = prefix[0], optional SK begins_with). */
|
|
7
8
|
function scopedQuery(tableName, prefix) {
|
|
@@ -29,4 +30,19 @@ function storeScan(tableName) {
|
|
|
29
30
|
ExpressionAttributeNames: { '#ns': 'namespace' },
|
|
30
31
|
};
|
|
31
32
|
}
|
|
32
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Restrict a Query/Scan to the attributes `narrowStoreRecord` needs, leaving the
|
|
35
|
+
* payload behind: a namespace listing never reads a value. RCU is billed on
|
|
36
|
+
* the stored size regardless, so the saving is transfer and unmarshalling.
|
|
37
|
+
*/
|
|
38
|
+
function projectKeys(params) {
|
|
39
|
+
return {
|
|
40
|
+
...params,
|
|
41
|
+
ProjectionExpression: 'PK, SK, #ns, #key',
|
|
42
|
+
ExpressionAttributeNames: {
|
|
43
|
+
...params.ExpressionAttributeNames,
|
|
44
|
+
'#ns': 'namespace',
|
|
45
|
+
'#key': 'key',
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
@@ -8,6 +8,11 @@ export interface RankCandidate {
|
|
|
8
8
|
* Rank candidates by cosine similarity to `queryVector`, descending. Throws a
|
|
9
9
|
* {@link ValidationError} when the candidate count exceeds `maxCandidates`
|
|
10
10
|
* (steer large corpora to an external VectorBackend).
|
|
11
|
+
*
|
|
12
|
+
* A stored embedding whose length differs from the query vector's cannot be
|
|
13
|
+
* scored — it was written by a different embeddings model — and is ranked
|
|
14
|
+
* last with an undefined score. `onDimensionMismatch` is invoked once with
|
|
15
|
+
* how many candidates that affected, so the caller can say so instead of
|
|
16
|
+
* silently returning a ranking that quietly omits them.
|
|
11
17
|
*/
|
|
12
|
-
export declare function rankInMemory(candidates: RankCandidate[], queryVector: number[], maxCandidates: number): SearchItem[];
|
|
13
|
-
//# sourceMappingURL=ranker.d.ts.map
|
|
18
|
+
export declare function rankInMemory(candidates: RankCandidate[], queryVector: number[], maxCandidates: number, onDimensionMismatch?: (count: number) => void): SearchItem[];
|
|
@@ -9,12 +9,21 @@ const UNSCORED_RANK = -2;
|
|
|
9
9
|
* Rank candidates by cosine similarity to `queryVector`, descending. Throws a
|
|
10
10
|
* {@link ValidationError} when the candidate count exceeds `maxCandidates`
|
|
11
11
|
* (steer large corpora to an external VectorBackend).
|
|
12
|
+
*
|
|
13
|
+
* A stored embedding whose length differs from the query vector's cannot be
|
|
14
|
+
* scored — it was written by a different embeddings model — and is ranked
|
|
15
|
+
* last with an undefined score. `onDimensionMismatch` is invoked once with
|
|
16
|
+
* how many candidates that affected, so the caller can say so instead of
|
|
17
|
+
* silently returning a ranking that quietly omits them.
|
|
12
18
|
*/
|
|
13
|
-
function rankInMemory(candidates, queryVector, maxCandidates) {
|
|
19
|
+
function rankInMemory(candidates, queryVector, maxCandidates, onDimensionMismatch) {
|
|
14
20
|
if (candidates.length > maxCandidates) {
|
|
15
21
|
throw new errors_1.ValidationError(`Semantic search candidate set (${candidates.length}) exceeds maxSearchCandidates ` +
|
|
16
22
|
`(${maxCandidates}); use a dedicated VectorBackend for large corpora`, 'maxSearchCandidates');
|
|
17
23
|
}
|
|
24
|
+
const mismatched = candidates.filter(({ embedding }) => embedding !== undefined && embedding.length !== queryVector.length).length;
|
|
25
|
+
if (mismatched > 0)
|
|
26
|
+
onDimensionMismatch?.(mismatched);
|
|
18
27
|
return candidates
|
|
19
28
|
.map(({ item, embedding }) => ({
|
|
20
29
|
...item,
|
|
@@ -28,4 +37,3 @@ function rankInMemory(candidates, queryVector, maxCandidates) {
|
|
|
28
37
|
function rankValue(item) {
|
|
29
38
|
return item.score ?? UNSCORED_RANK;
|
|
30
39
|
}
|
|
31
|
-
//# sourceMappingURL=ranker.js.map
|
|
@@ -1,19 +1,23 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { DescriptorRef } from '../../shared/codec/descriptor-keys';
|
|
2
|
+
import type { DocItem } from '../../shared/dynamodb/types';
|
|
2
3
|
import type { StoreContext } from './setup';
|
|
3
4
|
/** The previous row's createdAt, payload descriptor and revision. */
|
|
4
5
|
export interface ExistingRecordMeta {
|
|
5
6
|
exists: boolean;
|
|
6
7
|
createdAt?: string;
|
|
7
|
-
value?:
|
|
8
|
+
value?: DescriptorRef;
|
|
8
9
|
revision?: string;
|
|
9
10
|
}
|
|
10
11
|
/**
|
|
11
12
|
* Read the fields a put needs from the row it is about to replace, in one
|
|
12
|
-
* strongly-consistent projection: `createdAt` to preserve,
|
|
13
|
-
*
|
|
13
|
+
* strongly-consistent projection: `createdAt` to preserve, the descriptor's
|
|
14
|
+
* location and S3 key to clean up afterwards (never its inline bytes, which
|
|
15
|
+
* can be hundreds of kilobytes the write would only discard), and the
|
|
16
|
+
* revision the compare-and-swap pins.
|
|
14
17
|
*
|
|
15
18
|
* Lives apart from `actions/put.ts` so `persist.ts` can re-read on a lost swap
|
|
16
19
|
* without importing its own caller.
|
|
17
20
|
*/
|
|
18
21
|
export declare function readExisting(context: StoreContext, pk: string, sk: string): Promise<ExistingRecordMeta>;
|
|
19
|
-
|
|
22
|
+
/** Project a raw row (a read result, or the row a rejection carried) onto {@link ExistingRecordMeta}. */
|
|
23
|
+
export declare function existingFrom(item: DocItem | undefined): ExistingRecordMeta;
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.readExisting = readExisting;
|
|
4
|
+
exports.existingFrom = existingFrom;
|
|
4
5
|
const conditional_put_1 = require("../../shared/dynamodb/conditional-put");
|
|
5
6
|
const retry_1 = require("../../shared/dynamodb/retry");
|
|
6
7
|
/**
|
|
7
8
|
* Read the fields a put needs from the row it is about to replace, in one
|
|
8
|
-
* strongly-consistent projection: `createdAt` to preserve,
|
|
9
|
-
*
|
|
9
|
+
* strongly-consistent projection: `createdAt` to preserve, the descriptor's
|
|
10
|
+
* location and S3 key to clean up afterwards (never its inline bytes, which
|
|
11
|
+
* can be hundreds of kilobytes the write would only discard), and the
|
|
12
|
+
* revision the compare-and-swap pins.
|
|
10
13
|
*
|
|
11
14
|
* Lives apart from `actions/put.ts` so `persist.ts` can re-read on a lost swap
|
|
12
15
|
* without importing its own caller.
|
|
@@ -16,14 +19,23 @@ async function readExisting(context, pk, sk) {
|
|
|
16
19
|
TableName: context.tableName,
|
|
17
20
|
Key: { PK: pk, SK: sk },
|
|
18
21
|
ConsistentRead: true,
|
|
19
|
-
ProjectionExpression: '#c, #v, #
|
|
20
|
-
ExpressionAttributeNames: {
|
|
21
|
-
|
|
22
|
+
ProjectionExpression: '#c, #r, #v.#loc, #v.#s3k',
|
|
23
|
+
ExpressionAttributeNames: {
|
|
24
|
+
'#c': 'createdAt',
|
|
25
|
+
'#r': conditional_put_1.REVISION_ATTRIBUTE,
|
|
26
|
+
'#v': 'value',
|
|
27
|
+
'#loc': 'location',
|
|
28
|
+
'#s3k': 's3Key',
|
|
29
|
+
},
|
|
30
|
+
}), context.retry);
|
|
31
|
+
return existingFrom(existing.Item);
|
|
32
|
+
}
|
|
33
|
+
/** Project a raw row (a read result, or the row a rejection carried) onto {@link ExistingRecordMeta}. */
|
|
34
|
+
function existingFrom(item) {
|
|
22
35
|
return {
|
|
23
|
-
exists:
|
|
24
|
-
createdAt:
|
|
25
|
-
value:
|
|
26
|
-
revision:
|
|
36
|
+
exists: item !== undefined,
|
|
37
|
+
createdAt: item?.createdAt,
|
|
38
|
+
value: item?.value,
|
|
39
|
+
revision: item?.[conditional_put_1.REVISION_ATTRIBUTE],
|
|
27
40
|
};
|
|
28
41
|
}
|
|
29
|
-
//# sourceMappingURL=read-existing.js.map
|
|
@@ -29,4 +29,3 @@ export declare const VECTOR_SCORE_DIRECTIONS: readonly VectorScoreDirection[];
|
|
|
29
29
|
* caller that reaches the function some other way.
|
|
30
30
|
*/
|
|
31
31
|
export declare function toRelevanceScores(matches: VectorMatch[], direction: VectorScoreDirection): VectorMatch[];
|
|
32
|
-
//# sourceMappingURL=score-direction.d.ts.map
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import type { Item, SearchOperation } from '@langchain/langgraph-checkpoint';
|
|
2
2
|
/** True when `item` satisfies the search operation's optional metadata filter. */
|
|
3
3
|
export declare function passesFilter(item: Item, op: SearchOperation): boolean;
|
|
4
|
-
//# sourceMappingURL=search-filter.d.ts.map
|
|
@@ -1,13 +1,34 @@
|
|
|
1
|
+
import type { IndexConfig } from '@langchain/langgraph-checkpoint';
|
|
1
2
|
import type { JsonValue } from './filter';
|
|
2
3
|
import type { StoreContext } from './setup';
|
|
3
4
|
/** Cosine similarity of two equal-length vectors; 0 for zero/mismatched vectors. */
|
|
4
5
|
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
5
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* Extract and join the indexable text of a value for the configured fields,
|
|
8
|
+
* byte-for-byte as LangGraph's `InMemoryStore` does (see `text-path.ts`), so
|
|
9
|
+
* the two stores embed identical text for identical documents.
|
|
10
|
+
*/
|
|
6
11
|
export declare function extractText(value: Record<string, JsonValue>, fields: string[]): string;
|
|
7
12
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
13
|
+
* Reject a vector whose length disagrees with the configured `index.dims`. A
|
|
14
|
+
* mismatch means the embeddings model does not match the configuration, so
|
|
15
|
+
* every stored vector would be incomparable with every query; failing here
|
|
16
|
+
* surfaces that at the first put or search instead of ranking silently. The
|
|
17
|
+
* check is skipped when `dims` is not a positive integer, since nothing else
|
|
18
|
+
* in this package reads it.
|
|
19
|
+
*/
|
|
20
|
+
export declare function assertVectorDims(index: IndexConfig, vector: number[], what: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Embed several values for indexing with `embedDocuments` — the document-side
|
|
23
|
+
* method; providers such as Titan and Cohere embed documents and queries with
|
|
24
|
+
* different task types, so embedding a document with `embedQuery` degrades
|
|
25
|
+
* retrieval — batched and order-preserving. A value with no indexable text
|
|
26
|
+
* yields `undefined`; without an index every value does.
|
|
27
|
+
*/
|
|
28
|
+
export declare function embedValues(context: StoreContext, values: Record<string, JsonValue>[], fieldsOverride?: string[]): Promise<(number[] | undefined)[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Embed one value for indexing, or undefined when indexing is off or the text
|
|
31
|
+
* is empty. `fieldsOverride` (from a put's `index` option) takes precedence
|
|
32
|
+
* over the store's configured fields. See {@link embedValues}.
|
|
11
33
|
*/
|
|
12
34
|
export declare function embedValue(context: StoreContext, value: Record<string, JsonValue>, fieldsOverride?: string[]): Promise<number[] | undefined>;
|
|
13
|
-
//# sourceMappingURL=semantic-search.d.ts.map
|
|
@@ -2,8 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.cosineSimilarity = cosineSimilarity;
|
|
4
4
|
exports.extractText = extractText;
|
|
5
|
+
exports.assertVectorDims = assertVectorDims;
|
|
6
|
+
exports.embedValues = embedValues;
|
|
5
7
|
exports.embedValue = embedValue;
|
|
6
|
-
const
|
|
8
|
+
const errors_1 = require("../../shared/errors/errors");
|
|
9
|
+
const text_path_1 = require("./text-path");
|
|
10
|
+
/** Texts per `embedDocuments` call; keeps provider request sizes bounded. */
|
|
11
|
+
const EMBED_BATCH_SIZE = 100;
|
|
7
12
|
/** Cosine similarity of two equal-length vectors; 0 for zero/mismatched vectors. */
|
|
8
13
|
function cosineSimilarity(a, b) {
|
|
9
14
|
if (a.length !== b.length)
|
|
@@ -20,28 +25,63 @@ function cosineSimilarity(a, b) {
|
|
|
20
25
|
return 0;
|
|
21
26
|
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
22
27
|
}
|
|
23
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Extract and join the indexable text of a value for the configured fields,
|
|
30
|
+
* byte-for-byte as LangGraph's `InMemoryStore` does (see `text-path.ts`), so
|
|
31
|
+
* the two stores embed identical text for identical documents.
|
|
32
|
+
*/
|
|
24
33
|
function extractText(value, fields) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
34
|
+
return fields.flatMap((field) => (0, text_path_1.getTextAtPath)(value, field)).join(' ');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Reject a vector whose length disagrees with the configured `index.dims`. A
|
|
38
|
+
* mismatch means the embeddings model does not match the configuration, so
|
|
39
|
+
* every stored vector would be incomparable with every query; failing here
|
|
40
|
+
* surfaces that at the first put or search instead of ranking silently. The
|
|
41
|
+
* check is skipped when `dims` is not a positive integer, since nothing else
|
|
42
|
+
* in this package reads it.
|
|
43
|
+
*/
|
|
44
|
+
function assertVectorDims(index, vector, what) {
|
|
45
|
+
const dims = index.dims;
|
|
46
|
+
if (!Number.isInteger(dims) || dims <= 0 || vector.length === dims)
|
|
47
|
+
return;
|
|
48
|
+
throw new errors_1.ValidationError(`index.embeddings returned a ${vector.length}-dimensional ${what} vector but index.dims ` +
|
|
49
|
+
`is ${dims}; the embeddings model does not match the configured index`, 'index.dims');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Embed several values for indexing with `embedDocuments` — the document-side
|
|
53
|
+
* method; providers such as Titan and Cohere embed documents and queries with
|
|
54
|
+
* different task types, so embedding a document with `embedQuery` degrades
|
|
55
|
+
* retrieval — batched and order-preserving. A value with no indexable text
|
|
56
|
+
* yields `undefined`; without an index every value does.
|
|
57
|
+
*/
|
|
58
|
+
async function embedValues(context, values, fieldsOverride) {
|
|
59
|
+
const index = context.index;
|
|
60
|
+
if (!index)
|
|
61
|
+
return values.map(() => undefined);
|
|
62
|
+
const fields = fieldsOverride ?? index.fields ?? ['$'];
|
|
63
|
+
const pending = [];
|
|
64
|
+
values.forEach((value, position) => {
|
|
65
|
+
const text = extractText(value, fields);
|
|
66
|
+
if (text.length > 0)
|
|
67
|
+
pending.push({ text, position });
|
|
68
|
+
});
|
|
69
|
+
const vectors = values.map(() => undefined);
|
|
70
|
+
for (let start = 0; start < pending.length; start += EMBED_BATCH_SIZE) {
|
|
71
|
+
const batch = pending.slice(start, start + EMBED_BATCH_SIZE);
|
|
72
|
+
const embedded = await index.embeddings.embedDocuments(batch.map((entry) => entry.text));
|
|
73
|
+
batch.forEach((entry, i) => {
|
|
74
|
+
assertVectorDims(index, embedded[i], 'document');
|
|
75
|
+
vectors[entry.position] = embedded[i];
|
|
76
|
+
});
|
|
31
77
|
}
|
|
32
|
-
return
|
|
78
|
+
return vectors;
|
|
33
79
|
}
|
|
34
80
|
/**
|
|
35
|
-
* Embed
|
|
36
|
-
* empty. `fieldsOverride` (from a put's `index` option) takes precedence
|
|
37
|
-
* the store's configured fields.
|
|
81
|
+
* Embed one value for indexing, or undefined when indexing is off or the text
|
|
82
|
+
* is empty. `fieldsOverride` (from a put's `index` option) takes precedence
|
|
83
|
+
* over the store's configured fields. See {@link embedValues}.
|
|
38
84
|
*/
|
|
39
85
|
async function embedValue(context, value, fieldsOverride) {
|
|
40
|
-
|
|
41
|
-
return undefined;
|
|
42
|
-
const text = extractText(value, fieldsOverride ?? context.index.fields ?? ['$']);
|
|
43
|
-
if (text.length === 0)
|
|
44
|
-
return undefined;
|
|
45
|
-
return context.index.embeddings.embedQuery(text);
|
|
86
|
+
return (await embedValues(context, [value], fieldsOverride))[0];
|
|
46
87
|
}
|
|
47
|
-
//# sourceMappingURL=semantic-search.js.map
|