@farukada/aws-langgraph-dynamodb-ts 0.9.0 → 1.0.0-rc.2
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 +1720 -154
- package/dist/backfill/backfill.d.ts +168 -0
- package/dist/backfill/backfill.js +393 -0
- package/dist/checkpointer/actions/delete-thread.d.ts +47 -6
- package/dist/checkpointer/actions/delete-thread.js +58 -21
- package/dist/checkpointer/actions/get-tuple.d.ts +29 -4
- package/dist/checkpointer/actions/get-tuple.js +44 -10
- package/dist/checkpointer/actions/list.d.ts +46 -4
- package/dist/checkpointer/actions/list.js +121 -66
- package/dist/checkpointer/actions/put-writes.d.ts +41 -9
- package/dist/checkpointer/actions/put-writes.js +62 -77
- package/dist/checkpointer/actions/put.d.ts +83 -4
- package/dist/checkpointer/actions/put.js +177 -25
- package/dist/checkpointer/internal/delta-history.d.ts +112 -0
- package/dist/checkpointer/internal/delta-history.js +252 -0
- package/dist/checkpointer/internal/listing.d.ts +149 -0
- package/dist/checkpointer/internal/listing.js +245 -0
- package/dist/checkpointer/internal/parse.d.ts +262 -0
- package/dist/checkpointer/internal/parse.js +372 -0
- package/dist/checkpointer/internal/pending-writes.d.ts +275 -0
- package/dist/checkpointer/internal/pending-writes.js +588 -0
- package/dist/checkpointer/internal/read.d.ts +130 -0
- package/dist/checkpointer/internal/read.js +264 -0
- package/dist/checkpointer/internal/rows.d.ts +571 -0
- package/dist/checkpointer/internal/rows.js +834 -0
- package/dist/checkpointer/internal/setup.d.ts +42 -19
- package/dist/checkpointer/internal/setup.js +65 -29
- package/dist/checkpointer/saver.d.ts +256 -16
- package/dist/checkpointer/saver.js +275 -29
- package/dist/checkpointer/types.d.ts +39 -39
- package/dist/checkpointer/types.js +10 -1
- package/dist/factory/factory.d.ts +134 -28
- package/dist/factory/factory.js +240 -21
- package/dist/factory/types.d.ts +76 -0
- package/dist/factory/types.js +10 -0
- package/dist/history/actions/add-messages.d.ts +31 -4
- package/dist/history/actions/add-messages.js +38 -58
- package/dist/history/actions/clear.d.ts +49 -6
- package/dist/history/actions/clear.js +66 -14
- package/dist/history/actions/get-messages.d.ts +54 -6
- package/dist/history/actions/get-messages.js +126 -43
- package/dist/history/actions/list-sessions.d.ts +52 -10
- package/dist/history/actions/list-sessions.js +139 -40
- package/dist/history/actions/reconcile-count.d.ts +42 -10
- package/dist/history/actions/reconcile-count.js +45 -45
- package/dist/history/chat-message-history.d.ts +220 -33
- package/dist/history/chat-message-history.js +240 -43
- package/dist/history/internal/append.d.ts +212 -0
- package/dist/history/internal/append.js +500 -0
- package/dist/history/internal/message-read.d.ts +84 -0
- package/dist/history/internal/message-read.js +204 -0
- package/dist/history/internal/parse.d.ts +153 -0
- package/dist/history/internal/parse.js +252 -0
- package/dist/history/internal/rows.d.ts +195 -0
- package/dist/history/internal/rows.js +250 -0
- package/dist/history/internal/session.d.ts +331 -0
- package/dist/history/internal/session.js +628 -0
- package/dist/history/internal/setup.d.ts +52 -17
- package/dist/history/internal/setup.js +92 -21
- package/dist/history/session-adapter.d.ts +102 -7
- package/dist/history/session-adapter.js +103 -9
- package/dist/history/types.d.ts +80 -29
- package/dist/history/types.js +10 -1
- package/dist/index.d.ts +42 -11
- package/dist/index.js +33 -12
- package/dist/shared/adapter.d.ts +135 -0
- package/dist/shared/adapter.js +143 -0
- package/dist/shared/clock.d.ts +51 -2
- package/dist/shared/clock.js +57 -2
- package/dist/shared/codec/codec.d.ts +288 -13
- package/dist/shared/codec/codec.js +416 -19
- package/dist/shared/codec/compression.d.ts +43 -7
- package/dist/shared/codec/compression.js +53 -13
- package/dist/shared/codec/json-serde.d.ts +76 -4
- package/dist/shared/codec/json-serde.js +181 -8
- package/dist/shared/codec/s3/client-types.d.ts +53 -0
- package/dist/shared/codec/s3/client-types.js +26 -0
- package/dist/shared/codec/s3/client.d.ts +43 -10
- package/dist/shared/codec/s3/client.js +82 -9
- package/dist/shared/codec/s3/config.d.ts +242 -11
- package/dist/shared/codec/s3/config.js +293 -11
- package/dist/shared/codec/s3/lifecycle.d.ts +164 -6
- package/dist/shared/codec/s3/lifecycle.js +335 -27
- package/dist/shared/codec/s3/offloader.d.ts +393 -18
- package/dist/shared/codec/s3/offloader.js +595 -37
- package/dist/shared/concurrency.d.ts +43 -0
- package/dist/shared/concurrency.js +78 -0
- package/dist/shared/dynamodb/abort.d.ts +47 -0
- package/dist/shared/dynamodb/abort.js +59 -0
- package/dist/shared/dynamodb/batch-write.d.ts +77 -14
- package/dist/shared/dynamodb/batch-write.js +146 -27
- package/dist/shared/dynamodb/cancellation.d.ts +121 -4
- package/dist/shared/dynamodb/cancellation.js +147 -3
- package/dist/shared/dynamodb/client.d.ts +162 -8
- package/dist/shared/dynamodb/client.js +153 -5
- package/dist/shared/dynamodb/idempotent-write.d.ts +551 -0
- package/dist/shared/dynamodb/idempotent-write.js +593 -0
- package/dist/shared/dynamodb/paginate.d.ts +105 -9
- package/dist/shared/dynamodb/paginate.js +175 -7
- package/dist/shared/dynamodb/partition-delete.d.ts +185 -14
- package/dist/shared/dynamodb/partition-delete.js +314 -44
- package/dist/shared/dynamodb/recency-index.d.ts +231 -0
- package/dist/shared/dynamodb/recency-index.js +377 -0
- package/dist/shared/dynamodb/retry.d.ts +276 -8
- package/dist/shared/dynamodb/retry.js +433 -23
- package/dist/shared/dynamodb/table-schema.d.ts +190 -0
- package/dist/shared/dynamodb/table-schema.js +209 -0
- package/dist/shared/errors/base-error.d.ts +184 -10
- package/dist/shared/errors/base-error.js +160 -14
- package/dist/shared/errors/boundary.d.ts +71 -0
- package/dist/shared/errors/boundary.js +143 -0
- package/dist/shared/errors/classify.d.ts +97 -0
- package/dist/shared/errors/classify.js +257 -0
- package/dist/shared/errors/error-code.d.ts +77 -2
- package/dist/shared/errors/error-code.js +83 -1
- package/dist/shared/errors/errors.d.ts +158 -59
- package/dist/shared/errors/errors.js +219 -92
- package/dist/shared/logging/logger.d.ts +69 -3
- package/dist/shared/logging/logger.js +97 -3
- package/dist/shared/logging/redaction.d.ts +92 -8
- package/dist/shared/logging/redaction.js +273 -17
- package/dist/shared/logging/secret-patterns.d.ts +149 -19
- package/dist/shared/logging/secret-patterns.js +188 -27
- package/dist/shared/logging/truncate.d.ts +197 -0
- package/dist/shared/logging/truncate.js +231 -0
- package/dist/shared/options.d.ts +59 -7
- package/dist/shared/options.js +9 -1
- package/dist/shared/ulid.d.ts +77 -7
- package/dist/shared/ulid.js +103 -8
- package/dist/shared/validation/collaborators.d.ts +141 -0
- package/dist/shared/validation/collaborators.js +188 -0
- package/dist/shared/validation/option-shape.d.ts +89 -0
- package/dist/shared/validation/option-shape.js +113 -0
- package/dist/shared/validation/options.d.ts +145 -0
- package/dist/shared/validation/options.js +328 -0
- package/dist/shared/validation/primitives.d.ts +288 -21
- package/dist/shared/validation/primitives.js +353 -50
- package/dist/shared/validation/ttl.d.ts +66 -10
- package/dist/shared/validation/ttl.js +113 -15
- package/dist/store/actions/list-namespaces.d.ts +76 -6
- package/dist/store/actions/list-namespaces.js +166 -24
- package/dist/store/actions/put.d.ts +33 -8
- package/dist/store/actions/put.js +53 -60
- package/dist/store/actions/reconcile-vector-index.d.ts +31 -10
- package/dist/store/actions/reconcile-vector-index.js +34 -15
- package/dist/store/actions/search.d.ts +34 -6
- package/dist/store/actions/search.js +56 -51
- package/dist/store/internal/batch-plan.d.ts +26 -0
- package/dist/store/internal/batch-plan.js +109 -0
- package/dist/store/internal/filter.d.ts +36 -3
- package/dist/store/internal/filter.js +66 -15
- package/dist/store/internal/get-item.d.ts +45 -0
- package/dist/store/internal/get-item.js +115 -0
- package/dist/store/internal/item-write.d.ts +230 -0
- package/dist/store/internal/item-write.js +463 -0
- package/dist/store/internal/parse.d.ts +225 -0
- package/dist/store/internal/parse.js +350 -0
- package/dist/store/internal/rows.d.ts +355 -0
- package/dist/store/internal/rows.js +447 -0
- package/dist/store/internal/semantic-search.d.ts +161 -6
- package/dist/store/internal/semantic-search.js +360 -18
- package/dist/store/internal/setup.d.ts +77 -20
- package/dist/store/internal/setup.js +178 -47
- package/dist/store/internal/table-search.d.ts +100 -0
- package/dist/store/internal/table-search.js +213 -0
- package/dist/store/internal/vector-index.d.ts +247 -0
- package/dist/store/internal/vector-index.js +546 -0
- package/dist/store/store.d.ts +270 -17
- package/dist/store/store.js +329 -38
- package/dist/store/types.d.ts +76 -26
- package/dist/store/types.js +13 -1
- package/dist/store/vector-backend.d.ts +64 -4
- package/dist/store/vector-backend.js +15 -1
- package/package.json +58 -36
- package/dist/checkpointer/actions/delete-thread.d.ts.map +0 -1
- package/dist/checkpointer/actions/delete-thread.js.map +0 -1
- package/dist/checkpointer/actions/get-tuple.d.ts.map +0 -1
- package/dist/checkpointer/actions/get-tuple.js.map +0 -1
- package/dist/checkpointer/actions/list.d.ts.map +0 -1
- package/dist/checkpointer/actions/list.js.map +0 -1
- package/dist/checkpointer/actions/put-writes.d.ts.map +0 -1
- package/dist/checkpointer/actions/put-writes.js.map +0 -1
- package/dist/checkpointer/actions/put.d.ts.map +0 -1
- package/dist/checkpointer/actions/put.js.map +0 -1
- package/dist/checkpointer/internal/assemble.d.ts +0 -10
- package/dist/checkpointer/internal/assemble.d.ts.map +0 -1
- package/dist/checkpointer/internal/assemble.js +0 -37
- package/dist/checkpointer/internal/assemble.js.map +0 -1
- package/dist/checkpointer/internal/configurable.d.ts +0 -13
- package/dist/checkpointer/internal/configurable.d.ts.map +0 -1
- package/dist/checkpointer/internal/configurable.js +0 -23
- package/dist/checkpointer/internal/configurable.js.map +0 -1
- package/dist/checkpointer/internal/fetch.d.ts +0 -10
- package/dist/checkpointer/internal/fetch.d.ts.map +0 -1
- package/dist/checkpointer/internal/fetch.js +0 -46
- package/dist/checkpointer/internal/fetch.js.map +0 -1
- package/dist/checkpointer/internal/filter-match.d.ts +0 -12
- package/dist/checkpointer/internal/filter-match.d.ts.map +0 -1
- package/dist/checkpointer/internal/filter-match.js +0 -14
- package/dist/checkpointer/internal/filter-match.js.map +0 -1
- package/dist/checkpointer/internal/item-reader.d.ts +0 -55
- package/dist/checkpointer/internal/item-reader.d.ts.map +0 -1
- package/dist/checkpointer/internal/item-reader.js +0 -88
- package/dist/checkpointer/internal/item-reader.js.map +0 -1
- package/dist/checkpointer/internal/item-writer.d.ts +0 -26
- package/dist/checkpointer/internal/item-writer.d.ts.map +0 -1
- package/dist/checkpointer/internal/item-writer.js +0 -92
- package/dist/checkpointer/internal/item-writer.js.map +0 -1
- package/dist/checkpointer/internal/keys.d.ts +0 -31
- package/dist/checkpointer/internal/keys.d.ts.map +0 -1
- package/dist/checkpointer/internal/keys.js +0 -87
- package/dist/checkpointer/internal/keys.js.map +0 -1
- package/dist/checkpointer/internal/query.d.ts +0 -20
- package/dist/checkpointer/internal/query.d.ts.map +0 -1
- package/dist/checkpointer/internal/query.js +0 -36
- package/dist/checkpointer/internal/query.js.map +0 -1
- package/dist/checkpointer/internal/setup.d.ts.map +0 -1
- package/dist/checkpointer/internal/setup.js.map +0 -1
- package/dist/checkpointer/internal/special-write-cas.d.ts +0 -30
- package/dist/checkpointer/internal/special-write-cas.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-cas.js +0 -104
- package/dist/checkpointer/internal/special-write-cas.js.map +0 -1
- package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -24
- package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-cleanup.js +0 -47
- package/dist/checkpointer/internal/special-write-cleanup.js.map +0 -1
- package/dist/checkpointer/internal/special-write-verify.d.ts +0 -54
- package/dist/checkpointer/internal/special-write-verify.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-verify.js +0 -65
- package/dist/checkpointer/internal/special-write-verify.js.map +0 -1
- package/dist/checkpointer/internal/validation.d.ts +0 -13
- package/dist/checkpointer/internal/validation.d.ts.map +0 -1
- package/dist/checkpointer/internal/validation.js +0 -30
- package/dist/checkpointer/internal/validation.js.map +0 -1
- package/dist/checkpointer/internal/write-guard.d.ts +0 -13
- package/dist/checkpointer/internal/write-guard.d.ts.map +0 -1
- package/dist/checkpointer/internal/write-guard.js +0 -39
- package/dist/checkpointer/internal/write-guard.js.map +0 -1
- package/dist/checkpointer/internal/write-index.d.ts +0 -37
- package/dist/checkpointer/internal/write-index.d.ts.map +0 -1
- package/dist/checkpointer/internal/write-index.js +0 -42
- package/dist/checkpointer/internal/write-index.js.map +0 -1
- package/dist/checkpointer/saver.d.ts.map +0 -1
- package/dist/checkpointer/saver.js.map +0 -1
- package/dist/checkpointer/types.d.ts.map +0 -1
- package/dist/checkpointer/types.js.map +0 -1
- package/dist/factory/factory.d.ts.map +0 -1
- package/dist/factory/factory.js.map +0 -1
- package/dist/history/actions/add-messages.d.ts.map +0 -1
- package/dist/history/actions/add-messages.js.map +0 -1
- package/dist/history/actions/clear.d.ts.map +0 -1
- package/dist/history/actions/clear.js.map +0 -1
- package/dist/history/actions/get-messages.d.ts.map +0 -1
- package/dist/history/actions/get-messages.js.map +0 -1
- package/dist/history/actions/list-sessions.d.ts.map +0 -1
- package/dist/history/actions/list-sessions.js.map +0 -1
- package/dist/history/actions/reconcile-count.d.ts.map +0 -1
- package/dist/history/actions/reconcile-count.js.map +0 -1
- package/dist/history/chat-message-history.d.ts.map +0 -1
- package/dist/history/chat-message-history.js.map +0 -1
- package/dist/history/internal/append-saga.d.ts +0 -20
- package/dist/history/internal/append-saga.d.ts.map +0 -1
- package/dist/history/internal/append-saga.js +0 -35
- package/dist/history/internal/append-saga.js.map +0 -1
- package/dist/history/internal/compensation.d.ts +0 -21
- package/dist/history/internal/compensation.d.ts.map +0 -1
- package/dist/history/internal/compensation.js +0 -84
- package/dist/history/internal/compensation.js.map +0 -1
- package/dist/history/internal/item-mapper.d.ts +0 -12
- package/dist/history/internal/item-mapper.d.ts.map +0 -1
- package/dist/history/internal/item-mapper.js +0 -33
- package/dist/history/internal/item-mapper.js.map +0 -1
- package/dist/history/internal/keys.d.ts +0 -17
- package/dist/history/internal/keys.d.ts.map +0 -1
- package/dist/history/internal/keys.js +0 -49
- package/dist/history/internal/keys.js.map +0 -1
- package/dist/history/internal/message-chunker.d.ts +0 -14
- package/dist/history/internal/message-chunker.d.ts.map +0 -1
- package/dist/history/internal/message-chunker.js +0 -68
- package/dist/history/internal/message-chunker.js.map +0 -1
- package/dist/history/internal/message-transaction.d.ts +0 -26
- package/dist/history/internal/message-transaction.d.ts.map +0 -1
- package/dist/history/internal/message-transaction.js +0 -60
- package/dist/history/internal/message-transaction.js.map +0 -1
- package/dist/history/internal/query.d.ts +0 -10
- package/dist/history/internal/query.d.ts.map +0 -1
- package/dist/history/internal/query.js +0 -31
- package/dist/history/internal/query.js.map +0 -1
- package/dist/history/internal/session-count.d.ts +0 -41
- package/dist/history/internal/session-count.d.ts.map +0 -1
- package/dist/history/internal/session-count.js +0 -109
- package/dist/history/internal/session-count.js.map +0 -1
- package/dist/history/internal/session-title.d.ts +0 -20
- package/dist/history/internal/session-title.d.ts.map +0 -1
- package/dist/history/internal/session-title.js +0 -44
- package/dist/history/internal/session-title.js.map +0 -1
- package/dist/history/internal/session-update.d.ts +0 -28
- package/dist/history/internal/session-update.d.ts.map +0 -1
- package/dist/history/internal/session-update.js +0 -70
- package/dist/history/internal/session-update.js.map +0 -1
- package/dist/history/internal/setup.d.ts.map +0 -1
- package/dist/history/internal/setup.js.map +0 -1
- package/dist/history/internal/title-generator.d.ts +0 -13
- package/dist/history/internal/title-generator.d.ts.map +0 -1
- package/dist/history/internal/title-generator.js +0 -25
- package/dist/history/internal/title-generator.js.map +0 -1
- package/dist/history/internal/ttl-anchor.d.ts +0 -25
- package/dist/history/internal/ttl-anchor.d.ts.map +0 -1
- package/dist/history/internal/ttl-anchor.js +0 -38
- package/dist/history/internal/ttl-anchor.js.map +0 -1
- package/dist/history/internal/validation.d.ts +0 -9
- package/dist/history/internal/validation.d.ts.map +0 -1
- package/dist/history/internal/validation.js +0 -16
- package/dist/history/internal/validation.js.map +0 -1
- package/dist/history/session-adapter.d.ts.map +0 -1
- package/dist/history/session-adapter.js.map +0 -1
- package/dist/history/types.d.ts.map +0 -1
- package/dist/history/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/shared/clock.d.ts.map +0 -1
- package/dist/shared/clock.js.map +0 -1
- package/dist/shared/codec/codec.d.ts.map +0 -1
- package/dist/shared/codec/codec.js.map +0 -1
- package/dist/shared/codec/compression.d.ts.map +0 -1
- package/dist/shared/codec/compression.js.map +0 -1
- package/dist/shared/codec/descriptor-keys.d.ts +0 -4
- package/dist/shared/codec/descriptor-keys.d.ts.map +0 -1
- package/dist/shared/codec/descriptor-keys.js +0 -14
- package/dist/shared/codec/descriptor-keys.js.map +0 -1
- package/dist/shared/codec/json-serde.d.ts.map +0 -1
- package/dist/shared/codec/json-serde.js.map +0 -1
- package/dist/shared/codec/s3/client.d.ts.map +0 -1
- package/dist/shared/codec/s3/client.js.map +0 -1
- package/dist/shared/codec/s3/config.d.ts.map +0 -1
- package/dist/shared/codec/s3/config.js.map +0 -1
- package/dist/shared/codec/s3/delete.d.ts +0 -8
- package/dist/shared/codec/s3/delete.d.ts.map +0 -1
- package/dist/shared/codec/s3/delete.js +0 -29
- package/dist/shared/codec/s3/delete.js.map +0 -1
- package/dist/shared/codec/s3/lifecycle.d.ts.map +0 -1
- package/dist/shared/codec/s3/lifecycle.js.map +0 -1
- package/dist/shared/codec/s3/offloader.d.ts.map +0 -1
- package/dist/shared/codec/s3/offloader.js.map +0 -1
- package/dist/shared/codec/s3/orphans.d.ts +0 -18
- package/dist/shared/codec/s3/orphans.d.ts.map +0 -1
- package/dist/shared/codec/s3/orphans.js +0 -58
- package/dist/shared/codec/s3/orphans.js.map +0 -1
- package/dist/shared/codec/s3/read-write.d.ts +0 -14
- package/dist/shared/codec/s3/read-write.d.ts.map +0 -1
- package/dist/shared/codec/s3/read-write.js +0 -43
- package/dist/shared/codec/s3/read-write.js.map +0 -1
- package/dist/shared/codec/s3/retry.d.ts +0 -5
- package/dist/shared/codec/s3/retry.d.ts.map +0 -1
- package/dist/shared/codec/s3/retry.js +0 -25
- package/dist/shared/codec/s3/retry.js.map +0 -1
- package/dist/shared/constants.d.ts +0 -64
- package/dist/shared/constants.d.ts.map +0 -1
- package/dist/shared/constants.js +0 -67
- package/dist/shared/constants.js.map +0 -1
- package/dist/shared/dynamodb/backoff.d.ts +0 -15
- package/dist/shared/dynamodb/backoff.d.ts.map +0 -1
- package/dist/shared/dynamodb/backoff.js +0 -48
- package/dist/shared/dynamodb/backoff.js.map +0 -1
- package/dist/shared/dynamodb/batch-write.d.ts.map +0 -1
- package/dist/shared/dynamodb/batch-write.js.map +0 -1
- package/dist/shared/dynamodb/cancellation.d.ts.map +0 -1
- package/dist/shared/dynamodb/cancellation.js.map +0 -1
- package/dist/shared/dynamodb/client.d.ts.map +0 -1
- package/dist/shared/dynamodb/client.js.map +0 -1
- package/dist/shared/dynamodb/conditional-put.d.ts +0 -51
- package/dist/shared/dynamodb/conditional-put.d.ts.map +0 -1
- package/dist/shared/dynamodb/conditional-put.js +0 -59
- package/dist/shared/dynamodb/conditional-put.js.map +0 -1
- package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -19
- package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +0 -1
- package/dist/shared/dynamodb/drain-unprocessed.js +0 -44
- package/dist/shared/dynamodb/drain-unprocessed.js.map +0 -1
- package/dist/shared/dynamodb/paginate-core.d.ts +0 -22
- package/dist/shared/dynamodb/paginate-core.d.ts.map +0 -1
- package/dist/shared/dynamodb/paginate-core.js +0 -52
- package/dist/shared/dynamodb/paginate-core.js.map +0 -1
- package/dist/shared/dynamodb/paginate.d.ts.map +0 -1
- package/dist/shared/dynamodb/paginate.js.map +0 -1
- package/dist/shared/dynamodb/partition-delete.d.ts.map +0 -1
- package/dist/shared/dynamodb/partition-delete.js.map +0 -1
- package/dist/shared/dynamodb/retry-classifier.d.ts +0 -9
- package/dist/shared/dynamodb/retry-classifier.d.ts.map +0 -1
- package/dist/shared/dynamodb/retry-classifier.js +0 -87
- package/dist/shared/dynamodb/retry-classifier.js.map +0 -1
- package/dist/shared/dynamodb/retry.d.ts.map +0 -1
- package/dist/shared/dynamodb/retry.js.map +0 -1
- package/dist/shared/dynamodb/scan.d.ts +0 -15
- package/dist/shared/dynamodb/scan.d.ts.map +0 -1
- package/dist/shared/dynamodb/scan.js +0 -20
- package/dist/shared/dynamodb/scan.js.map +0 -1
- package/dist/shared/dynamodb/types.d.ts +0 -24
- package/dist/shared/dynamodb/types.d.ts.map +0 -1
- package/dist/shared/dynamodb/types.js +0 -3
- package/dist/shared/dynamodb/types.js.map +0 -1
- package/dist/shared/errors/base-error.d.ts.map +0 -1
- package/dist/shared/errors/base-error.js.map +0 -1
- package/dist/shared/errors/error-code.d.ts.map +0 -1
- package/dist/shared/errors/error-code.js.map +0 -1
- package/dist/shared/errors/errors.d.ts.map +0 -1
- package/dist/shared/errors/errors.js.map +0 -1
- package/dist/shared/errors/wrap-error.d.ts +0 -16
- package/dist/shared/errors/wrap-error.d.ts.map +0 -1
- package/dist/shared/errors/wrap-error.js +0 -30
- package/dist/shared/errors/wrap-error.js.map +0 -1
- package/dist/shared/logging/logger.d.ts.map +0 -1
- package/dist/shared/logging/logger.js.map +0 -1
- package/dist/shared/logging/redaction-walk.d.ts +0 -23
- package/dist/shared/logging/redaction-walk.d.ts.map +0 -1
- package/dist/shared/logging/redaction-walk.js +0 -92
- package/dist/shared/logging/redaction-walk.js.map +0 -1
- package/dist/shared/logging/redaction.d.ts.map +0 -1
- package/dist/shared/logging/redaction.js.map +0 -1
- package/dist/shared/logging/secret-patterns.d.ts.map +0 -1
- package/dist/shared/logging/secret-patterns.js.map +0 -1
- package/dist/shared/options.d.ts.map +0 -1
- package/dist/shared/options.js.map +0 -1
- package/dist/shared/ulid.d.ts.map +0 -1
- package/dist/shared/ulid.js.map +0 -1
- package/dist/shared/validation/primitives.d.ts.map +0 -1
- package/dist/shared/validation/primitives.js.map +0 -1
- package/dist/shared/validation/ttl.d.ts.map +0 -1
- package/dist/shared/validation/ttl.js.map +0 -1
- package/dist/store/actions/get.d.ts +0 -5
- package/dist/store/actions/get.d.ts.map +0 -1
- package/dist/store/actions/get.js +0 -35
- package/dist/store/actions/get.js.map +0 -1
- package/dist/store/actions/list-namespaces.d.ts.map +0 -1
- package/dist/store/actions/list-namespaces.js.map +0 -1
- package/dist/store/actions/put.d.ts.map +0 -1
- package/dist/store/actions/put.js.map +0 -1
- package/dist/store/actions/reconcile-vector-index.d.ts.map +0 -1
- package/dist/store/actions/reconcile-vector-index.js.map +0 -1
- package/dist/store/actions/search.d.ts.map +0 -1
- package/dist/store/actions/search.js.map +0 -1
- package/dist/store/internal/backend-search.d.ts +0 -5
- package/dist/store/internal/backend-search.d.ts.map +0 -1
- package/dist/store/internal/backend-search.js +0 -68
- package/dist/store/internal/backend-search.js.map +0 -1
- package/dist/store/internal/filter.d.ts.map +0 -1
- package/dist/store/internal/filter.js.map +0 -1
- package/dist/store/internal/index-reconcile.d.ts +0 -22
- package/dist/store/internal/index-reconcile.d.ts.map +0 -1
- package/dist/store/internal/index-reconcile.js +0 -105
- package/dist/store/internal/index-reconcile.js.map +0 -1
- package/dist/store/internal/index-sync.d.ts +0 -11
- package/dist/store/internal/index-sync.d.ts.map +0 -1
- package/dist/store/internal/index-sync.js +0 -26
- package/dist/store/internal/index-sync.js.map +0 -1
- package/dist/store/internal/item-mapper.d.ts +0 -25
- package/dist/store/internal/item-mapper.d.ts.map +0 -1
- package/dist/store/internal/item-mapper.js +0 -53
- package/dist/store/internal/item-mapper.js.map +0 -1
- package/dist/store/internal/keys.d.ts +0 -18
- package/dist/store/internal/keys.d.ts.map +0 -1
- package/dist/store/internal/keys.js +0 -42
- package/dist/store/internal/keys.js.map +0 -1
- package/dist/store/internal/namespace-match.d.ts +0 -12
- package/dist/store/internal/namespace-match.d.ts.map +0 -1
- package/dist/store/internal/namespace-match.js +0 -41
- package/dist/store/internal/namespace-match.js.map +0 -1
- package/dist/store/internal/overwrite-swap.d.ts +0 -33
- package/dist/store/internal/overwrite-swap.d.ts.map +0 -1
- package/dist/store/internal/overwrite-swap.js +0 -62
- package/dist/store/internal/overwrite-swap.js.map +0 -1
- package/dist/store/internal/persist.d.ts +0 -27
- package/dist/store/internal/persist.d.ts.map +0 -1
- package/dist/store/internal/persist.js +0 -59
- package/dist/store/internal/persist.js.map +0 -1
- package/dist/store/internal/query.d.ts +0 -6
- package/dist/store/internal/query.d.ts.map +0 -1
- package/dist/store/internal/query.js +0 -32
- package/dist/store/internal/query.js.map +0 -1
- package/dist/store/internal/ranker.d.ts +0 -13
- package/dist/store/internal/ranker.d.ts.map +0 -1
- package/dist/store/internal/ranker.js +0 -31
- package/dist/store/internal/ranker.js.map +0 -1
- package/dist/store/internal/read-existing.d.ts +0 -19
- package/dist/store/internal/read-existing.d.ts.map +0 -1
- package/dist/store/internal/read-existing.js +0 -29
- package/dist/store/internal/read-existing.js.map +0 -1
- package/dist/store/internal/score-direction.d.ts +0 -32
- package/dist/store/internal/score-direction.d.ts.map +0 -1
- package/dist/store/internal/score-direction.js +0 -39
- package/dist/store/internal/score-direction.js.map +0 -1
- package/dist/store/internal/search-filter.d.ts +0 -4
- package/dist/store/internal/search-filter.d.ts.map +0 -1
- package/dist/store/internal/search-filter.js +0 -11
- package/dist/store/internal/search-filter.js.map +0 -1
- package/dist/store/internal/semantic-search.d.ts.map +0 -1
- package/dist/store/internal/semantic-search.js.map +0 -1
- package/dist/store/internal/setup.d.ts.map +0 -1
- package/dist/store/internal/setup.js.map +0 -1
- package/dist/store/internal/validation.d.ts +0 -13
- package/dist/store/internal/validation.d.ts.map +0 -1
- package/dist/store/internal/validation.js +0 -35
- package/dist/store/internal/validation.js.map +0 -1
- package/dist/store/internal/write-verify.d.ts +0 -37
- package/dist/store/internal/write-verify.d.ts.map +0 -1
- package/dist/store/internal/write-verify.js +0 -68
- package/dist/store/internal/write-verify.js.map +0 -1
- package/dist/store/store.d.ts.map +0 -1
- package/dist/store/store.js.map +0 -1
- package/dist/store/types.d.ts.map +0 -1
- package/dist/store/types.js.map +0 -1
- package/dist/store/vector-backend.d.ts.map +0 -1
- package/dist/store/vector-backend.js.map +0 -1
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides how a session's message key space is read.
|
|
4
|
+
*
|
|
5
|
+
* A read admits only rows this package wrote as a message of this session,
|
|
6
|
+
* refusing any other row in the key space rather than skipping it, treats an
|
|
7
|
+
* expired row as absent however long the sweep lags, walks newest-first when
|
|
8
|
+
* it wants the latest few and restores chronological order, and counts the
|
|
9
|
+
* rows the same way it reads them, so a repaired count is the number a read
|
|
10
|
+
* returns.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.readWindow = readWindow;
|
|
14
|
+
exports.countLiveMessages = countLiveMessages;
|
|
15
|
+
const clock_1 = require("../../shared/clock");
|
|
16
|
+
const paginate_1 = require("../../shared/dynamodb/paginate");
|
|
17
|
+
const retry_1 = require("../../shared/dynamodb/retry");
|
|
18
|
+
const table_schema_1 = require("../../shared/dynamodb/table-schema");
|
|
19
|
+
const errors_1 = require("../../shared/errors/errors");
|
|
20
|
+
const truncate_1 = require("../../shared/logging/truncate");
|
|
21
|
+
const ulid_1 = require("../../shared/ulid");
|
|
22
|
+
const rows_1 = require("./rows");
|
|
23
|
+
/**
|
|
24
|
+
* The row as one of this adapter's messages, or a refusal naming it.
|
|
25
|
+
*
|
|
26
|
+
* The version is checked first, so a row a newer release wrote is reported as
|
|
27
|
+
* newer rather than judged against attribute types it may no longer use. What
|
|
28
|
+
* survives that is narrowed rather than cast: a shared table's message key
|
|
29
|
+
* space is this adapter's, and a row in it is not necessarily.
|
|
30
|
+
*
|
|
31
|
+
* Reported and never dropped, whatever `onCorruptMessage` says. That policy
|
|
32
|
+
* exists for a payload no reader could recover, and a row this adapter cannot
|
|
33
|
+
* account for is not one — skipping it handed the caller a shorter
|
|
34
|
+
* conversation that `RunnableWithMessageHistory` then re-persists as the whole
|
|
35
|
+
* truth. The `warn` carries the sort key, cut like every other row-sourced
|
|
36
|
+
* one, because the error can only say that such a row exists and an operator
|
|
37
|
+
* has to go and look at it.
|
|
38
|
+
*/
|
|
39
|
+
function parseSessionMessageRow(context, sessionId, raw) {
|
|
40
|
+
(0, table_schema_1.assertReadableRow)(raw, 'message');
|
|
41
|
+
const item = (0, rows_1.parseMessageRow)(raw);
|
|
42
|
+
if (item)
|
|
43
|
+
return item;
|
|
44
|
+
context.logger.warn('getMessages: refused a row that is not a chat message item', {
|
|
45
|
+
sessionId,
|
|
46
|
+
sortKey: (0, truncate_1.truncateForLog)(raw.SK),
|
|
47
|
+
});
|
|
48
|
+
throw (0, errors_1.validationError)('a row in the message key space of this session is not a chat message item this package ' +
|
|
49
|
+
'wrote: its `sessionId` or `message` attribute is absent, is of the wrong type, or names ' +
|
|
50
|
+
'another session. The `warn` logged alongside this names the row', 'message');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Read the live message items a window selects, in chronological order.
|
|
54
|
+
*
|
|
55
|
+
* Without `limit` the query walks the session oldest-first. With it the query
|
|
56
|
+
* walks newest-first with a matching page cap and stops as soon as `limit`
|
|
57
|
+
* live items are in hand — rows past their TTL are skipped here, so a page can
|
|
58
|
+
* come back short and the walk simply continues — and the tail is then
|
|
59
|
+
* reversed back into chronological order. `before` becomes an exclusive upper
|
|
60
|
+
* sort-key bound: the message prefix plus the ULID time characters of that
|
|
61
|
+
* instant, which every message id from that millisecond onwards sorts after.
|
|
62
|
+
*
|
|
63
|
+
* Accepts: `window.limit` — absent asks for the whole session, which is what
|
|
64
|
+
* `getMessages()` with no arguments means; otherwise at least 1, which is why
|
|
65
|
+
* no zero case is handled below. `parseMessageWindow` refuses `0` for its
|
|
66
|
+
* own reason, and that refusal is also what keeps `Limit: 0` — which DynamoDB
|
|
67
|
+
* rejects outright with a raw `ValidationException` — out of the query built
|
|
68
|
+
* here. `window.before` — already parsed as a real date. `signal` — aborts
|
|
69
|
+
* between pages.
|
|
70
|
+
*
|
|
71
|
+
* Returns: the live messages in chronological order, oldest first, whichever
|
|
72
|
+
* direction the query walked.
|
|
73
|
+
*
|
|
74
|
+
* Throws: `FORMAT_UNSUPPORTED` for a row a newer version wrote — checked before
|
|
75
|
+
* the row's ttl, so the answer does not depend on the reading machine's clock;
|
|
76
|
+
* `VALIDATION` naming `message` for a row in this session's message key
|
|
77
|
+
* space that this adapter did not write, checked before the ttl for the same
|
|
78
|
+
* reason; `ABORTED`; whatever the query throws.
|
|
79
|
+
*
|
|
80
|
+
* Guarantees: strongly consistent, so the turn just appended is visible to the
|
|
81
|
+
* very next read. An unlimited window is deliberately uncapped — silently
|
|
82
|
+
* truncating a conversation is worse than a slow read, and a caller that wants
|
|
83
|
+
* a bound passes `limit` — so past {@link LIST_SCAN_WARN_THRESHOLD} messages
|
|
84
|
+
* the read still succeeds and an operator is told the session is unusually
|
|
85
|
+
* large.
|
|
86
|
+
*/
|
|
87
|
+
async function readWindow(context, sessionId, window, signal) {
|
|
88
|
+
const now = (0, clock_1.nowSeconds)();
|
|
89
|
+
const limit = window.limit ?? Number.POSITIVE_INFINITY;
|
|
90
|
+
const items = [];
|
|
91
|
+
for await (const raw of (0, paginate_1.paginateQuery)({
|
|
92
|
+
retry: (0, retry_1.retryFor)(context, signal),
|
|
93
|
+
signal,
|
|
94
|
+
client: context.client,
|
|
95
|
+
params: (0, rows_1.messageQuery)(context.tableName, sessionId, {
|
|
96
|
+
consistent: true,
|
|
97
|
+
descending: window.limit !== undefined,
|
|
98
|
+
limit: window.limit,
|
|
99
|
+
beforeSortKey: window.before && (0, rows_1.messageSortKey)((0, ulid_1.ulidTimePrefix)(window.before.getTime())),
|
|
100
|
+
}),
|
|
101
|
+
maxItems: Number.POSITIVE_INFINITY,
|
|
102
|
+
maxIterations: Number.POSITIVE_INFINITY,
|
|
103
|
+
})) {
|
|
104
|
+
// A message newer than this version reads, and a row that is not one of
|
|
105
|
+
// this adapter's at all, both fail loudly rather than vanishing from the
|
|
106
|
+
// window.
|
|
107
|
+
const item = parseSessionMessageRow(context, sessionId, raw);
|
|
108
|
+
if ((0, table_schema_1.isExpiredRow)(item, now))
|
|
109
|
+
continue;
|
|
110
|
+
items.push(item);
|
|
111
|
+
if (items.length >= limit)
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
if (items.length >= paginate_1.LIST_SCAN_WARN_THRESHOLD) {
|
|
115
|
+
context.logger.warn('getMessages: a session holds very many messages; the read is complete but slow. Pass a ' +
|
|
116
|
+
'`limit` to read only the newest turns', { sessionId, messages: items.length });
|
|
117
|
+
}
|
|
118
|
+
return window.limit === undefined ? items : items.reverse();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The row as one of this session's messages, or a refusal naming it — the same
|
|
122
|
+
* test the read makes, on the same order: the version first, so a row a newer
|
|
123
|
+
* release wrote is reported as newer rather than judged against attribute
|
|
124
|
+
* types it may no longer use.
|
|
125
|
+
*
|
|
126
|
+
* The count is a definition rather than a tally, and the definition is "what
|
|
127
|
+
* `getMessages` would return". A row in the message key space that this
|
|
128
|
+
* adapter did not write makes that read refuse the whole session, so counting
|
|
129
|
+
* it would write a repaired `messageCount` back onto a session no reader can
|
|
130
|
+
* open — a number that is not merely stale but describes nothing. The repair
|
|
131
|
+
* refuses instead, and the read's own `warn` is what names the row.
|
|
132
|
+
*/
|
|
133
|
+
function parseCountableRow(raw, sessionId) {
|
|
134
|
+
(0, table_schema_1.assertReadableRow)(raw, 'message');
|
|
135
|
+
const item = (0, rows_1.parseMessageRow)(raw);
|
|
136
|
+
if (item)
|
|
137
|
+
return item;
|
|
138
|
+
throw (0, errors_1.validationError)(`session "${sessionId}" holds a row in its message key space that is not a chat message ` +
|
|
139
|
+
'item this package wrote, so its messages cannot be counted: a read of the session ' +
|
|
140
|
+
'reports the same row and names it. Remove or repair the row, then reconcile again', 'message');
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The number of message rows a session holds, counted the way the read path
|
|
144
|
+
* counts them.
|
|
145
|
+
*
|
|
146
|
+
* Only rows `getMessages` would return are counted: an expired message that
|
|
147
|
+
* DynamoDB's TTL sweep has not yet removed is invisible to every reader, so
|
|
148
|
+
* counting it would "repair" `messageCount` to a number nobody ever sees. The
|
|
149
|
+
* count is therefore a definition, not an implementation detail — it is what
|
|
150
|
+
* makes the repaired value agree with what the session returns. For the same
|
|
151
|
+
* reason a message a newer release wrote, and a row in the message key space
|
|
152
|
+
* that this adapter did not write, are both refused rather than counted:
|
|
153
|
+
* `getMessages` refuses them.
|
|
154
|
+
*
|
|
155
|
+
* Accepts: `sessionId` — validated by the caller. `signal` — aborts the reads.
|
|
156
|
+
*
|
|
157
|
+
* Returns: how many messages a reader would actually see right now.
|
|
158
|
+
*
|
|
159
|
+
* Throws: `FORMAT_UNSUPPORTED` for a message row a newer release wrote, checked
|
|
160
|
+
* before the row's ttl as `getMessages` checks it; `VALIDATION` naming
|
|
161
|
+
* `message` for a row in the message key space that is not one of this
|
|
162
|
+
* adapter's, which `getMessages` refuses too; whatever the query throws
|
|
163
|
+
* after retries; `ABORTED`.
|
|
164
|
+
*
|
|
165
|
+
* Guarantees: each row comes back projected to its identity, its format
|
|
166
|
+
* version and its ttl, so no message payload is transferred however large the
|
|
167
|
+
* session is — the descriptor is projected by the one nested path
|
|
168
|
+
* `message.location` that every descriptor this package has written carries,
|
|
169
|
+
* which proves the attribute is there and a map without reading the bytes it
|
|
170
|
+
* holds. Every check runs here rather than in a filter, because a filter would
|
|
171
|
+
* drop an expired row before its version could be checked. The pages are
|
|
172
|
+
* walked by the shared paginator with both of its caps lifted: a partial count
|
|
173
|
+
* is not a repair, it is a new and wrong number, so the count either completes
|
|
174
|
+
* or fails.
|
|
175
|
+
*/
|
|
176
|
+
async function countLiveMessages(context, sessionId, signal) {
|
|
177
|
+
const now = (0, clock_1.nowSeconds)();
|
|
178
|
+
const query = (0, rows_1.messageQuery)(context.tableName, sessionId);
|
|
179
|
+
let total = 0;
|
|
180
|
+
for await (const raw of (0, paginate_1.paginateQuery)({
|
|
181
|
+
retry: (0, retry_1.retryFor)(context, signal),
|
|
182
|
+
signal,
|
|
183
|
+
client: context.client,
|
|
184
|
+
params: {
|
|
185
|
+
...query,
|
|
186
|
+
ProjectionExpression: '#pk, #sid, #msg.#loc, #v, #ttl',
|
|
187
|
+
ExpressionAttributeNames: {
|
|
188
|
+
...query.ExpressionAttributeNames,
|
|
189
|
+
'#sid': 'sessionId',
|
|
190
|
+
'#msg': 'message',
|
|
191
|
+
'#loc': 'location',
|
|
192
|
+
'#v': 'v',
|
|
193
|
+
'#ttl': 'ttl',
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
maxItems: Number.POSITIVE_INFINITY,
|
|
197
|
+
maxIterations: Number.POSITIVE_INFINITY,
|
|
198
|
+
})) {
|
|
199
|
+
const row = parseCountableRow(raw, sessionId);
|
|
200
|
+
if (!(0, table_schema_1.isExpiredRow)(row, now))
|
|
201
|
+
total += 1;
|
|
202
|
+
}
|
|
203
|
+
return total;
|
|
204
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides the rules chat-history input must meet before anything reads it.
|
|
3
|
+
*
|
|
4
|
+
* A session id, an append's messages, a read window and the listing options
|
|
5
|
+
* are each parsed once into a type only this module can build (record 21), so
|
|
6
|
+
* an action that holds one never checks it again. Which messages may be
|
|
7
|
+
* stored is decided by the read side's own rebuild, so write and read agree
|
|
8
|
+
* by construction, and which instants a `before` may name follows from the
|
|
9
|
+
* range a message id can express.
|
|
10
|
+
*/
|
|
11
|
+
import { type BaseMessage, type StoredMessage } from '@langchain/core/messages';
|
|
12
|
+
import { type PageLimit } from '../../shared/validation/primitives';
|
|
13
|
+
import type { GetMessagesOptions, ListSessionsOptions, MessageWindow } from '../types';
|
|
14
|
+
declare const sessionIdBrand: unique symbol;
|
|
15
|
+
declare const storableMessagesBrand: unique symbol;
|
|
16
|
+
declare const parsedWindowBrand: unique symbol;
|
|
17
|
+
/**
|
|
18
|
+
* A session id checked as the partition key it becomes. {@link parseSessionId}
|
|
19
|
+
* is the only way to obtain one, so an internal function that asks for a
|
|
20
|
+
* `SessionId` cannot be handed one nobody checked, and does not check it again.
|
|
21
|
+
* Each of the four history actions that take one — add, clear, get and
|
|
22
|
+
* reconcile — parses it on every call, and the session adapter parses the id
|
|
23
|
+
* it is bound to when it is built. The brand is phantom: at run time it is the
|
|
24
|
+
* caller's string.
|
|
25
|
+
*/
|
|
26
|
+
export type SessionId = string & {
|
|
27
|
+
readonly [sessionIdBrand]: true;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Messages in their stored form, each one proven to rebuild on the read side.
|
|
31
|
+
* Built only by {@link parseStoredMessages}; the array is the one
|
|
32
|
+
* {@link parseMessages} made, which no caller holds.
|
|
33
|
+
*/
|
|
34
|
+
export type StorableMessages = StoredMessage[] & {
|
|
35
|
+
readonly [storableMessagesBrand]: true;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* A conversation window checked against the page rule and the range a message
|
|
39
|
+
* id can express, holding only the keys the caller gave. Built only by
|
|
40
|
+
* {@link parseMessageWindow}; its `before` is a copy, so a caller moving its own
|
|
41
|
+
* `Date` afterwards moves nothing this package reads.
|
|
42
|
+
*/
|
|
43
|
+
export type ParsedWindow = {
|
|
44
|
+
readonly limit?: PageLimit;
|
|
45
|
+
readonly before?: Date;
|
|
46
|
+
} & {
|
|
47
|
+
readonly [parsedWindowBrand]: true;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Parse a session id.
|
|
51
|
+
*
|
|
52
|
+
* Accepts: `value` — anything; a session id reaches the partition key, so it is
|
|
53
|
+
* held to every identifier rule at {@link MAX_PARTITION_ID_BYTES}.
|
|
54
|
+
*
|
|
55
|
+
* Returns: `value` as a {@link SessionId}.
|
|
56
|
+
*
|
|
57
|
+
* Throws: `VALIDATION` naming `sessionId`.
|
|
58
|
+
*/
|
|
59
|
+
export declare function parseSessionId(value: unknown): SessionId;
|
|
60
|
+
/**
|
|
61
|
+
* Parse stored messages: prove each one rebuilds on the read side.
|
|
62
|
+
*
|
|
63
|
+
* Accepts: `stored` — the stored form of one call's messages. The check *is*
|
|
64
|
+
* the read side's own rebuild (`mapStoredMessagesToChatMessages`), so write and
|
|
65
|
+
* read agree by construction rather than by two lists of types kept in step by
|
|
66
|
+
* hand.
|
|
67
|
+
*
|
|
68
|
+
* Returns: `stored`, as {@link StorableMessages}.
|
|
69
|
+
*
|
|
70
|
+
* Throws: `VALIDATION` naming `messages`, carrying the offending index and
|
|
71
|
+
* type. The type comes off the caller's own object and nothing length-checked
|
|
72
|
+
* it, so the message names it bounded by {@link truncateForLog}, and so is
|
|
73
|
+
* what LangChain says about it — that text renders the same unchecked value
|
|
74
|
+
* into itself, so bounding only the type bounds nothing. The two take
|
|
75
|
+
* different caps because they are different things: the type is an identifier,
|
|
76
|
+
* while what LangChain threw is prose, cut once by `redactedMessage` and not
|
|
77
|
+
* again here. `context` still names `messages`, which is what a caller
|
|
78
|
+
* branches on. A `RemoveMessage`, or a tool, function or generic message
|
|
79
|
+
* missing its required field, is refused here instead of being persisted and
|
|
80
|
+
* then skipped or thrown by `getMessages`. A hole in a sparse array is refused
|
|
81
|
+
* as missing, naming its index: the array is walked by index, where
|
|
82
|
+
* `Array.prototype.forEach` would skip the hole and let it through.
|
|
83
|
+
*/
|
|
84
|
+
export declare function parseStoredMessages(stored: StoredMessage[]): StorableMessages;
|
|
85
|
+
/**
|
|
86
|
+
* Parse the messages of one append, in two passes: to the stored form, then
|
|
87
|
+
* proof that each rebuilds.
|
|
88
|
+
*
|
|
89
|
+
* Accepts: `messages` — declared `BaseMessage[]`; a non-array is refused, and
|
|
90
|
+
* so is an entry LangChain cannot serialize.
|
|
91
|
+
*
|
|
92
|
+
* Returns: a fresh array of stored messages, as {@link StorableMessages}.
|
|
93
|
+
*
|
|
94
|
+
* Throws: `VALIDATION` naming `messages`, with the offending index for an
|
|
95
|
+
* entry.
|
|
96
|
+
*/
|
|
97
|
+
export declare function parseMessages(messages: BaseMessage[]): StorableMessages;
|
|
98
|
+
/**
|
|
99
|
+
* Parse a conversation window.
|
|
100
|
+
*
|
|
101
|
+
* Accepts: `window.limit` — an integer from 1 to the page ceiling; the only
|
|
102
|
+
* floor of 1 in the package, because a window feeds a model, and an empty
|
|
103
|
+
* conversation is not a visibly empty answer but an invented one.
|
|
104
|
+
* `window.before` — a valid `Date` inside the range a message id can express.
|
|
105
|
+
*
|
|
106
|
+
* Returns: a fresh window holding only the keys the caller gave, as a
|
|
107
|
+
* {@link ParsedWindow}.
|
|
108
|
+
*
|
|
109
|
+
* Throws: `VALIDATION` naming `limit` or `before`.
|
|
110
|
+
*/
|
|
111
|
+
export declare function parseMessageWindow(window: MessageWindow): ParsedWindow;
|
|
112
|
+
/** The arguments of `getMessages`, parsed. */
|
|
113
|
+
export interface GetMessagesRequest {
|
|
114
|
+
readonly sessionId: SessionId;
|
|
115
|
+
readonly window: ParsedWindow;
|
|
116
|
+
readonly signal: AbortSignal | undefined;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Parse the arguments of `getMessages`.
|
|
120
|
+
*
|
|
121
|
+
* Accepts: `sessionId` — as {@link parseSessionId}. `options` — an object with
|
|
122
|
+
* only `limit`, `before` and `signal`; the window as {@link parseMessageWindow}.
|
|
123
|
+
*
|
|
124
|
+
* Returns: the request the read works from.
|
|
125
|
+
*
|
|
126
|
+
* Throws: `VALIDATION`, in this order: `options.<key>`, `signal`, `sessionId`,
|
|
127
|
+
* `limit`, `before`.
|
|
128
|
+
*/
|
|
129
|
+
export declare function parseGetMessagesRequest(sessionId: string, options: GetMessagesOptions): GetMessagesRequest;
|
|
130
|
+
/** The options of `listSessions`, parsed. */
|
|
131
|
+
export interface ListSessionsRequest {
|
|
132
|
+
readonly limit: PageLimit | undefined;
|
|
133
|
+
readonly maxItems: number | undefined;
|
|
134
|
+
readonly maxIterations: number | undefined;
|
|
135
|
+
readonly cursor: string | undefined;
|
|
136
|
+
readonly signal: AbortSignal | undefined;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Parse the options of `listSessions`.
|
|
140
|
+
*
|
|
141
|
+
* Accepts: `options` — only `limit`, `cursor`, `maxIterations`, `maxItems` and
|
|
142
|
+
* `signal`. `limit` — 0 to the page ceiling; `0` is answered with an empty page.
|
|
143
|
+
* `maxItems`, `maxIterations` — an integer of at least 1, or `Infinity`.
|
|
144
|
+
* `cursor` — a string, and only with `indexName`. `indexName` — the adapter's
|
|
145
|
+
* configured recency index, if any.
|
|
146
|
+
*
|
|
147
|
+
* Returns: the request the listing works from.
|
|
148
|
+
*
|
|
149
|
+
* Throws: `VALIDATION`, in this order: `options.<key>`, `signal`, `limit`,
|
|
150
|
+
* `maxItems`, `maxIterations`, `cursor`.
|
|
151
|
+
*/
|
|
152
|
+
export declare function parseListSessionsRequest(options: ListSessionsOptions, indexName: string | undefined): ListSessionsRequest;
|
|
153
|
+
export {};
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides the rules chat-history input must meet before anything reads it.
|
|
4
|
+
*
|
|
5
|
+
* A session id, an append's messages, a read window and the listing options
|
|
6
|
+
* are each parsed once into a type only this module can build (record 21), so
|
|
7
|
+
* an action that holds one never checks it again. Which messages may be
|
|
8
|
+
* stored is decided by the read side's own rebuild, so write and read agree
|
|
9
|
+
* by construction, and which instants a `before` may name follows from the
|
|
10
|
+
* range a message id can express.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.parseSessionId = parseSessionId;
|
|
14
|
+
exports.parseStoredMessages = parseStoredMessages;
|
|
15
|
+
exports.parseMessages = parseMessages;
|
|
16
|
+
exports.parseMessageWindow = parseMessageWindow;
|
|
17
|
+
exports.parseGetMessagesRequest = parseGetMessagesRequest;
|
|
18
|
+
exports.parseListSessionsRequest = parseListSessionsRequest;
|
|
19
|
+
const messages_1 = require("@langchain/core/messages");
|
|
20
|
+
const table_schema_1 = require("../../shared/dynamodb/table-schema");
|
|
21
|
+
const errors_1 = require("../../shared/errors/errors");
|
|
22
|
+
const secret_patterns_1 = require("../../shared/logging/secret-patterns");
|
|
23
|
+
const truncate_1 = require("../../shared/logging/truncate");
|
|
24
|
+
const ulid_1 = require("../../shared/ulid");
|
|
25
|
+
const collaborators_1 = require("../../shared/validation/collaborators");
|
|
26
|
+
const option_shape_1 = require("../../shared/validation/option-shape");
|
|
27
|
+
const primitives_1 = require("../../shared/validation/primitives");
|
|
28
|
+
const setup_1 = require("./setup");
|
|
29
|
+
/**
|
|
30
|
+
* Parse a session id.
|
|
31
|
+
*
|
|
32
|
+
* Accepts: `value` — anything; a session id reaches the partition key, so it is
|
|
33
|
+
* held to every identifier rule at {@link MAX_PARTITION_ID_BYTES}.
|
|
34
|
+
*
|
|
35
|
+
* Returns: `value` as a {@link SessionId}.
|
|
36
|
+
*
|
|
37
|
+
* Throws: `VALIDATION` naming `sessionId`.
|
|
38
|
+
*/
|
|
39
|
+
function parseSessionId(value) {
|
|
40
|
+
return (0, primitives_1.parseIdentifier)(value, table_schema_1.KEY_SEPARATOR, 'sessionId', table_schema_1.MAX_PARTITION_ID_BYTES);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Serialize the caller's messages, reporting a value that is not a message.
|
|
44
|
+
*
|
|
45
|
+
* Accepts: `messages` — LangChain messages. The type says so; this runs for the
|
|
46
|
+
* JavaScript caller it does not bind, and for the `any` that reaches an
|
|
47
|
+
* `addMessages` through a chain. Empty is empty.
|
|
48
|
+
*
|
|
49
|
+
* Returns: the messages in their stored form, in order.
|
|
50
|
+
*
|
|
51
|
+
* Throws: `VALIDATION` naming `messages` and the offending index. Serializing
|
|
52
|
+
* one message at a time is what makes that index knowable: mapping the array in
|
|
53
|
+
* one call failed with `TypeError: message.toDict is not a function` from inside
|
|
54
|
+
* LangChain, naming neither the message nor this library. What LangChain says
|
|
55
|
+
* is quoted bounded: that text renders the offending value into itself, so it
|
|
56
|
+
* is exactly as long as the caller's own object makes it, and bounding the
|
|
57
|
+
* index while relaying it whole would bound nothing at all. The bound is
|
|
58
|
+
* `redactedMessage`'s own and is not applied again here — a second cut would
|
|
59
|
+
* mark the length of the first cut's output instead of the length the caller's
|
|
60
|
+
* text really had, which is the one thing the mark exists to state.
|
|
61
|
+
*
|
|
62
|
+
* Walked by index rather than with `Array.prototype.map`, which keeps a hole
|
|
63
|
+
* in a sparse array without visiting it: a hole is read as the `undefined` it
|
|
64
|
+
* is and refused like any other value that is not a message.
|
|
65
|
+
*/
|
|
66
|
+
function toStoredMessages(messages) {
|
|
67
|
+
const stored = [];
|
|
68
|
+
for (let index = 0; index < messages.length; index += 1) {
|
|
69
|
+
try {
|
|
70
|
+
stored.push((0, messages_1.mapChatMessagesToStoredMessages)([messages[index]])[0]);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
throw (0, errors_1.validationError)(`messages[${index}] is not a LangChain message: ` + (0, secret_patterns_1.redactedMessage)(error), 'messages');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return stored;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Parse stored messages: prove each one rebuilds on the read side.
|
|
80
|
+
*
|
|
81
|
+
* Accepts: `stored` — the stored form of one call's messages. The check *is*
|
|
82
|
+
* the read side's own rebuild (`mapStoredMessagesToChatMessages`), so write and
|
|
83
|
+
* read agree by construction rather than by two lists of types kept in step by
|
|
84
|
+
* hand.
|
|
85
|
+
*
|
|
86
|
+
* Returns: `stored`, as {@link StorableMessages}.
|
|
87
|
+
*
|
|
88
|
+
* Throws: `VALIDATION` naming `messages`, carrying the offending index and
|
|
89
|
+
* type. The type comes off the caller's own object and nothing length-checked
|
|
90
|
+
* it, so the message names it bounded by {@link truncateForLog}, and so is
|
|
91
|
+
* what LangChain says about it — that text renders the same unchecked value
|
|
92
|
+
* into itself, so bounding only the type bounds nothing. The two take
|
|
93
|
+
* different caps because they are different things: the type is an identifier,
|
|
94
|
+
* while what LangChain threw is prose, cut once by `redactedMessage` and not
|
|
95
|
+
* again here. `context` still names `messages`, which is what a caller
|
|
96
|
+
* branches on. A `RemoveMessage`, or a tool, function or generic message
|
|
97
|
+
* missing its required field, is refused here instead of being persisted and
|
|
98
|
+
* then skipped or thrown by `getMessages`. A hole in a sparse array is refused
|
|
99
|
+
* as missing, naming its index: the array is walked by index, where
|
|
100
|
+
* `Array.prototype.forEach` would skip the hole and let it through.
|
|
101
|
+
*/
|
|
102
|
+
function parseStoredMessages(stored) {
|
|
103
|
+
for (let index = 0; index < stored.length; index += 1) {
|
|
104
|
+
const message = stored[index];
|
|
105
|
+
if (message === undefined) {
|
|
106
|
+
throw (0, errors_1.validationError)(`messages[${index}] is missing`, 'messages');
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
(0, messages_1.mapStoredMessagesToChatMessages)([message]);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
throw (0, errors_1.validationError)(`messages[${index}] of type "${(0, truncate_1.truncateForLog)(message.type)}" cannot be stored: ` +
|
|
113
|
+
(0, secret_patterns_1.redactedMessage)(error), 'messages');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return stored;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Parse the messages of one append, in two passes: to the stored form, then
|
|
120
|
+
* proof that each rebuilds.
|
|
121
|
+
*
|
|
122
|
+
* Accepts: `messages` — declared `BaseMessage[]`; a non-array is refused, and
|
|
123
|
+
* so is an entry LangChain cannot serialize.
|
|
124
|
+
*
|
|
125
|
+
* Returns: a fresh array of stored messages, as {@link StorableMessages}.
|
|
126
|
+
*
|
|
127
|
+
* Throws: `VALIDATION` naming `messages`, with the offending index for an
|
|
128
|
+
* entry.
|
|
129
|
+
*/
|
|
130
|
+
function parseMessages(messages) {
|
|
131
|
+
if (!Array.isArray(messages)) {
|
|
132
|
+
throw (0, errors_1.validationError)('messages must be an array', 'messages');
|
|
133
|
+
}
|
|
134
|
+
return parseStoredMessages(toStoredMessages(messages));
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* A window's `before`, as a copy, when a message id can express it: the bound
|
|
138
|
+
* is the message id of that instant, and a message id holds its millisecond in
|
|
139
|
+
* ten base-32 characters.
|
|
140
|
+
*
|
|
141
|
+
* `null` is refused, naming `before`, rather than read as "up to now". A
|
|
142
|
+
* `Date` is duck-typed, since one from another realm is still a date.
|
|
143
|
+
* Unchecked, `before: null` would reach `null.getTime`, a property access the
|
|
144
|
+
* boundary brands `UNEXPECTED_ERROR` instead of naming the caller's mistake;
|
|
145
|
+
* an invalid `Date` would otherwise derive a NaN sort key that matches nothing
|
|
146
|
+
* and read as an empty conversation. A pre-epoch `Date` would be worse than
|
|
147
|
+
* either: the bound built from it sorts above every real id, so the window
|
|
148
|
+
* would come back holding the entire conversation the caller asked to exclude.
|
|
149
|
+
* Past the range the bound would wrap to the lowest prefix and the window would
|
|
150
|
+
* come back empty.
|
|
151
|
+
*/
|
|
152
|
+
function windowBound(before) {
|
|
153
|
+
const hasGetTime = before !== null && typeof before.getTime === 'function';
|
|
154
|
+
const time = hasGetTime ? before.getTime() : Number.NaN;
|
|
155
|
+
if (!Number.isFinite(time))
|
|
156
|
+
throw (0, errors_1.validationError)('before must be a valid Date', 'before');
|
|
157
|
+
if (time < 0 || time >= ulid_1.ULID_TIME_RANGE_MS) {
|
|
158
|
+
throw (0, errors_1.validationError)('before must be a Date from the epoch onwards and before the year 37648: the bound is ' +
|
|
159
|
+
'the message id of that instant, and a message id encodes its millisecond in ten ' +
|
|
160
|
+
'base-32 characters, which hold no instant outside that range', 'before');
|
|
161
|
+
}
|
|
162
|
+
return new Date(time);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Parse a conversation window.
|
|
166
|
+
*
|
|
167
|
+
* Accepts: `window.limit` — an integer from 1 to the page ceiling; the only
|
|
168
|
+
* floor of 1 in the package, because a window feeds a model, and an empty
|
|
169
|
+
* conversation is not a visibly empty answer but an invented one.
|
|
170
|
+
* `window.before` — a valid `Date` inside the range a message id can express.
|
|
171
|
+
*
|
|
172
|
+
* Returns: a fresh window holding only the keys the caller gave, as a
|
|
173
|
+
* {@link ParsedWindow}.
|
|
174
|
+
*
|
|
175
|
+
* Throws: `VALIDATION` naming `limit` or `before`.
|
|
176
|
+
*/
|
|
177
|
+
function parseMessageWindow(window) {
|
|
178
|
+
const parsed = {};
|
|
179
|
+
if (window.limit !== undefined)
|
|
180
|
+
parsed.limit = (0, primitives_1.parseLimit)(window.limit, 1);
|
|
181
|
+
if (window.before !== undefined)
|
|
182
|
+
parsed.before = windowBound(window.before);
|
|
183
|
+
return parsed;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Parse the arguments of `getMessages`.
|
|
187
|
+
*
|
|
188
|
+
* Accepts: `sessionId` — as {@link parseSessionId}. `options` — an object with
|
|
189
|
+
* only `limit`, `before` and `signal`; the window as {@link parseMessageWindow}.
|
|
190
|
+
*
|
|
191
|
+
* Returns: the request the read works from.
|
|
192
|
+
*
|
|
193
|
+
* Throws: `VALIDATION`, in this order: `options.<key>`, `signal`, `sessionId`,
|
|
194
|
+
* `limit`, `before`.
|
|
195
|
+
*/
|
|
196
|
+
function parseGetMessagesRequest(sessionId, options) {
|
|
197
|
+
(0, option_shape_1.assertShape)(options, setup_1.GET_MESSAGES_KEYS, 'options');
|
|
198
|
+
(0, collaborators_1.assertSignalLike)(options.signal);
|
|
199
|
+
const parsedSessionId = parseSessionId(sessionId);
|
|
200
|
+
return {
|
|
201
|
+
sessionId: parsedSessionId,
|
|
202
|
+
window: parseMessageWindow(options),
|
|
203
|
+
signal: options.signal,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/** A scan cap: absent and `Infinity` both mean none; anything else is an integer of at least 1. */
|
|
207
|
+
function scanCap(value, field) {
|
|
208
|
+
if (value === undefined || value === Infinity)
|
|
209
|
+
return value;
|
|
210
|
+
return (0, primitives_1.parseInteger)(value, field, { min: 1 });
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* The paging cursor, which only the recency index can honour: without it a
|
|
214
|
+
* listing is one table scan, which has no position to resume from.
|
|
215
|
+
*/
|
|
216
|
+
function pageCursor(cursor, indexName) {
|
|
217
|
+
if (cursor === undefined)
|
|
218
|
+
return undefined;
|
|
219
|
+
if (indexName === undefined) {
|
|
220
|
+
throw (0, errors_1.validationError)('paging by cursor needs a configured `indexName`: without the recency index a listing is ' +
|
|
221
|
+
'one table scan, which has no position to resume from', 'cursor');
|
|
222
|
+
}
|
|
223
|
+
return (0, primitives_1.parseString)(cursor, 'cursor');
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Parse the options of `listSessions`.
|
|
227
|
+
*
|
|
228
|
+
* Accepts: `options` — only `limit`, `cursor`, `maxIterations`, `maxItems` and
|
|
229
|
+
* `signal`. `limit` — 0 to the page ceiling; `0` is answered with an empty page.
|
|
230
|
+
* `maxItems`, `maxIterations` — an integer of at least 1, or `Infinity`.
|
|
231
|
+
* `cursor` — a string, and only with `indexName`. `indexName` — the adapter's
|
|
232
|
+
* configured recency index, if any.
|
|
233
|
+
*
|
|
234
|
+
* Returns: the request the listing works from.
|
|
235
|
+
*
|
|
236
|
+
* Throws: `VALIDATION`, in this order: `options.<key>`, `signal`, `limit`,
|
|
237
|
+
* `maxItems`, `maxIterations`, `cursor`.
|
|
238
|
+
*/
|
|
239
|
+
function parseListSessionsRequest(options, indexName) {
|
|
240
|
+
(0, option_shape_1.assertShape)(options, setup_1.LIST_SESSIONS_KEYS, 'options');
|
|
241
|
+
(0, collaborators_1.assertSignalLike)(options.signal);
|
|
242
|
+
const limit = options.limit === undefined ? undefined : (0, primitives_1.parseLimit)(options.limit, 0);
|
|
243
|
+
const maxItems = scanCap(options.maxItems, 'maxItems');
|
|
244
|
+
const maxIterations = scanCap(options.maxIterations, 'maxIterations');
|
|
245
|
+
return {
|
|
246
|
+
limit,
|
|
247
|
+
maxItems,
|
|
248
|
+
maxIterations,
|
|
249
|
+
cursor: pageCursor(options.cursor, indexName),
|
|
250
|
+
signal: options.signal,
|
|
251
|
+
};
|
|
252
|
+
}
|