@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
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides which rows a checkpoint read issues, with what consistency, and how a
|
|
3
|
+
* checkpoint an older release wrote is read back.
|
|
4
|
+
*
|
|
5
|
+
* A tuple is a META row, a PAYLOAD row and a checkpoint's WRITE rows, read
|
|
6
|
+
* strongly for `getTuple` and eventually for `list`, with expired rows absent
|
|
7
|
+
* however long DynamoDB's sweep lags, and with a pre-v4 checkpoint's `Send`s
|
|
8
|
+
* migrated from its parent's pending writes. The caller asks for a tuple; which
|
|
9
|
+
* reads that takes, and in what order, is decided here.
|
|
10
|
+
*/
|
|
11
|
+
import { type Checkpoint, type CheckpointMetadata, type CheckpointPendingWrite, type CheckpointTuple } from '@langchain/langgraph-checkpoint';
|
|
12
|
+
import type { ThreadAddress } from './parse';
|
|
13
|
+
import { type CheckpointLocation, type CheckpointMetaRow, type CheckpointPayloadRow } from './rows';
|
|
14
|
+
import type { CheckpointerContext } from './setup';
|
|
15
|
+
/** The thread and namespace a read was asked for. */
|
|
16
|
+
export interface ThreadLocation {
|
|
17
|
+
readonly threadId: string;
|
|
18
|
+
readonly checkpointNs: string;
|
|
19
|
+
}
|
|
20
|
+
/** A checkpoint's parent, whose pending writes a pre-v4 checkpoint's migration reads. */
|
|
21
|
+
export interface PendingSendsSource extends ThreadLocation {
|
|
22
|
+
readonly parentCheckpointId: string | undefined;
|
|
23
|
+
}
|
|
24
|
+
/** Per-read options for the payload and writes reads. */
|
|
25
|
+
export interface ReadOptions {
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
/** `false` for bulk reads (`list`) that trade read-your-writes for half the read cost. */
|
|
28
|
+
consistent?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The META row a read is about: the one `checkpointId` names, else the newest
|
|
32
|
+
* in the namespace.
|
|
33
|
+
*
|
|
34
|
+
* Accepts: `address` — parsed; its `checkpointId` names the row, and its
|
|
35
|
+
* absence asks for the newest in the namespace. `signal` — aborts the read.
|
|
36
|
+
*
|
|
37
|
+
* Returns: the row, or undefined when there is none — including when every row
|
|
38
|
+
* in the namespace has expired, or when the only rows there belong to another
|
|
39
|
+
* writer.
|
|
40
|
+
*
|
|
41
|
+
* Throws: `FORMAT_UNSUPPORTED` for a row of ours written by a newer version;
|
|
42
|
+
* whatever the read throws.
|
|
43
|
+
*
|
|
44
|
+
* Guarantees: strongly consistent, and expiry is judged here rather than waited
|
|
45
|
+
* for, so a checkpoint past its ttl is absent to every reader however long
|
|
46
|
+
* DynamoDB's sweep lags. The newest-first read returns the first live row of
|
|
47
|
+
* ours and stops there, stepping over expired and foreign rows
|
|
48
|
+
* {@link LATEST_META_PAGE_SIZE} at a time rather than one per round trip.
|
|
49
|
+
*/
|
|
50
|
+
export declare function fetchTargetMeta(context: CheckpointerContext, address: ThreadAddress, signal?: AbortSignal): Promise<CheckpointMetaRow | undefined>;
|
|
51
|
+
/**
|
|
52
|
+
* The PAYLOAD row of one checkpoint.
|
|
53
|
+
*
|
|
54
|
+
* Accepts: `at` — the checkpoint's location. `read.consistent` — defaults to
|
|
55
|
+
* true; `list` passes false and accepts replica lag, since a listing tolerates
|
|
56
|
+
* what a read-your-writes `getTuple` does not.
|
|
57
|
+
*
|
|
58
|
+
* Returns: the row, or undefined when it is not there — the window the ordered
|
|
59
|
+
* PAYLOAD→META write leaves open, which the caller answers as "no checkpoint".
|
|
60
|
+
*
|
|
61
|
+
* Throws: `FORMAT_UNSUPPORTED` for a row a newer release wrote; whatever the
|
|
62
|
+
* read throws.
|
|
63
|
+
*/
|
|
64
|
+
export declare function fetchPayload(context: CheckpointerContext, at: CheckpointLocation, read?: ReadOptions): Promise<CheckpointPayloadRow | undefined>;
|
|
65
|
+
/**
|
|
66
|
+
* Every pending write stored for one checkpoint, decoded, in write order.
|
|
67
|
+
*
|
|
68
|
+
* Accepts: `at` — the checkpoint's location. `read.consistent` — omitted reads
|
|
69
|
+
* strongly consistently; `list` passes `false` explicitly and accepts replica
|
|
70
|
+
* lag, `getTuple` passes `true`.
|
|
71
|
+
*
|
|
72
|
+
* Returns: the writes after `dropSupersededWrites` has resolved
|
|
73
|
+
* first-write-wins; a checkpoint with none returns an empty array.
|
|
74
|
+
*
|
|
75
|
+
* Throws: `FORMAT_UNSUPPORTED` for a row a newer release wrote; whatever the
|
|
76
|
+
* query or the payload decode throws.
|
|
77
|
+
*
|
|
78
|
+
* Guarantees: the read is deliberately uncapped. It must be complete to be
|
|
79
|
+
* correct — a `Send` fan-out retried with a changed write order leaves
|
|
80
|
+
* superseded rows behind that would count toward any cap — so past
|
|
81
|
+
* {@link LIST_SCAN_WARN_THRESHOLD} rows the read still succeeds and an operator
|
|
82
|
+
* is told the checkpoint is unusually heavy.
|
|
83
|
+
*/
|
|
84
|
+
export declare function fetchPendingWrites(context: CheckpointerContext, at: CheckpointLocation, read?: ReadOptions): Promise<CheckpointPendingWrite[]>;
|
|
85
|
+
/** How a tuple is assembled: cancellation, read consistency, and metadata already decoded by the caller. */
|
|
86
|
+
export interface AssembleOptions {
|
|
87
|
+
signal?: AbortSignal;
|
|
88
|
+
/** `true` for `getTuple` (read-your-writes), `false` for the eventually-consistent `list` path. */
|
|
89
|
+
consistent: boolean;
|
|
90
|
+
/** Metadata the caller decoded to apply a filter, so it is not decoded (or downloaded) twice. */
|
|
91
|
+
metadata?: CheckpointMetadata;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* A full {@link CheckpointTuple} built from a META row.
|
|
95
|
+
*
|
|
96
|
+
* Accepts: `thread` — the **caller's** location, never the row's: `thread.threadId`
|
|
97
|
+
* scopes which S3 object the row may point at, so it must come from the
|
|
98
|
+
* partition the caller asked for; `thread.checkpointNs` is its namespace.
|
|
99
|
+
* `options.metadata` — already decoded by a filtered `list`, so a filtered
|
|
100
|
+
* listing decodes and downloads each metadata blob once, not twice.
|
|
101
|
+
* `options.consistent` — true for `getTuple`, false for `list`.
|
|
102
|
+
*
|
|
103
|
+
* Returns: the tuple, with `parentConfig` set only when the row names a parent;
|
|
104
|
+
* `undefined` when the PAYLOAD row is absent — the window the ordered
|
|
105
|
+
* PAYLOAD→META write leaves open, and the same answer a caller gets for a
|
|
106
|
+
* checkpoint that does not exist.
|
|
107
|
+
*
|
|
108
|
+
* Throws: whatever the reads and decodes throw.
|
|
109
|
+
*/
|
|
110
|
+
export declare function assembleTuple(context: CheckpointerContext, thread: ThreadLocation, meta: CheckpointMetaRow, options: AssembleOptions): Promise<CheckpointTuple | undefined>;
|
|
111
|
+
/**
|
|
112
|
+
* Pre-v4 checkpoints kept a task's `Send`s as `__pregel_tasks` pending writes
|
|
113
|
+
* on the parent rather than in the checkpoint itself. Reading such a
|
|
114
|
+
* checkpoint rebuilds `channel_values[TASKS]` from those writes and stamps
|
|
115
|
+
* the channel with the highest version the checkpoint already carries (or
|
|
116
|
+
* the first version when it carries none), exactly as the reference savers
|
|
117
|
+
* do, so a thread written before LangGraph 0.2 still resumes.
|
|
118
|
+
*
|
|
119
|
+
* Accepts: `checkpoint` — any version. `parent` — the checkpoint's own thread
|
|
120
|
+
* and namespace, plus `parent.parentCheckpointId`, the parent whose pending
|
|
121
|
+
* writes hold the sends; absent means there is nowhere to migrate from.
|
|
122
|
+
* `read` — cancellation and consistency for the pending-writes read.
|
|
123
|
+
*
|
|
124
|
+
* Returns: the checkpoint untouched when it is v4 or has no parent, and
|
|
125
|
+
* otherwise a copy with `channel_values[TASKS]` rebuilt. The input is never
|
|
126
|
+
* mutated.
|
|
127
|
+
*
|
|
128
|
+
* Throws: whatever reading the parent's pending writes throws.
|
|
129
|
+
*/
|
|
130
|
+
export declare function migratePendingSends(context: CheckpointerContext, checkpoint: Checkpoint, parent: PendingSendsSource, read: ReadOptions): Promise<Checkpoint>;
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides which rows a checkpoint read issues, with what consistency, and how a
|
|
4
|
+
* checkpoint an older release wrote is read back.
|
|
5
|
+
*
|
|
6
|
+
* A tuple is a META row, a PAYLOAD row and a checkpoint's WRITE rows, read
|
|
7
|
+
* strongly for `getTuple` and eventually for `list`, with expired rows absent
|
|
8
|
+
* however long DynamoDB's sweep lags, and with a pre-v4 checkpoint's `Send`s
|
|
9
|
+
* migrated from its parent's pending writes. The caller asks for a tuple; which
|
|
10
|
+
* reads that takes, and in what order, is decided here.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.fetchTargetMeta = fetchTargetMeta;
|
|
14
|
+
exports.fetchPayload = fetchPayload;
|
|
15
|
+
exports.fetchPendingWrites = fetchPendingWrites;
|
|
16
|
+
exports.assembleTuple = assembleTuple;
|
|
17
|
+
exports.migratePendingSends = migratePendingSends;
|
|
18
|
+
const langgraph_checkpoint_1 = require("@langchain/langgraph-checkpoint");
|
|
19
|
+
const clock_1 = require("../../shared/clock");
|
|
20
|
+
const paginate_1 = require("../../shared/dynamodb/paginate");
|
|
21
|
+
const retry_1 = require("../../shared/dynamodb/retry");
|
|
22
|
+
const table_schema_1 = require("../../shared/dynamodb/table-schema");
|
|
23
|
+
const rows_1 = require("./rows");
|
|
24
|
+
/**
|
|
25
|
+
* Rows one page of the newest-first META read evaluates. The read stops at the
|
|
26
|
+
* first live row of ours, so this decides only how many *dead* rows one round
|
|
27
|
+
* trip can step over: at one row per page, a thread whose head has aged out
|
|
28
|
+
* under a `ttl` costs one `Query` per expired row, and DynamoDB's own sweep may
|
|
29
|
+
* lag that `ttl` by up to 48 hours, so the run of dead rows can be as long as
|
|
30
|
+
* the thread is busy. This is the hottest read the package performs — every
|
|
31
|
+
* graph step begins with it — so a round trip per aged-out row is the wrong
|
|
32
|
+
* side of the trade to pay on every step.
|
|
33
|
+
*
|
|
34
|
+
* The trade runs the other way when nothing at the head has expired, which is
|
|
35
|
+
* every thread that sets no `ttl` at all. DynamoDB applies `Limit` before the
|
|
36
|
+
* filter and bills for what it evaluated, so such a read pays for up to this
|
|
37
|
+
* many META rows and keeps exactly one. A META row measures roughly 500
|
|
38
|
+
* bytes for a typical checkpoint, which puts a page at ~26 KB: about seven
|
|
39
|
+
* strongly consistent read units where a single row costs one, and a fortieth
|
|
40
|
+
* of the 1 MB a `Query` may return, so the page size rather than the response
|
|
41
|
+
* cap is always what ends a page.
|
|
42
|
+
*/
|
|
43
|
+
const LATEST_META_PAGE_SIZE = 50;
|
|
44
|
+
/**
|
|
45
|
+
* The META row a read is about: the one `checkpointId` names, else the newest
|
|
46
|
+
* in the namespace.
|
|
47
|
+
*
|
|
48
|
+
* Accepts: `address` — parsed; its `checkpointId` names the row, and its
|
|
49
|
+
* absence asks for the newest in the namespace. `signal` — aborts the read.
|
|
50
|
+
*
|
|
51
|
+
* Returns: the row, or undefined when there is none — including when every row
|
|
52
|
+
* in the namespace has expired, or when the only rows there belong to another
|
|
53
|
+
* writer.
|
|
54
|
+
*
|
|
55
|
+
* Throws: `FORMAT_UNSUPPORTED` for a row of ours written by a newer version;
|
|
56
|
+
* whatever the read throws.
|
|
57
|
+
*
|
|
58
|
+
* Guarantees: strongly consistent, and expiry is judged here rather than waited
|
|
59
|
+
* for, so a checkpoint past its ttl is absent to every reader however long
|
|
60
|
+
* DynamoDB's sweep lags. The newest-first read returns the first live row of
|
|
61
|
+
* ours and stops there, stepping over expired and foreign rows
|
|
62
|
+
* {@link LATEST_META_PAGE_SIZE} at a time rather than one per round trip.
|
|
63
|
+
*/
|
|
64
|
+
async function fetchTargetMeta(context, address, signal) {
|
|
65
|
+
const { threadId, checkpointNs, checkpointId } = address;
|
|
66
|
+
// Expired rows are absent to every reader, however long DynamoDB's sweep lags.
|
|
67
|
+
const now = (0, clock_1.nowSeconds)();
|
|
68
|
+
if (checkpointId !== undefined) {
|
|
69
|
+
const result = await (0, retry_1.withDynamoDBRetry)((request) => context.client.get({
|
|
70
|
+
TableName: context.tableName,
|
|
71
|
+
Key: (0, rows_1.metaRowKey)({ threadId, checkpointNs, checkpointId }),
|
|
72
|
+
ConsistentRead: true,
|
|
73
|
+
}, request), (0, retry_1.retryFor)(context, signal));
|
|
74
|
+
const meta = (0, rows_1.parseHeadRow)(context, result.Item);
|
|
75
|
+
return meta && !(0, table_schema_1.isExpiredRow)(meta, now) ? meta : undefined;
|
|
76
|
+
}
|
|
77
|
+
const params = (0, rows_1.beginsWithQuery)(context.tableName, (0, rows_1.partitionKey)(threadId), (0, rows_1.metaSortKeyPrefix)(checkpointNs), {
|
|
78
|
+
limit: LATEST_META_PAGE_SIZE,
|
|
79
|
+
consistent: true,
|
|
80
|
+
});
|
|
81
|
+
// Both caps stay off, each for its own reason. `maxItems` counts the rows
|
|
82
|
+
// yielded past the server-side filter, and a finite value there would add
|
|
83
|
+
// the probe `paginateQuery` runs to tell a reached cap apart from an
|
|
84
|
+
// exhausted read — more requests, on the read the page size above exists to
|
|
85
|
+
// make cheaper. `maxIterations` is the runaway guard, but a finite value
|
|
86
|
+
// would turn a namespace whose rows have all aged out into a thrown
|
|
87
|
+
// `RESULT_TRUNCATED` where this function documents `undefined`, failing
|
|
88
|
+
// every graph step on exactly the thread shape the page size is here to
|
|
89
|
+
// serve. The page size is what bounds the walk instead: it divides the
|
|
90
|
+
// requests a dead head costs by `LATEST_META_PAGE_SIZE`.
|
|
91
|
+
const rows = (0, paginate_1.paginateQuery)({
|
|
92
|
+
retry: (0, retry_1.retryFor)(context, signal),
|
|
93
|
+
signal,
|
|
94
|
+
client: context.client,
|
|
95
|
+
params: (0, table_schema_1.withoutExpired)(params, now),
|
|
96
|
+
maxItems: Number.POSITIVE_INFINITY,
|
|
97
|
+
maxIterations: Number.POSITIVE_INFINITY,
|
|
98
|
+
});
|
|
99
|
+
for await (const raw of rows) {
|
|
100
|
+
const meta = (0, rows_1.parseHeadRow)(context, raw);
|
|
101
|
+
if (meta && !(0, table_schema_1.isExpiredRow)(meta, now))
|
|
102
|
+
return meta;
|
|
103
|
+
}
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The PAYLOAD row of one checkpoint.
|
|
108
|
+
*
|
|
109
|
+
* Accepts: `at` — the checkpoint's location. `read.consistent` — defaults to
|
|
110
|
+
* true; `list` passes false and accepts replica lag, since a listing tolerates
|
|
111
|
+
* what a read-your-writes `getTuple` does not.
|
|
112
|
+
*
|
|
113
|
+
* Returns: the row, or undefined when it is not there — the window the ordered
|
|
114
|
+
* PAYLOAD→META write leaves open, which the caller answers as "no checkpoint".
|
|
115
|
+
*
|
|
116
|
+
* Throws: `FORMAT_UNSUPPORTED` for a row a newer release wrote; whatever the
|
|
117
|
+
* read throws.
|
|
118
|
+
*/
|
|
119
|
+
async function fetchPayload(context, at, read = {}) {
|
|
120
|
+
const result = await (0, retry_1.withDynamoDBRetry)((request) => context.client.get({
|
|
121
|
+
TableName: context.tableName,
|
|
122
|
+
Key: (0, rows_1.payloadRowKey)(at),
|
|
123
|
+
ConsistentRead: read.consistent ?? true,
|
|
124
|
+
}, request), (0, retry_1.retryFor)(context, read.signal));
|
|
125
|
+
const item = result.Item;
|
|
126
|
+
// A payload of ours written by a newer release fails loudly, as its META row
|
|
127
|
+
// would: decoding it under today's rules is how a checkpoint comes back with
|
|
128
|
+
// state silently missing.
|
|
129
|
+
if (item !== undefined)
|
|
130
|
+
(0, table_schema_1.assertReadableRow)(item, 'checkpoint payload');
|
|
131
|
+
return item;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Every pending write stored for one checkpoint, decoded, in write order.
|
|
135
|
+
*
|
|
136
|
+
* Accepts: `at` — the checkpoint's location. `read.consistent` — omitted reads
|
|
137
|
+
* strongly consistently; `list` passes `false` explicitly and accepts replica
|
|
138
|
+
* lag, `getTuple` passes `true`.
|
|
139
|
+
*
|
|
140
|
+
* Returns: the writes after `dropSupersededWrites` has resolved
|
|
141
|
+
* first-write-wins; a checkpoint with none returns an empty array.
|
|
142
|
+
*
|
|
143
|
+
* Throws: `FORMAT_UNSUPPORTED` for a row a newer release wrote; whatever the
|
|
144
|
+
* query or the payload decode throws.
|
|
145
|
+
*
|
|
146
|
+
* Guarantees: the read is deliberately uncapped. It must be complete to be
|
|
147
|
+
* correct — a `Send` fan-out retried with a changed write order leaves
|
|
148
|
+
* superseded rows behind that would count toward any cap — so past
|
|
149
|
+
* {@link LIST_SCAN_WARN_THRESHOLD} rows the read still succeeds and an operator
|
|
150
|
+
* is told the checkpoint is unusually heavy.
|
|
151
|
+
*/
|
|
152
|
+
async function fetchPendingWrites(context, at, read = {}) {
|
|
153
|
+
const params = (0, rows_1.beginsWithQuery)(context.tableName, (0, rows_1.partitionKey)(at.threadId), (0, rows_1.writeSortKeyPrefix)(at.checkpointNs, at.checkpointId), { ascending: true, consistent: read.consistent ?? true });
|
|
154
|
+
// Unbounded: the read must be complete to be correct, and a Send fan-out
|
|
155
|
+
// retried with a changed write order leaves superseded rows behind that
|
|
156
|
+
// count toward any cap. Past the warning threshold the read still succeeds,
|
|
157
|
+
// but an operator is told the checkpoint is unusually heavy.
|
|
158
|
+
const items = [];
|
|
159
|
+
for await (const item of (0, paginate_1.paginateQuery)({
|
|
160
|
+
retry: (0, retry_1.retryFor)(context, read.signal),
|
|
161
|
+
signal: read.signal,
|
|
162
|
+
client: context.client,
|
|
163
|
+
params,
|
|
164
|
+
maxItems: Number.POSITIVE_INFINITY,
|
|
165
|
+
maxIterations: Number.POSITIVE_INFINITY,
|
|
166
|
+
})) {
|
|
167
|
+
// Checked before `dropSupersededWrites` reads `writeGroup`: that dedup runs
|
|
168
|
+
// on every row regardless of format, and a newer format may give the
|
|
169
|
+
// attribute a different meaning.
|
|
170
|
+
(0, table_schema_1.assertReadableRow)(item, 'pending write');
|
|
171
|
+
items.push(item);
|
|
172
|
+
}
|
|
173
|
+
if (items.length >= paginate_1.LIST_SCAN_WARN_THRESHOLD) {
|
|
174
|
+
context.logger.warn('getTuple: a checkpoint carries very many pending-write rows; the read is complete but slow', {
|
|
175
|
+
threadId: at.threadId,
|
|
176
|
+
checkpointId: at.checkpointId,
|
|
177
|
+
rows: items.length,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return (0, rows_1.toPendingWrites)(context, items, at.threadId, read.signal);
|
|
181
|
+
}
|
|
182
|
+
/** Build a config that addresses a specific checkpoint. */
|
|
183
|
+
function configFor(threadId, checkpointNs, checkpointId) {
|
|
184
|
+
return {
|
|
185
|
+
configurable: { thread_id: threadId, checkpoint_ns: checkpointNs, checkpoint_id: checkpointId },
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* A full {@link CheckpointTuple} built from a META row.
|
|
190
|
+
*
|
|
191
|
+
* Accepts: `thread` — the **caller's** location, never the row's: `thread.threadId`
|
|
192
|
+
* scopes which S3 object the row may point at, so it must come from the
|
|
193
|
+
* partition the caller asked for; `thread.checkpointNs` is its namespace.
|
|
194
|
+
* `options.metadata` — already decoded by a filtered `list`, so a filtered
|
|
195
|
+
* listing decodes and downloads each metadata blob once, not twice.
|
|
196
|
+
* `options.consistent` — true for `getTuple`, false for `list`.
|
|
197
|
+
*
|
|
198
|
+
* Returns: the tuple, with `parentConfig` set only when the row names a parent;
|
|
199
|
+
* `undefined` when the PAYLOAD row is absent — the window the ordered
|
|
200
|
+
* PAYLOAD→META write leaves open, and the same answer a caller gets for a
|
|
201
|
+
* checkpoint that does not exist.
|
|
202
|
+
*
|
|
203
|
+
* Throws: whatever the reads and decodes throw.
|
|
204
|
+
*/
|
|
205
|
+
async function assembleTuple(context, thread, meta, options) {
|
|
206
|
+
const read = { signal: options.signal, consistent: options.consistent };
|
|
207
|
+
const at = { ...thread, checkpointId: meta.checkpointId };
|
|
208
|
+
const payload = await fetchPayload(context, at, read);
|
|
209
|
+
if (!payload)
|
|
210
|
+
return undefined;
|
|
211
|
+
const [checkpoint, metadata, pendingWrites] = await Promise.all([
|
|
212
|
+
(0, rows_1.readCheckpoint)(context, payload, thread.threadId, options.signal).then((stored) => migratePendingSends(context, stored, { ...thread, parentCheckpointId: meta.parentCheckpointId }, read)),
|
|
213
|
+
options.metadata ?? (0, rows_1.readMetadata)(context, meta, thread.threadId, options.signal),
|
|
214
|
+
fetchPendingWrites(context, at, read),
|
|
215
|
+
]);
|
|
216
|
+
const tuple = {
|
|
217
|
+
config: configFor(thread.threadId, thread.checkpointNs, meta.checkpointId),
|
|
218
|
+
checkpoint,
|
|
219
|
+
metadata,
|
|
220
|
+
pendingWrites,
|
|
221
|
+
};
|
|
222
|
+
if (meta.parentCheckpointId !== undefined) {
|
|
223
|
+
tuple.parentConfig = configFor(thread.threadId, thread.checkpointNs, meta.parentCheckpointId);
|
|
224
|
+
}
|
|
225
|
+
return tuple;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Pre-v4 checkpoints kept a task's `Send`s as `__pregel_tasks` pending writes
|
|
229
|
+
* on the parent rather than in the checkpoint itself. Reading such a
|
|
230
|
+
* checkpoint rebuilds `channel_values[TASKS]` from those writes and stamps
|
|
231
|
+
* the channel with the highest version the checkpoint already carries (or
|
|
232
|
+
* the first version when it carries none), exactly as the reference savers
|
|
233
|
+
* do, so a thread written before LangGraph 0.2 still resumes.
|
|
234
|
+
*
|
|
235
|
+
* Accepts: `checkpoint` — any version. `parent` — the checkpoint's own thread
|
|
236
|
+
* and namespace, plus `parent.parentCheckpointId`, the parent whose pending
|
|
237
|
+
* writes hold the sends; absent means there is nowhere to migrate from.
|
|
238
|
+
* `read` — cancellation and consistency for the pending-writes read.
|
|
239
|
+
*
|
|
240
|
+
* Returns: the checkpoint untouched when it is v4 or has no parent, and
|
|
241
|
+
* otherwise a copy with `channel_values[TASKS]` rebuilt. The input is never
|
|
242
|
+
* mutated.
|
|
243
|
+
*
|
|
244
|
+
* Throws: whatever reading the parent's pending writes throws.
|
|
245
|
+
*/
|
|
246
|
+
async function migratePendingSends(context, checkpoint, parent, read) {
|
|
247
|
+
if (checkpoint.v >= 4 || parent.parentCheckpointId === undefined)
|
|
248
|
+
return checkpoint;
|
|
249
|
+
const writes = await fetchPendingWrites(context, {
|
|
250
|
+
threadId: parent.threadId,
|
|
251
|
+
checkpointNs: parent.checkpointNs,
|
|
252
|
+
checkpointId: parent.parentCheckpointId,
|
|
253
|
+
}, read);
|
|
254
|
+
const sends = writes.filter(([, channel]) => channel === langgraph_checkpoint_1.TASKS).map(([, , value]) => value);
|
|
255
|
+
const versions = Object.values(checkpoint.channel_versions);
|
|
256
|
+
return {
|
|
257
|
+
...checkpoint,
|
|
258
|
+
channel_values: { ...checkpoint.channel_values, [langgraph_checkpoint_1.TASKS]: sends },
|
|
259
|
+
channel_versions: {
|
|
260
|
+
...checkpoint.channel_versions,
|
|
261
|
+
[langgraph_checkpoint_1.TASKS]: versions.length > 0 ? (0, langgraph_checkpoint_1.maxChannelVersion)(...versions) : 1,
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
}
|