@farukada/aws-langgraph-dynamodb-ts 1.0.0-rc.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/README.md +390 -193
  2. package/dist/{backfill → cjs/backfill}/backfill.d.ts +15 -12
  3. package/dist/cjs/backfill/backfill.js +177 -0
  4. package/dist/{checkpointer → cjs/checkpointer}/actions/delete-thread.d.ts +1 -1
  5. package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
  6. package/dist/{checkpointer → cjs/checkpointer}/actions/get-tuple.d.ts +4 -3
  7. package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
  8. package/dist/{checkpointer → cjs/checkpointer}/actions/list.d.ts +7 -4
  9. package/dist/cjs/checkpointer/actions/list.js +70 -0
  10. package/dist/{checkpointer → cjs/checkpointer}/actions/put-writes.d.ts +8 -6
  11. package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
  12. package/dist/{checkpointer → cjs/checkpointer}/actions/put.d.ts +21 -15
  13. package/dist/cjs/checkpointer/actions/put.js +79 -0
  14. package/dist/{checkpointer → cjs/checkpointer}/internal/delta-history.d.ts +38 -26
  15. package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
  16. package/dist/{checkpointer → cjs/checkpointer}/internal/listing.d.ts +4 -4
  17. package/dist/cjs/checkpointer/internal/listing.js +104 -0
  18. package/dist/{checkpointer → cjs/checkpointer}/internal/parse.d.ts +51 -15
  19. package/dist/cjs/checkpointer/internal/parse.js +184 -0
  20. package/dist/{checkpointer → cjs/checkpointer}/internal/pending-writes.d.ts +64 -25
  21. package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
  22. package/dist/{checkpointer → cjs/checkpointer}/internal/read.d.ts +15 -10
  23. package/dist/cjs/checkpointer/internal/read.js +132 -0
  24. package/dist/{checkpointer → cjs/checkpointer}/internal/rows.d.ts +94 -21
  25. package/dist/cjs/checkpointer/internal/rows.js +356 -0
  26. package/dist/{checkpointer → cjs/checkpointer}/internal/setup.d.ts +13 -20
  27. package/dist/cjs/checkpointer/internal/setup.js +25 -0
  28. package/dist/{checkpointer → cjs/checkpointer}/saver.d.ts +72 -36
  29. package/dist/cjs/checkpointer/saver.js +56 -0
  30. package/dist/{checkpointer → cjs/checkpointer}/types.d.ts +1 -1
  31. package/dist/cjs/checkpointer/types.js +2 -0
  32. package/dist/{factory → cjs/factory}/factory.d.ts +25 -20
  33. package/dist/cjs/factory/factory.js +137 -0
  34. package/dist/{factory → cjs/factory}/types.d.ts +12 -12
  35. package/dist/cjs/factory/types.js +2 -0
  36. package/dist/{history → cjs/history}/actions/add-messages.d.ts +18 -10
  37. package/dist/cjs/history/actions/add-messages.js +17 -0
  38. package/dist/{history → cjs/history}/actions/clear.d.ts +1 -1
  39. package/dist/cjs/history/actions/clear.js +29 -0
  40. package/dist/{history → cjs/history}/actions/get-messages.d.ts +11 -9
  41. package/dist/cjs/history/actions/get-messages.js +58 -0
  42. package/dist/{history → cjs/history}/actions/list-sessions.d.ts +3 -3
  43. package/dist/cjs/history/actions/list-sessions.js +67 -0
  44. package/dist/{history → cjs/history}/actions/reconcile-count.d.ts +13 -9
  45. package/dist/cjs/history/actions/reconcile-count.js +8 -0
  46. package/dist/{history → cjs/history}/chat-message-history.d.ts +62 -30
  47. package/dist/cjs/history/chat-message-history.js +61 -0
  48. package/dist/{history → cjs/history}/internal/append.d.ts +64 -32
  49. package/dist/cjs/history/internal/append.js +267 -0
  50. package/dist/{history → cjs/history}/internal/message-read.d.ts +3 -3
  51. package/dist/cjs/history/internal/message-read.js +93 -0
  52. package/dist/{history → cjs/history}/internal/parse.d.ts +2 -2
  53. package/dist/cjs/history/internal/parse.js +113 -0
  54. package/dist/{history → cjs/history}/internal/rows.d.ts +11 -10
  55. package/dist/cjs/history/internal/rows.js +96 -0
  56. package/dist/{history → cjs/history}/internal/session.d.ts +41 -22
  57. package/dist/cjs/history/internal/session.js +296 -0
  58. package/dist/{history → cjs/history}/internal/setup.d.ts +2 -2
  59. package/dist/cjs/history/internal/setup.js +60 -0
  60. package/dist/{history → cjs/history}/session-adapter.d.ts +0 -6
  61. package/dist/cjs/history/session-adapter.js +38 -0
  62. package/dist/{history → cjs/history}/types.d.ts +18 -15
  63. package/dist/cjs/history/types.js +2 -0
  64. package/dist/{index.d.ts → cjs/index.d.ts} +27 -27
  65. package/dist/cjs/index.js +25 -0
  66. package/dist/cjs/package.json +1 -0
  67. package/dist/{shared → cjs/shared}/adapter.d.ts +27 -16
  68. package/dist/cjs/shared/adapter.js +70 -0
  69. package/dist/cjs/shared/clock.js +14 -0
  70. package/dist/{shared → cjs/shared}/codec/codec.d.ts +37 -20
  71. package/dist/cjs/shared/codec/codec.js +162 -0
  72. package/dist/{shared → cjs/shared}/codec/compression.d.ts +9 -4
  73. package/dist/cjs/shared/codec/compression.js +45 -0
  74. package/dist/cjs/shared/codec/json-serde.js +58 -0
  75. package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +2 -1
  76. package/dist/cjs/shared/codec/s3/client-types.js +6 -0
  77. package/dist/{shared → cjs/shared}/codec/s3/client.d.ts +25 -7
  78. package/dist/cjs/shared/codec/s3/client.js +78 -0
  79. package/dist/{shared → cjs/shared}/codec/s3/config.d.ts +12 -7
  80. package/dist/cjs/shared/codec/s3/config.js +92 -0
  81. package/dist/{shared → cjs/shared}/codec/s3/lifecycle.d.ts +71 -17
  82. package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
  83. package/dist/{shared → cjs/shared}/codec/s3/offloader.d.ts +42 -29
  84. package/dist/cjs/shared/codec/s3/offloader.js +289 -0
  85. package/dist/cjs/shared/concurrency.js +31 -0
  86. package/dist/{shared → cjs/shared}/dynamodb/abort.d.ts +2 -2
  87. package/dist/cjs/shared/dynamodb/abort.js +16 -0
  88. package/dist/{shared → cjs/shared}/dynamodb/batch-write.d.ts +2 -2
  89. package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
  90. package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
  91. package/dist/{shared → cjs/shared}/dynamodb/client.d.ts +24 -22
  92. package/dist/cjs/shared/dynamodb/client.js +40 -0
  93. package/dist/{shared → cjs/shared}/dynamodb/idempotent-write.d.ts +64 -19
  94. package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
  95. package/dist/{shared → cjs/shared}/dynamodb/paginate.d.ts +2 -2
  96. package/dist/cjs/shared/dynamodb/paginate.js +90 -0
  97. package/dist/{shared → cjs/shared}/dynamodb/partition-delete.d.ts +6 -6
  98. package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
  99. package/dist/{shared → cjs/shared}/dynamodb/recency-index.d.ts +27 -15
  100. package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
  101. package/dist/{shared → cjs/shared}/dynamodb/retry.d.ts +37 -6
  102. package/dist/cjs/shared/dynamodb/retry.js +193 -0
  103. package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
  104. package/dist/cjs/shared/dynamodb/row-size.js +30 -0
  105. package/dist/{shared → cjs/shared}/dynamodb/table-schema.d.ts +27 -18
  106. package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
  107. package/dist/{shared → cjs/shared}/errors/base-error.d.ts +42 -7
  108. package/dist/cjs/shared/errors/base-error.js +73 -0
  109. package/dist/{shared → cjs/shared}/errors/boundary.d.ts +29 -14
  110. package/dist/cjs/shared/errors/boundary.js +61 -0
  111. package/dist/cjs/shared/errors/classify.d.ts +206 -0
  112. package/dist/cjs/shared/errors/classify.js +232 -0
  113. package/dist/{shared → cjs/shared}/errors/error-code.d.ts +17 -10
  114. package/dist/cjs/shared/errors/error-code.js +27 -0
  115. package/dist/{shared → cjs/shared}/errors/errors.d.ts +75 -9
  116. package/dist/cjs/shared/errors/errors.js +123 -0
  117. package/dist/cjs/shared/logging/logger.js +30 -0
  118. package/dist/{shared → cjs/shared}/logging/redaction.d.ts +8 -4
  119. package/dist/cjs/shared/logging/redaction.js +145 -0
  120. package/dist/{shared → cjs/shared}/logging/secret-patterns.d.ts +30 -7
  121. package/dist/cjs/shared/logging/secret-patterns.js +93 -0
  122. package/dist/cjs/shared/logging/truncate.js +31 -0
  123. package/dist/{shared → cjs/shared}/options.d.ts +27 -11
  124. package/dist/cjs/shared/options.js +2 -0
  125. package/dist/cjs/shared/ulid.js +83 -0
  126. package/dist/{shared → cjs/shared}/validation/collaborators.d.ts +21 -2
  127. package/dist/cjs/shared/validation/collaborators.js +79 -0
  128. package/dist/{shared → cjs/shared}/validation/option-shape.d.ts +7 -5
  129. package/dist/cjs/shared/validation/option-shape.js +31 -0
  130. package/dist/{shared → cjs/shared}/validation/options.d.ts +4 -4
  131. package/dist/cjs/shared/validation/options.js +166 -0
  132. package/dist/cjs/shared/validation/primitives.js +114 -0
  133. package/dist/{shared → cjs/shared}/validation/ttl.d.ts +26 -9
  134. package/dist/cjs/shared/validation/ttl.js +52 -0
  135. package/dist/{store → cjs/store}/actions/list-namespaces.d.ts +5 -5
  136. package/dist/cjs/store/actions/list-namespaces.js +92 -0
  137. package/dist/{store → cjs/store}/actions/put.d.ts +11 -4
  138. package/dist/cjs/store/actions/put.js +49 -0
  139. package/dist/{store → cjs/store}/actions/reconcile-vector-index.d.ts +5 -5
  140. package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
  141. package/dist/{store → cjs/store}/actions/search.d.ts +2 -2
  142. package/dist/cjs/store/actions/search.js +26 -0
  143. package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
  144. package/dist/cjs/store/internal/batch-plan.js +32 -0
  145. package/dist/{store → cjs/store}/internal/filter.d.ts +3 -3
  146. package/dist/cjs/store/internal/filter.js +64 -0
  147. package/dist/cjs/store/internal/get-item.d.ts +77 -0
  148. package/dist/cjs/store/internal/get-item.js +58 -0
  149. package/dist/{store → cjs/store}/internal/item-write.d.ts +72 -32
  150. package/dist/cjs/store/internal/item-write.js +181 -0
  151. package/dist/{store → cjs/store}/internal/parse.d.ts +15 -10
  152. package/dist/cjs/store/internal/parse.js +180 -0
  153. package/dist/{store → cjs/store}/internal/rows.d.ts +38 -34
  154. package/dist/cjs/store/internal/rows.js +166 -0
  155. package/dist/{store → cjs/store}/internal/semantic-search.d.ts +2 -2
  156. package/dist/cjs/store/internal/semantic-search.js +211 -0
  157. package/dist/{store → cjs/store}/internal/setup.d.ts +10 -15
  158. package/dist/cjs/store/internal/setup.js +103 -0
  159. package/dist/{store → cjs/store}/internal/table-search.d.ts +5 -5
  160. package/dist/cjs/store/internal/table-search.js +123 -0
  161. package/dist/{store → cjs/store}/internal/vector-index.d.ts +26 -15
  162. package/dist/cjs/store/internal/vector-index.js +269 -0
  163. package/dist/{store → cjs/store}/store.d.ts +82 -39
  164. package/dist/cjs/store/store.js +97 -0
  165. package/dist/{store → cjs/store}/types.d.ts +25 -10
  166. package/dist/cjs/store/types.js +2 -0
  167. package/dist/cjs/store/vector-backend.js +4 -0
  168. package/dist/esm/backfill/backfill.d.ts +171 -0
  169. package/dist/esm/backfill/backfill.js +170 -0
  170. package/dist/{checkpointer/actions/delete-thread.js → esm/checkpointer/actions/delete-thread.d.ts} +4 -26
  171. package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
  172. package/dist/{checkpointer/actions/get-tuple.js → esm/checkpointer/actions/get-tuple.d.ts} +7 -24
  173. package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
  174. package/dist/esm/checkpointer/actions/list.d.ts +55 -0
  175. package/dist/esm/checkpointer/actions/list.js +67 -0
  176. package/dist/{checkpointer/actions/put-writes.js → esm/checkpointer/actions/put-writes.d.ts} +10 -37
  177. package/dist/esm/checkpointer/actions/put-writes.js +18 -0
  178. package/dist/esm/checkpointer/actions/put.d.ts +95 -0
  179. package/dist/esm/checkpointer/actions/put.js +75 -0
  180. package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
  181. package/dist/esm/checkpointer/internal/delta-history.js +126 -0
  182. package/dist/{checkpointer/internal/listing.js → esm/checkpointer/internal/listing.d.ts} +22 -118
  183. package/dist/esm/checkpointer/internal/listing.js +95 -0
  184. package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
  185. package/dist/esm/checkpointer/internal/parse.js +169 -0
  186. package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
  187. package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
  188. package/dist/esm/checkpointer/internal/read.d.ts +135 -0
  189. package/dist/esm/checkpointer/internal/read.js +125 -0
  190. package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
  191. package/dist/esm/checkpointer/internal/rows.js +323 -0
  192. package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
  193. package/dist/esm/checkpointer/internal/setup.js +21 -0
  194. package/dist/{checkpointer/saver.js → esm/checkpointer/saver.d.ts} +84 -87
  195. package/dist/esm/checkpointer/saver.js +52 -0
  196. package/dist/esm/checkpointer/types.d.ts +51 -0
  197. package/dist/esm/checkpointer/types.js +1 -0
  198. package/dist/esm/factory/factory.d.ts +154 -0
  199. package/dist/esm/factory/factory.js +133 -0
  200. package/dist/esm/factory/types.d.ts +76 -0
  201. package/dist/esm/factory/types.js +1 -0
  202. package/dist/{history/actions/add-messages.js → esm/history/actions/add-messages.d.ts} +20 -26
  203. package/dist/esm/history/actions/add-messages.js +14 -0
  204. package/dist/{history/actions/clear.js → esm/history/actions/clear.d.ts} +4 -35
  205. package/dist/esm/history/actions/clear.js +26 -0
  206. package/dist/esm/history/actions/get-messages.d.ts +60 -0
  207. package/dist/esm/history/actions/get-messages.js +55 -0
  208. package/dist/esm/history/actions/list-sessions.d.ts +55 -0
  209. package/dist/esm/history/actions/list-sessions.js +64 -0
  210. package/dist/{history/actions/reconcile-count.js → esm/history/actions/reconcile-count.d.ts} +14 -16
  211. package/dist/esm/history/actions/reconcile-count.js +5 -0
  212. package/dist/{history/chat-message-history.js → esm/history/chat-message-history.d.ts} +76 -87
  213. package/dist/esm/history/chat-message-history.js +57 -0
  214. package/dist/esm/history/internal/append.d.ts +244 -0
  215. package/dist/esm/history/internal/append.js +259 -0
  216. package/dist/esm/history/internal/message-read.d.ts +84 -0
  217. package/dist/esm/history/internal/message-read.js +89 -0
  218. package/dist/esm/history/internal/parse.d.ts +153 -0
  219. package/dist/esm/history/internal/parse.js +105 -0
  220. package/dist/{history/internal/rows.js → esm/history/internal/rows.d.ts} +58 -112
  221. package/dist/esm/history/internal/rows.js +83 -0
  222. package/dist/esm/history/internal/session.d.ts +350 -0
  223. package/dist/esm/history/internal/session.js +285 -0
  224. package/dist/esm/history/internal/setup.d.ts +64 -0
  225. package/dist/esm/history/internal/setup.js +56 -0
  226. package/dist/{history/session-adapter.js → esm/history/session-adapter.d.ts} +25 -39
  227. package/dist/esm/history/session-adapter.js +34 -0
  228. package/dist/esm/history/types.d.ts +102 -0
  229. package/dist/esm/history/types.js +1 -0
  230. package/dist/esm/index.d.ts +53 -0
  231. package/dist/esm/index.js +10 -0
  232. package/dist/esm/shared/adapter.d.ts +146 -0
  233. package/dist/esm/shared/adapter.js +65 -0
  234. package/dist/{shared/clock.js → esm/shared/clock.d.ts} +3 -14
  235. package/dist/esm/shared/clock.js +9 -0
  236. package/dist/esm/shared/codec/codec.d.ts +336 -0
  237. package/dist/esm/shared/codec/codec.js +150 -0
  238. package/dist/esm/shared/codec/compression.d.ts +66 -0
  239. package/dist/esm/shared/codec/compression.js +40 -0
  240. package/dist/esm/shared/codec/json-serde.d.ts +80 -0
  241. package/dist/esm/shared/codec/json-serde.js +54 -0
  242. package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
  243. package/dist/esm/shared/codec/s3/client-types.js +3 -0
  244. package/dist/esm/shared/codec/s3/client.d.ts +63 -0
  245. package/dist/esm/shared/codec/s3/client.js +40 -0
  246. package/dist/{shared/codec/s3/config.js → esm/shared/codec/s3/config.d.ts} +45 -93
  247. package/dist/esm/shared/codec/s3/config.js +79 -0
  248. package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
  249. package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
  250. package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
  251. package/dist/esm/shared/codec/s3/offloader.js +278 -0
  252. package/dist/{shared/concurrency.js → esm/shared/concurrency.d.ts} +2 -37
  253. package/dist/esm/shared/concurrency.js +27 -0
  254. package/dist/{shared/dynamodb/abort.js → esm/shared/dynamodb/abort.d.ts} +4 -16
  255. package/dist/esm/shared/dynamodb/abort.js +12 -0
  256. package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
  257. package/dist/esm/shared/dynamodb/batch-write.js +74 -0
  258. package/dist/{shared/dynamodb/cancellation.js → esm/shared/dynamodb/cancellation.d.ts} +25 -53
  259. package/dist/esm/shared/dynamodb/cancellation.js +30 -0
  260. package/dist/{shared/dynamodb/client.js → esm/shared/dynamodb/client.d.ts} +74 -64
  261. package/dist/esm/shared/dynamodb/client.js +35 -0
  262. package/dist/{shared/dynamodb/idempotent-write.js → esm/shared/dynamodb/idempotent-write.d.ts} +172 -169
  263. package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
  264. package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
  265. package/dist/esm/shared/dynamodb/paginate.js +84 -0
  266. package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
  267. package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
  268. package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
  269. package/dist/esm/shared/dynamodb/recency-index.js +136 -0
  270. package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
  271. package/dist/esm/shared/dynamodb/retry.js +180 -0
  272. package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
  273. package/dist/esm/shared/dynamodb/row-size.js +26 -0
  274. package/dist/{shared/dynamodb/table-schema.js → esm/shared/dynamodb/table-schema.d.ts} +57 -67
  275. package/dist/esm/shared/dynamodb/table-schema.js +43 -0
  276. package/dist/esm/shared/errors/base-error.d.ts +231 -0
  277. package/dist/esm/shared/errors/base-error.js +64 -0
  278. package/dist/esm/shared/errors/boundary.d.ts +86 -0
  279. package/dist/esm/shared/errors/boundary.js +54 -0
  280. package/dist/esm/shared/errors/classify.d.ts +206 -0
  281. package/dist/esm/shared/errors/classify.js +220 -0
  282. package/dist/{shared/errors/error-code.js → esm/shared/errors/error-code.d.ts} +39 -43
  283. package/dist/esm/shared/errors/error-code.js +24 -0
  284. package/dist/{shared/errors/errors.js → esm/shared/errors/errors.d.ts} +92 -98
  285. package/dist/esm/shared/errors/errors.js +110 -0
  286. package/dist/{shared/logging/logger.js → esm/shared/logging/logger.d.ts} +22 -52
  287. package/dist/esm/shared/logging/logger.js +25 -0
  288. package/dist/esm/shared/logging/redaction.d.ts +123 -0
  289. package/dist/esm/shared/logging/redaction.js +140 -0
  290. package/dist/{shared/logging/secret-patterns.js → esm/shared/logging/secret-patterns.d.ts} +46 -87
  291. package/dist/esm/shared/logging/secret-patterns.js +83 -0
  292. package/dist/{shared/logging/truncate.js → esm/shared/logging/truncate.d.ts} +6 -40
  293. package/dist/esm/shared/logging/truncate.js +25 -0
  294. package/dist/esm/shared/options.d.ts +100 -0
  295. package/dist/esm/shared/options.js +1 -0
  296. package/dist/{shared/ulid.js → esm/shared/ulid.d.ts} +4 -84
  297. package/dist/esm/shared/ulid.js +77 -0
  298. package/dist/{shared/validation/collaborators.js → esm/shared/validation/collaborators.d.ts} +37 -65
  299. package/dist/esm/shared/validation/collaborators.js +70 -0
  300. package/dist/{shared/validation/option-shape.js → esm/shared/validation/option-shape.d.ts} +14 -36
  301. package/dist/esm/shared/validation/option-shape.js +24 -0
  302. package/dist/esm/shared/validation/options.d.ts +145 -0
  303. package/dist/esm/shared/validation/options.js +156 -0
  304. package/dist/{shared/validation/primitives.js → esm/shared/validation/primitives.d.ts} +30 -125
  305. package/dist/esm/shared/validation/primitives.js +100 -0
  306. package/dist/esm/shared/validation/ttl.d.ts +94 -0
  307. package/dist/esm/shared/validation/ttl.js +46 -0
  308. package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
  309. package/dist/esm/store/actions/list-namespaces.js +86 -0
  310. package/dist/esm/store/actions/put.d.ts +43 -0
  311. package/dist/esm/store/actions/put.js +46 -0
  312. package/dist/{store/actions/reconcile-vector-index.js → esm/store/actions/reconcile-vector-index.d.ts} +8 -16
  313. package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
  314. package/dist/esm/store/actions/search.d.ts +38 -0
  315. package/dist/esm/store/actions/search.js +23 -0
  316. package/dist/esm/store/internal/batch-plan.d.ts +56 -0
  317. package/dist/esm/store/internal/batch-plan.js +28 -0
  318. package/dist/esm/store/internal/filter.d.ts +43 -0
  319. package/dist/esm/store/internal/filter.js +60 -0
  320. package/dist/esm/store/internal/get-item.d.ts +77 -0
  321. package/dist/esm/store/internal/get-item.js +54 -0
  322. package/dist/esm/store/internal/item-write.d.ts +270 -0
  323. package/dist/esm/store/internal/item-write.js +173 -0
  324. package/dist/esm/store/internal/parse.d.ts +230 -0
  325. package/dist/esm/store/internal/parse.js +169 -0
  326. package/dist/{store/internal/rows.js → esm/store/internal/rows.d.ts} +111 -199
  327. package/dist/esm/store/internal/rows.js +147 -0
  328. package/dist/esm/store/internal/semantic-search.d.ts +168 -0
  329. package/dist/esm/store/internal/semantic-search.js +200 -0
  330. package/dist/esm/store/internal/setup.d.ts +96 -0
  331. package/dist/esm/store/internal/setup.js +98 -0
  332. package/dist/esm/store/internal/table-search.d.ts +100 -0
  333. package/dist/esm/store/internal/table-search.js +119 -0
  334. package/dist/esm/store/internal/vector-index.d.ts +258 -0
  335. package/dist/esm/store/internal/vector-index.js +256 -0
  336. package/dist/{store/store.js → esm/store/store.d.ts} +99 -133
  337. package/dist/esm/store/store.js +93 -0
  338. package/dist/esm/store/types.d.ts +111 -0
  339. package/dist/esm/store/types.js +1 -0
  340. package/dist/esm/store/vector-backend.d.ts +104 -0
  341. package/dist/esm/store/vector-backend.js +1 -0
  342. package/package.json +50 -44
  343. package/dist/backfill/backfill.js +0 -393
  344. package/dist/checkpointer/actions/list.js +0 -142
  345. package/dist/checkpointer/actions/put.js +0 -195
  346. package/dist/checkpointer/internal/delta-history.js +0 -252
  347. package/dist/checkpointer/internal/parse.js +0 -372
  348. package/dist/checkpointer/internal/pending-writes.js +0 -588
  349. package/dist/checkpointer/internal/read.js +0 -264
  350. package/dist/checkpointer/internal/rows.js +0 -834
  351. package/dist/checkpointer/internal/setup.js +0 -72
  352. package/dist/checkpointer/types.js +0 -12
  353. package/dist/factory/factory.js +0 -266
  354. package/dist/factory/types.js +0 -10
  355. package/dist/history/actions/get-messages.js +0 -141
  356. package/dist/history/actions/list-sessions.js +0 -156
  357. package/dist/history/internal/append.js +0 -500
  358. package/dist/history/internal/message-read.js +0 -204
  359. package/dist/history/internal/parse.js +0 -252
  360. package/dist/history/internal/session.js +0 -628
  361. package/dist/history/internal/setup.js +0 -106
  362. package/dist/history/types.js +0 -12
  363. package/dist/index.js +0 -51
  364. package/dist/shared/adapter.js +0 -143
  365. package/dist/shared/codec/codec.js +0 -441
  366. package/dist/shared/codec/compression.js +0 -89
  367. package/dist/shared/codec/json-serde.js +0 -191
  368. package/dist/shared/codec/s3/client-types.js +0 -26
  369. package/dist/shared/codec/s3/client.js +0 -97
  370. package/dist/shared/codec/s3/lifecycle.js +0 -355
  371. package/dist/shared/codec/s3/offloader.js +0 -658
  372. package/dist/shared/dynamodb/batch-write.js +0 -173
  373. package/dist/shared/dynamodb/paginate.js +0 -188
  374. package/dist/shared/dynamodb/partition-delete.js +0 -340
  375. package/dist/shared/dynamodb/recency-index.js +0 -377
  376. package/dist/shared/dynamodb/retry.js +0 -463
  377. package/dist/shared/errors/base-error.js +0 -174
  378. package/dist/shared/errors/boundary.js +0 -143
  379. package/dist/shared/errors/classify.d.ts +0 -97
  380. package/dist/shared/errors/classify.js +0 -257
  381. package/dist/shared/logging/redaction.js +0 -316
  382. package/dist/shared/options.js +0 -11
  383. package/dist/shared/validation/options.js +0 -328
  384. package/dist/shared/validation/ttl.js +0 -132
  385. package/dist/store/actions/list-namespaces.js +0 -197
  386. package/dist/store/actions/put.js +0 -78
  387. package/dist/store/actions/search.js +0 -66
  388. package/dist/store/internal/batch-plan.d.ts +0 -26
  389. package/dist/store/internal/batch-plan.js +0 -109
  390. package/dist/store/internal/filter.js +0 -137
  391. package/dist/store/internal/get-item.d.ts +0 -45
  392. package/dist/store/internal/get-item.js +0 -115
  393. package/dist/store/internal/item-write.js +0 -463
  394. package/dist/store/internal/parse.js +0 -350
  395. package/dist/store/internal/semantic-search.js +0 -389
  396. package/dist/store/internal/setup.js +0 -223
  397. package/dist/store/internal/table-search.js +0 -213
  398. package/dist/store/internal/vector-index.js +0 -546
  399. package/dist/store/types.js +0 -15
  400. package/dist/store/vector-backend.js +0 -17
  401. /package/dist/{shared → cjs/shared}/clock.d.ts +0 -0
  402. /package/dist/{shared → cjs/shared}/codec/json-serde.d.ts +0 -0
  403. /package/dist/{shared → cjs/shared}/concurrency.d.ts +0 -0
  404. /package/dist/{shared → cjs/shared}/dynamodb/cancellation.d.ts +0 -0
  405. /package/dist/{shared → cjs/shared}/logging/logger.d.ts +0 -0
  406. /package/dist/{shared → cjs/shared}/logging/truncate.d.ts +0 -0
  407. /package/dist/{shared → cjs/shared}/ulid.d.ts +0 -0
  408. /package/dist/{shared → cjs/shared}/validation/primitives.d.ts +0 -0
  409. /package/dist/{store → cjs/store}/vector-backend.d.ts +0 -0
