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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/README.md +1820 -290
  2. package/dist/cjs/backfill/backfill.d.ts +171 -0
  3. package/dist/cjs/backfill/backfill.js +177 -0
  4. package/dist/cjs/checkpointer/actions/delete-thread.d.ts +50 -0
  5. package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
  6. package/dist/cjs/checkpointer/actions/get-tuple.d.ts +36 -0
  7. package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
  8. package/dist/cjs/checkpointer/actions/list.d.ts +55 -0
  9. package/dist/cjs/checkpointer/actions/list.js +70 -0
  10. package/dist/cjs/checkpointer/actions/put-writes.d.ts +49 -0
  11. package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
  12. package/dist/cjs/checkpointer/actions/put.d.ts +95 -0
  13. package/dist/cjs/checkpointer/actions/put.js +79 -0
  14. package/dist/cjs/checkpointer/internal/delta-history.d.ts +124 -0
  15. package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
  16. package/dist/cjs/checkpointer/internal/listing.d.ts +149 -0
  17. package/dist/cjs/checkpointer/internal/listing.js +104 -0
  18. package/dist/cjs/checkpointer/internal/parse.d.ts +298 -0
  19. package/dist/cjs/checkpointer/internal/parse.js +184 -0
  20. package/dist/cjs/checkpointer/internal/pending-writes.d.ts +314 -0
  21. package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
  22. package/dist/cjs/checkpointer/internal/read.d.ts +135 -0
  23. package/dist/cjs/checkpointer/internal/read.js +132 -0
  24. package/dist/cjs/checkpointer/internal/rows.d.ts +644 -0
  25. package/dist/cjs/checkpointer/internal/rows.js +356 -0
  26. package/dist/cjs/checkpointer/internal/setup.d.ts +47 -0
  27. package/dist/cjs/checkpointer/internal/setup.js +25 -0
  28. package/dist/cjs/checkpointer/saver.d.ts +306 -0
  29. package/dist/cjs/checkpointer/saver.js +56 -0
  30. package/dist/cjs/checkpointer/types.d.ts +51 -0
  31. package/dist/cjs/factory/factory.d.ts +154 -0
  32. package/dist/cjs/factory/factory.js +137 -0
  33. package/dist/{factory → cjs/factory}/types.d.ts +33 -14
  34. package/dist/cjs/history/actions/add-messages.d.ts +51 -0
  35. package/dist/cjs/history/actions/add-messages.js +17 -0
  36. package/dist/cjs/history/actions/clear.d.ts +52 -0
  37. package/dist/cjs/history/actions/clear.js +29 -0
  38. package/dist/cjs/history/actions/get-messages.d.ts +60 -0
  39. package/dist/cjs/history/actions/get-messages.js +58 -0
  40. package/dist/cjs/history/actions/list-sessions.d.ts +55 -0
  41. package/dist/cjs/history/actions/list-sessions.js +67 -0
  42. package/dist/cjs/history/actions/reconcile-count.d.ts +49 -0
  43. package/dist/cjs/history/actions/reconcile-count.js +8 -0
  44. package/dist/cjs/history/chat-message-history.d.ts +267 -0
  45. package/dist/cjs/history/chat-message-history.js +61 -0
  46. package/dist/cjs/history/internal/append.d.ts +244 -0
  47. package/dist/cjs/history/internal/append.js +267 -0
  48. package/dist/cjs/history/internal/message-read.d.ts +84 -0
  49. package/dist/cjs/history/internal/message-read.js +93 -0
  50. package/dist/cjs/history/internal/parse.d.ts +153 -0
  51. package/dist/cjs/history/internal/parse.js +113 -0
  52. package/dist/cjs/history/internal/rows.d.ts +196 -0
  53. package/dist/cjs/history/internal/rows.js +96 -0
  54. package/dist/cjs/history/internal/session.d.ts +350 -0
  55. package/dist/cjs/history/internal/session.js +296 -0
  56. package/dist/cjs/history/internal/setup.d.ts +64 -0
  57. package/dist/cjs/history/internal/setup.js +60 -0
  58. package/dist/cjs/history/session-adapter.d.ts +112 -0
  59. package/dist/cjs/history/session-adapter.js +38 -0
  60. package/dist/cjs/history/types.d.ts +102 -0
  61. package/dist/cjs/index.d.ts +53 -0
  62. package/dist/cjs/index.js +25 -0
  63. package/dist/cjs/package.json +1 -0
  64. package/dist/cjs/shared/adapter.d.ts +146 -0
  65. package/dist/cjs/shared/adapter.js +70 -0
  66. package/dist/cjs/shared/clock.d.ts +52 -0
  67. package/dist/cjs/shared/clock.js +14 -0
  68. package/dist/cjs/shared/codec/codec.d.ts +336 -0
  69. package/dist/cjs/shared/codec/codec.js +162 -0
  70. package/dist/cjs/shared/codec/compression.d.ts +66 -0
  71. package/dist/cjs/shared/codec/compression.js +45 -0
  72. package/dist/cjs/shared/codec/json-serde.d.ts +80 -0
  73. package/dist/cjs/shared/codec/json-serde.js +58 -0
  74. package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +22 -2
  75. package/dist/{shared → cjs/shared}/codec/s3/client-types.js +0 -1
  76. package/dist/cjs/shared/codec/s3/client.d.ts +63 -0
  77. package/dist/cjs/shared/codec/s3/client.js +78 -0
  78. package/dist/cjs/shared/codec/s3/config.d.ts +260 -0
  79. package/dist/cjs/shared/codec/s3/config.js +92 -0
  80. package/dist/cjs/shared/codec/s3/lifecycle.d.ts +220 -0
  81. package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
  82. package/dist/cjs/shared/codec/s3/offloader.d.ts +428 -0
  83. package/dist/cjs/shared/codec/s3/offloader.js +289 -0
  84. package/dist/cjs/shared/concurrency.d.ts +43 -0
  85. package/dist/{shared → cjs/shared}/concurrency.js +10 -9
  86. package/dist/cjs/shared/dynamodb/abort.d.ts +47 -0
  87. package/dist/cjs/shared/dynamodb/abort.js +16 -0
  88. package/dist/cjs/shared/dynamodb/batch-write.d.ts +86 -0
  89. package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
  90. package/dist/cjs/shared/dynamodb/cancellation.d.ts +124 -0
  91. package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
  92. package/dist/cjs/shared/dynamodb/client.d.ts +177 -0
  93. package/dist/{shared → cjs/shared}/dynamodb/client.js +12 -14
  94. package/dist/cjs/shared/dynamodb/idempotent-write.d.ts +596 -0
  95. package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
  96. package/dist/cjs/shared/dynamodb/paginate.d.ts +111 -0
  97. package/dist/cjs/shared/dynamodb/paginate.js +90 -0
  98. package/dist/cjs/shared/dynamodb/partition-delete.d.ts +204 -0
  99. package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
  100. package/dist/cjs/shared/dynamodb/recency-index.d.ts +243 -0
  101. package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
  102. package/dist/cjs/shared/dynamodb/retry.d.ts +317 -0
  103. package/dist/cjs/shared/dynamodb/retry.js +193 -0
  104. package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
  105. package/dist/cjs/shared/dynamodb/row-size.js +30 -0
  106. package/dist/cjs/shared/dynamodb/table-schema.d.ts +199 -0
  107. package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
  108. package/dist/cjs/shared/errors/base-error.d.ts +231 -0
  109. package/dist/cjs/shared/errors/base-error.js +73 -0
  110. package/dist/cjs/shared/errors/boundary.d.ts +86 -0
  111. package/dist/cjs/shared/errors/boundary.js +61 -0
  112. package/dist/cjs/shared/errors/classify.d.ts +206 -0
  113. package/dist/cjs/shared/errors/classify.js +232 -0
  114. package/dist/cjs/shared/errors/error-code.d.ts +95 -0
  115. package/dist/{shared → cjs/shared}/errors/error-code.js +12 -2
  116. package/dist/cjs/shared/errors/errors.d.ts +233 -0
  117. package/dist/cjs/shared/errors/errors.js +123 -0
  118. package/dist/cjs/shared/logging/logger.d.ts +80 -0
  119. package/dist/cjs/shared/logging/logger.js +30 -0
  120. package/dist/cjs/shared/logging/redaction.d.ts +123 -0
  121. package/dist/cjs/shared/logging/redaction.js +145 -0
  122. package/dist/cjs/shared/logging/secret-patterns.d.ts +227 -0
  123. package/dist/cjs/shared/logging/secret-patterns.js +93 -0
  124. package/dist/cjs/shared/logging/truncate.d.ts +197 -0
  125. package/dist/cjs/shared/logging/truncate.js +31 -0
  126. package/dist/cjs/shared/options.d.ts +100 -0
  127. package/dist/cjs/shared/ulid.d.ts +80 -0
  128. package/dist/{shared → cjs/shared}/ulid.js +7 -21
  129. package/dist/cjs/shared/validation/collaborators.d.ts +160 -0
  130. package/dist/cjs/shared/validation/collaborators.js +79 -0
  131. package/dist/cjs/shared/validation/option-shape.d.ts +91 -0
  132. package/dist/cjs/shared/validation/option-shape.js +31 -0
  133. package/dist/cjs/shared/validation/options.d.ts +145 -0
  134. package/dist/cjs/shared/validation/options.js +166 -0
  135. package/dist/cjs/shared/validation/primitives.d.ts +292 -0
  136. package/dist/cjs/shared/validation/primitives.js +114 -0
  137. package/dist/cjs/shared/validation/ttl.d.ts +94 -0
  138. package/dist/cjs/shared/validation/ttl.js +52 -0
  139. package/dist/cjs/store/actions/list-namespaces.d.ts +79 -0
  140. package/dist/cjs/store/actions/list-namespaces.js +92 -0
  141. package/dist/cjs/store/actions/put.d.ts +43 -0
  142. package/dist/cjs/store/actions/put.js +49 -0
  143. package/dist/cjs/store/actions/reconcile-vector-index.d.ts +38 -0
  144. package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
  145. package/dist/cjs/store/actions/search.d.ts +38 -0
  146. package/dist/cjs/store/actions/search.js +26 -0
  147. package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
  148. package/dist/cjs/store/internal/batch-plan.js +32 -0
  149. package/dist/cjs/store/internal/filter.d.ts +43 -0
  150. package/dist/cjs/store/internal/filter.js +64 -0
  151. package/dist/cjs/store/internal/get-item.d.ts +77 -0
  152. package/dist/cjs/store/internal/get-item.js +58 -0
  153. package/dist/cjs/store/internal/item-write.d.ts +270 -0
  154. package/dist/cjs/store/internal/item-write.js +181 -0
  155. package/dist/cjs/store/internal/parse.d.ts +230 -0
  156. package/dist/cjs/store/internal/parse.js +180 -0
  157. package/dist/cjs/store/internal/rows.d.ts +359 -0
  158. package/dist/cjs/store/internal/rows.js +166 -0
  159. package/dist/cjs/store/internal/semantic-search.d.ts +168 -0
  160. package/dist/{store/internal/text-path.js → cjs/store/internal/semantic-search.js} +92 -28
  161. package/dist/cjs/store/internal/setup.d.ts +96 -0
  162. package/dist/cjs/store/internal/setup.js +103 -0
  163. package/dist/cjs/store/internal/table-search.d.ts +100 -0
  164. package/dist/cjs/store/internal/table-search.js +123 -0
  165. package/dist/cjs/store/internal/vector-index.d.ts +258 -0
  166. package/dist/cjs/store/internal/vector-index.js +269 -0
  167. package/dist/cjs/store/store.d.ts +329 -0
  168. package/dist/cjs/store/store.js +97 -0
  169. package/dist/cjs/store/types.d.ts +111 -0
  170. package/dist/cjs/store/vector-backend.d.ts +104 -0
  171. package/dist/cjs/store/vector-backend.js +4 -0
  172. package/dist/esm/backfill/backfill.d.ts +171 -0
  173. package/dist/esm/backfill/backfill.js +170 -0
  174. package/dist/esm/checkpointer/actions/delete-thread.d.ts +50 -0
  175. package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
  176. package/dist/esm/checkpointer/actions/get-tuple.d.ts +36 -0
  177. package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
  178. package/dist/esm/checkpointer/actions/list.d.ts +55 -0
  179. package/dist/esm/checkpointer/actions/list.js +67 -0
  180. package/dist/esm/checkpointer/actions/put-writes.d.ts +49 -0
  181. package/dist/esm/checkpointer/actions/put-writes.js +18 -0
  182. package/dist/esm/checkpointer/actions/put.d.ts +95 -0
  183. package/dist/esm/checkpointer/actions/put.js +75 -0
  184. package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
  185. package/dist/esm/checkpointer/internal/delta-history.js +126 -0
  186. package/dist/esm/checkpointer/internal/listing.d.ts +149 -0
  187. package/dist/esm/checkpointer/internal/listing.js +95 -0
  188. package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
  189. package/dist/esm/checkpointer/internal/parse.js +169 -0
  190. package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
  191. package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
  192. package/dist/esm/checkpointer/internal/read.d.ts +135 -0
  193. package/dist/esm/checkpointer/internal/read.js +125 -0
  194. package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
  195. package/dist/esm/checkpointer/internal/rows.js +323 -0
  196. package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
  197. package/dist/esm/checkpointer/internal/setup.js +21 -0
  198. package/dist/esm/checkpointer/saver.d.ts +306 -0
  199. package/dist/esm/checkpointer/saver.js +52 -0
  200. package/dist/esm/checkpointer/types.d.ts +51 -0
  201. package/dist/esm/checkpointer/types.js +1 -0
  202. package/dist/esm/factory/factory.d.ts +154 -0
  203. package/dist/esm/factory/factory.js +133 -0
  204. package/dist/esm/factory/types.d.ts +76 -0
  205. package/dist/esm/factory/types.js +1 -0
  206. package/dist/esm/history/actions/add-messages.d.ts +51 -0
  207. package/dist/esm/history/actions/add-messages.js +14 -0
  208. package/dist/esm/history/actions/clear.d.ts +52 -0
  209. package/dist/esm/history/actions/clear.js +26 -0
  210. package/dist/esm/history/actions/get-messages.d.ts +60 -0
  211. package/dist/esm/history/actions/get-messages.js +55 -0
  212. package/dist/esm/history/actions/list-sessions.d.ts +55 -0
  213. package/dist/esm/history/actions/list-sessions.js +64 -0
  214. package/dist/esm/history/actions/reconcile-count.d.ts +49 -0
  215. package/dist/esm/history/actions/reconcile-count.js +5 -0
  216. package/dist/esm/history/chat-message-history.d.ts +267 -0
  217. package/dist/esm/history/chat-message-history.js +57 -0
  218. package/dist/esm/history/internal/append.d.ts +244 -0
  219. package/dist/esm/history/internal/append.js +259 -0
  220. package/dist/esm/history/internal/message-read.d.ts +84 -0
  221. package/dist/esm/history/internal/message-read.js +89 -0
  222. package/dist/esm/history/internal/parse.d.ts +153 -0
  223. package/dist/esm/history/internal/parse.js +105 -0
  224. package/dist/esm/history/internal/rows.d.ts +196 -0
  225. package/dist/esm/history/internal/rows.js +83 -0
  226. package/dist/esm/history/internal/session.d.ts +350 -0
  227. package/dist/esm/history/internal/session.js +285 -0
  228. package/dist/esm/history/internal/setup.d.ts +64 -0
  229. package/dist/esm/history/internal/setup.js +56 -0
  230. package/dist/esm/history/session-adapter.d.ts +112 -0
  231. package/dist/esm/history/session-adapter.js +34 -0
  232. package/dist/esm/history/types.d.ts +102 -0
  233. package/dist/esm/history/types.js +1 -0
  234. package/dist/esm/index.d.ts +53 -0
  235. package/dist/esm/index.js +10 -0
  236. package/dist/esm/shared/adapter.d.ts +146 -0
  237. package/dist/esm/shared/adapter.js +65 -0
  238. package/dist/esm/shared/clock.d.ts +52 -0
  239. package/dist/esm/shared/clock.js +9 -0
  240. package/dist/esm/shared/codec/codec.d.ts +336 -0
  241. package/dist/esm/shared/codec/codec.js +150 -0
  242. package/dist/esm/shared/codec/compression.d.ts +66 -0
  243. package/dist/esm/shared/codec/compression.js +40 -0
  244. package/dist/esm/shared/codec/json-serde.d.ts +80 -0
  245. package/dist/esm/shared/codec/json-serde.js +54 -0
  246. package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
  247. package/dist/esm/shared/codec/s3/client-types.js +3 -0
  248. package/dist/esm/shared/codec/s3/client.d.ts +63 -0
  249. package/dist/esm/shared/codec/s3/client.js +40 -0
  250. package/dist/esm/shared/codec/s3/config.d.ts +260 -0
  251. package/dist/esm/shared/codec/s3/config.js +79 -0
  252. package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
  253. package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
  254. package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
  255. package/dist/esm/shared/codec/s3/offloader.js +278 -0
  256. package/dist/esm/shared/concurrency.d.ts +43 -0
  257. package/dist/esm/shared/concurrency.js +27 -0
  258. package/dist/esm/shared/dynamodb/abort.d.ts +47 -0
  259. package/dist/esm/shared/dynamodb/abort.js +12 -0
  260. package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
  261. package/dist/esm/shared/dynamodb/batch-write.js +74 -0
  262. package/dist/esm/shared/dynamodb/cancellation.d.ts +124 -0
  263. package/dist/esm/shared/dynamodb/cancellation.js +30 -0
  264. package/dist/esm/shared/dynamodb/client.d.ts +177 -0
  265. package/dist/esm/shared/dynamodb/client.js +35 -0
  266. package/dist/esm/shared/dynamodb/idempotent-write.d.ts +596 -0
  267. package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
  268. package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
  269. package/dist/esm/shared/dynamodb/paginate.js +84 -0
  270. package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
  271. package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
  272. package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
  273. package/dist/esm/shared/dynamodb/recency-index.js +136 -0
  274. package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
  275. package/dist/esm/shared/dynamodb/retry.js +180 -0
  276. package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
  277. package/dist/esm/shared/dynamodb/row-size.js +26 -0
  278. package/dist/esm/shared/dynamodb/table-schema.d.ts +199 -0
  279. package/dist/esm/shared/dynamodb/table-schema.js +43 -0
  280. package/dist/esm/shared/errors/base-error.d.ts +231 -0
  281. package/dist/esm/shared/errors/base-error.js +64 -0
  282. package/dist/esm/shared/errors/boundary.d.ts +86 -0
  283. package/dist/esm/shared/errors/boundary.js +54 -0
  284. package/dist/esm/shared/errors/classify.d.ts +206 -0
  285. package/dist/esm/shared/errors/classify.js +220 -0
  286. package/dist/esm/shared/errors/error-code.d.ts +95 -0
  287. package/dist/esm/shared/errors/error-code.js +24 -0
  288. package/dist/esm/shared/errors/errors.d.ts +233 -0
  289. package/dist/esm/shared/errors/errors.js +110 -0
  290. package/dist/esm/shared/logging/logger.d.ts +80 -0
  291. package/dist/esm/shared/logging/logger.js +25 -0
  292. package/dist/esm/shared/logging/redaction.d.ts +123 -0
  293. package/dist/esm/shared/logging/redaction.js +140 -0
  294. package/dist/esm/shared/logging/secret-patterns.d.ts +227 -0
  295. package/dist/esm/shared/logging/secret-patterns.js +83 -0
  296. package/dist/esm/shared/logging/truncate.d.ts +197 -0
  297. package/dist/esm/shared/logging/truncate.js +25 -0
  298. package/dist/esm/shared/options.d.ts +100 -0
  299. package/dist/esm/shared/options.js +1 -0
  300. package/dist/esm/shared/ulid.d.ts +80 -0
  301. package/dist/esm/shared/ulid.js +77 -0
  302. package/dist/esm/shared/validation/collaborators.d.ts +160 -0
  303. package/dist/esm/shared/validation/collaborators.js +70 -0
  304. package/dist/esm/shared/validation/option-shape.d.ts +91 -0
  305. package/dist/esm/shared/validation/option-shape.js +24 -0
  306. package/dist/esm/shared/validation/options.d.ts +145 -0
  307. package/dist/esm/shared/validation/options.js +156 -0
  308. package/dist/esm/shared/validation/primitives.d.ts +292 -0
  309. package/dist/esm/shared/validation/primitives.js +100 -0
  310. package/dist/esm/shared/validation/ttl.d.ts +94 -0
  311. package/dist/esm/shared/validation/ttl.js +46 -0
  312. package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
  313. package/dist/esm/store/actions/list-namespaces.js +86 -0
  314. package/dist/esm/store/actions/put.d.ts +43 -0
  315. package/dist/esm/store/actions/put.js +46 -0
  316. package/dist/esm/store/actions/reconcile-vector-index.d.ts +38 -0
  317. package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
  318. package/dist/esm/store/actions/search.d.ts +38 -0
  319. package/dist/esm/store/actions/search.js +23 -0
  320. package/dist/esm/store/internal/batch-plan.d.ts +56 -0
  321. package/dist/esm/store/internal/batch-plan.js +28 -0
  322. package/dist/esm/store/internal/filter.d.ts +43 -0
  323. package/dist/esm/store/internal/filter.js +60 -0
  324. package/dist/esm/store/internal/get-item.d.ts +77 -0
  325. package/dist/esm/store/internal/get-item.js +54 -0
  326. package/dist/esm/store/internal/item-write.d.ts +270 -0
  327. package/dist/esm/store/internal/item-write.js +173 -0
  328. package/dist/esm/store/internal/parse.d.ts +230 -0
  329. package/dist/esm/store/internal/parse.js +169 -0
  330. package/dist/esm/store/internal/rows.d.ts +359 -0
  331. package/dist/esm/store/internal/rows.js +147 -0
  332. package/dist/esm/store/internal/semantic-search.d.ts +168 -0
  333. package/dist/esm/store/internal/semantic-search.js +200 -0
  334. package/dist/esm/store/internal/setup.d.ts +96 -0
  335. package/dist/esm/store/internal/setup.js +98 -0
  336. package/dist/esm/store/internal/table-search.d.ts +100 -0
  337. package/dist/esm/store/internal/table-search.js +119 -0
  338. package/dist/esm/store/internal/vector-index.d.ts +258 -0
  339. package/dist/esm/store/internal/vector-index.js +256 -0
  340. package/dist/esm/store/store.d.ts +329 -0
  341. package/dist/esm/store/store.js +93 -0
  342. package/dist/esm/store/types.d.ts +111 -0
  343. package/dist/esm/store/types.js +1 -0
  344. package/dist/esm/store/vector-backend.d.ts +104 -0
  345. package/dist/esm/store/vector-backend.js +1 -0
  346. package/package.json +68 -46
  347. package/dist/checkpointer/actions/delete-thread.d.ts +0 -10
  348. package/dist/checkpointer/actions/delete-thread.js +0 -38
  349. package/dist/checkpointer/actions/get-tuple.d.ts +0 -11
  350. package/dist/checkpointer/actions/get-tuple.js +0 -25
  351. package/dist/checkpointer/actions/list.d.ts +0 -20
  352. package/dist/checkpointer/actions/list.js +0 -113
  353. package/dist/checkpointer/actions/put-writes.d.ts +0 -15
  354. package/dist/checkpointer/actions/put-writes.js +0 -62
  355. package/dist/checkpointer/actions/put.d.ts +0 -17
  356. package/dist/checkpointer/actions/put.js +0 -73
  357. package/dist/checkpointer/internal/assemble.d.ts +0 -17
  358. package/dist/checkpointer/internal/assemble.js +0 -38
  359. package/dist/checkpointer/internal/checkpoint-write-verify.d.ts +0 -24
  360. package/dist/checkpointer/internal/checkpoint-write-verify.js +0 -67
  361. package/dist/checkpointer/internal/configurable.d.ts +0 -12
  362. package/dist/checkpointer/internal/configurable.js +0 -24
  363. package/dist/checkpointer/internal/fetch.d.ts +0 -19
  364. package/dist/checkpointer/internal/fetch.js +0 -88
  365. package/dist/checkpointer/internal/filter-match.d.ts +0 -13
  366. package/dist/checkpointer/internal/filter-match.js +0 -15
  367. package/dist/checkpointer/internal/item-reader.d.ts +0 -66
  368. package/dist/checkpointer/internal/item-reader.js +0 -113
  369. package/dist/checkpointer/internal/item-writer.d.ts +0 -35
  370. package/dist/checkpointer/internal/item-writer.js +0 -107
  371. package/dist/checkpointer/internal/keys.d.ts +0 -41
  372. package/dist/checkpointer/internal/keys.js +0 -117
  373. package/dist/checkpointer/internal/list-scope.d.ts +0 -61
  374. package/dist/checkpointer/internal/list-scope.js +0 -108
  375. package/dist/checkpointer/internal/pending-sends.d.ts +0 -13
  376. package/dist/checkpointer/internal/pending-sends.js +0 -29
  377. package/dist/checkpointer/internal/query.d.ts +0 -21
  378. package/dist/checkpointer/internal/query.js +0 -42
  379. package/dist/checkpointer/internal/regular-write.d.ts +0 -28
  380. package/dist/checkpointer/internal/regular-write.js +0 -66
  381. package/dist/checkpointer/internal/setup.d.ts +0 -33
  382. package/dist/checkpointer/internal/setup.js +0 -38
  383. package/dist/checkpointer/internal/special-write-cas.d.ts +0 -29
  384. package/dist/checkpointer/internal/special-write-cas.js +0 -104
  385. package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -23
  386. package/dist/checkpointer/internal/special-write-cleanup.js +0 -50
  387. package/dist/checkpointer/internal/special-write-verify.d.ts +0 -53
  388. package/dist/checkpointer/internal/special-write-verify.js +0 -80
  389. package/dist/checkpointer/internal/stored-channels.d.ts +0 -31
  390. package/dist/checkpointer/internal/stored-channels.js +0 -70
  391. package/dist/checkpointer/internal/validation.d.ts +0 -18
  392. package/dist/checkpointer/internal/validation.js +0 -40
  393. package/dist/checkpointer/internal/write-guard.d.ts +0 -20
  394. package/dist/checkpointer/internal/write-guard.js +0 -48
  395. package/dist/checkpointer/internal/write-index.d.ts +0 -36
  396. package/dist/checkpointer/internal/write-index.js +0 -41
  397. package/dist/checkpointer/saver.d.ts +0 -70
  398. package/dist/checkpointer/saver.js +0 -105
  399. package/dist/checkpointer/types.d.ts +0 -58
  400. package/dist/factory/factory.d.ts +0 -40
  401. package/dist/factory/factory.js +0 -87
  402. package/dist/history/actions/add-messages.d.ts +0 -15
  403. package/dist/history/actions/add-messages.js +0 -77
  404. package/dist/history/actions/clear.d.ts +0 -10
  405. package/dist/history/actions/clear.js +0 -34
  406. package/dist/history/actions/get-messages.d.ts +0 -17
  407. package/dist/history/actions/get-messages.js +0 -79
  408. package/dist/history/actions/list-sessions.d.ts +0 -13
  409. package/dist/history/actions/list-sessions.js +0 -53
  410. package/dist/history/actions/reconcile-count.d.ts +0 -12
  411. package/dist/history/actions/reconcile-count.js +0 -64
  412. package/dist/history/chat-message-history.d.ts +0 -73
  413. package/dist/history/chat-message-history.js +0 -111
  414. package/dist/history/internal/append-saga.d.ts +0 -25
  415. package/dist/history/internal/append-saga.js +0 -79
  416. package/dist/history/internal/compensation.d.ts +0 -25
  417. package/dist/history/internal/compensation.js +0 -92
  418. package/dist/history/internal/item-mapper.d.ts +0 -9
  419. package/dist/history/internal/item-mapper.js +0 -27
  420. package/dist/history/internal/keys.d.ts +0 -16
  421. package/dist/history/internal/keys.js +0 -48
  422. package/dist/history/internal/message-chunker.d.ts +0 -13
  423. package/dist/history/internal/message-chunker.js +0 -67
  424. package/dist/history/internal/message-transaction.d.ts +0 -25
  425. package/dist/history/internal/message-transaction.js +0 -61
  426. package/dist/history/internal/message-window.d.ts +0 -17
  427. package/dist/history/internal/message-window.js +0 -49
  428. package/dist/history/internal/query.d.ts +0 -23
  429. package/dist/history/internal/query.js +0 -39
  430. package/dist/history/internal/session-count.d.ts +0 -47
  431. package/dist/history/internal/session-count.js +0 -115
  432. package/dist/history/internal/session-title.d.ts +0 -19
  433. package/dist/history/internal/session-title.js +0 -43
  434. package/dist/history/internal/session-update.d.ts +0 -27
  435. package/dist/history/internal/session-update.js +0 -69
  436. package/dist/history/internal/setup.d.ts +0 -31
  437. package/dist/history/internal/setup.js +0 -43
  438. package/dist/history/internal/title-generator.d.ts +0 -12
  439. package/dist/history/internal/title-generator.js +0 -41
  440. package/dist/history/internal/ttl-anchor.d.ts +0 -24
  441. package/dist/history/internal/ttl-anchor.js +0 -38
  442. package/dist/history/internal/validation.d.ts +0 -25
  443. package/dist/history/internal/validation.js +0 -53
  444. package/dist/history/session-adapter.d.ts +0 -29
  445. package/dist/history/session-adapter.js +0 -35
  446. package/dist/history/types.d.ts +0 -69
  447. package/dist/index.d.ts +0 -29
  448. package/dist/index.js +0 -32
  449. package/dist/shared/clock.d.ts +0 -8
  450. package/dist/shared/clock.js +0 -16
  451. package/dist/shared/codec/codec.d.ts +0 -53
  452. package/dist/shared/codec/codec.js +0 -66
  453. package/dist/shared/codec/compression.d.ts +0 -24
  454. package/dist/shared/codec/compression.js +0 -48
  455. package/dist/shared/codec/descriptor-keys.d.ts +0 -12
  456. package/dist/shared/codec/descriptor-keys.js +0 -14
  457. package/dist/shared/codec/encode.d.ts +0 -13
  458. package/dist/shared/codec/encode.js +0 -43
  459. package/dist/shared/codec/json-serde.d.ts +0 -7
  460. package/dist/shared/codec/json-serde.js +0 -17
  461. package/dist/shared/codec/payload-loss.d.ts +0 -12
  462. package/dist/shared/codec/payload-loss.js +0 -38
  463. package/dist/shared/codec/s3/adapter-config.d.ts +0 -13
  464. package/dist/shared/codec/s3/adapter-config.js +0 -22
  465. package/dist/shared/codec/s3/bounded-body.d.ts +0 -14
  466. package/dist/shared/codec/s3/bounded-body.js +0 -47
  467. package/dist/shared/codec/s3/client.d.ts +0 -18
  468. package/dist/shared/codec/s3/client.js +0 -46
  469. package/dist/shared/codec/s3/config.d.ts +0 -51
  470. package/dist/shared/codec/s3/config.js +0 -58
  471. package/dist/shared/codec/s3/delete.d.ts +0 -7
  472. package/dist/shared/codec/s3/delete.js +0 -28
  473. package/dist/shared/codec/s3/key-scope.d.ts +0 -23
  474. package/dist/shared/codec/s3/key-scope.js +0 -44
  475. package/dist/shared/codec/s3/lifecycle.d.ts +0 -14
  476. package/dist/shared/codec/s3/lifecycle.js +0 -63
  477. package/dist/shared/codec/s3/offloader.d.ts +0 -44
  478. package/dist/shared/codec/s3/offloader.js +0 -118
  479. package/dist/shared/codec/s3/orphans.d.ts +0 -23
  480. package/dist/shared/codec/s3/orphans.js +0 -71
  481. package/dist/shared/codec/s3/read-write.d.ts +0 -18
  482. package/dist/shared/codec/s3/read-write.js +0 -51
  483. package/dist/shared/codec/s3/retry.d.ts +0 -5
  484. package/dist/shared/codec/s3/retry.js +0 -22
  485. package/dist/shared/concurrency.d.ts +0 -6
  486. package/dist/shared/constants.d.ts +0 -112
  487. package/dist/shared/constants.js +0 -115
  488. package/dist/shared/dynamodb/abort.d.ts +0 -9
  489. package/dist/shared/dynamodb/abort.js +0 -27
  490. package/dist/shared/dynamodb/backoff.d.ts +0 -15
  491. package/dist/shared/dynamodb/backoff.js +0 -48
  492. package/dist/shared/dynamodb/batch-write.d.ts +0 -22
  493. package/dist/shared/dynamodb/batch-write.js +0 -53
  494. package/dist/shared/dynamodb/cancellation.d.ts +0 -6
  495. package/dist/shared/dynamodb/cancellation.js +0 -7
  496. package/dist/shared/dynamodb/client.d.ts +0 -28
  497. package/dist/shared/dynamodb/conditional-put.d.ts +0 -67
  498. package/dist/shared/dynamodb/conditional-put.js +0 -76
  499. package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -21
  500. package/dist/shared/dynamodb/drain-unprocessed.js +0 -43
  501. package/dist/shared/dynamodb/expiry.d.ts +0 -16
  502. package/dist/shared/dynamodb/expiry.js +0 -29
  503. package/dist/shared/dynamodb/paginate-core.d.ts +0 -24
  504. package/dist/shared/dynamodb/paginate-core.js +0 -82
  505. package/dist/shared/dynamodb/paginate.d.ts +0 -14
  506. package/dist/shared/dynamodb/paginate.js +0 -19
  507. package/dist/shared/dynamodb/partition-delete.d.ts +0 -39
  508. package/dist/shared/dynamodb/partition-delete.js +0 -71
  509. package/dist/shared/dynamodb/retry-classifier.d.ts +0 -17
  510. package/dist/shared/dynamodb/retry-classifier.js +0 -118
  511. package/dist/shared/dynamodb/retry-policy.d.ts +0 -26
  512. package/dist/shared/dynamodb/retry-policy.js +0 -22
  513. package/dist/shared/dynamodb/retry.d.ts +0 -31
  514. package/dist/shared/dynamodb/retry.js +0 -57
  515. package/dist/shared/dynamodb/scan.d.ts +0 -14
  516. package/dist/shared/dynamodb/scan.js +0 -19
  517. package/dist/shared/dynamodb/types.d.ts +0 -23
  518. package/dist/shared/errors/base-error.d.ts +0 -30
  519. package/dist/shared/errors/base-error.js +0 -27
  520. package/dist/shared/errors/boundary.d.ts +0 -18
  521. package/dist/shared/errors/boundary.js +0 -46
  522. package/dist/shared/errors/error-code.d.ts +0 -13
  523. package/dist/shared/errors/errors.d.ts +0 -68
  524. package/dist/shared/errors/errors.js +0 -114
  525. package/dist/shared/errors/upstream-error.d.ts +0 -16
  526. package/dist/shared/errors/upstream-error.js +0 -27
  527. package/dist/shared/errors/wrap-error.d.ts +0 -7
  528. package/dist/shared/errors/wrap-error.js +0 -15
  529. package/dist/shared/logging/logger.d.ts +0 -18
  530. package/dist/shared/logging/logger.js +0 -15
  531. package/dist/shared/logging/redaction-walk.d.ts +0 -23
  532. package/dist/shared/logging/redaction-walk.js +0 -112
  533. package/dist/shared/logging/redaction.d.ts +0 -39
  534. package/dist/shared/logging/redaction.js +0 -75
  535. package/dist/shared/logging/secret-patterns.d.ts +0 -92
  536. package/dist/shared/logging/secret-patterns.js +0 -133
  537. package/dist/shared/options.d.ts +0 -37
  538. package/dist/shared/ulid.d.ts +0 -23
  539. package/dist/shared/validation/options.d.ts +0 -8
  540. package/dist/shared/validation/options.js +0 -90
  541. package/dist/shared/validation/primitives.d.ts +0 -29
  542. package/dist/shared/validation/primitives.js +0 -82
  543. package/dist/shared/validation/ttl.d.ts +0 -28
  544. package/dist/shared/validation/ttl.js +0 -52
  545. package/dist/store/actions/get.d.ts +0 -13
  546. package/dist/store/actions/get.js +0 -73
  547. package/dist/store/actions/list-namespaces.d.ts +0 -8
  548. package/dist/store/actions/list-namespaces.js +0 -59
  549. package/dist/store/actions/put.d.ts +0 -10
  550. package/dist/store/actions/put.js +0 -96
  551. package/dist/store/actions/reconcile-vector-index.d.ts +0 -18
  552. package/dist/store/actions/reconcile-vector-index.js +0 -26
  553. package/dist/store/actions/search.d.ts +0 -9
  554. package/dist/store/actions/search.js +0 -34
  555. package/dist/store/internal/backend-search.d.ts +0 -4
  556. package/dist/store/internal/backend-search.js +0 -74
  557. package/dist/store/internal/batch-plan.d.ts +0 -11
  558. package/dist/store/internal/batch-plan.js +0 -52
  559. package/dist/store/internal/candidates.d.ts +0 -23
  560. package/dist/store/internal/candidates.js +0 -94
  561. package/dist/store/internal/filter.d.ts +0 -9
  562. package/dist/store/internal/filter.js +0 -85
  563. package/dist/store/internal/index-reconcile.d.ts +0 -21
  564. package/dist/store/internal/index-reconcile.js +0 -118
  565. package/dist/store/internal/index-sync.d.ts +0 -10
  566. package/dist/store/internal/index-sync.js +0 -25
  567. package/dist/store/internal/item-mapper.d.ts +0 -27
  568. package/dist/store/internal/item-mapper.js +0 -61
  569. package/dist/store/internal/keys.d.ts +0 -17
  570. package/dist/store/internal/keys.js +0 -41
  571. package/dist/store/internal/namespace-match.d.ts +0 -11
  572. package/dist/store/internal/namespace-match.js +0 -40
  573. package/dist/store/internal/option-validation.d.ts +0 -13
  574. package/dist/store/internal/option-validation.js +0 -77
  575. package/dist/store/internal/overwrite-swap.d.ts +0 -32
  576. package/dist/store/internal/overwrite-swap.js +0 -68
  577. package/dist/store/internal/persist.d.ts +0 -28
  578. package/dist/store/internal/persist.js +0 -64
  579. package/dist/store/internal/query.d.ts +0 -11
  580. package/dist/store/internal/query.js +0 -48
  581. package/dist/store/internal/ranker.d.ts +0 -18
  582. package/dist/store/internal/ranker.js +0 -39
  583. package/dist/store/internal/read-existing.d.ts +0 -23
  584. package/dist/store/internal/read-existing.js +0 -41
  585. package/dist/store/internal/score-direction.d.ts +0 -31
  586. package/dist/store/internal/score-direction.js +0 -38
  587. package/dist/store/internal/search-filter.d.ts +0 -3
  588. package/dist/store/internal/search-filter.js +0 -10
  589. package/dist/store/internal/semantic-search.d.ts +0 -34
  590. package/dist/store/internal/semantic-search.js +0 -87
  591. package/dist/store/internal/setup.d.ts +0 -36
  592. package/dist/store/internal/setup.js +0 -40
  593. package/dist/store/internal/text-path.d.ts +0 -17
  594. package/dist/store/internal/validation.d.ts +0 -18
  595. package/dist/store/internal/validation.js +0 -51
  596. package/dist/store/internal/write-verify.d.ts +0 -42
  597. package/dist/store/internal/write-verify.js +0 -71
  598. package/dist/store/store.d.ts +0 -61
  599. package/dist/store/store.js +0 -107
  600. package/dist/store/types.d.ts +0 -50
  601. package/dist/store/types.js +0 -2
  602. package/dist/store/vector-backend.d.ts +0 -43
  603. package/dist/store/vector-backend.js +0 -2
  604. /package/dist/{checkpointer → cjs/checkpointer}/types.js +0 -0
  605. /package/dist/{factory → cjs/factory}/types.js +0 -0
  606. /package/dist/{history → cjs/history}/types.js +0 -0
  607. /package/dist/{shared → cjs/shared}/options.js +0 -0
  608. /package/dist/{shared/dynamodb → cjs/store}/types.js +0 -0
