@farukada/aws-langgraph-dynamodb-ts 0.9.0 → 1.0.0-rc.2
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 +1720 -154
- package/dist/backfill/backfill.d.ts +168 -0
- package/dist/backfill/backfill.js +393 -0
- package/dist/checkpointer/actions/delete-thread.d.ts +47 -6
- package/dist/checkpointer/actions/delete-thread.js +58 -21
- package/dist/checkpointer/actions/get-tuple.d.ts +29 -4
- package/dist/checkpointer/actions/get-tuple.js +44 -10
- package/dist/checkpointer/actions/list.d.ts +46 -4
- package/dist/checkpointer/actions/list.js +121 -66
- package/dist/checkpointer/actions/put-writes.d.ts +41 -9
- package/dist/checkpointer/actions/put-writes.js +62 -77
- package/dist/checkpointer/actions/put.d.ts +83 -4
- package/dist/checkpointer/actions/put.js +177 -25
- package/dist/checkpointer/internal/delta-history.d.ts +112 -0
- package/dist/checkpointer/internal/delta-history.js +252 -0
- package/dist/checkpointer/internal/listing.d.ts +149 -0
- package/dist/checkpointer/internal/listing.js +245 -0
- package/dist/checkpointer/internal/parse.d.ts +262 -0
- package/dist/checkpointer/internal/parse.js +372 -0
- package/dist/checkpointer/internal/pending-writes.d.ts +275 -0
- package/dist/checkpointer/internal/pending-writes.js +588 -0
- package/dist/checkpointer/internal/read.d.ts +130 -0
- package/dist/checkpointer/internal/read.js +264 -0
- package/dist/checkpointer/internal/rows.d.ts +571 -0
- package/dist/checkpointer/internal/rows.js +834 -0
- package/dist/checkpointer/internal/setup.d.ts +42 -19
- package/dist/checkpointer/internal/setup.js +65 -29
- package/dist/checkpointer/saver.d.ts +256 -16
- package/dist/checkpointer/saver.js +275 -29
- package/dist/checkpointer/types.d.ts +39 -39
- package/dist/checkpointer/types.js +10 -1
- package/dist/factory/factory.d.ts +134 -28
- package/dist/factory/factory.js +240 -21
- package/dist/factory/types.d.ts +76 -0
- package/dist/factory/types.js +10 -0
- package/dist/history/actions/add-messages.d.ts +31 -4
- package/dist/history/actions/add-messages.js +38 -58
- package/dist/history/actions/clear.d.ts +49 -6
- package/dist/history/actions/clear.js +66 -14
- package/dist/history/actions/get-messages.d.ts +54 -6
- package/dist/history/actions/get-messages.js +126 -43
- package/dist/history/actions/list-sessions.d.ts +52 -10
- package/dist/history/actions/list-sessions.js +139 -40
- package/dist/history/actions/reconcile-count.d.ts +42 -10
- package/dist/history/actions/reconcile-count.js +45 -45
- package/dist/history/chat-message-history.d.ts +220 -33
- package/dist/history/chat-message-history.js +240 -43
- package/dist/history/internal/append.d.ts +212 -0
- package/dist/history/internal/append.js +500 -0
- package/dist/history/internal/message-read.d.ts +84 -0
- package/dist/history/internal/message-read.js +204 -0
- package/dist/history/internal/parse.d.ts +153 -0
- package/dist/history/internal/parse.js +252 -0
- package/dist/history/internal/rows.d.ts +195 -0
- package/dist/history/internal/rows.js +250 -0
- package/dist/history/internal/session.d.ts +331 -0
- package/dist/history/internal/session.js +628 -0
- package/dist/history/internal/setup.d.ts +52 -17
- package/dist/history/internal/setup.js +92 -21
- package/dist/history/session-adapter.d.ts +102 -7
- package/dist/history/session-adapter.js +103 -9
- package/dist/history/types.d.ts +80 -29
- package/dist/history/types.js +10 -1
- package/dist/index.d.ts +42 -11
- package/dist/index.js +33 -12
- package/dist/shared/adapter.d.ts +135 -0
- package/dist/shared/adapter.js +143 -0
- package/dist/shared/clock.d.ts +51 -2
- package/dist/shared/clock.js +57 -2
- package/dist/shared/codec/codec.d.ts +288 -13
- package/dist/shared/codec/codec.js +416 -19
- package/dist/shared/codec/compression.d.ts +43 -7
- package/dist/shared/codec/compression.js +53 -13
- package/dist/shared/codec/json-serde.d.ts +76 -4
- package/dist/shared/codec/json-serde.js +181 -8
- package/dist/shared/codec/s3/client-types.d.ts +53 -0
- package/dist/shared/codec/s3/client-types.js +26 -0
- package/dist/shared/codec/s3/client.d.ts +43 -10
- package/dist/shared/codec/s3/client.js +82 -9
- package/dist/shared/codec/s3/config.d.ts +242 -11
- package/dist/shared/codec/s3/config.js +293 -11
- package/dist/shared/codec/s3/lifecycle.d.ts +164 -6
- package/dist/shared/codec/s3/lifecycle.js +335 -27
- package/dist/shared/codec/s3/offloader.d.ts +393 -18
- package/dist/shared/codec/s3/offloader.js +595 -37
- package/dist/shared/concurrency.d.ts +43 -0
- package/dist/shared/concurrency.js +78 -0
- package/dist/shared/dynamodb/abort.d.ts +47 -0
- package/dist/shared/dynamodb/abort.js +59 -0
- package/dist/shared/dynamodb/batch-write.d.ts +77 -14
- package/dist/shared/dynamodb/batch-write.js +146 -27
- package/dist/shared/dynamodb/cancellation.d.ts +121 -4
- package/dist/shared/dynamodb/cancellation.js +147 -3
- package/dist/shared/dynamodb/client.d.ts +162 -8
- package/dist/shared/dynamodb/client.js +153 -5
- package/dist/shared/dynamodb/idempotent-write.d.ts +551 -0
- package/dist/shared/dynamodb/idempotent-write.js +593 -0
- package/dist/shared/dynamodb/paginate.d.ts +105 -9
- package/dist/shared/dynamodb/paginate.js +175 -7
- package/dist/shared/dynamodb/partition-delete.d.ts +185 -14
- package/dist/shared/dynamodb/partition-delete.js +314 -44
- package/dist/shared/dynamodb/recency-index.d.ts +231 -0
- package/dist/shared/dynamodb/recency-index.js +377 -0
- package/dist/shared/dynamodb/retry.d.ts +276 -8
- package/dist/shared/dynamodb/retry.js +433 -23
- package/dist/shared/dynamodb/table-schema.d.ts +190 -0
- package/dist/shared/dynamodb/table-schema.js +209 -0
- package/dist/shared/errors/base-error.d.ts +184 -10
- package/dist/shared/errors/base-error.js +160 -14
- package/dist/shared/errors/boundary.d.ts +71 -0
- package/dist/shared/errors/boundary.js +143 -0
- package/dist/shared/errors/classify.d.ts +97 -0
- package/dist/shared/errors/classify.js +257 -0
- package/dist/shared/errors/error-code.d.ts +77 -2
- package/dist/shared/errors/error-code.js +83 -1
- package/dist/shared/errors/errors.d.ts +158 -59
- package/dist/shared/errors/errors.js +219 -92
- package/dist/shared/logging/logger.d.ts +69 -3
- package/dist/shared/logging/logger.js +97 -3
- package/dist/shared/logging/redaction.d.ts +92 -8
- package/dist/shared/logging/redaction.js +273 -17
- package/dist/shared/logging/secret-patterns.d.ts +149 -19
- package/dist/shared/logging/secret-patterns.js +188 -27
- package/dist/shared/logging/truncate.d.ts +197 -0
- package/dist/shared/logging/truncate.js +231 -0
- package/dist/shared/options.d.ts +59 -7
- package/dist/shared/options.js +9 -1
- package/dist/shared/ulid.d.ts +77 -7
- package/dist/shared/ulid.js +103 -8
- package/dist/shared/validation/collaborators.d.ts +141 -0
- package/dist/shared/validation/collaborators.js +188 -0
- package/dist/shared/validation/option-shape.d.ts +89 -0
- package/dist/shared/validation/option-shape.js +113 -0
- package/dist/shared/validation/options.d.ts +145 -0
- package/dist/shared/validation/options.js +328 -0
- package/dist/shared/validation/primitives.d.ts +288 -21
- package/dist/shared/validation/primitives.js +353 -50
- package/dist/shared/validation/ttl.d.ts +66 -10
- package/dist/shared/validation/ttl.js +113 -15
- package/dist/store/actions/list-namespaces.d.ts +76 -6
- package/dist/store/actions/list-namespaces.js +166 -24
- package/dist/store/actions/put.d.ts +33 -8
- package/dist/store/actions/put.js +53 -60
- package/dist/store/actions/reconcile-vector-index.d.ts +31 -10
- package/dist/store/actions/reconcile-vector-index.js +34 -15
- package/dist/store/actions/search.d.ts +34 -6
- package/dist/store/actions/search.js +56 -51
- package/dist/store/internal/batch-plan.d.ts +26 -0
- package/dist/store/internal/batch-plan.js +109 -0
- package/dist/store/internal/filter.d.ts +36 -3
- package/dist/store/internal/filter.js +66 -15
- package/dist/store/internal/get-item.d.ts +45 -0
- package/dist/store/internal/get-item.js +115 -0
- package/dist/store/internal/item-write.d.ts +230 -0
- package/dist/store/internal/item-write.js +463 -0
- package/dist/store/internal/parse.d.ts +225 -0
- package/dist/store/internal/parse.js +350 -0
- package/dist/store/internal/rows.d.ts +355 -0
- package/dist/store/internal/rows.js +447 -0
- package/dist/store/internal/semantic-search.d.ts +161 -6
- package/dist/store/internal/semantic-search.js +360 -18
- package/dist/store/internal/setup.d.ts +77 -20
- package/dist/store/internal/setup.js +178 -47
- package/dist/store/internal/table-search.d.ts +100 -0
- package/dist/store/internal/table-search.js +213 -0
- package/dist/store/internal/vector-index.d.ts +247 -0
- package/dist/store/internal/vector-index.js +546 -0
- package/dist/store/store.d.ts +270 -17
- package/dist/store/store.js +329 -38
- package/dist/store/types.d.ts +76 -26
- package/dist/store/types.js +13 -1
- package/dist/store/vector-backend.d.ts +64 -4
- package/dist/store/vector-backend.js +15 -1
- package/package.json +58 -36
- 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 +0 -10
- package/dist/checkpointer/internal/assemble.d.ts.map +0 -1
- package/dist/checkpointer/internal/assemble.js +0 -37
- package/dist/checkpointer/internal/assemble.js.map +0 -1
- package/dist/checkpointer/internal/configurable.d.ts +0 -13
- package/dist/checkpointer/internal/configurable.d.ts.map +0 -1
- package/dist/checkpointer/internal/configurable.js +0 -23
- package/dist/checkpointer/internal/configurable.js.map +0 -1
- package/dist/checkpointer/internal/fetch.d.ts +0 -10
- package/dist/checkpointer/internal/fetch.d.ts.map +0 -1
- package/dist/checkpointer/internal/fetch.js +0 -46
- package/dist/checkpointer/internal/fetch.js.map +0 -1
- package/dist/checkpointer/internal/filter-match.d.ts +0 -12
- package/dist/checkpointer/internal/filter-match.d.ts.map +0 -1
- package/dist/checkpointer/internal/filter-match.js +0 -14
- package/dist/checkpointer/internal/filter-match.js.map +0 -1
- package/dist/checkpointer/internal/item-reader.d.ts +0 -55
- package/dist/checkpointer/internal/item-reader.d.ts.map +0 -1
- package/dist/checkpointer/internal/item-reader.js +0 -88
- package/dist/checkpointer/internal/item-reader.js.map +0 -1
- package/dist/checkpointer/internal/item-writer.d.ts +0 -26
- package/dist/checkpointer/internal/item-writer.d.ts.map +0 -1
- package/dist/checkpointer/internal/item-writer.js +0 -92
- package/dist/checkpointer/internal/item-writer.js.map +0 -1
- package/dist/checkpointer/internal/keys.d.ts +0 -31
- package/dist/checkpointer/internal/keys.d.ts.map +0 -1
- package/dist/checkpointer/internal/keys.js +0 -87
- package/dist/checkpointer/internal/keys.js.map +0 -1
- package/dist/checkpointer/internal/query.d.ts +0 -20
- package/dist/checkpointer/internal/query.d.ts.map +0 -1
- package/dist/checkpointer/internal/query.js +0 -36
- 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 +0 -30
- package/dist/checkpointer/internal/special-write-cas.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-cas.js +0 -104
- package/dist/checkpointer/internal/special-write-cas.js.map +0 -1
- package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -24
- package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-cleanup.js +0 -47
- package/dist/checkpointer/internal/special-write-cleanup.js.map +0 -1
- package/dist/checkpointer/internal/special-write-verify.d.ts +0 -54
- package/dist/checkpointer/internal/special-write-verify.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-verify.js +0 -65
- package/dist/checkpointer/internal/special-write-verify.js.map +0 -1
- package/dist/checkpointer/internal/validation.d.ts +0 -13
- package/dist/checkpointer/internal/validation.d.ts.map +0 -1
- package/dist/checkpointer/internal/validation.js +0 -30
- package/dist/checkpointer/internal/validation.js.map +0 -1
- package/dist/checkpointer/internal/write-guard.d.ts +0 -13
- package/dist/checkpointer/internal/write-guard.d.ts.map +0 -1
- package/dist/checkpointer/internal/write-guard.js +0 -39
- package/dist/checkpointer/internal/write-guard.js.map +0 -1
- package/dist/checkpointer/internal/write-index.d.ts +0 -37
- package/dist/checkpointer/internal/write-index.d.ts.map +0 -1
- package/dist/checkpointer/internal/write-index.js +0 -42
- 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 +0 -20
- package/dist/history/internal/append-saga.d.ts.map +0 -1
- package/dist/history/internal/append-saga.js +0 -35
- package/dist/history/internal/append-saga.js.map +0 -1
- package/dist/history/internal/compensation.d.ts +0 -21
- package/dist/history/internal/compensation.d.ts.map +0 -1
- package/dist/history/internal/compensation.js +0 -84
- package/dist/history/internal/compensation.js.map +0 -1
- package/dist/history/internal/item-mapper.d.ts +0 -12
- package/dist/history/internal/item-mapper.d.ts.map +0 -1
- package/dist/history/internal/item-mapper.js +0 -33
- package/dist/history/internal/item-mapper.js.map +0 -1
- package/dist/history/internal/keys.d.ts +0 -17
- package/dist/history/internal/keys.d.ts.map +0 -1
- package/dist/history/internal/keys.js +0 -49
- package/dist/history/internal/keys.js.map +0 -1
- package/dist/history/internal/message-chunker.d.ts +0 -14
- package/dist/history/internal/message-chunker.d.ts.map +0 -1
- package/dist/history/internal/message-chunker.js +0 -68
- package/dist/history/internal/message-chunker.js.map +0 -1
- package/dist/history/internal/message-transaction.d.ts +0 -26
- package/dist/history/internal/message-transaction.d.ts.map +0 -1
- package/dist/history/internal/message-transaction.js +0 -60
- package/dist/history/internal/message-transaction.js.map +0 -1
- package/dist/history/internal/query.d.ts +0 -10
- package/dist/history/internal/query.d.ts.map +0 -1
- package/dist/history/internal/query.js +0 -31
- package/dist/history/internal/query.js.map +0 -1
- package/dist/history/internal/session-count.d.ts +0 -41
- package/dist/history/internal/session-count.d.ts.map +0 -1
- package/dist/history/internal/session-count.js +0 -109
- package/dist/history/internal/session-count.js.map +0 -1
- package/dist/history/internal/session-title.d.ts +0 -20
- package/dist/history/internal/session-title.d.ts.map +0 -1
- package/dist/history/internal/session-title.js +0 -44
- package/dist/history/internal/session-title.js.map +0 -1
- package/dist/history/internal/session-update.d.ts +0 -28
- package/dist/history/internal/session-update.d.ts.map +0 -1
- package/dist/history/internal/session-update.js +0 -70
- 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 +0 -13
- package/dist/history/internal/title-generator.d.ts.map +0 -1
- package/dist/history/internal/title-generator.js +0 -25
- package/dist/history/internal/title-generator.js.map +0 -1
- package/dist/history/internal/ttl-anchor.d.ts +0 -25
- package/dist/history/internal/ttl-anchor.d.ts.map +0 -1
- package/dist/history/internal/ttl-anchor.js +0 -38
- package/dist/history/internal/ttl-anchor.js.map +0 -1
- package/dist/history/internal/validation.d.ts +0 -9
- package/dist/history/internal/validation.d.ts.map +0 -1
- package/dist/history/internal/validation.js +0 -16
- 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 +0 -4
- package/dist/shared/codec/descriptor-keys.d.ts.map +0 -1
- package/dist/shared/codec/descriptor-keys.js +0 -14
- 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 +0 -8
- package/dist/shared/codec/s3/delete.d.ts.map +0 -1
- package/dist/shared/codec/s3/delete.js +0 -29
- 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 +0 -18
- package/dist/shared/codec/s3/orphans.d.ts.map +0 -1
- package/dist/shared/codec/s3/orphans.js +0 -58
- package/dist/shared/codec/s3/orphans.js.map +0 -1
- package/dist/shared/codec/s3/read-write.d.ts +0 -14
- package/dist/shared/codec/s3/read-write.d.ts.map +0 -1
- package/dist/shared/codec/s3/read-write.js +0 -43
- package/dist/shared/codec/s3/read-write.js.map +0 -1
- package/dist/shared/codec/s3/retry.d.ts +0 -5
- package/dist/shared/codec/s3/retry.d.ts.map +0 -1
- package/dist/shared/codec/s3/retry.js +0 -25
- package/dist/shared/codec/s3/retry.js.map +0 -1
- package/dist/shared/constants.d.ts +0 -64
- package/dist/shared/constants.d.ts.map +0 -1
- package/dist/shared/constants.js +0 -67
- package/dist/shared/constants.js.map +0 -1
- package/dist/shared/dynamodb/backoff.d.ts +0 -15
- package/dist/shared/dynamodb/backoff.d.ts.map +0 -1
- package/dist/shared/dynamodb/backoff.js +0 -48
- 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 +0 -51
- package/dist/shared/dynamodb/conditional-put.d.ts.map +0 -1
- package/dist/shared/dynamodb/conditional-put.js +0 -59
- package/dist/shared/dynamodb/conditional-put.js.map +0 -1
- package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -19
- package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +0 -1
- package/dist/shared/dynamodb/drain-unprocessed.js +0 -44
- package/dist/shared/dynamodb/drain-unprocessed.js.map +0 -1
- package/dist/shared/dynamodb/paginate-core.d.ts +0 -22
- package/dist/shared/dynamodb/paginate-core.d.ts.map +0 -1
- package/dist/shared/dynamodb/paginate-core.js +0 -52
- 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 +0 -9
- package/dist/shared/dynamodb/retry-classifier.d.ts.map +0 -1
- package/dist/shared/dynamodb/retry-classifier.js +0 -87
- 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 +0 -15
- package/dist/shared/dynamodb/scan.d.ts.map +0 -1
- package/dist/shared/dynamodb/scan.js +0 -20
- package/dist/shared/dynamodb/scan.js.map +0 -1
- package/dist/shared/dynamodb/types.d.ts +0 -24
- package/dist/shared/dynamodb/types.d.ts.map +0 -1
- package/dist/shared/dynamodb/types.js +0 -3
- 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 +0 -16
- package/dist/shared/errors/wrap-error.d.ts.map +0 -1
- package/dist/shared/errors/wrap-error.js +0 -30
- 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 +0 -23
- package/dist/shared/logging/redaction-walk.d.ts.map +0 -1
- package/dist/shared/logging/redaction-walk.js +0 -92
- 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 +0 -5
- package/dist/store/actions/get.d.ts.map +0 -1
- package/dist/store/actions/get.js +0 -35
- 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 +0 -5
- package/dist/store/internal/backend-search.d.ts.map +0 -1
- package/dist/store/internal/backend-search.js +0 -68
- 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 +0 -22
- package/dist/store/internal/index-reconcile.d.ts.map +0 -1
- package/dist/store/internal/index-reconcile.js +0 -105
- package/dist/store/internal/index-reconcile.js.map +0 -1
- package/dist/store/internal/index-sync.d.ts +0 -11
- package/dist/store/internal/index-sync.d.ts.map +0 -1
- package/dist/store/internal/index-sync.js +0 -26
- package/dist/store/internal/index-sync.js.map +0 -1
- package/dist/store/internal/item-mapper.d.ts +0 -25
- package/dist/store/internal/item-mapper.d.ts.map +0 -1
- package/dist/store/internal/item-mapper.js +0 -53
- package/dist/store/internal/item-mapper.js.map +0 -1
- package/dist/store/internal/keys.d.ts +0 -18
- package/dist/store/internal/keys.d.ts.map +0 -1
- package/dist/store/internal/keys.js +0 -42
- package/dist/store/internal/keys.js.map +0 -1
- package/dist/store/internal/namespace-match.d.ts +0 -12
- package/dist/store/internal/namespace-match.d.ts.map +0 -1
- package/dist/store/internal/namespace-match.js +0 -41
- package/dist/store/internal/namespace-match.js.map +0 -1
- package/dist/store/internal/overwrite-swap.d.ts +0 -33
- package/dist/store/internal/overwrite-swap.d.ts.map +0 -1
- package/dist/store/internal/overwrite-swap.js +0 -62
- package/dist/store/internal/overwrite-swap.js.map +0 -1
- package/dist/store/internal/persist.d.ts +0 -27
- package/dist/store/internal/persist.d.ts.map +0 -1
- package/dist/store/internal/persist.js +0 -59
- package/dist/store/internal/persist.js.map +0 -1
- package/dist/store/internal/query.d.ts +0 -6
- package/dist/store/internal/query.d.ts.map +0 -1
- package/dist/store/internal/query.js +0 -32
- package/dist/store/internal/query.js.map +0 -1
- package/dist/store/internal/ranker.d.ts +0 -13
- package/dist/store/internal/ranker.d.ts.map +0 -1
- package/dist/store/internal/ranker.js +0 -31
- package/dist/store/internal/ranker.js.map +0 -1
- package/dist/store/internal/read-existing.d.ts +0 -19
- package/dist/store/internal/read-existing.d.ts.map +0 -1
- package/dist/store/internal/read-existing.js +0 -29
- package/dist/store/internal/read-existing.js.map +0 -1
- package/dist/store/internal/score-direction.d.ts +0 -32
- package/dist/store/internal/score-direction.d.ts.map +0 -1
- package/dist/store/internal/score-direction.js +0 -39
- package/dist/store/internal/score-direction.js.map +0 -1
- package/dist/store/internal/search-filter.d.ts +0 -4
- package/dist/store/internal/search-filter.d.ts.map +0 -1
- package/dist/store/internal/search-filter.js +0 -11
- 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 +0 -13
- package/dist/store/internal/validation.d.ts.map +0 -1
- package/dist/store/internal/validation.js +0 -35
- package/dist/store/internal/validation.js.map +0 -1
- package/dist/store/internal/write-verify.d.ts +0 -37
- package/dist/store/internal/write-verify.d.ts.map +0 -1
- package/dist/store/internal/write-verify.js +0 -68
- 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
|
@@ -1,17 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides what a reconcile refuses before it touches the backend.
|
|
3
|
+
*
|
|
4
|
+
* A repair is scoped to one partition's items, so its prefix must be a
|
|
5
|
+
* non-empty namespace, and without an `index` and a `vectorBackend` there is
|
|
6
|
+
* nothing to repair; both are refused here, before any read. How the backend
|
|
7
|
+
* is then made to agree with the table belongs to the vector index, so the
|
|
8
|
+
* store's method knows neither half.
|
|
9
|
+
*/
|
|
1
10
|
import type { StoreContext } from '../internal/setup';
|
|
2
|
-
|
|
3
|
-
export interface VectorReconcileResult {
|
|
4
|
-
upserted: number;
|
|
5
|
-
pruned: number;
|
|
6
|
-
}
|
|
11
|
+
import type { VectorReconcileResult } from '../types';
|
|
7
12
|
/**
|
|
8
13
|
* Repair the vector backend against the canonical DynamoDB items under
|
|
9
14
|
* `namespacePrefix`: re-push every live embedding, and — when the backend
|
|
10
15
|
* implements {@link VectorBackend.listKeys} — prune vectors with no canonical
|
|
11
16
|
* item. A maintenance tool for backend drift; run it when the namespace is
|
|
12
|
-
* idle.
|
|
13
|
-
*
|
|
14
|
-
* `
|
|
17
|
+
* idle.
|
|
18
|
+
*
|
|
19
|
+
* Accepts: `namespacePrefix` — a non-empty namespace, since the repair is
|
|
20
|
+
* scoped to one partition's items. `options.signal` — aborts between pages.
|
|
21
|
+
*
|
|
22
|
+
* Returns: how many vectors were upserted and how many pruned.
|
|
23
|
+
*
|
|
24
|
+
* Throws: `VALIDATION` naming `namespacePrefix` or `namespacePrefix element`
|
|
25
|
+
* for an empty or malformed prefix, as `search` names it, and `vectorBackend`
|
|
26
|
+
* when the store has no index or backend to reconcile;
|
|
27
|
+
* `RESULT_TRUNCATED` past `maxScanItems`, since repairing from a
|
|
28
|
+
* partial view would prune live vectors; whatever the reads, the embeddings
|
|
29
|
+
* model and the backend throw.
|
|
30
|
+
*
|
|
31
|
+
* Guarantees: re-embeds with the store's configured fields, so a per-put
|
|
32
|
+
* `index` field override is not reproduced — a reconcile makes the backend
|
|
33
|
+
* agree with the store's configuration, not with each item's write-time one.
|
|
34
|
+
* DynamoDB is never written: only the backend is repaired.
|
|
15
35
|
*/
|
|
16
|
-
export declare function reconcileVectorIndex(context: StoreContext, namespacePrefix: string[]
|
|
17
|
-
|
|
36
|
+
export declare function reconcileVectorIndex(context: StoreContext, namespacePrefix: string[], options?: {
|
|
37
|
+
signal?: AbortSignal;
|
|
38
|
+
}): Promise<VectorReconcileResult>;
|
|
@@ -1,27 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides what a reconcile refuses before it touches the backend.
|
|
4
|
+
*
|
|
5
|
+
* A repair is scoped to one partition's items, so its prefix must be a
|
|
6
|
+
* non-empty namespace, and without an `index` and a `vectorBackend` there is
|
|
7
|
+
* nothing to repair; both are refused here, before any read. How the backend
|
|
8
|
+
* is then made to agree with the table belongs to the vector index, so the
|
|
9
|
+
* store's method knows neither half.
|
|
10
|
+
*/
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
exports.reconcileVectorIndex = reconcileVectorIndex;
|
|
4
13
|
const errors_1 = require("../../shared/errors/errors");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
14
|
+
const parse_1 = require("../internal/parse");
|
|
15
|
+
const vector_index_1 = require("../internal/vector-index");
|
|
7
16
|
/**
|
|
8
17
|
* Repair the vector backend against the canonical DynamoDB items under
|
|
9
18
|
* `namespacePrefix`: re-push every live embedding, and — when the backend
|
|
10
19
|
* implements {@link VectorBackend.listKeys} — prune vectors with no canonical
|
|
11
20
|
* item. A maintenance tool for backend drift; run it when the namespace is
|
|
12
|
-
* idle.
|
|
13
|
-
*
|
|
14
|
-
* `
|
|
21
|
+
* idle.
|
|
22
|
+
*
|
|
23
|
+
* Accepts: `namespacePrefix` — a non-empty namespace, since the repair is
|
|
24
|
+
* scoped to one partition's items. `options.signal` — aborts between pages.
|
|
25
|
+
*
|
|
26
|
+
* Returns: how many vectors were upserted and how many pruned.
|
|
27
|
+
*
|
|
28
|
+
* Throws: `VALIDATION` naming `namespacePrefix` or `namespacePrefix element`
|
|
29
|
+
* for an empty or malformed prefix, as `search` names it, and `vectorBackend`
|
|
30
|
+
* when the store has no index or backend to reconcile;
|
|
31
|
+
* `RESULT_TRUNCATED` past `maxScanItems`, since repairing from a
|
|
32
|
+
* partial view would prune live vectors; whatever the reads, the embeddings
|
|
33
|
+
* model and the backend throw.
|
|
34
|
+
*
|
|
35
|
+
* Guarantees: re-embeds with the store's configured fields, so a per-put
|
|
36
|
+
* `index` field override is not reproduced — a reconcile makes the backend
|
|
37
|
+
* agree with the store's configuration, not with each item's write-time one.
|
|
38
|
+
* DynamoDB is never written: only the backend is repaired.
|
|
15
39
|
*/
|
|
16
|
-
async function reconcileVectorIndex(context, namespacePrefix) {
|
|
17
|
-
(0,
|
|
18
|
-
if (!
|
|
19
|
-
throw
|
|
40
|
+
async function reconcileVectorIndex(context, namespacePrefix, options = {}) {
|
|
41
|
+
const prefix = (0, parse_1.parseNamespace)(namespacePrefix, 'namespacePrefix');
|
|
42
|
+
if (!(0, vector_index_1.hasVectorBackend)(context)) {
|
|
43
|
+
throw (0, errors_1.validationError)('reconcileVectorIndex requires a configured index and vectorBackend', 'vectorBackend');
|
|
20
44
|
}
|
|
21
|
-
|
|
22
|
-
const targets = await (0, index_reconcile_1.collectReconcileTargets)(context, namespacePrefix);
|
|
23
|
-
const upserted = await (0, index_reconcile_1.pushEmbeddings)(backend, targets);
|
|
24
|
-
const pruned = await (0, index_reconcile_1.pruneOrphans)(context, backend, namespacePrefix, targets);
|
|
25
|
-
return { upserted, pruned };
|
|
45
|
+
return (0, vector_index_1.reconcileVectors)(context, prefix, options.signal);
|
|
26
46
|
}
|
|
27
|
-
//# sourceMappingURL=reconcile-vector-index.js.map
|
|
@@ -1,10 +1,38 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Hides which of three paths serves a search.
|
|
3
|
+
*
|
|
4
|
+
* A query with a `vectorBackend` is answered by the backend; no query, or no
|
|
5
|
+
* `index` to embed one with, is a page read from the table that stops once
|
|
6
|
+
* full; anything else is ranked in memory over at most `maxSearchCandidates`.
|
|
7
|
+
* A page of zero is answered before any of them. A caller gets the same shape
|
|
8
|
+
* of page whichever path ran, scored exactly when a query could be ranked.
|
|
9
|
+
*/
|
|
10
|
+
import type { SearchItem } from '@langchain/langgraph-checkpoint';
|
|
11
|
+
import type { ParsedSearch } from '../internal/parse';
|
|
2
12
|
import type { StoreContext } from '../internal/setup';
|
|
3
13
|
/**
|
|
4
14
|
* Search items under a namespace prefix: metadata filtering plus optional
|
|
5
|
-
* semantic ranking.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
15
|
+
* semantic ranking.
|
|
16
|
+
*
|
|
17
|
+
* Accepts: `search` — already parsed, so `namespacePrefix`, `offset` and
|
|
18
|
+
* `limit` are resolved; `search.query` absent or empty
|
|
19
|
+
* (which is absent: there is no query to embed) ranks nothing and returns the
|
|
20
|
+
* page as read, which is what the reference store does
|
|
21
|
+
* (`@langchain/langgraph-checkpoint@1.1.5` `dist/store/memory.js:70-80`, where a
|
|
22
|
+
* falsy query takes the unscored path). A query without a configured `index`
|
|
23
|
+
* does the same, since there is nothing to embed it with.
|
|
24
|
+
*
|
|
25
|
+
* Returns: at most `limit` items from `offset`. With a query and an index every
|
|
26
|
+
* item carries a `score`; without one none does. Scores rank best-first; an item
|
|
27
|
+
* that cannot be scored ranks last rather than being dropped.
|
|
28
|
+
*
|
|
29
|
+
* Throws: `VALIDATION` naming `maxSearchCandidates` or `index.dims`; whatever
|
|
30
|
+
* the reads, decodes and the embeddings model throw.
|
|
31
|
+
*
|
|
32
|
+
* Guarantees: a page of zero costs no request at all, and otherwise only the
|
|
33
|
+
* page's own items are decoded on the unranked path — the
|
|
34
|
+
* read stops as soon as it is full. A semantic search must read every candidate
|
|
35
|
+
* to rank it, which is why it is capped and why a large corpus belongs in a
|
|
36
|
+
* `vectorBackend`.
|
|
8
37
|
*/
|
|
9
|
-
export declare function searchItems(context: StoreContext,
|
|
10
|
-
//# sourceMappingURL=search.d.ts.map
|
|
38
|
+
export declare function searchItems(context: StoreContext, search: ParsedSearch, signal?: AbortSignal): Promise<SearchItem[]>;
|
|
@@ -1,61 +1,66 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides which of three paths serves a search.
|
|
4
|
+
*
|
|
5
|
+
* A query with a `vectorBackend` is answered by the backend; no query, or no
|
|
6
|
+
* `index` to embed one with, is a page read from the table that stops once
|
|
7
|
+
* full; anything else is ranked in memory over at most `maxSearchCandidates`.
|
|
8
|
+
* A page of zero is answered before any of them. A caller gets the same shape
|
|
9
|
+
* of page whichever path ran, scored exactly when a query could be ranked.
|
|
10
|
+
*/
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
exports.searchItems = searchItems;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const keys_1 = require("../internal/keys");
|
|
9
|
-
const query_1 = require("../internal/query");
|
|
10
|
-
const ranker_1 = require("../internal/ranker");
|
|
11
|
-
const search_filter_1 = require("../internal/search-filter");
|
|
12
|
-
const validation_1 = require("../internal/validation");
|
|
13
|
-
const DEFAULT_LIMIT = 10;
|
|
14
|
-
async function collectCandidates(context, op) {
|
|
15
|
-
const source = op.namespacePrefix.length > 0
|
|
16
|
-
? (0, paginate_1.paginateQuery)({
|
|
17
|
-
client: context.client,
|
|
18
|
-
params: (0, query_1.scopedQuery)(context.tableName, op.namespacePrefix),
|
|
19
|
-
maxItems: context.maxScanItems,
|
|
20
|
-
})
|
|
21
|
-
: (0, scan_1.paginateScan)({
|
|
22
|
-
client: context.client,
|
|
23
|
-
params: (0, query_1.storeScan)(context.tableName),
|
|
24
|
-
maxItems: context.maxScanItems,
|
|
25
|
-
});
|
|
26
|
-
const candidates = [];
|
|
27
|
-
for await (const raw of source) {
|
|
28
|
-
const record = (0, item_mapper_1.narrowStoreRecord)(raw);
|
|
29
|
-
if (!record)
|
|
30
|
-
continue;
|
|
31
|
-
if (!(0, keys_1.namespaceMatchesPrefix)(record.namespace, op.namespacePrefix))
|
|
32
|
-
continue;
|
|
33
|
-
const item = await (0, item_mapper_1.readStoreItem)(context, record);
|
|
34
|
-
if (!(0, search_filter_1.passesFilter)(item, op))
|
|
35
|
-
continue;
|
|
36
|
-
candidates.push({ item, embedding: record.embedding });
|
|
37
|
-
}
|
|
38
|
-
return candidates;
|
|
39
|
-
}
|
|
13
|
+
const truncate_1 = require("../../shared/logging/truncate");
|
|
14
|
+
const semantic_search_1 = require("../internal/semantic-search");
|
|
15
|
+
const table_search_1 = require("../internal/table-search");
|
|
16
|
+
const vector_index_1 = require("../internal/vector-index");
|
|
40
17
|
/**
|
|
41
18
|
* Search items under a namespace prefix: metadata filtering plus optional
|
|
42
|
-
* semantic ranking.
|
|
43
|
-
*
|
|
44
|
-
*
|
|
19
|
+
* semantic ranking.
|
|
20
|
+
*
|
|
21
|
+
* Accepts: `search` — already parsed, so `namespacePrefix`, `offset` and
|
|
22
|
+
* `limit` are resolved; `search.query` absent or empty
|
|
23
|
+
* (which is absent: there is no query to embed) ranks nothing and returns the
|
|
24
|
+
* page as read, which is what the reference store does
|
|
25
|
+
* (`@langchain/langgraph-checkpoint@1.1.5` `dist/store/memory.js:70-80`, where a
|
|
26
|
+
* falsy query takes the unscored path). A query without a configured `index`
|
|
27
|
+
* does the same, since there is nothing to embed it with.
|
|
28
|
+
*
|
|
29
|
+
* Returns: at most `limit` items from `offset`. With a query and an index every
|
|
30
|
+
* item carries a `score`; without one none does. Scores rank best-first; an item
|
|
31
|
+
* that cannot be scored ranks last rather than being dropped.
|
|
32
|
+
*
|
|
33
|
+
* Throws: `VALIDATION` naming `maxSearchCandidates` or `index.dims`; whatever
|
|
34
|
+
* the reads, decodes and the embeddings model throw.
|
|
35
|
+
*
|
|
36
|
+
* Guarantees: a page of zero costs no request at all, and otherwise only the
|
|
37
|
+
* page's own items are decoded on the unranked path — the
|
|
38
|
+
* read stops as soon as it is full. A semantic search must read every candidate
|
|
39
|
+
* to rank it, which is why it is capped and why a large corpus belongs in a
|
|
40
|
+
* `vectorBackend`.
|
|
45
41
|
*/
|
|
46
|
-
async function searchItems(context,
|
|
47
|
-
const offset
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
42
|
+
async function searchItems(context, search, signal) {
|
|
43
|
+
const { offset, limit } = search;
|
|
44
|
+
// A zero page is answered here, ahead of all three paths below, because each
|
|
45
|
+
// of them pays for it: `collectCandidates` pulls the first row out of the
|
|
46
|
+
// paginator before it tests its `offset + limit` bound, so even a page that
|
|
47
|
+
// needs nothing costs one Query or Scan, and the two ranked paths embed the
|
|
48
|
+
// query as well. Slicing the result to nothing afterwards hid the cost
|
|
49
|
+
// rather than avoiding it.
|
|
50
|
+
if (limit === 0)
|
|
51
|
+
return [];
|
|
52
|
+
if (search.query && (0, vector_index_1.hasVectorBackend)(context)) {
|
|
53
|
+
const ranked = await (0, vector_index_1.searchViaBackend)(context, search, signal);
|
|
52
54
|
return ranked.slice(offset, offset + limit);
|
|
53
55
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return
|
|
56
|
+
if (!search.query || !context.index) {
|
|
57
|
+
const page = await (0, table_search_1.collectCandidates)(context, search, { kind: 'page', need: offset + limit }, signal);
|
|
58
|
+
return page.map(({ item }) => ({ ...item })).slice(offset, offset + limit);
|
|
57
59
|
}
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
+
const candidates = await (0, table_search_1.collectCandidates)(context, search, { kind: 'semantic', cap: context.maxSearchCandidates }, signal);
|
|
61
|
+
const queryVector = await context.index.embeddings.embedQuery(search.query);
|
|
62
|
+
(0, semantic_search_1.assertVectorDims)(context.index, queryVector, 'query');
|
|
63
|
+
const ranked = (0, table_search_1.rankInMemory)(candidates, queryVector, context.maxSearchCandidates, (count) => context.logger.warn('search: some candidates carry an embedding of a different dimension than the query and ' +
|
|
64
|
+
'were ranked unscored; re-embed them with reconcileVectorIndex or a re-put', { namespacePrefix: (0, truncate_1.truncateLabelsForLog)(search.namespacePrefix), count }));
|
|
65
|
+
return ranked.slice(offset, offset + limit);
|
|
60
66
|
}
|
|
61
|
-
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides how a batch runs concurrently and still in the order it was written.
|
|
3
|
+
*
|
|
4
|
+
* Operations on different items, and reads of the same item, share a run and
|
|
5
|
+
* go in flight together; anything that could observe or overwrite an earlier
|
|
6
|
+
* operation's effect starts the next run. A caller sees the order it wrote —
|
|
7
|
+
* a `get` after a `put` of the same item sees it, a `search` sees every write
|
|
8
|
+
* before it — and how independence is judged can change without the store.
|
|
9
|
+
*/
|
|
10
|
+
import type { ParsedOperation } from './parse';
|
|
11
|
+
/**
|
|
12
|
+
* Run a batch: each run of independent operations concurrently, at most
|
|
13
|
+
* `limit` in flight, and the runs themselves in
|
|
14
|
+
* order. Results come back in operation order.
|
|
15
|
+
*
|
|
16
|
+
* Accepts: `operations` — in caller order, which is the order they are
|
|
17
|
+
* observed in; empty returns empty. `limit` — operations in flight within one
|
|
18
|
+
* run.
|
|
19
|
+
*
|
|
20
|
+
* Returns: the results in operation order, not completion order.
|
|
21
|
+
*
|
|
22
|
+
* Throws: the first failure. Any failure rejects the whole batch: no operation
|
|
23
|
+
* in a later run starts, the ones already in flight settle, and that first
|
|
24
|
+
* error is the one thrown.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runBatch<R>(operations: readonly ParsedOperation[], dispatch: (operation: ParsedOperation) => Promise<R>, limit?: number): Promise<R[]>;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides how a batch runs concurrently and still in the order it was written.
|
|
4
|
+
*
|
|
5
|
+
* Operations on different items, and reads of the same item, share a run and
|
|
6
|
+
* go in flight together; anything that could observe or overwrite an earlier
|
|
7
|
+
* operation's effect starts the next run. A caller sees the order it wrote —
|
|
8
|
+
* a `get` after a `put` of the same item sees it, a `search` sees every write
|
|
9
|
+
* before it — and how independence is judged can change without the store.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.runBatch = runBatch;
|
|
13
|
+
const concurrency_1 = require("../../shared/concurrency");
|
|
14
|
+
function itemOf(address) {
|
|
15
|
+
return JSON.stringify([address.namespace, address.key]);
|
|
16
|
+
}
|
|
17
|
+
/** What `op` touches, decided by the kind the parser already assigned — the only place that asks. */
|
|
18
|
+
function touchOf(op) {
|
|
19
|
+
switch (op.kind) {
|
|
20
|
+
case 'put':
|
|
21
|
+
case 'delete':
|
|
22
|
+
return { kind: 'write', item: itemOf(op.address) };
|
|
23
|
+
case 'get':
|
|
24
|
+
return { kind: 'get', item: itemOf(op.address) };
|
|
25
|
+
default:
|
|
26
|
+
return { kind: 'broad' };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* True when `touch` may not join `segment` — because some operation already in
|
|
31
|
+
* it addresses the same item, or because a write and a whole-store read would
|
|
32
|
+
* then be unordered with respect to each other.
|
|
33
|
+
*/
|
|
34
|
+
function conflicts(segment, touch) {
|
|
35
|
+
if (touch.kind === 'broad')
|
|
36
|
+
return segment.hasWrite;
|
|
37
|
+
if (touch.kind === 'get')
|
|
38
|
+
return segment.written.has(touch.item);
|
|
39
|
+
return segment.written.has(touch.item) || segment.read.has(touch.item) || segment.hasBroad;
|
|
40
|
+
}
|
|
41
|
+
function admit(segment, index, touch) {
|
|
42
|
+
segment.indices.push(index);
|
|
43
|
+
if (touch.kind === 'broad')
|
|
44
|
+
segment.hasBroad = true;
|
|
45
|
+
if (touch.kind === 'get')
|
|
46
|
+
segment.read.add(touch.item);
|
|
47
|
+
if (touch.kind === 'write') {
|
|
48
|
+
segment.written.add(touch.item);
|
|
49
|
+
segment.hasWrite = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function emptySegment() {
|
|
53
|
+
return { indices: [], written: new Set(), read: new Set(), hasWrite: false, hasBroad: false };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Split a batch into runs of mutually independent operations, in caller order.
|
|
57
|
+
*
|
|
58
|
+
* Operations that address different items, and reads that address the same
|
|
59
|
+
* item, are independent of each other and share a run. Anything that could
|
|
60
|
+
* observe or overwrite an earlier operation's effect starts a new one, so the
|
|
61
|
+
* order the caller wrote is the order the caller observes: a `get` after a
|
|
62
|
+
* `put` of the same item sees it, a `get` before one does not, and a `search`
|
|
63
|
+
* sees every write that precedes it and none that follow.
|
|
64
|
+
*
|
|
65
|
+
* Running every write before every read — the earlier behaviour — made a
|
|
66
|
+
* `[delete, get]` batch return nothing where the reference store returns the
|
|
67
|
+
* value, and a `[get, put]` batch return the new value where the reference
|
|
68
|
+
* returns null. `AsyncBatchedStore` coalesces everything enqueued in one tick
|
|
69
|
+
* into a single `batch()`, so that difference is reachable from ordinary code.
|
|
70
|
+
*/
|
|
71
|
+
function planBatch(operations) {
|
|
72
|
+
const runs = [];
|
|
73
|
+
let segment = emptySegment();
|
|
74
|
+
operations.forEach((op, index) => {
|
|
75
|
+
const touch = touchOf(op);
|
|
76
|
+
if (segment.indices.length > 0 && conflicts(segment, touch)) {
|
|
77
|
+
runs.push(segment.indices);
|
|
78
|
+
segment = emptySegment();
|
|
79
|
+
}
|
|
80
|
+
admit(segment, index, touch);
|
|
81
|
+
});
|
|
82
|
+
if (segment.indices.length > 0)
|
|
83
|
+
runs.push(segment.indices);
|
|
84
|
+
return runs;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Run a batch: each run of independent operations concurrently, at most
|
|
88
|
+
* `limit` in flight, and the runs themselves in
|
|
89
|
+
* order. Results come back in operation order.
|
|
90
|
+
*
|
|
91
|
+
* Accepts: `operations` — in caller order, which is the order they are
|
|
92
|
+
* observed in; empty returns empty. `limit` — operations in flight within one
|
|
93
|
+
* run.
|
|
94
|
+
*
|
|
95
|
+
* Returns: the results in operation order, not completion order.
|
|
96
|
+
*
|
|
97
|
+
* Throws: the first failure. Any failure rejects the whole batch: no operation
|
|
98
|
+
* in a later run starts, the ones already in flight settle, and that first
|
|
99
|
+
* error is the one thrown.
|
|
100
|
+
*/
|
|
101
|
+
async function runBatch(operations, dispatch, limit = concurrency_1.DEFAULT_READ_CONCURRENCY) {
|
|
102
|
+
const results = [];
|
|
103
|
+
for (const run of planBatch(operations)) {
|
|
104
|
+
await (0, concurrency_1.mapWithConcurrency)(run, limit, async (index) => {
|
|
105
|
+
results[index] = await dispatch(operations[index]);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return results;
|
|
109
|
+
}
|
|
@@ -1,10 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides the store's filter grammar.
|
|
3
|
+
*
|
|
4
|
+
* Which operators a search filter accepts, how each compares a stored field —
|
|
5
|
+
* ordered comparisons only between like-typed values, an absent field matching
|
|
6
|
+
* nothing — and whether an item passes a search's optional filter are decided
|
|
7
|
+
* here, the same way whichever search path runs.
|
|
8
|
+
*/
|
|
9
|
+
import type { Item } from '@langchain/langgraph-checkpoint';
|
|
1
10
|
/** A JSON value stored in an item or supplied in a filter. */
|
|
2
11
|
export type JsonValue = string | number | boolean | null | JsonValue[] | {
|
|
3
12
|
[key: string]: JsonValue;
|
|
4
13
|
};
|
|
5
14
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
15
|
+
* Whether `value` satisfies every field condition in `filter`.
|
|
16
|
+
*
|
|
17
|
+
* Accepts: `value` — a stored item's decoded value. Declared as a record, but a
|
|
18
|
+
* row holds whatever its writer stored, including `null` and a scalar; such a
|
|
19
|
+
* value has no own properties and so satisfies no condition. `filter` — a plain
|
|
20
|
+
* value per field is exact match, an operator object (`{ $gt: 4 }`) applies
|
|
21
|
+
* comparisons, and `{}` constrains nothing.
|
|
22
|
+
*
|
|
23
|
+
* Returns: whether every condition holds.
|
|
24
|
+
*
|
|
25
|
+
* Throws: nothing. `search` walks every candidate row, so one row whose value
|
|
26
|
+
* is not an object must not fail the search.
|
|
27
|
+
*
|
|
28
|
+
* Guarantees: own properties only — `value['toString']` would otherwise resolve
|
|
29
|
+
* up the prototype chain and be compared as if it were stored data.
|
|
8
30
|
*/
|
|
9
31
|
export declare function matchesStoreFilter(value: Record<string, JsonValue>, filter: Record<string, JsonValue>): boolean;
|
|
10
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Whether `item` satisfies a search's optional metadata filter.
|
|
34
|
+
*
|
|
35
|
+
* Accepts: `filter` — a parsed search's filter; absent passes every item.
|
|
36
|
+
* `item.value` — whatever the item's writer stored; a value that is not
|
|
37
|
+
* an object satisfies no condition (see `matchesStoreFilter`).
|
|
38
|
+
*
|
|
39
|
+
* Returns: whether the item belongs in the result.
|
|
40
|
+
*
|
|
41
|
+
* Throws: nothing, so one unusual row cannot fail a search over many.
|
|
42
|
+
*/
|
|
43
|
+
export declare function passesFilter(item: Item, filter: Record<string, JsonValue> | undefined): boolean;
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides the store's filter grammar.
|
|
4
|
+
*
|
|
5
|
+
* Which operators a search filter accepts, how each compares a stored field —
|
|
6
|
+
* ordered comparisons only between like-typed values, an absent field matching
|
|
7
|
+
* nothing — and whether an item passes a search's optional filter are decided
|
|
8
|
+
* here, the same way whichever search path runs.
|
|
9
|
+
*/
|
|
2
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
11
|
exports.matchesStoreFilter = matchesStoreFilter;
|
|
12
|
+
exports.passesFilter = passesFilter;
|
|
4
13
|
const node_util_1 = require("node:util");
|
|
5
14
|
/**
|
|
6
15
|
* Three-way order for a like-typed pair, or `undefined` when the pair is
|
|
@@ -24,8 +33,8 @@ function testOrder(order, test) {
|
|
|
24
33
|
* Ordered comparison over like-typed values only: numbers compare numerically,
|
|
25
34
|
* strings lexicographically, and a mismatched or unordered pair never matches.
|
|
26
35
|
*
|
|
27
|
-
* Deliberately stricter than both
|
|
28
|
-
* Native `>` coerces, so a stored `'10'`
|
|
36
|
+
* Deliberately stricter than both native comparison and what upstream does.
|
|
37
|
+
* Native `>` coerces, so a stored `'10'` would satisfy `{ $gt: 5 }` — inclusion
|
|
29
38
|
* decided by JS coercion rather than by the stored type. Upstream instead
|
|
30
39
|
* reduces both sides with `Number()`, which makes two ISO-8601 date strings
|
|
31
40
|
* `NaN` and every comparison between them false. Comparing like types
|
|
@@ -55,17 +64,28 @@ const COMPARATORS = {
|
|
|
55
64
|
: true,
|
|
56
65
|
};
|
|
57
66
|
/**
|
|
58
|
-
* True
|
|
59
|
-
* the
|
|
60
|
-
*
|
|
61
|
-
* Schema document
|
|
62
|
-
* filter
|
|
67
|
+
* True when every key is one of the exact known operator names, which matches
|
|
68
|
+
* the reference store's own detection (`@langchain/langgraph-checkpoint@1.1.5`
|
|
69
|
+
* `dist/store/utils.js:61`): a stored value that merely has `$`-prefixed keys —
|
|
70
|
+
* a JSON Schema document, say — is compared as a literal instead of misread as
|
|
71
|
+
* a filter.
|
|
72
|
+
*
|
|
73
|
+
* An empty condition qualifies, and therefore imposes no constraint: `every`
|
|
74
|
+
* over no operators is true, exactly as it is upstream, so `{ field: {} }`
|
|
75
|
+
* matches every item — including one that does not hold the field at all, for
|
|
76
|
+
* which there is likewise no operator to fail. Requiring at least one key
|
|
77
|
+
* inverted that answer and made the same filter match nothing.
|
|
78
|
+
*
|
|
79
|
+
* Arrays are excluded where the reference does not. Upstream an empty array
|
|
80
|
+
* reaches `Object.keys([]).every(...)` and is likewise vacuously true, so `[]`
|
|
81
|
+
* as a condition matches everything there; treating a stored array as a literal
|
|
82
|
+
* to compare is the answer a caller means, and the difference is recorded
|
|
83
|
+
* rather than copied.
|
|
63
84
|
*/
|
|
64
85
|
function isOperatorObject(condition) {
|
|
65
86
|
return (typeof condition === 'object' &&
|
|
66
87
|
condition !== null &&
|
|
67
88
|
!Array.isArray(condition) &&
|
|
68
|
-
Object.keys(condition).length > 0 &&
|
|
69
89
|
Object.keys(condition).every((key) => Object.prototype.hasOwnProperty.call(COMPARATORS, key)));
|
|
70
90
|
}
|
|
71
91
|
function matchesCondition(actual, condition) {
|
|
@@ -73,14 +93,45 @@ function matchesCondition(actual, condition) {
|
|
|
73
93
|
return (0, node_util_1.isDeepStrictEqual)(actual, condition);
|
|
74
94
|
return Object.entries(condition).every(([operator, expected]) => COMPARATORS[operator](actual, expected));
|
|
75
95
|
}
|
|
96
|
+
/** The value `item` holds at `field`, or undefined when it holds no such own property. */
|
|
97
|
+
function ownField(item, field) {
|
|
98
|
+
if (item === null || typeof item !== 'object')
|
|
99
|
+
return undefined;
|
|
100
|
+
return Object.hasOwn(item, field) ? item[field] : undefined;
|
|
101
|
+
}
|
|
76
102
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
103
|
+
* Whether `value` satisfies every field condition in `filter`.
|
|
104
|
+
*
|
|
105
|
+
* Accepts: `value` — a stored item's decoded value. Declared as a record, but a
|
|
106
|
+
* row holds whatever its writer stored, including `null` and a scalar; such a
|
|
107
|
+
* value has no own properties and so satisfies no condition. `filter` — a plain
|
|
108
|
+
* value per field is exact match, an operator object (`{ $gt: 4 }`) applies
|
|
109
|
+
* comparisons, and `{}` constrains nothing.
|
|
110
|
+
*
|
|
111
|
+
* Returns: whether every condition holds.
|
|
112
|
+
*
|
|
113
|
+
* Throws: nothing. `search` walks every candidate row, so one row whose value
|
|
114
|
+
* is not an object must not fail the search.
|
|
115
|
+
*
|
|
116
|
+
* Guarantees: own properties only — `value['toString']` would otherwise resolve
|
|
117
|
+
* up the prototype chain and be compared as if it were stored data.
|
|
79
118
|
*/
|
|
80
119
|
function matchesStoreFilter(value, filter) {
|
|
81
|
-
return Object.entries(filter).every(([field, condition]) =>
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
120
|
+
return Object.entries(filter).every(([field, condition]) => matchesCondition(ownField(value, field), condition));
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Whether `item` satisfies a search's optional metadata filter.
|
|
124
|
+
*
|
|
125
|
+
* Accepts: `filter` — a parsed search's filter; absent passes every item.
|
|
126
|
+
* `item.value` — whatever the item's writer stored; a value that is not
|
|
127
|
+
* an object satisfies no condition (see `matchesStoreFilter`).
|
|
128
|
+
*
|
|
129
|
+
* Returns: whether the item belongs in the result.
|
|
130
|
+
*
|
|
131
|
+
* Throws: nothing, so one unusual row cannot fail a search over many.
|
|
132
|
+
*/
|
|
133
|
+
function passesFilter(item, filter) {
|
|
134
|
+
if (!filter)
|
|
135
|
+
return true;
|
|
136
|
+
return matchesStoreFilter(item.value, filter);
|
|
85
137
|
}
|
|
86
|
-
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides what a single read counts as absent, and how it outlives an overwrite.
|
|
3
|
+
*
|
|
4
|
+
* A get reads its row strongly consistently and answers `null` alike for a
|
|
5
|
+
* missing row, an expired one and a row this adapter does not own. When the
|
|
6
|
+
* object an offloaded row names is deleted between the row read and the
|
|
7
|
+
* download, one re-read settles whether the item was replaced, removed or
|
|
8
|
+
* truly lost. A caller gets an item or `null` and never sees the race.
|
|
9
|
+
*/
|
|
10
|
+
import type { Item } from '@langchain/langgraph-checkpoint';
|
|
11
|
+
import type { StoreAddress } from './parse';
|
|
12
|
+
import type { StoreContext } from './setup';
|
|
13
|
+
/**
|
|
14
|
+
* Retrieve a single item by namespace and key (strongly consistent), or null.
|
|
15
|
+
*
|
|
16
|
+
* An offloaded item can lose a race with a concurrent overwrite: between the
|
|
17
|
+
* row read and the S3 download the writer commits a new descriptor and deletes
|
|
18
|
+
* the object this read was about to fetch. That surfaces as `NoSuchKey`, and
|
|
19
|
+
* one strongly-consistent re-read settles it — the row now points at the new
|
|
20
|
+
* object (return that), is gone (null), or still points at the same missing
|
|
21
|
+
* object (a genuine loss, rethrown). A row the overwrite left with no
|
|
22
|
+
* descriptor at all is a replacement like any other: it is decoded, and refused
|
|
23
|
+
* by its own coded error. Any other download failure propagates.
|
|
24
|
+
*
|
|
25
|
+
* Accepts: `address` — parsed; no check is repeated here. `signal` — aborts
|
|
26
|
+
* the reads.
|
|
27
|
+
*
|
|
28
|
+
* Returns: the item, or `null` for one that does not exist, has expired, or
|
|
29
|
+
* whose key holds a row this adapter does not own — which includes a row whose
|
|
30
|
+
* `createdAt` or `updatedAt` is not the string this package writes there, since
|
|
31
|
+
* an item is reported with both. The answers are one on purpose: a caller
|
|
32
|
+
* cannot act on the difference, and reporting a foreign row would leak that a
|
|
33
|
+
* shared table holds one.
|
|
34
|
+
*
|
|
35
|
+
* Throws: `VALIDATION` naming — for a row whose descriptor is not one —
|
|
36
|
+
* `descriptor`; `FORMAT_UNSUPPORTED` for
|
|
37
|
+
* a row, or a payload, written by a newer version, which is *not* reported as
|
|
38
|
+
* absent — hiding an item that exists is worse than failing; `PAYLOAD_CORRUPT`
|
|
39
|
+
* or the download's own error for a payload that cannot be read; `ABORTED`
|
|
40
|
+
* when the signal fires.
|
|
41
|
+
*
|
|
42
|
+
* Guarantees: strongly consistent — an item just written is always seen, and
|
|
43
|
+
* the ttl is honoured here rather than waited for.
|
|
44
|
+
*/
|
|
45
|
+
export declare function getItem(context: StoreContext, address: StoreAddress, signal?: AbortSignal): Promise<Item | null>;
|