@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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"item-mapper.js","sourceRoot":"","sources":["../../../src/history/internal/item-mapper.ts"],"names":[],"mappings":";;;;AAEA,oDAAwF;AAExF,iCAA0D;AAG1D,SAAS,SAAS,CAAC,OAAuB;IACxC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACI,KAAK,2BACV,OAAuB,EACvB,SAAiB,EACjB,IAAY,EACZ,OAAsB,EACtB,YAAqB;IAErB,MAAM,UAAU,GAAG,MAAM,IAAA,qBAAa,EAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE;QAClE,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC;KAC5B,CAAC,CAAC;IACH,MAAM,IAAI,GAAoB;QAC5B,EAAE,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC;QAC/B,EAAE,EAAE,IAAA,qBAAc,EAAC,IAAI,CAAC;QACxB,SAAS;QACT,OAAO,EAAE,UAAU;KACpB,CAAC;IACF,IAAI,YAAY,KAAK,SAAS;QAAE,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iEAAiE;AAC1D,KAAK,4BACV,OAAuB,EACvB,IAAqB;IAErB,OAAO,IAAA,qBAAa,EAAgB,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -1,17 +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;
|
|
17
|
-
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/history/internal/keys.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAatC,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,oBAA6B,CAAC;AAW3D,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
|
|
@@ -1,49 +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
|
-
}
|
|
49
|
-
//# sourceMappingURL=keys.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/history/internal/keys.ts"],"names":[],"mappings":";;;;;;;AAAA,mFAAmF;AACtE,QAAA,kBAAkB,GAAG,GAAG,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,cAAc,GAAG,UAAU,QAAA,kBAAkB,EAAE,CAAC;AAEtD,wDAAwD;AAC3C,QAAA,gBAAgB,GAAG,GAAG,cAAc,SAAS,CAAC;AAE3D,MAAM,cAAc,GAAG,GAAG,cAAc,MAAM,CAAC;AAE/C;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,OAAO,QAAA,kBAAkB,EAAE,CAAC;AAE7D,6EAA6E;AAC7E,0BAAiC,SAAiB;IAChD,OAAO,GAAG,wBAAwB,GAAG,SAAS,EAAE,CAAC;AACnD,CAAC;AAED,yEAAyE;AACzE,wBAA+B,IAAY;IACzC,OAAO,GAAG,cAAc,GAAG,IAAI,EAAE,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,0BAAiC,OAAe;IAC9C,OAAO,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AAC5C,CAAC;AAED,sEAAsE;AACtE;IACE,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { ChatMessageItem } from '../types';
|
|
2
|
-
/**
|
|
3
|
-
* Conservatively estimate a message item's stored size, so chunks can stay under
|
|
4
|
-
* the DynamoDB transaction byte limit. The overhead allowance keeps the estimate
|
|
5
|
-
* on the safe side of the real marshalled size.
|
|
6
|
-
*/
|
|
7
|
-
export declare function estimateItemBytes(item: ChatMessageItem): number;
|
|
8
|
-
/**
|
|
9
|
-
* Split message items into transaction-sized chunks bounded by both the item
|
|
10
|
-
* count and the aggregate byte budget. A single item larger than the budget is
|
|
11
|
-
* placed alone rather than dropped.
|
|
12
|
-
*/
|
|
13
|
-
export declare function chunkBySize(items: ChatMessageItem[], maxItems: number, maxBytes: number): ChatMessageItem[][];
|
|
14
|
-
//# sourceMappingURL=message-chunker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message-chunker.d.ts","sourceRoot":"","sources":["../../../src/history/internal/message-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AA4BhD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAQ/D;AAaD;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,eAAe,EAAE,EACxB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,eAAe,EAAE,EAAE,CAgBrB"}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.estimateItemBytes = estimateItemBytes;
|
|
4
|
-
exports.chunkBySize = chunkBySize;
|
|
5
|
-
const codec_1 = require("../../shared/codec/codec");
|
|
6
|
-
/**
|
|
7
|
-
* Per-item allowance added to the measured field bytes to cover what the size
|
|
8
|
-
* estimate does not count directly: DynamoDB attribute names, the document
|
|
9
|
-
* marshalling envelope, and descriptor scaffolding. Deliberately generous so the
|
|
10
|
-
* estimate stays at or above the real marshalled item size and chunks never
|
|
11
|
-
* overshoot the transaction byte limit.
|
|
12
|
-
*/
|
|
13
|
-
const ITEM_OVERHEAD_BYTES = 256;
|
|
14
|
-
/**
|
|
15
|
-
* Byte length of a string as DynamoDB stores it. `String.length` counts UTF-16
|
|
16
|
-
* code units, which understates every non-ASCII character — the wrong
|
|
17
|
-
* direction for an estimate documented to sit at or above the real size.
|
|
18
|
-
*/
|
|
19
|
-
function utf8Bytes(value) {
|
|
20
|
-
return Buffer.byteLength(value, 'utf8');
|
|
21
|
-
}
|
|
22
|
-
function descriptorBytes(descriptor) {
|
|
23
|
-
const body = descriptor.location === codec_1.PayloadLocation.INLINE
|
|
24
|
-
? descriptor.bytes.length
|
|
25
|
-
: utf8Bytes(descriptor.s3Key);
|
|
26
|
-
return body + utf8Bytes(descriptor.serdeType);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Conservatively estimate a message item's stored size, so chunks can stay under
|
|
30
|
-
* the DynamoDB transaction byte limit. The overhead allowance keeps the estimate
|
|
31
|
-
* on the safe side of the real marshalled size.
|
|
32
|
-
*/
|
|
33
|
-
function estimateItemBytes(item) {
|
|
34
|
-
return (utf8Bytes(item.PK) +
|
|
35
|
-
utf8Bytes(item.SK) +
|
|
36
|
-
utf8Bytes(item.sessionId) +
|
|
37
|
-
descriptorBytes(item.message) +
|
|
38
|
-
ITEM_OVERHEAD_BYTES);
|
|
39
|
-
}
|
|
40
|
-
function shouldFlush(count, bytes, next, max, maxBytes) {
|
|
41
|
-
if (count === 0)
|
|
42
|
-
return false;
|
|
43
|
-
return count >= max || bytes + next > maxBytes;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Split message items into transaction-sized chunks bounded by both the item
|
|
47
|
-
* count and the aggregate byte budget. A single item larger than the budget is
|
|
48
|
-
* placed alone rather than dropped.
|
|
49
|
-
*/
|
|
50
|
-
function chunkBySize(items, maxItems, maxBytes) {
|
|
51
|
-
const chunks = [];
|
|
52
|
-
let current = [];
|
|
53
|
-
let currentBytes = 0;
|
|
54
|
-
for (const item of items) {
|
|
55
|
-
const size = estimateItemBytes(item);
|
|
56
|
-
if (shouldFlush(current.length, currentBytes, size, maxItems, maxBytes)) {
|
|
57
|
-
chunks.push(current);
|
|
58
|
-
current = [];
|
|
59
|
-
currentBytes = 0;
|
|
60
|
-
}
|
|
61
|
-
current.push(item);
|
|
62
|
-
currentBytes += size;
|
|
63
|
-
}
|
|
64
|
-
if (current.length > 0)
|
|
65
|
-
chunks.push(current);
|
|
66
|
-
return chunks;
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=message-chunker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message-chunker.js","sourceRoot":"","sources":["../../../src/history/internal/message-chunker.ts"],"names":[],"mappings":";;;;AAAA,oDAAmF;AAGnF;;;;;;GAMG;AACH,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC;;;;GAIG;AACH,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,eAAe,CAAC,UAA6B;IACpD,MAAM,IAAI,GACR,UAAU,CAAC,QAAQ,KAAK,uBAAe,CAAC,MAAM;QAC5C,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM;QACzB,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,2BAAkC,IAAqB;IACrD,OAAO,CACL,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;QACzB,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QAC7B,mBAAmB,CACpB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,KAAa,EACb,KAAa,EACb,IAAY,EACZ,GAAW,EACX,QAAgB;IAEhB,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,OAAO,KAAK,IAAI,GAAG,IAAI,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,qBACE,KAAwB,EACxB,QAAgB,EAChB,QAAgB;IAEhB,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,IAAI,OAAO,GAAsB,EAAE,CAAC;IACpC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,YAAY,IAAI,IAAI,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { ChatMessageItem } from '../types';
|
|
2
|
-
import { type SessionUpdateFields } from './session-update';
|
|
3
|
-
import type { HistoryContext } from './setup';
|
|
4
|
-
/** Per-call retry seams (injected in tests to keep backoff instant). */
|
|
5
|
-
export interface ChunkRetryOptions {
|
|
6
|
-
rng?: () => number;
|
|
7
|
-
signal?: AbortSignal;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Atomically write a chunk of message items together with the session-metadata
|
|
11
|
-
* count update in one {@link https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html | TransactWriteItems}
|
|
12
|
-
* call, so `messageCount` can never disagree with the messages that landed. A
|
|
13
|
-
* single `ClientRequestToken` is used per attempt so a re-sent commit (e.g.
|
|
14
|
-
* after a lost response) is idempotent and never double-applies the count
|
|
15
|
-
* `ADD`. When `fields.forceTtlRefresh` is set, the session update carries a
|
|
16
|
-
* monotonic ConditionExpression (see session-update.ts); if — and only if —
|
|
17
|
-
* that specific condition loses a race against a concurrent caller who just
|
|
18
|
-
* healed the same anchor, this retries the identical chunk once with
|
|
19
|
-
* `forceTtlRefresh: false` (safe: `if_not_exists` then converges to whatever
|
|
20
|
-
* already won) rather than losing the message writes to a benign ttl race. A
|
|
21
|
-
* cancellation caused by any other item (a genuine message-row conflict) is
|
|
22
|
-
* not retried here — it propagates for the normal transient-conflict retry
|
|
23
|
-
* budget inside `withDynamoDBRetry` to handle, or to the caller otherwise.
|
|
24
|
-
*/
|
|
25
|
-
export declare function writeMessageChunk(context: HistoryContext, items: ChatMessageItem[], fields: SessionUpdateFields, retry?: ChunkRetryOptions): Promise<void>;
|
|
26
|
-
//# sourceMappingURL=message-transaction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message-transaction.d.ts","sourceRoot":"","sources":["../../../src/history/internal/message-transaction.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wEAAwE;AACxE,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAuCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,eAAe,EAAE,EACxB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,GAAE,iBAAsB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.writeMessageChunk = writeMessageChunk;
|
|
4
|
-
const node_crypto_1 = require("node:crypto");
|
|
5
|
-
const constants_1 = require("../../shared/constants");
|
|
6
|
-
const cancellation_1 = require("../../shared/dynamodb/cancellation");
|
|
7
|
-
const retry_1 = require("../../shared/dynamodb/retry");
|
|
8
|
-
const session_update_1 = require("./session-update");
|
|
9
|
-
/** True when a TransactWriteItems cancellation was caused solely by the SESSION update's ttl condition (always TransactItems index 0 — see buildInput below), not by any message item. */
|
|
10
|
-
function isTtlConditionLoss(error) {
|
|
11
|
-
const reasons = (0, cancellation_1.getCancellationReasons)(error);
|
|
12
|
-
return (reasons?.[0]?.Code === 'ConditionalCheckFailed' &&
|
|
13
|
-
reasons.slice(1).every((reason) => reason.Code === 'None'));
|
|
14
|
-
}
|
|
15
|
-
function buildInput(context, items, fields) {
|
|
16
|
-
return {
|
|
17
|
-
TransactItems: [
|
|
18
|
-
(0, session_update_1.buildSessionUpdateItem)(context.tableName, fields),
|
|
19
|
-
...items.map((item) => ({ Put: { TableName: context.tableName, Item: item } })),
|
|
20
|
-
],
|
|
21
|
-
ClientRequestToken: (0, node_crypto_1.randomUUID)(),
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
async function attempt(context, items, fields, retry) {
|
|
25
|
-
const input = buildInput(context, items, fields);
|
|
26
|
-
await (0, retry_1.withDynamoDBRetry)(() => context.client.transactWrite(input), {
|
|
27
|
-
maxAttempts: constants_1.MESSAGE_APPEND_RETRY_MAX_ATTEMPTS,
|
|
28
|
-
rng: retry.rng,
|
|
29
|
-
signal: retry.signal,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Atomically write a chunk of message items together with the session-metadata
|
|
34
|
-
* count update in one {@link https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html | TransactWriteItems}
|
|
35
|
-
* call, so `messageCount` can never disagree with the messages that landed. A
|
|
36
|
-
* single `ClientRequestToken` is used per attempt so a re-sent commit (e.g.
|
|
37
|
-
* after a lost response) is idempotent and never double-applies the count
|
|
38
|
-
* `ADD`. When `fields.forceTtlRefresh` is set, the session update carries a
|
|
39
|
-
* monotonic ConditionExpression (see session-update.ts); if — and only if —
|
|
40
|
-
* that specific condition loses a race against a concurrent caller who just
|
|
41
|
-
* healed the same anchor, this retries the identical chunk once with
|
|
42
|
-
* `forceTtlRefresh: false` (safe: `if_not_exists` then converges to whatever
|
|
43
|
-
* already won) rather than losing the message writes to a benign ttl race. A
|
|
44
|
-
* cancellation caused by any other item (a genuine message-row conflict) is
|
|
45
|
-
* not retried here — it propagates for the normal transient-conflict retry
|
|
46
|
-
* budget inside `withDynamoDBRetry` to handle, or to the caller otherwise.
|
|
47
|
-
*/
|
|
48
|
-
async function writeMessageChunk(context, items, fields, retry = {}) {
|
|
49
|
-
try {
|
|
50
|
-
await attempt(context, items, fields, retry);
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
if (fields.forceTtlRefresh && isTtlConditionLoss(error)) {
|
|
54
|
-
await attempt(context, items, { ...fields, forceTtlRefresh: false }, retry);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
throw error;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=message-transaction.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message-transaction.js","sourceRoot":"","sources":["../../../src/history/internal/message-transaction.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAEzC,sDAA2E;AAC3E,qEAA4E;AAC5E,uDAAgE;AAEhE,qDAI0B;AAS1B,0LAA0L;AAC1L,SAAS,kBAAkB,CAAC,KAAY;IACtC,MAAM,OAAO,GAAG,IAAA,qCAAsB,EAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CACL,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,wBAAwB;QAC/C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,OAAuB,EACvB,KAAwB,EACxB,MAA2B;IAE3B,OAAO;QACL,aAAa,EAAE;YACb,IAAA,uCAAsB,EAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;YACjD,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;SAChF;QACD,kBAAkB,EAAE,IAAA,wBAAU,GAAE;KACjC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,OAAuB,EACvB,KAAwB,EACxB,MAA2B,EAC3B,KAAwB;IAExB,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;QACjE,WAAW,EAAE,6CAAiC;QAC9C,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACI,KAAK,4BACV,OAAuB,EACvB,KAAwB,EACxB,MAA2B,EAC3B,KAAK,GAAsB,EAAE;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,eAAe,IAAI,kBAAkB,CAAC,KAAc,CAAC,EAAE,CAAC;YACjE,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { QueryCommandInput } from '@aws-sdk/lib-dynamodb';
|
|
2
|
-
/** Options for {@link sessionItemsQuery}. */
|
|
3
|
-
export interface SessionItemsQueryOptions {
|
|
4
|
-
consistent?: boolean;
|
|
5
|
-
}
|
|
6
|
-
/** Query input selecting every item in a session's partition (messages + metadata). */
|
|
7
|
-
export declare function sessionItemsQuery(tableName: string, sessionId: string, options?: SessionItemsQueryOptions): QueryCommandInput;
|
|
8
|
-
/** Query input selecting a session's message items in chronological order. */
|
|
9
|
-
export declare function messageQuery(tableName: string, sessionId: string): QueryCommandInput;
|
|
10
|
-
//# sourceMappingURL=query.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/history/internal/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAI/D,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CASnB;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAWpF"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.sessionItemsQuery = sessionItemsQuery;
|
|
4
|
-
exports.messageQuery = messageQuery;
|
|
5
|
-
const keys_1 = require("./keys");
|
|
6
|
-
/** Query input selecting every item in a session's partition (messages + metadata). */
|
|
7
|
-
function sessionItemsQuery(tableName, sessionId, options = {}) {
|
|
8
|
-
const params = {
|
|
9
|
-
TableName: tableName,
|
|
10
|
-
KeyConditionExpression: '#pk = :pk',
|
|
11
|
-
ExpressionAttributeNames: { '#pk': 'PK' },
|
|
12
|
-
ExpressionAttributeValues: { ':pk': (0, keys_1.sessionPartition)(sessionId) },
|
|
13
|
-
};
|
|
14
|
-
if (options.consistent)
|
|
15
|
-
params.ConsistentRead = true;
|
|
16
|
-
return params;
|
|
17
|
-
}
|
|
18
|
-
/** Query input selecting a session's message items in chronological order. */
|
|
19
|
-
function messageQuery(tableName, sessionId) {
|
|
20
|
-
return {
|
|
21
|
-
TableName: tableName,
|
|
22
|
-
KeyConditionExpression: '#pk = :pk AND begins_with(#sk, :skp)',
|
|
23
|
-
ExpressionAttributeNames: { '#pk': 'PK', '#sk': 'SK' },
|
|
24
|
-
ExpressionAttributeValues: {
|
|
25
|
-
':pk': (0, keys_1.sessionPartition)(sessionId),
|
|
26
|
-
':skp': (0, keys_1.messageSortKeyPrefix)(),
|
|
27
|
-
},
|
|
28
|
-
ScanIndexForward: true,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=query.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/history/internal/query.ts"],"names":[],"mappings":";;;;AAEA,iCAAgE;AAOhE,uFAAuF;AACvF,2BACE,SAAiB,EACjB,SAAiB,EACjB,OAAO,GAA6B,EAAE;IAEtC,MAAM,MAAM,GAAsB;QAChC,SAAS,EAAE,SAAS;QACpB,sBAAsB,EAAE,WAAW;QACnC,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;QACzC,yBAAyB,EAAE,EAAE,KAAK,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC,EAAE;KAClE,CAAC;IACF,IAAI,OAAO,CAAC,UAAU;QAAE,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;IACrD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,sBAA6B,SAAiB,EAAE,SAAiB;IAC/D,OAAO;QACL,SAAS,EAAE,SAAS;QACpB,sBAAsB,EAAE,sCAAsC;QAC9D,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QACtD,yBAAyB,EAAE;YACzB,KAAK,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC;YAClC,MAAM,EAAE,IAAA,2BAAoB,GAAE;SAC/B;QACD,gBAAgB,EAAE,IAAI;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type { HistoryContext } from './setup';
|
|
2
|
-
/**
|
|
3
|
-
* Subtract a previously-added count from the session, leaving it consistent.
|
|
4
|
-
* Guarded so a concurrently-deleted SESSION row is never resurrected as a
|
|
5
|
-
* permanent, ttl-less junk row: if the row is already gone there is nothing
|
|
6
|
-
* to revert, so that specific condition failure is swallowed rather than
|
|
7
|
-
* surfaced — this runs only from an already-in-progress rollback, where a
|
|
8
|
-
* spurious error for a no-op would misrepresent what happened.
|
|
9
|
-
*
|
|
10
|
-
* Deliberately does not revert a `forceTtlRefresh`-driven ttl SET from an
|
|
11
|
-
* earlier committed chunk: the healed anchor is never shorter than what
|
|
12
|
-
* was there before, so leaving it in place after a rollback only means the
|
|
13
|
-
* session's metadata row outlives its content a bit longer than ideal —
|
|
14
|
-
* self-healing (the next successful append, or DynamoDB's own TTL sweep,
|
|
15
|
-
* resolves it), unlike reverting, which would need to re-check for a
|
|
16
|
-
* concurrent legitimate extension to avoid regressing it. See README.md's
|
|
17
|
-
* "TTL expiry" section.
|
|
18
|
-
*/
|
|
19
|
-
export declare function revertSessionCount(context: HistoryContext, sessionId: string, delta: number): Promise<void>;
|
|
20
|
-
/**
|
|
21
|
-
* Undo a rolled-back append's effect on the session row.
|
|
22
|
-
*
|
|
23
|
-
* When this call is the one that created the row — `createdAt` still equals
|
|
24
|
-
* this call's timestamp, and the only messages counted on it are the ones
|
|
25
|
-
* being reverted — the whole row is deleted. Without that, a failed first
|
|
26
|
-
* append left a "ghost session": `title`, `createdAt` and `sessionId` are all
|
|
27
|
-
* written via `if_not_exists`, so they were never reverted and never set
|
|
28
|
-
* again, leaving `listSessions()` reporting a session with `messageCount: 0`
|
|
29
|
-
* whose title still held up to 80 characters of a message the caller was told
|
|
30
|
-
* had not persisted, with no API to clear it.
|
|
31
|
-
*
|
|
32
|
-
* Both conditions are load-bearing. `createdAt = :now` establishes that this
|
|
33
|
-
* call created the row; `messageCount = :total` establishes that nothing else
|
|
34
|
-
* has added to it since. A concurrent append to the same brand-new session
|
|
35
|
-
* fails the count check, because deleting the row would destroy that caller's
|
|
36
|
-
* committed messages — so it falls through to the plain decrement, and then
|
|
37
|
-
* strips just the title this call contributed, which is the only part of the
|
|
38
|
-
* row still carrying rolled-back message content.
|
|
39
|
-
*/
|
|
40
|
-
export declare function revertSessionCreation(context: HistoryContext, sessionId: string, total: number, createdAt: string, title?: string): Promise<void>;
|
|
41
|
-
//# sourceMappingURL=session-count.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-count.d.ts","sourceRoot":"","sources":["../../../src/history/internal/session-count.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAe9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAwBf"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.revertSessionCount = revertSessionCount;
|
|
4
|
-
exports.revertSessionCreation = revertSessionCreation;
|
|
5
|
-
const node_crypto_1 = require("node:crypto");
|
|
6
|
-
const cancellation_1 = require("../../shared/dynamodb/cancellation");
|
|
7
|
-
const retry_1 = require("../../shared/dynamodb/retry");
|
|
8
|
-
const keys_1 = require("./keys");
|
|
9
|
-
const session_title_1 = require("./session-title");
|
|
10
|
-
/**
|
|
11
|
-
* True when a TransactWriteItems cancellation was caused by a
|
|
12
|
-
* ConditionalCheckFailed reason. Named distinctly from
|
|
13
|
-
* checkpointer/actions/put-writes.ts's isConditionalCheckFailed, which
|
|
14
|
-
* checks a different thing entirely (a raw PutItem exception name, not a
|
|
15
|
-
* transaction cancellation reason) — this function had that same name
|
|
16
|
-
* until now, a real trap for whoever read one assuming it was the other.
|
|
17
|
-
*/
|
|
18
|
-
function isCancelledByCondition(error) {
|
|
19
|
-
const reasons = (0, cancellation_1.getCancellationReasons)(error);
|
|
20
|
-
return reasons?.[0]?.Code === 'ConditionalCheckFailed';
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Subtract a previously-added count from the session, leaving it consistent.
|
|
24
|
-
* Guarded so a concurrently-deleted SESSION row is never resurrected as a
|
|
25
|
-
* permanent, ttl-less junk row: if the row is already gone there is nothing
|
|
26
|
-
* to revert, so that specific condition failure is swallowed rather than
|
|
27
|
-
* surfaced — this runs only from an already-in-progress rollback, where a
|
|
28
|
-
* spurious error for a no-op would misrepresent what happened.
|
|
29
|
-
*
|
|
30
|
-
* Deliberately does not revert a `forceTtlRefresh`-driven ttl SET from an
|
|
31
|
-
* earlier committed chunk: the healed anchor is never shorter than what
|
|
32
|
-
* was there before, so leaving it in place after a rollback only means the
|
|
33
|
-
* session's metadata row outlives its content a bit longer than ideal —
|
|
34
|
-
* self-healing (the next successful append, or DynamoDB's own TTL sweep,
|
|
35
|
-
* resolves it), unlike reverting, which would need to re-check for a
|
|
36
|
-
* concurrent legitimate extension to avoid regressing it. See README.md's
|
|
37
|
-
* "TTL expiry" section.
|
|
38
|
-
*/
|
|
39
|
-
async function revertSessionCount(context, sessionId, delta) {
|
|
40
|
-
if (delta === 0)
|
|
41
|
-
return;
|
|
42
|
-
const update = {
|
|
43
|
-
TableName: context.tableName,
|
|
44
|
-
Key: { PK: (0, keys_1.sessionPartition)(sessionId), SK: keys_1.SESSION_SORT_KEY },
|
|
45
|
-
UpdateExpression: 'ADD #count :neg',
|
|
46
|
-
ConditionExpression: 'attribute_exists(PK)',
|
|
47
|
-
ExpressionAttributeNames: { '#count': 'messageCount' },
|
|
48
|
-
ExpressionAttributeValues: { ':neg': -delta },
|
|
49
|
-
};
|
|
50
|
-
const input = { TransactItems: [{ Update: update }], ClientRequestToken: (0, node_crypto_1.randomUUID)() };
|
|
51
|
-
try {
|
|
52
|
-
await (0, retry_1.withDynamoDBRetry)(() => context.client.transactWrite(input));
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
if (isCancelledByCondition(error))
|
|
56
|
-
return;
|
|
57
|
-
throw error;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Undo a rolled-back append's effect on the session row.
|
|
62
|
-
*
|
|
63
|
-
* When this call is the one that created the row — `createdAt` still equals
|
|
64
|
-
* this call's timestamp, and the only messages counted on it are the ones
|
|
65
|
-
* being reverted — the whole row is deleted. Without that, a failed first
|
|
66
|
-
* append left a "ghost session": `title`, `createdAt` and `sessionId` are all
|
|
67
|
-
* written via `if_not_exists`, so they were never reverted and never set
|
|
68
|
-
* again, leaving `listSessions()` reporting a session with `messageCount: 0`
|
|
69
|
-
* whose title still held up to 80 characters of a message the caller was told
|
|
70
|
-
* had not persisted, with no API to clear it.
|
|
71
|
-
*
|
|
72
|
-
* Both conditions are load-bearing. `createdAt = :now` establishes that this
|
|
73
|
-
* call created the row; `messageCount = :total` establishes that nothing else
|
|
74
|
-
* has added to it since. A concurrent append to the same brand-new session
|
|
75
|
-
* fails the count check, because deleting the row would destroy that caller's
|
|
76
|
-
* committed messages — so it falls through to the plain decrement, and then
|
|
77
|
-
* strips just the title this call contributed, which is the only part of the
|
|
78
|
-
* row still carrying rolled-back message content.
|
|
79
|
-
*/
|
|
80
|
-
async function revertSessionCreation(context, sessionId, total, createdAt, title) {
|
|
81
|
-
if (total === 0)
|
|
82
|
-
return;
|
|
83
|
-
const input = {
|
|
84
|
-
TransactItems: [
|
|
85
|
-
{
|
|
86
|
-
Delete: {
|
|
87
|
-
TableName: context.tableName,
|
|
88
|
-
Key: { PK: (0, keys_1.sessionPartition)(sessionId), SK: keys_1.SESSION_SORT_KEY },
|
|
89
|
-
ConditionExpression: '#count = :total AND #c = :now',
|
|
90
|
-
ExpressionAttributeNames: { '#count': 'messageCount', '#c': 'createdAt' },
|
|
91
|
-
ExpressionAttributeValues: { ':total': total, ':now': createdAt },
|
|
92
|
-
},
|
|
93
|
-
},
|
|
94
|
-
],
|
|
95
|
-
ClientRequestToken: (0, node_crypto_1.randomUUID)(),
|
|
96
|
-
};
|
|
97
|
-
try {
|
|
98
|
-
await (0, retry_1.withDynamoDBRetry)(() => context.client.transactWrite(input));
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
catch (error) {
|
|
102
|
-
if (!isCancelledByCondition(error))
|
|
103
|
-
throw error;
|
|
104
|
-
}
|
|
105
|
-
await revertSessionCount(context, sessionId, total);
|
|
106
|
-
if (title !== undefined)
|
|
107
|
-
await (0, session_title_1.removeRolledBackTitle)(context, sessionId, createdAt, title);
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=session-count.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-count.js","sourceRoot":"","sources":["../../../src/history/internal/session-count.ts"],"names":[],"mappings":";;;;AAAA,6CAAyC;AAEzC,qEAA4E;AAC5E,uDAAgE;AAChE,iCAA4D;AAC5D,mDAAwD;AAGxD;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAAC,KAAY;IAC1C,MAAM,OAAO,GAAG,IAAA,qCAAsB,EAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,wBAAwB,CAAC;AACzD,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACI,KAAK,6BACV,OAAuB,EACvB,SAAiB,EACjB,KAAa;IAEb,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO;IACxB,MAAM,MAAM,GAAG;QACb,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,GAAG,EAAE,EAAE,EAAE,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC,EAAE,EAAE,EAAE,uBAAgB,EAAE;QAC9D,gBAAgB,EAAE,iBAAiB;QACnC,mBAAmB,EAAE,sBAAsB;QAC3C,wBAAwB,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;QACtD,yBAAyB,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE;KAC9C,CAAC;IACF,MAAM,KAAK,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,IAAA,wBAAU,GAAE,EAAE,CAAC;IACxF,IAAI,CAAC;QACH,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,sBAAsB,CAAC,KAAc,CAAC;YAAE,OAAO;QACnD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACI,KAAK,gCACV,OAAuB,EACvB,SAAiB,EACjB,KAAa,EACb,SAAiB,EACjB,KAAc;IAEd,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO;IACxB,MAAM,KAAK,GAAG;QACZ,aAAa,EAAE;YACb;gBACE,MAAM,EAAE;oBACN,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,GAAG,EAAE,EAAE,EAAE,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC,EAAE,EAAE,EAAE,uBAAgB,EAAE;oBAC9D,mBAAmB,EAAE,+BAA+B;oBACpD,wBAAwB,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE;oBACzE,yBAAyB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE;iBAClE;aACF;SACF;QACD,kBAAkB,EAAE,IAAA,wBAAU,GAAE;KACjC,CAAC;IACF,IAAI,CAAC;QACH,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,sBAAsB,CAAC,KAAc,CAAC;YAAE,MAAM,KAAK,CAAC;IAC3D,CAAC;IACD,MAAM,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACpD,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAA,qCAAqB,EAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAC7F,CAAC"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { HistoryContext } from './setup';
|
|
2
|
-
/**
|
|
3
|
-
* Strip a title this call contributed to a session row it created, when the
|
|
4
|
-
* row itself could not be deleted because a concurrent append has since added
|
|
5
|
-
* messages to it.
|
|
6
|
-
*
|
|
7
|
-
* Without this, that narrow window reopens exactly the leak C4 closes: the
|
|
8
|
-
* title is derived from the first human message of an append the caller was
|
|
9
|
-
* told had failed, and `if_not_exists` means nothing ever overwrites it — so
|
|
10
|
-
* a row that now belongs to a different caller keeps up to 80 characters of
|
|
11
|
-
* rolled-back message content.
|
|
12
|
-
*
|
|
13
|
-
* Both guards are load-bearing. `createdAt = :now` establishes that this call
|
|
14
|
-
* created the row, and `title = :title` that the title on it is still the one
|
|
15
|
-
* this call wrote — so a pre-existing title, or one a concurrent caller won
|
|
16
|
-
* the `if_not_exists` race for, is never removed. A condition rejection means
|
|
17
|
-
* exactly that and is not an error; anything else is.
|
|
18
|
-
*/
|
|
19
|
-
export declare function removeRolledBackTitle(context: HistoryContext, sessionId: string, createdAt: string, title: string): Promise<void>;
|
|
20
|
-
//# sourceMappingURL=session-title.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-title.d.ts","sourceRoot":"","sources":["../../../src/history/internal/session-title.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAO9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.removeRolledBackTitle = removeRolledBackTitle;
|
|
4
|
-
const retry_1 = require("../../shared/dynamodb/retry");
|
|
5
|
-
const keys_1 = require("./keys");
|
|
6
|
-
/** True when a plain UpdateItem was turned away by its ConditionExpression. */
|
|
7
|
-
function isConditionRejected(error) {
|
|
8
|
-
return error.name === 'ConditionalCheckFailedException';
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Strip a title this call contributed to a session row it created, when the
|
|
12
|
-
* row itself could not be deleted because a concurrent append has since added
|
|
13
|
-
* messages to it.
|
|
14
|
-
*
|
|
15
|
-
* Without this, that narrow window reopens exactly the leak C4 closes: the
|
|
16
|
-
* title is derived from the first human message of an append the caller was
|
|
17
|
-
* told had failed, and `if_not_exists` means nothing ever overwrites it — so
|
|
18
|
-
* a row that now belongs to a different caller keeps up to 80 characters of
|
|
19
|
-
* rolled-back message content.
|
|
20
|
-
*
|
|
21
|
-
* Both guards are load-bearing. `createdAt = :now` establishes that this call
|
|
22
|
-
* created the row, and `title = :title` that the title on it is still the one
|
|
23
|
-
* this call wrote — so a pre-existing title, or one a concurrent caller won
|
|
24
|
-
* the `if_not_exists` race for, is never removed. A condition rejection means
|
|
25
|
-
* exactly that and is not an error; anything else is.
|
|
26
|
-
*/
|
|
27
|
-
async function removeRolledBackTitle(context, sessionId, createdAt, title) {
|
|
28
|
-
try {
|
|
29
|
-
await (0, retry_1.withDynamoDBRetry)(() => context.client.update({
|
|
30
|
-
TableName: context.tableName,
|
|
31
|
-
Key: { PK: (0, keys_1.sessionPartition)(sessionId), SK: keys_1.SESSION_SORT_KEY },
|
|
32
|
-
UpdateExpression: 'REMOVE #title',
|
|
33
|
-
ConditionExpression: '#c = :now AND #title = :title',
|
|
34
|
-
ExpressionAttributeNames: { '#title': 'title', '#c': 'createdAt' },
|
|
35
|
-
ExpressionAttributeValues: { ':now': createdAt, ':title': title },
|
|
36
|
-
}));
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
if (isConditionRejected(error))
|
|
40
|
-
return;
|
|
41
|
-
throw error;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=session-title.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-title.js","sourceRoot":"","sources":["../../../src/history/internal/session-title.ts"],"names":[],"mappings":";;;AAAA,uDAAgE;AAChE,iCAA4D;AAG5D,+EAA+E;AAC/E,SAAS,mBAAmB,CAAC,KAAY;IACvC,OAAO,KAAK,CAAC,IAAI,KAAK,iCAAiC,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACI,KAAK,gCACV,OAAuB,EACvB,SAAiB,EACjB,SAAiB,EACjB,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,GAAG,EAAE,EAAE,EAAE,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC,EAAE,EAAE,EAAE,uBAAgB,EAAE;YAC9D,gBAAgB,EAAE,eAAe;YACjC,mBAAmB,EAAE,+BAA+B;YACpD,wBAAwB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;YAClE,yBAAyB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE;SAClE,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,mBAAmB,CAAC,KAAc,CAAC;YAAE,OAAO;QAChD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { TransactWriteCommandInput } from '@aws-sdk/lib-dynamodb';
|
|
2
|
-
/** One member of a {@link TransactWriteCommandInput} `TransactItems` list. */
|
|
3
|
-
export type HistoryTransactItem = NonNullable<TransactWriteCommandInput['TransactItems']>[number];
|
|
4
|
-
/** Fields driving the per-session metadata update inside the append transaction. */
|
|
5
|
-
export interface SessionUpdateFields {
|
|
6
|
-
sessionId: string;
|
|
7
|
-
count: number;
|
|
8
|
-
now: string;
|
|
9
|
-
title?: string;
|
|
10
|
-
ttlTimestamp?: number;
|
|
11
|
-
forceTtlRefresh?: boolean;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Build the metadata `Update` transact-item: `ADD` the message count and `SET`
|
|
15
|
-
* `updatedAt` every time, while `createdAt`, `sessionId`, `title`, and the `ttl`
|
|
16
|
-
* anchor are written once via `if_not_exists`. Folding the `ttl` anchor in here
|
|
17
|
-
* means the first append fixes one shared expiry atomically with the count, with
|
|
18
|
-
* no separate pre-write that could orphan a metadata-only row. When
|
|
19
|
-
* `forceTtlRefresh` is set (because {@link resolveTtlAnchor} found the persisted
|
|
20
|
-
* anchor missing or already expired), the `ttl` clause instead does a plain
|
|
21
|
-
* `SET`, so the SESSION row's own stale attribute actually heals instead of
|
|
22
|
-
* being permanently blocked by `if_not_exists`. When forceTtlRefresh is set,
|
|
23
|
-
* the SET is additionally guarded by a ConditionExpression so a concurrent
|
|
24
|
-
* caller's already-healed anchor can never be regressed backward — see
|
|
25
|
-
* message-transaction.ts for how a lost race is retried without forcing.
|
|
26
|
-
*/
|
|
27
|
-
export declare function buildSessionUpdateItem(tableName: string, fields: SessionUpdateFields): HistoryTransactItem;
|
|
28
|
-
//# sourceMappingURL=session-update.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-update.d.ts","sourceRoot":"","sources":["../../../src/history/internal/session-update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAI7F,8EAA8E;AAC9E,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC,yBAAyB,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAElG,oFAAoF;AACpF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,mBAAmB,GAC1B,mBAAmB,CAiDrB"}
|