@@ -0,0 +1,28 @@
1
+ import { DEFAULT_READ_CONCURRENCY, mapWithConcurrency } from '../../shared/concurrency.js';
2
+ function itemOf(address) {
3
+ return JSON.stringify([address.namespace, address.key]);
4
+ }
5
+ export function planBatch(operations) {
6
+ const reads = [];
7
+ const lastWrite = new Map();
8
+ operations.forEach((op, index) => {
9
+ if (op.kind === 'put' || op.kind === 'delete')
10
+ lastWrite.set(itemOf(op.address), index);
11
+ else
12
+ reads.push(index);
13
+ });
14
+ return { reads, writes: [...lastWrite.values()].sort((a, b) => a - b) };
15
+ }
16
+ export async function runBatch(operations, dispatch, limit = DEFAULT_READ_CONCURRENCY) {
17
+ const results = operations.map(() => null);
18
+ const { reads, writes } = planBatch(operations);
19
+ for (const phase of [reads, writes]) {
20
+ if (phase.length === 0)
21
+ continue;
22
+ const share = Math.max(1, Math.floor(limit / Math.min(limit, phase.length)));
23
+ await mapWithConcurrency(phase, limit, async (index) => {
24
+ results[index] = await dispatch(operations[index], share);
25
+ });
26
+ }
27
+ return results;
28
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Hides the store's filter grammar.
3
+ *
4
+ * Which operators a search filter accepts, how each compares a stored field —
5
+ * ordered comparisons only between like-typed values, an absent field
6
+ * satisfying only `$ne` and `$nin` — and whether an item passes a search's
7
+ * optional filter are decided here, the same way whichever search path runs.
8
+ */
9
+ import type { Item } from '@langchain/langgraph-checkpoint';
10
+ /** A JSON value stored in an item or supplied in a filter. */
11
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
12
+ [key: string]: JsonValue;
13
+ };
14
+ /**
15
+ * Whether `value` satisfies every field condition in `filter`.
16
+ *
17
+ * Accepts: `value` — a stored item's decoded value. Declared as a record, but a
18
+ * row holds whatever its writer stored, including `null` and a scalar; such a
19
+ * value has no own properties and so satisfies no condition. `filter` — a plain
20
+ * value per field is exact match, an operator object (`{ $gt: 4 }`) applies
21
+ * comparisons, and `{}` constrains nothing.
22
+ *
23
+ * Returns: whether every condition holds.
24
+ *
25
+ * Throws: nothing. `search` walks every candidate row, so one row whose value
26
+ * is not an object must not fail the search.
27
+ *
28
+ * Guarantees: own properties only — `value['toString']` would otherwise resolve
29
+ * up the prototype chain and be compared as if it were stored data.
30
+ */
31
+ export declare function matchesStoreFilter(value: Record<string, JsonValue>, filter: Record<string, JsonValue>): boolean;
32
+ /**
33
+ * Whether `item` satisfies a search's optional metadata filter.
34
+ *
35
+ * Accepts: `filter` — a parsed search's filter; absent passes every item.
36
+ * `item.value` — whatever the item's writer stored; a value that is not
37
+ * an object satisfies no condition (see `matchesStoreFilter`).
38
+ *
39
+ * Returns: whether the item belongs in the result.
40
+ *
41
+ * Throws: nothing, so one unusual row cannot fail a search over many.
42
+ */
43
+ export declare function passesFilter(item: Item, filter: Record<string, JsonValue> | undefined): boolean;
@@ -0,0 +1,60 @@
1
+ import { isDeepStrictEqual } from 'node:util';
2
+ function orderOf(actual, expected) {
3
+ if (actual < expected)
4
+ return -1;
5
+ if (actual > expected)
6
+ return 1;
7
+ return actual === expected ? 0 : undefined;
8
+ }
9
+ function testOrder(order, test) {
10
+ return order !== undefined && test(order);
11
+ }
12
+ function compareOrdered(actual, expected, test) {
13
+ if (typeof actual === 'number' && typeof expected === 'number') {
14
+ return testOrder(orderOf(actual, expected), test);
15
+ }
16
+ if (typeof actual === 'string' && typeof expected === 'string') {
17
+ return testOrder(orderOf(actual, expected), test);
18
+ }
19
+ return false;
20
+ }
21
+ function equalValues(actual, expected) {
22
+ if (typeof actual === 'number' && typeof expected === 'number') {
23
+ return actual === expected || (Number.isNaN(actual) && Number.isNaN(expected));
24
+ }
25
+ return isDeepStrictEqual(actual, expected);
26
+ }
27
+ const COMPARATORS = {
28
+ $eq: (actual, expected) => equalValues(actual, expected),
29
+ $ne: (actual, expected) => !equalValues(actual, expected),
30
+ $gt: (actual, expected) => compareOrdered(actual, expected, (order) => order > 0),
31
+ $gte: (actual, expected) => compareOrdered(actual, expected, (order) => order >= 0),
32
+ $lt: (actual, expected) => compareOrdered(actual, expected, (order) => order < 0),
33
+ $lte: (actual, expected) => compareOrdered(actual, expected, (order) => order <= 0),
34
+ $in: (actual, expected) => Array.isArray(expected) ? expected.some((candidate) => equalValues(actual, candidate)) : false,
35
+ $nin: (actual, expected) => Array.isArray(expected) ? !expected.some((candidate) => equalValues(actual, candidate)) : true,
36
+ };
37
+ function isOperatorObject(condition) {
38
+ return (typeof condition === 'object' &&
39
+ condition !== null &&
40
+ !Array.isArray(condition) &&
41
+ Object.keys(condition).every((key) => Object.prototype.hasOwnProperty.call(COMPARATORS, key)));
42
+ }
43
+ function matchesCondition(actual, condition) {
44
+ if (!isOperatorObject(condition))
45
+ return equalValues(actual, condition);
46
+ return Object.entries(condition).every(([operator, expected]) => COMPARATORS[operator](actual, expected));
47
+ }
48
+ function ownField(item, field) {
49
+ if (item === null || typeof item !== 'object')
50
+ return undefined;
51
+ return Object.hasOwn(item, field) ? item[field] : undefined;
52
+ }
53
+ export function matchesStoreFilter(value, filter) {
54
+ return Object.entries(filter).every(([field, condition]) => matchesCondition(ownField(value, field), condition));
55
+ }
56
+ export function passesFilter(item, filter) {
57
+ if (!filter)
58
+ return true;
59
+ return matchesStoreFilter(item.value, filter);
60
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Hides what a single read counts as absent, and how it outlives an overwrite.
3
+ *
4
+ * A get reads its row strongly consistently and answers `null` alike for a
5
+ * missing row, an expired one and a row this adapter does not own. When the
6
+ * object an offloaded row names is deleted between the row read and the
7
+ * download, one re-read settles whether the item was replaced, removed or
8
+ * truly lost. A caller gets an item or `null` and never sees the race.
9
+ */
10
+ import type { Item } from '@langchain/langgraph-checkpoint';
11
+ import type { StoreAddress } from './parse.js';
12
+ import { type StoreItemRow } from './rows.js';
13
+ import type { StoreContext } from './setup.js';
14
+ /** A row and the item it decodes to, read together so a caller can use the row's own fields. */
15
+ export interface ReadCandidate {
16
+ readonly row: StoreItemRow;
17
+ readonly item: Item;
18
+ }
19
+ /**
20
+ * The item a row denotes, recovering from a concurrent overwrite of that row.
21
+ *
22
+ * An offloaded item can lose a race with a concurrent overwrite: between the
23
+ * row read and the S3 download the writer commits a new descriptor and deletes
24
+ * the object this read was about to fetch. That surfaces as `NoSuchKey` — or
25
+ * as a 403 `AccessDenied` for a role without `s3:ListBucket`, which S3 answers
26
+ * for a missing key instead — and one strongly-consistent re-read settles it —
27
+ * the row now points at the new object (that is the answer), is gone, or
28
+ * still points at the same missing object (a genuine loss, rethrown) — and a
29
+ * refused download on an unchanged row is rethrown the same way, since it is
30
+ * then a real permission failure. A row the overwrite left with no descriptor
31
+ * at all is a replacement like any other: it is decoded, and refused by its
32
+ * own coded error. Any other download failure propagates.
33
+ *
34
+ * Every reader that downloads a row it read earlier takes this route: `get`,
35
+ * whose window is one read; a search, which reads a whole page before it
36
+ * downloads anything; and a reconcile, which reads a whole namespace. A
37
+ * search that failed on it failed for an item that is live and readable a
38
+ * moment later.
39
+ *
40
+ * Accepts: `record` — a row read moments ago, whose object may since have been
41
+ * released. `signal` — aborts the download and the re-read.
42
+ *
43
+ * Returns: the row that was finally decoded and its item — the one given, or
44
+ * the one the overwrite left — or `undefined` when the re-read finds the row
45
+ * gone or expired.
46
+ *
47
+ * Throws: as {@link readStoreItem}, for the row finally decoded; the
48
+ * download's own failure when the re-read finds the same row.
49
+ */
50
+ export declare function readCandidate(context: StoreContext, record: StoreItemRow, signal?: AbortSignal): Promise<ReadCandidate | undefined>;
51
+ /**
52
+ * Retrieve a single item by namespace and key (strongly consistent), or null.
53
+ *
54
+ * A download that finds its object released by a concurrent overwrite is
55
+ * settled by {@link readCandidate}.
56
+ *
57
+ * Accepts: `address` — parsed; no check is repeated here. `signal` — aborts
58
+ * the reads.
59
+ *
60
+ * Returns: the item, or `null` for one that does not exist, has expired, or
61
+ * whose key holds a row this adapter does not own — which includes a row whose
62
+ * `createdAt` or `updatedAt` is not the string this package writes there, since
63
+ * an item is reported with both. The answers are one on purpose: a caller
64
+ * cannot act on the difference, and reporting a foreign row would leak that a
65
+ * shared table holds one.
66
+ *
67
+ * Throws: `VALIDATION` naming — for a row whose descriptor is not one —
68
+ * `descriptor`; `FORMAT_UNSUPPORTED` for
69
+ * a row, or a payload, written by a newer version, which is *not* reported as
70
+ * absent — hiding an item that exists is worse than failing; `PAYLOAD_CORRUPT`
71
+ * or the download's own error for a payload that cannot be read; `ABORTED`
72
+ * when the signal fires.
73
+ *
74
+ * Guarantees: strongly consistent — an item just written is always seen, and
75
+ * the ttl is honoured here rather than waited for.
76
+ */
77
+ export declare function getItem(context: StoreContext, address: StoreAddress, signal?: AbortSignal): Promise<Item | null>;
@@ -0,0 +1,54 @@
1
+ import { nowSeconds } from '../../shared/clock.js';
2
+ import { PayloadLocation, isMissingObjectError, isRefusedObjectError, } from '../../shared/codec/codec.js';
3
+ import { withDynamoDBRetry, retryFor } from '../../shared/dynamodb/retry.js';
4
+ import { isExpiredRow } from '../../shared/dynamodb/table-schema.js';
5
+ import { itemRowKey, parseWholeStoreRow, partitionKey, readStoreItem, sortKey, } from './rows.js';
6
+ async function readRow(context, namespace, key, signal) {
7
+ const result = await withDynamoDBRetry((request) => context.client.get({
8
+ TableName: context.tableName,
9
+ Key: itemRowKey({ namespace, key }),
10
+ ConsistentRead: true,
11
+ }, request), retryFor(context, signal));
12
+ if (!result.Item)
13
+ return undefined;
14
+ const record = parseWholeStoreRow(result.Item);
15
+ if (!record) {
16
+ context.logger.warn('store.get: ignored a row that is not a store item', {
17
+ partitionKey: partitionKey(namespace),
18
+ sortKey: sortKey(namespace, key),
19
+ });
20
+ return undefined;
21
+ }
22
+ return isExpiredRow(record, nowSeconds()) ? undefined : record;
23
+ }
24
+ function sameObject(read, reread) {
25
+ const fresh = reread.value;
26
+ if (!fresh)
27
+ return false;
28
+ return (read.value.location === PayloadLocation.S3 &&
29
+ fresh.location === PayloadLocation.S3 &&
30
+ read.value.s3Key === fresh.s3Key);
31
+ }
32
+ export async function readCandidate(context, record, signal) {
33
+ try {
34
+ return { row: record, item: await readStoreItem(context, record, signal) };
35
+ }
36
+ catch (error) {
37
+ if (!isMissingObjectError(error) && !isRefusedObjectError(error))
38
+ throw error;
39
+ const fresh = await readRow(context, record.namespace, record.key, signal);
40
+ if (!fresh)
41
+ return undefined;
42
+ if (sameObject(record, fresh))
43
+ throw error;
44
+ return { row: fresh, item: await readStoreItem(context, fresh, signal) };
45
+ }
46
+ }
47
+ export async function getItem(context, address, signal) {
48
+ const { namespace, key } = address;
49
+ const record = await readRow(context, namespace, key, signal);
50
+ if (!record)
51
+ return null;
52
+ const read = await readCandidate(context, record, signal);
53
+ return read === undefined ? null : read.item;
54
+ }
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Hides how an item's row is replaced or removed without stranding its S3
3
+ * object or deleting one a live row still names.
4
+ *
5
+ * A put with an offloader pins its write to the revision it observed and
6
+ * re-reads when a concurrent writer wins; once the budget is spent it
7
+ * overwrites and may leak one object to the lifecycle rule. A delete pins
8
+ * itself the same way. Either releases the payload it superseded only once its
9
+ * own write committed, and a write whose outcome was lost is read back before
10
+ * anything is released. Without an offloader there is no object to protect,
11
+ * and a put is a plain write.
12
+ */
13
+ import { type WriteVerdict } from '../../shared/dynamodb/idempotent-write.js';
14
+ import { type RowKey } from '../../shared/dynamodb/table-schema.js';
15
+ import type { StoreAddress } from './parse.js';
16
+ import { type ExistingRowMeta, type StoreItemRow } from './rows.js';
17
+ import type { StoreContext } from './setup.js';
18
+ /**
19
+ * Delete the item and, when a vector backend is configured, drop its vector.
20
+ *
21
+ * The row is read first, then removed inside a one-item `TransactWriteItems`
22
+ * conditioned on the revision that read observed. An unconditional delete
23
+ * erases a put that commits between the caller's call and the write — no lost
24
+ * acknowledgement needed, no S3 involved — and releases the object that put
25
+ * uploaded. The condition refuses that, and the request token makes a lost
26
+ * acknowledgement harmless: the replay is answered from DynamoDB's idempotency
27
+ * cache instead of removing whatever has arrived since.
28
+ *
29
+ * **A key with no row costs one read and sends no write at all**, which is the
30
+ * same race closed from the other side: there is nothing to pin, so a put that
31
+ * lands mid-call survives. The S3 release and the vector sync still run, since
32
+ * a key with no row can still have a stranded vector and clearing it is a
33
+ * repair path callers have today — and the vector sync goes through the same
34
+ * confirmation as every other path rather than letting the pre-read stand in
35
+ * for it, so the put that lands mid-call keeps its vector too.
36
+ *
37
+ * What a caller can and cannot tell apart:
38
+ *
39
+ * - **Compare-and-swap exhaustion resolves rather than throwing.** Three
40
+ * consecutive writers between a re-pin and its attempt leave the item in
41
+ * place, release nothing — correctly, a live row names the object — and emit
42
+ * one `warn`. Throwing instead would add a failure mode to an interleaving
43
+ * that succeeds today, which every caller deleting in a `finally` would have
44
+ * to handle.
45
+ * - **The vector is dropped only on a confirmation, and that window is
46
+ * narrowed rather than closed.** Immediately before the backend call — and
47
+ * above the S3 cleanup, so no round trip with its own retries sits inside the
48
+ * window — one strongly-consistent projected read asks whether the key holds
49
+ * a row now, and a row that is there keeps its vector and logs one `info`.
50
+ * That covers both interleavings that would otherwise erase a live item's vector: a
51
+ * put recreating the row this call removed, and the compare-and-swap above
52
+ * resolving with the row untouched. What is left is a put committing between
53
+ * that read and the backend call, two adjacent statements apart. Closing it
54
+ * needs a compare-and-swap **on the vector backend** — delete this vector
55
+ * only if it is still the one written at time T — which the `VectorBackend`
56
+ * contract cannot express and no implementation would be obliged to honour,
57
+ * so `reconcileVectorIndex` stays the named repair for it.
58
+ * - **A deadline cut and a spent budget are one error.** The transaction's
59
+ * budget is additionally bounded by `MAX_WRITE_LIFETIME_MS`, so a caller who
60
+ * configures a long retry policy can see the budget end there rather than at
61
+ * its own last attempt; both arrive as `RETRY_EXHAUSTED` and neither says
62
+ * which bound stopped it.
63
+ * - **The pre-read is a new way for this call to fail.** It issues no read
64
+ * today, so a delete of a key with *no row* can now fail where it always
65
+ * succeeded. Nothing has been written when it does: no row removed, no object
66
+ * released, no vector touched. The error types a caller sees are unchanged —
67
+ * `store.delete` already documents `RETRY_EXHAUSTED` — but "deleting an
68
+ * item that is not there is not an error" now describes the outcome rather
69
+ * than the round trip.
70
+ *
71
+ * Accepts: `address` — parsed; the namespace and key the cleanup is scoped and
72
+ * logged by, and the row's key is derived from it.
73
+ *
74
+ * Returns: nothing. The item is gone, was already gone, or — on
75
+ * compare-and-swap exhaustion — is still there and was left alone.
76
+ *
77
+ * Throws: whatever the pre-read throws; whatever the transaction throws other
78
+ * than a guard rejection, which is this call's own business; and
79
+ * `RETRY_EXHAUSTED` when the budget is spent and a read cannot confirm the
80
+ * row is gone. Three things about that list are worth saying rather than
81
+ * leaving to be inferred. The **pre-read** is why a delete of a key with no row
82
+ * can now fail at all, and nothing has been written when it does. A **guard
83
+ * rejection** is refused rather than raised: the row it names was replaced
84
+ * after this call observed it, so removing it would erase that put and release
85
+ * the object the put uploaded, and re-pinning on the row the rejection carried
86
+ * is strictly safer than either raising or proceeding. And **exhausting** those
87
+ * re-pins throws nothing either — it resolves with the item still there and one
88
+ * `warn`, so a caller that needs the item gone re-runs once the key is
89
+ * quiescent rather than catching anything.
90
+ *
91
+ * Guarantees: the object released is the **last observation's**, on every path
92
+ * that releases at all — the pre-read's when nothing re-pinned, the rejected
93
+ * row's when something did. It is never read back from the response, so by
94
+ * construction the object of a delete whose acknowledgement was lost is not
95
+ * leaked. Nothing is released while the outcome is unknown: only a
96
+ * confirmed absence or a confirmed delete licenses it. And the backend's
97
+ * `delete` is never reached without a confirmation immediately before it, on
98
+ * every path including the one whose key never had a row: one rule with no
99
+ * exception, because an exception on a repair-shaped path is where the erasure
100
+ * comes back unnoticed.
101
+ */
102
+ export declare function deleteStoreItem(context: StoreContext, address: StoreAddress): Promise<void>;
103
+ /**
104
+ * Refuse a row DynamoDB would refuse for its size.
105
+ *
106
+ * Accepts: `record` — the fully built row, its payload encoded and its inline
107
+ * vectors attached.
108
+ *
109
+ * Returns: nothing: the row is kept under its declared type, and this checks it.
110
+ *
111
+ * Throws: `VALIDATION` when the row would pass DynamoDB's 400 KB item limit —
112
+ * naming `index` when the row fits without its vectors, since the vectors are
113
+ * what pushed it over (index fewer fields, embed with fewer dimensions, or
114
+ * configure a `vectorBackend`), and `value` otherwise.
115
+ */
116
+ export declare function assertRowFits(record: StoreItemRow): void;
117
+ /**
118
+ * Put the record and clean up whichever side is now dead.
119
+ *
120
+ * The compare-and-swap path runs **only when an offloader is configured**:
121
+ * without one there is no S3 object to orphan, so a plain last-write-wins put
122
+ * stays correct and costs no extra write capacity (DynamoDB charges for a
123
+ * failed conditional write too). With one, the swap is what lets this call
124
+ * delete exactly the payload it superseded rather than a descriptor a racer may
125
+ * already have replaced.
126
+ *
127
+ * Every failed put arrives after at least one write was issued —
128
+ * `putWithRevisionSwap` only re-reads after a rejection — so none of them
129
+ * proves a non-commit on its own: a put can commit server-side and lose its
130
+ * response, and a `ConditionalCheckFailedException` is as consistent with
131
+ * hitting the row this call just wrote as with a competitor's win. The row is
132
+ * therefore read back ({@link settleFailedPut}) before anything is deleted.
133
+ * Only a confirmed `'not-landed'` deletes this record's own object; a confirmed
134
+ * `'landed'` cleans up what the landed write replaced — the observation the
135
+ * attempt in flight was pinned to, which after a re-pin is a competitor's, not
136
+ * what this call first read — and swallows the error; an `'unverified'` read
137
+ * deletes nothing and rethrows, leaking one object at worst rather than
138
+ * stranding a live row pointing at a deleted one. So does a read that finds
139
+ * nothing, or finds another revision, after a write that DynamoDB may still
140
+ * apply: any attempt of the budget that got no answer, that DynamoDB answered
141
+ * as still in progress (`TransactionInProgressException`) or that failed with a
142
+ * server error (5xx). The verification compares the per-call `rev`, so an
143
+ * inline record is verified too: otherwise a lost acknowledgement of an inline
144
+ * overwrite would be reported as a failure while the previous offloaded object
145
+ * was never cleaned.
146
+ *
147
+ * Neither release reads the row again first. The record's object is uploaded
148
+ * under the record's own `rev`, which no other put uses, so no row another put
149
+ * commits names it; and the record names only that object, never the one it
150
+ * superseded.
151
+ *
152
+ * Accepts: `record` — the fully encoded row, its payload already uploaded if it
153
+ * was offloaded. `existing` — what the caller read before encoding.
154
+ *
155
+ * Returns: nothing. The row is committed and exactly one side's object, at
156
+ * most, has been released.
157
+ *
158
+ * Throws: `VALIDATION` naming `index` or `value` for a row over DynamoDB's
159
+ * item limit, before any write and after releasing this put's own upload;
160
+ * whatever the write, or the swap's re-read after a rejection, throws, unless
161
+ * the verification proves the write landed after all — in which case the error
162
+ * is swallowed and the cleanup runs as on the success path.
163
+ *
164
+ * Guarantees: this record's own object is released only after a read proves
165
+ * the write did not land, and a superseded object only after this record is
166
+ * committed. The failure modes are ordered by which is worse: a leaked object
167
+ * costs storage until the lifecycle rule reclaims it, while a row pointing at a
168
+ * deleted object is unreadable data, so every ambiguous case leaks instead of
169
+ * deletes.
170
+ */
171
+ export declare function persistRow(context: StoreContext, record: StoreItemRow, existing: ExistingRowMeta): Promise<void>;
172
+ /**
173
+ * How a revision swap ended, settled rather than thrown: what its committed
174
+ * write superseded, or the failure together with the observation the attempt in
175
+ * flight was pinned to — what that write replaced, if it landed after all.
176
+ */
177
+ type SwapOutcome = {
178
+ ok: true;
179
+ superseded: ExistingRowMeta;
180
+ } | {
181
+ ok: false;
182
+ reason: Error;
183
+ pinned: ExistingRowMeta;
184
+ };
185
+ /**
186
+ * Commit `record`, re-reading and retrying while another writer holds the row,
187
+ * and report the state this write actually superseded — the only descriptor
188
+ * safe to delete afterwards.
189
+ *
190
+ * Without the swap both racers read the same previous descriptor, both commit,
191
+ * and both delete it, orphaning the loser's own upload. Retrying against the
192
+ * *re-read* state is what makes each writer supersede exactly one payload.
193
+ *
194
+ * A rejection is not proof a competitor won: `withDynamoDBRetry` retries
195
+ * transient errors, so an attempt can commit server-side, its response can be
196
+ * lost, and the retried put can hit the row it just wrote and fail the same
197
+ * guard — indistinguishable from a competitor's win by the rejection alone.
198
+ * Each attempt's pinned observation is captured in `attempted` before the
199
+ * put, so that when a re-read finds the row already holding *this call's
200
+ * own* `rev`, the swap returns whatever `attempted` held — never this
201
+ * record's own just-committed value, which would strand the live row
202
+ * pointing at a deleted object. That comparison is guarded on `rev` being
203
+ * set: `rev` is optional on the record type, and an unnonced record against a
204
+ * pre-0.9.0 revision-less row would otherwise match `undefined === undefined`
205
+ * and claim a race it never entered.
206
+ *
207
+ * On exhaustion the write proceeds unconditionally and warns. That is
208
+ * deliberate: the fallback costs at most one orphaned object, reclaimed by a
209
+ * lifecycle rule, so pathological contention degrades instead of turning a
210
+ * working put into an error. `createdAt` is refreshed from
211
+ * each re-read so a row created by whoever won keeps its true creation time.
212
+ *
213
+ * Accepts: `record` — the row to commit, carrying this call's own `rev`.
214
+ * `existing` — what the caller read before encoding, used as the first pin; an
215
+ * `exists: false` observation pins "no row", so a creation races correctly too.
216
+ *
217
+ * Returns: on success, the state this write actually superseded — the
218
+ * descriptor safe to delete — which is the last observation the winning put
219
+ * was pinned to, never this record's own value. On failure — a put failing
220
+ * other than on its guard, or a re-read failing after a rejection — the error,
221
+ * with the observation the failed attempt was pinned to. After a re-pin that is
222
+ * a competitor's row, not `existing`: the competitor already replaced and
223
+ * released `existing`, so a write that landed without an answer superseded the
224
+ * competitor's object, and only this observation names it.
225
+ *
226
+ * Throws: nothing; a failure is reported in the outcome, because only the
227
+ * swap knows which observation the failed attempt was pinned to.
228
+ *
229
+ * Guarantees: at most {@link OVERWRITE_CAS_MAX_ATTEMPTS} conditional puts, and
230
+ * a re-read only when the rejection did not already carry the row that caused
231
+ * it.
232
+ */
233
+ export declare function putWithRevisionSwap(context: StoreContext, record: StoreItemRow, existing: ExistingRowMeta): Promise<SwapOutcome>;
234
+ /**
235
+ * Whether `error` is a spent retry budget.
236
+ *
237
+ * Accepts: any error, and equally anything else a `throw` can produce.
238
+ * Recognised by brand and code: the code is the one thing an error crossing a
239
+ * module or realm boundary can be relied on to keep.
240
+ *
241
+ * Returns: whether the write is ambiguous for the reason retries were spent,
242
+ * which is the only failure a verification read is allowed to resolve.
243
+ *
244
+ * Throws: **nothing**, for any value. A value carrying no such code is not a
245
+ * spent budget, so the caller rethrows it rather than spending a read on it.
246
+ */
247
+ export declare function isRetryExhausted(error: Error): boolean;
248
+ /**
249
+ * Read `record`'s row back to establish what an ambiguous write actually did,
250
+ * comparing the row's revision with the one this write carried. Every put
251
+ * stamps a fresh per-call `rev`, so the comparison works for inline and
252
+ * offloaded records alike.
253
+ *
254
+ * Accepts: `record` — the row this call wrote, carrying the `rev` it stamped.
255
+ * A record with no `rev` has nothing to compare and is reported `'not-landed'`
256
+ * without spending a read.
257
+ *
258
+ * Returns: `'landed'`, `'not-landed'` or `'unverified'`; see
259
+ * {@link WriteVerdict} for what each answer licenses the caller to do. Only the
260
+ * `rev` is read: an offloaded record's key ends in that same `rev`, so the row
261
+ * holding a different one never names this write's object, and a cleanup
262
+ * needs nothing more from it.
263
+ *
264
+ * Throws: nothing — a failed verification is `'unverified'`, which is an
265
+ * answer, not an error.
266
+ */
267
+ export declare function verifyWriteLanded(context: StoreContext, record: RowKey & {
268
+ rev?: string;
269
+ }): Promise<WriteVerdict>;
270
+ export {};