@farukada/aws-langgraph-dynamodb-ts 1.0.0-rc.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +390 -193
- package/dist/{backfill → cjs/backfill}/backfill.d.ts +15 -12
- package/dist/cjs/backfill/backfill.js +177 -0
- package/dist/{checkpointer → cjs/checkpointer}/actions/delete-thread.d.ts +1 -1
- package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
- package/dist/{checkpointer → cjs/checkpointer}/actions/get-tuple.d.ts +4 -3
- package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
- package/dist/{checkpointer → cjs/checkpointer}/actions/list.d.ts +7 -4
- package/dist/cjs/checkpointer/actions/list.js +70 -0
- package/dist/{checkpointer → cjs/checkpointer}/actions/put-writes.d.ts +8 -6
- package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
- package/dist/{checkpointer → cjs/checkpointer}/actions/put.d.ts +21 -15
- package/dist/cjs/checkpointer/actions/put.js +79 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/delta-history.d.ts +38 -26
- package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/listing.d.ts +4 -4
- package/dist/cjs/checkpointer/internal/listing.js +104 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/parse.d.ts +51 -15
- package/dist/cjs/checkpointer/internal/parse.js +184 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/pending-writes.d.ts +64 -25
- package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/read.d.ts +15 -10
- package/dist/cjs/checkpointer/internal/read.js +132 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/rows.d.ts +94 -21
- package/dist/cjs/checkpointer/internal/rows.js +356 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/setup.d.ts +13 -20
- package/dist/cjs/checkpointer/internal/setup.js +25 -0
- package/dist/{checkpointer → cjs/checkpointer}/saver.d.ts +72 -36
- package/dist/cjs/checkpointer/saver.js +56 -0
- package/dist/{checkpointer → cjs/checkpointer}/types.d.ts +1 -1
- package/dist/cjs/checkpointer/types.js +2 -0
- package/dist/{factory → cjs/factory}/factory.d.ts +25 -20
- package/dist/cjs/factory/factory.js +137 -0
- package/dist/{factory → cjs/factory}/types.d.ts +12 -12
- package/dist/cjs/factory/types.js +2 -0
- package/dist/{history → cjs/history}/actions/add-messages.d.ts +18 -10
- package/dist/cjs/history/actions/add-messages.js +17 -0
- package/dist/{history → cjs/history}/actions/clear.d.ts +1 -1
- package/dist/cjs/history/actions/clear.js +29 -0
- package/dist/{history → cjs/history}/actions/get-messages.d.ts +11 -9
- package/dist/cjs/history/actions/get-messages.js +58 -0
- package/dist/{history → cjs/history}/actions/list-sessions.d.ts +3 -3
- package/dist/cjs/history/actions/list-sessions.js +67 -0
- package/dist/{history → cjs/history}/actions/reconcile-count.d.ts +13 -9
- package/dist/cjs/history/actions/reconcile-count.js +8 -0
- package/dist/{history → cjs/history}/chat-message-history.d.ts +62 -30
- package/dist/cjs/history/chat-message-history.js +61 -0
- package/dist/{history → cjs/history}/internal/append.d.ts +64 -32
- package/dist/cjs/history/internal/append.js +267 -0
- package/dist/{history → cjs/history}/internal/message-read.d.ts +3 -3
- package/dist/cjs/history/internal/message-read.js +93 -0
- package/dist/{history → cjs/history}/internal/parse.d.ts +2 -2
- package/dist/cjs/history/internal/parse.js +113 -0
- package/dist/{history → cjs/history}/internal/rows.d.ts +11 -10
- package/dist/cjs/history/internal/rows.js +96 -0
- package/dist/{history → cjs/history}/internal/session.d.ts +41 -22
- package/dist/cjs/history/internal/session.js +296 -0
- package/dist/{history → cjs/history}/internal/setup.d.ts +2 -2
- package/dist/cjs/history/internal/setup.js +60 -0
- package/dist/{history → cjs/history}/session-adapter.d.ts +0 -6
- package/dist/cjs/history/session-adapter.js +38 -0
- package/dist/{history → cjs/history}/types.d.ts +18 -15
- package/dist/cjs/history/types.js +2 -0
- package/dist/{index.d.ts → cjs/index.d.ts} +27 -27
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/package.json +1 -0
- package/dist/{shared → cjs/shared}/adapter.d.ts +27 -16
- package/dist/cjs/shared/adapter.js +70 -0
- package/dist/cjs/shared/clock.js +14 -0
- package/dist/{shared → cjs/shared}/codec/codec.d.ts +37 -20
- package/dist/cjs/shared/codec/codec.js +162 -0
- package/dist/{shared → cjs/shared}/codec/compression.d.ts +9 -4
- package/dist/cjs/shared/codec/compression.js +45 -0
- package/dist/cjs/shared/codec/json-serde.js +58 -0
- package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +2 -1
- package/dist/cjs/shared/codec/s3/client-types.js +6 -0
- package/dist/{shared → cjs/shared}/codec/s3/client.d.ts +25 -7
- package/dist/cjs/shared/codec/s3/client.js +78 -0
- package/dist/{shared → cjs/shared}/codec/s3/config.d.ts +12 -7
- package/dist/cjs/shared/codec/s3/config.js +92 -0
- package/dist/{shared → cjs/shared}/codec/s3/lifecycle.d.ts +71 -17
- package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
- package/dist/{shared → cjs/shared}/codec/s3/offloader.d.ts +42 -29
- package/dist/cjs/shared/codec/s3/offloader.js +289 -0
- package/dist/cjs/shared/concurrency.js +31 -0
- package/dist/{shared → cjs/shared}/dynamodb/abort.d.ts +2 -2
- package/dist/cjs/shared/dynamodb/abort.js +16 -0
- package/dist/{shared → cjs/shared}/dynamodb/batch-write.d.ts +2 -2
- package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
- package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
- package/dist/{shared → cjs/shared}/dynamodb/client.d.ts +24 -22
- package/dist/cjs/shared/dynamodb/client.js +40 -0
- package/dist/{shared → cjs/shared}/dynamodb/idempotent-write.d.ts +64 -19
- package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
- package/dist/{shared → cjs/shared}/dynamodb/paginate.d.ts +2 -2
- package/dist/cjs/shared/dynamodb/paginate.js +90 -0
- package/dist/{shared → cjs/shared}/dynamodb/partition-delete.d.ts +6 -6
- package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
- package/dist/{shared → cjs/shared}/dynamodb/recency-index.d.ts +27 -15
- package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
- package/dist/{shared → cjs/shared}/dynamodb/retry.d.ts +37 -6
- package/dist/cjs/shared/dynamodb/retry.js +193 -0
- package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
- package/dist/cjs/shared/dynamodb/row-size.js +30 -0
- package/dist/{shared → cjs/shared}/dynamodb/table-schema.d.ts +27 -18
- package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
- package/dist/{shared → cjs/shared}/errors/base-error.d.ts +42 -7
- package/dist/cjs/shared/errors/base-error.js +73 -0
- package/dist/{shared → cjs/shared}/errors/boundary.d.ts +29 -14
- package/dist/cjs/shared/errors/boundary.js +61 -0
- package/dist/cjs/shared/errors/classify.d.ts +206 -0
- package/dist/cjs/shared/errors/classify.js +232 -0
- package/dist/{shared → cjs/shared}/errors/error-code.d.ts +17 -10
- package/dist/cjs/shared/errors/error-code.js +27 -0
- package/dist/{shared → cjs/shared}/errors/errors.d.ts +75 -9
- package/dist/cjs/shared/errors/errors.js +123 -0
- package/dist/cjs/shared/logging/logger.js +30 -0
- package/dist/{shared → cjs/shared}/logging/redaction.d.ts +8 -4
- package/dist/cjs/shared/logging/redaction.js +145 -0
- package/dist/{shared → cjs/shared}/logging/secret-patterns.d.ts +30 -7
- package/dist/cjs/shared/logging/secret-patterns.js +93 -0
- package/dist/cjs/shared/logging/truncate.js +31 -0
- package/dist/{shared → cjs/shared}/options.d.ts +27 -11
- package/dist/cjs/shared/options.js +2 -0
- package/dist/cjs/shared/ulid.js +83 -0
- package/dist/{shared → cjs/shared}/validation/collaborators.d.ts +21 -2
- package/dist/cjs/shared/validation/collaborators.js +79 -0
- package/dist/{shared → cjs/shared}/validation/option-shape.d.ts +7 -5
- package/dist/cjs/shared/validation/option-shape.js +31 -0
- package/dist/{shared → cjs/shared}/validation/options.d.ts +4 -4
- package/dist/cjs/shared/validation/options.js +166 -0
- package/dist/cjs/shared/validation/primitives.js +114 -0
- package/dist/{shared → cjs/shared}/validation/ttl.d.ts +26 -9
- package/dist/cjs/shared/validation/ttl.js +52 -0
- package/dist/{store → cjs/store}/actions/list-namespaces.d.ts +5 -5
- package/dist/cjs/store/actions/list-namespaces.js +92 -0
- package/dist/{store → cjs/store}/actions/put.d.ts +11 -4
- package/dist/cjs/store/actions/put.js +49 -0
- package/dist/{store → cjs/store}/actions/reconcile-vector-index.d.ts +5 -5
- package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
- package/dist/{store → cjs/store}/actions/search.d.ts +2 -2
- package/dist/cjs/store/actions/search.js +26 -0
- package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
- package/dist/cjs/store/internal/batch-plan.js +32 -0
- package/dist/{store → cjs/store}/internal/filter.d.ts +3 -3
- package/dist/cjs/store/internal/filter.js +64 -0
- package/dist/cjs/store/internal/get-item.d.ts +77 -0
- package/dist/cjs/store/internal/get-item.js +58 -0
- package/dist/{store → cjs/store}/internal/item-write.d.ts +72 -32
- package/dist/cjs/store/internal/item-write.js +181 -0
- package/dist/{store → cjs/store}/internal/parse.d.ts +15 -10
- package/dist/cjs/store/internal/parse.js +180 -0
- package/dist/{store → cjs/store}/internal/rows.d.ts +38 -34
- package/dist/cjs/store/internal/rows.js +166 -0
- package/dist/{store → cjs/store}/internal/semantic-search.d.ts +2 -2
- package/dist/cjs/store/internal/semantic-search.js +211 -0
- package/dist/{store → cjs/store}/internal/setup.d.ts +10 -15
- package/dist/cjs/store/internal/setup.js +103 -0
- package/dist/{store → cjs/store}/internal/table-search.d.ts +5 -5
- package/dist/cjs/store/internal/table-search.js +123 -0
- package/dist/{store → cjs/store}/internal/vector-index.d.ts +26 -15
- package/dist/cjs/store/internal/vector-index.js +269 -0
- package/dist/{store → cjs/store}/store.d.ts +82 -39
- package/dist/cjs/store/store.js +97 -0
- package/dist/{store → cjs/store}/types.d.ts +25 -10
- package/dist/cjs/store/types.js +2 -0
- package/dist/cjs/store/vector-backend.js +4 -0
- package/dist/esm/backfill/backfill.d.ts +171 -0
- package/dist/esm/backfill/backfill.js +170 -0
- package/dist/{checkpointer/actions/delete-thread.js → esm/checkpointer/actions/delete-thread.d.ts} +4 -26
- package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
- package/dist/{checkpointer/actions/get-tuple.js → esm/checkpointer/actions/get-tuple.d.ts} +7 -24
- package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
- package/dist/esm/checkpointer/actions/list.d.ts +55 -0
- package/dist/esm/checkpointer/actions/list.js +67 -0
- package/dist/{checkpointer/actions/put-writes.js → esm/checkpointer/actions/put-writes.d.ts} +10 -37
- package/dist/esm/checkpointer/actions/put-writes.js +18 -0
- package/dist/esm/checkpointer/actions/put.d.ts +95 -0
- package/dist/esm/checkpointer/actions/put.js +75 -0
- package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
- package/dist/esm/checkpointer/internal/delta-history.js +126 -0
- package/dist/{checkpointer/internal/listing.js → esm/checkpointer/internal/listing.d.ts} +22 -118
- package/dist/esm/checkpointer/internal/listing.js +95 -0
- package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
- package/dist/esm/checkpointer/internal/parse.js +169 -0
- package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
- package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
- package/dist/esm/checkpointer/internal/read.d.ts +135 -0
- package/dist/esm/checkpointer/internal/read.js +125 -0
- package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
- package/dist/esm/checkpointer/internal/rows.js +323 -0
- package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
- package/dist/esm/checkpointer/internal/setup.js +21 -0
- package/dist/{checkpointer/saver.js → esm/checkpointer/saver.d.ts} +84 -87
- package/dist/esm/checkpointer/saver.js +52 -0
- package/dist/esm/checkpointer/types.d.ts +51 -0
- package/dist/esm/checkpointer/types.js +1 -0
- package/dist/esm/factory/factory.d.ts +154 -0
- package/dist/esm/factory/factory.js +133 -0
- package/dist/esm/factory/types.d.ts +76 -0
- package/dist/esm/factory/types.js +1 -0
- package/dist/{history/actions/add-messages.js → esm/history/actions/add-messages.d.ts} +20 -26
- package/dist/esm/history/actions/add-messages.js +14 -0
- package/dist/{history/actions/clear.js → esm/history/actions/clear.d.ts} +4 -35
- package/dist/esm/history/actions/clear.js +26 -0
- package/dist/esm/history/actions/get-messages.d.ts +60 -0
- package/dist/esm/history/actions/get-messages.js +55 -0
- package/dist/esm/history/actions/list-sessions.d.ts +55 -0
- package/dist/esm/history/actions/list-sessions.js +64 -0
- package/dist/{history/actions/reconcile-count.js → esm/history/actions/reconcile-count.d.ts} +14 -16
- package/dist/esm/history/actions/reconcile-count.js +5 -0
- package/dist/{history/chat-message-history.js → esm/history/chat-message-history.d.ts} +76 -87
- package/dist/esm/history/chat-message-history.js +57 -0
- package/dist/esm/history/internal/append.d.ts +244 -0
- package/dist/esm/history/internal/append.js +259 -0
- package/dist/esm/history/internal/message-read.d.ts +84 -0
- package/dist/esm/history/internal/message-read.js +89 -0
- package/dist/esm/history/internal/parse.d.ts +153 -0
- package/dist/esm/history/internal/parse.js +105 -0
- package/dist/{history/internal/rows.js → esm/history/internal/rows.d.ts} +58 -112
- package/dist/esm/history/internal/rows.js +83 -0
- package/dist/esm/history/internal/session.d.ts +350 -0
- package/dist/esm/history/internal/session.js +285 -0
- package/dist/esm/history/internal/setup.d.ts +64 -0
- package/dist/esm/history/internal/setup.js +56 -0
- package/dist/{history/session-adapter.js → esm/history/session-adapter.d.ts} +25 -39
- package/dist/esm/history/session-adapter.js +34 -0
- package/dist/esm/history/types.d.ts +102 -0
- package/dist/esm/history/types.js +1 -0
- package/dist/esm/index.d.ts +53 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/shared/adapter.d.ts +146 -0
- package/dist/esm/shared/adapter.js +65 -0
- package/dist/{shared/clock.js → esm/shared/clock.d.ts} +3 -14
- package/dist/esm/shared/clock.js +9 -0
- package/dist/esm/shared/codec/codec.d.ts +336 -0
- package/dist/esm/shared/codec/codec.js +150 -0
- package/dist/esm/shared/codec/compression.d.ts +66 -0
- package/dist/esm/shared/codec/compression.js +40 -0
- package/dist/esm/shared/codec/json-serde.d.ts +80 -0
- package/dist/esm/shared/codec/json-serde.js +54 -0
- package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
- package/dist/esm/shared/codec/s3/client-types.js +3 -0
- package/dist/esm/shared/codec/s3/client.d.ts +63 -0
- package/dist/esm/shared/codec/s3/client.js +40 -0
- package/dist/{shared/codec/s3/config.js → esm/shared/codec/s3/config.d.ts} +45 -93
- package/dist/esm/shared/codec/s3/config.js +79 -0
- package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
- package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
- package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
- package/dist/esm/shared/codec/s3/offloader.js +278 -0
- package/dist/{shared/concurrency.js → esm/shared/concurrency.d.ts} +2 -37
- package/dist/esm/shared/concurrency.js +27 -0
- package/dist/{shared/dynamodb/abort.js → esm/shared/dynamodb/abort.d.ts} +4 -16
- package/dist/esm/shared/dynamodb/abort.js +12 -0
- package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
- package/dist/esm/shared/dynamodb/batch-write.js +74 -0
- package/dist/{shared/dynamodb/cancellation.js → esm/shared/dynamodb/cancellation.d.ts} +25 -53
- package/dist/esm/shared/dynamodb/cancellation.js +30 -0
- package/dist/{shared/dynamodb/client.js → esm/shared/dynamodb/client.d.ts} +74 -64
- package/dist/esm/shared/dynamodb/client.js +35 -0
- package/dist/{shared/dynamodb/idempotent-write.js → esm/shared/dynamodb/idempotent-write.d.ts} +172 -169
- package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
- package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
- package/dist/esm/shared/dynamodb/paginate.js +84 -0
- package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
- package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
- package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
- package/dist/esm/shared/dynamodb/recency-index.js +136 -0
- package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
- package/dist/esm/shared/dynamodb/retry.js +180 -0
- package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
- package/dist/esm/shared/dynamodb/row-size.js +26 -0
- package/dist/{shared/dynamodb/table-schema.js → esm/shared/dynamodb/table-schema.d.ts} +57 -67
- package/dist/esm/shared/dynamodb/table-schema.js +43 -0
- package/dist/esm/shared/errors/base-error.d.ts +231 -0
- package/dist/esm/shared/errors/base-error.js +64 -0
- package/dist/esm/shared/errors/boundary.d.ts +86 -0
- package/dist/esm/shared/errors/boundary.js +54 -0
- package/dist/esm/shared/errors/classify.d.ts +206 -0
- package/dist/esm/shared/errors/classify.js +220 -0
- package/dist/{shared/errors/error-code.js → esm/shared/errors/error-code.d.ts} +39 -43
- package/dist/esm/shared/errors/error-code.js +24 -0
- package/dist/{shared/errors/errors.js → esm/shared/errors/errors.d.ts} +92 -98
- package/dist/esm/shared/errors/errors.js +110 -0
- package/dist/{shared/logging/logger.js → esm/shared/logging/logger.d.ts} +22 -52
- package/dist/esm/shared/logging/logger.js +25 -0
- package/dist/esm/shared/logging/redaction.d.ts +123 -0
- package/dist/esm/shared/logging/redaction.js +140 -0
- package/dist/{shared/logging/secret-patterns.js → esm/shared/logging/secret-patterns.d.ts} +46 -87
- package/dist/esm/shared/logging/secret-patterns.js +83 -0
- package/dist/{shared/logging/truncate.js → esm/shared/logging/truncate.d.ts} +6 -40
- package/dist/esm/shared/logging/truncate.js +25 -0
- package/dist/esm/shared/options.d.ts +100 -0
- package/dist/esm/shared/options.js +1 -0
- package/dist/{shared/ulid.js → esm/shared/ulid.d.ts} +4 -84
- package/dist/esm/shared/ulid.js +77 -0
- package/dist/{shared/validation/collaborators.js → esm/shared/validation/collaborators.d.ts} +37 -65
- package/dist/esm/shared/validation/collaborators.js +70 -0
- package/dist/{shared/validation/option-shape.js → esm/shared/validation/option-shape.d.ts} +14 -36
- package/dist/esm/shared/validation/option-shape.js +24 -0
- package/dist/esm/shared/validation/options.d.ts +145 -0
- package/dist/esm/shared/validation/options.js +156 -0
- package/dist/{shared/validation/primitives.js → esm/shared/validation/primitives.d.ts} +30 -125
- package/dist/esm/shared/validation/primitives.js +100 -0
- package/dist/esm/shared/validation/ttl.d.ts +94 -0
- package/dist/esm/shared/validation/ttl.js +46 -0
- package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
- package/dist/esm/store/actions/list-namespaces.js +86 -0
- package/dist/esm/store/actions/put.d.ts +43 -0
- package/dist/esm/store/actions/put.js +46 -0
- package/dist/{store/actions/reconcile-vector-index.js → esm/store/actions/reconcile-vector-index.d.ts} +8 -16
- package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
- package/dist/esm/store/actions/search.d.ts +38 -0
- package/dist/esm/store/actions/search.js +23 -0
- package/dist/esm/store/internal/batch-plan.d.ts +56 -0
- package/dist/esm/store/internal/batch-plan.js +28 -0
- package/dist/esm/store/internal/filter.d.ts +43 -0
- package/dist/esm/store/internal/filter.js +60 -0
- package/dist/esm/store/internal/get-item.d.ts +77 -0
- package/dist/esm/store/internal/get-item.js +54 -0
- package/dist/esm/store/internal/item-write.d.ts +270 -0
- package/dist/esm/store/internal/item-write.js +173 -0
- package/dist/esm/store/internal/parse.d.ts +230 -0
- package/dist/esm/store/internal/parse.js +169 -0
- package/dist/{store/internal/rows.js → esm/store/internal/rows.d.ts} +111 -199
- package/dist/esm/store/internal/rows.js +147 -0
- package/dist/esm/store/internal/semantic-search.d.ts +168 -0
- package/dist/esm/store/internal/semantic-search.js +200 -0
- package/dist/esm/store/internal/setup.d.ts +96 -0
- package/dist/esm/store/internal/setup.js +98 -0
- package/dist/esm/store/internal/table-search.d.ts +100 -0
- package/dist/esm/store/internal/table-search.js +119 -0
- package/dist/esm/store/internal/vector-index.d.ts +258 -0
- package/dist/esm/store/internal/vector-index.js +256 -0
- package/dist/{store/store.js → esm/store/store.d.ts} +99 -133
- package/dist/esm/store/store.js +93 -0
- package/dist/esm/store/types.d.ts +111 -0
- package/dist/esm/store/types.js +1 -0
- package/dist/esm/store/vector-backend.d.ts +104 -0
- package/dist/esm/store/vector-backend.js +1 -0
- package/package.json +50 -44
- package/dist/backfill/backfill.js +0 -393
- package/dist/checkpointer/actions/list.js +0 -142
- package/dist/checkpointer/actions/put.js +0 -195
- package/dist/checkpointer/internal/delta-history.js +0 -252
- package/dist/checkpointer/internal/parse.js +0 -372
- package/dist/checkpointer/internal/pending-writes.js +0 -588
- package/dist/checkpointer/internal/read.js +0 -264
- package/dist/checkpointer/internal/rows.js +0 -834
- package/dist/checkpointer/internal/setup.js +0 -72
- package/dist/checkpointer/types.js +0 -12
- package/dist/factory/factory.js +0 -266
- package/dist/factory/types.js +0 -10
- package/dist/history/actions/get-messages.js +0 -141
- package/dist/history/actions/list-sessions.js +0 -156
- package/dist/history/internal/append.js +0 -500
- package/dist/history/internal/message-read.js +0 -204
- package/dist/history/internal/parse.js +0 -252
- package/dist/history/internal/session.js +0 -628
- package/dist/history/internal/setup.js +0 -106
- package/dist/history/types.js +0 -12
- package/dist/index.js +0 -51
- package/dist/shared/adapter.js +0 -143
- package/dist/shared/codec/codec.js +0 -441
- package/dist/shared/codec/compression.js +0 -89
- package/dist/shared/codec/json-serde.js +0 -191
- package/dist/shared/codec/s3/client-types.js +0 -26
- package/dist/shared/codec/s3/client.js +0 -97
- package/dist/shared/codec/s3/lifecycle.js +0 -355
- package/dist/shared/codec/s3/offloader.js +0 -658
- package/dist/shared/dynamodb/batch-write.js +0 -173
- package/dist/shared/dynamodb/paginate.js +0 -188
- package/dist/shared/dynamodb/partition-delete.js +0 -340
- package/dist/shared/dynamodb/recency-index.js +0 -377
- package/dist/shared/dynamodb/retry.js +0 -463
- package/dist/shared/errors/base-error.js +0 -174
- package/dist/shared/errors/boundary.js +0 -143
- package/dist/shared/errors/classify.d.ts +0 -97
- package/dist/shared/errors/classify.js +0 -257
- package/dist/shared/logging/redaction.js +0 -316
- package/dist/shared/options.js +0 -11
- package/dist/shared/validation/options.js +0 -328
- package/dist/shared/validation/ttl.js +0 -132
- package/dist/store/actions/list-namespaces.js +0 -197
- package/dist/store/actions/put.js +0 -78
- package/dist/store/actions/search.js +0 -66
- package/dist/store/internal/batch-plan.d.ts +0 -26
- package/dist/store/internal/batch-plan.js +0 -109
- package/dist/store/internal/filter.js +0 -137
- package/dist/store/internal/get-item.d.ts +0 -45
- package/dist/store/internal/get-item.js +0 -115
- package/dist/store/internal/item-write.js +0 -463
- package/dist/store/internal/parse.js +0 -350
- package/dist/store/internal/semantic-search.js +0 -389
- package/dist/store/internal/setup.js +0 -223
- package/dist/store/internal/table-search.js +0 -213
- package/dist/store/internal/vector-index.js +0 -546
- package/dist/store/types.js +0 -15
- package/dist/store/vector-backend.js +0 -17
- /package/dist/{shared → cjs/shared}/clock.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/codec/json-serde.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/concurrency.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/dynamodb/cancellation.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/logging/logger.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/logging/truncate.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/ulid.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/validation/primitives.d.ts +0 -0
- /package/dist/{store → cjs/store}/vector-backend.d.ts +0 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchTargetMeta = fetchTargetMeta;
|
|
4
|
+
exports.fetchPayload = fetchPayload;
|
|
5
|
+
exports.fetchPendingWrites = fetchPendingWrites;
|
|
6
|
+
exports.assembleTuple = assembleTuple;
|
|
7
|
+
exports.migratePendingSends = migratePendingSends;
|
|
8
|
+
const langgraph_checkpoint_1 = require("@langchain/langgraph-checkpoint");
|
|
9
|
+
const clock_js_1 = require("../../shared/clock.js");
|
|
10
|
+
const paginate_js_1 = require("../../shared/dynamodb/paginate.js");
|
|
11
|
+
const retry_js_1 = require("../../shared/dynamodb/retry.js");
|
|
12
|
+
const table_schema_js_1 = require("../../shared/dynamodb/table-schema.js");
|
|
13
|
+
const truncate_js_1 = require("../../shared/logging/truncate.js");
|
|
14
|
+
const rows_js_1 = require("./rows.js");
|
|
15
|
+
const LATEST_META_PAGE_SIZE = 50;
|
|
16
|
+
async function fetchTargetMeta(context, address, signal, reader = 'getTuple') {
|
|
17
|
+
const { threadId, checkpointNs, checkpointId } = address;
|
|
18
|
+
const now = (0, clock_js_1.nowSeconds)();
|
|
19
|
+
if (checkpointId !== undefined) {
|
|
20
|
+
const result = await (0, retry_js_1.withDynamoDBRetry)((request) => context.client.get({
|
|
21
|
+
TableName: context.tableName,
|
|
22
|
+
Key: (0, rows_js_1.metaRowKey)({ threadId, checkpointNs, checkpointId }),
|
|
23
|
+
ConsistentRead: true,
|
|
24
|
+
}, request), (0, retry_js_1.retryFor)(context, signal));
|
|
25
|
+
const meta = (0, rows_js_1.parseHeadRow)(context, result.Item, reader);
|
|
26
|
+
return meta && !(0, table_schema_js_1.isExpiredRow)(meta, now) ? meta : undefined;
|
|
27
|
+
}
|
|
28
|
+
const params = (0, rows_js_1.beginsWithQuery)(context.tableName, (0, rows_js_1.partitionKey)(threadId), (0, rows_js_1.metaSortKeyPrefix)(checkpointNs), {
|
|
29
|
+
limit: context.ttl === undefined ? 1 : LATEST_META_PAGE_SIZE,
|
|
30
|
+
consistent: true,
|
|
31
|
+
});
|
|
32
|
+
const rows = (0, paginate_js_1.paginateQuery)({
|
|
33
|
+
retry: (0, retry_js_1.retryFor)(context, signal),
|
|
34
|
+
signal,
|
|
35
|
+
client: context.client,
|
|
36
|
+
params: (0, table_schema_js_1.withoutExpired)(params, now),
|
|
37
|
+
maxItems: Number.POSITIVE_INFINITY,
|
|
38
|
+
maxIterations: Number.POSITIVE_INFINITY,
|
|
39
|
+
});
|
|
40
|
+
for await (const raw of rows) {
|
|
41
|
+
const meta = (0, rows_js_1.parseHeadRow)(context, raw, reader);
|
|
42
|
+
if (meta && !(0, table_schema_js_1.isExpiredRow)(meta, now))
|
|
43
|
+
return meta;
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
async function fetchPayload(context, at, read = {}) {
|
|
48
|
+
const result = await (0, retry_js_1.withDynamoDBRetry)((request) => context.client.get({
|
|
49
|
+
TableName: context.tableName,
|
|
50
|
+
Key: (0, rows_js_1.payloadRowKey)(at),
|
|
51
|
+
ConsistentRead: read.consistent ?? true,
|
|
52
|
+
}, request), (0, retry_js_1.retryFor)(context, read.signal));
|
|
53
|
+
const item = result.Item;
|
|
54
|
+
if (item !== undefined)
|
|
55
|
+
(0, table_schema_js_1.assertReadableRow)(item, 'checkpoint payload');
|
|
56
|
+
return item;
|
|
57
|
+
}
|
|
58
|
+
async function fetchPendingWrites(context, at, read = {}) {
|
|
59
|
+
const params = (0, rows_js_1.beginsWithQuery)(context.tableName, (0, rows_js_1.partitionKey)(at.threadId), (0, rows_js_1.writeSortKeyPrefix)(at.checkpointNs, at.checkpointId), { ascending: true, consistent: read.consistent ?? true });
|
|
60
|
+
const items = [];
|
|
61
|
+
for await (const item of (0, paginate_js_1.paginateQuery)({
|
|
62
|
+
retry: (0, retry_js_1.retryFor)(context, read.signal),
|
|
63
|
+
signal: read.signal,
|
|
64
|
+
client: context.client,
|
|
65
|
+
params,
|
|
66
|
+
maxItems: Number.POSITIVE_INFINITY,
|
|
67
|
+
maxIterations: Number.POSITIVE_INFINITY,
|
|
68
|
+
})) {
|
|
69
|
+
const row = (0, rows_js_1.parseWriteRow)(item);
|
|
70
|
+
if (row === undefined) {
|
|
71
|
+
context.logger.warn('getTuple: skipped a row that is not a pending-write item', {
|
|
72
|
+
sortKey: (0, truncate_js_1.truncateForLog)(item.SK),
|
|
73
|
+
});
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
items.push(row);
|
|
77
|
+
}
|
|
78
|
+
if (items.length >= paginate_js_1.LIST_SCAN_WARN_THRESHOLD) {
|
|
79
|
+
context.logger.warn('getTuple: a checkpoint carries very many pending-write rows; the read is complete but slow', {
|
|
80
|
+
threadId: at.threadId,
|
|
81
|
+
checkpointId: at.checkpointId,
|
|
82
|
+
rows: items.length,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return (0, rows_js_1.toPendingWrites)(context, items, at.threadId, read.signal);
|
|
86
|
+
}
|
|
87
|
+
function configFor(threadId, checkpointNs, checkpointId) {
|
|
88
|
+
return {
|
|
89
|
+
configurable: { thread_id: threadId, checkpoint_ns: checkpointNs, checkpoint_id: checkpointId },
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async function assembleTuple(context, thread, meta, options) {
|
|
93
|
+
const read = { signal: options.signal, consistent: options.consistent };
|
|
94
|
+
const at = { ...thread, checkpointId: meta.checkpointId };
|
|
95
|
+
const payload = await fetchPayload(context, at, read);
|
|
96
|
+
if (!payload)
|
|
97
|
+
return undefined;
|
|
98
|
+
const [checkpoint, metadata, pendingWrites] = await Promise.all([
|
|
99
|
+
(0, rows_js_1.readCheckpoint)(context, payload, thread.threadId, options.signal).then((stored) => migratePendingSends(context, stored, { ...thread, parentCheckpointId: meta.parentCheckpointId }, read)),
|
|
100
|
+
options.metadata ?? (0, rows_js_1.readMetadata)(context, meta, thread.threadId, options.signal),
|
|
101
|
+
fetchPendingWrites(context, at, read),
|
|
102
|
+
]);
|
|
103
|
+
const tuple = {
|
|
104
|
+
config: configFor(thread.threadId, thread.checkpointNs, meta.checkpointId),
|
|
105
|
+
checkpoint,
|
|
106
|
+
metadata,
|
|
107
|
+
pendingWrites,
|
|
108
|
+
};
|
|
109
|
+
if (meta.parentCheckpointId !== undefined) {
|
|
110
|
+
tuple.parentConfig = configFor(thread.threadId, thread.checkpointNs, meta.parentCheckpointId);
|
|
111
|
+
}
|
|
112
|
+
return tuple;
|
|
113
|
+
}
|
|
114
|
+
async function migratePendingSends(context, checkpoint, parent, read) {
|
|
115
|
+
if (checkpoint.v >= 4 || parent.parentCheckpointId === undefined)
|
|
116
|
+
return checkpoint;
|
|
117
|
+
const writes = await fetchPendingWrites(context, {
|
|
118
|
+
threadId: parent.threadId,
|
|
119
|
+
checkpointNs: parent.checkpointNs,
|
|
120
|
+
checkpointId: parent.parentCheckpointId,
|
|
121
|
+
}, read);
|
|
122
|
+
const sends = writes.filter(([, channel]) => channel === langgraph_checkpoint_1.TASKS).map(([, , value]) => value);
|
|
123
|
+
const versions = Object.values(checkpoint.channel_versions);
|
|
124
|
+
return {
|
|
125
|
+
...checkpoint,
|
|
126
|
+
channel_values: { ...checkpoint.channel_values, [langgraph_checkpoint_1.TASKS]: sends },
|
|
127
|
+
channel_versions: {
|
|
128
|
+
...checkpoint.channel_versions,
|
|
129
|
+
[langgraph_checkpoint_1.TASKS]: versions.length > 0 ? (0, langgraph_checkpoint_1.maxChannelVersion)(...versions) : 1,
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import type { QueryCommandInput } from '@aws-sdk/lib-dynamodb';
|
|
15
15
|
import type { Checkpoint, CheckpointMetadata, CheckpointPendingWrite, PendingWrite, PendingWriteValue } from '@langchain/langgraph-checkpoint';
|
|
16
|
-
import { type PayloadDescriptor } from '../../shared/codec/codec';
|
|
17
|
-
import type { AttributeMap } from '../../shared/dynamodb/client';
|
|
18
|
-
import { type NamedDescriptor } from '../../shared/dynamodb/partition-delete';
|
|
19
|
-
import { type IndexTarget } from '../../shared/dynamodb/recency-index';
|
|
20
|
-
import { type RowKey } from '../../shared/dynamodb/table-schema';
|
|
21
|
-
import type { CheckpointerContext } from './setup';
|
|
16
|
+
import { type PayloadDescriptor } from '../../shared/codec/codec.js';
|
|
17
|
+
import type { AttributeMap } from '../../shared/dynamodb/client.js';
|
|
18
|
+
import { type NamedDescriptor } from '../../shared/dynamodb/partition-delete.js';
|
|
19
|
+
import { type IndexTarget } from '../../shared/dynamodb/recency-index.js';
|
|
20
|
+
import { type RowKey } from '../../shared/dynamodb/table-schema.js';
|
|
21
|
+
import type { CheckpointerContext } from './setup.js';
|
|
22
22
|
/** Where one stored checkpoint lives: from a parsed address, or from a row's own identifiers. */
|
|
23
23
|
export interface CheckpointLocation {
|
|
24
24
|
readonly threadId: string;
|
|
@@ -71,10 +71,16 @@ export interface CheckpointWriteRow {
|
|
|
71
71
|
writeGroup: string;
|
|
72
72
|
/**
|
|
73
73
|
* How many earlier writes in the same call already used this channel.
|
|
74
|
-
* Optional: rows written before 0.
|
|
74
|
+
* Optional: rows written before 0.8.0 carry none and read back as 0, which
|
|
75
75
|
* is exactly the identity they were stored under.
|
|
76
76
|
*/
|
|
77
77
|
occurrence?: number;
|
|
78
|
+
/**
|
|
79
|
+
* The serialized path of the task that made the write, which leads the
|
|
80
|
+
* order writes are read back in (see {@link compareWriteOrder}). Absent on a
|
|
81
|
+
* row a LangGraph before 1.5 wrote, which sorts as the empty path, first.
|
|
82
|
+
*/
|
|
83
|
+
taskPath?: string;
|
|
78
84
|
value: PayloadDescriptor;
|
|
79
85
|
ttl?: number;
|
|
80
86
|
}
|
|
@@ -299,6 +305,8 @@ export interface CheckpointRowsSource {
|
|
|
299
305
|
export interface WriteRowsSource {
|
|
300
306
|
readonly address: CheckpointLocation;
|
|
301
307
|
readonly taskId: string;
|
|
308
|
+
/** Stamped on every row when given; see `CheckpointWriteRow.taskPath`. */
|
|
309
|
+
readonly taskPath?: string | undefined;
|
|
302
310
|
readonly writes: PendingWrite[];
|
|
303
311
|
readonly signal: AbortSignal | undefined;
|
|
304
312
|
}
|
|
@@ -319,15 +327,17 @@ export interface WriteRowsSource {
|
|
|
319
327
|
* uploads. `ttlTimestamp` — stamped on both rows so they expire together.
|
|
320
328
|
*
|
|
321
329
|
* Returns: the META row (light: ids, metadata, index keys) and the PAYLOAD row
|
|
322
|
-
* (heavy: the checkpoint itself), which the caller writes in
|
|
323
|
-
*
|
|
330
|
+
* (heavy: the checkpoint itself), which the caller writes in one transaction,
|
|
331
|
+
* so a META row never names a payload that is not there.
|
|
324
332
|
*
|
|
325
333
|
* Throws: `VALIDATION` naming `value` for a checkpoint the serializer cannot
|
|
326
|
-
* represent
|
|
327
|
-
*
|
|
328
|
-
*
|
|
329
|
-
*
|
|
330
|
-
*
|
|
334
|
+
* represent, or `payload` for one too large to store inline without `s3`,
|
|
335
|
+
* or, once offloaded, larger than `s3.maxDownloadBytes`; `S3_OFFLOAD_FAILED`
|
|
336
|
+
* when an offloaded payload cannot be uploaded. Encoding precedes every
|
|
337
|
+
* write, so a checkpoint that cannot be stored never half-writes a thread —
|
|
338
|
+
* and a metadata payload refused after the checkpoint's own object has
|
|
339
|
+
* uploaded releases that object before the failure leaves here (see
|
|
340
|
+
* {@link releaseUploads}), so a refusal strands nothing either.
|
|
331
341
|
*/
|
|
332
342
|
export declare function buildCheckpointRows(context: CheckpointerContext, request: CheckpointRowsSource, ttlTimestamp?: number): Promise<{
|
|
333
343
|
meta: CheckpointMetaRow;
|
|
@@ -349,10 +359,12 @@ export declare function buildCheckpointRows(context: CheckpointerContext, reques
|
|
|
349
359
|
* Returns: one row per write, special channels first, each carrying its
|
|
350
360
|
* `occurrence` so a channel emitted twice by one call keeps both values.
|
|
351
361
|
*
|
|
352
|
-
* Throws: `VALIDATION` naming `value
|
|
353
|
-
*
|
|
354
|
-
*
|
|
355
|
-
*
|
|
362
|
+
* Throws: `VALIDATION` naming `value` for a write the serializer cannot
|
|
363
|
+
* represent, or `payload` for one too large to store inline without `s3`,
|
|
364
|
+
* or, once offloaded, larger than `s3.maxDownloadBytes`; `S3_OFFLOAD_FAILED`.
|
|
365
|
+
* A payload refused partway through releases the objects the earlier writes
|
|
366
|
+
* of the same call had already uploaded (see {@link releaseUploads}), so a
|
|
367
|
+
* build that throws returns the caller to where it started.
|
|
356
368
|
*/
|
|
357
369
|
export declare function buildWriteRows(context: CheckpointerContext, request: WriteRowsSource, writeGroup: string, ttlTimestamp?: number): Promise<CheckpointWriteRow[]>;
|
|
358
370
|
/**
|
|
@@ -383,11 +395,39 @@ export declare function buildWriteRows(context: CheckpointerContext, request: Wr
|
|
|
383
395
|
* for a row this release can read.
|
|
384
396
|
*/
|
|
385
397
|
export declare function parseMetaRow(raw: AttributeMap): CheckpointMetaRow | undefined;
|
|
398
|
+
/**
|
|
399
|
+
* Parse a row read under a checkpoint's `WRITE#` prefix, answering `undefined`
|
|
400
|
+
* for one this adapter did not write.
|
|
401
|
+
*
|
|
402
|
+
* The prefix is this adapter's own, so a row there that lacks the task id,
|
|
403
|
+
* the channel or the payload descriptor every write row has carried from the
|
|
404
|
+
* first release was put there by something else. Handed on as it was, such a
|
|
405
|
+
* row reached LangGraph as `[undefined, undefined, value]`; parsed here, it is
|
|
406
|
+
* left out, as a foreign META row is.
|
|
407
|
+
*
|
|
408
|
+
* Accepts: `raw` — any row the prefix query returned.
|
|
409
|
+
*
|
|
410
|
+
* Returns: the row as a {@link CheckpointWriteRow}, or `undefined` for one
|
|
411
|
+
* that is not a pending write of this adapter's. `writeGroup`, `occurrence`,
|
|
412
|
+
* `taskPath` and `index` are not required: a row written before they existed
|
|
413
|
+
* carries none, and {@link dropSupersededWrites} and {@link compareWriteOrder}
|
|
414
|
+
* read their absence as the identity and the order it has; a `taskPath` that
|
|
415
|
+
* is present but not a string is not this adapter's.
|
|
416
|
+
*
|
|
417
|
+
* Throws: `FORMAT_UNSUPPORTED` for a row a newer release wrote, checked
|
|
418
|
+
* first, so a newer row is refused rather than judged against attribute
|
|
419
|
+
* names it may no longer use.
|
|
420
|
+
*/
|
|
421
|
+
export declare function parseWriteRow(raw: AttributeMap): CheckpointWriteRow | undefined;
|
|
422
|
+
/** The public method a META read serves, named in the line a foreign row is reported on. */
|
|
423
|
+
export type MetaReader = 'getTuple' | 'list';
|
|
386
424
|
/**
|
|
387
425
|
* Narrow a candidate head row, saying so when it is not one of ours.
|
|
388
426
|
*
|
|
389
427
|
* Accepts: `raw` — the row a newest-first read returned, or undefined when it
|
|
390
|
-
* returned none.
|
|
428
|
+
* returned none. `reader` — the public method the read serves, which the
|
|
429
|
+
* line below names: a `list` that addresses one checkpoint reads it the way
|
|
430
|
+
* `getTuple` does, and an operator alerting on the message reads the name.
|
|
391
431
|
*
|
|
392
432
|
* Returns: the item, or undefined for an absent or foreign row — logged at
|
|
393
433
|
* `warn` in the second case, because a foreign row at the head of a thread is
|
|
@@ -399,7 +439,7 @@ export declare function parseMetaRow(raw: AttributeMap): CheckpointMetaRow | und
|
|
|
399
439
|
* `assembleTuple` miss its payload and report the thread as empty, so LangGraph
|
|
400
440
|
* started a new run on top of the real history.
|
|
401
441
|
*/
|
|
402
|
-
export declare function parseHeadRow(context: CheckpointerContext, raw: AttributeMap | undefined): CheckpointMetaRow | undefined;
|
|
442
|
+
export declare function parseHeadRow(context: CheckpointerContext, raw: AttributeMap | undefined, reader: MetaReader): CheckpointMetaRow | undefined;
|
|
403
443
|
/**
|
|
404
444
|
* Decode the checkpoint stored in a PAYLOAD item.
|
|
405
445
|
*
|
|
@@ -427,6 +467,38 @@ export declare function readCheckpoint(context: CheckpointerContext, item: Check
|
|
|
427
467
|
* Throws: as {@link readCheckpoint}.
|
|
428
468
|
*/
|
|
429
469
|
export declare function readMetadata(context: CheckpointerContext, item: CheckpointMetaRow, threadId: string, signal?: AbortSignal): Promise<CheckpointMetadata>;
|
|
470
|
+
/**
|
|
471
|
+
* Compare two strings by Unicode code point — Python's `str` order, and the
|
|
472
|
+
* order the reference's `compareWritesSortKeys` uses — rather than by UTF-16
|
|
473
|
+
* code unit, which puts an astral character (a surrogate pair, `0xD800`
|
|
474
|
+
* upward) before every BMP code point above it. An unpaired surrogate
|
|
475
|
+
* compares as its own value, as the reference compares it.
|
|
476
|
+
*
|
|
477
|
+
* Accepts: any two strings.
|
|
478
|
+
*
|
|
479
|
+
* Returns: negative, zero or positive, as a sort comparator; a string that is
|
|
480
|
+
* a prefix of the other sorts first.
|
|
481
|
+
*
|
|
482
|
+
* Throws: nothing.
|
|
483
|
+
*/
|
|
484
|
+
export declare function compareByCodePoint(a: string, b: string): number;
|
|
485
|
+
/**
|
|
486
|
+
* The order a checkpoint's writes are read back in: the reference's
|
|
487
|
+
* `writesSortKey` (`@langchain/langgraph-checkpoint@1.2.0`) — task path, then
|
|
488
|
+
* task id, both by code point, then index numerically, so a special channel's
|
|
489
|
+
* negative index leads its task's regular writes — with the channel as a last
|
|
490
|
+
* tie-break the reference never needs, since two channels at one index of one
|
|
491
|
+
* task are two rows here and one map slot there. A row with no path, written
|
|
492
|
+
* by a LangGraph before 1.5, sorts as the empty path, first, as the
|
|
493
|
+
* reference's own pre-path records do.
|
|
494
|
+
*
|
|
495
|
+
* Accepts: two WRITE rows of one checkpoint.
|
|
496
|
+
*
|
|
497
|
+
* Returns: negative, zero or positive, as a sort comparator.
|
|
498
|
+
*
|
|
499
|
+
* Throws: nothing.
|
|
500
|
+
*/
|
|
501
|
+
export declare function compareWriteOrder(a: CheckpointWriteRow, b: CheckpointWriteRow): number;
|
|
430
502
|
/**
|
|
431
503
|
* Decode WRITE items into `[taskId, channel, value]` pending-write tuples.
|
|
432
504
|
*
|
|
@@ -435,7 +507,8 @@ export declare function readMetadata(context: CheckpointerContext, item: Checkpo
|
|
|
435
507
|
* the downloads, all of which share it.
|
|
436
508
|
*
|
|
437
509
|
* Returns: the writes LangGraph replays, first-write-wins already resolved by
|
|
438
|
-
* `dropSupersededWrites`, in the order the
|
|
510
|
+
* `dropSupersededWrites`, in the order the reference reads them back —
|
|
511
|
+
* {@link compareWriteOrder} — whatever order the rows arrived in.
|
|
439
512
|
*
|
|
440
513
|
* Throws: whatever a decode throws — the first one, with the rest allowed to
|
|
441
514
|
* settle.
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MIN_ENCODABLE_WRITE_INDEX = exports.WRITE_GROUP_ATTRIBUTE = void 0;
|
|
4
|
+
exports.checkpointerPartitionPrefix = checkpointerPartitionPrefix;
|
|
5
|
+
exports.partitionKey = partitionKey;
|
|
6
|
+
exports.metaSortKey = metaSortKey;
|
|
7
|
+
exports.metaSortKeyPrefix = metaSortKeyPrefix;
|
|
8
|
+
exports.metaAnyNamespacePrefix = metaAnyNamespacePrefix;
|
|
9
|
+
exports.payloadSortKey = payloadSortKey;
|
|
10
|
+
exports.writeSortKey = writeSortKey;
|
|
11
|
+
exports.writeSortKeyBytes = writeSortKeyBytes;
|
|
12
|
+
exports.isCheckpointerSortKey = isCheckpointerSortKey;
|
|
13
|
+
exports.writeSortKeyPrefix = writeSortKeyPrefix;
|
|
14
|
+
exports.metaRowKey = metaRowKey;
|
|
15
|
+
exports.payloadRowKey = payloadRowKey;
|
|
16
|
+
exports.partitionQuery = partitionQuery;
|
|
17
|
+
exports.beginsWithQuery = beginsWithQuery;
|
|
18
|
+
exports.buildCheckpointRows = buildCheckpointRows;
|
|
19
|
+
exports.buildWriteRows = buildWriteRows;
|
|
20
|
+
exports.parseMetaRow = parseMetaRow;
|
|
21
|
+
exports.parseWriteRow = parseWriteRow;
|
|
22
|
+
exports.parseHeadRow = parseHeadRow;
|
|
23
|
+
exports.readCheckpoint = readCheckpoint;
|
|
24
|
+
exports.readMetadata = readMetadata;
|
|
25
|
+
exports.compareByCodePoint = compareByCodePoint;
|
|
26
|
+
exports.compareWriteOrder = compareWriteOrder;
|
|
27
|
+
exports.toPendingWrites = toPendingWrites;
|
|
28
|
+
exports.resolveWriteIndices = resolveWriteIndices;
|
|
29
|
+
exports.dropSupersededWrites = dropSupersededWrites;
|
|
30
|
+
exports.checkpointRowDescriptors = checkpointRowDescriptors;
|
|
31
|
+
exports.checkpointRowUnit = checkpointRowUnit;
|
|
32
|
+
exports.checkpointRowKind = checkpointRowKind;
|
|
33
|
+
exports.checkpointIndexTarget = checkpointIndexTarget;
|
|
34
|
+
const langgraph_checkpoint_1 = require("@langchain/langgraph-checkpoint");
|
|
35
|
+
const clock_js_1 = require("../../shared/clock.js");
|
|
36
|
+
const codec_js_1 = require("../../shared/codec/codec.js");
|
|
37
|
+
const offloader_js_1 = require("../../shared/codec/s3/offloader.js");
|
|
38
|
+
const concurrency_js_1 = require("../../shared/concurrency.js");
|
|
39
|
+
const partition_delete_js_1 = require("../../shared/dynamodb/partition-delete.js");
|
|
40
|
+
const recency_index_js_1 = require("../../shared/dynamodb/recency-index.js");
|
|
41
|
+
const table_schema_js_1 = require("../../shared/dynamodb/table-schema.js");
|
|
42
|
+
const errors_js_1 = require("../../shared/errors/errors.js");
|
|
43
|
+
const truncate_js_1 = require("../../shared/logging/truncate.js");
|
|
44
|
+
const ulid_js_1 = require("../../shared/ulid.js");
|
|
45
|
+
exports.WRITE_GROUP_ATTRIBUTE = 'writeGroup';
|
|
46
|
+
const WRITE_INDEX_PAD_WIDTH = 10;
|
|
47
|
+
const WRITE_INDEX_OFFSET = 8;
|
|
48
|
+
exports.MIN_ENCODABLE_WRITE_INDEX = -WRITE_INDEX_OFFSET;
|
|
49
|
+
var CheckpointRowKind;
|
|
50
|
+
(function (CheckpointRowKind) {
|
|
51
|
+
CheckpointRowKind["META"] = "META";
|
|
52
|
+
CheckpointRowKind["PAYLOAD"] = "PAYLOAD";
|
|
53
|
+
CheckpointRowKind["WRITE"] = "WRITE";
|
|
54
|
+
})(CheckpointRowKind || (CheckpointRowKind = {}));
|
|
55
|
+
const ADAPTER_PARTITION_PREFIX = `${table_schema_js_1.ADAPTER_TAGS.checkpointer}${table_schema_js_1.KEY_SEPARATOR}`;
|
|
56
|
+
function checkpointerPartitionPrefix() {
|
|
57
|
+
return ADAPTER_PARTITION_PREFIX;
|
|
58
|
+
}
|
|
59
|
+
function partitionKey(threadId) {
|
|
60
|
+
return `${ADAPTER_PARTITION_PREFIX}${threadId}`;
|
|
61
|
+
}
|
|
62
|
+
function metaSortKey(checkpointNs, checkpointId) {
|
|
63
|
+
return `${CheckpointRowKind.META}${table_schema_js_1.KEY_SEPARATOR}${checkpointNs}${table_schema_js_1.KEY_SEPARATOR}${checkpointId}`;
|
|
64
|
+
}
|
|
65
|
+
function metaSortKeyPrefix(checkpointNs) {
|
|
66
|
+
return `${CheckpointRowKind.META}${table_schema_js_1.KEY_SEPARATOR}${checkpointNs}${table_schema_js_1.KEY_SEPARATOR}`;
|
|
67
|
+
}
|
|
68
|
+
function metaAnyNamespacePrefix() {
|
|
69
|
+
return `${CheckpointRowKind.META}${table_schema_js_1.KEY_SEPARATOR}`;
|
|
70
|
+
}
|
|
71
|
+
function payloadSortKey(checkpointNs, checkpointId) {
|
|
72
|
+
return `${CheckpointRowKind.PAYLOAD}${table_schema_js_1.KEY_SEPARATOR}${checkpointNs}${table_schema_js_1.KEY_SEPARATOR}${checkpointId}`;
|
|
73
|
+
}
|
|
74
|
+
function writeSortKey(at) {
|
|
75
|
+
const offsetIndex = at.index + WRITE_INDEX_OFFSET;
|
|
76
|
+
if (!Number.isInteger(offsetIndex) ||
|
|
77
|
+
offsetIndex < 0 ||
|
|
78
|
+
offsetIndex.toString().length > WRITE_INDEX_PAD_WIDTH) {
|
|
79
|
+
throw (0, errors_js_1.validationError)(`write index ${at.index} is not an integer encodable at offset ${WRITE_INDEX_OFFSET} ` +
|
|
80
|
+
`with ${WRITE_INDEX_PAD_WIDTH} digits`, 'index');
|
|
81
|
+
}
|
|
82
|
+
const paddedIndex = offsetIndex.toString().padStart(WRITE_INDEX_PAD_WIDTH, '0');
|
|
83
|
+
return [
|
|
84
|
+
CheckpointRowKind.WRITE,
|
|
85
|
+
at.checkpointNs,
|
|
86
|
+
at.checkpointId,
|
|
87
|
+
at.taskId,
|
|
88
|
+
paddedIndex,
|
|
89
|
+
at.channel,
|
|
90
|
+
].join(table_schema_js_1.KEY_SEPARATOR);
|
|
91
|
+
}
|
|
92
|
+
function writeSortKeyBytes(at) {
|
|
93
|
+
return Buffer.byteLength(writeSortKey({ ...at, index: 0 }), 'utf8');
|
|
94
|
+
}
|
|
95
|
+
function isCheckpointerSortKey(sortKey) {
|
|
96
|
+
return Object.values(CheckpointRowKind).some((kind) => sortKey.startsWith(`${kind}${table_schema_js_1.KEY_SEPARATOR}`));
|
|
97
|
+
}
|
|
98
|
+
function writeSortKeyPrefix(checkpointNs, checkpointId) {
|
|
99
|
+
return `${CheckpointRowKind.WRITE}${table_schema_js_1.KEY_SEPARATOR}${checkpointNs}${table_schema_js_1.KEY_SEPARATOR}${checkpointId}${table_schema_js_1.KEY_SEPARATOR}`;
|
|
100
|
+
}
|
|
101
|
+
function metaRowKey(at) {
|
|
102
|
+
return { PK: partitionKey(at.threadId), SK: metaSortKey(at.checkpointNs, at.checkpointId) };
|
|
103
|
+
}
|
|
104
|
+
function payloadRowKey(at) {
|
|
105
|
+
return { PK: partitionKey(at.threadId), SK: payloadSortKey(at.checkpointNs, at.checkpointId) };
|
|
106
|
+
}
|
|
107
|
+
function partitionQuery(tableName, partition, options = {}) {
|
|
108
|
+
const params = {
|
|
109
|
+
TableName: tableName,
|
|
110
|
+
KeyConditionExpression: '#pk = :pk',
|
|
111
|
+
ExpressionAttributeNames: { '#pk': table_schema_js_1.PARTITION_KEY_ATTRIBUTE },
|
|
112
|
+
ExpressionAttributeValues: { ':pk': partition },
|
|
113
|
+
};
|
|
114
|
+
if (options.consistent)
|
|
115
|
+
params.ConsistentRead = true;
|
|
116
|
+
return params;
|
|
117
|
+
}
|
|
118
|
+
function beginsWithQuery(tableName, partition, skPrefix, options = {}) {
|
|
119
|
+
const bounded = options.beforeSortKey !== undefined;
|
|
120
|
+
const params = {
|
|
121
|
+
TableName: tableName,
|
|
122
|
+
KeyConditionExpression: bounded
|
|
123
|
+
? '#pk = :pk AND #sk BETWEEN :skPrefix AND :before'
|
|
124
|
+
: '#pk = :pk AND begins_with(#sk, :skPrefix)',
|
|
125
|
+
ExpressionAttributeNames: { '#pk': table_schema_js_1.PARTITION_KEY_ATTRIBUTE, '#sk': table_schema_js_1.SORT_KEY_ATTRIBUTE },
|
|
126
|
+
ExpressionAttributeValues: {
|
|
127
|
+
':pk': partition,
|
|
128
|
+
':skPrefix': skPrefix,
|
|
129
|
+
...(bounded ? { ':before': options.beforeSortKey } : {}),
|
|
130
|
+
},
|
|
131
|
+
ScanIndexForward: options.ascending ?? false,
|
|
132
|
+
};
|
|
133
|
+
if (options.limit !== undefined && options.limit >= 1)
|
|
134
|
+
params.Limit = options.limit;
|
|
135
|
+
if (options.consistent)
|
|
136
|
+
params.ConsistentRead = true;
|
|
137
|
+
return params;
|
|
138
|
+
}
|
|
139
|
+
function withTtl(item, ttlTimestamp) {
|
|
140
|
+
if (ttlTimestamp !== undefined)
|
|
141
|
+
item.ttl = ttlTimestamp;
|
|
142
|
+
return item;
|
|
143
|
+
}
|
|
144
|
+
async function releaseUploads(context, uploaded, operation) {
|
|
145
|
+
if (!context.offloader)
|
|
146
|
+
return;
|
|
147
|
+
await (0, offloader_js_1.cleanUpS3Orphans)(context.offloader, {
|
|
148
|
+
keys: (0, codec_js_1.collectS3Keys)(uploaded),
|
|
149
|
+
operation,
|
|
150
|
+
logger: context.logger,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
const nextPutObjectId = (0, ulid_js_1.createUlidFactory)();
|
|
154
|
+
async function buildCheckpointRows(context, request, ttlTimestamp) {
|
|
155
|
+
const { threadId, checkpointNs, checkpointId } = request.address;
|
|
156
|
+
const deps = (0, codec_js_1.codecDepsOf)(context, request.signal);
|
|
157
|
+
const pk = partitionKey(threadId);
|
|
158
|
+
const objectId = nextPutObjectId();
|
|
159
|
+
const checkpointDescriptor = await (0, codec_js_1.encodePayload)(request.checkpoint, deps, {
|
|
160
|
+
keyParts: [threadId, checkpointNs, checkpointId, 'checkpoint'],
|
|
161
|
+
objectId,
|
|
162
|
+
row: { pk, sk: payloadSortKey(checkpointNs, checkpointId) },
|
|
163
|
+
});
|
|
164
|
+
let metadataDescriptor;
|
|
165
|
+
try {
|
|
166
|
+
metadataDescriptor = await (0, codec_js_1.encodePayload)(request.metadata, deps, {
|
|
167
|
+
keyParts: [threadId, checkpointNs, checkpointId, 'metadata'],
|
|
168
|
+
objectId,
|
|
169
|
+
row: { pk, sk: metaSortKey(checkpointNs, checkpointId) },
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
await releaseUploads(context, [checkpointDescriptor], 'put.encode');
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
const index = (0, recency_index_js_1.indexKeys)('CHKPT', checkpointId, (0, clock_js_1.nowIso)(), context.indexShards ?? recency_index_js_1.DEFAULT_INDEX_SHARDS);
|
|
177
|
+
const meta = {
|
|
178
|
+
PK: pk,
|
|
179
|
+
SK: metaSortKey(checkpointNs, checkpointId),
|
|
180
|
+
v: table_schema_js_1.ROW_FORMAT_VERSION,
|
|
181
|
+
...index,
|
|
182
|
+
threadId,
|
|
183
|
+
checkpointNs,
|
|
184
|
+
checkpointId,
|
|
185
|
+
metadata: metadataDescriptor,
|
|
186
|
+
};
|
|
187
|
+
if (request.parentCheckpointId !== undefined)
|
|
188
|
+
meta.parentCheckpointId = request.parentCheckpointId;
|
|
189
|
+
const payload = {
|
|
190
|
+
PK: pk,
|
|
191
|
+
SK: payloadSortKey(checkpointNs, checkpointId),
|
|
192
|
+
v: table_schema_js_1.ROW_FORMAT_VERSION,
|
|
193
|
+
checkpoint: checkpointDescriptor,
|
|
194
|
+
};
|
|
195
|
+
return { meta: withTtl(meta, ttlTimestamp), payload: withTtl(payload, ttlTimestamp) };
|
|
196
|
+
}
|
|
197
|
+
async function buildWriteRows(context, request, writeGroup, ttlTimestamp) {
|
|
198
|
+
const { threadId, checkpointNs, checkpointId } = request.address;
|
|
199
|
+
const { taskId, taskPath } = request;
|
|
200
|
+
const deps = (0, codec_js_1.codecDepsOf)(context, request.signal);
|
|
201
|
+
const pk = partitionKey(threadId);
|
|
202
|
+
const items = [];
|
|
203
|
+
try {
|
|
204
|
+
for (const { channel, value, index, occurrence } of resolveWriteIndices(request.writes)) {
|
|
205
|
+
const sk = writeSortKey({ checkpointNs, checkpointId, taskId, index, channel });
|
|
206
|
+
const descriptor = await (0, codec_js_1.encodePayload)(value, deps, {
|
|
207
|
+
keyParts: [threadId, checkpointNs, checkpointId, taskId, `write-${index}`, channel],
|
|
208
|
+
objectId: writeGroup,
|
|
209
|
+
row: { pk, sk },
|
|
210
|
+
});
|
|
211
|
+
const item = {
|
|
212
|
+
PK: pk,
|
|
213
|
+
SK: sk,
|
|
214
|
+
v: table_schema_js_1.ROW_FORMAT_VERSION,
|
|
215
|
+
taskId,
|
|
216
|
+
index,
|
|
217
|
+
channel,
|
|
218
|
+
...(taskPath === undefined ? {} : { taskPath }),
|
|
219
|
+
writeGroup,
|
|
220
|
+
occurrence,
|
|
221
|
+
value: descriptor,
|
|
222
|
+
};
|
|
223
|
+
items.push(withTtl(item, ttlTimestamp));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
await releaseUploads(context, items.map((item) => item.value), 'putWrites.encode');
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
return items;
|
|
231
|
+
}
|
|
232
|
+
function parseMetaRow(raw) {
|
|
233
|
+
(0, table_schema_js_1.assertReadableRow)(raw, 'checkpoint');
|
|
234
|
+
const isCheckpoint = typeof raw.threadId === 'string' &&
|
|
235
|
+
typeof raw.checkpointId === 'string' &&
|
|
236
|
+
typeof raw.checkpointNs === 'string' &&
|
|
237
|
+
typeof raw.metadata === 'object' &&
|
|
238
|
+
raw.metadata !== null;
|
|
239
|
+
if (!isCheckpoint)
|
|
240
|
+
return undefined;
|
|
241
|
+
const item = raw;
|
|
242
|
+
const consistent = item.PK === partitionKey(item.threadId) &&
|
|
243
|
+
item.SK === metaSortKey(item.checkpointNs, item.checkpointId);
|
|
244
|
+
return consistent ? item : undefined;
|
|
245
|
+
}
|
|
246
|
+
function parseWriteRow(raw) {
|
|
247
|
+
(0, table_schema_js_1.assertReadableRow)(raw, 'pending write');
|
|
248
|
+
const isWrite = typeof raw.taskId === 'string' &&
|
|
249
|
+
typeof raw.channel === 'string' &&
|
|
250
|
+
(raw.taskPath === undefined || typeof raw.taskPath === 'string') &&
|
|
251
|
+
typeof raw.value === 'object' &&
|
|
252
|
+
raw.value !== null;
|
|
253
|
+
return isWrite ? raw : undefined;
|
|
254
|
+
}
|
|
255
|
+
function parseHeadRow(context, raw, reader) {
|
|
256
|
+
if (raw === undefined)
|
|
257
|
+
return undefined;
|
|
258
|
+
const meta = parseMetaRow(raw);
|
|
259
|
+
if (!meta) {
|
|
260
|
+
context.logger.warn(`${reader}: skipped a row that is not a checkpoint meta item`, {
|
|
261
|
+
sortKey: (0, truncate_js_1.truncateForLog)(raw.SK),
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return meta;
|
|
265
|
+
}
|
|
266
|
+
async function readCheckpoint(context, item, threadId, signal) {
|
|
267
|
+
return (0, codec_js_1.decodePayload)(item.checkpoint, (0, codec_js_1.codecDepsOf)(context, signal), [threadId]);
|
|
268
|
+
}
|
|
269
|
+
async function readMetadata(context, item, threadId, signal) {
|
|
270
|
+
return (0, codec_js_1.decodePayload)(item.metadata, (0, codec_js_1.codecDepsOf)(context, signal), [threadId]);
|
|
271
|
+
}
|
|
272
|
+
function compareByCodePoint(a, b) {
|
|
273
|
+
let i = 0;
|
|
274
|
+
let j = 0;
|
|
275
|
+
while (i < a.length && j < b.length) {
|
|
276
|
+
const left = a.codePointAt(i);
|
|
277
|
+
const right = b.codePointAt(j);
|
|
278
|
+
if (left !== right)
|
|
279
|
+
return left < right ? -1 : 1;
|
|
280
|
+
i += left > 0xffff ? 2 : 1;
|
|
281
|
+
j += right > 0xffff ? 2 : 1;
|
|
282
|
+
}
|
|
283
|
+
if (i >= a.length && j >= b.length)
|
|
284
|
+
return 0;
|
|
285
|
+
return i >= a.length ? -1 : 1;
|
|
286
|
+
}
|
|
287
|
+
function compareWriteOrder(a, b) {
|
|
288
|
+
return (compareByCodePoint(a.taskPath ?? '', b.taskPath ?? '') ||
|
|
289
|
+
compareByCodePoint(a.taskId, b.taskId) ||
|
|
290
|
+
a.index - b.index ||
|
|
291
|
+
compareByCodePoint(a.channel, b.channel));
|
|
292
|
+
}
|
|
293
|
+
async function toPendingWrites(context, items, threadId, signal) {
|
|
294
|
+
const deps = (0, codec_js_1.codecDepsOf)(context, signal);
|
|
295
|
+
const live = [...dropSupersededWrites(items)].sort(compareWriteOrder);
|
|
296
|
+
const values = await (0, concurrency_js_1.mapWithConcurrency)(live, context.readConcurrency ?? concurrency_js_1.DEFAULT_READ_CONCURRENCY, (item) => (0, codec_js_1.decodePayload)(item.value, deps, [threadId]));
|
|
297
|
+
return live.map((item, index) => [
|
|
298
|
+
item.taskId,
|
|
299
|
+
item.channel,
|
|
300
|
+
values[index],
|
|
301
|
+
]);
|
|
302
|
+
}
|
|
303
|
+
function resolveWriteIndices(writes) {
|
|
304
|
+
const bySpecialIndex = new Map();
|
|
305
|
+
const regular = [];
|
|
306
|
+
const occurrences = new Map();
|
|
307
|
+
writes.forEach(([channel, value], positional) => {
|
|
308
|
+
if (Object.hasOwn(langgraph_checkpoint_1.WRITES_IDX_MAP, channel)) {
|
|
309
|
+
const index = langgraph_checkpoint_1.WRITES_IDX_MAP[channel];
|
|
310
|
+
bySpecialIndex.set(index, { channel, value, index, occurrence: 0 });
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
const occurrence = occurrences.get(channel) ?? 0;
|
|
314
|
+
occurrences.set(channel, occurrence + 1);
|
|
315
|
+
regular.push({ channel, value, index: positional, occurrence });
|
|
316
|
+
});
|
|
317
|
+
return [...bySpecialIndex.values(), ...regular];
|
|
318
|
+
}
|
|
319
|
+
function dropSupersededWrites(items) {
|
|
320
|
+
const identity = (item) => JSON.stringify([item.taskId, item.channel, item.occurrence ?? 0]);
|
|
321
|
+
const groupOf = (item) => item.writeGroup ?? '';
|
|
322
|
+
const earliestGroup = new Map();
|
|
323
|
+
for (const item of items) {
|
|
324
|
+
const id = identity(item);
|
|
325
|
+
const seen = earliestGroup.get(id);
|
|
326
|
+
const group = groupOf(item);
|
|
327
|
+
if (seen === undefined || group < seen)
|
|
328
|
+
earliestGroup.set(id, group);
|
|
329
|
+
}
|
|
330
|
+
return items.filter((item) => earliestGroup.get(identity(item)) === groupOf(item));
|
|
331
|
+
}
|
|
332
|
+
const PAYLOAD_ATTRIBUTES = ['metadata', 'checkpoint', 'value'];
|
|
333
|
+
function checkpointRowDescriptors(row) {
|
|
334
|
+
const named = [];
|
|
335
|
+
for (const attribute of PAYLOAD_ATTRIBUTES) {
|
|
336
|
+
const entry = (0, partition_delete_js_1.namedDescriptor)(row, attribute);
|
|
337
|
+
if (entry !== undefined)
|
|
338
|
+
named.push(entry);
|
|
339
|
+
}
|
|
340
|
+
return named;
|
|
341
|
+
}
|
|
342
|
+
function checkpointRowUnit(row) {
|
|
343
|
+
return row.SK.split(table_schema_js_1.KEY_SEPARATOR).slice(1, 3).join(table_schema_js_1.KEY_SEPARATOR);
|
|
344
|
+
}
|
|
345
|
+
function checkpointRowKind(row) {
|
|
346
|
+
return row.SK.split(table_schema_js_1.KEY_SEPARATOR)[0];
|
|
347
|
+
}
|
|
348
|
+
function checkpointIndexTarget(row) {
|
|
349
|
+
const pk = typeof row.PK === 'string' ? row.PK : '';
|
|
350
|
+
const sk = typeof row.SK === 'string' ? row.SK : '';
|
|
351
|
+
if (!pk.startsWith(ADAPTER_PARTITION_PREFIX))
|
|
352
|
+
return undefined;
|
|
353
|
+
return sk.startsWith(metaAnyNamespacePrefix()) && typeof row.checkpointId === 'string'
|
|
354
|
+
? { tag: 'CHKPT', id: row.checkpointId, at: recency_index_js_1.BACKFILLED_AT }
|
|
355
|
+
: undefined;
|
|
356
|
+
}
|