@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,34 +1,132 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides how a `ttl` option becomes an expiry.
|
|
4
|
+
*
|
|
5
|
+
* A caller gives days or seconds. The one-unit rule, the five-year cap, the
|
|
6
|
+
* epoch second DynamoDB's TTL attribute takes, and the S3 lifecycle days that
|
|
7
|
+
* keep an offloaded object alive past its row's sweep lag are all derived
|
|
8
|
+
* here, so the two spellings of the `ttl` option are accepted or rejected
|
|
9
|
+
* alike and no reader re-derives one unit from the other itself. A stored
|
|
10
|
+
* row's own epoch-second `ttl` is converted to milliseconds for `Date` where
|
|
11
|
+
* that row is read, not here.
|
|
12
|
+
*/
|
|
2
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS = exports.MAX_TTL_SECONDS = exports.MAX_TTL_DAYS = void 0;
|
|
3
15
|
exports.resolveTtlSeconds = resolveTtlSeconds;
|
|
4
16
|
exports.calculateTtlTimestamp = calculateTtlTimestamp;
|
|
5
|
-
exports.
|
|
6
|
-
const
|
|
17
|
+
exports.lifecycleExpirationDays = lifecycleExpirationDays;
|
|
18
|
+
const errors_1 = require("../errors/errors");
|
|
19
|
+
const option_shape_1 = require("./option-shape");
|
|
7
20
|
const primitives_1 = require("./primitives");
|
|
8
21
|
const SECONDS_PER_DAY = 24 * 60 * 60;
|
|
9
|
-
/**
|
|
22
|
+
/** Maximum TTL expressed in days (5 years). */
|
|
23
|
+
exports.MAX_TTL_DAYS = 365 * 5;
|
|
24
|
+
/** Maximum TTL expressed in seconds: the same five years as {@link MAX_TTL_DAYS}. */
|
|
25
|
+
exports.MAX_TTL_SECONDS = exports.MAX_TTL_DAYS * 24 * 60 * 60;
|
|
26
|
+
/**
|
|
27
|
+
* Extra days an S3 lifecycle rule adds over the TTL it backs. DynamoDB's TTL
|
|
28
|
+
* sweep can lag up to ~48 h past the `ttl` timestamp; the offloaded object
|
|
29
|
+
* must outlive its row, never the other way round.
|
|
30
|
+
*/
|
|
31
|
+
exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS = 2;
|
|
32
|
+
/**
|
|
33
|
+
* The units {@link TtlOption} declares. `allKeysOf<TtlOption>` cannot check
|
|
34
|
+
* this list: over a union its parameter is itself a union of one key map per
|
|
35
|
+
* shape, so `{ days: 'days' }` alone satisfies the first shape and compiles.
|
|
36
|
+
* Listing the keys of every shape as one record restores the check, so leaving
|
|
37
|
+
* a unit out, inventing one, or adding a shape to the union without listing
|
|
38
|
+
* its unit here fails to compile.
|
|
39
|
+
*/
|
|
40
|
+
const TTL_KEYS = (0, option_shape_1.allKeysOf)({
|
|
41
|
+
days: 'days',
|
|
42
|
+
seconds: 'seconds',
|
|
43
|
+
});
|
|
44
|
+
/** Positive integer no greater than `max`, with a message that names what the cap means. */
|
|
45
|
+
function assertWithinCap(value, field, max) {
|
|
46
|
+
(0, primitives_1.assertInteger)(value, field, { min: 1 });
|
|
47
|
+
if (value > max) {
|
|
48
|
+
throw (0, errors_1.validationError)(`${field} must be <= ${max} (five years)`, field);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Reject a `ttl` that is not an object at all, carries a key other than a
|
|
53
|
+
* unit, or names neither unit or both. The stray key is checked before the
|
|
54
|
+
* units, so `{ day: 1 }` names the key the caller wrote rather than a unit it
|
|
55
|
+
* did not.
|
|
56
|
+
*/
|
|
57
|
+
function assertOneUnit(ttl) {
|
|
58
|
+
if (typeof ttl !== 'object' || ttl === null) {
|
|
59
|
+
throw (0, errors_1.validationError)('ttl must be an object: { days } or { seconds }', 'ttl');
|
|
60
|
+
}
|
|
61
|
+
(0, option_shape_1.assertShape)(ttl, TTL_KEYS, 'ttl');
|
|
62
|
+
const days = 'days' in ttl;
|
|
63
|
+
const seconds = 'seconds' in ttl;
|
|
64
|
+
if (days && seconds) {
|
|
65
|
+
throw (0, errors_1.validationError)('ttl must specify either ttl.days or ttl.seconds, not both', 'ttl');
|
|
66
|
+
}
|
|
67
|
+
if (!days && !seconds) {
|
|
68
|
+
throw (0, errors_1.validationError)('ttl must specify either ttl.days or ttl.seconds', 'ttl');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* A {@link TtlOption} resolved to a positive number of seconds.
|
|
73
|
+
*
|
|
74
|
+
* Accepts: `ttl` — declared as the two-shape union; a JavaScript caller, or a
|
|
75
|
+
* config built from JSON, can also reach `undefined`, a non-object, `{}`, an
|
|
76
|
+
* object carrying both keys and one carrying any other key, and each is
|
|
77
|
+
* rejected. Within a shape the value must be an integer of at least 1.
|
|
78
|
+
*
|
|
79
|
+
* Returns: whole seconds, `days × 86400` for the days form.
|
|
80
|
+
*
|
|
81
|
+
* Throws: `VALIDATION`, in this order, naming `ttl` for a value that is not
|
|
82
|
+
* an object, `ttl.<key>` for a key other than `days` or `seconds`, `ttl` for
|
|
83
|
+
* an object naming neither unit or both, and `ttl.days` or `ttl.seconds` for a
|
|
84
|
+
* value outside 1..five years. Both forms share that cap, so the two spellings
|
|
85
|
+
* of one duration are accepted or rejected alike.
|
|
86
|
+
*/
|
|
10
87
|
function resolveTtlSeconds(ttl) {
|
|
88
|
+
assertOneUnit(ttl);
|
|
11
89
|
if ('days' in ttl) {
|
|
12
|
-
(
|
|
90
|
+
assertWithinCap(ttl.days, 'ttl.days', exports.MAX_TTL_DAYS);
|
|
13
91
|
return ttl.days * SECONDS_PER_DAY;
|
|
14
92
|
}
|
|
15
|
-
(
|
|
93
|
+
assertWithinCap(ttl.seconds, 'ttl.seconds', exports.MAX_TTL_SECONDS);
|
|
16
94
|
return ttl.seconds;
|
|
17
95
|
}
|
|
18
96
|
/**
|
|
19
|
-
*
|
|
20
|
-
* epoch
|
|
97
|
+
* The value DynamoDB's TTL attribute takes for an item written now: the Unix
|
|
98
|
+
* epoch second at which it expires.
|
|
99
|
+
*
|
|
100
|
+
* Accepts: `ttl` — as {@link resolveTtlSeconds}. `now` — a clock returning
|
|
101
|
+
* epoch **milliseconds**, defaulting to `Date.now`; supplied by tests and by
|
|
102
|
+
* the adapters' clock seam.
|
|
21
103
|
*
|
|
22
|
-
*
|
|
104
|
+
* Returns: `floor(now() / 1000) + resolveTtlSeconds(ttl)`. Whole seconds,
|
|
105
|
+
* because DynamoDB reads the attribute as an epoch-second Number
|
|
106
|
+
* (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-before-you-start.html).
|
|
107
|
+
*
|
|
108
|
+
* Throws: whatever {@link resolveTtlSeconds} throws.
|
|
23
109
|
*/
|
|
24
110
|
function calculateTtlTimestamp(ttl, now = Date.now) {
|
|
25
111
|
return Math.floor(now() / 1000) + resolveTtlSeconds(ttl);
|
|
26
112
|
}
|
|
27
|
-
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
|
|
32
|
-
|
|
113
|
+
/**
|
|
114
|
+
* The `Days` of the S3 lifecycle expiration rule that backs a TTL.
|
|
115
|
+
*
|
|
116
|
+
* Accepts: `ttl` — as {@link resolveTtlSeconds}.
|
|
117
|
+
*
|
|
118
|
+
* Returns: the TTL rounded **up** to whole days plus
|
|
119
|
+
* {@link S3_LIFECYCLE_SWEEP_MARGIN_DAYS}, so always at least
|
|
120
|
+
* `1 + margin`.
|
|
121
|
+
*
|
|
122
|
+
* Throws: whatever {@link resolveTtlSeconds} throws.
|
|
123
|
+
*
|
|
124
|
+
* Guarantees: the object outlives the row that points at it. S3 expires an
|
|
125
|
+
* object at the first midnight UTC at least `Days` after creation, while
|
|
126
|
+
* DynamoDB may keep an expired item for up to 48 hours past its `ttl`
|
|
127
|
+
* (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html);
|
|
128
|
+
* the margin covers that lag, which a bare `{ days: N }` did not.
|
|
129
|
+
*/
|
|
130
|
+
function lifecycleExpirationDays(ttl) {
|
|
131
|
+
return Math.ceil(resolveTtlSeconds(ttl) / SECONDS_PER_DAY) + exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS;
|
|
33
132
|
}
|
|
34
|
-
//# sourceMappingURL=ttl.js.map
|
|
@@ -1,9 +1,79 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Hides how the distinct namespaces are found and held in one order.
|
|
3
|
+
*
|
|
4
|
+
* A listing reads every live row it can reach — one partition when its first
|
|
5
|
+
* prefix condition opens with concrete labels, the whole table otherwise —
|
|
6
|
+
* keeps the namespaces every condition matches, truncates and deduplicates
|
|
7
|
+
* them, and sorts them by one pinned collation with its ties settled. A caller
|
|
8
|
+
* paging by `offset` gets the same order on every call and every host.
|
|
9
|
+
*/
|
|
10
|
+
import type { MatchCondition } from '@langchain/langgraph-checkpoint';
|
|
11
|
+
import type { ParsedList } from '../internal/parse';
|
|
2
12
|
import type { StoreContext } from '../internal/setup';
|
|
3
13
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
14
|
+
* Whether `namespace` satisfies one match condition. `condition.matchType` is
|
|
15
|
+
* `'prefix'` or `'suffix'`, already refused otherwise by the parser that built
|
|
16
|
+
* `condition` (`parseMatchCondition` in `parse.ts`).
|
|
17
|
+
*
|
|
18
|
+
* Accepts: `condition.path` — elements, where `'*'` matches any one element;
|
|
19
|
+
* longer than the namespace never matches, and empty matches every namespace.
|
|
20
|
+
*
|
|
21
|
+
* Returns: whether the condition holds.
|
|
22
|
+
*
|
|
23
|
+
* Throws: nothing.
|
|
24
|
+
*/
|
|
25
|
+
export declare function matchNamespace(namespace: string[], condition: MatchCondition): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Cap a namespace to at most `maxDepth` elements.
|
|
28
|
+
*
|
|
29
|
+
* Accepts: `maxDepth` — absent returns the namespace unchanged; otherwise a
|
|
30
|
+
* parsed positive integer (see `parseListOperation` for what a negative or
|
|
31
|
+
* zero value did here).
|
|
32
|
+
*
|
|
33
|
+
* Returns: the namespace, truncated from the end; shorter than `maxDepth` is
|
|
34
|
+
* returned whole.
|
|
35
|
+
*
|
|
36
|
+
* Throws: nothing.
|
|
37
|
+
*/
|
|
38
|
+
export declare function truncateDepth(namespace: string[], maxDepth?: number): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Leading concrete (non-wildcard) elements of the first prefix condition.
|
|
41
|
+
*
|
|
42
|
+
* Accepts: `conditions` — absent, empty, suffix-only, or a prefix condition
|
|
43
|
+
* starting with `'*'` all yield nothing to scope by.
|
|
44
|
+
*
|
|
45
|
+
* Returns: the concrete leading elements, which name a partition and a sort-key
|
|
46
|
+
* prefix the listing can be read from. An empty result means the listing cannot
|
|
47
|
+
* be scoped to one partition and falls back to a Scan.
|
|
48
|
+
*
|
|
49
|
+
* Throws: nothing.
|
|
50
|
+
*
|
|
51
|
+
* Guarantees: the root is only ever a *superset* of what the conditions select
|
|
52
|
+
* — every condition is still applied to each namespace read — so scoping can
|
|
53
|
+
* never drop a namespace that belongs in the answer.
|
|
54
|
+
*/
|
|
55
|
+
export declare function prefixRoot(conditions?: MatchCondition[]): string[];
|
|
56
|
+
/**
|
|
57
|
+
* The distinct namespaces satisfying every match condition.
|
|
58
|
+
*
|
|
59
|
+
* Accepts: `op` — parsed; every match condition must hold, absent or empty
|
|
60
|
+
* matches every namespace. A concrete prefix root scopes the read to one
|
|
61
|
+
* partition's Query, and anything else — a suffix condition, a leading `*`, no
|
|
62
|
+
* conditions — spans the table and is one of the four reads allowed to Scan
|
|
63
|
+
* (`test/static/guards/scan-sites.ts`).
|
|
64
|
+
* `op.maxDepth` — namespaces are truncated to it and then
|
|
65
|
+
* deduplicated, so `['a','b']` and `['a','c']` list once as `['a']`.
|
|
66
|
+
* `op.offset` and `op.limit` — a `limit` of 0 returns an empty listing without reading.
|
|
67
|
+
*
|
|
68
|
+
* Returns: the namespaces, sorted, then `limit` of them from `offset`.
|
|
69
|
+
*
|
|
70
|
+
* Throws: `RESULT_TRUNCATED` when `maxScanItems` is reached while rows
|
|
71
|
+
* remain, so a partial listing is never returned as a complete one;
|
|
72
|
+
* `FORMAT_UNSUPPORTED` for a store item a newer release wrote.
|
|
73
|
+
*
|
|
74
|
+
* Guarantees: every live row is read — the answer is about which namespaces
|
|
75
|
+
* exist, and paging over it must not depend on which rows were read first. That
|
|
76
|
+
* is also why the sort is total (see {@link compareNamespaces}), and why a
|
|
77
|
+
* `limit` of 0 is answered ahead of the read rather than by slicing one.
|
|
7
78
|
*/
|
|
8
|
-
export declare function listNamespaces(context: StoreContext, op:
|
|
9
|
-
//# sourceMappingURL=list-namespaces.d.ts.map
|
|
79
|
+
export declare function listNamespaces(context: StoreContext, op: ParsedList): Promise<string[][]>;
|
|
@@ -1,55 +1,197 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides how the distinct namespaces are found and held in one order.
|
|
4
|
+
*
|
|
5
|
+
* A listing reads every live row it can reach — one partition when its first
|
|
6
|
+
* prefix condition opens with concrete labels, the whole table otherwise —
|
|
7
|
+
* keeps the namespaces every condition matches, truncates and deduplicates
|
|
8
|
+
* them, and sorts them by one pinned collation with its ties settled. A caller
|
|
9
|
+
* paging by `offset` gets the same order on every call and every host.
|
|
10
|
+
*/
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.matchNamespace = matchNamespace;
|
|
13
|
+
exports.truncateDepth = truncateDepth;
|
|
14
|
+
exports.prefixRoot = prefixRoot;
|
|
3
15
|
exports.listNamespaces = listNamespaces;
|
|
16
|
+
const clock_1 = require("../../shared/clock");
|
|
4
17
|
const paginate_1 = require("../../shared/dynamodb/paginate");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
18
|
+
const table_schema_1 = require("../../shared/dynamodb/table-schema");
|
|
19
|
+
const rows_1 = require("../internal/rows");
|
|
20
|
+
const WILDCARD = '*';
|
|
21
|
+
function segmentMatches(actual, path) {
|
|
22
|
+
return path.every((element, index) => element === WILDCARD || element === actual[index]);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Whether `namespace` satisfies one match condition. `condition.matchType` is
|
|
26
|
+
* `'prefix'` or `'suffix'`, already refused otherwise by the parser that built
|
|
27
|
+
* `condition` (`parseMatchCondition` in `parse.ts`).
|
|
28
|
+
*
|
|
29
|
+
* Accepts: `condition.path` — elements, where `'*'` matches any one element;
|
|
30
|
+
* longer than the namespace never matches, and empty matches every namespace.
|
|
31
|
+
*
|
|
32
|
+
* Returns: whether the condition holds.
|
|
33
|
+
*
|
|
34
|
+
* Throws: nothing.
|
|
35
|
+
*/
|
|
36
|
+
function matchNamespace(namespace, condition) {
|
|
37
|
+
const { matchType, path } = condition;
|
|
38
|
+
if (path.length > namespace.length)
|
|
39
|
+
return false;
|
|
40
|
+
const slice = matchType === 'prefix'
|
|
41
|
+
? namespace.slice(0, path.length)
|
|
42
|
+
: namespace.slice(namespace.length - path.length);
|
|
43
|
+
return segmentMatches(slice, path);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Cap a namespace to at most `maxDepth` elements.
|
|
47
|
+
*
|
|
48
|
+
* Accepts: `maxDepth` — absent returns the namespace unchanged; otherwise a
|
|
49
|
+
* parsed positive integer (see `parseListOperation` for what a negative or
|
|
50
|
+
* zero value did here).
|
|
51
|
+
*
|
|
52
|
+
* Returns: the namespace, truncated from the end; shorter than `maxDepth` is
|
|
53
|
+
* returned whole.
|
|
54
|
+
*
|
|
55
|
+
* Throws: nothing.
|
|
56
|
+
*/
|
|
57
|
+
function truncateDepth(namespace, maxDepth) {
|
|
58
|
+
return maxDepth === undefined ? namespace : namespace.slice(0, maxDepth);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Leading concrete (non-wildcard) elements of the first prefix condition.
|
|
62
|
+
*
|
|
63
|
+
* Accepts: `conditions` — absent, empty, suffix-only, or a prefix condition
|
|
64
|
+
* starting with `'*'` all yield nothing to scope by.
|
|
65
|
+
*
|
|
66
|
+
* Returns: the concrete leading elements, which name a partition and a sort-key
|
|
67
|
+
* prefix the listing can be read from. An empty result means the listing cannot
|
|
68
|
+
* be scoped to one partition and falls back to a Scan.
|
|
69
|
+
*
|
|
70
|
+
* Throws: nothing.
|
|
71
|
+
*
|
|
72
|
+
* Guarantees: the root is only ever a *superset* of what the conditions select
|
|
73
|
+
* — every condition is still applied to each namespace read — so scoping can
|
|
74
|
+
* never drop a namespace that belongs in the answer.
|
|
75
|
+
*/
|
|
76
|
+
function prefixRoot(conditions) {
|
|
77
|
+
const prefixCondition = conditions?.find((condition) => condition.matchType === 'prefix');
|
|
78
|
+
if (!prefixCondition)
|
|
79
|
+
return [];
|
|
80
|
+
const root = [];
|
|
81
|
+
for (const element of prefixCondition.path) {
|
|
82
|
+
if (element === WILDCARD)
|
|
83
|
+
break;
|
|
84
|
+
root.push(element);
|
|
85
|
+
}
|
|
86
|
+
return root;
|
|
87
|
+
}
|
|
88
|
+
function namespaceSource(context, op, now) {
|
|
89
|
+
const root = prefixRoot(op.matchConditions);
|
|
13
90
|
if (root.length > 0) {
|
|
14
91
|
return (0, paginate_1.paginateQuery)({
|
|
92
|
+
retry: context.retry,
|
|
15
93
|
client: context.client,
|
|
16
|
-
params: (0,
|
|
94
|
+
params: (0, table_schema_1.withoutExpired)((0, rows_1.projectKeys)((0, rows_1.scopedQuery)(context.tableName, root)), now),
|
|
17
95
|
maxItems: context.maxScanItems,
|
|
18
96
|
});
|
|
19
97
|
}
|
|
20
|
-
return (0,
|
|
98
|
+
return (0, paginate_1.paginateScan)({
|
|
99
|
+
retry: context.retry,
|
|
21
100
|
client: context.client,
|
|
22
|
-
params: (0,
|
|
101
|
+
params: (0, table_schema_1.withoutExpired)((0, rows_1.projectKeys)((0, rows_1.storeScan)(context.tableName)), now),
|
|
23
102
|
maxItems: context.maxScanItems,
|
|
24
103
|
});
|
|
25
104
|
}
|
|
26
105
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
106
|
+
* The collation namespaces are sorted by, pinned to one locale.
|
|
107
|
+
*
|
|
108
|
+
* `InMemoryStore` sorts with bare `localeCompare`
|
|
109
|
+
* (`@langchain/langgraph-checkpoint@1.1.5` `dist/store/memory.js:119`), which
|
|
110
|
+
* means "in the host's default locale" — and locales disagree: `'ä'` sorts
|
|
111
|
+
* before `'z'` in German and after it in Swedish. A listing paged by `offset`
|
|
112
|
+
* is a position a caller holds between two calls, so an order that changes
|
|
113
|
+
* with the host answering the call cuts the same listing in two places and the
|
|
114
|
+
* caller misses one namespace and sees another twice. Matching the reference
|
|
115
|
+
* there is not possible anyway, because the reference's own order varies with
|
|
116
|
+
* its host; what is possible is matching it on every host that agrees with
|
|
117
|
+
* this locale, and being deterministic on the rest.
|
|
118
|
+
*
|
|
119
|
+
* `en` is the locale to pin because ICU applies no tailoring to it — its order
|
|
120
|
+
* is the untailored root order — and because it is the one locale a Node built
|
|
121
|
+
* with small ICU still carries, so this cannot degrade to a different order on
|
|
122
|
+
* a minimal runtime.
|
|
123
|
+
*/
|
|
124
|
+
const NAMESPACE_COLLATOR = new Intl.Collator('en');
|
|
125
|
+
/**
|
|
126
|
+
* Order two namespaces by the reference store's collation, pinned, with its
|
|
127
|
+
* ties settled.
|
|
128
|
+
*
|
|
129
|
+
* The collation is {@link NAMESPACE_COLLATOR} on the joined namespace — the
|
|
130
|
+
* comparison `InMemoryStore` makes, held to one locale. Collation calls some
|
|
131
|
+
* *distinct* strings equal — `'café'` written precomposed and decomposed is
|
|
132
|
+
* one such pair — and the reference then leaves their order to insertion
|
|
133
|
+
* order. Here that would be the order DynamoDB happened to return the rows in,
|
|
134
|
+
* so the same listing could place a page boundary between them differently on
|
|
135
|
+
* two calls and a page could skip one namespace while repeating another. The
|
|
136
|
+
* tie-break settles exactly those pairs and never reorders a pair the
|
|
137
|
+
* collation itself orders.
|
|
138
|
+
*/
|
|
139
|
+
function compareNamespaces(a, b) {
|
|
140
|
+
const left = a.join(table_schema_1.KEY_SEPARATOR);
|
|
141
|
+
const right = b.join(table_schema_1.KEY_SEPARATOR);
|
|
142
|
+
const collated = NAMESPACE_COLLATOR.compare(left, right);
|
|
143
|
+
// `Number(left > right)` keeps the comparator total: 0 for a pair that really is equal.
|
|
144
|
+
return collated !== 0 ? collated : left < right ? -1 : Number(left > right);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* The distinct namespaces satisfying every match condition.
|
|
148
|
+
*
|
|
149
|
+
* Accepts: `op` — parsed; every match condition must hold, absent or empty
|
|
150
|
+
* matches every namespace. A concrete prefix root scopes the read to one
|
|
151
|
+
* partition's Query, and anything else — a suffix condition, a leading `*`, no
|
|
152
|
+
* conditions — spans the table and is one of the four reads allowed to Scan
|
|
153
|
+
* (`test/static/guards/scan-sites.ts`).
|
|
154
|
+
* `op.maxDepth` — namespaces are truncated to it and then
|
|
155
|
+
* deduplicated, so `['a','b']` and `['a','c']` list once as `['a']`.
|
|
156
|
+
* `op.offset` and `op.limit` — a `limit` of 0 returns an empty listing without reading.
|
|
157
|
+
*
|
|
158
|
+
* Returns: the namespaces, sorted, then `limit` of them from `offset`.
|
|
159
|
+
*
|
|
160
|
+
* Throws: `RESULT_TRUNCATED` when `maxScanItems` is reached while rows
|
|
161
|
+
* remain, so a partial listing is never returned as a complete one;
|
|
162
|
+
* `FORMAT_UNSUPPORTED` for a store item a newer release wrote.
|
|
163
|
+
*
|
|
164
|
+
* Guarantees: every live row is read — the answer is about which namespaces
|
|
165
|
+
* exist, and paging over it must not depend on which rows were read first. That
|
|
166
|
+
* is also why the sort is total (see {@link compareNamespaces}), and why a
|
|
167
|
+
* `limit` of 0 is answered ahead of the read rather than by slicing one.
|
|
30
168
|
*/
|
|
31
169
|
async function listNamespaces(context, op) {
|
|
32
|
-
|
|
33
|
-
|
|
170
|
+
// A zero page is answered before the read. This listing is the one that can
|
|
171
|
+
// never stop early — every live row must be seen before the namespaces can
|
|
172
|
+
// be sorted and sliced — so scanning the whole table to slice nothing out of
|
|
173
|
+
// it is the entire cost for none of the answer.
|
|
174
|
+
if (op.limit === 0)
|
|
175
|
+
return [];
|
|
176
|
+
const now = (0, clock_1.nowSeconds)();
|
|
34
177
|
const seen = new Set();
|
|
35
178
|
const namespaces = [];
|
|
36
|
-
for await (const raw of namespaceSource(context, op)) {
|
|
37
|
-
const record = (0,
|
|
38
|
-
if (!record)
|
|
179
|
+
for await (const raw of namespaceSource(context, op, now)) {
|
|
180
|
+
const record = (0, rows_1.parseStoreRow)(raw);
|
|
181
|
+
if (!record || (0, table_schema_1.isExpiredRow)(record, now))
|
|
39
182
|
continue;
|
|
40
183
|
const namespace = record.namespace;
|
|
41
184
|
if (op.matchConditions &&
|
|
42
|
-
!op.matchConditions.every((condition) =>
|
|
185
|
+
!op.matchConditions.every((condition) => matchNamespace(namespace, condition))) {
|
|
43
186
|
continue;
|
|
44
187
|
}
|
|
45
|
-
const truncated =
|
|
46
|
-
const dedupeKey = truncated.join(
|
|
188
|
+
const truncated = truncateDepth(namespace, op.maxDepth);
|
|
189
|
+
const dedupeKey = truncated.join(table_schema_1.KEY_SEPARATOR);
|
|
47
190
|
if (seen.has(dedupeKey))
|
|
48
191
|
continue;
|
|
49
192
|
seen.add(dedupeKey);
|
|
50
193
|
namespaces.push(truncated);
|
|
51
194
|
}
|
|
52
|
-
namespaces.sort(
|
|
195
|
+
namespaces.sort(compareNamespaces);
|
|
53
196
|
return namespaces.slice(op.offset, op.offset + op.limit);
|
|
54
197
|
}
|
|
55
|
-
//# sourceMappingURL=list-namespaces.js.map
|
|
@@ -1,11 +1,36 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Hides the order a put happens in.
|
|
3
|
+
*
|
|
4
|
+
* A put reads the row it replaces for its `createdAt`, embeds once — a vector
|
|
5
|
+
* per extracted path onto the row, or one vector for the `vectorBackend`,
|
|
6
|
+
* never both — writes the row, and only then syncs the backend, best-effort.
|
|
7
|
+
* A `null` value takes the delete path instead. A caller hands over an item;
|
|
8
|
+
* that the table commits first and the vector copy follows is decided here.
|
|
9
|
+
*/
|
|
10
|
+
import type { ParsedDelete, ParsedPut } from '../internal/parse';
|
|
2
11
|
import type { StoreContext } from '../internal/setup';
|
|
3
12
|
/**
|
|
4
|
-
* Store, update
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
13
|
+
* Store, update or delete an item.
|
|
14
|
+
*
|
|
15
|
+
* Accepts: `op` — parsed; a `ParsedDelete` removes the item, a `ParsedPut` is
|
|
16
|
+
* stored, its value encoded with optional compression and S3 offload under
|
|
17
|
+
* this row's own path, in an object named by this put's own id. `op.index` —
|
|
18
|
+
* `false` stores the item without indexing it and clears any vector it had, an
|
|
19
|
+
* array overrides the configured fields for this put, and absent uses the
|
|
20
|
+
* store's configuration.
|
|
21
|
+
*
|
|
22
|
+
* Returns: nothing. Deleting an item that is not there is not an error.
|
|
23
|
+
*
|
|
24
|
+
* Throws: `VALIDATION` naming `value` for a value that JSON cannot represent —
|
|
25
|
+
* refused at the write rather than stored as a row that can never be read back;
|
|
26
|
+
* `S3_OFFLOAD_FAILED`; whatever the write throws.
|
|
27
|
+
*
|
|
28
|
+
* Guarantees: DynamoDB holds the canonical item — the vector index is synced
|
|
29
|
+
* afterwards and best-effort, so a backend outage never fails a put or leaves a
|
|
30
|
+
* half-written item. `createdAt` survives every update. The superseded payload
|
|
31
|
+
* is deleted only once the new row is committed, and this put's own upload
|
|
32
|
+
* only once a read proves its write did not land. Neither release reads the
|
|
33
|
+
* row first: each put uploads under a key ending in an id of its own, so the
|
|
34
|
+
* object a put uploads is named only by that put's own rows.
|
|
9
35
|
*/
|
|
10
|
-
export declare function putItem(context: StoreContext, op:
|
|
11
|
-
//# sourceMappingURL=put.d.ts.map
|
|
36
|
+
export declare function putItem(context: StoreContext, op: ParsedPut | ParsedDelete): Promise<void>;
|
|
@@ -1,85 +1,78 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides the order a put happens in.
|
|
4
|
+
*
|
|
5
|
+
* A put reads the row it replaces for its `createdAt`, embeds once — a vector
|
|
6
|
+
* per extracted path onto the row, or one vector for the `vectorBackend`,
|
|
7
|
+
* never both — writes the row, and only then syncs the backend, best-effort.
|
|
8
|
+
* A `null` value takes the delete path instead. A caller hands over an item;
|
|
9
|
+
* that the table commits first and the vector copy follows is decided here.
|
|
10
|
+
*/
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
exports.putItem = putItem;
|
|
4
13
|
const node_crypto_1 = require("node:crypto");
|
|
5
14
|
const clock_1 = require("../../shared/clock");
|
|
6
|
-
const descriptor_keys_1 = require("../../shared/codec/descriptor-keys");
|
|
7
|
-
const orphans_1 = require("../../shared/codec/s3/orphans");
|
|
8
|
-
const retry_1 = require("../../shared/dynamodb/retry");
|
|
9
15
|
const ttl_1 = require("../../shared/validation/ttl");
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const keys_1 = require("../internal/keys");
|
|
13
|
-
const persist_1 = require("../internal/persist");
|
|
14
|
-
const read_existing_1 = require("../internal/read-existing");
|
|
16
|
+
const item_write_1 = require("../internal/item-write");
|
|
17
|
+
const rows_1 = require("../internal/rows");
|
|
15
18
|
const semantic_search_1 = require("../internal/semantic-search");
|
|
16
|
-
const
|
|
17
|
-
const write_verify_1 = require("../internal/write-verify");
|
|
19
|
+
const vector_index_1 = require("../internal/vector-index");
|
|
18
20
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* server-side with only its acknowledgement lost. Mirroring `persistRecord`'s
|
|
23
|
-
* treatment of an ambiguous put, that case is resolved with a
|
|
24
|
-
* strongly-consistent read — if the row is genuinely gone the delete
|
|
25
|
-
* succeeded, so the S3-orphan cleanup and the vector-backend delete must still
|
|
26
|
-
* run rather than being skipped for a write that actually happened. Any other
|
|
27
|
-
* failure, or a row still present, propagates unchanged.
|
|
21
|
+
* The vectors a put stores on the row: one per extracted path, scored by best
|
|
22
|
+
* match on read. Not computed when a `vectorBackend` holds the vectors, which
|
|
23
|
+
* takes a single vector per item instead (see {@link itemVector}).
|
|
28
24
|
*/
|
|
29
|
-
async function
|
|
30
|
-
const existing = context.offloader ? await (0, read_existing_1.readExisting)(context, pk, sk) : undefined;
|
|
31
|
-
try {
|
|
32
|
-
await (0, retry_1.withDynamoDBRetry)(() => context.client.delete({ TableName: context.tableName, Key: { PK: pk, SK: sk } }));
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
const landed = (0, write_verify_1.isRetryExhausted)(error) && (await (0, write_verify_1.rowIsAbsent)(context, { PK: pk, SK: sk }));
|
|
36
|
-
if (!landed)
|
|
37
|
-
throw error;
|
|
38
|
-
}
|
|
39
|
-
if (context.offloader) {
|
|
40
|
-
await (0, orphans_1.cleanUpS3Orphans)(context.offloader, (0, descriptor_keys_1.collectS3Keys)(existing?.value ? [existing.value] : []), 'store.delete', context.logger);
|
|
41
|
-
}
|
|
42
|
-
if (context.vectorBackend) {
|
|
43
|
-
await (0, index_sync_1.syncVectorIndex)(context.vectorBackend, op.namespace, op.key, undefined, context.logger);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/** Compute the embedding for a put, honoring `op.index` (false disables it). */
|
|
47
|
-
async function resolveEmbedding(context, op, value) {
|
|
25
|
+
async function resolvePassages(context, op, value) {
|
|
48
26
|
if (op.index === false)
|
|
49
27
|
return undefined;
|
|
50
|
-
return (0, semantic_search_1.
|
|
28
|
+
return (0, semantic_search_1.embedPassages)(context, value, op.index);
|
|
51
29
|
}
|
|
52
30
|
/**
|
|
53
|
-
* Store, update
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
31
|
+
* Store, update or delete an item.
|
|
32
|
+
*
|
|
33
|
+
* Accepts: `op` — parsed; a `ParsedDelete` removes the item, a `ParsedPut` is
|
|
34
|
+
* stored, its value encoded with optional compression and S3 offload under
|
|
35
|
+
* this row's own path, in an object named by this put's own id. `op.index` —
|
|
36
|
+
* `false` stores the item without indexing it and clears any vector it had, an
|
|
37
|
+
* array overrides the configured fields for this put, and absent uses the
|
|
38
|
+
* store's configuration.
|
|
39
|
+
*
|
|
40
|
+
* Returns: nothing. Deleting an item that is not there is not an error.
|
|
41
|
+
*
|
|
42
|
+
* Throws: `VALIDATION` naming `value` for a value that JSON cannot represent —
|
|
43
|
+
* refused at the write rather than stored as a row that can never be read back;
|
|
44
|
+
* `S3_OFFLOAD_FAILED`; whatever the write throws.
|
|
45
|
+
*
|
|
46
|
+
* Guarantees: DynamoDB holds the canonical item — the vector index is synced
|
|
47
|
+
* afterwards and best-effort, so a backend outage never fails a put or leaves a
|
|
48
|
+
* half-written item. `createdAt` survives every update. The superseded payload
|
|
49
|
+
* is deleted only once the new row is committed, and this put's own upload
|
|
50
|
+
* only once a read proves its write did not land. Neither release reads the
|
|
51
|
+
* row first: each put uploads under a key ending in an id of its own, so the
|
|
52
|
+
* object a put uploads is named only by that put's own rows.
|
|
58
53
|
*/
|
|
59
54
|
async function putItem(context, op) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const pk = (0, keys_1.partitionKey)(op.namespace);
|
|
63
|
-
const sk = (0, keys_1.sortKey)(op.namespace, op.key);
|
|
64
|
-
if (op.value === null) {
|
|
65
|
-
await deleteStoreItem(context, op, pk, sk);
|
|
55
|
+
if (op.kind === 'delete') {
|
|
56
|
+
await (0, item_write_1.deleteStoreItem)(context, op.address);
|
|
66
57
|
return;
|
|
67
58
|
}
|
|
59
|
+
const { namespace, key } = op.address;
|
|
68
60
|
const value = op.value;
|
|
69
61
|
const timestamp = (0, clock_1.nowIso)();
|
|
70
|
-
const existing = await (0,
|
|
71
|
-
|
|
62
|
+
const existing = await (0, rows_1.readExisting)(context, (0, rows_1.itemRowKey)(op.address));
|
|
63
|
+
// The two indexing modes are exclusive, so only one of them embeds: the row
|
|
64
|
+
// carries a vector per extracted path, while a configured backend takes one
|
|
65
|
+
// vector per item because that is what its `upsert` contract addresses.
|
|
66
|
+
const embedding = await (0, vector_index_1.itemVector)(context, op);
|
|
67
|
+
const embeddings = context.vectorBackend ? undefined : await resolvePassages(context, op, value);
|
|
72
68
|
const ttlTimestamp = context.ttl ? (0, ttl_1.calculateTtlTimestamp)(context.ttl) : undefined;
|
|
73
|
-
const record = await (0,
|
|
69
|
+
const record = await (0, rows_1.buildStoreRow)(context, { namespace, key }, value, {
|
|
74
70
|
createdAt: existing.createdAt ?? timestamp,
|
|
75
71
|
updatedAt: timestamp,
|
|
76
|
-
|
|
72
|
+
embeddings,
|
|
77
73
|
ttlTimestamp,
|
|
78
|
-
|
|
74
|
+
rev: (0, node_crypto_1.randomUUID)(),
|
|
79
75
|
});
|
|
80
|
-
await (0,
|
|
81
|
-
|
|
82
|
-
await (0, index_sync_1.syncVectorIndex)(context.vectorBackend, op.namespace, op.key, embedding, context.logger);
|
|
83
|
-
}
|
|
76
|
+
await (0, item_write_1.persistRow)(context, record, existing);
|
|
77
|
+
await (0, vector_index_1.syncItemVector)(context, op.address, embedding);
|
|
84
78
|
}
|
|
85
|
-
//# sourceMappingURL=put.js.map
|