@farukada/aws-langgraph-dynamodb-ts 1.0.0-rc.1 → 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 +1820 -290
- package/dist/cjs/backfill/backfill.d.ts +171 -0
- package/dist/cjs/backfill/backfill.js +177 -0
- package/dist/cjs/checkpointer/actions/delete-thread.d.ts +50 -0
- package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
- package/dist/cjs/checkpointer/actions/get-tuple.d.ts +36 -0
- package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
- package/dist/cjs/checkpointer/actions/list.d.ts +55 -0
- package/dist/cjs/checkpointer/actions/list.js +70 -0
- package/dist/cjs/checkpointer/actions/put-writes.d.ts +49 -0
- package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
- package/dist/cjs/checkpointer/actions/put.d.ts +95 -0
- package/dist/cjs/checkpointer/actions/put.js +79 -0
- package/dist/cjs/checkpointer/internal/delta-history.d.ts +124 -0
- package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
- package/dist/cjs/checkpointer/internal/listing.d.ts +149 -0
- package/dist/cjs/checkpointer/internal/listing.js +104 -0
- package/dist/cjs/checkpointer/internal/parse.d.ts +298 -0
- package/dist/cjs/checkpointer/internal/parse.js +184 -0
- package/dist/cjs/checkpointer/internal/pending-writes.d.ts +314 -0
- package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
- package/dist/cjs/checkpointer/internal/read.d.ts +135 -0
- package/dist/cjs/checkpointer/internal/read.js +132 -0
- package/dist/cjs/checkpointer/internal/rows.d.ts +644 -0
- package/dist/cjs/checkpointer/internal/rows.js +356 -0
- package/dist/cjs/checkpointer/internal/setup.d.ts +47 -0
- package/dist/cjs/checkpointer/internal/setup.js +25 -0
- package/dist/cjs/checkpointer/saver.d.ts +306 -0
- package/dist/cjs/checkpointer/saver.js +56 -0
- package/dist/cjs/checkpointer/types.d.ts +51 -0
- package/dist/cjs/factory/factory.d.ts +154 -0
- package/dist/cjs/factory/factory.js +137 -0
- package/dist/{factory → cjs/factory}/types.d.ts +33 -14
- package/dist/cjs/history/actions/add-messages.d.ts +51 -0
- package/dist/cjs/history/actions/add-messages.js +17 -0
- package/dist/cjs/history/actions/clear.d.ts +52 -0
- package/dist/cjs/history/actions/clear.js +29 -0
- package/dist/cjs/history/actions/get-messages.d.ts +60 -0
- package/dist/cjs/history/actions/get-messages.js +58 -0
- package/dist/cjs/history/actions/list-sessions.d.ts +55 -0
- package/dist/cjs/history/actions/list-sessions.js +67 -0
- package/dist/cjs/history/actions/reconcile-count.d.ts +49 -0
- package/dist/cjs/history/actions/reconcile-count.js +8 -0
- package/dist/cjs/history/chat-message-history.d.ts +267 -0
- package/dist/cjs/history/chat-message-history.js +61 -0
- package/dist/cjs/history/internal/append.d.ts +244 -0
- package/dist/cjs/history/internal/append.js +267 -0
- package/dist/cjs/history/internal/message-read.d.ts +84 -0
- package/dist/cjs/history/internal/message-read.js +93 -0
- package/dist/cjs/history/internal/parse.d.ts +153 -0
- package/dist/cjs/history/internal/parse.js +113 -0
- package/dist/cjs/history/internal/rows.d.ts +196 -0
- package/dist/cjs/history/internal/rows.js +96 -0
- package/dist/cjs/history/internal/session.d.ts +350 -0
- package/dist/cjs/history/internal/session.js +296 -0
- package/dist/cjs/history/internal/setup.d.ts +64 -0
- package/dist/cjs/history/internal/setup.js +60 -0
- package/dist/cjs/history/session-adapter.d.ts +112 -0
- package/dist/cjs/history/session-adapter.js +38 -0
- package/dist/cjs/history/types.d.ts +102 -0
- package/dist/cjs/index.d.ts +53 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/shared/adapter.d.ts +146 -0
- package/dist/cjs/shared/adapter.js +70 -0
- package/dist/cjs/shared/clock.d.ts +52 -0
- package/dist/cjs/shared/clock.js +14 -0
- package/dist/cjs/shared/codec/codec.d.ts +336 -0
- package/dist/cjs/shared/codec/codec.js +162 -0
- package/dist/cjs/shared/codec/compression.d.ts +66 -0
- package/dist/cjs/shared/codec/compression.js +45 -0
- package/dist/cjs/shared/codec/json-serde.d.ts +80 -0
- package/dist/cjs/shared/codec/json-serde.js +58 -0
- package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +22 -2
- package/dist/{shared → cjs/shared}/codec/s3/client-types.js +0 -1
- package/dist/cjs/shared/codec/s3/client.d.ts +63 -0
- package/dist/cjs/shared/codec/s3/client.js +78 -0
- package/dist/cjs/shared/codec/s3/config.d.ts +260 -0
- package/dist/cjs/shared/codec/s3/config.js +92 -0
- package/dist/cjs/shared/codec/s3/lifecycle.d.ts +220 -0
- package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
- package/dist/cjs/shared/codec/s3/offloader.d.ts +428 -0
- package/dist/cjs/shared/codec/s3/offloader.js +289 -0
- package/dist/cjs/shared/concurrency.d.ts +43 -0
- package/dist/{shared → cjs/shared}/concurrency.js +10 -9
- package/dist/cjs/shared/dynamodb/abort.d.ts +47 -0
- package/dist/cjs/shared/dynamodb/abort.js +16 -0
- package/dist/cjs/shared/dynamodb/batch-write.d.ts +86 -0
- package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
- package/dist/cjs/shared/dynamodb/cancellation.d.ts +124 -0
- package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
- package/dist/cjs/shared/dynamodb/client.d.ts +177 -0
- package/dist/{shared → cjs/shared}/dynamodb/client.js +12 -14
- package/dist/cjs/shared/dynamodb/idempotent-write.d.ts +596 -0
- package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
- package/dist/cjs/shared/dynamodb/paginate.d.ts +111 -0
- package/dist/cjs/shared/dynamodb/paginate.js +90 -0
- package/dist/cjs/shared/dynamodb/partition-delete.d.ts +204 -0
- package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
- package/dist/cjs/shared/dynamodb/recency-index.d.ts +243 -0
- package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
- package/dist/cjs/shared/dynamodb/retry.d.ts +317 -0
- 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/cjs/shared/dynamodb/table-schema.d.ts +199 -0
- package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
- package/dist/cjs/shared/errors/base-error.d.ts +231 -0
- package/dist/cjs/shared/errors/base-error.js +73 -0
- package/dist/cjs/shared/errors/boundary.d.ts +86 -0
- 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/cjs/shared/errors/error-code.d.ts +95 -0
- package/dist/{shared → cjs/shared}/errors/error-code.js +12 -2
- package/dist/cjs/shared/errors/errors.d.ts +233 -0
- package/dist/cjs/shared/errors/errors.js +123 -0
- package/dist/cjs/shared/logging/logger.d.ts +80 -0
- package/dist/cjs/shared/logging/logger.js +30 -0
- package/dist/cjs/shared/logging/redaction.d.ts +123 -0
- package/dist/cjs/shared/logging/redaction.js +145 -0
- package/dist/cjs/shared/logging/secret-patterns.d.ts +227 -0
- package/dist/cjs/shared/logging/secret-patterns.js +93 -0
- package/dist/cjs/shared/logging/truncate.d.ts +197 -0
- package/dist/cjs/shared/logging/truncate.js +31 -0
- package/dist/cjs/shared/options.d.ts +100 -0
- package/dist/cjs/shared/ulid.d.ts +80 -0
- package/dist/{shared → cjs/shared}/ulid.js +7 -21
- package/dist/cjs/shared/validation/collaborators.d.ts +160 -0
- package/dist/cjs/shared/validation/collaborators.js +79 -0
- package/dist/cjs/shared/validation/option-shape.d.ts +91 -0
- package/dist/cjs/shared/validation/option-shape.js +31 -0
- package/dist/cjs/shared/validation/options.d.ts +145 -0
- package/dist/cjs/shared/validation/options.js +166 -0
- package/dist/cjs/shared/validation/primitives.d.ts +292 -0
- package/dist/cjs/shared/validation/primitives.js +114 -0
- package/dist/cjs/shared/validation/ttl.d.ts +94 -0
- package/dist/cjs/shared/validation/ttl.js +52 -0
- package/dist/cjs/store/actions/list-namespaces.d.ts +79 -0
- package/dist/cjs/store/actions/list-namespaces.js +92 -0
- package/dist/cjs/store/actions/put.d.ts +43 -0
- package/dist/cjs/store/actions/put.js +49 -0
- package/dist/cjs/store/actions/reconcile-vector-index.d.ts +38 -0
- package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
- package/dist/cjs/store/actions/search.d.ts +38 -0
- 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/cjs/store/internal/filter.d.ts +43 -0
- 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/cjs/store/internal/item-write.d.ts +270 -0
- package/dist/cjs/store/internal/item-write.js +181 -0
- package/dist/cjs/store/internal/parse.d.ts +230 -0
- package/dist/cjs/store/internal/parse.js +180 -0
- package/dist/cjs/store/internal/rows.d.ts +359 -0
- package/dist/cjs/store/internal/rows.js +166 -0
- package/dist/cjs/store/internal/semantic-search.d.ts +168 -0
- package/dist/{store/internal/text-path.js → cjs/store/internal/semantic-search.js} +92 -28
- package/dist/cjs/store/internal/setup.d.ts +96 -0
- package/dist/cjs/store/internal/setup.js +103 -0
- package/dist/cjs/store/internal/table-search.d.ts +100 -0
- package/dist/cjs/store/internal/table-search.js +123 -0
- package/dist/cjs/store/internal/vector-index.d.ts +258 -0
- package/dist/cjs/store/internal/vector-index.js +269 -0
- package/dist/cjs/store/store.d.ts +329 -0
- package/dist/cjs/store/store.js +97 -0
- package/dist/cjs/store/types.d.ts +111 -0
- package/dist/cjs/store/vector-backend.d.ts +104 -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/esm/checkpointer/actions/delete-thread.d.ts +50 -0
- package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
- package/dist/esm/checkpointer/actions/get-tuple.d.ts +36 -0
- 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/esm/checkpointer/actions/put-writes.d.ts +49 -0
- 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/esm/checkpointer/internal/listing.d.ts +149 -0
- 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/esm/checkpointer/saver.d.ts +306 -0
- 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/esm/history/actions/add-messages.d.ts +51 -0
- package/dist/esm/history/actions/add-messages.js +14 -0
- package/dist/esm/history/actions/clear.d.ts +52 -0
- 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/esm/history/actions/reconcile-count.d.ts +49 -0
- package/dist/esm/history/actions/reconcile-count.js +5 -0
- package/dist/esm/history/chat-message-history.d.ts +267 -0
- 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/esm/history/internal/rows.d.ts +196 -0
- 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/esm/history/session-adapter.d.ts +112 -0
- 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/esm/shared/clock.d.ts +52 -0
- 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/esm/shared/codec/s3/config.d.ts +260 -0
- 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/esm/shared/concurrency.d.ts +43 -0
- package/dist/esm/shared/concurrency.js +27 -0
- package/dist/esm/shared/dynamodb/abort.d.ts +47 -0
- 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/esm/shared/dynamodb/cancellation.d.ts +124 -0
- package/dist/esm/shared/dynamodb/cancellation.js +30 -0
- package/dist/esm/shared/dynamodb/client.d.ts +177 -0
- package/dist/esm/shared/dynamodb/client.js +35 -0
- package/dist/esm/shared/dynamodb/idempotent-write.d.ts +596 -0
- 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/esm/shared/dynamodb/table-schema.d.ts +199 -0
- 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/esm/shared/errors/error-code.d.ts +95 -0
- package/dist/esm/shared/errors/error-code.js +24 -0
- package/dist/esm/shared/errors/errors.d.ts +233 -0
- package/dist/esm/shared/errors/errors.js +110 -0
- package/dist/esm/shared/logging/logger.d.ts +80 -0
- 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/esm/shared/logging/secret-patterns.d.ts +227 -0
- package/dist/esm/shared/logging/secret-patterns.js +83 -0
- package/dist/esm/shared/logging/truncate.d.ts +197 -0
- 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/esm/shared/ulid.d.ts +80 -0
- package/dist/esm/shared/ulid.js +77 -0
- package/dist/esm/shared/validation/collaborators.d.ts +160 -0
- package/dist/esm/shared/validation/collaborators.js +70 -0
- package/dist/esm/shared/validation/option-shape.d.ts +91 -0
- 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/esm/shared/validation/primitives.d.ts +292 -0
- 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/esm/store/actions/reconcile-vector-index.d.ts +38 -0
- 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/esm/store/internal/rows.d.ts +359 -0
- 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/esm/store/store.d.ts +329 -0
- 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 +68 -46
- package/dist/checkpointer/actions/delete-thread.d.ts +0 -10
- package/dist/checkpointer/actions/delete-thread.js +0 -38
- package/dist/checkpointer/actions/get-tuple.d.ts +0 -11
- package/dist/checkpointer/actions/get-tuple.js +0 -25
- package/dist/checkpointer/actions/list.d.ts +0 -20
- package/dist/checkpointer/actions/list.js +0 -113
- package/dist/checkpointer/actions/put-writes.d.ts +0 -15
- package/dist/checkpointer/actions/put-writes.js +0 -62
- package/dist/checkpointer/actions/put.d.ts +0 -17
- package/dist/checkpointer/actions/put.js +0 -73
- package/dist/checkpointer/internal/assemble.d.ts +0 -17
- package/dist/checkpointer/internal/assemble.js +0 -38
- package/dist/checkpointer/internal/checkpoint-write-verify.d.ts +0 -24
- package/dist/checkpointer/internal/checkpoint-write-verify.js +0 -67
- package/dist/checkpointer/internal/configurable.d.ts +0 -12
- package/dist/checkpointer/internal/configurable.js +0 -24
- package/dist/checkpointer/internal/fetch.d.ts +0 -19
- package/dist/checkpointer/internal/fetch.js +0 -88
- package/dist/checkpointer/internal/filter-match.d.ts +0 -13
- package/dist/checkpointer/internal/filter-match.js +0 -15
- package/dist/checkpointer/internal/item-reader.d.ts +0 -66
- package/dist/checkpointer/internal/item-reader.js +0 -113
- package/dist/checkpointer/internal/item-writer.d.ts +0 -35
- package/dist/checkpointer/internal/item-writer.js +0 -107
- package/dist/checkpointer/internal/keys.d.ts +0 -41
- package/dist/checkpointer/internal/keys.js +0 -117
- package/dist/checkpointer/internal/list-scope.d.ts +0 -61
- package/dist/checkpointer/internal/list-scope.js +0 -108
- package/dist/checkpointer/internal/pending-sends.d.ts +0 -13
- package/dist/checkpointer/internal/pending-sends.js +0 -29
- package/dist/checkpointer/internal/query.d.ts +0 -21
- package/dist/checkpointer/internal/query.js +0 -42
- package/dist/checkpointer/internal/regular-write.d.ts +0 -28
- package/dist/checkpointer/internal/regular-write.js +0 -66
- package/dist/checkpointer/internal/setup.d.ts +0 -33
- package/dist/checkpointer/internal/setup.js +0 -38
- package/dist/checkpointer/internal/special-write-cas.d.ts +0 -29
- package/dist/checkpointer/internal/special-write-cas.js +0 -104
- package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -23
- package/dist/checkpointer/internal/special-write-cleanup.js +0 -50
- package/dist/checkpointer/internal/special-write-verify.d.ts +0 -53
- package/dist/checkpointer/internal/special-write-verify.js +0 -80
- package/dist/checkpointer/internal/stored-channels.d.ts +0 -31
- package/dist/checkpointer/internal/stored-channels.js +0 -70
- package/dist/checkpointer/internal/validation.d.ts +0 -18
- package/dist/checkpointer/internal/validation.js +0 -40
- package/dist/checkpointer/internal/write-guard.d.ts +0 -20
- package/dist/checkpointer/internal/write-guard.js +0 -48
- package/dist/checkpointer/internal/write-index.d.ts +0 -36
- package/dist/checkpointer/internal/write-index.js +0 -41
- package/dist/checkpointer/saver.d.ts +0 -70
- package/dist/checkpointer/saver.js +0 -105
- package/dist/checkpointer/types.d.ts +0 -58
- package/dist/factory/factory.d.ts +0 -40
- package/dist/factory/factory.js +0 -87
- package/dist/history/actions/add-messages.d.ts +0 -15
- package/dist/history/actions/add-messages.js +0 -77
- package/dist/history/actions/clear.d.ts +0 -10
- package/dist/history/actions/clear.js +0 -34
- package/dist/history/actions/get-messages.d.ts +0 -17
- package/dist/history/actions/get-messages.js +0 -79
- package/dist/history/actions/list-sessions.d.ts +0 -13
- package/dist/history/actions/list-sessions.js +0 -53
- package/dist/history/actions/reconcile-count.d.ts +0 -12
- package/dist/history/actions/reconcile-count.js +0 -64
- package/dist/history/chat-message-history.d.ts +0 -73
- package/dist/history/chat-message-history.js +0 -111
- package/dist/history/internal/append-saga.d.ts +0 -25
- package/dist/history/internal/append-saga.js +0 -79
- package/dist/history/internal/compensation.d.ts +0 -25
- package/dist/history/internal/compensation.js +0 -92
- package/dist/history/internal/item-mapper.d.ts +0 -9
- package/dist/history/internal/item-mapper.js +0 -27
- package/dist/history/internal/keys.d.ts +0 -16
- package/dist/history/internal/keys.js +0 -48
- package/dist/history/internal/message-chunker.d.ts +0 -13
- package/dist/history/internal/message-chunker.js +0 -67
- package/dist/history/internal/message-transaction.d.ts +0 -25
- package/dist/history/internal/message-transaction.js +0 -61
- package/dist/history/internal/message-window.d.ts +0 -17
- package/dist/history/internal/message-window.js +0 -49
- package/dist/history/internal/query.d.ts +0 -23
- package/dist/history/internal/query.js +0 -39
- package/dist/history/internal/session-count.d.ts +0 -47
- package/dist/history/internal/session-count.js +0 -115
- package/dist/history/internal/session-title.d.ts +0 -19
- package/dist/history/internal/session-title.js +0 -43
- package/dist/history/internal/session-update.d.ts +0 -27
- package/dist/history/internal/session-update.js +0 -69
- package/dist/history/internal/setup.d.ts +0 -31
- package/dist/history/internal/setup.js +0 -43
- package/dist/history/internal/title-generator.d.ts +0 -12
- package/dist/history/internal/title-generator.js +0 -41
- package/dist/history/internal/ttl-anchor.d.ts +0 -24
- package/dist/history/internal/ttl-anchor.js +0 -38
- package/dist/history/internal/validation.d.ts +0 -25
- package/dist/history/internal/validation.js +0 -53
- package/dist/history/session-adapter.d.ts +0 -29
- package/dist/history/session-adapter.js +0 -35
- package/dist/history/types.d.ts +0 -69
- package/dist/index.d.ts +0 -29
- package/dist/index.js +0 -32
- package/dist/shared/clock.d.ts +0 -8
- package/dist/shared/clock.js +0 -16
- package/dist/shared/codec/codec.d.ts +0 -53
- package/dist/shared/codec/codec.js +0 -66
- package/dist/shared/codec/compression.d.ts +0 -24
- package/dist/shared/codec/compression.js +0 -48
- package/dist/shared/codec/descriptor-keys.d.ts +0 -12
- package/dist/shared/codec/descriptor-keys.js +0 -14
- package/dist/shared/codec/encode.d.ts +0 -13
- package/dist/shared/codec/encode.js +0 -43
- package/dist/shared/codec/json-serde.d.ts +0 -7
- package/dist/shared/codec/json-serde.js +0 -17
- package/dist/shared/codec/payload-loss.d.ts +0 -12
- package/dist/shared/codec/payload-loss.js +0 -38
- package/dist/shared/codec/s3/adapter-config.d.ts +0 -13
- package/dist/shared/codec/s3/adapter-config.js +0 -22
- package/dist/shared/codec/s3/bounded-body.d.ts +0 -14
- package/dist/shared/codec/s3/bounded-body.js +0 -47
- package/dist/shared/codec/s3/client.d.ts +0 -18
- package/dist/shared/codec/s3/client.js +0 -46
- package/dist/shared/codec/s3/config.d.ts +0 -51
- package/dist/shared/codec/s3/config.js +0 -58
- package/dist/shared/codec/s3/delete.d.ts +0 -7
- package/dist/shared/codec/s3/delete.js +0 -28
- package/dist/shared/codec/s3/key-scope.d.ts +0 -23
- package/dist/shared/codec/s3/key-scope.js +0 -44
- package/dist/shared/codec/s3/lifecycle.d.ts +0 -14
- package/dist/shared/codec/s3/lifecycle.js +0 -63
- package/dist/shared/codec/s3/offloader.d.ts +0 -44
- package/dist/shared/codec/s3/offloader.js +0 -118
- package/dist/shared/codec/s3/orphans.d.ts +0 -23
- package/dist/shared/codec/s3/orphans.js +0 -71
- package/dist/shared/codec/s3/read-write.d.ts +0 -18
- package/dist/shared/codec/s3/read-write.js +0 -51
- package/dist/shared/codec/s3/retry.d.ts +0 -5
- package/dist/shared/codec/s3/retry.js +0 -22
- package/dist/shared/concurrency.d.ts +0 -6
- package/dist/shared/constants.d.ts +0 -112
- package/dist/shared/constants.js +0 -115
- package/dist/shared/dynamodb/abort.d.ts +0 -9
- package/dist/shared/dynamodb/abort.js +0 -27
- package/dist/shared/dynamodb/backoff.d.ts +0 -15
- package/dist/shared/dynamodb/backoff.js +0 -48
- package/dist/shared/dynamodb/batch-write.d.ts +0 -22
- package/dist/shared/dynamodb/batch-write.js +0 -53
- package/dist/shared/dynamodb/cancellation.d.ts +0 -6
- package/dist/shared/dynamodb/cancellation.js +0 -7
- package/dist/shared/dynamodb/client.d.ts +0 -28
- package/dist/shared/dynamodb/conditional-put.d.ts +0 -67
- package/dist/shared/dynamodb/conditional-put.js +0 -76
- package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -21
- package/dist/shared/dynamodb/drain-unprocessed.js +0 -43
- package/dist/shared/dynamodb/expiry.d.ts +0 -16
- package/dist/shared/dynamodb/expiry.js +0 -29
- package/dist/shared/dynamodb/paginate-core.d.ts +0 -24
- package/dist/shared/dynamodb/paginate-core.js +0 -82
- package/dist/shared/dynamodb/paginate.d.ts +0 -14
- package/dist/shared/dynamodb/paginate.js +0 -19
- package/dist/shared/dynamodb/partition-delete.d.ts +0 -39
- package/dist/shared/dynamodb/partition-delete.js +0 -71
- package/dist/shared/dynamodb/retry-classifier.d.ts +0 -17
- package/dist/shared/dynamodb/retry-classifier.js +0 -118
- package/dist/shared/dynamodb/retry-policy.d.ts +0 -26
- package/dist/shared/dynamodb/retry-policy.js +0 -22
- package/dist/shared/dynamodb/retry.d.ts +0 -31
- package/dist/shared/dynamodb/retry.js +0 -57
- package/dist/shared/dynamodb/scan.d.ts +0 -14
- package/dist/shared/dynamodb/scan.js +0 -19
- package/dist/shared/dynamodb/types.d.ts +0 -23
- package/dist/shared/errors/base-error.d.ts +0 -30
- package/dist/shared/errors/base-error.js +0 -27
- package/dist/shared/errors/boundary.d.ts +0 -18
- package/dist/shared/errors/boundary.js +0 -46
- package/dist/shared/errors/error-code.d.ts +0 -13
- package/dist/shared/errors/errors.d.ts +0 -68
- package/dist/shared/errors/errors.js +0 -114
- package/dist/shared/errors/upstream-error.d.ts +0 -16
- package/dist/shared/errors/upstream-error.js +0 -27
- package/dist/shared/errors/wrap-error.d.ts +0 -7
- package/dist/shared/errors/wrap-error.js +0 -15
- package/dist/shared/logging/logger.d.ts +0 -18
- package/dist/shared/logging/logger.js +0 -15
- package/dist/shared/logging/redaction-walk.d.ts +0 -23
- package/dist/shared/logging/redaction-walk.js +0 -112
- package/dist/shared/logging/redaction.d.ts +0 -39
- package/dist/shared/logging/redaction.js +0 -75
- package/dist/shared/logging/secret-patterns.d.ts +0 -92
- package/dist/shared/logging/secret-patterns.js +0 -133
- package/dist/shared/options.d.ts +0 -37
- package/dist/shared/ulid.d.ts +0 -23
- package/dist/shared/validation/options.d.ts +0 -8
- package/dist/shared/validation/options.js +0 -90
- package/dist/shared/validation/primitives.d.ts +0 -29
- package/dist/shared/validation/primitives.js +0 -82
- package/dist/shared/validation/ttl.d.ts +0 -28
- package/dist/shared/validation/ttl.js +0 -52
- package/dist/store/actions/get.d.ts +0 -13
- package/dist/store/actions/get.js +0 -73
- package/dist/store/actions/list-namespaces.d.ts +0 -8
- package/dist/store/actions/list-namespaces.js +0 -59
- package/dist/store/actions/put.d.ts +0 -10
- package/dist/store/actions/put.js +0 -96
- package/dist/store/actions/reconcile-vector-index.d.ts +0 -18
- package/dist/store/actions/reconcile-vector-index.js +0 -26
- package/dist/store/actions/search.d.ts +0 -9
- package/dist/store/actions/search.js +0 -34
- package/dist/store/internal/backend-search.d.ts +0 -4
- package/dist/store/internal/backend-search.js +0 -74
- package/dist/store/internal/batch-plan.d.ts +0 -11
- package/dist/store/internal/batch-plan.js +0 -52
- package/dist/store/internal/candidates.d.ts +0 -23
- package/dist/store/internal/candidates.js +0 -94
- package/dist/store/internal/filter.d.ts +0 -9
- package/dist/store/internal/filter.js +0 -85
- package/dist/store/internal/index-reconcile.d.ts +0 -21
- package/dist/store/internal/index-reconcile.js +0 -118
- package/dist/store/internal/index-sync.d.ts +0 -10
- package/dist/store/internal/index-sync.js +0 -25
- package/dist/store/internal/item-mapper.d.ts +0 -27
- package/dist/store/internal/item-mapper.js +0 -61
- package/dist/store/internal/keys.d.ts +0 -17
- package/dist/store/internal/keys.js +0 -41
- package/dist/store/internal/namespace-match.d.ts +0 -11
- package/dist/store/internal/namespace-match.js +0 -40
- package/dist/store/internal/option-validation.d.ts +0 -13
- package/dist/store/internal/option-validation.js +0 -77
- package/dist/store/internal/overwrite-swap.d.ts +0 -32
- package/dist/store/internal/overwrite-swap.js +0 -68
- package/dist/store/internal/persist.d.ts +0 -28
- package/dist/store/internal/persist.js +0 -64
- package/dist/store/internal/query.d.ts +0 -11
- package/dist/store/internal/query.js +0 -48
- package/dist/store/internal/ranker.d.ts +0 -18
- package/dist/store/internal/ranker.js +0 -39
- package/dist/store/internal/read-existing.d.ts +0 -23
- package/dist/store/internal/read-existing.js +0 -41
- package/dist/store/internal/score-direction.d.ts +0 -31
- package/dist/store/internal/score-direction.js +0 -38
- package/dist/store/internal/search-filter.d.ts +0 -3
- package/dist/store/internal/search-filter.js +0 -10
- package/dist/store/internal/semantic-search.d.ts +0 -34
- package/dist/store/internal/semantic-search.js +0 -87
- package/dist/store/internal/setup.d.ts +0 -36
- package/dist/store/internal/setup.js +0 -40
- package/dist/store/internal/text-path.d.ts +0 -17
- package/dist/store/internal/validation.d.ts +0 -18
- package/dist/store/internal/validation.js +0 -51
- package/dist/store/internal/write-verify.d.ts +0 -42
- package/dist/store/internal/write-verify.js +0 -71
- package/dist/store/store.d.ts +0 -61
- package/dist/store/store.js +0 -107
- package/dist/store/types.d.ts +0 -50
- package/dist/store/types.js +0 -2
- package/dist/store/vector-backend.d.ts +0 -43
- package/dist/store/vector-backend.js +0 -2
- /package/dist/{checkpointer → cjs/checkpointer}/types.js +0 -0
- /package/dist/{factory → cjs/factory}/types.js +0 -0
- /package/dist/{history → cjs/history}/types.js +0 -0
- /package/dist/{shared → cjs/shared}/options.js +0 -0
- /package/dist/{shared/dynamodb → cjs/store}/types.js +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_PAGE_LIMIT = void 0;
|
|
4
|
+
exports.parseString = parseString;
|
|
5
|
+
exports.assertNonEmptyString = assertNonEmptyString;
|
|
6
|
+
exports.parseInteger = parseInteger;
|
|
7
|
+
exports.assertInteger = assertInteger;
|
|
8
|
+
exports.parseLimit = parseLimit;
|
|
9
|
+
exports.parseStringArray = parseStringArray;
|
|
10
|
+
exports.assertStringArray = assertStringArray;
|
|
11
|
+
exports.assertNoControlChars = assertNoControlChars;
|
|
12
|
+
exports.assertWellFormed = assertWellFormed;
|
|
13
|
+
exports.parseKeySegment = parseKeySegment;
|
|
14
|
+
exports.parseIdentifier = parseIdentifier;
|
|
15
|
+
const errors_js_1 = require("../errors/errors.js");
|
|
16
|
+
exports.MAX_PAGE_LIMIT = 10_000;
|
|
17
|
+
function parseString(value, field) {
|
|
18
|
+
if (typeof value !== 'string') {
|
|
19
|
+
throw (0, errors_js_1.validationError)(`${field} must be a string`, field);
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
function parseNonBlankString(value, field) {
|
|
24
|
+
const text = parseString(value, field);
|
|
25
|
+
if (text.trim().length === 0) {
|
|
26
|
+
throw (0, errors_js_1.validationError)(`${field} must be a non-empty string (whitespace-only counts as empty)`, field);
|
|
27
|
+
}
|
|
28
|
+
return text;
|
|
29
|
+
}
|
|
30
|
+
function assertNonEmptyString(value, field) {
|
|
31
|
+
parseNonBlankString(value, field);
|
|
32
|
+
}
|
|
33
|
+
function assertMaxBytes(value, field, maxBytes) {
|
|
34
|
+
parseString(value, field);
|
|
35
|
+
const bytes = Buffer.byteLength(value, 'utf8');
|
|
36
|
+
if (bytes > maxBytes) {
|
|
37
|
+
throw (0, errors_js_1.validationError)(`${field} must be at most ${maxBytes} bytes of UTF-8 (received ${bytes})`, field);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function parseInteger(value, field, bounds = {}) {
|
|
41
|
+
if (typeof value !== 'number' || !Number.isInteger(value)) {
|
|
42
|
+
throw (0, errors_js_1.validationError)(`${field} must be an integer`, field);
|
|
43
|
+
}
|
|
44
|
+
if (bounds.min !== undefined && value < bounds.min) {
|
|
45
|
+
throw (0, errors_js_1.validationError)(`${field} must be >= ${bounds.min}`, field);
|
|
46
|
+
}
|
|
47
|
+
if (bounds.max !== undefined && value > bounds.max) {
|
|
48
|
+
throw (0, errors_js_1.validationError)(`${field} must be <= ${bounds.max}`, field);
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
function assertInteger(value, field, bounds = {}) {
|
|
53
|
+
parseInteger(value, field, bounds);
|
|
54
|
+
}
|
|
55
|
+
function parseLimit(value, min) {
|
|
56
|
+
return parseInteger(value, 'limit', { min, max: exports.MAX_PAGE_LIMIT });
|
|
57
|
+
}
|
|
58
|
+
function parseStringElement(item, field, index) {
|
|
59
|
+
if (typeof item !== 'string') {
|
|
60
|
+
throw (0, errors_js_1.validationError)(`${field}[${index}] must be a string`, field);
|
|
61
|
+
}
|
|
62
|
+
return item;
|
|
63
|
+
}
|
|
64
|
+
function parseStringArray(value, field) {
|
|
65
|
+
if (!Array.isArray(value)) {
|
|
66
|
+
throw (0, errors_js_1.validationError)(`${field} must be an array of strings`, field);
|
|
67
|
+
}
|
|
68
|
+
const result = [];
|
|
69
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
70
|
+
result.push(parseStringElement(value[index], field, index));
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
function assertStringArray(value, field) {
|
|
75
|
+
parseStringArray(value, field);
|
|
76
|
+
}
|
|
77
|
+
function hasControlChar(value) {
|
|
78
|
+
for (let i = 0; i < value.length; i++) {
|
|
79
|
+
const code = value.charCodeAt(i);
|
|
80
|
+
if (code <= 0x1f || (code >= 0x7f && code <= 0x9f))
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
function assertNoControlChars(value, field) {
|
|
86
|
+
parseString(value, field);
|
|
87
|
+
if (hasControlChar(value)) {
|
|
88
|
+
throw (0, errors_js_1.validationError)(`${field} must not contain control characters`, field);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function assertWellFormed(value, field) {
|
|
92
|
+
parseString(value, field);
|
|
93
|
+
if (!value.isWellFormed()) {
|
|
94
|
+
throw (0, errors_js_1.validationError)(`${field} must be well-formed UTF-16 (it contains an unpaired surrogate, which does not ` +
|
|
95
|
+
'survive encoding to UTF-8)', field);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function assertNoSeparator(value, separator, field) {
|
|
99
|
+
parseString(value, field);
|
|
100
|
+
if (value.includes(separator)) {
|
|
101
|
+
throw (0, errors_js_1.validationError)(`${field} must not contain the reserved "${separator}" separator`, field);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function parseKeySegment(value, separator, field, maxBytes) {
|
|
105
|
+
const text = parseString(value, field);
|
|
106
|
+
assertMaxBytes(text, field, maxBytes);
|
|
107
|
+
assertNoSeparator(text, separator, field);
|
|
108
|
+
assertNoControlChars(text, field);
|
|
109
|
+
assertWellFormed(text, field);
|
|
110
|
+
return text;
|
|
111
|
+
}
|
|
112
|
+
function parseIdentifier(value, separator, field, maxBytes) {
|
|
113
|
+
return parseKeySegment(parseNonBlankString(value, field), separator, field, maxBytes);
|
|
114
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides how a `ttl` option becomes an expiry.
|
|
3
|
+
*
|
|
4
|
+
* A caller gives days or seconds. The one-unit rule, the five-year cap, the
|
|
5
|
+
* epoch second DynamoDB's TTL attribute takes, and the S3 lifecycle days that
|
|
6
|
+
* keep an offloaded object from expiring before its row are all derived
|
|
7
|
+
* here, so the two spellings of the `ttl` option are accepted or rejected
|
|
8
|
+
* alike and no reader re-derives one unit from the other itself. A stored
|
|
9
|
+
* row's own epoch-second `ttl` is converted to milliseconds for `Date` where
|
|
10
|
+
* that row is read, not here.
|
|
11
|
+
*/
|
|
12
|
+
/** Maximum TTL expressed in days (5 years). */
|
|
13
|
+
export declare const MAX_TTL_DAYS: number;
|
|
14
|
+
/** Maximum TTL expressed in seconds: the same five years as {@link MAX_TTL_DAYS}. */
|
|
15
|
+
export declare const MAX_TTL_SECONDS: number;
|
|
16
|
+
/**
|
|
17
|
+
* Extra days an S3 lifecycle rule adds over the TTL it backs, so the offloaded
|
|
18
|
+
* object is never removed before the row that names it expires, never the
|
|
19
|
+
* other way round. The rule expires an object by age, at or after creation +
|
|
20
|
+
* ceil(ttl) + this margin, which is at or after the `ttl` of any row naming
|
|
21
|
+
* it, so DynamoDB's physical-deletion lag (typically within a few days of the
|
|
22
|
+
* `ttl`, with no fixed bound:
|
|
23
|
+
* https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html)
|
|
24
|
+
* does not matter. The margin is headroom, not a bound on that lag.
|
|
25
|
+
*/
|
|
26
|
+
export declare const S3_LIFECYCLE_SWEEP_MARGIN_DAYS = 2;
|
|
27
|
+
/** Time-to-live expressed in whole days or whole seconds. */
|
|
28
|
+
export type TtlOption = {
|
|
29
|
+
days: number;
|
|
30
|
+
} | {
|
|
31
|
+
seconds: number;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* A {@link TtlOption} resolved to a positive number of seconds.
|
|
35
|
+
*
|
|
36
|
+
* Accepts: `ttl` — declared as the two-shape union; a JavaScript caller, or a
|
|
37
|
+
* config built from JSON, can also reach `undefined`, a non-object, `{}`, an
|
|
38
|
+
* object carrying both keys and one carrying any other key, and each is
|
|
39
|
+
* rejected. Within a shape the value must be an integer of at least 1.
|
|
40
|
+
*
|
|
41
|
+
* Returns: whole seconds, `days × 86400` for the days form.
|
|
42
|
+
*
|
|
43
|
+
* Throws: `VALIDATION`, in this order, naming `ttl` for a value that is not
|
|
44
|
+
* an object, `ttl.<key>` for a key other than `days` or `seconds`, `ttl` for
|
|
45
|
+
* an object naming neither unit or both, and `ttl.days` or `ttl.seconds` for a
|
|
46
|
+
* value outside 1..five years. Both forms share that cap, so the two spellings
|
|
47
|
+
* of one duration are accepted or rejected alike.
|
|
48
|
+
*/
|
|
49
|
+
export declare function resolveTtlSeconds(ttl: TtlOption): number;
|
|
50
|
+
/**
|
|
51
|
+
* The value DynamoDB's TTL attribute takes for an item written now: the Unix
|
|
52
|
+
* epoch second at which it expires.
|
|
53
|
+
*
|
|
54
|
+
* Accepts: `ttl` — as {@link resolveTtlSeconds}. `now` — a clock returning
|
|
55
|
+
* epoch **milliseconds**, defaulting to `Date.now`; supplied by tests and by
|
|
56
|
+
* the adapters' clock seam.
|
|
57
|
+
*
|
|
58
|
+
* Returns: `floor(now() / 1000) + resolveTtlSeconds(ttl)`. Whole seconds,
|
|
59
|
+
* because DynamoDB reads the attribute as an epoch-second Number
|
|
60
|
+
* (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-before-you-start.html).
|
|
61
|
+
*
|
|
62
|
+
* Throws: whatever {@link resolveTtlSeconds} throws.
|
|
63
|
+
*/
|
|
64
|
+
export declare function calculateTtlTimestamp(ttl: TtlOption, now?: () => number): number;
|
|
65
|
+
/**
|
|
66
|
+
* The `Days` of the S3 lifecycle expiration rule that backs a TTL.
|
|
67
|
+
*
|
|
68
|
+
* Accepts: `ttl` — as {@link resolveTtlSeconds}.
|
|
69
|
+
*
|
|
70
|
+
* Returns: the TTL rounded **up** to whole days plus
|
|
71
|
+
* {@link S3_LIFECYCLE_SWEEP_MARGIN_DAYS}, so always at least
|
|
72
|
+
* `1 + margin`.
|
|
73
|
+
*
|
|
74
|
+
* Throws: whatever {@link resolveTtlSeconds} throws.
|
|
75
|
+
*
|
|
76
|
+
* Guarantees: the object outlives the row that points at it, for every row
|
|
77
|
+
* written under the `ttl` this rule was computed from. S3 expires an object at
|
|
78
|
+
* the first midnight UTC at least `Days` after creation, while DynamoDB
|
|
79
|
+
* deletes an expired item typically within a few days of its `ttl`, with no
|
|
80
|
+
* fixed bound
|
|
81
|
+
* (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html).
|
|
82
|
+
* Every row naming the object carries a `ttl` no later than its creation plus
|
|
83
|
+
* `ttl`, so the object, expiring at or after that, is not removed before its
|
|
84
|
+
* row expires; readers hide a metadata, store or history row by its own `ttl`,
|
|
85
|
+
* and serve a checkpoint's payload and pending-write rows only while its
|
|
86
|
+
* metadata row is live. The margin is headroom, not a bound on the lag.
|
|
87
|
+
*
|
|
88
|
+
* The rule expires by age every object under its prefix, including objects
|
|
89
|
+
* named by rows written under an earlier `ttl`. After a rule is rewritten for
|
|
90
|
+
* a smaller `ttl`, the guarantee therefore holds only once every row written
|
|
91
|
+
* under the old, longer value has expired; until then such a row can outlive
|
|
92
|
+
* its object. Rewriting it for a larger `ttl` keeps the guarantee.
|
|
93
|
+
*/
|
|
94
|
+
export declare function lifecycleExpirationDays(ttl: TtlOption): number;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS = exports.MAX_TTL_SECONDS = exports.MAX_TTL_DAYS = void 0;
|
|
4
|
+
exports.resolveTtlSeconds = resolveTtlSeconds;
|
|
5
|
+
exports.calculateTtlTimestamp = calculateTtlTimestamp;
|
|
6
|
+
exports.lifecycleExpirationDays = lifecycleExpirationDays;
|
|
7
|
+
const errors_js_1 = require("../errors/errors.js");
|
|
8
|
+
const option_shape_js_1 = require("./option-shape.js");
|
|
9
|
+
const primitives_js_1 = require("./primitives.js");
|
|
10
|
+
const SECONDS_PER_DAY = 24 * 60 * 60;
|
|
11
|
+
exports.MAX_TTL_DAYS = 365 * 5;
|
|
12
|
+
exports.MAX_TTL_SECONDS = exports.MAX_TTL_DAYS * 24 * 60 * 60;
|
|
13
|
+
exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS = 2;
|
|
14
|
+
const TTL_KEYS = (0, option_shape_js_1.allKeysOf)({
|
|
15
|
+
days: 'days',
|
|
16
|
+
seconds: 'seconds',
|
|
17
|
+
});
|
|
18
|
+
function assertWithinCap(value, field, max) {
|
|
19
|
+
(0, primitives_js_1.assertInteger)(value, field, { min: 1 });
|
|
20
|
+
if (value > max) {
|
|
21
|
+
throw (0, errors_js_1.validationError)(`${field} must be <= ${max} (five years)`, field);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function assertOneUnit(ttl) {
|
|
25
|
+
if (typeof ttl !== 'object' || ttl === null) {
|
|
26
|
+
throw (0, errors_js_1.validationError)('ttl must be an object: { days } or { seconds }', 'ttl');
|
|
27
|
+
}
|
|
28
|
+
(0, option_shape_js_1.assertShape)(ttl, TTL_KEYS, 'ttl');
|
|
29
|
+
const days = 'days' in ttl;
|
|
30
|
+
const seconds = 'seconds' in ttl;
|
|
31
|
+
if (days && seconds) {
|
|
32
|
+
throw (0, errors_js_1.validationError)('ttl must specify either ttl.days or ttl.seconds, not both', 'ttl');
|
|
33
|
+
}
|
|
34
|
+
if (!days && !seconds) {
|
|
35
|
+
throw (0, errors_js_1.validationError)('ttl must specify either ttl.days or ttl.seconds', 'ttl');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function resolveTtlSeconds(ttl) {
|
|
39
|
+
assertOneUnit(ttl);
|
|
40
|
+
if ('days' in ttl) {
|
|
41
|
+
assertWithinCap(ttl.days, 'ttl.days', exports.MAX_TTL_DAYS);
|
|
42
|
+
return ttl.days * SECONDS_PER_DAY;
|
|
43
|
+
}
|
|
44
|
+
assertWithinCap(ttl.seconds, 'ttl.seconds', exports.MAX_TTL_SECONDS);
|
|
45
|
+
return ttl.seconds;
|
|
46
|
+
}
|
|
47
|
+
function calculateTtlTimestamp(ttl, now = Date.now) {
|
|
48
|
+
return Math.floor(now() / 1000) + resolveTtlSeconds(ttl);
|
|
49
|
+
}
|
|
50
|
+
function lifecycleExpirationDays(ttl) {
|
|
51
|
+
return Math.ceil(resolveTtlSeconds(ttl) / SECONDS_PER_DAY) + exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS;
|
|
52
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides how the distinct namespaces are found and held in one order.
|
|
3
|
+
*
|
|
4
|
+
* A listing reads every live row it can reach — one partition when its first
|
|
5
|
+
* prefix condition opens with concrete labels, the whole table otherwise —
|
|
6
|
+
* keeps the namespaces every condition matches, truncates and deduplicates
|
|
7
|
+
* them, and sorts them by one pinned collation with its ties settled. A caller
|
|
8
|
+
* paging by `offset` gets the same order on every call and every host.
|
|
9
|
+
*/
|
|
10
|
+
import type { MatchCondition } from '@langchain/langgraph-checkpoint';
|
|
11
|
+
import type { ParsedList } from '../internal/parse.js';
|
|
12
|
+
import type { StoreContext } from '../internal/setup.js';
|
|
13
|
+
/**
|
|
14
|
+
* Whether `namespace` satisfies one match condition. `condition.matchType` is
|
|
15
|
+
* `'prefix'` or `'suffix'`, already refused otherwise by the parser that built
|
|
16
|
+
* `condition` (`parseMatchCondition` in `parse.ts`).
|
|
17
|
+
*
|
|
18
|
+
* Accepts: `condition.path` — elements, where `'*'` matches any one element;
|
|
19
|
+
* longer than the namespace never matches, and empty matches every namespace.
|
|
20
|
+
*
|
|
21
|
+
* Returns: whether the condition holds.
|
|
22
|
+
*
|
|
23
|
+
* Throws: nothing.
|
|
24
|
+
*/
|
|
25
|
+
export declare function matchNamespace(namespace: string[], condition: MatchCondition): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Cap a namespace to at most `maxDepth` elements.
|
|
28
|
+
*
|
|
29
|
+
* Accepts: `maxDepth` — absent returns the namespace unchanged; otherwise a
|
|
30
|
+
* parsed positive integer (see `parseListOperation` for what a negative or
|
|
31
|
+
* zero value did here).
|
|
32
|
+
*
|
|
33
|
+
* Returns: the namespace, truncated from the end; shorter than `maxDepth` is
|
|
34
|
+
* returned whole.
|
|
35
|
+
*
|
|
36
|
+
* Throws: nothing.
|
|
37
|
+
*/
|
|
38
|
+
export declare function truncateDepth(namespace: string[], maxDepth?: number): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Leading concrete (non-wildcard) elements of the first prefix condition.
|
|
41
|
+
*
|
|
42
|
+
* Accepts: `conditions` — absent, empty, suffix-only, or a prefix condition
|
|
43
|
+
* starting with `'*'` all yield nothing to scope by.
|
|
44
|
+
*
|
|
45
|
+
* Returns: the concrete leading elements, which name a partition and a sort-key
|
|
46
|
+
* prefix the listing can be read from. An empty result means the listing cannot
|
|
47
|
+
* be scoped to one partition and falls back to a Scan.
|
|
48
|
+
*
|
|
49
|
+
* Throws: nothing.
|
|
50
|
+
*
|
|
51
|
+
* Guarantees: the root is only ever a *superset* of what the conditions select
|
|
52
|
+
* — every condition is still applied to each namespace read — so scoping can
|
|
53
|
+
* never drop a namespace that belongs in the answer.
|
|
54
|
+
*/
|
|
55
|
+
export declare function prefixRoot(conditions?: MatchCondition[]): string[];
|
|
56
|
+
/**
|
|
57
|
+
* The distinct namespaces satisfying every match condition.
|
|
58
|
+
*
|
|
59
|
+
* Accepts: `op` — parsed; every match condition must hold, absent or empty
|
|
60
|
+
* matches every namespace. A concrete prefix root scopes the read to one
|
|
61
|
+
* partition's Query, and anything else — a suffix condition, a leading `*`, no
|
|
62
|
+
* conditions — spans the table and is one of the four reads allowed to Scan
|
|
63
|
+
* (`test/static/guards/scan-sites.ts`).
|
|
64
|
+
* `op.maxDepth` — namespaces are truncated to it and then
|
|
65
|
+
* deduplicated, so `['a','b']` and `['a','c']` list once as `['a']`.
|
|
66
|
+
* `op.offset` and `op.limit` — a `limit` of 0 returns an empty listing without reading.
|
|
67
|
+
*
|
|
68
|
+
* Returns: the namespaces, sorted, then `limit` of them from `offset`.
|
|
69
|
+
*
|
|
70
|
+
* Throws: `RESULT_TRUNCATED` when `maxScanItems` or `maxIterations` is
|
|
71
|
+
* reached while rows remain, so a partial listing is never returned as a
|
|
72
|
+
* complete one; `FORMAT_UNSUPPORTED` for a store item a newer release wrote.
|
|
73
|
+
*
|
|
74
|
+
* Guarantees: every live row is read — the answer is about which namespaces
|
|
75
|
+
* exist, and paging over it must not depend on which rows were read first. That
|
|
76
|
+
* is also why the sort is total (see {@link compareNamespaces}), and why a
|
|
77
|
+
* `limit` of 0 is answered ahead of the read rather than by slicing one.
|
|
78
|
+
*/
|
|
79
|
+
export declare function listNamespaces(context: StoreContext, op: ParsedList): Promise<string[][]>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.matchNamespace = matchNamespace;
|
|
4
|
+
exports.truncateDepth = truncateDepth;
|
|
5
|
+
exports.prefixRoot = prefixRoot;
|
|
6
|
+
exports.listNamespaces = listNamespaces;
|
|
7
|
+
const clock_js_1 = require("../../shared/clock.js");
|
|
8
|
+
const paginate_js_1 = require("../../shared/dynamodb/paginate.js");
|
|
9
|
+
const table_schema_js_1 = require("../../shared/dynamodb/table-schema.js");
|
|
10
|
+
const rows_js_1 = require("../internal/rows.js");
|
|
11
|
+
const WILDCARD = '*';
|
|
12
|
+
function segmentMatches(actual, path) {
|
|
13
|
+
return path.every((element, index) => element === WILDCARD || element === actual[index]);
|
|
14
|
+
}
|
|
15
|
+
function matchNamespace(namespace, condition) {
|
|
16
|
+
const { matchType, path } = condition;
|
|
17
|
+
if (path.length > namespace.length)
|
|
18
|
+
return false;
|
|
19
|
+
const slice = matchType === 'prefix'
|
|
20
|
+
? namespace.slice(0, path.length)
|
|
21
|
+
: namespace.slice(namespace.length - path.length);
|
|
22
|
+
return segmentMatches(slice, path);
|
|
23
|
+
}
|
|
24
|
+
function truncateDepth(namespace, maxDepth) {
|
|
25
|
+
return maxDepth === undefined ? namespace : namespace.slice(0, maxDepth);
|
|
26
|
+
}
|
|
27
|
+
function prefixRoot(conditions) {
|
|
28
|
+
const prefixCondition = conditions?.find((condition) => condition.matchType === 'prefix');
|
|
29
|
+
if (!prefixCondition)
|
|
30
|
+
return [];
|
|
31
|
+
const root = [];
|
|
32
|
+
for (const element of prefixCondition.path) {
|
|
33
|
+
if (element === WILDCARD)
|
|
34
|
+
break;
|
|
35
|
+
root.push(element);
|
|
36
|
+
}
|
|
37
|
+
return root;
|
|
38
|
+
}
|
|
39
|
+
function namespaceSource(context, op, now) {
|
|
40
|
+
const root = prefixRoot(op.matchConditions);
|
|
41
|
+
if (root.length > 0) {
|
|
42
|
+
return (0, paginate_js_1.paginateQuery)({
|
|
43
|
+
retry: context.retry,
|
|
44
|
+
client: context.client,
|
|
45
|
+
params: (0, table_schema_js_1.withoutExpired)((0, rows_js_1.projectKeys)((0, rows_js_1.scopedQuery)(context.tableName, root)), now),
|
|
46
|
+
maxItems: context.maxScanItems,
|
|
47
|
+
maxIterations: context.maxIterations,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return (0, paginate_js_1.paginateScan)({
|
|
51
|
+
retry: context.retry,
|
|
52
|
+
client: context.client,
|
|
53
|
+
params: (0, table_schema_js_1.withoutExpired)((0, rows_js_1.projectKeys)((0, rows_js_1.storeScan)(context.tableName)), now),
|
|
54
|
+
maxItems: context.maxScanItems,
|
|
55
|
+
maxIterations: context.maxIterations,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
const NAMESPACE_COLLATOR = new Intl.Collator('en');
|
|
59
|
+
const REFERENCE_JOIN = ':';
|
|
60
|
+
function compareNamespaces(a, b) {
|
|
61
|
+
const collated = NAMESPACE_COLLATOR.compare(a.join(REFERENCE_JOIN), b.join(REFERENCE_JOIN));
|
|
62
|
+
if (collated !== 0)
|
|
63
|
+
return collated;
|
|
64
|
+
const left = a.join(table_schema_js_1.KEY_SEPARATOR);
|
|
65
|
+
const right = b.join(table_schema_js_1.KEY_SEPARATOR);
|
|
66
|
+
return left < right ? -1 : Number(left > right);
|
|
67
|
+
}
|
|
68
|
+
async function listNamespaces(context, op) {
|
|
69
|
+
if (op.limit === 0)
|
|
70
|
+
return [];
|
|
71
|
+
const now = (0, clock_js_1.nowSeconds)();
|
|
72
|
+
const seen = new Set();
|
|
73
|
+
const namespaces = [];
|
|
74
|
+
for await (const raw of namespaceSource(context, op, now)) {
|
|
75
|
+
const record = (0, rows_js_1.parseStoreRow)(raw);
|
|
76
|
+
if (!record || (0, table_schema_js_1.isExpiredRow)(record, now))
|
|
77
|
+
continue;
|
|
78
|
+
const namespace = record.namespace;
|
|
79
|
+
if (op.matchConditions &&
|
|
80
|
+
!op.matchConditions.every((condition) => matchNamespace(namespace, condition))) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const truncated = truncateDepth(namespace, op.maxDepth);
|
|
84
|
+
const dedupeKey = truncated.join(table_schema_js_1.KEY_SEPARATOR);
|
|
85
|
+
if (seen.has(dedupeKey))
|
|
86
|
+
continue;
|
|
87
|
+
seen.add(dedupeKey);
|
|
88
|
+
namespaces.push(truncated);
|
|
89
|
+
}
|
|
90
|
+
namespaces.sort(compareNamespaces);
|
|
91
|
+
return namespaces.slice(op.offset, op.offset + op.limit);
|
|
92
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides the order a put happens in.
|
|
3
|
+
*
|
|
4
|
+
* A put reads the row it replaces for its `createdAt`, embeds once — a vector
|
|
5
|
+
* per extracted path onto the row, or one vector for the `vectorBackend`,
|
|
6
|
+
* never both — writes the row, and only then syncs the backend, best-effort.
|
|
7
|
+
* A `null` value takes the delete path instead. A caller hands over an item;
|
|
8
|
+
* that the table commits first and the vector copy follows is decided here.
|
|
9
|
+
*/
|
|
10
|
+
import type { ParsedDelete, ParsedPut } from '../internal/parse.js';
|
|
11
|
+
import type { StoreContext } from '../internal/setup.js';
|
|
12
|
+
/**
|
|
13
|
+
* Store, update or delete an item.
|
|
14
|
+
*
|
|
15
|
+
* Accepts: `op` — parsed; a `ParsedDelete` removes the item, a `ParsedPut` is
|
|
16
|
+
* stored, its value encoded with optional compression and S3 offload under
|
|
17
|
+
* this row's own path, in an object named by this put's own id. `op.index` —
|
|
18
|
+
* `false` stores the item without indexing it and clears any vector it had, an
|
|
19
|
+
* array overrides the configured fields for this put, and absent uses the
|
|
20
|
+
* store's configuration.
|
|
21
|
+
*
|
|
22
|
+
* Returns: nothing. Deleting an item that is not there is not an error.
|
|
23
|
+
*
|
|
24
|
+
* Throws: `VALIDATION` naming `value` for a value that JSON cannot represent —
|
|
25
|
+
* refused at the write rather than stored as a row that can never be read
|
|
26
|
+
* back — or naming `payload` for one too large to store inline without `s3`,
|
|
27
|
+
* or, once offloaded, larger than `s3.maxDownloadBytes`; `VALIDATION` again,
|
|
28
|
+
* naming `index` or `value`, for the built row — payload plus its inline
|
|
29
|
+
* vectors — over DynamoDB's 400 KB item limit, naming `index` when the
|
|
30
|
+
* vectors are what pushed it over, checked before anything is written;
|
|
31
|
+
* `S3_OFFLOAD_FAILED`; whatever the write throws.
|
|
32
|
+
*
|
|
33
|
+
* Guarantees: DynamoDB holds the canonical item — the vector index is synced
|
|
34
|
+
* afterwards and best-effort, so a backend outage never fails a put or leaves a
|
|
35
|
+
* half-written item. `createdAt` survives every update of a live item; a put
|
|
36
|
+
* over a row that has expired but not yet been swept is a creation, since no
|
|
37
|
+
* reader could still see that item. The superseded payload
|
|
38
|
+
* is deleted only once the new row is committed, and this put's own upload
|
|
39
|
+
* only once a read proves its write did not land. Neither release reads the
|
|
40
|
+
* row first: each put uploads under a key ending in an id of its own, so the
|
|
41
|
+
* object a put uploads is named only by that put's own rows.
|
|
42
|
+
*/
|
|
43
|
+
export declare function putItem(context: StoreContext, op: ParsedPut | ParsedDelete): Promise<void>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.putItem = putItem;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const clock_js_1 = require("../../shared/clock.js");
|
|
6
|
+
const ttl_js_1 = require("../../shared/validation/ttl.js");
|
|
7
|
+
const item_write_js_1 = require("../internal/item-write.js");
|
|
8
|
+
const rows_js_1 = require("../internal/rows.js");
|
|
9
|
+
const semantic_search_js_1 = require("../internal/semantic-search.js");
|
|
10
|
+
const vector_index_js_1 = require("../internal/vector-index.js");
|
|
11
|
+
async function resolvePassages(context, op, value) {
|
|
12
|
+
if (op.index === false)
|
|
13
|
+
return undefined;
|
|
14
|
+
return (0, semantic_search_js_1.embedPassages)(context, value, op.index);
|
|
15
|
+
}
|
|
16
|
+
async function putItem(context, op) {
|
|
17
|
+
if (op.kind === 'delete') {
|
|
18
|
+
await (0, item_write_js_1.deleteStoreItem)(context, op.address);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const { namespace, key } = op.address;
|
|
22
|
+
const value = op.value;
|
|
23
|
+
const timestamp = (0, clock_js_1.nowIso)();
|
|
24
|
+
const existing = await (0, rows_js_1.readExisting)(context, (0, rows_js_1.itemRowKey)(op.address));
|
|
25
|
+
const embedding = await (0, vector_index_js_1.itemVector)(context, op);
|
|
26
|
+
const embeddings = context.vectorBackend ? undefined : await resolvePassages(context, op, value);
|
|
27
|
+
const ttlTimestamp = context.ttl ? (0, ttl_js_1.calculateTtlTimestamp)(context.ttl) : undefined;
|
|
28
|
+
const record = await (0, rows_js_1.buildStoreRow)(context, { namespace, key }, value, {
|
|
29
|
+
createdAt: (0, rows_js_1.isLiveRow)(existing) ? (existing.createdAt ?? timestamp) : timestamp,
|
|
30
|
+
updatedAt: timestamp,
|
|
31
|
+
embeddings,
|
|
32
|
+
ttlTimestamp,
|
|
33
|
+
rev: (0, node_crypto_1.randomUUID)(),
|
|
34
|
+
});
|
|
35
|
+
await (0, item_write_js_1.persistRow)(context, record, existing);
|
|
36
|
+
await syncVectorWhileCurrent(context, op.address, record, embedding);
|
|
37
|
+
}
|
|
38
|
+
async function syncVectorWhileCurrent(context, address, record, embedding) {
|
|
39
|
+
if (context.vectorBackend === undefined)
|
|
40
|
+
return;
|
|
41
|
+
if ((await (0, item_write_js_1.verifyWriteLanded)(context, record)) !== 'landed') {
|
|
42
|
+
context.logger.info('store.put: left the vector index to the write that superseded this put', {
|
|
43
|
+
namespace: address.namespace,
|
|
44
|
+
key: address.key,
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
await (0, vector_index_js_1.syncItemVector)(context, address, embedding);
|
|
49
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides what a reconcile refuses before it touches the backend.
|
|
3
|
+
*
|
|
4
|
+
* A repair is scoped to one partition's items, so its prefix must be a
|
|
5
|
+
* non-empty namespace, and without an `index` and a `vectorBackend` there is
|
|
6
|
+
* nothing to repair; both are refused here, before any read. How the backend
|
|
7
|
+
* is then made to agree with the table belongs to the vector index, so the
|
|
8
|
+
* store's method knows neither half.
|
|
9
|
+
*/
|
|
10
|
+
import type { StoreContext } from '../internal/setup.js';
|
|
11
|
+
import type { VectorReconcileResult } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Repair the vector backend against the canonical DynamoDB items under
|
|
14
|
+
* `namespacePrefix`: re-push every live embedding, and — when the backend
|
|
15
|
+
* implements {@link VectorBackend.listKeys} — prune vectors with no canonical
|
|
16
|
+
* item. A maintenance tool for backend drift; run it when the namespace is
|
|
17
|
+
* idle.
|
|
18
|
+
*
|
|
19
|
+
* Accepts: `namespacePrefix` — a non-empty namespace, since the repair is
|
|
20
|
+
* scoped to one partition's items. `options.signal` — aborts between pages.
|
|
21
|
+
*
|
|
22
|
+
* Returns: how many vectors were upserted and how many pruned.
|
|
23
|
+
*
|
|
24
|
+
* Throws: `VALIDATION` naming `namespacePrefix` or `namespacePrefix element`
|
|
25
|
+
* for an empty or malformed prefix, as `search` names it, and `vectorBackend`
|
|
26
|
+
* when the store has no index or backend to reconcile;
|
|
27
|
+
* `RESULT_TRUNCATED` past `maxScanItems` or `maxIterations`, since repairing
|
|
28
|
+
* from a partial view would prune live vectors; whatever the reads, the
|
|
29
|
+
* embeddings model and the backend throw.
|
|
30
|
+
*
|
|
31
|
+
* Guarantees: re-embeds with the store's configured fields, so a per-put
|
|
32
|
+
* `index` field override is not reproduced — a reconcile makes the backend
|
|
33
|
+
* agree with the store's configuration, not with each item's write-time one.
|
|
34
|
+
* DynamoDB is never written: only the backend is repaired.
|
|
35
|
+
*/
|
|
36
|
+
export declare function reconcileVectorIndex(context: StoreContext, namespacePrefix: string[], options?: {
|
|
37
|
+
signal?: AbortSignal;
|
|
38
|
+
}): Promise<VectorReconcileResult>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reconcileVectorIndex = reconcileVectorIndex;
|
|
4
|
+
const errors_js_1 = require("../../shared/errors/errors.js");
|
|
5
|
+
const parse_js_1 = require("../internal/parse.js");
|
|
6
|
+
const vector_index_js_1 = require("../internal/vector-index.js");
|
|
7
|
+
async function reconcileVectorIndex(context, namespacePrefix, options = {}) {
|
|
8
|
+
const prefix = (0, parse_js_1.parseNamespace)(namespacePrefix, 'namespacePrefix');
|
|
9
|
+
if (!(0, vector_index_js_1.hasVectorBackend)(context)) {
|
|
10
|
+
throw (0, errors_js_1.validationError)('reconcileVectorIndex requires a configured index and vectorBackend', 'vectorBackend');
|
|
11
|
+
}
|
|
12
|
+
return (0, vector_index_js_1.reconcileVectors)(context, prefix, options.signal);
|
|
13
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides which of three paths serves a search.
|
|
3
|
+
*
|
|
4
|
+
* A query with a `vectorBackend` is answered by the backend; no query, or no
|
|
5
|
+
* `index` to embed one with, is a page read from the table that stops once
|
|
6
|
+
* full; anything else is ranked in memory over at most `maxSearchCandidates`.
|
|
7
|
+
* A page of zero is answered before any of them. A caller gets the same shape
|
|
8
|
+
* of page whichever path ran, scored exactly when a query could be ranked.
|
|
9
|
+
*/
|
|
10
|
+
import type { SearchItem } from '@langchain/langgraph-checkpoint';
|
|
11
|
+
import type { ParsedSearch } from '../internal/parse.js';
|
|
12
|
+
import type { StoreContext } from '../internal/setup.js';
|
|
13
|
+
/**
|
|
14
|
+
* Search items under a namespace prefix: metadata filtering plus optional
|
|
15
|
+
* semantic ranking.
|
|
16
|
+
*
|
|
17
|
+
* Accepts: `search` — already parsed, so `namespacePrefix`, `offset` and
|
|
18
|
+
* `limit` are resolved; `search.query` absent or empty
|
|
19
|
+
* (which is absent: there is no query to embed) ranks nothing and returns the
|
|
20
|
+
* page as read, which is what the reference store does
|
|
21
|
+
* (`@langchain/langgraph-checkpoint@1.1.5` `dist/store/memory.js:70-80`, where a
|
|
22
|
+
* falsy query takes the unscored path). A query without a configured `index`
|
|
23
|
+
* does the same, since there is nothing to embed it with.
|
|
24
|
+
*
|
|
25
|
+
* Returns: at most `limit` items from `offset`. With a query and an index every
|
|
26
|
+
* item carries a `score`; without one none does. Scores rank best-first; an item
|
|
27
|
+
* that cannot be scored ranks last rather than being dropped.
|
|
28
|
+
*
|
|
29
|
+
* Throws: `VALIDATION` naming `maxSearchCandidates` or `index.dims`; whatever
|
|
30
|
+
* the reads, decodes and the embeddings model throw.
|
|
31
|
+
*
|
|
32
|
+
* Guarantees: a page of zero costs no request at all, and otherwise only the
|
|
33
|
+
* page's own items are decoded on the unranked path — the
|
|
34
|
+
* read stops as soon as it is full. A semantic search must read every candidate
|
|
35
|
+
* to rank it, which is why it is capped and why a large corpus belongs in a
|
|
36
|
+
* `vectorBackend`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function searchItems(context: StoreContext, search: ParsedSearch, signal?: AbortSignal): Promise<SearchItem[]>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.searchItems = searchItems;
|
|
4
|
+
const truncate_js_1 = require("../../shared/logging/truncate.js");
|
|
5
|
+
const semantic_search_js_1 = require("../internal/semantic-search.js");
|
|
6
|
+
const table_search_js_1 = require("../internal/table-search.js");
|
|
7
|
+
const vector_index_js_1 = require("../internal/vector-index.js");
|
|
8
|
+
async function searchItems(context, search, signal) {
|
|
9
|
+
const { offset, limit } = search;
|
|
10
|
+
if (limit === 0)
|
|
11
|
+
return [];
|
|
12
|
+
if (search.query && (0, vector_index_js_1.hasVectorBackend)(context)) {
|
|
13
|
+
const ranked = await (0, vector_index_js_1.searchViaBackend)(context, search, signal);
|
|
14
|
+
return ranked.slice(offset, offset + limit);
|
|
15
|
+
}
|
|
16
|
+
if (!search.query || !context.index) {
|
|
17
|
+
const page = await (0, table_search_js_1.collectCandidates)(context, search, { kind: 'page', need: offset + limit }, signal);
|
|
18
|
+
return page.map(({ item }) => ({ ...item, score: undefined })).slice(offset, offset + limit);
|
|
19
|
+
}
|
|
20
|
+
const candidates = await (0, table_search_js_1.collectCandidates)(context, search, { kind: 'semantic', cap: context.maxSearchCandidates }, signal);
|
|
21
|
+
const queryVector = await context.index.embeddings.embedQuery(search.query);
|
|
22
|
+
(0, semantic_search_js_1.assertVectorDims)(context.index, queryVector, 'query');
|
|
23
|
+
const ranked = (0, table_search_js_1.rankInMemory)(candidates, queryVector, context.maxSearchCandidates, (count) => context.logger.warn('search: some candidates carry an embedding of a different dimension than the query and ' +
|
|
24
|
+
'were ranked unscored; re-embed them with reconcileVectorIndex or a re-put', { namespacePrefix: (0, truncate_js_1.truncateLabelsForLog)(search.namespacePrefix), count }));
|
|
25
|
+
return ranked.slice(offset, offset + limit);
|
|
26
|
+
}
|