@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
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.listSessions = listSessions;
|
|
4
|
-
const clock_1 = require("../../shared/clock");
|
|
5
|
-
const expiry_1 = require("../../shared/dynamodb/expiry");
|
|
6
|
-
const retry_policy_1 = require("../../shared/dynamodb/retry-policy");
|
|
7
|
-
const scan_1 = require("../../shared/dynamodb/scan");
|
|
8
|
-
const keys_1 = require("../internal/keys");
|
|
9
|
-
/**
|
|
10
|
-
* List all sessions as metadata summaries, newest-updated first. The scan is
|
|
11
|
-
* filtered to session items so the adapter works on a table shared with the
|
|
12
|
-
* checkpointer/store; foreign rows are also skipped defensively, and rows past
|
|
13
|
-
* their TTL are filtered out exactly as `getMessages` filters expired messages.
|
|
14
|
-
*/
|
|
15
|
-
async function listSessions(context, options) {
|
|
16
|
-
const sessions = [];
|
|
17
|
-
const nowSeconds = (0, clock_1.nowSeconds)();
|
|
18
|
-
for await (const raw of (0, scan_1.paginateScan)({
|
|
19
|
-
retry: (0, retry_policy_1.retryFor)(context, options?.signal),
|
|
20
|
-
signal: options?.signal,
|
|
21
|
-
client: context.client,
|
|
22
|
-
params: {
|
|
23
|
-
TableName: context.tableName,
|
|
24
|
-
FilterExpression: '#sk = :session',
|
|
25
|
-
ExpressionAttributeNames: { '#sk': 'SK' },
|
|
26
|
-
ExpressionAttributeValues: { ':session': keys_1.SESSION_SORT_KEY },
|
|
27
|
-
},
|
|
28
|
-
maxIterations: options?.maxIterations,
|
|
29
|
-
maxItems: options?.maxItems,
|
|
30
|
-
})) {
|
|
31
|
-
const item = raw;
|
|
32
|
-
if (item.SK !== keys_1.SESSION_SORT_KEY || typeof item.sessionId !== 'string')
|
|
33
|
-
continue;
|
|
34
|
-
if ((0, expiry_1.isExpiredRow)(item, nowSeconds))
|
|
35
|
-
continue;
|
|
36
|
-
sessions.push({
|
|
37
|
-
sessionId: item.sessionId,
|
|
38
|
-
title: item.title,
|
|
39
|
-
messageCount: item.messageCount,
|
|
40
|
-
createdAt: item.createdAt,
|
|
41
|
-
updatedAt: item.updatedAt,
|
|
42
|
-
expiresAt: item.ttl === undefined ? undefined : new Date(item.ttl * 1000).toISOString(),
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Ordinal, not `localeCompare`: these are ISO-8601 timestamps, whose
|
|
47
|
-
* byte order already is their chronological order. Locale-aware collation
|
|
48
|
-
* applies rules (case folding, punctuation weighting) that have no meaning
|
|
49
|
-
* here and are not guaranteed to agree with it in every locale.
|
|
50
|
-
*/
|
|
51
|
-
sessions.sort((a, b) => (a.updatedAt < b.updatedAt ? 1 : a.updatedAt > b.updatedAt ? -1 : 0));
|
|
52
|
-
return sessions;
|
|
53
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { HistoryContext } from '../internal/setup';
|
|
2
|
-
/**
|
|
3
|
-
* Recompute `messageCount` from the authoritative number of stored message items
|
|
4
|
-
* and write it back, repairing any drift. A repair tool: the append path keeps
|
|
5
|
-
* the count consistent transactionally, so this is only needed after external
|
|
6
|
-
* corruption. Run it when the session is quiescent — it `SET`s the count, so a
|
|
7
|
-
* concurrent append's increment could be clobbered. Requires the session to
|
|
8
|
-
* already exist; reconciling a nonexistent session throws {@link ConflictError}
|
|
9
|
-
* rather than creating a permanent, TTL-less metadata-only row. Returns the
|
|
10
|
-
* reconciled count.
|
|
11
|
-
*/
|
|
12
|
-
export declare function reconcileMessageCount(context: HistoryContext, sessionId: string, signal?: AbortSignal): Promise<number>;
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.reconcileMessageCount = reconcileMessageCount;
|
|
4
|
-
const clock_1 = require("../../shared/clock");
|
|
5
|
-
const retry_1 = require("../../shared/dynamodb/retry");
|
|
6
|
-
const retry_policy_1 = require("../../shared/dynamodb/retry-policy");
|
|
7
|
-
const errors_1 = require("../../shared/errors/errors");
|
|
8
|
-
const keys_1 = require("../internal/keys");
|
|
9
|
-
const query_1 = require("../internal/query");
|
|
10
|
-
const validation_1 = require("../internal/validation");
|
|
11
|
-
/**
|
|
12
|
-
* Count only the rows `getMessages` would return: an expired message that
|
|
13
|
-
* DynamoDB's TTL sweep has not yet removed is invisible to the read path, so
|
|
14
|
-
* counting it would "repair" `messageCount` to a number no reader ever sees.
|
|
15
|
-
*/
|
|
16
|
-
async function countMessages(context, sessionId, signal) {
|
|
17
|
-
const query = (0, query_1.messageQuery)(context.tableName, sessionId);
|
|
18
|
-
const base = {
|
|
19
|
-
...query,
|
|
20
|
-
Select: 'COUNT',
|
|
21
|
-
FilterExpression: 'attribute_not_exists(#ttl) OR #ttl > :now',
|
|
22
|
-
ExpressionAttributeNames: { ...query.ExpressionAttributeNames, '#ttl': 'ttl' },
|
|
23
|
-
ExpressionAttributeValues: { ...query.ExpressionAttributeValues, ':now': (0, clock_1.nowSeconds)() },
|
|
24
|
-
};
|
|
25
|
-
let total = 0;
|
|
26
|
-
let startKey;
|
|
27
|
-
do {
|
|
28
|
-
const page = await (0, retry_1.withDynamoDBRetry)(() => context.client.query({ ...base, ExclusiveStartKey: startKey }), (0, retry_policy_1.retryFor)(context, signal));
|
|
29
|
-
total += page.Count ?? 0;
|
|
30
|
-
startKey = page.LastEvaluatedKey;
|
|
31
|
-
} while (startKey);
|
|
32
|
-
return total;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Recompute `messageCount` from the authoritative number of stored message items
|
|
36
|
-
* and write it back, repairing any drift. A repair tool: the append path keeps
|
|
37
|
-
* the count consistent transactionally, so this is only needed after external
|
|
38
|
-
* corruption. Run it when the session is quiescent — it `SET`s the count, so a
|
|
39
|
-
* concurrent append's increment could be clobbered. Requires the session to
|
|
40
|
-
* already exist; reconciling a nonexistent session throws {@link ConflictError}
|
|
41
|
-
* rather than creating a permanent, TTL-less metadata-only row. Returns the
|
|
42
|
-
* reconciled count.
|
|
43
|
-
*/
|
|
44
|
-
async function reconcileMessageCount(context, sessionId, signal) {
|
|
45
|
-
(0, validation_1.validateSessionId)(sessionId);
|
|
46
|
-
const count = await countMessages(context, sessionId, signal);
|
|
47
|
-
try {
|
|
48
|
-
await (0, retry_1.withDynamoDBRetry)(() => context.client.update({
|
|
49
|
-
TableName: context.tableName,
|
|
50
|
-
Key: { PK: (0, keys_1.sessionPartition)(sessionId), SK: keys_1.SESSION_SORT_KEY },
|
|
51
|
-
UpdateExpression: 'SET #count = :count',
|
|
52
|
-
ExpressionAttributeNames: { '#count': 'messageCount' },
|
|
53
|
-
ExpressionAttributeValues: { ':count': count },
|
|
54
|
-
ConditionExpression: 'attribute_exists(PK)',
|
|
55
|
-
}), (0, retry_policy_1.retryFor)(context, signal));
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
if (error.name === 'ConditionalCheckFailedException') {
|
|
59
|
-
throw new errors_1.ConflictError(`Cannot reconcile messageCount: session "${sessionId}" does not exist`, error);
|
|
60
|
-
}
|
|
61
|
-
throw error;
|
|
62
|
-
}
|
|
63
|
-
return count;
|
|
64
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import type { BaseMessage } from '@langchain/core/messages';
|
|
2
|
-
import type { CancelOptions } from '../shared/options';
|
|
3
|
-
import { type AdapterWindow, DynamoDBSessionChatMessageHistory } from './session-adapter';
|
|
4
|
-
import type { DynamoDBChatMessageHistoryOptions, GetMessagesOptions, ListSessionsOptions, SessionMetadata } from './types';
|
|
5
|
-
/**
|
|
6
|
-
* DynamoDB-backed multi-session chat history. Each message is its own item
|
|
7
|
-
* (ordered by a monotonic ULID, compressed / S3-offloaded as needed) alongside a
|
|
8
|
-
* per-session metadata item; every message in a session shares one uniform TTL.
|
|
9
|
-
* Appends are O(1) and lock-free. Use {@link forSession} to get a single-session
|
|
10
|
-
* LangChain adapter. Every public method is the library's error boundary — a
|
|
11
|
-
* raw AWS SDK error escaping an action surfaces as an `UpstreamError`.
|
|
12
|
-
*/
|
|
13
|
-
export declare class DynamoDBChatMessageHistory {
|
|
14
|
-
private readonly context;
|
|
15
|
-
private readonly ownsClient;
|
|
16
|
-
private readonly ddbClient;
|
|
17
|
-
constructor(options: DynamoDBChatMessageHistoryOptions);
|
|
18
|
-
/**
|
|
19
|
-
* Get a session's messages in chronological order: the whole session by
|
|
20
|
-
* default, or a window of it — `{ limit }` returns only the newest `limit`
|
|
21
|
-
* messages, `{ before }` only those appended before that instant — so a
|
|
22
|
-
* long-lived session can be read a page at a time instead of whole.
|
|
23
|
-
* @remarks Strongly consistent; one query page plus one S3 download per offloaded message.
|
|
24
|
-
* @throws ValidationError for a malformed session id or window; UpstreamError; AbortError; and, under `onCorruptMessage: 'throw'`, the decode error of a corrupt row.
|
|
25
|
-
*/
|
|
26
|
-
getMessages(sessionId: string, options?: GetMessagesOptions): Promise<BaseMessage[]>;
|
|
27
|
-
/**
|
|
28
|
-
* Append messages to a session in one transaction per chunk of up to 99
|
|
29
|
-
* messages, keeping the session's `messageCount` exact. Lock-free and safe
|
|
30
|
-
* under concurrent appends to one session; every message shares the
|
|
31
|
-
* session's TTL when one is configured.
|
|
32
|
-
* @throws ValidationError for a message that could never be read back; CompensationFailedError when a later chunk fails and the rollback fails too; RetryExhaustedError after 18 contended attempts; UpstreamError; AbortError.
|
|
33
|
-
*/
|
|
34
|
-
addMessages(sessionId: string, messages: BaseMessage[], options?: CancelOptions): Promise<void>;
|
|
35
|
-
/** Append one message; see {@link addMessages}. */
|
|
36
|
-
addMessage(sessionId: string, message: BaseMessage, options?: CancelOptions): Promise<void>;
|
|
37
|
-
/**
|
|
38
|
-
* Delete a session's messages, metadata and offloaded objects. Single pass:
|
|
39
|
-
* call it when the session is quiescent.
|
|
40
|
-
* @throws BatchWriteAllIncompleteError when a delete batch does not fully drain; UpstreamError; AbortError.
|
|
41
|
-
*/
|
|
42
|
-
clear(sessionId: string, options?: CancelOptions): Promise<void>;
|
|
43
|
-
/**
|
|
44
|
-
* List every session as a metadata summary, most recently updated first.
|
|
45
|
-
* A table scan: cross-tenant by construction and bounded by `maxItems` /
|
|
46
|
-
* `maxIterations`.
|
|
47
|
-
* @throws ResultTruncatedError past either cap; UpstreamError; AbortError.
|
|
48
|
-
*/
|
|
49
|
-
listSessions(options?: ListSessionsOptions): Promise<SessionMetadata[]>;
|
|
50
|
-
/**
|
|
51
|
-
* Recompute and repair a session's `messageCount` from the stored messages.
|
|
52
|
-
* A maintenance tool for external corruption; run it when the session is idle.
|
|
53
|
-
* @throws ConflictError when the session does not exist or changed while counting; UpstreamError; AbortError.
|
|
54
|
-
*/
|
|
55
|
-
reconcileMessageCount(sessionId: string, options?: CancelOptions): Promise<number>;
|
|
56
|
-
/**
|
|
57
|
-
* Get a single-session LangChain adapter for `sessionId`. `{ limit }` bounds
|
|
58
|
-
* what the adapter feeds the chain to the newest `limit` messages.
|
|
59
|
-
*/
|
|
60
|
-
forSession(sessionId: string, window?: AdapterWindow): DynamoDBSessionChatMessageHistory;
|
|
61
|
-
/** Release owned resources (the underlying client and any S3 client). */
|
|
62
|
-
destroy(): void;
|
|
63
|
-
/**
|
|
64
|
-
* Provision an S3 lifecycle expiration rule matching the configured TTL, so
|
|
65
|
-
* offloaded objects don't outlive their DynamoDB item forever. No-ops when
|
|
66
|
-
* S3 offload or TTL isn't configured; throws when the bucket cannot be read
|
|
67
|
-
* or written. Requires the `s3:GetLifecycleConfiguration` /
|
|
68
|
-
* `s3:PutLifecycleConfiguration` bucket-level permissions (broader than the
|
|
69
|
-
* object-level CRUD the rest of S3 offload needs) — call this once during
|
|
70
|
-
* deployment/provisioning, not per-request.
|
|
71
|
-
*/
|
|
72
|
-
ensureS3LifecycleRule(): Promise<void>;
|
|
73
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DynamoDBChatMessageHistory = void 0;
|
|
4
|
-
const boundary_1 = require("../shared/errors/boundary");
|
|
5
|
-
const ttl_1 = require("../shared/validation/ttl");
|
|
6
|
-
const add_messages_1 = require("./actions/add-messages");
|
|
7
|
-
const clear_1 = require("./actions/clear");
|
|
8
|
-
const get_messages_1 = require("./actions/get-messages");
|
|
9
|
-
const list_sessions_1 = require("./actions/list-sessions");
|
|
10
|
-
const reconcile_count_1 = require("./actions/reconcile-count");
|
|
11
|
-
const setup_1 = require("./internal/setup");
|
|
12
|
-
const session_adapter_1 = require("./session-adapter");
|
|
13
|
-
/**
|
|
14
|
-
* DynamoDB-backed multi-session chat history. Each message is its own item
|
|
15
|
-
* (ordered by a monotonic ULID, compressed / S3-offloaded as needed) alongside a
|
|
16
|
-
* per-session metadata item; every message in a session shares one uniform TTL.
|
|
17
|
-
* Appends are O(1) and lock-free. Use {@link forSession} to get a single-session
|
|
18
|
-
* LangChain adapter. Every public method is the library's error boundary — a
|
|
19
|
-
* raw AWS SDK error escaping an action surfaces as an `UpstreamError`.
|
|
20
|
-
*/
|
|
21
|
-
class DynamoDBChatMessageHistory {
|
|
22
|
-
context;
|
|
23
|
-
ownsClient;
|
|
24
|
-
ddbClient;
|
|
25
|
-
constructor(options) {
|
|
26
|
-
const setup = (0, setup_1.setUpHistory)(options);
|
|
27
|
-
this.context = setup.context;
|
|
28
|
-
this.ownsClient = setup.ownsClient;
|
|
29
|
-
this.ddbClient = setup.ddbClient;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Get a session's messages in chronological order: the whole session by
|
|
33
|
-
* default, or a window of it — `{ limit }` returns only the newest `limit`
|
|
34
|
-
* messages, `{ before }` only those appended before that instant — so a
|
|
35
|
-
* long-lived session can be read a page at a time instead of whole.
|
|
36
|
-
* @remarks Strongly consistent; one query page plus one S3 download per offloaded message.
|
|
37
|
-
* @throws ValidationError for a malformed session id or window; UpstreamError; AbortError; and, under `onCorruptMessage: 'throw'`, the decode error of a corrupt row.
|
|
38
|
-
*/
|
|
39
|
-
getMessages(sessionId, options) {
|
|
40
|
-
return (0, boundary_1.guardPublic)('history.getMessages', () => (0, get_messages_1.getMessages)(this.context, sessionId, options));
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Append messages to a session in one transaction per chunk of up to 99
|
|
44
|
-
* messages, keeping the session's `messageCount` exact. Lock-free and safe
|
|
45
|
-
* under concurrent appends to one session; every message shares the
|
|
46
|
-
* session's TTL when one is configured.
|
|
47
|
-
* @throws ValidationError for a message that could never be read back; CompensationFailedError when a later chunk fails and the rollback fails too; RetryExhaustedError after 18 contended attempts; UpstreamError; AbortError.
|
|
48
|
-
*/
|
|
49
|
-
addMessages(sessionId, messages, options) {
|
|
50
|
-
return (0, boundary_1.guardPublic)('history.addMessages', () => (0, add_messages_1.addMessages)(this.context, sessionId, messages, options?.signal));
|
|
51
|
-
}
|
|
52
|
-
/** Append one message; see {@link addMessages}. */
|
|
53
|
-
addMessage(sessionId, message, options) {
|
|
54
|
-
return (0, boundary_1.guardPublic)('history.addMessage', () => (0, add_messages_1.addMessages)(this.context, sessionId, [message], options?.signal));
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Delete a session's messages, metadata and offloaded objects. Single pass:
|
|
58
|
-
* call it when the session is quiescent.
|
|
59
|
-
* @throws BatchWriteAllIncompleteError when a delete batch does not fully drain; UpstreamError; AbortError.
|
|
60
|
-
*/
|
|
61
|
-
clear(sessionId, options) {
|
|
62
|
-
return (0, boundary_1.guardPublic)('history.clear', () => (0, clear_1.clearSession)(this.context, sessionId, options));
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* List every session as a metadata summary, most recently updated first.
|
|
66
|
-
* A table scan: cross-tenant by construction and bounded by `maxItems` /
|
|
67
|
-
* `maxIterations`.
|
|
68
|
-
* @throws ResultTruncatedError past either cap; UpstreamError; AbortError.
|
|
69
|
-
*/
|
|
70
|
-
listSessions(options) {
|
|
71
|
-
return (0, boundary_1.guardPublic)('history.listSessions', () => (0, list_sessions_1.listSessions)(this.context, options));
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Recompute and repair a session's `messageCount` from the stored messages.
|
|
75
|
-
* A maintenance tool for external corruption; run it when the session is idle.
|
|
76
|
-
* @throws ConflictError when the session does not exist or changed while counting; UpstreamError; AbortError.
|
|
77
|
-
*/
|
|
78
|
-
reconcileMessageCount(sessionId, options) {
|
|
79
|
-
return (0, boundary_1.guardPublic)('history.reconcileMessageCount', () => (0, reconcile_count_1.reconcileMessageCount)(this.context, sessionId, options?.signal));
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Get a single-session LangChain adapter for `sessionId`. `{ limit }` bounds
|
|
83
|
-
* what the adapter feeds the chain to the newest `limit` messages.
|
|
84
|
-
*/
|
|
85
|
-
forSession(sessionId, window) {
|
|
86
|
-
return new session_adapter_1.DynamoDBSessionChatMessageHistory(this, sessionId, window);
|
|
87
|
-
}
|
|
88
|
-
/** Release owned resources (the underlying client and any S3 client). */
|
|
89
|
-
destroy() {
|
|
90
|
-
this.context.offloader?.destroy();
|
|
91
|
-
if (this.ownsClient)
|
|
92
|
-
this.ddbClient?.destroy();
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Provision an S3 lifecycle expiration rule matching the configured TTL, so
|
|
96
|
-
* offloaded objects don't outlive their DynamoDB item forever. No-ops when
|
|
97
|
-
* S3 offload or TTL isn't configured; throws when the bucket cannot be read
|
|
98
|
-
* or written. Requires the `s3:GetLifecycleConfiguration` /
|
|
99
|
-
* `s3:PutLifecycleConfiguration` bucket-level permissions (broader than the
|
|
100
|
-
* object-level CRUD the rest of S3 offload needs) — call this once during
|
|
101
|
-
* deployment/provisioning, not per-request.
|
|
102
|
-
*/
|
|
103
|
-
async ensureS3LifecycleRule() {
|
|
104
|
-
return (0, boundary_1.guardPublic)('history.ensureS3LifecycleRule', async () => {
|
|
105
|
-
if (!this.context.offloader || !this.context.ttl)
|
|
106
|
-
return;
|
|
107
|
-
await this.context.offloader.ensureLifecycleRule((0, ttl_1.lifecycleExpirationDays)(this.context.ttl));
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
exports.DynamoDBChatMessageHistory = DynamoDBChatMessageHistory;
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { ChatMessageItem } from '../types';
|
|
2
|
-
import type { HistoryContext } from './setup';
|
|
3
|
-
/** Shared per-append metadata applied to every chunk's session update. */
|
|
4
|
-
export interface AppendFields {
|
|
5
|
-
now: string;
|
|
6
|
-
title?: string;
|
|
7
|
-
ttlTimestamp?: number;
|
|
8
|
-
forceTtlRefresh?: boolean;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Append message chunks with caller-observed atomicity. Each chunk commits its
|
|
12
|
-
* messages and count in one transaction; if a later chunk fails, every
|
|
13
|
-
* already-committed chunk is deleted and its count reverted, and the batch's
|
|
14
|
-
* S3 objects are cleaned once their rows are gone, restoring the pre-call
|
|
15
|
-
* state before the error is rethrown. Except on a failed rollback, which
|
|
16
|
-
* surfaces as {@link CompensationFailedError} and deliberately leaves the
|
|
17
|
-
* committed chunks' S3 objects behind, since their rows may survive.
|
|
18
|
-
*
|
|
19
|
-
* A `RetryExhaustedError` is ambiguous — the transaction may have committed
|
|
20
|
-
* and lost its response — so the chunk is read back first: present means it
|
|
21
|
-
* committed (continue), absent means it did not (compensate), and a failed
|
|
22
|
-
* read compensates but leaks that chunk's objects rather than delete objects
|
|
23
|
-
* its possibly-live rows reference.
|
|
24
|
-
*/
|
|
25
|
-
export declare function appendChunks(context: HistoryContext, sessionId: string, chunks: ChatMessageItem[][], fields: AppendFields, signal?: AbortSignal): Promise<void>;
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.appendChunks = appendChunks;
|
|
4
|
-
const retry_1 = require("../../shared/dynamodb/retry");
|
|
5
|
-
const error_code_1 = require("../../shared/errors/error-code");
|
|
6
|
-
const wrap_error_1 = require("../../shared/errors/wrap-error");
|
|
7
|
-
const compensation_1 = require("./compensation");
|
|
8
|
-
const message_transaction_1 = require("./message-transaction");
|
|
9
|
-
/** True for the one failure shape that leaves the outcome ambiguous. */
|
|
10
|
-
function isAmbiguous(error) {
|
|
11
|
-
return error.code === error_code_1.ErrorCode.RETRY_EXHAUSTED;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Read the chunk's first row back with `ConsistentRead`. A chunk commits
|
|
15
|
-
* atomically, so one row present means the whole chunk (and its count `ADD`)
|
|
16
|
-
* landed and only the response was lost. Message sort keys are per-call
|
|
17
|
-
* ULIDs, so a present row can only be this call's own.
|
|
18
|
-
*/
|
|
19
|
-
async function verifyChunkLanded(context, chunk) {
|
|
20
|
-
try {
|
|
21
|
-
const result = await (0, retry_1.withDynamoDBRetry)(() => context.client.get({
|
|
22
|
-
TableName: context.tableName,
|
|
23
|
-
Key: { PK: chunk[0].PK, SK: chunk[0].SK },
|
|
24
|
-
ConsistentRead: true,
|
|
25
|
-
ProjectionExpression: '#sk',
|
|
26
|
-
ExpressionAttributeNames: { '#sk': 'SK' },
|
|
27
|
-
}), context.retry);
|
|
28
|
-
return result.Item ? 'committed' : 'not-committed';
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return 'unverified';
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/** Run one chunk's transaction, returning its error instead of throwing. */
|
|
35
|
-
async function commitChunk(context, sessionId, chunk, fields, signal) {
|
|
36
|
-
try {
|
|
37
|
-
await (0, message_transaction_1.writeMessageChunk)(context, chunk, { ...fields, sessionId, count: chunk.length }, { signal });
|
|
38
|
-
return undefined;
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
return (0, wrap_error_1.toError)(error);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function asCommitted(chunk) {
|
|
45
|
-
return { keys: chunk.map((item) => ({ PK: item.PK, SK: item.SK })), count: chunk.length };
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Append message chunks with caller-observed atomicity. Each chunk commits its
|
|
49
|
-
* messages and count in one transaction; if a later chunk fails, every
|
|
50
|
-
* already-committed chunk is deleted and its count reverted, and the batch's
|
|
51
|
-
* S3 objects are cleaned once their rows are gone, restoring the pre-call
|
|
52
|
-
* state before the error is rethrown. Except on a failed rollback, which
|
|
53
|
-
* surfaces as {@link CompensationFailedError} and deliberately leaves the
|
|
54
|
-
* committed chunks' S3 objects behind, since their rows may survive.
|
|
55
|
-
*
|
|
56
|
-
* A `RetryExhaustedError` is ambiguous — the transaction may have committed
|
|
57
|
-
* and lost its response — so the chunk is read back first: present means it
|
|
58
|
-
* committed (continue), absent means it did not (compensate), and a failed
|
|
59
|
-
* read compensates but leaks that chunk's objects rather than delete objects
|
|
60
|
-
* its possibly-live rows reference.
|
|
61
|
-
*/
|
|
62
|
-
async function appendChunks(context, sessionId, chunks, fields, signal) {
|
|
63
|
-
const committed = [];
|
|
64
|
-
for (const chunk of chunks) {
|
|
65
|
-
const failure = await commitChunk(context, sessionId, chunk, fields, signal);
|
|
66
|
-
if (!failure) {
|
|
67
|
-
committed.push(asCommitted(chunk));
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
const verdict = isAmbiguous(failure)
|
|
71
|
-
? await verifyChunkLanded(context, chunk)
|
|
72
|
-
: 'not-committed';
|
|
73
|
-
if (verdict === 'committed') {
|
|
74
|
-
committed.push(asCommitted(chunk));
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
await (0, compensation_1.compensate)(context, sessionId, chunks, committed, failure, fields.now, fields.title, verdict === 'unverified');
|
|
78
|
-
}
|
|
79
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { ChatMessageItem } from '../types';
|
|
2
|
-
import type { HistoryContext } from './setup';
|
|
3
|
-
/** A chunk that committed, retained so it can be rolled back on a later failure. */
|
|
4
|
-
export interface CommittedChunk {
|
|
5
|
-
keys: {
|
|
6
|
-
PK: string;
|
|
7
|
-
SK: string;
|
|
8
|
-
}[];
|
|
9
|
-
count: number;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Undo a failed batch. Always throws. S3 cleanup is split by commit status so
|
|
13
|
-
* no live row is ever left pointing at a deleted object: the never-committed
|
|
14
|
-
* suffix is cleaned immediately, the committed prefix only after its rows are
|
|
15
|
-
* confirmed deleted. If the rollback itself fails, the committed chunks' S3
|
|
16
|
-
* objects are deliberately left in place (their rows may survive) and it
|
|
17
|
-
* raises {@link CompensationFailedError} carrying both the trigger and the
|
|
18
|
-
* rollback error; otherwise it rethrows the trigger.
|
|
19
|
-
*
|
|
20
|
-
* `uncertain` marks the failed chunk (`chunks[committed.length]`) as one whose
|
|
21
|
-
* outcome could not be verified: its rows may be live, so its objects are
|
|
22
|
-
* leaked rather than deleted, while the never-attempted chunks after it are
|
|
23
|
-
* still cleaned.
|
|
24
|
-
*/
|
|
25
|
-
export declare function compensate(context: HistoryContext, sessionId: string, chunks: ChatMessageItem[][], committed: CommittedChunk[], trigger: Error, now: string, title: string | undefined, uncertain: boolean): Promise<never>;
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.compensate = compensate;
|
|
4
|
-
const descriptor_keys_1 = require("../../shared/codec/descriptor-keys");
|
|
5
|
-
const orphans_1 = require("../../shared/codec/s3/orphans");
|
|
6
|
-
const batch_write_1 = require("../../shared/dynamodb/batch-write");
|
|
7
|
-
const errors_1 = require("../../shared/errors/errors");
|
|
8
|
-
const wrap_error_1 = require("../../shared/errors/wrap-error");
|
|
9
|
-
const session_count_1 = require("./session-count");
|
|
10
|
-
/**
|
|
11
|
-
* Best-effort delete the offloaded S3 objects of the `chunks` slice given.
|
|
12
|
-
* {@link compensate} calls it once per commit status, never for the whole
|
|
13
|
-
* batch, so a committed chunk's objects arrive only once its rows are gone.
|
|
14
|
-
*/
|
|
15
|
-
async function cleanBatchS3(context, chunks) {
|
|
16
|
-
if (!context.offloader)
|
|
17
|
-
return;
|
|
18
|
-
const descriptors = chunks.flat().map((item) => item.message);
|
|
19
|
-
await (0, orphans_1.cleanUpS3Orphans)(context.offloader, (0, descriptor_keys_1.collectS3Keys)(descriptors), 'history.addMessages', context.logger);
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Delete every committed chunk's items, then undo their effect on the session
|
|
23
|
-
* row — deleting it outright when this call created it (see
|
|
24
|
-
* {@link revertSessionCreation}), so a failed first append leaves no ghost
|
|
25
|
-
* session holding the rolled-back message's title. A *partial* delete is not a
|
|
26
|
-
* clean creation to undo, so that branch reverts only the count.
|
|
27
|
-
*/
|
|
28
|
-
async function rollbackCommitted(context, sessionId, committed, now, title) {
|
|
29
|
-
const keys = committed.flatMap((chunk) => chunk.keys);
|
|
30
|
-
const total = committed.reduce((sum, chunk) => sum + chunk.count, 0);
|
|
31
|
-
if (keys.length === 0) {
|
|
32
|
-
await (0, session_count_1.revertSessionCreation)(context, sessionId, total, now, title);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
try {
|
|
36
|
-
await (0, batch_write_1.batchWriteAll)(context.client, context.tableName, keys.map((Key) => ({ DeleteRequest: { Key } })), { retry: context.retry });
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
/**
|
|
40
|
-
* batchWriteAll has exactly one throw site and it is always a
|
|
41
|
-
* BatchWriteAllIncompleteError (see Task 9) — asserted, not instanceof-
|
|
42
|
-
* checked, since the false case is unreachable and this project
|
|
43
|
-
* enforces 100% branch coverage with no exceptions.
|
|
44
|
-
*/
|
|
45
|
-
const deleted = error.succeededCount;
|
|
46
|
-
await (0, session_count_1.revertSessionCount)(context, sessionId, deleted, now);
|
|
47
|
-
throw error;
|
|
48
|
-
}
|
|
49
|
-
await (0, session_count_1.revertSessionCreation)(context, sessionId, total, now, title);
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Undo a failed batch. Always throws. S3 cleanup is split by commit status so
|
|
53
|
-
* no live row is ever left pointing at a deleted object: the never-committed
|
|
54
|
-
* suffix is cleaned immediately, the committed prefix only after its rows are
|
|
55
|
-
* confirmed deleted. If the rollback itself fails, the committed chunks' S3
|
|
56
|
-
* objects are deliberately left in place (their rows may survive) and it
|
|
57
|
-
* raises {@link CompensationFailedError} carrying both the trigger and the
|
|
58
|
-
* rollback error; otherwise it rethrows the trigger.
|
|
59
|
-
*
|
|
60
|
-
* `uncertain` marks the failed chunk (`chunks[committed.length]`) as one whose
|
|
61
|
-
* outcome could not be verified: its rows may be live, so its objects are
|
|
62
|
-
* leaked rather than deleted, while the never-attempted chunks after it are
|
|
63
|
-
* still cleaned.
|
|
64
|
-
*/
|
|
65
|
-
async function compensate(context, sessionId, chunks, committed, trigger, now, title, uncertain) {
|
|
66
|
-
if (committed.length > 0) {
|
|
67
|
-
context.logger.warn('history.addMessages compensating committed chunks after a chunk failed', {
|
|
68
|
-
sessionId,
|
|
69
|
-
committedChunks: committed.length,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* The never-attempted suffix never had a DynamoDB row, so it is safe to
|
|
74
|
-
* clean now; an uncertain failed chunk is skipped because its rows may live.
|
|
75
|
-
*/
|
|
76
|
-
const firstDead = committed.length + (uncertain ? 1 : 0);
|
|
77
|
-
await cleanBatchS3(context, chunks.slice(firstDead));
|
|
78
|
-
try {
|
|
79
|
-
await rollbackCommitted(context, sessionId, committed, now, title);
|
|
80
|
-
}
|
|
81
|
-
catch (rollbackError) {
|
|
82
|
-
context.logger.error('history.addMessages rollback failed; messageCount may have drifted', {
|
|
83
|
-
sessionId,
|
|
84
|
-
committedChunks: committed.length,
|
|
85
|
-
});
|
|
86
|
-
/** Skip S3 cleanup here: rollback may have failed, so committed rows might still reference these objects. */
|
|
87
|
-
throw new errors_1.CompensationFailedError(trigger, (0, wrap_error_1.toError)(rollbackError));
|
|
88
|
-
}
|
|
89
|
-
/** Only now that committed rows are confirmed deleted is it safe to delete their S3 objects. */
|
|
90
|
-
await cleanBatchS3(context, chunks.slice(0, committed.length));
|
|
91
|
-
throw trigger;
|
|
92
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { StoredMessage } from '@langchain/core/messages';
|
|
2
|
-
import type { ChatMessageItem } from '../types';
|
|
3
|
-
import type { HistoryContext } from './setup';
|
|
4
|
-
/**
|
|
5
|
-
* Encode a single stored message into its DynamoDB item, keyed by the session
|
|
6
|
-
* partition and a `MSG#<ulid>` sort key. A `ttlTimestamp` stamps the uniform
|
|
7
|
-
* whole-conversation expiry shared by every message in the session.
|
|
8
|
-
*/
|
|
9
|
-
export declare function buildMessageItem(context: HistoryContext, sessionId: string, ulid: string, message: StoredMessage, ttlTimestamp?: number): Promise<ChatMessageItem>;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildMessageItem = buildMessageItem;
|
|
4
|
-
const encode_1 = require("../../shared/codec/encode");
|
|
5
|
-
const keys_1 = require("./keys");
|
|
6
|
-
function codecDeps(context) {
|
|
7
|
-
return { serde: context.serde, compression: context.compression, offloader: context.offloader };
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Encode a single stored message into its DynamoDB item, keyed by the session
|
|
11
|
-
* partition and a `MSG#<ulid>` sort key. A `ttlTimestamp` stamps the uniform
|
|
12
|
-
* whole-conversation expiry shared by every message in the session.
|
|
13
|
-
*/
|
|
14
|
-
async function buildMessageItem(context, sessionId, ulid, message, ttlTimestamp) {
|
|
15
|
-
const descriptor = await (0, encode_1.encodePayload)(message, codecDeps(context), {
|
|
16
|
-
keyParts: [sessionId, ulid],
|
|
17
|
-
});
|
|
18
|
-
const item = {
|
|
19
|
-
PK: (0, keys_1.sessionPartition)(sessionId),
|
|
20
|
-
SK: (0, keys_1.messageSortKey)(ulid),
|
|
21
|
-
sessionId,
|
|
22
|
-
message: descriptor,
|
|
23
|
-
};
|
|
24
|
-
if (ttlTimestamp !== undefined)
|
|
25
|
-
item.ttl = ttlTimestamp;
|
|
26
|
-
return item;
|
|
27
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/** Reserved separator joining sort-key segments; forbidden inside a session id. */
|
|
2
|
-
export declare const SORT_KEY_SEPARATOR = "#";
|
|
3
|
-
/** Fixed sort key for the per-session metadata item. */
|
|
4
|
-
export declare const SESSION_SORT_KEY = "HISTORY#SESSION";
|
|
5
|
-
/** Partition key for a chat session: the adapter tag plus the session id. */
|
|
6
|
-
export declare function sessionPartition(sessionId: string): string;
|
|
7
|
-
/** Sort key for a single message item, ordered by its monotonic ULID. */
|
|
8
|
-
export declare function messageSortKey(ulid: string): string;
|
|
9
|
-
/**
|
|
10
|
-
* True when `sortKey` is one this adapter writes. A partition query carries no
|
|
11
|
-
* sort-key condition, so a partition-wide delete uses this to leave any row it
|
|
12
|
-
* does not own in place rather than deleting the whole partition blindly.
|
|
13
|
-
*/
|
|
14
|
-
export declare function isHistorySortKey(sortKey: string): boolean;
|
|
15
|
-
/** `begins_with` prefix selecting every message item in a session. */
|
|
16
|
-
export declare function messageSortKeyPrefix(): string;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SESSION_SORT_KEY = exports.SORT_KEY_SEPARATOR = void 0;
|
|
4
|
-
exports.sessionPartition = sessionPartition;
|
|
5
|
-
exports.messageSortKey = messageSortKey;
|
|
6
|
-
exports.isHistorySortKey = isHistorySortKey;
|
|
7
|
-
exports.messageSortKeyPrefix = messageSortKeyPrefix;
|
|
8
|
-
/** Reserved separator joining sort-key segments; forbidden inside a session id. */
|
|
9
|
-
exports.SORT_KEY_SEPARATOR = '#';
|
|
10
|
-
/**
|
|
11
|
-
* Item-kind tag distinguishing this adapter's sort keys from another
|
|
12
|
-
* adapter's on a table shared via `DynamoDBFactory.createAll()` — matches the
|
|
13
|
-
* pattern the checkpointer module already uses for its own META#/PAYLOAD#/
|
|
14
|
-
* WRITE# keys. Without it, `SESSION_SORT_KEY` alone was a bare, common-word
|
|
15
|
-
* literal a store caller could produce by accident (e.g.
|
|
16
|
-
* `store.put([sessionId], 'SESSION', ...)`, since `sortKey` collapses a
|
|
17
|
-
* single-element namespace down to just the key).
|
|
18
|
-
*/
|
|
19
|
-
const ADAPTER_PREFIX = `HISTORY${exports.SORT_KEY_SEPARATOR}`;
|
|
20
|
-
/** Fixed sort key for the per-session metadata item. */
|
|
21
|
-
exports.SESSION_SORT_KEY = `${ADAPTER_PREFIX}SESSION`;
|
|
22
|
-
const MESSAGE_PREFIX = `${ADAPTER_PREFIX}MSG#`;
|
|
23
|
-
/**
|
|
24
|
-
* Adapter tag prefixed to every chat-history partition key — see the
|
|
25
|
-
* equivalent in checkpointer/internal/keys.ts for why the three adapters'
|
|
26
|
-
* partitions must not overlap on a shared table.
|
|
27
|
-
*/
|
|
28
|
-
const ADAPTER_PARTITION_PREFIX = `HIST${exports.SORT_KEY_SEPARATOR}`;
|
|
29
|
-
/** Partition key for a chat session: the adapter tag plus the session id. */
|
|
30
|
-
function sessionPartition(sessionId) {
|
|
31
|
-
return `${ADAPTER_PARTITION_PREFIX}${sessionId}`;
|
|
32
|
-
}
|
|
33
|
-
/** Sort key for a single message item, ordered by its monotonic ULID. */
|
|
34
|
-
function messageSortKey(ulid) {
|
|
35
|
-
return `${MESSAGE_PREFIX}${ulid}`;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* True when `sortKey` is one this adapter writes. A partition query carries no
|
|
39
|
-
* sort-key condition, so a partition-wide delete uses this to leave any row it
|
|
40
|
-
* does not own in place rather than deleting the whole partition blindly.
|
|
41
|
-
*/
|
|
42
|
-
function isHistorySortKey(sortKey) {
|
|
43
|
-
return sortKey.startsWith(ADAPTER_PREFIX);
|
|
44
|
-
}
|
|
45
|
-
/** `begins_with` prefix selecting every message item in a session. */
|
|
46
|
-
function messageSortKeyPrefix() {
|
|
47
|
-
return MESSAGE_PREFIX;
|
|
48
|
-
}
|