@@ -0,0 +1,133 @@
1
+ import { DynamoDBSaver } from '../checkpointer/saver.js';
2
+ import { DynamoDBChatMessageHistory } from '../history/chat-message-history.js';
3
+ import { s3ClientOptions } from '../shared/codec/s3/client-types.js';
4
+ import { resolveDynamoDBClient } from '../shared/dynamodb/client.js';
5
+ import { failureLabel } from '../shared/errors/base-error.js';
6
+ import { resolveLogger } from '../shared/logging/logger.js';
7
+ import { truncateForLog } from '../shared/logging/truncate.js';
8
+ import { assertMembers, LOGGER_MEMBERS } from '../shared/validation/collaborators.js';
9
+ import { allKeysOf, assertObjectShape, assertShape, isObjectShape, } from '../shared/validation/option-shape.js';
10
+ import { assertClientChoice } from '../shared/validation/options.js';
11
+ import { DynamoDBStore } from '../store/store.js';
12
+ const FACTORY_BASE_KEYS = allKeysOf({
13
+ client: 'client',
14
+ clientConfig: 'clientConfig',
15
+ createClient: 'createClient',
16
+ logger: 'logger',
17
+ ttl: 'ttl',
18
+ compression: 'compression',
19
+ s3: 's3',
20
+ retry: 'retry',
21
+ });
22
+ const CREATE_ALL_KEYS = allKeysOf({
23
+ saver: 'saver',
24
+ store: 'store',
25
+ history: 'history',
26
+ });
27
+ function release(logger, close) {
28
+ try {
29
+ close();
30
+ }
31
+ catch (error) {
32
+ logger.warn('factory.destroy: an adapter did not release its resources', {
33
+ reason: truncateForLog(failureLabel(error)),
34
+ });
35
+ }
36
+ }
37
+ function overridesClient(options) {
38
+ return (options.client !== undefined ||
39
+ options.clientConfig !== undefined ||
40
+ options.createClient !== undefined);
41
+ }
42
+ function given(options) {
43
+ const kept = {};
44
+ for (const [key, value] of Object.entries(options)) {
45
+ if (value !== undefined)
46
+ kept[key] = value;
47
+ }
48
+ return kept;
49
+ }
50
+ export class DynamoDBFactory {
51
+ base;
52
+ constructor(base = {}) {
53
+ this.base = base;
54
+ assertShape(base, FACTORY_BASE_KEYS, 'options');
55
+ assertClientChoice(base);
56
+ if (base.logger !== undefined)
57
+ assertMembers(base.logger, LOGGER_MEMBERS, 'logger');
58
+ }
59
+ sharedDefaults() {
60
+ const { logger, ttl, compression, s3, retry } = this.base;
61
+ return { logger, ttl, compression, s3, retry };
62
+ }
63
+ withTableRegion(s3) {
64
+ if (!isObjectShape(s3))
65
+ return s3;
66
+ if (s3.clientConfig !== undefined && !isObjectShape(s3.clientConfig))
67
+ return s3;
68
+ const region = s3ClientOptions(s3.clientConfig).region ?? this.base.clientConfig?.region;
69
+ if (region === undefined)
70
+ return s3;
71
+ return { ...s3, clientConfig: { ...s3.clientConfig, region } };
72
+ }
73
+ defaultsFor(options) {
74
+ return overridesClient(options) ? this.sharedDefaults() : this.base;
75
+ }
76
+ createSaver(options) {
77
+ assertObjectShape(options, 'options');
78
+ const own = given(options);
79
+ return new DynamoDBSaver({ ...this.defaultsFor(own), ...own });
80
+ }
81
+ createStore(options) {
82
+ assertObjectShape(options, 'options');
83
+ const own = given(options);
84
+ return new DynamoDBStore({ ...this.defaultsFor(own), ...own });
85
+ }
86
+ createChatMessageHistory(options) {
87
+ assertObjectShape(options, 'options');
88
+ const own = given(options);
89
+ return new DynamoDBChatMessageHistory({ ...this.defaultsFor(own), ...own });
90
+ }
91
+ createAll(options) {
92
+ assertShape(options, CREATE_ALL_KEYS, 'options');
93
+ const { saver, store, history } = options;
94
+ for (const section of [saver, store, history]) {
95
+ if (section !== undefined)
96
+ assertObjectShape(section, 'options');
97
+ }
98
+ const logger = resolveLogger(this.base.logger);
99
+ const resolved = resolveDynamoDBClient(this.base);
100
+ const shared = { ...this.sharedDefaults(), client: resolved.client };
101
+ const onSharedClient = (section) => {
102
+ const options = { ...shared, ...given(section) };
103
+ return { ...options, s3: this.withTableRegion(options.s3) };
104
+ };
105
+ const built = [];
106
+ const track = (adapter) => {
107
+ built.push(adapter);
108
+ return adapter;
109
+ };
110
+ let destroyed = false;
111
+ const destroy = () => {
112
+ if (destroyed)
113
+ return;
114
+ destroyed = true;
115
+ for (const adapter of built)
116
+ release(logger, () => adapter.destroy());
117
+ release(logger, () => resolved.ddbClient?.destroy());
118
+ };
119
+ try {
120
+ const adapters = {
121
+ saver: saver && track(new DynamoDBSaver(onSharedClient(saver))),
122
+ store: store && track(new DynamoDBStore(onSharedClient(store))),
123
+ history: history && track(new DynamoDBChatMessageHistory(onSharedClient(history))),
124
+ destroy,
125
+ };
126
+ return adapters;
127
+ }
128
+ catch (error) {
129
+ destroy();
130
+ throw error;
131
+ }
132
+ }
133
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Hides how the factory's options are typed by what a caller asks for.
3
+ *
4
+ * The defaults every adapter inherits, the per-adapter sections of `createAll`
5
+ * without the shared client's fields, and a result whose adapters are typed
6
+ * `undefined` for each section left out are declared here, so a caller's
7
+ * compiler knows which adapters it got without a runtime check.
8
+ */
9
+ import type { DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
10
+ import type { DynamoDBSaver } from '../checkpointer/saver.js';
11
+ import type { DynamoDBSaverOptions } from '../checkpointer/types.js';
12
+ import type { DynamoDBChatMessageHistory } from '../history/chat-message-history.js';
13
+ import type { DynamoDBChatMessageHistoryOptions } from '../history/types.js';
14
+ import type { CompressionConfig } from '../shared/codec/compression.js';
15
+ import type { S3OffloadConfig } from '../shared/codec/s3/config.js';
16
+ import type { DynamoDBDocumentLike } from '../shared/dynamodb/client.js';
17
+ import type { RetryPolicy } from '../shared/dynamodb/retry.js';
18
+ import type { Logger } from '../shared/logging/logger.js';
19
+ import type { TtlOption } from '../shared/validation/ttl.js';
20
+ import type { DynamoDBStore } from '../store/store.js';
21
+ import type { DynamoDBStoreOptions } from '../store/types.js';
22
+ /**
23
+ * Defaults applied to every adapter the factory builds: the client (or how to
24
+ * build one) and the cross-cutting options a team usually wants identical
25
+ * across its checkpointer, store and history. A per-adapter option wins.
26
+ */
27
+ export interface FactoryBaseOptions {
28
+ /**
29
+ * Reused as-is by every adapter. Construct it with `maxAttempts: 1`, or the
30
+ * SDK's own retries stack inside the library's retry budget (each adapter
31
+ * logs a `warn` at construction when they would).
32
+ */
33
+ client?: DynamoDBDocumentLike;
34
+ /**
35
+ * The config the client is built from, and read for its `region` when an `s3`
36
+ * config names none — including by `createAll`, whose adapters are handed the
37
+ * shared client rather than this config.
38
+ */
39
+ clientConfig?: DynamoDBClientConfig;
40
+ logger?: Logger;
41
+ ttl?: TtlOption;
42
+ compression?: CompressionConfig;
43
+ s3?: S3OffloadConfig;
44
+ retry?: RetryPolicy;
45
+ }
46
+ /** An adapter's own options inside {@link CreateAllOptions}: everything but the shared client. */
47
+ export type AdapterSection<Options> = Omit<Options, 'client' | 'clientConfig' | 'createClient'>;
48
+ /**
49
+ * Per-adapter options for `DynamoDBFactory.createAll`; omit a section to skip
50
+ * that adapter, and pass none to build none. A key that is not one of these
51
+ * three is refused: it would otherwise skip every adapter silently. So is a
52
+ * section that is not an object, `null` included, naming `options` as that
53
+ * adapter's constructor would.
54
+ */
55
+ export interface CreateAllOptions {
56
+ saver?: AdapterSection<DynamoDBSaverOptions>;
57
+ store?: AdapterSection<DynamoDBStoreOptions>;
58
+ history?: AdapterSection<DynamoDBChatMessageHistoryOptions>;
59
+ }
60
+ /**
61
+ * The adapters `createAll` built, typed by the sections it was given: an
62
+ * omitted section is `undefined`. The default names the all-three result.
63
+ */
64
+ export interface CreatedAdapters<O extends CreateAllOptions = Required<CreateAllOptions>> {
65
+ saver: O extends {
66
+ saver: object;
67
+ } ? DynamoDBSaver : undefined;
68
+ store: O extends {
69
+ store: object;
70
+ } ? DynamoDBStore : undefined;
71
+ history: O extends {
72
+ history: object;
73
+ } ? DynamoDBChatMessageHistory : undefined;
74
+ /** Tear down every built adapter and the shared client, once. */
75
+ destroy: () => void;
76
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Hides what an append settles before its first write.
4
3
  *
@@ -9,12 +8,8 @@
9
8
  * so every message of the append shares it. How the rows and the count are
10
9
  * then written together is `appendMessages`' decision, not this module's.
11
10
  */
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.addMessages = addMessages;
14
- const ttl_1 = require("../../shared/validation/ttl");
15
- const append_1 = require("../internal/append");
16
- const parse_1 = require("../internal/parse");
17
- const session_1 = require("../internal/session");
11
+ import type { BaseMessage } from '@langchain/core/messages';
12
+ import type { HistoryContext } from '../internal/setup.js';
18
13
  /**
19
14
  * Append messages as one item per message. Each chunk writes its message Puts
20
15
  * and the session-metadata count `ADD` in a single `TransactWriteItems`, so
@@ -34,24 +29,23 @@ const session_1 = require("../internal/session");
34
29
  * Returns: nothing, and only once every message has landed.
35
30
  *
36
31
  * Throws: `VALIDATION` naming `sessionId` or `messages` (with the offending
37
- * index) before any write; `S3_OFFLOAD_FAILED`; whatever the transaction
38
- * throws, after the rollback; `COMPENSATION_FAILED` when that
39
- * rollback could not finish.
32
+ * index) before any write, or naming `payload` for a message too large to
33
+ * store inline without `s3`, or, once offloaded, larger than
34
+ * `s3.maxDownloadBytes`; `S3_OFFLOAD_FAILED`; whatever the transaction
35
+ * throws, after the rollback; `COMPENSATION_FAILED` when that rollback could
36
+ * not finish, or when a failing chunk's own outcome could not be established;
37
+ * `ABORTED` when the signal fires, after the same rollback.
40
38
  *
41
- * Guarantees: a caller observes all messages or none. `messageCount` always
42
- * agrees with the messages that landed, because each chunk writes both in one
43
- * transaction. Every message of the append shares one creation-anchored expiry,
44
- * so a conversation expires whole rather than losing its oldest turns first. No
45
- * S3 object is left behind by a failure, at any stage — including a failure
46
- * partway through encoding, before the saga exists.
39
+ * Guarantees: a caller observes all messages or none — except the one chunk
40
+ * a failed call could not settle: an `ABORTED` append whose in-flight chunk
41
+ * commits after the call returns, or a `COMPENSATION_FAILED` append whose
42
+ * failing chunk's own outcome could not be established. Read the session
43
+ * back before deciding whether to resend those messages. `messageCount`
44
+ * always agrees with the messages that landed, because each chunk writes
45
+ * both in one transaction. Every message of the append shares one
46
+ * creation-anchored expiry, so a conversation expires whole rather than
47
+ * losing its oldest turns first. No S3 object is left behind by a failure,
48
+ * at any stage — including a failure partway through encoding, before the
49
+ * saga exists.
47
50
  */
48
- async function addMessages(context, sessionId, messages, signal) {
49
- const session = (0, parse_1.parseSessionId)(sessionId);
50
- const stored = (0, parse_1.parseMessages)(messages);
51
- if (stored.length === 0)
52
- return;
53
- const anchor = context.ttl
54
- ? await (0, session_1.resolveTtlAnchor)(context, session, (0, ttl_1.calculateTtlTimestamp)(context.ttl), signal)
55
- : undefined;
56
- await (0, append_1.appendMessages)(context, { sessionId: session, messages: stored, anchor, signal });
57
- }
51
+ export declare function addMessages(context: HistoryContext, sessionId: string, messages: BaseMessage[], signal?: AbortSignal): Promise<void>;
@@ -0,0 +1,14 @@
1
+ import { calculateTtlTimestamp } from '../../shared/validation/ttl.js';
2
+ import { appendMessages } from '../internal/append.js';
3
+ import { parseMessages, parseSessionId } from '../internal/parse.js';
4
+ import { resolveTtlAnchor } from '../internal/session.js';
5
+ export async function addMessages(context, sessionId, messages, signal) {
6
+ const session = parseSessionId(sessionId);
7
+ const stored = parseMessages(messages);
8
+ if (stored.length === 0)
9
+ return;
10
+ const anchor = context.ttl
11
+ ? await resolveTtlAnchor(context, session, calculateTtlTimestamp(context.ttl), signal)
12
+ : undefined;
13
+ await appendMessages(context, { sessionId: session, messages: stored, anchor, signal });
14
+ }
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Hides which rows a clear may delete.
4
3
  *
@@ -10,23 +9,7 @@
10
9
  * deleted; the paging, the per-row deletes and the S3 cleanup are the shared
11
10
  * partition delete's.
12
11
  */
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.clearSession = clearSession;
15
- const idempotent_write_1 = require("../../shared/dynamodb/idempotent-write");
16
- const partition_delete_1 = require("../../shared/dynamodb/partition-delete");
17
- const retry_1 = require("../../shared/dynamodb/retry");
18
- const parse_1 = require("../internal/parse");
19
- const rows_1 = require("../internal/rows");
20
- /**
21
- * The offloaded payload a chat-history row references, named by the attribute
22
- * holding it, because a message row is pinned through a document path over that
23
- * name. The session row carries no payload and is pinned top-level instead, and
24
- * a row holding `null` there carries none either — `namedDescriptor` decides.
25
- */
26
- function descriptorsOf(row) {
27
- const entry = (0, partition_delete_1.namedDescriptor)(row, 'message');
28
- return entry === undefined ? [] : [entry];
29
- }
12
+ import type { HistoryContext } from '../internal/setup.js';
30
13
  /**
31
14
  * Delete exactly the message rows and the session row of one session that the
32
15
  * partition read observed.
@@ -64,20 +47,6 @@ function descriptorsOf(row) {
64
47
  * which is the right outcome, the session being alive. One pass over a
65
48
  * quiescent session: a message appended while this runs may survive it.
66
49
  */
67
- async function clearSession(context, sessionId, options = {}) {
68
- const session = (0, parse_1.parseSessionId)(sessionId);
69
- await (0, partition_delete_1.deletePartitionRows)({
70
- client: context.client,
71
- tableName: context.tableName,
72
- params: (0, rows_1.sessionRowsQuery)(context.tableName, session, { consistent: true }),
73
- logger: context.logger,
74
- retry: (0, retry_1.retryFor)(context, options.signal),
75
- signal: options.signal,
76
- offloader: context.offloader,
77
- operation: 'history.clear',
78
- ownsSortKey: rows_1.isHistorySortKey,
79
- descriptorsOf,
80
- idAttribute: idempotent_write_1.WRITE_ID_ATTRIBUTE,
81
- scope: [session],
82
- });
83
- }
50
+ export declare function clearSession(context: HistoryContext, sessionId: string, options?: {
51
+ signal?: AbortSignal;
52
+ }): Promise<void>;
@@ -0,0 +1,26 @@
1
+ import { WRITE_ID_ATTRIBUTE } from '../../shared/dynamodb/idempotent-write.js';
2
+ import { deletePartitionRows, namedDescriptor, } from '../../shared/dynamodb/partition-delete.js';
3
+ import { retryFor } from '../../shared/dynamodb/retry.js';
4
+ import { parseSessionId } from '../internal/parse.js';
5
+ import { isHistorySortKey, sessionRowsQuery } from '../internal/rows.js';
6
+ function descriptorsOf(row) {
7
+ const entry = namedDescriptor(row, 'message');
8
+ return entry === undefined ? [] : [entry];
9
+ }
10
+ export async function clearSession(context, sessionId, options = {}) {
11
+ const session = parseSessionId(sessionId);
12
+ await deletePartitionRows({
13
+ client: context.client,
14
+ tableName: context.tableName,
15
+ params: sessionRowsQuery(context.tableName, session, { consistent: true }),
16
+ logger: context.logger,
17
+ retry: retryFor(context, options.signal),
18
+ signal: options.signal,
19
+ offloader: context.offloader,
20
+ operation: 'history.clear',
21
+ ownsSortKey: isHistorySortKey,
22
+ descriptorsOf,
23
+ idAttribute: WRITE_ID_ATTRIBUTE,
24
+ scope: [session],
25
+ });
26
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Hides which decode failures cost one message and which fail the read.
3
+ *
4
+ * A stored message is fetched, deserialized and rebuilt in three stages, and
5
+ * the stage a failure comes from decides its fate: only a loss no reader could
6
+ * ever recover is confined to that message and handed to `onCorruptMessage`
7
+ * (record 12); a transport fault, an out-of-scope key, a newer payload or a
8
+ * serializer's refusal fails the read under either policy. A caller gets a
9
+ * conversation that is whole or, under `'skip'`, missing a lost turn
10
+ * reported at `error` — never one silently truncated without a trace —
11
+ * however many downloads run at once.
12
+ */
13
+ import { type BaseMessage } from '@langchain/core/messages';
14
+ import type { CancelOptions } from '../../shared/options.js';
15
+ import type { HistoryContext } from '../internal/setup.js';
16
+ import type { MessageWindow } from '../types.js';
17
+ /**
18
+ * Return a session's messages in chronological order — the whole session, or
19
+ * the window `options` selects: `limit` keeps only the newest `limit`
20
+ * messages, `before` only those appended before that instant (see
21
+ * {@link readWindow}). Items past their TTL are filtered out on read
22
+ * (DynamoDB deletes an expired row within a few days, with no fixed bound),
23
+ * so the returned history is never stale. A corrupt item — see
24
+ * {@link decodeMessage} for exactly what counts — is handled per
25
+ * `onCorruptMessage`: `'throw'` fails the read with the underlying error;
26
+ * `'skip'` (the default) reports it at `error` with its sort key and returns
27
+ * the rest. Every other failure propagates regardless of the policy.
28
+ *
29
+ * Accepts: `options.limit` — the newest N, at least 1; absent asks for the
30
+ * whole session, and `0` is refused rather than read as an empty conversation
31
+ * (see {@link parseMessageWindow}).
32
+ * `options.before` — only messages appended before that instant.
33
+ * `options.signal` — aborts the reads.
34
+ *
35
+ * Returns: the messages in chronological order, oldest first. A session that
36
+ * does not exist and one whose messages have all expired both return nothing:
37
+ * a conversation nobody can read is a conversation that is not there.
38
+ *
39
+ * Throws: `VALIDATION` naming `sessionId`, `limit`, `before`, `signal`, or
40
+ * `options.<key>` for a key this package does not read;
41
+ * `FORMAT_UNSUPPORTED` for a row, or a payload, a newer version wrote — the
42
+ * payload half whatever the policy, because a newer reader reads it and
43
+ * dropping it would lose a turn a rollback could still serve; the decode error
44
+ * of a corrupt row under `onCorruptMessage: 'throw'`; `VALIDATION` naming
45
+ * `message` for a row in this session's message key space that this adapter
46
+ * did not write, naming
47
+ * `s3Key` for a row addressing an object outside the session's own path, and
48
+ * naming `serde` for a row whose payload the serializer refuses to
49
+ * reconstruct, all three whatever the policy; `COMPRESSION_LIMIT` for a
50
+ * payload larger than this reader's `compression.maxDecompressedBytes`,
51
+ * whatever the policy too; any infrastructure failure — a throttle, a
52
+ * permission, a transport error — whatever the policy, because dropping a
53
+ * message for one of those would hand back a silently truncated conversation
54
+ * that the chain then re-persists as the truth.
55
+ *
56
+ * Guarantees: strongly consistent, so the turn just appended is visible.
57
+ * Offloaded messages download several at a time, and the corruption policy is
58
+ * applied in message order however they finish.
59
+ */
60
+ export declare function getMessages(context: HistoryContext, sessionId: string, options?: MessageWindow & CancelOptions): Promise<BaseMessage[]>;
@@ -0,0 +1,55 @@
1
+ import { mapStoredMessagesToChatMessages, } from '@langchain/core/messages';
2
+ import { codecDepsOf, isPermanentPayloadLoss, loadPayloadValue, readPayloadBytes, } from '../../shared/codec/codec.js';
3
+ import { DEFAULT_READ_CONCURRENCY, mapWithConcurrency } from '../../shared/concurrency.js';
4
+ import { failureLabel, toError } from '../../shared/errors/base-error.js';
5
+ import { truncateForLog } from '../../shared/logging/truncate.js';
6
+ import { readWindow } from '../internal/message-read.js';
7
+ import { parseGetMessagesRequest } from '../internal/parse.js';
8
+ function corruptOrRethrow(error) {
9
+ if (isPermanentPayloadLoss(error))
10
+ return { kind: 'corrupt', error };
11
+ throw error;
12
+ }
13
+ async function decodeMessage(context, item, sessionId, signal) {
14
+ const deps = codecDepsOf(context, signal);
15
+ let bytes;
16
+ try {
17
+ bytes = await readPayloadBytes(item.message, deps, [sessionId]);
18
+ }
19
+ catch (error) {
20
+ return corruptOrRethrow(error);
21
+ }
22
+ let stored;
23
+ try {
24
+ stored = await loadPayloadValue(item.message.serdeType, bytes, deps);
25
+ }
26
+ catch (error) {
27
+ return corruptOrRethrow(error);
28
+ }
29
+ try {
30
+ return { kind: 'ok', message: mapStoredMessagesToChatMessages([stored])[0] };
31
+ }
32
+ catch (error) {
33
+ return { kind: 'corrupt', error: toError(error) };
34
+ }
35
+ }
36
+ export async function getMessages(context, sessionId, options = {}) {
37
+ const request = parseGetMessagesRequest(sessionId, options);
38
+ const items = await readWindow(context, request.sessionId, request.window, request.signal);
39
+ const decoded = await mapWithConcurrency(items, context.readConcurrency ?? DEFAULT_READ_CONCURRENCY, (item) => decodeMessage(context, item, request.sessionId, request.signal));
40
+ const messages = [];
41
+ decoded.forEach((result, index) => {
42
+ if (result.kind === 'ok') {
43
+ messages.push(result.message);
44
+ return;
45
+ }
46
+ if (context.onCorruptMessage === 'throw')
47
+ throw result.error;
48
+ context.logger.error('getMessages: skipped a corrupt message item', {
49
+ sessionId: request.sessionId,
50
+ sortKey: truncateForLog(items[index].SK),
51
+ reason: truncateForLog(failureLabel(result.error)),
52
+ });
53
+ });
54
+ return messages;
55
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Hides whether a listing reads the recency index or scans the table.
3
+ *
4
+ * With a configured `indexName` a listing is a cursor-paged, newest-first
5
+ * merge of the index shards; without one it is a filtered scan sorted in
6
+ * memory, with no cursor (record 8). A caller passes the same options and gets
7
+ * the same `SessionPage` either way: `limit` is the newest N on both paths,
8
+ * `0` reads neither, and the same rule summarises each session and drops the
9
+ * expired, foreign and malformed ones.
10
+ */
11
+ import type { HistoryContext } from '../internal/setup.js';
12
+ import type { ListSessionsOptions, SessionPage } from '../types.js';
13
+ /**
14
+ * List sessions as metadata summaries, most recently updated first.
15
+ *
16
+ * Accepts: `options.limit` — the package-wide page rule, an integer from 0 to
17
+ * the page ceiling; absent means one index page (100) with the index, and
18
+ * every session without it, since a scan has no cursor to fetch the rest with.
19
+ * `0` returns an empty page on either path without reading the table, which
20
+ * matters most on the scan path: a scan has to finish before the newest can be
21
+ * known, so answering `limit: 0` by scanning and then slicing to nothing would
22
+ * have paid for the whole table to return an empty page.
23
+ * `options.cursor` — from a previous page, and
24
+ * only with a configured `indexName`. `options.maxItems` and
25
+ * `maxIterations` — caps on the scan path; with the index the page size is the
26
+ * bound and they do nothing. Each must be a positive integer or `Infinity`
27
+ * (the paginator's own way to ask for no cap); absent keeps its default.
28
+ *
29
+ * Returns: the page, newest-updated first, and a `nextCursor` while rows may
30
+ * remain. A page can come back shorter than `limit` while more remain: expired
31
+ * and foreign rows are dropped after the read, and so is a row of this
32
+ * package's own whose `messageCount`, `createdAt`, `updatedAt`, `title` or
33
+ * `ttl` is not the type written there — otherwise one unreadable `ttl` would fail the
34
+ * whole call, taking every healthy session with it. The cursor is a position in
35
+ * the index rather than a count of what survived filtering. A cursor does not
36
+ * promise more rows: the page after it can come back empty (see
37
+ * `queryRecencyIndex`).
38
+ *
39
+ * Throws: `VALIDATION` naming `limit`, `cursor`, `maxItems`,
40
+ * `maxIterations`, `signal`, or `options.<key>` for a key this package does
41
+ * not read; `RESULT_TRUNCATED` past the scan path's caps, or for an
42
+ * index shard whose pages do not end within `MAX_LOOP_ITERATIONS`;
43
+ * `FORMAT_UNSUPPORTED` for a SESSION row a newer release wrote, on either
44
+ * path; `ABORTED`.
45
+ *
46
+ * Guarantees: with a configured `indexName` each index shard is read
47
+ * newest-first one DynamoDB page at a time, and its next page whenever it has
48
+ * no row buffered and the page still needs one, which can cost a query per
49
+ * shard per page whose rows the page never takes; at most `readConcurrency`
50
+ * shards are queried at once. Memory is the page being built, up to `limit`
51
+ * rows and so bounded by the page ceiling, plus at most one DynamoDB page per shard,
52
+ * whatever the table holds. Without one it is a filtered table scan that holds
53
+ * every session at once and returns no cursor.
54
+ */
55
+ export declare function listSessions(context: HistoryContext, options?: ListSessionsOptions): Promise<SessionPage>;
@@ -0,0 +1,64 @@
1
+ import { nowSeconds } from '../../shared/clock.js';
2
+ import { DEFAULT_READ_CONCURRENCY } from '../../shared/concurrency.js';
3
+ import { paginateScan } from '../../shared/dynamodb/paginate.js';
4
+ import { DEFAULT_INDEX_SHARDS, queryRecencyIndex } from '../../shared/dynamodb/recency-index.js';
5
+ import { retryFor } from '../../shared/dynamodb/retry.js';
6
+ import { PARTITION_KEY_ATTRIBUTE, SORT_KEY_ATTRIBUTE } from '../../shared/dynamodb/table-schema.js';
7
+ import { parseLimit } from '../../shared/validation/primitives.js';
8
+ import { parseListSessionsRequest } from '../internal/parse.js';
9
+ import { SESSION_SORT_KEY, historyPartitionPrefix } from '../internal/rows.js';
10
+ import { summariseSession } from '../internal/session.js';
11
+ const DEFAULT_PAGE_SIZE = parseLimit(100, 0);
12
+ async function pageFromIndex(context, indexName, request) {
13
+ const atSeconds = nowSeconds();
14
+ const page = await queryRecencyIndex({
15
+ client: context.client,
16
+ tableName: context.tableName,
17
+ indexName,
18
+ tag: 'SESS',
19
+ shards: context.indexShards ?? DEFAULT_INDEX_SHARDS,
20
+ concurrency: context.readConcurrency ?? DEFAULT_READ_CONCURRENCY,
21
+ limit: request.limit ?? DEFAULT_PAGE_SIZE,
22
+ cursor: request.cursor,
23
+ retry: retryFor(context, request.signal),
24
+ signal: request.signal,
25
+ });
26
+ const sessions = page.items
27
+ .map((raw) => summariseSession(raw, atSeconds))
28
+ .filter((session) => session !== undefined);
29
+ return { sessions, ...(page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor }) };
30
+ }
31
+ async function allByScan(context, request) {
32
+ const sessions = [];
33
+ const atSeconds = nowSeconds();
34
+ for await (const raw of paginateScan({
35
+ retry: retryFor(context, request.signal),
36
+ signal: request.signal,
37
+ client: context.client,
38
+ params: {
39
+ TableName: context.tableName,
40
+ FilterExpression: 'begins_with(#pk, :pkp) AND #sk = :session',
41
+ ExpressionAttributeNames: { '#pk': PARTITION_KEY_ATTRIBUTE, '#sk': SORT_KEY_ATTRIBUTE },
42
+ ExpressionAttributeValues: {
43
+ ':pkp': historyPartitionPrefix(),
44
+ ':session': SESSION_SORT_KEY,
45
+ },
46
+ },
47
+ maxIterations: request.maxIterations,
48
+ maxItems: request.maxItems,
49
+ })) {
50
+ const session = summariseSession(raw, atSeconds);
51
+ if (session)
52
+ sessions.push(session);
53
+ }
54
+ sessions.sort((a, b) => (a.updatedAt < b.updatedAt ? 1 : a.updatedAt > b.updatedAt ? -1 : 0));
55
+ return { sessions: request.limit === undefined ? sessions : sessions.slice(0, request.limit) };
56
+ }
57
+ export async function listSessions(context, options = {}) {
58
+ const request = parseListSessionsRequest(options, context.indexName);
59
+ if (request.limit === 0)
60
+ return { sessions: [] };
61
+ return context.indexName === undefined
62
+ ? allByScan(context, request)
63
+ : pageFromIndex(context, context.indexName, request);
64
+ }