@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,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REVISION_ATTRIBUTE = void 0;
|
|
4
|
+
exports.storePartitionPrefix = storePartitionPrefix;
|
|
5
|
+
exports.partitionKey = partitionKey;
|
|
6
|
+
exports.sortKey = sortKey;
|
|
7
|
+
exports.sortKeyPrefix = sortKeyPrefix;
|
|
8
|
+
exports.namespaceMatchesPrefix = namespaceMatchesPrefix;
|
|
9
|
+
exports.itemRowKey = itemRowKey;
|
|
10
|
+
exports.scopedQuery = scopedQuery;
|
|
11
|
+
exports.storeScan = storeScan;
|
|
12
|
+
exports.projectKeys = projectKeys;
|
|
13
|
+
exports.isLiveRow = isLiveRow;
|
|
14
|
+
exports.readExisting = readExisting;
|
|
15
|
+
exports.existingFrom = existingFrom;
|
|
16
|
+
exports.parseStoreRow = parseStoreRow;
|
|
17
|
+
exports.parseWholeStoreRow = parseWholeStoreRow;
|
|
18
|
+
exports.buildStoreRow = buildStoreRow;
|
|
19
|
+
exports.readStoreItem = readStoreItem;
|
|
20
|
+
const node_crypto_1 = require("node:crypto");
|
|
21
|
+
const clock_js_1 = require("../../shared/clock.js");
|
|
22
|
+
const codec_js_1 = require("../../shared/codec/codec.js");
|
|
23
|
+
const retry_js_1 = require("../../shared/dynamodb/retry.js");
|
|
24
|
+
const table_schema_js_1 = require("../../shared/dynamodb/table-schema.js");
|
|
25
|
+
exports.REVISION_ATTRIBUTE = 'rev';
|
|
26
|
+
const ADAPTER_PARTITION_PREFIX = `${table_schema_js_1.ADAPTER_TAGS.store}${table_schema_js_1.KEY_SEPARATOR}`;
|
|
27
|
+
function storePartitionPrefix() {
|
|
28
|
+
return ADAPTER_PARTITION_PREFIX;
|
|
29
|
+
}
|
|
30
|
+
function partitionKey(namespace) {
|
|
31
|
+
return `${ADAPTER_PARTITION_PREFIX}${namespace[0]}`;
|
|
32
|
+
}
|
|
33
|
+
function sortKey(namespace, key) {
|
|
34
|
+
return [...namespace.slice(1), key].join(table_schema_js_1.KEY_SEPARATOR);
|
|
35
|
+
}
|
|
36
|
+
function sortKeyPrefix(prefix) {
|
|
37
|
+
const rest = prefix.slice(1);
|
|
38
|
+
return rest.length === 0 ? '' : `${rest.join(table_schema_js_1.KEY_SEPARATOR)}${table_schema_js_1.KEY_SEPARATOR}`;
|
|
39
|
+
}
|
|
40
|
+
function namespaceMatchesPrefix(namespace, prefix) {
|
|
41
|
+
if (prefix.length > namespace.length)
|
|
42
|
+
return false;
|
|
43
|
+
return prefix.every((element, index) => namespace[index] === element);
|
|
44
|
+
}
|
|
45
|
+
function itemRowKey(address) {
|
|
46
|
+
return { PK: partitionKey(address.namespace), SK: sortKey(address.namespace, address.key) };
|
|
47
|
+
}
|
|
48
|
+
function scopedQuery(tableName, prefix) {
|
|
49
|
+
const skPrefix = sortKeyPrefix(prefix);
|
|
50
|
+
if (skPrefix.length === 0) {
|
|
51
|
+
return {
|
|
52
|
+
TableName: tableName,
|
|
53
|
+
KeyConditionExpression: '#pk = :pk',
|
|
54
|
+
ExpressionAttributeNames: { '#pk': table_schema_js_1.PARTITION_KEY_ATTRIBUTE },
|
|
55
|
+
ExpressionAttributeValues: { ':pk': partitionKey(prefix) },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
TableName: tableName,
|
|
60
|
+
KeyConditionExpression: '#pk = :pk AND begins_with(#sk, :skp)',
|
|
61
|
+
ExpressionAttributeNames: { '#pk': table_schema_js_1.PARTITION_KEY_ATTRIBUTE, '#sk': table_schema_js_1.SORT_KEY_ATTRIBUTE },
|
|
62
|
+
ExpressionAttributeValues: { ':pk': partitionKey(prefix), ':skp': skPrefix },
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function storeScan(tableName) {
|
|
66
|
+
return {
|
|
67
|
+
TableName: tableName,
|
|
68
|
+
FilterExpression: 'begins_with(#pk, :pkp) AND attribute_exists(#ns)',
|
|
69
|
+
ExpressionAttributeNames: { '#pk': table_schema_js_1.PARTITION_KEY_ATTRIBUTE, '#ns': 'namespace' },
|
|
70
|
+
ExpressionAttributeValues: { ':pkp': storePartitionPrefix() },
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function projectKeys(params) {
|
|
74
|
+
return {
|
|
75
|
+
...params,
|
|
76
|
+
ProjectionExpression: `${table_schema_js_1.PARTITION_KEY_ATTRIBUTE}, ${table_schema_js_1.SORT_KEY_ATTRIBUTE}, #ns, #key, #v`,
|
|
77
|
+
ExpressionAttributeNames: {
|
|
78
|
+
...params.ExpressionAttributeNames,
|
|
79
|
+
'#ns': 'namespace',
|
|
80
|
+
'#key': 'key',
|
|
81
|
+
'#v': 'v',
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function isLiveRow(existing) {
|
|
86
|
+
return existing.exists && !(0, table_schema_js_1.isExpiredRow)(existing, (0, clock_js_1.nowSeconds)());
|
|
87
|
+
}
|
|
88
|
+
async function readExisting(context, key) {
|
|
89
|
+
const existing = await (0, retry_js_1.withDynamoDBRetry)((request) => context.client.get({
|
|
90
|
+
TableName: context.tableName,
|
|
91
|
+
Key: key,
|
|
92
|
+
ConsistentRead: true,
|
|
93
|
+
ProjectionExpression: '#c, #r, #ttl, #v.#loc, #v.#s3k',
|
|
94
|
+
ExpressionAttributeNames: {
|
|
95
|
+
'#c': 'createdAt',
|
|
96
|
+
'#r': exports.REVISION_ATTRIBUTE,
|
|
97
|
+
'#ttl': 'ttl',
|
|
98
|
+
'#v': 'value',
|
|
99
|
+
'#loc': 'location',
|
|
100
|
+
'#s3k': 's3Key',
|
|
101
|
+
},
|
|
102
|
+
}, request), context.retry);
|
|
103
|
+
return existingFrom(existing.Item);
|
|
104
|
+
}
|
|
105
|
+
function existingFrom(item) {
|
|
106
|
+
return {
|
|
107
|
+
exists: item !== undefined,
|
|
108
|
+
createdAt: item?.createdAt,
|
|
109
|
+
ttl: item?.ttl,
|
|
110
|
+
value: item?.value,
|
|
111
|
+
revision: item?.[exports.REVISION_ATTRIBUTE],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function parseStoreRow(raw) {
|
|
115
|
+
(0, table_schema_js_1.assertReadableRow)(raw, 'store item');
|
|
116
|
+
if (!Array.isArray(raw.namespace) || typeof raw.key !== 'string')
|
|
117
|
+
return undefined;
|
|
118
|
+
const record = raw;
|
|
119
|
+
const consistent = record.PK === partitionKey(record.namespace) &&
|
|
120
|
+
record.SK === sortKey(record.namespace, record.key);
|
|
121
|
+
return consistent ? record : undefined;
|
|
122
|
+
}
|
|
123
|
+
function parseWholeStoreRow(raw) {
|
|
124
|
+
const record = parseStoreRow(raw);
|
|
125
|
+
if (record === undefined)
|
|
126
|
+
return undefined;
|
|
127
|
+
const stamped = typeof record.createdAt === 'string' && typeof record.updatedAt === 'string';
|
|
128
|
+
return stamped ? record : undefined;
|
|
129
|
+
}
|
|
130
|
+
async function buildStoreRow(context, address, value, options) {
|
|
131
|
+
const { namespace, key } = address;
|
|
132
|
+
const pk = partitionKey(namespace);
|
|
133
|
+
const sk = sortKey(namespace, key);
|
|
134
|
+
const rev = options.rev ?? (0, node_crypto_1.randomUUID)();
|
|
135
|
+
const descriptor = await (0, codec_js_1.encodePayload)(value, (0, codec_js_1.codecDepsOf)(context), {
|
|
136
|
+
keyParts: [...namespace, key],
|
|
137
|
+
objectId: rev,
|
|
138
|
+
row: { pk, sk },
|
|
139
|
+
});
|
|
140
|
+
const record = {
|
|
141
|
+
PK: pk,
|
|
142
|
+
SK: sk,
|
|
143
|
+
v: table_schema_js_1.ROW_FORMAT_VERSION,
|
|
144
|
+
namespace,
|
|
145
|
+
key,
|
|
146
|
+
value: descriptor,
|
|
147
|
+
createdAt: options.createdAt,
|
|
148
|
+
updatedAt: options.updatedAt,
|
|
149
|
+
rev,
|
|
150
|
+
};
|
|
151
|
+
if (options.embeddings)
|
|
152
|
+
record.embeddings = options.embeddings;
|
|
153
|
+
if (options.ttlTimestamp !== undefined)
|
|
154
|
+
record.ttl = options.ttlTimestamp;
|
|
155
|
+
return record;
|
|
156
|
+
}
|
|
157
|
+
async function readStoreItem(context, record, signal) {
|
|
158
|
+
const value = await (0, codec_js_1.decodePayload)(record.value, (0, codec_js_1.codecDepsOf)(context, signal), [...record.namespace, record.key]);
|
|
159
|
+
return {
|
|
160
|
+
namespace: record.namespace,
|
|
161
|
+
key: record.key,
|
|
162
|
+
value,
|
|
163
|
+
createdAt: new Date(record.createdAt),
|
|
164
|
+
updatedAt: new Date(record.updatedAt),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* model returns is held to the configured dimension.
|
|
8
8
|
*/
|
|
9
9
|
import type { IndexConfig } from '@langchain/langgraph-checkpoint';
|
|
10
|
-
import type { JsonValue } from './filter';
|
|
11
|
-
import type { StoreContext } from './setup';
|
|
10
|
+
import type { JsonValue } from './filter.js';
|
|
11
|
+
import type { StoreContext } from './setup.js';
|
|
12
12
|
/**
|
|
13
13
|
* Cosine similarity of two vectors.
|
|
14
14
|
*
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cosineSimilarity = cosineSimilarity;
|
|
4
|
+
exports.extractTexts = extractTexts;
|
|
5
|
+
exports.extractText = extractText;
|
|
6
|
+
exports.assertVectorDims = assertVectorDims;
|
|
7
|
+
exports.embedValues = embedValues;
|
|
8
|
+
exports.embedValue = embedValue;
|
|
9
|
+
exports.embedPassages = embedPassages;
|
|
10
|
+
exports.tokenizePath = tokenizePath;
|
|
11
|
+
exports.getTextAtPath = getTextAtPath;
|
|
12
|
+
const errors_js_1 = require("../../shared/errors/errors.js");
|
|
13
|
+
const EMBED_BATCH_SIZE = 100;
|
|
14
|
+
function cosineSimilarity(a, b) {
|
|
15
|
+
if (a.length !== b.length)
|
|
16
|
+
return 0;
|
|
17
|
+
let dot = 0;
|
|
18
|
+
let normA = 0;
|
|
19
|
+
let normB = 0;
|
|
20
|
+
for (let i = 0; i < a.length; i++) {
|
|
21
|
+
dot += a[i] * b[i];
|
|
22
|
+
normA += a[i] * a[i];
|
|
23
|
+
normB += b[i] * b[i];
|
|
24
|
+
}
|
|
25
|
+
if (normA === 0 || normB === 0)
|
|
26
|
+
return 0;
|
|
27
|
+
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
28
|
+
}
|
|
29
|
+
function extractTexts(value, fields) {
|
|
30
|
+
return fields.flatMap((field) => getTextAtPath(value, field)).filter((text) => text.length > 0);
|
|
31
|
+
}
|
|
32
|
+
function extractText(value, fields) {
|
|
33
|
+
return extractTexts(value, fields).join(' ');
|
|
34
|
+
}
|
|
35
|
+
function assertVectorDims(index, vector, what) {
|
|
36
|
+
const dims = index.dims;
|
|
37
|
+
if (!Number.isInteger(dims) || dims <= 0 || vector.length === dims)
|
|
38
|
+
return;
|
|
39
|
+
throw (0, errors_js_1.validationError)(`index.embeddings returned a ${vector.length}-dimensional ${what} vector but index.dims ` +
|
|
40
|
+
`is ${dims}; the embeddings model does not match the configured index`, 'index.dims');
|
|
41
|
+
}
|
|
42
|
+
async function embedValues(context, values, fieldsOverride) {
|
|
43
|
+
const index = context.index;
|
|
44
|
+
if (!index)
|
|
45
|
+
return values.map(() => undefined);
|
|
46
|
+
const fields = fieldsOverride ?? index.fields ?? ['$'];
|
|
47
|
+
const pending = [];
|
|
48
|
+
values.forEach((value, position) => {
|
|
49
|
+
const text = extractText(value, fields);
|
|
50
|
+
if (text.length > 0)
|
|
51
|
+
pending.push({ text, position });
|
|
52
|
+
});
|
|
53
|
+
const vectors = values.map(() => undefined);
|
|
54
|
+
for (let start = 0; start < pending.length; start += EMBED_BATCH_SIZE) {
|
|
55
|
+
const batch = pending.slice(start, start + EMBED_BATCH_SIZE);
|
|
56
|
+
const embedded = await index.embeddings.embedDocuments(batch.map((entry) => entry.text));
|
|
57
|
+
batch.forEach((entry, i) => {
|
|
58
|
+
assertVectorDims(index, embedded[i], 'document');
|
|
59
|
+
vectors[entry.position] = embedded[i];
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return vectors;
|
|
63
|
+
}
|
|
64
|
+
async function embedValue(context, value, fieldsOverride) {
|
|
65
|
+
return (await embedValues(context, [value], fieldsOverride))[0];
|
|
66
|
+
}
|
|
67
|
+
async function embedPassages(context, value, fieldsOverride) {
|
|
68
|
+
const index = context.index;
|
|
69
|
+
if (!index)
|
|
70
|
+
return undefined;
|
|
71
|
+
const texts = extractTexts(value, fieldsOverride ?? index.fields ?? ['$']);
|
|
72
|
+
if (texts.length === 0)
|
|
73
|
+
return undefined;
|
|
74
|
+
const vectors = [];
|
|
75
|
+
for (let start = 0; start < texts.length; start += EMBED_BATCH_SIZE) {
|
|
76
|
+
const embedded = await index.embeddings.embedDocuments(texts.slice(start, start + EMBED_BATCH_SIZE));
|
|
77
|
+
for (const vector of embedded) {
|
|
78
|
+
assertVectorDims(index, vector, 'document');
|
|
79
|
+
vectors.push(vector);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return vectors;
|
|
83
|
+
}
|
|
84
|
+
function prettyText(value) {
|
|
85
|
+
let text;
|
|
86
|
+
try {
|
|
87
|
+
text = JSON.stringify(value, null, 2);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
return text === undefined ? [] : [text];
|
|
93
|
+
}
|
|
94
|
+
function isScalar(value) {
|
|
95
|
+
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
96
|
+
}
|
|
97
|
+
function leafText(value) {
|
|
98
|
+
if (isScalar(value))
|
|
99
|
+
return [String(value)];
|
|
100
|
+
if (value === null)
|
|
101
|
+
return [];
|
|
102
|
+
return prettyText(value);
|
|
103
|
+
}
|
|
104
|
+
function scanGroup(path, start, open, close) {
|
|
105
|
+
let depth = 1;
|
|
106
|
+
let i = start;
|
|
107
|
+
while (i < path.length && depth > 0) {
|
|
108
|
+
if (path[i] === open)
|
|
109
|
+
depth += 1;
|
|
110
|
+
else if (path[i] === close)
|
|
111
|
+
depth -= 1;
|
|
112
|
+
i += 1;
|
|
113
|
+
}
|
|
114
|
+
return i;
|
|
115
|
+
}
|
|
116
|
+
function tokenizePath(path) {
|
|
117
|
+
const tokens = [];
|
|
118
|
+
let current = '';
|
|
119
|
+
const flush = () => {
|
|
120
|
+
if (current.length > 0)
|
|
121
|
+
tokens.push(current);
|
|
122
|
+
current = '';
|
|
123
|
+
};
|
|
124
|
+
let i = 0;
|
|
125
|
+
while (i < path.length) {
|
|
126
|
+
const char = path[i];
|
|
127
|
+
if (char === '[' || char === '{') {
|
|
128
|
+
flush();
|
|
129
|
+
const end = scanGroup(path, i + 1, char, char === '[' ? ']' : '}');
|
|
130
|
+
tokens.push(path.slice(i, end));
|
|
131
|
+
i = end;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (char === '.')
|
|
135
|
+
flush();
|
|
136
|
+
else
|
|
137
|
+
current += char;
|
|
138
|
+
i += 1;
|
|
139
|
+
}
|
|
140
|
+
flush();
|
|
141
|
+
return tokens;
|
|
142
|
+
}
|
|
143
|
+
function groupFieldText(value, field) {
|
|
144
|
+
let current = value;
|
|
145
|
+
for (const token of tokenizePath(field)) {
|
|
146
|
+
if (current !== null && typeof current === 'object' && token in current) {
|
|
147
|
+
current = current[token];
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return isScalar(current) ? [String(current)] : prettyText(current);
|
|
154
|
+
}
|
|
155
|
+
function indexText(value, token, tokens, pos) {
|
|
156
|
+
if (!Array.isArray(value))
|
|
157
|
+
return [];
|
|
158
|
+
const index = token.slice(1, -1);
|
|
159
|
+
if (index === '*')
|
|
160
|
+
return value.flatMap((item) => extract(item, tokens, pos + 1));
|
|
161
|
+
let idx = Number.parseInt(index, 10);
|
|
162
|
+
if (Number.isNaN(idx))
|
|
163
|
+
return [];
|
|
164
|
+
if (idx < 0)
|
|
165
|
+
idx = value.length + idx;
|
|
166
|
+
return idx >= 0 && idx < value.length ? extract(value[idx], tokens, pos + 1) : [];
|
|
167
|
+
}
|
|
168
|
+
function groupText(value, token) {
|
|
169
|
+
if (typeof value !== 'object' || value === null)
|
|
170
|
+
return [];
|
|
171
|
+
const results = [];
|
|
172
|
+
for (const field of token.slice(1, -1).split(',')) {
|
|
173
|
+
const trimmed = field.trim();
|
|
174
|
+
if (tokenizePath(trimmed).length > 0)
|
|
175
|
+
results.push(...groupFieldText(value, trimmed));
|
|
176
|
+
}
|
|
177
|
+
return results;
|
|
178
|
+
}
|
|
179
|
+
function wildcardText(value, tokens, pos) {
|
|
180
|
+
if (Array.isArray(value))
|
|
181
|
+
return value.flatMap((item) => extract(item, tokens, pos + 1));
|
|
182
|
+
if (typeof value === 'object' && value !== null) {
|
|
183
|
+
return Object.values(value).flatMap((item) => extract(item, tokens, pos + 1));
|
|
184
|
+
}
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
function memberText(value, token, tokens, pos) {
|
|
188
|
+
if (typeof value !== 'object' || value === null || !(token in value))
|
|
189
|
+
return [];
|
|
190
|
+
return extract(value[token], tokens, pos + 1);
|
|
191
|
+
}
|
|
192
|
+
function extract(value, tokens, pos) {
|
|
193
|
+
if (pos >= tokens.length)
|
|
194
|
+
return leafText(value);
|
|
195
|
+
const token = tokens[pos];
|
|
196
|
+
if (token.startsWith('[') && token.endsWith(']'))
|
|
197
|
+
return indexText(value, token, tokens, pos);
|
|
198
|
+
const results = pos === 0 && token === '$' ? prettyText(value) : [];
|
|
199
|
+
if (token.startsWith('{') && token.endsWith('}'))
|
|
200
|
+
results.push(...groupText(value, token));
|
|
201
|
+
else if (token === '*')
|
|
202
|
+
results.push(...wildcardText(value, tokens, pos));
|
|
203
|
+
else
|
|
204
|
+
results.push(...memberText(value, token, tokens, pos));
|
|
205
|
+
return results;
|
|
206
|
+
}
|
|
207
|
+
function getTextAtPath(value, path) {
|
|
208
|
+
if (path === '' || path === '$')
|
|
209
|
+
return prettyText(value);
|
|
210
|
+
return extract(value, tokenizePath(path), 0);
|
|
211
|
+
}
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
* defaults filled in.
|
|
11
11
|
*/
|
|
12
12
|
import type { IndexConfig, SerializerProtocol } from '@langchain/langgraph-checkpoint';
|
|
13
|
-
import { type AdapterCore, type AdapterShell } from '../../shared/adapter';
|
|
14
|
-
import type { DynamoDBStoreOptions } from '../types';
|
|
15
|
-
import { type VectorBackend, type VectorScoreDirection } from '../vector-backend';
|
|
13
|
+
import { type AdapterCore, type AdapterShell } from '../../shared/adapter.js';
|
|
14
|
+
import type { DynamoDBStoreOptions } from '../types.js';
|
|
15
|
+
import { type VectorBackend, type VectorScoreDirection } from '../vector-backend.js';
|
|
16
16
|
/** Default cap on candidates the in-DB semantic ranker will score. */
|
|
17
17
|
export declare const DEFAULT_MAX_SEARCH_CANDIDATES = 1000;
|
|
18
18
|
/**
|
|
@@ -36,6 +36,7 @@ export interface StoreContext extends AdapterCore {
|
|
|
36
36
|
vectorScoreDirection: VectorScoreDirection;
|
|
37
37
|
maxSearchCandidates: number;
|
|
38
38
|
maxScanItems: number;
|
|
39
|
+
maxIterations: number;
|
|
39
40
|
}
|
|
40
41
|
/** Result of wiring up a store from its options. */
|
|
41
42
|
export interface StoreSetup {
|
|
@@ -60,20 +61,14 @@ export interface StoreSetup {
|
|
|
60
61
|
*/
|
|
61
62
|
export declare function setUpStore(options: DynamoDBStoreOptions): StoreSetup;
|
|
62
63
|
/**
|
|
63
|
-
* The keys of
|
|
64
|
-
* `allKeysOf<T>` makes omitting or inventing one a compile error, so
|
|
65
|
-
* cannot rot away from the type it guards.
|
|
66
|
-
* the
|
|
64
|
+
* The keys of the store's constructor options, exhaustive in both directions:
|
|
65
|
+
* `allKeysOf<T>` makes omitting or inventing one a compile error, so the list
|
|
66
|
+
* cannot rot away from the type it guards. It lives with the feature because
|
|
67
|
+
* the type it is checked against does; `shared/` knows no feature. `search`'s
|
|
68
|
+
* and `listNamespaces`' options have no list: LangGraph defines them, so a key
|
|
69
|
+
* it adds is ignored rather than refused (decision record 28).
|
|
67
70
|
*/
|
|
68
71
|
export declare const STORE_KEYS: readonly string[];
|
|
69
|
-
/** See {@link STORE_KEYS}. */
|
|
70
|
-
export declare const STORE_SEARCH_KEYS: readonly string[];
|
|
71
|
-
/**
|
|
72
|
-
* See {@link STORE_KEYS}. `ListNamespacesOptions` is pinned equal to
|
|
73
|
-
* `BaseStore.listNamespaces`' own parameter type, so this list is checked
|
|
74
|
-
* against upstream's options through it.
|
|
75
|
-
*/
|
|
76
|
-
export declare const STORE_LIST_NAMESPACES_KEYS: readonly string[];
|
|
77
72
|
/**
|
|
78
73
|
* Validate the store's own options at construction; the shared ones are
|
|
79
74
|
* `openAdapter`'s, which checks them before these.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STORE_KEYS = exports.MAX_SCAN_ITEMS = exports.MAX_SEARCH_CANDIDATES = exports.DEFAULT_MAX_SEARCH_CANDIDATES = void 0;
|
|
4
|
+
exports.setUpStore = setUpStore;
|
|
5
|
+
exports.assertStoreOptions = assertStoreOptions;
|
|
6
|
+
const adapter_js_1 = require("../../shared/adapter.js");
|
|
7
|
+
const json_serde_js_1 = require("../../shared/codec/json-serde.js");
|
|
8
|
+
const paginate_js_1 = require("../../shared/dynamodb/paginate.js");
|
|
9
|
+
const errors_js_1 = require("../../shared/errors/errors.js");
|
|
10
|
+
const collaborators_js_1 = require("../../shared/validation/collaborators.js");
|
|
11
|
+
const option_shape_js_1 = require("../../shared/validation/option-shape.js");
|
|
12
|
+
const primitives_js_1 = require("../../shared/validation/primitives.js");
|
|
13
|
+
const vector_backend_js_1 = require("../vector-backend.js");
|
|
14
|
+
exports.DEFAULT_MAX_SEARCH_CANDIDATES = 1000;
|
|
15
|
+
exports.MAX_SEARCH_CANDIDATES = 100_000;
|
|
16
|
+
exports.MAX_SCAN_ITEMS = 1_000_000;
|
|
17
|
+
function setUpStore(options) {
|
|
18
|
+
(0, option_shape_js_1.assertShape)(options, exports.STORE_KEYS, 'options');
|
|
19
|
+
const shell = (0, adapter_js_1.openAdapter)(options, 'store', {
|
|
20
|
+
options: () => assertStoreOptions(options),
|
|
21
|
+
collaborators: () => {
|
|
22
|
+
if (options.vectorBackend !== undefined) {
|
|
23
|
+
(0, collaborators_js_1.assertMembers)(options.vectorBackend, collaborators_js_1.VECTOR_BACKEND_MEMBERS, 'vectorBackend');
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
shell,
|
|
29
|
+
context: {
|
|
30
|
+
...shell.core,
|
|
31
|
+
serde: options.serde ?? json_serde_js_1.JSON_SERDE,
|
|
32
|
+
index: options.index,
|
|
33
|
+
vectorBackend: options.vectorBackend,
|
|
34
|
+
vectorScoreDirection: options.vectorScoreDirection ?? 'relevance',
|
|
35
|
+
maxSearchCandidates: options.maxSearchCandidates ?? exports.DEFAULT_MAX_SEARCH_CANDIDATES,
|
|
36
|
+
maxScanItems: options.maxScanItems ?? paginate_js_1.MAX_TOTAL_ROWS_IN_MEMORY,
|
|
37
|
+
maxIterations: options.maxIterations ?? paginate_js_1.MAX_LOOP_ITERATIONS,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
exports.STORE_KEYS = (0, option_shape_js_1.allKeysOf)({
|
|
42
|
+
tableName: 'tableName',
|
|
43
|
+
client: 'client',
|
|
44
|
+
clientConfig: 'clientConfig',
|
|
45
|
+
createClient: 'createClient',
|
|
46
|
+
ttl: 'ttl',
|
|
47
|
+
logger: 'logger',
|
|
48
|
+
retry: 'retry',
|
|
49
|
+
readConcurrency: 'readConcurrency',
|
|
50
|
+
compression: 'compression',
|
|
51
|
+
s3: 's3',
|
|
52
|
+
serde: 'serde',
|
|
53
|
+
index: 'index',
|
|
54
|
+
vectorBackend: 'vectorBackend',
|
|
55
|
+
maxSearchCandidates: 'maxSearchCandidates',
|
|
56
|
+
maxScanItems: 'maxScanItems',
|
|
57
|
+
maxIterations: 'maxIterations',
|
|
58
|
+
vectorScoreDirection: 'vectorScoreDirection',
|
|
59
|
+
});
|
|
60
|
+
const INDEX_KEYS = (0, option_shape_js_1.allKeysOf)({
|
|
61
|
+
dims: 'dims',
|
|
62
|
+
embeddings: 'embeddings',
|
|
63
|
+
fields: 'fields',
|
|
64
|
+
});
|
|
65
|
+
function assertUsableIndex(index) {
|
|
66
|
+
if (index === undefined)
|
|
67
|
+
return;
|
|
68
|
+
(0, option_shape_js_1.assertShape)(index, INDEX_KEYS, 'index');
|
|
69
|
+
(0, collaborators_js_1.assertMembers)(index.embeddings, collaborators_js_1.EMBEDDINGS_MEMBERS, 'index.embeddings');
|
|
70
|
+
if (index.fields !== undefined)
|
|
71
|
+
(0, primitives_js_1.assertStringArray)(index.fields, 'index.fields');
|
|
72
|
+
}
|
|
73
|
+
function assertScoreDirection(direction) {
|
|
74
|
+
if (direction === undefined || vector_backend_js_1.VECTOR_SCORE_DIRECTIONS.includes(direction))
|
|
75
|
+
return;
|
|
76
|
+
throw (0, errors_js_1.validationError)(`vectorScoreDirection must be one of ${vector_backend_js_1.VECTOR_SCORE_DIRECTIONS.join(' | ')}; received ` +
|
|
77
|
+
`${JSON.stringify(direction)}, which would be left in the backend's own direction and ` +
|
|
78
|
+
'could rank a distance backend backwards', 'vectorScoreDirection');
|
|
79
|
+
}
|
|
80
|
+
function assertLimits(options) {
|
|
81
|
+
if (options.maxScanItems !== undefined) {
|
|
82
|
+
(0, primitives_js_1.assertInteger)(options.maxScanItems, 'maxScanItems', { min: 1, max: exports.MAX_SCAN_ITEMS });
|
|
83
|
+
}
|
|
84
|
+
if (options.maxSearchCandidates !== undefined) {
|
|
85
|
+
(0, primitives_js_1.assertInteger)(options.maxSearchCandidates, 'maxSearchCandidates', {
|
|
86
|
+
min: 1,
|
|
87
|
+
max: exports.MAX_SEARCH_CANDIDATES,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
if (options.maxIterations !== undefined && options.maxIterations !== Infinity) {
|
|
91
|
+
(0, primitives_js_1.assertInteger)(options.maxIterations, 'maxIterations', { min: 1 });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function assertStoreOptions(options) {
|
|
95
|
+
assertLimits(options);
|
|
96
|
+
if (options.vectorBackend && !options.index) {
|
|
97
|
+
throw (0, errors_js_1.validationError)('vectorBackend requires a configured `index` (embeddings); without one no embedding ' +
|
|
98
|
+
'is computed, every put would clear the item vector, and search would silently return ' +
|
|
99
|
+
'unranked, score-less results', 'vectorBackend');
|
|
100
|
+
}
|
|
101
|
+
assertUsableIndex(options.index);
|
|
102
|
+
assertScoreDirection(options.vectorScoreDirection);
|
|
103
|
+
}
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
* last. How far the read goes before it can stop is decided here.
|
|
9
9
|
*/
|
|
10
10
|
import type { Item, SearchItem } from '@langchain/langgraph-checkpoint';
|
|
11
|
-
import type { ParsedSearch } from './parse';
|
|
12
|
-
import type { StoreContext } from './setup';
|
|
11
|
+
import type { ParsedSearch } from './parse.js';
|
|
12
|
+
import type { StoreContext } from './setup.js';
|
|
13
13
|
/**
|
|
14
14
|
* How far a collection must go. A plain page is complete once `need`
|
|
15
15
|
* (`offset + limit`) matching items are in hand, so rows past it are never
|
|
@@ -40,9 +40,9 @@ export type CollectBound = {
|
|
|
40
40
|
*
|
|
41
41
|
* Throws: `VALIDATION` naming `maxSearchCandidates` before any decode when a
|
|
42
42
|
* semantic collection exceeds `cap`; `RESULT_TRUNCATED` when
|
|
43
|
-
* `maxScanItems` is reached while rows remain — a search
|
|
44
|
-
* from part of the table; `ABORTED` when the signal
|
|
45
|
-
* whatever a decode throws for a corrupt or unreadable row.
|
|
43
|
+
* `maxScanItems` or `maxIterations` is reached while rows remain — a search
|
|
44
|
+
* never silently answers from part of the table; `ABORTED` when the signal
|
|
45
|
+
* fires between pages; whatever a decode throws for a corrupt or unreadable row.
|
|
46
46
|
*
|
|
47
47
|
* Guarantees: a page closes the paginator as soon as it is full, so a namespace
|
|
48
48
|
* far larger than the page costs neither a full decode nor a truncation error.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectCandidates = collectCandidates;
|
|
4
|
+
exports.rankInMemory = rankInMemory;
|
|
5
|
+
const clock_js_1 = require("../../shared/clock.js");
|
|
6
|
+
const concurrency_js_1 = require("../../shared/concurrency.js");
|
|
7
|
+
const paginate_js_1 = require("../../shared/dynamodb/paginate.js");
|
|
8
|
+
const retry_js_1 = require("../../shared/dynamodb/retry.js");
|
|
9
|
+
const table_schema_js_1 = require("../../shared/dynamodb/table-schema.js");
|
|
10
|
+
const errors_js_1 = require("../../shared/errors/errors.js");
|
|
11
|
+
const filter_js_1 = require("./filter.js");
|
|
12
|
+
const get_item_js_1 = require("./get-item.js");
|
|
13
|
+
const rows_js_1 = require("./rows.js");
|
|
14
|
+
const semantic_search_js_1 = require("./semantic-search.js");
|
|
15
|
+
function storedVectors(record) {
|
|
16
|
+
if (record.embeddings)
|
|
17
|
+
return record.embeddings;
|
|
18
|
+
return record.embedding ? [record.embedding] : undefined;
|
|
19
|
+
}
|
|
20
|
+
function candidateSource(context, search, signal, now) {
|
|
21
|
+
return search.namespacePrefix.length > 0
|
|
22
|
+
? (0, paginate_js_1.paginateQuery)({
|
|
23
|
+
retry: (0, retry_js_1.retryFor)(context, signal),
|
|
24
|
+
signal,
|
|
25
|
+
client: context.client,
|
|
26
|
+
params: (0, table_schema_js_1.withoutExpired)((0, rows_js_1.scopedQuery)(context.tableName, search.namespacePrefix), now),
|
|
27
|
+
maxItems: context.maxScanItems,
|
|
28
|
+
maxIterations: context.maxIterations,
|
|
29
|
+
})
|
|
30
|
+
: (0, paginate_js_1.paginateScan)({
|
|
31
|
+
retry: (0, retry_js_1.retryFor)(context, signal),
|
|
32
|
+
signal,
|
|
33
|
+
client: context.client,
|
|
34
|
+
params: (0, table_schema_js_1.withoutExpired)((0, rows_js_1.storeScan)(context.tableName), now),
|
|
35
|
+
maxItems: context.maxScanItems,
|
|
36
|
+
maxIterations: context.maxIterations,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function liveRow(raw, search, now) {
|
|
40
|
+
const record = (0, rows_js_1.parseWholeStoreRow)(raw);
|
|
41
|
+
if (!record || (0, table_schema_js_1.isExpiredRow)(record, now))
|
|
42
|
+
return undefined;
|
|
43
|
+
return (0, rows_js_1.namespaceMatchesPrefix)(record.namespace, search.namespacePrefix) ? record : undefined;
|
|
44
|
+
}
|
|
45
|
+
async function flush(context, search, state, signal) {
|
|
46
|
+
if (state.pending.length === 0)
|
|
47
|
+
return;
|
|
48
|
+
const batch = state.pending;
|
|
49
|
+
state.pending = [];
|
|
50
|
+
const reads = await (0, concurrency_js_1.mapWithConcurrency)(batch, context.readConcurrency ?? concurrency_js_1.DEFAULT_READ_CONCURRENCY, (record) => (0, get_item_js_1.readCandidate)(context, record, signal));
|
|
51
|
+
for (const read of reads) {
|
|
52
|
+
if (read !== undefined && (0, filter_js_1.passesFilter)(read.item, search.filter)) {
|
|
53
|
+
state.collected.push({ item: read.item, embeddings: storedVectors(read.row) });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function batchSize(search, need, collected, limit) {
|
|
58
|
+
return search.filter === undefined ? Math.min(limit, need - collected) : limit;
|
|
59
|
+
}
|
|
60
|
+
function tooManyCandidates(count, cap) {
|
|
61
|
+
return (0, errors_js_1.validationError)(`Semantic search candidate set (${count}) exceeds maxSearchCandidates (${cap}); ` +
|
|
62
|
+
'use a dedicated VectorBackend for large corpora', 'maxSearchCandidates');
|
|
63
|
+
}
|
|
64
|
+
async function collectCandidates(context, search, bound, signal) {
|
|
65
|
+
const now = (0, clock_js_1.nowSeconds)();
|
|
66
|
+
const limit = context.readConcurrency ?? concurrency_js_1.DEFAULT_READ_CONCURRENCY;
|
|
67
|
+
const state = { pending: [], collected: [] };
|
|
68
|
+
for await (const raw of candidateSource(context, search, signal, now)) {
|
|
69
|
+
const record = liveRow(raw, search, now);
|
|
70
|
+
if (!record)
|
|
71
|
+
continue;
|
|
72
|
+
state.pending.push(record);
|
|
73
|
+
if (bound.kind === 'semantic') {
|
|
74
|
+
if (state.pending.length > bound.cap)
|
|
75
|
+
throw tooManyCandidates(state.pending.length, bound.cap);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (state.pending.length < batchSize(search, bound.need, state.collected.length, limit)) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
await flush(context, search, state, signal);
|
|
82
|
+
if (state.collected.length >= bound.need)
|
|
83
|
+
return state.collected;
|
|
84
|
+
}
|
|
85
|
+
await flush(context, search, state, signal);
|
|
86
|
+
return state.collected;
|
|
87
|
+
}
|
|
88
|
+
const UNSCORED_RANK = -2;
|
|
89
|
+
function bestScore(vectors, queryVector) {
|
|
90
|
+
let best;
|
|
91
|
+
for (const vector of vectors) {
|
|
92
|
+
if (vector.length !== queryVector.length)
|
|
93
|
+
continue;
|
|
94
|
+
const score = (0, semantic_search_js_1.cosineSimilarity)(queryVector, vector);
|
|
95
|
+
if (best === undefined || score > best)
|
|
96
|
+
best = score;
|
|
97
|
+
}
|
|
98
|
+
return best;
|
|
99
|
+
}
|
|
100
|
+
function isDimensionMismatch(candidate, queryVector) {
|
|
101
|
+
const vectors = candidate.embeddings;
|
|
102
|
+
return (vectors !== undefined &&
|
|
103
|
+
vectors.length > 0 &&
|
|
104
|
+
vectors.every((vector) => vector.length !== queryVector.length));
|
|
105
|
+
}
|
|
106
|
+
function rankInMemory(candidates, queryVector, maxCandidates, onDimensionMismatch) {
|
|
107
|
+
if (candidates.length > maxCandidates) {
|
|
108
|
+
throw (0, errors_js_1.validationError)(`Semantic search candidate set (${candidates.length}) exceeds maxSearchCandidates ` +
|
|
109
|
+
`(${maxCandidates}); use a dedicated VectorBackend for large corpora`, 'maxSearchCandidates');
|
|
110
|
+
}
|
|
111
|
+
const mismatched = candidates.filter((candidate) => isDimensionMismatch(candidate, queryVector)).length;
|
|
112
|
+
if (mismatched > 0)
|
|
113
|
+
onDimensionMismatch?.(mismatched);
|
|
114
|
+
return candidates
|
|
115
|
+
.map(({ item, embeddings }) => ({
|
|
116
|
+
...item,
|
|
117
|
+
score: embeddings ? bestScore(embeddings, queryVector) : undefined,
|
|
118
|
+
}))
|
|
119
|
+
.sort((a, b) => rankValue(b) - rankValue(a));
|
|
120
|
+
}
|
|
121
|
+
function rankValue(item) {
|
|
122
|
+
return item.score ?? UNSCORED_RANK;
|
|
123
|
+
}
|