@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
|
@@ -4,14 +4,15 @@
|
|
|
4
4
|
* A delta channel stores a full value only every `snapshotFrequency` updates,
|
|
5
5
|
* so its value at a checkpoint is its last snapshot plus the writes since,
|
|
6
6
|
* collected by walking parent pointers. The walk, the order the writes are
|
|
7
|
-
* collected in, and
|
|
8
|
-
* report
|
|
9
|
-
*
|
|
7
|
+
* collected in, and what a pointer the walk cannot follow means — a hole to
|
|
8
|
+
* report, whether its row is still stored past its ttl or already swept, and
|
|
9
|
+
* never the history's true start, which is a checkpoint with no pointer at all
|
|
10
|
+
* — are decided here.
|
|
10
11
|
*/
|
|
11
12
|
import type { RunnableConfig } from '@langchain/core/runnables';
|
|
12
13
|
import type { CheckpointTuple, DeltaChannelHistory } from '@langchain/langgraph-checkpoint';
|
|
13
|
-
import { DynamoDBLangGraphError } from '../../shared/errors/base-error';
|
|
14
|
-
import type { CheckpointerContext } from './setup';
|
|
14
|
+
import { DynamoDBLangGraphError } from '../../shared/errors/base-error.js';
|
|
15
|
+
import type { CheckpointerContext } from './setup.js';
|
|
15
16
|
/**
|
|
16
17
|
* Walk a checkpoint's ancestors for the delta channels named, accumulating
|
|
17
18
|
* their writes oldest-first and the nearest stored value of each.
|
|
@@ -37,33 +38,43 @@ import type { CheckpointerContext } from './setup';
|
|
|
37
38
|
* consumer's cue to start from its initial value — correctly, because there is
|
|
38
39
|
* nothing to lose.
|
|
39
40
|
*
|
|
40
|
-
* Throws: `ANCESTOR_EXPIRED` when
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
41
|
+
* Throws: `ANCESTOR_EXPIRED` when a channel still needs an ancestor the walk
|
|
42
|
+
* cannot read — its row stored but past its ttl, or already removed by the
|
|
43
|
+
* sweep — or when the chain points back to a checkpoint already read
|
|
44
|
+
* ({@link ancestorExpired}). A checkpoint with no parent pointer ends the walk
|
|
45
|
+
* quietly — that is a thread's true start. `ABORTED` when the signal fires,
|
|
46
|
+
* at whichever hop it fires on, and in preference to a diagnosis of the stop:
|
|
47
|
+
* a walk cancelled just as it reached an expired ancestor reports the cancel,
|
|
48
|
+
* since the caller stopped waiting for the answer either way.
|
|
46
49
|
*
|
|
47
50
|
* Guarantees: the walk stops at the first ancestor that answers for every
|
|
48
51
|
* channel, so a deep thread costs reads only as far back as the nearest
|
|
49
52
|
* snapshot.
|
|
50
53
|
*/
|
|
51
54
|
export declare function deltaChannelHistory(context: CheckpointerContext, getTuple: (config: RunnableConfig) => Promise<CheckpointTuple | undefined>, config: RunnableConfig, channels: string[]): Promise<Record<string, DeltaChannelHistory>>;
|
|
52
|
-
/** Where an ancestor walk stopped, and
|
|
55
|
+
/** Where an ancestor walk stopped, and what kind of hole in the thread it found there. */
|
|
53
56
|
export interface WalkStop {
|
|
54
57
|
threadId: string;
|
|
55
58
|
checkpointId: string;
|
|
56
|
-
/**
|
|
57
|
-
|
|
59
|
+
/**
|
|
60
|
+
* `'expired'` — the row is still stored, past its `ttl`; `'gone'` — no row at
|
|
61
|
+
* all, the sweep having removed it (or something else having deleted it);
|
|
62
|
+
* `'revisited'` — the chain pointed back to a checkpoint already read.
|
|
63
|
+
*/
|
|
64
|
+
stop: 'expired' | 'gone' | 'revisited';
|
|
58
65
|
}
|
|
59
66
|
/**
|
|
60
67
|
* Read the META row an ancestor walk could not follow, **ignoring expiry**, to
|
|
61
|
-
* tell "this checkpoint
|
|
62
|
-
*
|
|
68
|
+
* tell "this checkpoint is still stored but has expired" apart from "it is
|
|
69
|
+
* gone" — the sweep has removed it, which every expired row becomes within
|
|
70
|
+
* days. Both are holes; the read decides only what the error says.
|
|
63
71
|
*
|
|
64
|
-
* Every other read in this package
|
|
65
|
-
*
|
|
66
|
-
*
|
|
72
|
+
* Every other read in this package hides an expired row, which is the right
|
|
73
|
+
* rule for a reader asking for state: checkpoint META, store and history rows
|
|
74
|
+
* by their own ttl, and a checkpoint's PAYLOAD and pending-WRITE rows by their
|
|
75
|
+
* checkpoint's META row, which is the only one checked (a pre-v4 checkpoint's
|
|
76
|
+
* migration is the exception: it reads its parent's pending writes under the
|
|
77
|
+
* child's META row). Here the row is wanted expired or not.
|
|
67
78
|
*
|
|
68
79
|
* Accepts: `config` — the parent pointer a walk stopped at. `config.signal` —
|
|
69
80
|
* cancels the read, and is read before it is sent. The walk re-attaches the
|
|
@@ -71,7 +82,7 @@ export interface WalkStop {
|
|
|
71
82
|
* place every other reader in this package takes it, rather than from a
|
|
72
83
|
* parameter of its own.
|
|
73
84
|
*
|
|
74
|
-
* Returns: whether that checkpoint
|
|
85
|
+
* Returns: whether that checkpoint is still stored and expired, or gone, or
|
|
75
86
|
* `undefined` when the config names no thread or no checkpoint — such a pointer
|
|
76
87
|
* addresses nothing that could have expired, so the walk has simply run out of
|
|
77
88
|
* chain.
|
|
@@ -82,17 +93,18 @@ export interface WalkStop {
|
|
|
82
93
|
* longer waiting to be told why the walk ended.
|
|
83
94
|
*
|
|
84
95
|
* Guarantees: the read ignores the ttl, deliberately. Every other read in this
|
|
85
|
-
* package
|
|
86
|
-
*
|
|
87
|
-
*
|
|
96
|
+
* package hides an expired row by the rule above — META, store and history rows
|
|
97
|
+
* by their own ttl, PAYLOAD and WRITE rows by their checkpoint's META row, with
|
|
98
|
+
* the pre-v4 migration the exception — which is right for a reader asking for
|
|
99
|
+
* state; here an expired row is the evidence the error names.
|
|
88
100
|
*/
|
|
89
101
|
export declare function probeAncestor(context: CheckpointerContext, config: RunnableConfig): Promise<WalkStop | undefined>;
|
|
90
102
|
/**
|
|
91
103
|
* The error a read raises when a delta channel's history has a hole in it.
|
|
92
104
|
*
|
|
93
|
-
* Accepts: `stop` — the
|
|
94
|
-
* delta channels that still needed it, named in the message so the
|
|
95
|
-
* knows what was lost.
|
|
105
|
+
* Accepts: `stop` — the ancestor the walk could not follow, and why. `channels`
|
|
106
|
+
* — the delta channels that still needed it, named in the message so the
|
|
107
|
+
* operator knows what was lost.
|
|
96
108
|
*
|
|
97
109
|
* Returns: the error, coded `ANCESTOR_EXPIRED` and carrying the thread and
|
|
98
110
|
* checkpoint. The message bounds all three: after the first hop the walk's
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deltaChannelHistory = deltaChannelHistory;
|
|
4
|
+
exports.probeAncestor = probeAncestor;
|
|
5
|
+
exports.ancestorExpired = ancestorExpired;
|
|
6
|
+
const clock_js_1 = require("../../shared/clock.js");
|
|
7
|
+
const retry_js_1 = require("../../shared/dynamodb/retry.js");
|
|
8
|
+
const table_schema_js_1 = require("../../shared/dynamodb/table-schema.js");
|
|
9
|
+
const base_error_js_1 = require("../../shared/errors/base-error.js");
|
|
10
|
+
const error_code_js_1 = require("../../shared/errors/error-code.js");
|
|
11
|
+
const truncate_js_1 = require("../../shared/logging/truncate.js");
|
|
12
|
+
const rows_js_1 = require("./rows.js");
|
|
13
|
+
function startWalk(channels) {
|
|
14
|
+
const writes = {};
|
|
15
|
+
for (const channel of channels)
|
|
16
|
+
writes[channel] = [];
|
|
17
|
+
return { remaining: new Set(channels), writes, seeds: {}, visited: new Set() };
|
|
18
|
+
}
|
|
19
|
+
function collectWrites(tuple, walk) {
|
|
20
|
+
const perChannel = {};
|
|
21
|
+
for (const write of tuple.pendingWrites ?? []) {
|
|
22
|
+
const channel = write[1];
|
|
23
|
+
if (walk.remaining.has(channel))
|
|
24
|
+
(perChannel[channel] ??= []).push(write);
|
|
25
|
+
}
|
|
26
|
+
for (const channel of Object.keys(perChannel)) {
|
|
27
|
+
const block = perChannel[channel];
|
|
28
|
+
for (let i = block.length - 1; i >= 0; i -= 1)
|
|
29
|
+
walk.writes[channel].push(block[i]);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function takeSeeds(tuple, walk) {
|
|
33
|
+
for (const channel of [...walk.remaining]) {
|
|
34
|
+
if (Object.prototype.hasOwnProperty.call(tuple.checkpoint.channel_values, channel)) {
|
|
35
|
+
walk.seeds[channel] = tuple.checkpoint.channel_values[channel];
|
|
36
|
+
walk.remaining.delete(channel);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function cursorFor(parent, signal) {
|
|
41
|
+
if (parent === undefined || signal === undefined)
|
|
42
|
+
return parent;
|
|
43
|
+
return { ...parent, signal };
|
|
44
|
+
}
|
|
45
|
+
async function walkAncestors(context, getTuple, walk, from) {
|
|
46
|
+
let cursor = cursorFor(from.start, from.signal);
|
|
47
|
+
while (cursor !== undefined && walk.remaining.size > 0) {
|
|
48
|
+
const revisit = revisitOf(cursor, walk);
|
|
49
|
+
if (revisit !== undefined)
|
|
50
|
+
throw ancestorExpired(revisit, [...walk.remaining]);
|
|
51
|
+
const tuple = await getTuple(cursor);
|
|
52
|
+
if (tuple === undefined) {
|
|
53
|
+
const stop = await probeAncestor(context, cursor);
|
|
54
|
+
if (stop === undefined)
|
|
55
|
+
return;
|
|
56
|
+
throw ancestorExpired(stop, [...walk.remaining]);
|
|
57
|
+
}
|
|
58
|
+
collectWrites(tuple, walk);
|
|
59
|
+
takeSeeds(tuple, walk);
|
|
60
|
+
cursor = cursorFor(tuple.parentConfig, from.signal);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function revisitOf(cursor, walk) {
|
|
64
|
+
const ids = cursor.configurable;
|
|
65
|
+
const threadId = ids?.thread_id;
|
|
66
|
+
const checkpointId = ids?.checkpoint_id;
|
|
67
|
+
if (typeof threadId !== 'string' || typeof checkpointId !== 'string')
|
|
68
|
+
return undefined;
|
|
69
|
+
const key = `${ids?.checkpoint_ns ?? ''}#${checkpointId}`;
|
|
70
|
+
if (walk.visited.has(key))
|
|
71
|
+
return { threadId, checkpointId, stop: 'revisited' };
|
|
72
|
+
walk.visited.add(key);
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
function historyOf(walk, channel) {
|
|
76
|
+
const writes = walk.writes[channel].slice().reverse();
|
|
77
|
+
return Object.prototype.hasOwnProperty.call(walk.seeds, channel)
|
|
78
|
+
? { writes, seed: walk.seeds[channel] }
|
|
79
|
+
: { writes };
|
|
80
|
+
}
|
|
81
|
+
async function deltaChannelHistory(context, getTuple, config, channels) {
|
|
82
|
+
if (channels.length === 0)
|
|
83
|
+
return {};
|
|
84
|
+
const walk = startWalk(channels);
|
|
85
|
+
const target = await getTuple(config);
|
|
86
|
+
await walkAncestors(context, getTuple, walk, {
|
|
87
|
+
start: target?.parentConfig,
|
|
88
|
+
signal: config.signal,
|
|
89
|
+
});
|
|
90
|
+
const result = {};
|
|
91
|
+
for (const channel of channels)
|
|
92
|
+
result[channel] = historyOf(walk, channel);
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
async function probeAncestor(context, config) {
|
|
96
|
+
const ids = config.configurable;
|
|
97
|
+
const threadId = ids?.thread_id;
|
|
98
|
+
const checkpointId = ids?.checkpoint_id;
|
|
99
|
+
if (typeof threadId !== 'string' || typeof checkpointId !== 'string')
|
|
100
|
+
return undefined;
|
|
101
|
+
const checkpointNs = ids?.checkpoint_ns ?? '';
|
|
102
|
+
const result = await (0, retry_js_1.withDynamoDBRetry)((request) => context.client.get({
|
|
103
|
+
TableName: context.tableName,
|
|
104
|
+
Key: (0, rows_js_1.metaRowKey)({ threadId, checkpointNs, checkpointId }),
|
|
105
|
+
ConsistentRead: true,
|
|
106
|
+
}, request), (0, retry_js_1.retryFor)(context, config.signal));
|
|
107
|
+
const row = result.Item;
|
|
108
|
+
return {
|
|
109
|
+
threadId,
|
|
110
|
+
checkpointId,
|
|
111
|
+
stop: row !== undefined && (0, table_schema_js_1.isExpiredRow)(row, (0, clock_js_1.nowSeconds)()) ? 'expired' : 'gone',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function ancestorExpired(stop, channels) {
|
|
115
|
+
const named = (0, truncate_js_1.truncateLabelsForLog)(channels)
|
|
116
|
+
.map((channel) => `"${channel}"`)
|
|
117
|
+
.join(', ');
|
|
118
|
+
const what = stop.stop === 'expired'
|
|
119
|
+
? 'has expired'
|
|
120
|
+
: stop.stop === 'gone'
|
|
121
|
+
? 'is gone (expired and removed by DynamoDB, or deleted)'
|
|
122
|
+
: 'is named as its own ancestor, so the chain never reaches a stored value';
|
|
123
|
+
return new base_error_js_1.DynamoDBLangGraphError(`checkpoint "${(0, truncate_js_1.truncateForLog)(stop.checkpointId)}" of thread ` +
|
|
124
|
+
`"${(0, truncate_js_1.truncateForLog)(stop.threadId)}" ${what}, but later ` +
|
|
125
|
+
`checkpoints still need it to reconstruct ${named}. ` +
|
|
126
|
+
'A delta channel writes a full snapshot only every `snapshotFrequency` updates and leaves ' +
|
|
127
|
+
'itself out of the checkpoints in between, so its value is rebuilt from an earlier ' +
|
|
128
|
+
'ancestor — which a per-checkpoint ttl expires while its descendants live on. Lower ' +
|
|
129
|
+
'`snapshotFrequency` (1 makes every checkpoint self-contained), or do not configure a ttl ' +
|
|
130
|
+
'on threads that use delta channels.', error_code_js_1.ErrorCode.ANCESTOR_EXPIRED, { threadId: stop.threadId, checkpointId: stop.checkpointId });
|
|
131
|
+
}
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import type { QueryCommandInput, ScanCommandInput } from '@aws-sdk/lib-dynamodb';
|
|
11
11
|
import type { CheckpointMetadata } from '@langchain/langgraph-checkpoint';
|
|
12
|
-
import type { AttributeMap } from '../../shared/dynamodb/client';
|
|
13
|
-
import type { FilterValue, ListScope, ThreadId } from './parse';
|
|
14
|
-
import { type CheckpointMetaRow } from './rows';
|
|
15
|
-
import type { CheckpointerContext } from './setup';
|
|
12
|
+
import type { AttributeMap } from '../../shared/dynamodb/client.js';
|
|
13
|
+
import type { FilterValue, ListScope, ThreadId } from './parse.js';
|
|
14
|
+
import { type CheckpointMetaRow } from './rows.js';
|
|
15
|
+
import type { CheckpointerContext } from './setup.js';
|
|
16
16
|
/**
|
|
17
17
|
* The META query for a scope that names a thread.
|
|
18
18
|
*
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listQuery = listQuery;
|
|
4
|
+
exports.listScan = listScan;
|
|
5
|
+
exports.passesKeyFilters = passesKeyFilters;
|
|
6
|
+
exports.passesMetadataFilter = passesMetadataFilter;
|
|
7
|
+
exports.metaRows = metaRows;
|
|
8
|
+
exports.parseListedRow = parseListedRow;
|
|
9
|
+
exports.matchesFilter = matchesFilter;
|
|
10
|
+
const node_util_1 = require("node:util");
|
|
11
|
+
const concurrency_js_1 = require("../../shared/concurrency.js");
|
|
12
|
+
const paginate_js_1 = require("../../shared/dynamodb/paginate.js");
|
|
13
|
+
const recency_index_js_1 = require("../../shared/dynamodb/recency-index.js");
|
|
14
|
+
const retry_js_1 = require("../../shared/dynamodb/retry.js");
|
|
15
|
+
const table_schema_js_1 = require("../../shared/dynamodb/table-schema.js");
|
|
16
|
+
const truncate_js_1 = require("../../shared/logging/truncate.js");
|
|
17
|
+
const rows_js_1 = require("./rows.js");
|
|
18
|
+
function listQuery(context, scope) {
|
|
19
|
+
const partition = (0, rows_js_1.partitionKey)(scope.threadId);
|
|
20
|
+
const limit = scope.filter === undefined ? scope.limit : undefined;
|
|
21
|
+
if (scope.checkpointNs === undefined) {
|
|
22
|
+
return (0, rows_js_1.beginsWithQuery)(context.tableName, partition, (0, rows_js_1.metaAnyNamespacePrefix)(), { limit });
|
|
23
|
+
}
|
|
24
|
+
return (0, rows_js_1.beginsWithQuery)(context.tableName, partition, (0, rows_js_1.metaSortKeyPrefix)(scope.checkpointNs), {
|
|
25
|
+
limit,
|
|
26
|
+
beforeSortKey: scope.before === undefined ? undefined : (0, rows_js_1.metaSortKey)(scope.checkpointNs, scope.before),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function listScan(context, scope) {
|
|
30
|
+
return {
|
|
31
|
+
TableName: context.tableName,
|
|
32
|
+
FilterExpression: 'begins_with(#pk, :pk) AND begins_with(#sk, :sk)',
|
|
33
|
+
ExpressionAttributeNames: { '#pk': table_schema_js_1.PARTITION_KEY_ATTRIBUTE, '#sk': table_schema_js_1.SORT_KEY_ATTRIBUTE },
|
|
34
|
+
ExpressionAttributeValues: {
|
|
35
|
+
':pk': (0, rows_js_1.checkpointerPartitionPrefix)(),
|
|
36
|
+
':sk': scope.checkpointNs === undefined
|
|
37
|
+
? (0, rows_js_1.metaAnyNamespacePrefix)()
|
|
38
|
+
: (0, rows_js_1.metaSortKeyPrefix)(scope.checkpointNs),
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function passesKeyFilters(meta, scope) {
|
|
43
|
+
return ((scope.before === undefined || (0, table_schema_js_1.compareSortKeys)(meta.checkpointId, scope.before) < 0) &&
|
|
44
|
+
(scope.checkpointNs === undefined || meta.checkpointNs === scope.checkpointNs) &&
|
|
45
|
+
(scope.checkpointId === undefined || meta.checkpointId === scope.checkpointId));
|
|
46
|
+
}
|
|
47
|
+
async function passesMetadataFilter(context, meta, scope) {
|
|
48
|
+
if (!scope.filter)
|
|
49
|
+
return { pass: true };
|
|
50
|
+
const metadata = await (0, rows_js_1.readMetadata)(context, meta, meta.threadId, scope.signal);
|
|
51
|
+
return matchesFilter(metadata, scope.filter) ? { pass: true, metadata } : { pass: false };
|
|
52
|
+
}
|
|
53
|
+
function threadlessRows(context, scope, now) {
|
|
54
|
+
if (context.indexName === undefined) {
|
|
55
|
+
return (0, paginate_js_1.paginateScan)({
|
|
56
|
+
retry: (0, retry_js_1.retryFor)(context, scope.signal),
|
|
57
|
+
signal: scope.signal,
|
|
58
|
+
client: context.client,
|
|
59
|
+
params: (0, table_schema_js_1.withoutExpired)(listScan(context, scope), now),
|
|
60
|
+
maxItems: Number.POSITIVE_INFINITY,
|
|
61
|
+
maxIterations: Number.POSITIVE_INFINITY,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return (0, recency_index_js_1.iterateRecencyIndex)({
|
|
65
|
+
client: context.client,
|
|
66
|
+
tableName: context.tableName,
|
|
67
|
+
indexName: context.indexName,
|
|
68
|
+
tag: 'CHKPT',
|
|
69
|
+
shards: context.indexShards ?? recency_index_js_1.DEFAULT_INDEX_SHARDS,
|
|
70
|
+
concurrency: context.readConcurrency ?? concurrency_js_1.DEFAULT_READ_CONCURRENCY,
|
|
71
|
+
retry: (0, retry_js_1.retryFor)(context, scope.signal),
|
|
72
|
+
signal: scope.signal,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function metaRows(context, scope, now) {
|
|
76
|
+
const retry = (0, retry_js_1.retryFor)(context, scope.signal);
|
|
77
|
+
const bounds = { maxItems: Number.POSITIVE_INFINITY, maxIterations: Number.POSITIVE_INFINITY };
|
|
78
|
+
return scope.threadId === undefined
|
|
79
|
+
? threadlessRows(context, scope, now)
|
|
80
|
+
: (0, paginate_js_1.paginateQuery)({
|
|
81
|
+
retry,
|
|
82
|
+
signal: scope.signal,
|
|
83
|
+
client: context.client,
|
|
84
|
+
params: (0, table_schema_js_1.withoutExpired)(listQuery(context, { ...scope, threadId: scope.threadId }), now),
|
|
85
|
+
...bounds,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function parseListedRow(context, raw) {
|
|
89
|
+
const meta = (0, rows_js_1.parseMetaRow)(raw);
|
|
90
|
+
if (!meta) {
|
|
91
|
+
context.logger.warn('list: skipped a row that is not a checkpoint meta item', {
|
|
92
|
+
sortKey: (0, truncate_js_1.truncateForLog)(raw.SK),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return meta;
|
|
96
|
+
}
|
|
97
|
+
function ownValue(metadata, key) {
|
|
98
|
+
if (metadata === null || typeof metadata !== 'object')
|
|
99
|
+
return undefined;
|
|
100
|
+
return Object.hasOwn(metadata, key) ? metadata[key] : undefined;
|
|
101
|
+
}
|
|
102
|
+
function matchesFilter(metadata, filter) {
|
|
103
|
+
return Object.entries(filter).every(([key, value]) => (0, node_util_1.isDeepStrictEqual)(ownValue(metadata, key), value));
|
|
104
|
+
}
|
|
@@ -10,13 +10,14 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import type { RunnableConfig } from '@langchain/core/runnables';
|
|
12
12
|
import type { Checkpoint, CheckpointListOptions, CheckpointMetadata, PendingWrite } from '@langchain/langgraph-checkpoint';
|
|
13
|
-
import { type PageLimit } from '../../shared/validation/primitives';
|
|
14
|
-
import type { DeltaChannelHistoryOptions } from '../types';
|
|
13
|
+
import { type PageLimit } from '../../shared/validation/primitives.js';
|
|
14
|
+
import type { DeltaChannelHistoryOptions } from '../types.js';
|
|
15
15
|
declare const threadIdBrand: unique symbol;
|
|
16
16
|
declare const checkpointNsBrand: unique symbol;
|
|
17
17
|
declare const checkpointIdBrand: unique symbol;
|
|
18
18
|
declare const taskIdBrand: unique symbol;
|
|
19
19
|
declare const writeChannelBrand: unique symbol;
|
|
20
|
+
declare const taskPathBrand: unique symbol;
|
|
20
21
|
/**
|
|
21
22
|
* A thread id checked as the partition key it becomes. {@link parseThreadId}
|
|
22
23
|
* is the only way to obtain one, so a function that asks for a `ThreadId`
|
|
@@ -42,6 +43,10 @@ export type TaskId = string & {
|
|
|
42
43
|
export type WriteChannel = string & {
|
|
43
44
|
readonly [writeChannelBrand]: true;
|
|
44
45
|
};
|
|
46
|
+
/** The serialized path of the task that made a write, as LangGraph 1.5 hands it to `putWrites`; see {@link parseTaskPath}. */
|
|
47
|
+
export type TaskPath = string & {
|
|
48
|
+
readonly [taskPathBrand]: true;
|
|
49
|
+
};
|
|
45
50
|
/**
|
|
46
51
|
* Parse a thread id.
|
|
47
52
|
*
|
|
@@ -57,7 +62,8 @@ export declare function parseThreadId(value: unknown): ThreadId;
|
|
|
57
62
|
* Parse a checkpoint namespace.
|
|
58
63
|
*
|
|
59
64
|
* Accepts: `value` — anything; `''` is legal, because it *is* the root
|
|
60
|
-
* namespace, and every other identifier rule applies (see `parseKeySegment`)
|
|
65
|
+
* namespace, and every other identifier rule applies (see `parseKeySegment`),
|
|
66
|
+
* at most {@link MAX_CHECKPOINT_NS_BYTES} bytes of UTF-8.
|
|
61
67
|
*
|
|
62
68
|
* Returns: `value` as a {@link CheckpointNs}.
|
|
63
69
|
*
|
|
@@ -92,13 +98,34 @@ export declare function parseTaskId(value: unknown): TaskId;
|
|
|
92
98
|
* Parse a pending write's channel, the trailing segment of its WRITE sort key.
|
|
93
99
|
*
|
|
94
100
|
* Accepts: `value` — anything; LangGraph's own channel names never contain the
|
|
95
|
-
* reserved separator.
|
|
101
|
+
* reserved separator. The cap is {@link MAX_WRITE_CHANNEL_BYTES}, wider than
|
|
102
|
+
* the other segments' because a fan-in's channel is named after every source
|
|
103
|
+
* node; the composed sort key is checked against DynamoDB's cap separately.
|
|
96
104
|
*
|
|
97
105
|
* Returns: `value` as a {@link WriteChannel}.
|
|
98
106
|
*
|
|
99
107
|
* Throws: `VALIDATION` naming `channel`.
|
|
100
108
|
*/
|
|
101
109
|
export declare function parseWriteChannel(value: unknown): WriteChannel;
|
|
110
|
+
/**
|
|
111
|
+
* Parse the task path a `putWrites` call carries.
|
|
112
|
+
*
|
|
113
|
+
* LangGraph 1.5 (`@langchain/langgraph-checkpoint@1.2.0`) hands `putWrites`
|
|
114
|
+
* the serialized path of the task that made the writes — `~pull, <node>`,
|
|
115
|
+
* `~push, 0000000003, …` — as a fourth argument, and reads a checkpoint's
|
|
116
|
+
* writes back ordered by it first (`writesSortKey`: path, then task id, then
|
|
117
|
+
* index). It is stored as given and never keyed on, so it has no byte cap
|
|
118
|
+
* and no separator rule: it leads a sort, not a sort key.
|
|
119
|
+
*
|
|
120
|
+
* Accepts: `value` — a string, the empty string included (a write made by
|
|
121
|
+
* no task); `undefined` for a call that carries none, which every LangGraph
|
|
122
|
+
* before 1.5 makes.
|
|
123
|
+
*
|
|
124
|
+
* Returns: `value` as a {@link TaskPath}, or `undefined` when none was given.
|
|
125
|
+
*
|
|
126
|
+
* Throws: `VALIDATION` naming `taskPath` for any other value.
|
|
127
|
+
*/
|
|
128
|
+
export declare function parseTaskPath(value: unknown): TaskPath | undefined;
|
|
102
129
|
/** The root namespace, which a config that names none addresses. */
|
|
103
130
|
export declare const ROOT_NAMESPACE: CheckpointNs;
|
|
104
131
|
/** A thread, a namespace in it, and possibly one checkpoint — "the newest" when unset. */
|
|
@@ -180,6 +207,8 @@ export declare function parsePutRequest(config: RunnableConfig, checkpoint: Chec
|
|
|
180
207
|
export interface PutWritesRequest {
|
|
181
208
|
readonly address: CheckpointAddress;
|
|
182
209
|
readonly taskId: TaskId;
|
|
210
|
+
/** The task's serialized path, when the call carried one; see {@link parseTaskPath}. */
|
|
211
|
+
readonly taskPath: TaskPath | undefined;
|
|
183
212
|
/** A copy of the caller's writes, each reduced to its channel and value. */
|
|
184
213
|
readonly writes: PendingWrite<WriteChannel>[];
|
|
185
214
|
readonly signal: AbortSignal | undefined;
|
|
@@ -191,18 +220,19 @@ export interface PutWritesRequest {
|
|
|
191
220
|
* checkpoint, since writes attach to one. `writes` — an array of
|
|
192
221
|
* `[channel, value]` arrays; the value, and any element past the second, are
|
|
193
222
|
* unconstrained, as upstream's type places no rule on them. `taskId` — parsed
|
|
194
|
-
* as the key segment it becomes.
|
|
223
|
+
* as the key segment it becomes. `taskPath` — as {@link parseTaskPath}; absent
|
|
224
|
+
* from a LangGraph before 1.5.
|
|
195
225
|
*
|
|
196
226
|
* Returns: the request, with a fresh array of fresh tuples, so a caller
|
|
197
227
|
* changing its own array while the call awaits changes nothing that was
|
|
198
228
|
* checked.
|
|
199
229
|
*
|
|
200
230
|
* Throws: `VALIDATION`, before anything is encoded or uploaded, in this order:
|
|
201
|
-
* `taskId`; as {@link parseThreadConfig}; `checkpoint_id` when the config names
|
|
231
|
+
* `taskId`; `taskPath`; as {@link parseThreadConfig}; `checkpoint_id` when the config names
|
|
202
232
|
* none; `writes` for a non-array or an entry that is not one; `channel` for any
|
|
203
233
|
* malformed channel; `sortKey` for any write whose composed key passes the cap.
|
|
204
234
|
*/
|
|
205
|
-
export declare function parsePutWritesRequest(config: RunnableConfig, writes: PendingWrite[], taskId: string): PutWritesRequest;
|
|
235
|
+
export declare function parsePutWritesRequest(config: RunnableConfig, writes: PendingWrite[], taskId: string, taskPath?: string): PutWritesRequest;
|
|
206
236
|
/** A JSON-comparable value used in metadata filters. */
|
|
207
237
|
export type FilterValue = string | number | boolean | null | FilterValue[] | {
|
|
208
238
|
[key: string]: FilterValue;
|
|
@@ -233,9 +263,12 @@ export interface ListScope {
|
|
|
233
263
|
* Returns: the scope every later step of the listing reads instead of the raw
|
|
234
264
|
* config.
|
|
235
265
|
*
|
|
236
|
-
* Throws: `VALIDATION`, config first: as {@link parseConfig}; then
|
|
237
|
-
*
|
|
238
|
-
* `
|
|
266
|
+
* Throws: `VALIDATION`, config first: as {@link parseConfig}; then `options`
|
|
267
|
+
* for options that are not an object, `filter`, `limit`, `before`. A key
|
|
268
|
+
* `CheckpointListOptions` does not declare is ignored rather than refused:
|
|
269
|
+
* LangGraph defines these options and passes its own straight through
|
|
270
|
+
* (`getStateHistory` hands them to `list`), so a key a later LangGraph adds
|
|
271
|
+
* must not turn the call into a refusal (decision record 28).
|
|
239
272
|
*/
|
|
240
273
|
export declare function parseListScope(config: RunnableConfig, options?: CheckpointListOptions): ListScope;
|
|
241
274
|
/** The arguments of `getDeltaChannelHistory`, their shape checked. */
|
|
@@ -249,14 +282,17 @@ export interface DeltaHistoryRequest {
|
|
|
249
282
|
* and only once a channel is named: an empty `channels` reads nothing, so it
|
|
250
283
|
* refuses nothing either.
|
|
251
284
|
*
|
|
252
|
-
* Accepts: `options` — an object
|
|
253
|
-
*
|
|
254
|
-
*
|
|
285
|
+
* Accepts: `options` — an object carrying `config` and `channels`; any other
|
|
286
|
+
* key is ignored, since LangGraph defines this object and calls the method
|
|
287
|
+
* itself, so a key a later LangGraph adds must not refuse the call (decision
|
|
288
|
+
* record 28). `options.config` — shaped as {@link parseConfig} requires.
|
|
289
|
+
* `options.channels` — an array of strings; an empty one is a legitimate
|
|
290
|
+
* request.
|
|
255
291
|
*
|
|
256
292
|
* Returns: the config as given and a copy of the channels.
|
|
257
293
|
*
|
|
258
|
-
* Throws: `VALIDATION` naming `options`, `
|
|
259
|
-
* `
|
|
294
|
+
* Throws: `VALIDATION` naming `options`, `config`, `configurable`, `signal` or
|
|
295
|
+
* `channels`.
|
|
260
296
|
*/
|
|
261
297
|
export declare function parseDeltaHistoryRequest(options: DeltaChannelHistoryOptions): DeltaHistoryRequest;
|
|
262
298
|
export {};
|