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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/README.md +1720 -154
  2. package/dist/backfill/backfill.d.ts +168 -0
  3. package/dist/backfill/backfill.js +393 -0
  4. package/dist/checkpointer/actions/delete-thread.d.ts +47 -6
  5. package/dist/checkpointer/actions/delete-thread.js +58 -21
  6. package/dist/checkpointer/actions/get-tuple.d.ts +29 -4
  7. package/dist/checkpointer/actions/get-tuple.js +44 -10
  8. package/dist/checkpointer/actions/list.d.ts +46 -4
  9. package/dist/checkpointer/actions/list.js +121 -66
  10. package/dist/checkpointer/actions/put-writes.d.ts +41 -9
  11. package/dist/checkpointer/actions/put-writes.js +62 -77
  12. package/dist/checkpointer/actions/put.d.ts +83 -4
  13. package/dist/checkpointer/actions/put.js +177 -25
  14. package/dist/checkpointer/internal/delta-history.d.ts +112 -0
  15. package/dist/checkpointer/internal/delta-history.js +252 -0
  16. package/dist/checkpointer/internal/listing.d.ts +149 -0
  17. package/dist/checkpointer/internal/listing.js +245 -0
  18. package/dist/checkpointer/internal/parse.d.ts +262 -0
  19. package/dist/checkpointer/internal/parse.js +372 -0
  20. package/dist/checkpointer/internal/pending-writes.d.ts +275 -0
  21. package/dist/checkpointer/internal/pending-writes.js +588 -0
  22. package/dist/checkpointer/internal/read.d.ts +130 -0
  23. package/dist/checkpointer/internal/read.js +264 -0
  24. package/dist/checkpointer/internal/rows.d.ts +571 -0
  25. package/dist/checkpointer/internal/rows.js +834 -0
  26. package/dist/checkpointer/internal/setup.d.ts +42 -19
  27. package/dist/checkpointer/internal/setup.js +65 -29
  28. package/dist/checkpointer/saver.d.ts +256 -16
  29. package/dist/checkpointer/saver.js +275 -29
  30. package/dist/checkpointer/types.d.ts +39 -39
  31. package/dist/checkpointer/types.js +10 -1
  32. package/dist/factory/factory.d.ts +134 -28
  33. package/dist/factory/factory.js +240 -21
  34. package/dist/factory/types.d.ts +76 -0
  35. package/dist/factory/types.js +10 -0
  36. package/dist/history/actions/add-messages.d.ts +31 -4
  37. package/dist/history/actions/add-messages.js +38 -58
  38. package/dist/history/actions/clear.d.ts +49 -6
  39. package/dist/history/actions/clear.js +66 -14
  40. package/dist/history/actions/get-messages.d.ts +54 -6
  41. package/dist/history/actions/get-messages.js +126 -43
  42. package/dist/history/actions/list-sessions.d.ts +52 -10
  43. package/dist/history/actions/list-sessions.js +139 -40
  44. package/dist/history/actions/reconcile-count.d.ts +42 -10
  45. package/dist/history/actions/reconcile-count.js +45 -45
  46. package/dist/history/chat-message-history.d.ts +220 -33
  47. package/dist/history/chat-message-history.js +240 -43
  48. package/dist/history/internal/append.d.ts +212 -0
  49. package/dist/history/internal/append.js +500 -0
  50. package/dist/history/internal/message-read.d.ts +84 -0
  51. package/dist/history/internal/message-read.js +204 -0
  52. package/dist/history/internal/parse.d.ts +153 -0
  53. package/dist/history/internal/parse.js +252 -0
  54. package/dist/history/internal/rows.d.ts +195 -0
  55. package/dist/history/internal/rows.js +250 -0
  56. package/dist/history/internal/session.d.ts +331 -0
  57. package/dist/history/internal/session.js +628 -0
  58. package/dist/history/internal/setup.d.ts +52 -17
  59. package/dist/history/internal/setup.js +92 -21
  60. package/dist/history/session-adapter.d.ts +102 -7
  61. package/dist/history/session-adapter.js +103 -9
  62. package/dist/history/types.d.ts +80 -29
  63. package/dist/history/types.js +10 -1
  64. package/dist/index.d.ts +42 -11
  65. package/dist/index.js +33 -12
  66. package/dist/shared/adapter.d.ts +135 -0
  67. package/dist/shared/adapter.js +143 -0
  68. package/dist/shared/clock.d.ts +51 -2
  69. package/dist/shared/clock.js +57 -2
  70. package/dist/shared/codec/codec.d.ts +288 -13
  71. package/dist/shared/codec/codec.js +416 -19
  72. package/dist/shared/codec/compression.d.ts +43 -7
  73. package/dist/shared/codec/compression.js +53 -13
  74. package/dist/shared/codec/json-serde.d.ts +76 -4
  75. package/dist/shared/codec/json-serde.js +181 -8
  76. package/dist/shared/codec/s3/client-types.d.ts +53 -0
  77. package/dist/shared/codec/s3/client-types.js +26 -0
  78. package/dist/shared/codec/s3/client.d.ts +43 -10
  79. package/dist/shared/codec/s3/client.js +82 -9
  80. package/dist/shared/codec/s3/config.d.ts +242 -11
  81. package/dist/shared/codec/s3/config.js +293 -11
  82. package/dist/shared/codec/s3/lifecycle.d.ts +164 -6
  83. package/dist/shared/codec/s3/lifecycle.js +335 -27
  84. package/dist/shared/codec/s3/offloader.d.ts +393 -18
  85. package/dist/shared/codec/s3/offloader.js +595 -37
  86. package/dist/shared/concurrency.d.ts +43 -0
  87. package/dist/shared/concurrency.js +78 -0
  88. package/dist/shared/dynamodb/abort.d.ts +47 -0
  89. package/dist/shared/dynamodb/abort.js +59 -0
  90. package/dist/shared/dynamodb/batch-write.d.ts +77 -14
  91. package/dist/shared/dynamodb/batch-write.js +146 -27
  92. package/dist/shared/dynamodb/cancellation.d.ts +121 -4
  93. package/dist/shared/dynamodb/cancellation.js +147 -3
  94. package/dist/shared/dynamodb/client.d.ts +162 -8
  95. package/dist/shared/dynamodb/client.js +153 -5
  96. package/dist/shared/dynamodb/idempotent-write.d.ts +551 -0
  97. package/dist/shared/dynamodb/idempotent-write.js +593 -0
  98. package/dist/shared/dynamodb/paginate.d.ts +105 -9
  99. package/dist/shared/dynamodb/paginate.js +175 -7
  100. package/dist/shared/dynamodb/partition-delete.d.ts +185 -14
  101. package/dist/shared/dynamodb/partition-delete.js +314 -44
  102. package/dist/shared/dynamodb/recency-index.d.ts +231 -0
  103. package/dist/shared/dynamodb/recency-index.js +377 -0
  104. package/dist/shared/dynamodb/retry.d.ts +276 -8
  105. package/dist/shared/dynamodb/retry.js +433 -23
  106. package/dist/shared/dynamodb/table-schema.d.ts +190 -0
  107. package/dist/shared/dynamodb/table-schema.js +209 -0
  108. package/dist/shared/errors/base-error.d.ts +184 -10
  109. package/dist/shared/errors/base-error.js +160 -14
  110. package/dist/shared/errors/boundary.d.ts +71 -0
  111. package/dist/shared/errors/boundary.js +143 -0
  112. package/dist/shared/errors/classify.d.ts +97 -0
  113. package/dist/shared/errors/classify.js +257 -0
  114. package/dist/shared/errors/error-code.d.ts +77 -2
  115. package/dist/shared/errors/error-code.js +83 -1
  116. package/dist/shared/errors/errors.d.ts +158 -59
  117. package/dist/shared/errors/errors.js +219 -92
  118. package/dist/shared/logging/logger.d.ts +69 -3
  119. package/dist/shared/logging/logger.js +97 -3
  120. package/dist/shared/logging/redaction.d.ts +92 -8
  121. package/dist/shared/logging/redaction.js +273 -17
  122. package/dist/shared/logging/secret-patterns.d.ts +149 -19
  123. package/dist/shared/logging/secret-patterns.js +188 -27
  124. package/dist/shared/logging/truncate.d.ts +197 -0
  125. package/dist/shared/logging/truncate.js +231 -0
  126. package/dist/shared/options.d.ts +59 -7
  127. package/dist/shared/options.js +9 -1
  128. package/dist/shared/ulid.d.ts +77 -7
  129. package/dist/shared/ulid.js +103 -8
  130. package/dist/shared/validation/collaborators.d.ts +141 -0
  131. package/dist/shared/validation/collaborators.js +188 -0
  132. package/dist/shared/validation/option-shape.d.ts +89 -0
  133. package/dist/shared/validation/option-shape.js +113 -0
  134. package/dist/shared/validation/options.d.ts +145 -0
  135. package/dist/shared/validation/options.js +328 -0
  136. package/dist/shared/validation/primitives.d.ts +288 -21
  137. package/dist/shared/validation/primitives.js +353 -50
  138. package/dist/shared/validation/ttl.d.ts +66 -10
  139. package/dist/shared/validation/ttl.js +113 -15
  140. package/dist/store/actions/list-namespaces.d.ts +76 -6
  141. package/dist/store/actions/list-namespaces.js +166 -24
  142. package/dist/store/actions/put.d.ts +33 -8
  143. package/dist/store/actions/put.js +53 -60
  144. package/dist/store/actions/reconcile-vector-index.d.ts +31 -10
  145. package/dist/store/actions/reconcile-vector-index.js +34 -15
  146. package/dist/store/actions/search.d.ts +34 -6
  147. package/dist/store/actions/search.js +56 -51
  148. package/dist/store/internal/batch-plan.d.ts +26 -0
  149. package/dist/store/internal/batch-plan.js +109 -0
  150. package/dist/store/internal/filter.d.ts +36 -3
  151. package/dist/store/internal/filter.js +66 -15
  152. package/dist/store/internal/get-item.d.ts +45 -0
  153. package/dist/store/internal/get-item.js +115 -0
  154. package/dist/store/internal/item-write.d.ts +230 -0
  155. package/dist/store/internal/item-write.js +463 -0
  156. package/dist/store/internal/parse.d.ts +225 -0
  157. package/dist/store/internal/parse.js +350 -0
  158. package/dist/store/internal/rows.d.ts +355 -0
  159. package/dist/store/internal/rows.js +447 -0
  160. package/dist/store/internal/semantic-search.d.ts +161 -6
  161. package/dist/store/internal/semantic-search.js +360 -18
  162. package/dist/store/internal/setup.d.ts +77 -20
  163. package/dist/store/internal/setup.js +178 -47
  164. package/dist/store/internal/table-search.d.ts +100 -0
  165. package/dist/store/internal/table-search.js +213 -0
  166. package/dist/store/internal/vector-index.d.ts +247 -0
  167. package/dist/store/internal/vector-index.js +546 -0
  168. package/dist/store/store.d.ts +270 -17
  169. package/dist/store/store.js +329 -38
  170. package/dist/store/types.d.ts +76 -26
  171. package/dist/store/types.js +13 -1
  172. package/dist/store/vector-backend.d.ts +64 -4
  173. package/dist/store/vector-backend.js +15 -1
  174. package/package.json +58 -36
  175. package/dist/checkpointer/actions/delete-thread.d.ts.map +0 -1
  176. package/dist/checkpointer/actions/delete-thread.js.map +0 -1
  177. package/dist/checkpointer/actions/get-tuple.d.ts.map +0 -1
  178. package/dist/checkpointer/actions/get-tuple.js.map +0 -1
  179. package/dist/checkpointer/actions/list.d.ts.map +0 -1
  180. package/dist/checkpointer/actions/list.js.map +0 -1
  181. package/dist/checkpointer/actions/put-writes.d.ts.map +0 -1
  182. package/dist/checkpointer/actions/put-writes.js.map +0 -1
  183. package/dist/checkpointer/actions/put.d.ts.map +0 -1
  184. package/dist/checkpointer/actions/put.js.map +0 -1
  185. package/dist/checkpointer/internal/assemble.d.ts +0 -10
  186. package/dist/checkpointer/internal/assemble.d.ts.map +0 -1
  187. package/dist/checkpointer/internal/assemble.js +0 -37
  188. package/dist/checkpointer/internal/assemble.js.map +0 -1
  189. package/dist/checkpointer/internal/configurable.d.ts +0 -13
  190. package/dist/checkpointer/internal/configurable.d.ts.map +0 -1
  191. package/dist/checkpointer/internal/configurable.js +0 -23
  192. package/dist/checkpointer/internal/configurable.js.map +0 -1
  193. package/dist/checkpointer/internal/fetch.d.ts +0 -10
  194. package/dist/checkpointer/internal/fetch.d.ts.map +0 -1
  195. package/dist/checkpointer/internal/fetch.js +0 -46
  196. package/dist/checkpointer/internal/fetch.js.map +0 -1
  197. package/dist/checkpointer/internal/filter-match.d.ts +0 -12
  198. package/dist/checkpointer/internal/filter-match.d.ts.map +0 -1
  199. package/dist/checkpointer/internal/filter-match.js +0 -14
  200. package/dist/checkpointer/internal/filter-match.js.map +0 -1
  201. package/dist/checkpointer/internal/item-reader.d.ts +0 -55
  202. package/dist/checkpointer/internal/item-reader.d.ts.map +0 -1
  203. package/dist/checkpointer/internal/item-reader.js +0 -88
  204. package/dist/checkpointer/internal/item-reader.js.map +0 -1
  205. package/dist/checkpointer/internal/item-writer.d.ts +0 -26
  206. package/dist/checkpointer/internal/item-writer.d.ts.map +0 -1
  207. package/dist/checkpointer/internal/item-writer.js +0 -92
  208. package/dist/checkpointer/internal/item-writer.js.map +0 -1
  209. package/dist/checkpointer/internal/keys.d.ts +0 -31
  210. package/dist/checkpointer/internal/keys.d.ts.map +0 -1
  211. package/dist/checkpointer/internal/keys.js +0 -87
  212. package/dist/checkpointer/internal/keys.js.map +0 -1
  213. package/dist/checkpointer/internal/query.d.ts +0 -20
  214. package/dist/checkpointer/internal/query.d.ts.map +0 -1
  215. package/dist/checkpointer/internal/query.js +0 -36
  216. package/dist/checkpointer/internal/query.js.map +0 -1
  217. package/dist/checkpointer/internal/setup.d.ts.map +0 -1
  218. package/dist/checkpointer/internal/setup.js.map +0 -1
  219. package/dist/checkpointer/internal/special-write-cas.d.ts +0 -30
  220. package/dist/checkpointer/internal/special-write-cas.d.ts.map +0 -1
  221. package/dist/checkpointer/internal/special-write-cas.js +0 -104
  222. package/dist/checkpointer/internal/special-write-cas.js.map +0 -1
  223. package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -24
  224. package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +0 -1
  225. package/dist/checkpointer/internal/special-write-cleanup.js +0 -47
  226. package/dist/checkpointer/internal/special-write-cleanup.js.map +0 -1
  227. package/dist/checkpointer/internal/special-write-verify.d.ts +0 -54
  228. package/dist/checkpointer/internal/special-write-verify.d.ts.map +0 -1
  229. package/dist/checkpointer/internal/special-write-verify.js +0 -65
  230. package/dist/checkpointer/internal/special-write-verify.js.map +0 -1
  231. package/dist/checkpointer/internal/validation.d.ts +0 -13
  232. package/dist/checkpointer/internal/validation.d.ts.map +0 -1
  233. package/dist/checkpointer/internal/validation.js +0 -30
  234. package/dist/checkpointer/internal/validation.js.map +0 -1
  235. package/dist/checkpointer/internal/write-guard.d.ts +0 -13
  236. package/dist/checkpointer/internal/write-guard.d.ts.map +0 -1
  237. package/dist/checkpointer/internal/write-guard.js +0 -39
  238. package/dist/checkpointer/internal/write-guard.js.map +0 -1
  239. package/dist/checkpointer/internal/write-index.d.ts +0 -37
  240. package/dist/checkpointer/internal/write-index.d.ts.map +0 -1
  241. package/dist/checkpointer/internal/write-index.js +0 -42
  242. package/dist/checkpointer/internal/write-index.js.map +0 -1
  243. package/dist/checkpointer/saver.d.ts.map +0 -1
  244. package/dist/checkpointer/saver.js.map +0 -1
  245. package/dist/checkpointer/types.d.ts.map +0 -1
  246. package/dist/checkpointer/types.js.map +0 -1
  247. package/dist/factory/factory.d.ts.map +0 -1
  248. package/dist/factory/factory.js.map +0 -1
  249. package/dist/history/actions/add-messages.d.ts.map +0 -1
  250. package/dist/history/actions/add-messages.js.map +0 -1
  251. package/dist/history/actions/clear.d.ts.map +0 -1
  252. package/dist/history/actions/clear.js.map +0 -1
  253. package/dist/history/actions/get-messages.d.ts.map +0 -1
  254. package/dist/history/actions/get-messages.js.map +0 -1
  255. package/dist/history/actions/list-sessions.d.ts.map +0 -1
  256. package/dist/history/actions/list-sessions.js.map +0 -1
  257. package/dist/history/actions/reconcile-count.d.ts.map +0 -1
  258. package/dist/history/actions/reconcile-count.js.map +0 -1
  259. package/dist/history/chat-message-history.d.ts.map +0 -1
  260. package/dist/history/chat-message-history.js.map +0 -1
  261. package/dist/history/internal/append-saga.d.ts +0 -20
  262. package/dist/history/internal/append-saga.d.ts.map +0 -1
  263. package/dist/history/internal/append-saga.js +0 -35
  264. package/dist/history/internal/append-saga.js.map +0 -1
  265. package/dist/history/internal/compensation.d.ts +0 -21
  266. package/dist/history/internal/compensation.d.ts.map +0 -1
  267. package/dist/history/internal/compensation.js +0 -84
  268. package/dist/history/internal/compensation.js.map +0 -1
  269. package/dist/history/internal/item-mapper.d.ts +0 -12
  270. package/dist/history/internal/item-mapper.d.ts.map +0 -1
  271. package/dist/history/internal/item-mapper.js +0 -33
  272. package/dist/history/internal/item-mapper.js.map +0 -1
  273. package/dist/history/internal/keys.d.ts +0 -17
  274. package/dist/history/internal/keys.d.ts.map +0 -1
  275. package/dist/history/internal/keys.js +0 -49
  276. package/dist/history/internal/keys.js.map +0 -1
  277. package/dist/history/internal/message-chunker.d.ts +0 -14
  278. package/dist/history/internal/message-chunker.d.ts.map +0 -1
  279. package/dist/history/internal/message-chunker.js +0 -68
  280. package/dist/history/internal/message-chunker.js.map +0 -1
  281. package/dist/history/internal/message-transaction.d.ts +0 -26
  282. package/dist/history/internal/message-transaction.d.ts.map +0 -1
  283. package/dist/history/internal/message-transaction.js +0 -60
  284. package/dist/history/internal/message-transaction.js.map +0 -1
  285. package/dist/history/internal/query.d.ts +0 -10
  286. package/dist/history/internal/query.d.ts.map +0 -1
  287. package/dist/history/internal/query.js +0 -31
  288. package/dist/history/internal/query.js.map +0 -1
  289. package/dist/history/internal/session-count.d.ts +0 -41
  290. package/dist/history/internal/session-count.d.ts.map +0 -1
  291. package/dist/history/internal/session-count.js +0 -109
  292. package/dist/history/internal/session-count.js.map +0 -1
  293. package/dist/history/internal/session-title.d.ts +0 -20
  294. package/dist/history/internal/session-title.d.ts.map +0 -1
  295. package/dist/history/internal/session-title.js +0 -44
  296. package/dist/history/internal/session-title.js.map +0 -1
  297. package/dist/history/internal/session-update.d.ts +0 -28
  298. package/dist/history/internal/session-update.d.ts.map +0 -1
  299. package/dist/history/internal/session-update.js +0 -70
  300. package/dist/history/internal/session-update.js.map +0 -1
  301. package/dist/history/internal/setup.d.ts.map +0 -1
  302. package/dist/history/internal/setup.js.map +0 -1
  303. package/dist/history/internal/title-generator.d.ts +0 -13
  304. package/dist/history/internal/title-generator.d.ts.map +0 -1
  305. package/dist/history/internal/title-generator.js +0 -25
  306. package/dist/history/internal/title-generator.js.map +0 -1
  307. package/dist/history/internal/ttl-anchor.d.ts +0 -25
  308. package/dist/history/internal/ttl-anchor.d.ts.map +0 -1
  309. package/dist/history/internal/ttl-anchor.js +0 -38
  310. package/dist/history/internal/ttl-anchor.js.map +0 -1
  311. package/dist/history/internal/validation.d.ts +0 -9
  312. package/dist/history/internal/validation.d.ts.map +0 -1
  313. package/dist/history/internal/validation.js +0 -16
  314. package/dist/history/internal/validation.js.map +0 -1
  315. package/dist/history/session-adapter.d.ts.map +0 -1
  316. package/dist/history/session-adapter.js.map +0 -1
  317. package/dist/history/types.d.ts.map +0 -1
  318. package/dist/history/types.js.map +0 -1
  319. package/dist/index.d.ts.map +0 -1
  320. package/dist/index.js.map +0 -1
  321. package/dist/shared/clock.d.ts.map +0 -1
  322. package/dist/shared/clock.js.map +0 -1
  323. package/dist/shared/codec/codec.d.ts.map +0 -1
  324. package/dist/shared/codec/codec.js.map +0 -1
  325. package/dist/shared/codec/compression.d.ts.map +0 -1
  326. package/dist/shared/codec/compression.js.map +0 -1
  327. package/dist/shared/codec/descriptor-keys.d.ts +0 -4
  328. package/dist/shared/codec/descriptor-keys.d.ts.map +0 -1
  329. package/dist/shared/codec/descriptor-keys.js +0 -14
  330. package/dist/shared/codec/descriptor-keys.js.map +0 -1
  331. package/dist/shared/codec/json-serde.d.ts.map +0 -1
  332. package/dist/shared/codec/json-serde.js.map +0 -1
  333. package/dist/shared/codec/s3/client.d.ts.map +0 -1
  334. package/dist/shared/codec/s3/client.js.map +0 -1
  335. package/dist/shared/codec/s3/config.d.ts.map +0 -1
  336. package/dist/shared/codec/s3/config.js.map +0 -1
  337. package/dist/shared/codec/s3/delete.d.ts +0 -8
  338. package/dist/shared/codec/s3/delete.d.ts.map +0 -1
  339. package/dist/shared/codec/s3/delete.js +0 -29
  340. package/dist/shared/codec/s3/delete.js.map +0 -1
  341. package/dist/shared/codec/s3/lifecycle.d.ts.map +0 -1
  342. package/dist/shared/codec/s3/lifecycle.js.map +0 -1
  343. package/dist/shared/codec/s3/offloader.d.ts.map +0 -1
  344. package/dist/shared/codec/s3/offloader.js.map +0 -1
  345. package/dist/shared/codec/s3/orphans.d.ts +0 -18
  346. package/dist/shared/codec/s3/orphans.d.ts.map +0 -1
  347. package/dist/shared/codec/s3/orphans.js +0 -58
  348. package/dist/shared/codec/s3/orphans.js.map +0 -1
  349. package/dist/shared/codec/s3/read-write.d.ts +0 -14
  350. package/dist/shared/codec/s3/read-write.d.ts.map +0 -1
  351. package/dist/shared/codec/s3/read-write.js +0 -43
  352. package/dist/shared/codec/s3/read-write.js.map +0 -1
  353. package/dist/shared/codec/s3/retry.d.ts +0 -5
  354. package/dist/shared/codec/s3/retry.d.ts.map +0 -1
  355. package/dist/shared/codec/s3/retry.js +0 -25
  356. package/dist/shared/codec/s3/retry.js.map +0 -1
  357. package/dist/shared/constants.d.ts +0 -64
  358. package/dist/shared/constants.d.ts.map +0 -1
  359. package/dist/shared/constants.js +0 -67
  360. package/dist/shared/constants.js.map +0 -1
  361. package/dist/shared/dynamodb/backoff.d.ts +0 -15
  362. package/dist/shared/dynamodb/backoff.d.ts.map +0 -1
  363. package/dist/shared/dynamodb/backoff.js +0 -48
  364. package/dist/shared/dynamodb/backoff.js.map +0 -1
  365. package/dist/shared/dynamodb/batch-write.d.ts.map +0 -1
  366. package/dist/shared/dynamodb/batch-write.js.map +0 -1
  367. package/dist/shared/dynamodb/cancellation.d.ts.map +0 -1
  368. package/dist/shared/dynamodb/cancellation.js.map +0 -1
  369. package/dist/shared/dynamodb/client.d.ts.map +0 -1
  370. package/dist/shared/dynamodb/client.js.map +0 -1
  371. package/dist/shared/dynamodb/conditional-put.d.ts +0 -51
  372. package/dist/shared/dynamodb/conditional-put.d.ts.map +0 -1
  373. package/dist/shared/dynamodb/conditional-put.js +0 -59
  374. package/dist/shared/dynamodb/conditional-put.js.map +0 -1
  375. package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -19
  376. package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +0 -1
  377. package/dist/shared/dynamodb/drain-unprocessed.js +0 -44
  378. package/dist/shared/dynamodb/drain-unprocessed.js.map +0 -1
  379. package/dist/shared/dynamodb/paginate-core.d.ts +0 -22
  380. package/dist/shared/dynamodb/paginate-core.d.ts.map +0 -1
  381. package/dist/shared/dynamodb/paginate-core.js +0 -52
  382. package/dist/shared/dynamodb/paginate-core.js.map +0 -1
  383. package/dist/shared/dynamodb/paginate.d.ts.map +0 -1
  384. package/dist/shared/dynamodb/paginate.js.map +0 -1
  385. package/dist/shared/dynamodb/partition-delete.d.ts.map +0 -1
  386. package/dist/shared/dynamodb/partition-delete.js.map +0 -1
  387. package/dist/shared/dynamodb/retry-classifier.d.ts +0 -9
  388. package/dist/shared/dynamodb/retry-classifier.d.ts.map +0 -1
  389. package/dist/shared/dynamodb/retry-classifier.js +0 -87
  390. package/dist/shared/dynamodb/retry-classifier.js.map +0 -1
  391. package/dist/shared/dynamodb/retry.d.ts.map +0 -1
  392. package/dist/shared/dynamodb/retry.js.map +0 -1
  393. package/dist/shared/dynamodb/scan.d.ts +0 -15
  394. package/dist/shared/dynamodb/scan.d.ts.map +0 -1
  395. package/dist/shared/dynamodb/scan.js +0 -20
  396. package/dist/shared/dynamodb/scan.js.map +0 -1
  397. package/dist/shared/dynamodb/types.d.ts +0 -24
  398. package/dist/shared/dynamodb/types.d.ts.map +0 -1
  399. package/dist/shared/dynamodb/types.js +0 -3
  400. package/dist/shared/dynamodb/types.js.map +0 -1
  401. package/dist/shared/errors/base-error.d.ts.map +0 -1
  402. package/dist/shared/errors/base-error.js.map +0 -1
  403. package/dist/shared/errors/error-code.d.ts.map +0 -1
  404. package/dist/shared/errors/error-code.js.map +0 -1
  405. package/dist/shared/errors/errors.d.ts.map +0 -1
  406. package/dist/shared/errors/errors.js.map +0 -1
  407. package/dist/shared/errors/wrap-error.d.ts +0 -16
  408. package/dist/shared/errors/wrap-error.d.ts.map +0 -1
  409. package/dist/shared/errors/wrap-error.js +0 -30
  410. package/dist/shared/errors/wrap-error.js.map +0 -1
  411. package/dist/shared/logging/logger.d.ts.map +0 -1
  412. package/dist/shared/logging/logger.js.map +0 -1
  413. package/dist/shared/logging/redaction-walk.d.ts +0 -23
  414. package/dist/shared/logging/redaction-walk.d.ts.map +0 -1
  415. package/dist/shared/logging/redaction-walk.js +0 -92
  416. package/dist/shared/logging/redaction-walk.js.map +0 -1
  417. package/dist/shared/logging/redaction.d.ts.map +0 -1
  418. package/dist/shared/logging/redaction.js.map +0 -1
  419. package/dist/shared/logging/secret-patterns.d.ts.map +0 -1
  420. package/dist/shared/logging/secret-patterns.js.map +0 -1
  421. package/dist/shared/options.d.ts.map +0 -1
  422. package/dist/shared/options.js.map +0 -1
  423. package/dist/shared/ulid.d.ts.map +0 -1
  424. package/dist/shared/ulid.js.map +0 -1
  425. package/dist/shared/validation/primitives.d.ts.map +0 -1
  426. package/dist/shared/validation/primitives.js.map +0 -1
  427. package/dist/shared/validation/ttl.d.ts.map +0 -1
  428. package/dist/shared/validation/ttl.js.map +0 -1
  429. package/dist/store/actions/get.d.ts +0 -5
  430. package/dist/store/actions/get.d.ts.map +0 -1
  431. package/dist/store/actions/get.js +0 -35
  432. package/dist/store/actions/get.js.map +0 -1
  433. package/dist/store/actions/list-namespaces.d.ts.map +0 -1
  434. package/dist/store/actions/list-namespaces.js.map +0 -1
  435. package/dist/store/actions/put.d.ts.map +0 -1
  436. package/dist/store/actions/put.js.map +0 -1
  437. package/dist/store/actions/reconcile-vector-index.d.ts.map +0 -1
  438. package/dist/store/actions/reconcile-vector-index.js.map +0 -1
  439. package/dist/store/actions/search.d.ts.map +0 -1
  440. package/dist/store/actions/search.js.map +0 -1
  441. package/dist/store/internal/backend-search.d.ts +0 -5
  442. package/dist/store/internal/backend-search.d.ts.map +0 -1
  443. package/dist/store/internal/backend-search.js +0 -68
  444. package/dist/store/internal/backend-search.js.map +0 -1
  445. package/dist/store/internal/filter.d.ts.map +0 -1
  446. package/dist/store/internal/filter.js.map +0 -1
  447. package/dist/store/internal/index-reconcile.d.ts +0 -22
  448. package/dist/store/internal/index-reconcile.d.ts.map +0 -1
  449. package/dist/store/internal/index-reconcile.js +0 -105
  450. package/dist/store/internal/index-reconcile.js.map +0 -1
  451. package/dist/store/internal/index-sync.d.ts +0 -11
  452. package/dist/store/internal/index-sync.d.ts.map +0 -1
  453. package/dist/store/internal/index-sync.js +0 -26
  454. package/dist/store/internal/index-sync.js.map +0 -1
  455. package/dist/store/internal/item-mapper.d.ts +0 -25
  456. package/dist/store/internal/item-mapper.d.ts.map +0 -1
  457. package/dist/store/internal/item-mapper.js +0 -53
  458. package/dist/store/internal/item-mapper.js.map +0 -1
  459. package/dist/store/internal/keys.d.ts +0 -18
  460. package/dist/store/internal/keys.d.ts.map +0 -1
  461. package/dist/store/internal/keys.js +0 -42
  462. package/dist/store/internal/keys.js.map +0 -1
  463. package/dist/store/internal/namespace-match.d.ts +0 -12
  464. package/dist/store/internal/namespace-match.d.ts.map +0 -1
  465. package/dist/store/internal/namespace-match.js +0 -41
  466. package/dist/store/internal/namespace-match.js.map +0 -1
  467. package/dist/store/internal/overwrite-swap.d.ts +0 -33
  468. package/dist/store/internal/overwrite-swap.d.ts.map +0 -1
  469. package/dist/store/internal/overwrite-swap.js +0 -62
  470. package/dist/store/internal/overwrite-swap.js.map +0 -1
  471. package/dist/store/internal/persist.d.ts +0 -27
  472. package/dist/store/internal/persist.d.ts.map +0 -1
  473. package/dist/store/internal/persist.js +0 -59
  474. package/dist/store/internal/persist.js.map +0 -1
  475. package/dist/store/internal/query.d.ts +0 -6
  476. package/dist/store/internal/query.d.ts.map +0 -1
  477. package/dist/store/internal/query.js +0 -32
  478. package/dist/store/internal/query.js.map +0 -1
  479. package/dist/store/internal/ranker.d.ts +0 -13
  480. package/dist/store/internal/ranker.d.ts.map +0 -1
  481. package/dist/store/internal/ranker.js +0 -31
  482. package/dist/store/internal/ranker.js.map +0 -1
  483. package/dist/store/internal/read-existing.d.ts +0 -19
  484. package/dist/store/internal/read-existing.d.ts.map +0 -1
  485. package/dist/store/internal/read-existing.js +0 -29
  486. package/dist/store/internal/read-existing.js.map +0 -1
  487. package/dist/store/internal/score-direction.d.ts +0 -32
  488. package/dist/store/internal/score-direction.d.ts.map +0 -1
  489. package/dist/store/internal/score-direction.js +0 -39
  490. package/dist/store/internal/score-direction.js.map +0 -1
  491. package/dist/store/internal/search-filter.d.ts +0 -4
  492. package/dist/store/internal/search-filter.d.ts.map +0 -1
  493. package/dist/store/internal/search-filter.js +0 -11
  494. package/dist/store/internal/search-filter.js.map +0 -1
  495. package/dist/store/internal/semantic-search.d.ts.map +0 -1
  496. package/dist/store/internal/semantic-search.js.map +0 -1
  497. package/dist/store/internal/setup.d.ts.map +0 -1
  498. package/dist/store/internal/setup.js.map +0 -1
  499. package/dist/store/internal/validation.d.ts +0 -13
  500. package/dist/store/internal/validation.d.ts.map +0 -1
  501. package/dist/store/internal/validation.js +0 -35
  502. package/dist/store/internal/validation.js.map +0 -1
  503. package/dist/store/internal/write-verify.d.ts +0 -37
  504. package/dist/store/internal/write-verify.d.ts.map +0 -1
  505. package/dist/store/internal/write-verify.js +0 -68
  506. package/dist/store/internal/write-verify.js.map +0 -1
  507. package/dist/store/store.d.ts.map +0 -1
  508. package/dist/store/store.js.map +0 -1
  509. package/dist/store/types.d.ts.map +0 -1
  510. package/dist/store/types.js.map +0 -1
  511. package/dist/store/vector-backend.d.ts.map +0 -1
  512. package/dist/store/vector-backend.js.map +0 -1
@@ -1,34 +1,132 @@
1
1
  "use strict";
2
+ /**
3
+ * Hides how a `ttl` option becomes an expiry.
4
+ *
5
+ * A caller gives days or seconds. The one-unit rule, the five-year cap, the
6
+ * epoch second DynamoDB's TTL attribute takes, and the S3 lifecycle days that
7
+ * keep an offloaded object alive past its row's sweep lag are all derived
8
+ * here, so the two spellings of the `ttl` option are accepted or rejected
9
+ * alike and no reader re-derives one unit from the other itself. A stored
10
+ * row's own epoch-second `ttl` is converted to milliseconds for `Date` where
11
+ * that row is read, not here.
12
+ */
2
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS = exports.MAX_TTL_SECONDS = exports.MAX_TTL_DAYS = void 0;
3
15
  exports.resolveTtlSeconds = resolveTtlSeconds;
4
16
  exports.calculateTtlTimestamp = calculateTtlTimestamp;
5
- exports.resolveTtlDaysCeil = resolveTtlDaysCeil;
6
- const constants_1 = require("../constants");
17
+ exports.lifecycleExpirationDays = lifecycleExpirationDays;
18
+ const errors_1 = require("../errors/errors");
19
+ const option_shape_1 = require("./option-shape");
7
20
  const primitives_1 = require("./primitives");
8
21
  const SECONDS_PER_DAY = 24 * 60 * 60;
9
- /** Validate a {@link TtlOption} and resolve it to a positive number of seconds. */
22
+ /** Maximum TTL expressed in days (5 years). */
23
+ exports.MAX_TTL_DAYS = 365 * 5;
24
+ /** Maximum TTL expressed in seconds: the same five years as {@link MAX_TTL_DAYS}. */
25
+ exports.MAX_TTL_SECONDS = exports.MAX_TTL_DAYS * 24 * 60 * 60;
26
+ /**
27
+ * Extra days an S3 lifecycle rule adds over the TTL it backs. DynamoDB's TTL
28
+ * sweep can lag up to ~48 h past the `ttl` timestamp; the offloaded object
29
+ * must outlive its row, never the other way round.
30
+ */
31
+ exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS = 2;
32
+ /**
33
+ * The units {@link TtlOption} declares. `allKeysOf<TtlOption>` cannot check
34
+ * this list: over a union its parameter is itself a union of one key map per
35
+ * shape, so `{ days: 'days' }` alone satisfies the first shape and compiles.
36
+ * Listing the keys of every shape as one record restores the check, so leaving
37
+ * a unit out, inventing one, or adding a shape to the union without listing
38
+ * its unit here fails to compile.
39
+ */
40
+ const TTL_KEYS = (0, option_shape_1.allKeysOf)({
41
+ days: 'days',
42
+ seconds: 'seconds',
43
+ });
44
+ /** Positive integer no greater than `max`, with a message that names what the cap means. */
45
+ function assertWithinCap(value, field, max) {
46
+ (0, primitives_1.assertInteger)(value, field, { min: 1 });
47
+ if (value > max) {
48
+ throw (0, errors_1.validationError)(`${field} must be <= ${max} (five years)`, field);
49
+ }
50
+ }
51
+ /**
52
+ * Reject a `ttl` that is not an object at all, carries a key other than a
53
+ * unit, or names neither unit or both. The stray key is checked before the
54
+ * units, so `{ day: 1 }` names the key the caller wrote rather than a unit it
55
+ * did not.
56
+ */
57
+ function assertOneUnit(ttl) {
58
+ if (typeof ttl !== 'object' || ttl === null) {
59
+ throw (0, errors_1.validationError)('ttl must be an object: { days } or { seconds }', 'ttl');
60
+ }
61
+ (0, option_shape_1.assertShape)(ttl, TTL_KEYS, 'ttl');
62
+ const days = 'days' in ttl;
63
+ const seconds = 'seconds' in ttl;
64
+ if (days && seconds) {
65
+ throw (0, errors_1.validationError)('ttl must specify either ttl.days or ttl.seconds, not both', 'ttl');
66
+ }
67
+ if (!days && !seconds) {
68
+ throw (0, errors_1.validationError)('ttl must specify either ttl.days or ttl.seconds', 'ttl');
69
+ }
70
+ }
71
+ /**
72
+ * A {@link TtlOption} resolved to a positive number of seconds.
73
+ *
74
+ * Accepts: `ttl` — declared as the two-shape union; a JavaScript caller, or a
75
+ * config built from JSON, can also reach `undefined`, a non-object, `{}`, an
76
+ * object carrying both keys and one carrying any other key, and each is
77
+ * rejected. Within a shape the value must be an integer of at least 1.
78
+ *
79
+ * Returns: whole seconds, `days × 86400` for the days form.
80
+ *
81
+ * Throws: `VALIDATION`, in this order, naming `ttl` for a value that is not
82
+ * an object, `ttl.<key>` for a key other than `days` or `seconds`, `ttl` for
83
+ * an object naming neither unit or both, and `ttl.days` or `ttl.seconds` for a
84
+ * value outside 1..five years. Both forms share that cap, so the two spellings
85
+ * of one duration are accepted or rejected alike.
86
+ */
10
87
  function resolveTtlSeconds(ttl) {
88
+ assertOneUnit(ttl);
11
89
  if ('days' in ttl) {
12
- (0, primitives_1.validateInteger)(ttl.days, 'ttl.days', { min: 1, max: constants_1.MAX_TTL_DAYS });
90
+ assertWithinCap(ttl.days, 'ttl.days', exports.MAX_TTL_DAYS);
13
91
  return ttl.days * SECONDS_PER_DAY;
14
92
  }
15
- (0, primitives_1.validateInteger)(ttl.seconds, 'ttl.seconds', { min: 1, max: constants_1.MAX_TTL_SECONDS });
93
+ assertWithinCap(ttl.seconds, 'ttl.seconds', exports.MAX_TTL_SECONDS);
16
94
  return ttl.seconds;
17
95
  }
18
96
  /**
19
- * Resolve a {@link TtlOption} into a DynamoDB TTL attribute value: the Unix
20
- * epoch (seconds) at which the item expires.
97
+ * The value DynamoDB's TTL attribute takes for an item written now: the Unix
98
+ * epoch second at which it expires.
99
+ *
100
+ * Accepts: `ttl` — as {@link resolveTtlSeconds}. `now` — a clock returning
101
+ * epoch **milliseconds**, defaulting to `Date.now`; supplied by tests and by
102
+ * the adapters' clock seam.
21
103
  *
22
- * @param now - Clock seam returning epoch milliseconds. Defaults to `Date.now`.
104
+ * Returns: `floor(now() / 1000) + resolveTtlSeconds(ttl)`. Whole seconds,
105
+ * because DynamoDB reads the attribute as an epoch-second Number
106
+ * (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-before-you-start.html).
107
+ *
108
+ * Throws: whatever {@link resolveTtlSeconds} throws.
23
109
  */
24
110
  function calculateTtlTimestamp(ttl, now = Date.now) {
25
111
  return Math.floor(now() / 1000) + resolveTtlSeconds(ttl);
26
112
  }
27
- /** Resolve a {@link TtlOption} to whole days, rounded up so the S3 lifecycle
28
- * expiration never fires before DynamoDB's own TTL sweep (which can lag up
29
- * to ~48h past the TTL timestamp) — expiring the S3 object first would leave
30
- * a live DynamoDB item pointing at a deleted payload. */
31
- function resolveTtlDaysCeil(ttl) {
32
- return Math.ceil(resolveTtlSeconds(ttl) / SECONDS_PER_DAY);
113
+ /**
114
+ * The `Days` of the S3 lifecycle expiration rule that backs a TTL.
115
+ *
116
+ * Accepts: `ttl` — as {@link resolveTtlSeconds}.
117
+ *
118
+ * Returns: the TTL rounded **up** to whole days plus
119
+ * {@link S3_LIFECYCLE_SWEEP_MARGIN_DAYS}, so always at least
120
+ * `1 + margin`.
121
+ *
122
+ * Throws: whatever {@link resolveTtlSeconds} throws.
123
+ *
124
+ * Guarantees: the object outlives the row that points at it. S3 expires an
125
+ * object at the first midnight UTC at least `Days` after creation, while
126
+ * DynamoDB may keep an expired item for up to 48 hours past its `ttl`
127
+ * (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html);
128
+ * the margin covers that lag, which a bare `{ days: N }` did not.
129
+ */
130
+ function lifecycleExpirationDays(ttl) {
131
+ return Math.ceil(resolveTtlSeconds(ttl) / SECONDS_PER_DAY) + exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS;
33
132
  }
34
- //# sourceMappingURL=ttl.js.map
@@ -1,9 +1,79 @@
1
- import type { ListNamespacesOperation } from '@langchain/langgraph-checkpoint';
1
+ /**
2
+ * Hides how the distinct namespaces are found and held in one order.
3
+ *
4
+ * A listing reads every live row it can reach — one partition when its first
5
+ * prefix condition opens with concrete labels, the whole table otherwise —
6
+ * keeps the namespaces every condition matches, truncates and deduplicates
7
+ * them, and sorts them by one pinned collation with its ties settled. A caller
8
+ * paging by `offset` gets the same order on every call and every host.
9
+ */
10
+ import type { MatchCondition } from '@langchain/langgraph-checkpoint';
11
+ import type { ParsedList } from '../internal/parse';
2
12
  import type { StoreContext } from '../internal/setup';
3
13
  /**
4
- * List distinct namespaces (truncated to `maxDepth`) that satisfy every match
5
- * condition, sorted, with offset/limit applied. A concrete prefix root scopes
6
- * the read to a native Query; otherwise it falls back to a filtered Scan.
14
+ * Whether `namespace` satisfies one match condition. `condition.matchType` is
15
+ * `'prefix'` or `'suffix'`, already refused otherwise by the parser that built
16
+ * `condition` (`parseMatchCondition` in `parse.ts`).
17
+ *
18
+ * Accepts: `condition.path` — elements, where `'*'` matches any one element;
19
+ * longer than the namespace never matches, and empty matches every namespace.
20
+ *
21
+ * Returns: whether the condition holds.
22
+ *
23
+ * Throws: nothing.
24
+ */
25
+ export declare function matchNamespace(namespace: string[], condition: MatchCondition): boolean;
26
+ /**
27
+ * Cap a namespace to at most `maxDepth` elements.
28
+ *
29
+ * Accepts: `maxDepth` — absent returns the namespace unchanged; otherwise a
30
+ * parsed positive integer (see `parseListOperation` for what a negative or
31
+ * zero value did here).
32
+ *
33
+ * Returns: the namespace, truncated from the end; shorter than `maxDepth` is
34
+ * returned whole.
35
+ *
36
+ * Throws: nothing.
37
+ */
38
+ export declare function truncateDepth(namespace: string[], maxDepth?: number): string[];
39
+ /**
40
+ * Leading concrete (non-wildcard) elements of the first prefix condition.
41
+ *
42
+ * Accepts: `conditions` — absent, empty, suffix-only, or a prefix condition
43
+ * starting with `'*'` all yield nothing to scope by.
44
+ *
45
+ * Returns: the concrete leading elements, which name a partition and a sort-key
46
+ * prefix the listing can be read from. An empty result means the listing cannot
47
+ * be scoped to one partition and falls back to a Scan.
48
+ *
49
+ * Throws: nothing.
50
+ *
51
+ * Guarantees: the root is only ever a *superset* of what the conditions select
52
+ * — every condition is still applied to each namespace read — so scoping can
53
+ * never drop a namespace that belongs in the answer.
54
+ */
55
+ export declare function prefixRoot(conditions?: MatchCondition[]): string[];
56
+ /**
57
+ * The distinct namespaces satisfying every match condition.
58
+ *
59
+ * Accepts: `op` — parsed; every match condition must hold, absent or empty
60
+ * matches every namespace. A concrete prefix root scopes the read to one
61
+ * partition's Query, and anything else — a suffix condition, a leading `*`, no
62
+ * conditions — spans the table and is one of the four reads allowed to Scan
63
+ * (`test/static/guards/scan-sites.ts`).
64
+ * `op.maxDepth` — namespaces are truncated to it and then
65
+ * deduplicated, so `['a','b']` and `['a','c']` list once as `['a']`.
66
+ * `op.offset` and `op.limit` — a `limit` of 0 returns an empty listing without reading.
67
+ *
68
+ * Returns: the namespaces, sorted, then `limit` of them from `offset`.
69
+ *
70
+ * Throws: `RESULT_TRUNCATED` when `maxScanItems` is reached while rows
71
+ * remain, so a partial listing is never returned as a complete one;
72
+ * `FORMAT_UNSUPPORTED` for a store item a newer release wrote.
73
+ *
74
+ * Guarantees: every live row is read — the answer is about which namespaces
75
+ * exist, and paging over it must not depend on which rows were read first. That
76
+ * is also why the sort is total (see {@link compareNamespaces}), and why a
77
+ * `limit` of 0 is answered ahead of the read rather than by slicing one.
7
78
  */
8
- export declare function listNamespaces(context: StoreContext, op: ListNamespacesOperation): Promise<string[][]>;
9
- //# sourceMappingURL=list-namespaces.d.ts.map
79
+ export declare function listNamespaces(context: StoreContext, op: ParsedList): Promise<string[][]>;
@@ -1,55 +1,197 @@
1
1
  "use strict";
2
+ /**
3
+ * Hides how the distinct namespaces are found and held in one order.
4
+ *
5
+ * A listing reads every live row it can reach — one partition when its first
6
+ * prefix condition opens with concrete labels, the whole table otherwise —
7
+ * keeps the namespaces every condition matches, truncates and deduplicates
8
+ * them, and sorts them by one pinned collation with its ties settled. A caller
9
+ * paging by `offset` gets the same order on every call and every host.
10
+ */
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.matchNamespace = matchNamespace;
13
+ exports.truncateDepth = truncateDepth;
14
+ exports.prefixRoot = prefixRoot;
3
15
  exports.listNamespaces = listNamespaces;
16
+ const clock_1 = require("../../shared/clock");
4
17
  const paginate_1 = require("../../shared/dynamodb/paginate");
5
- const scan_1 = require("../../shared/dynamodb/scan");
6
- const item_mapper_1 = require("../internal/item-mapper");
7
- const keys_1 = require("../internal/keys");
8
- const namespace_match_1 = require("../internal/namespace-match");
9
- const query_1 = require("../internal/query");
10
- const validation_1 = require("../internal/validation");
11
- function namespaceSource(context, op) {
12
- const root = (0, namespace_match_1.prefixRoot)(op.matchConditions);
18
+ const table_schema_1 = require("../../shared/dynamodb/table-schema");
19
+ const rows_1 = require("../internal/rows");
20
+ const WILDCARD = '*';
21
+ function segmentMatches(actual, path) {
22
+ return path.every((element, index) => element === WILDCARD || element === actual[index]);
23
+ }
24
+ /**
25
+ * Whether `namespace` satisfies one match condition. `condition.matchType` is
26
+ * `'prefix'` or `'suffix'`, already refused otherwise by the parser that built
27
+ * `condition` (`parseMatchCondition` in `parse.ts`).
28
+ *
29
+ * Accepts: `condition.path` — elements, where `'*'` matches any one element;
30
+ * longer than the namespace never matches, and empty matches every namespace.
31
+ *
32
+ * Returns: whether the condition holds.
33
+ *
34
+ * Throws: nothing.
35
+ */
36
+ function matchNamespace(namespace, condition) {
37
+ const { matchType, path } = condition;
38
+ if (path.length > namespace.length)
39
+ return false;
40
+ const slice = matchType === 'prefix'
41
+ ? namespace.slice(0, path.length)
42
+ : namespace.slice(namespace.length - path.length);
43
+ return segmentMatches(slice, path);
44
+ }
45
+ /**
46
+ * Cap a namespace to at most `maxDepth` elements.
47
+ *
48
+ * Accepts: `maxDepth` — absent returns the namespace unchanged; otherwise a
49
+ * parsed positive integer (see `parseListOperation` for what a negative or
50
+ * zero value did here).
51
+ *
52
+ * Returns: the namespace, truncated from the end; shorter than `maxDepth` is
53
+ * returned whole.
54
+ *
55
+ * Throws: nothing.
56
+ */
57
+ function truncateDepth(namespace, maxDepth) {
58
+ return maxDepth === undefined ? namespace : namespace.slice(0, maxDepth);
59
+ }
60
+ /**
61
+ * Leading concrete (non-wildcard) elements of the first prefix condition.
62
+ *
63
+ * Accepts: `conditions` — absent, empty, suffix-only, or a prefix condition
64
+ * starting with `'*'` all yield nothing to scope by.
65
+ *
66
+ * Returns: the concrete leading elements, which name a partition and a sort-key
67
+ * prefix the listing can be read from. An empty result means the listing cannot
68
+ * be scoped to one partition and falls back to a Scan.
69
+ *
70
+ * Throws: nothing.
71
+ *
72
+ * Guarantees: the root is only ever a *superset* of what the conditions select
73
+ * — every condition is still applied to each namespace read — so scoping can
74
+ * never drop a namespace that belongs in the answer.
75
+ */
76
+ function prefixRoot(conditions) {
77
+ const prefixCondition = conditions?.find((condition) => condition.matchType === 'prefix');
78
+ if (!prefixCondition)
79
+ return [];
80
+ const root = [];
81
+ for (const element of prefixCondition.path) {
82
+ if (element === WILDCARD)
83
+ break;
84
+ root.push(element);
85
+ }
86
+ return root;
87
+ }
88
+ function namespaceSource(context, op, now) {
89
+ const root = prefixRoot(op.matchConditions);
13
90
  if (root.length > 0) {
14
91
  return (0, paginate_1.paginateQuery)({
92
+ retry: context.retry,
15
93
  client: context.client,
16
- params: (0, query_1.scopedQuery)(context.tableName, root),
94
+ params: (0, table_schema_1.withoutExpired)((0, rows_1.projectKeys)((0, rows_1.scopedQuery)(context.tableName, root)), now),
17
95
  maxItems: context.maxScanItems,
18
96
  });
19
97
  }
20
- return (0, scan_1.paginateScan)({
98
+ return (0, paginate_1.paginateScan)({
99
+ retry: context.retry,
21
100
  client: context.client,
22
- params: (0, query_1.storeScan)(context.tableName),
101
+ params: (0, table_schema_1.withoutExpired)((0, rows_1.projectKeys)((0, rows_1.storeScan)(context.tableName)), now),
23
102
  maxItems: context.maxScanItems,
24
103
  });
25
104
  }
26
105
  /**
27
- * List distinct namespaces (truncated to `maxDepth`) that satisfy every match
28
- * condition, sorted, with offset/limit applied. A concrete prefix root scopes
29
- * the read to a native Query; otherwise it falls back to a filtered Scan.
106
+ * The collation namespaces are sorted by, pinned to one locale.
107
+ *
108
+ * `InMemoryStore` sorts with bare `localeCompare`
109
+ * (`@langchain/langgraph-checkpoint@1.1.5` `dist/store/memory.js:119`), which
110
+ * means "in the host's default locale" — and locales disagree: `'ä'` sorts
111
+ * before `'z'` in German and after it in Swedish. A listing paged by `offset`
112
+ * is a position a caller holds between two calls, so an order that changes
113
+ * with the host answering the call cuts the same listing in two places and the
114
+ * caller misses one namespace and sees another twice. Matching the reference
115
+ * there is not possible anyway, because the reference's own order varies with
116
+ * its host; what is possible is matching it on every host that agrees with
117
+ * this locale, and being deterministic on the rest.
118
+ *
119
+ * `en` is the locale to pin because ICU applies no tailoring to it — its order
120
+ * is the untailored root order — and because it is the one locale a Node built
121
+ * with small ICU still carries, so this cannot degrade to a different order on
122
+ * a minimal runtime.
123
+ */
124
+ const NAMESPACE_COLLATOR = new Intl.Collator('en');
125
+ /**
126
+ * Order two namespaces by the reference store's collation, pinned, with its
127
+ * ties settled.
128
+ *
129
+ * The collation is {@link NAMESPACE_COLLATOR} on the joined namespace — the
130
+ * comparison `InMemoryStore` makes, held to one locale. Collation calls some
131
+ * *distinct* strings equal — `'café'` written precomposed and decomposed is
132
+ * one such pair — and the reference then leaves their order to insertion
133
+ * order. Here that would be the order DynamoDB happened to return the rows in,
134
+ * so the same listing could place a page boundary between them differently on
135
+ * two calls and a page could skip one namespace while repeating another. The
136
+ * tie-break settles exactly those pairs and never reorders a pair the
137
+ * collation itself orders.
138
+ */
139
+ function compareNamespaces(a, b) {
140
+ const left = a.join(table_schema_1.KEY_SEPARATOR);
141
+ const right = b.join(table_schema_1.KEY_SEPARATOR);
142
+ const collated = NAMESPACE_COLLATOR.compare(left, right);
143
+ // `Number(left > right)` keeps the comparator total: 0 for a pair that really is equal.
144
+ return collated !== 0 ? collated : left < right ? -1 : Number(left > right);
145
+ }
146
+ /**
147
+ * The distinct namespaces satisfying every match condition.
148
+ *
149
+ * Accepts: `op` — parsed; every match condition must hold, absent or empty
150
+ * matches every namespace. A concrete prefix root scopes the read to one
151
+ * partition's Query, and anything else — a suffix condition, a leading `*`, no
152
+ * conditions — spans the table and is one of the four reads allowed to Scan
153
+ * (`test/static/guards/scan-sites.ts`).
154
+ * `op.maxDepth` — namespaces are truncated to it and then
155
+ * deduplicated, so `['a','b']` and `['a','c']` list once as `['a']`.
156
+ * `op.offset` and `op.limit` — a `limit` of 0 returns an empty listing without reading.
157
+ *
158
+ * Returns: the namespaces, sorted, then `limit` of them from `offset`.
159
+ *
160
+ * Throws: `RESULT_TRUNCATED` when `maxScanItems` is reached while rows
161
+ * remain, so a partial listing is never returned as a complete one;
162
+ * `FORMAT_UNSUPPORTED` for a store item a newer release wrote.
163
+ *
164
+ * Guarantees: every live row is read — the answer is about which namespaces
165
+ * exist, and paging over it must not depend on which rows were read first. That
166
+ * is also why the sort is total (see {@link compareNamespaces}), and why a
167
+ * `limit` of 0 is answered ahead of the read rather than by slicing one.
30
168
  */
31
169
  async function listNamespaces(context, op) {
32
- (0, validation_1.validatePaging)(op.offset, op.limit);
33
- (0, validation_1.validateMaxDepth)(op.maxDepth);
170
+ // A zero page is answered before the read. This listing is the one that can
171
+ // never stop early — every live row must be seen before the namespaces can
172
+ // be sorted and sliced — so scanning the whole table to slice nothing out of
173
+ // it is the entire cost for none of the answer.
174
+ if (op.limit === 0)
175
+ return [];
176
+ const now = (0, clock_1.nowSeconds)();
34
177
  const seen = new Set();
35
178
  const namespaces = [];
36
- for await (const raw of namespaceSource(context, op)) {
37
- const record = (0, item_mapper_1.narrowStoreRecord)(raw);
38
- if (!record)
179
+ for await (const raw of namespaceSource(context, op, now)) {
180
+ const record = (0, rows_1.parseStoreRow)(raw);
181
+ if (!record || (0, table_schema_1.isExpiredRow)(record, now))
39
182
  continue;
40
183
  const namespace = record.namespace;
41
184
  if (op.matchConditions &&
42
- !op.matchConditions.every((condition) => (0, namespace_match_1.matchNamespace)(namespace, condition))) {
185
+ !op.matchConditions.every((condition) => matchNamespace(namespace, condition))) {
43
186
  continue;
44
187
  }
45
- const truncated = (0, namespace_match_1.truncateDepth)(namespace, op.maxDepth);
46
- const dedupeKey = truncated.join(keys_1.NAMESPACE_SEPARATOR);
188
+ const truncated = truncateDepth(namespace, op.maxDepth);
189
+ const dedupeKey = truncated.join(table_schema_1.KEY_SEPARATOR);
47
190
  if (seen.has(dedupeKey))
48
191
  continue;
49
192
  seen.add(dedupeKey);
50
193
  namespaces.push(truncated);
51
194
  }
52
- namespaces.sort((a, b) => a.join(keys_1.NAMESPACE_SEPARATOR).localeCompare(b.join(keys_1.NAMESPACE_SEPARATOR)));
195
+ namespaces.sort(compareNamespaces);
53
196
  return namespaces.slice(op.offset, op.offset + op.limit);
54
197
  }
55
- //# sourceMappingURL=list-namespaces.js.map
@@ -1,11 +1,36 @@
1
- import type { PutOperation } from '@langchain/langgraph-checkpoint';
1
+ /**
2
+ * Hides the order a put happens in.
3
+ *
4
+ * A put reads the row it replaces for its `createdAt`, embeds once — a vector
5
+ * per extracted path onto the row, or one vector for the `vectorBackend`,
6
+ * never both — writes the row, and only then syncs the backend, best-effort.
7
+ * A `null` value takes the delete path instead. A caller hands over an item;
8
+ * that the table commits first and the vector copy follows is decided here.
9
+ */
10
+ import type { ParsedDelete, ParsedPut } from '../internal/parse';
2
11
  import type { StoreContext } from '../internal/setup';
3
12
  /**
4
- * Store, update, or delete an item (null deletes). The value is encoded
5
- * (optional compression/S3 offload, nonced per call so a failed write can never
6
- * delete the previous payload) and `createdAt` is preserved across updates; a
7
- * computed embedding is sent to a configured `vectorBackend` instead of being
8
- * stored on the item — DynamoDB always holds the canonical item.
13
+ * Store, update or delete an item.
14
+ *
15
+ * Accepts: `op` — parsed; a `ParsedDelete` removes the item, a `ParsedPut` is
16
+ * stored, its value encoded with optional compression and S3 offload under
17
+ * this row's own path, in an object named by this put's own id. `op.index` —
18
+ * `false` stores the item without indexing it and clears any vector it had, an
19
+ * array overrides the configured fields for this put, and absent uses the
20
+ * store's configuration.
21
+ *
22
+ * Returns: nothing. Deleting an item that is not there is not an error.
23
+ *
24
+ * Throws: `VALIDATION` naming `value` for a value that JSON cannot represent —
25
+ * refused at the write rather than stored as a row that can never be read back;
26
+ * `S3_OFFLOAD_FAILED`; whatever the write throws.
27
+ *
28
+ * Guarantees: DynamoDB holds the canonical item — the vector index is synced
29
+ * afterwards and best-effort, so a backend outage never fails a put or leaves a
30
+ * half-written item. `createdAt` survives every update. The superseded payload
31
+ * is deleted only once the new row is committed, and this put's own upload
32
+ * only once a read proves its write did not land. Neither release reads the
33
+ * row first: each put uploads under a key ending in an id of its own, so the
34
+ * object a put uploads is named only by that put's own rows.
9
35
  */
10
- export declare function putItem(context: StoreContext, op: PutOperation): Promise<void>;
11
- //# sourceMappingURL=put.d.ts.map
36
+ export declare function putItem(context: StoreContext, op: ParsedPut | ParsedDelete): Promise<void>;
@@ -1,85 +1,78 @@
1
1
  "use strict";
2
+ /**
3
+ * Hides the order a put happens in.
4
+ *
5
+ * A put reads the row it replaces for its `createdAt`, embeds once — a vector
6
+ * per extracted path onto the row, or one vector for the `vectorBackend`,
7
+ * never both — writes the row, and only then syncs the backend, best-effort.
8
+ * A `null` value takes the delete path instead. A caller hands over an item;
9
+ * that the table commits first and the vector copy follows is decided here.
10
+ */
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
12
  exports.putItem = putItem;
4
13
  const node_crypto_1 = require("node:crypto");
5
14
  const clock_1 = require("../../shared/clock");
6
- const descriptor_keys_1 = require("../../shared/codec/descriptor-keys");
7
- const orphans_1 = require("../../shared/codec/s3/orphans");
8
- const retry_1 = require("../../shared/dynamodb/retry");
9
15
  const ttl_1 = require("../../shared/validation/ttl");
10
- const index_sync_1 = require("../internal/index-sync");
11
- const item_mapper_1 = require("../internal/item-mapper");
12
- const keys_1 = require("../internal/keys");
13
- const persist_1 = require("../internal/persist");
14
- const read_existing_1 = require("../internal/read-existing");
16
+ const item_write_1 = require("../internal/item-write");
17
+ const rows_1 = require("../internal/rows");
15
18
  const semantic_search_1 = require("../internal/semantic-search");
16
- const validation_1 = require("../internal/validation");
17
- const write_verify_1 = require("../internal/write-verify");
19
+ const vector_index_1 = require("../internal/vector-index");
18
20
  /**
19
- * Delete the item and, when a vector backend is configured, drop its vector.
20
- *
21
- * A retry-exhausted failure is *ambiguous*: the delete may have landed
22
- * server-side with only its acknowledgement lost. Mirroring `persistRecord`'s
23
- * treatment of an ambiguous put, that case is resolved with a
24
- * strongly-consistent read — if the row is genuinely gone the delete
25
- * succeeded, so the S3-orphan cleanup and the vector-backend delete must still
26
- * run rather than being skipped for a write that actually happened. Any other
27
- * failure, or a row still present, propagates unchanged.
21
+ * The vectors a put stores on the row: one per extracted path, scored by best
22
+ * match on read. Not computed when a `vectorBackend` holds the vectors, which
23
+ * takes a single vector per item instead (see {@link itemVector}).
28
24
  */
29
- async function deleteStoreItem(context, op, pk, sk) {
30
- const existing = context.offloader ? await (0, read_existing_1.readExisting)(context, pk, sk) : undefined;
31
- try {
32
- await (0, retry_1.withDynamoDBRetry)(() => context.client.delete({ TableName: context.tableName, Key: { PK: pk, SK: sk } }));
33
- }
34
- catch (error) {
35
- const landed = (0, write_verify_1.isRetryExhausted)(error) && (await (0, write_verify_1.rowIsAbsent)(context, { PK: pk, SK: sk }));
36
- if (!landed)
37
- throw error;
38
- }
39
- if (context.offloader) {
40
- await (0, orphans_1.cleanUpS3Orphans)(context.offloader, (0, descriptor_keys_1.collectS3Keys)(existing?.value ? [existing.value] : []), 'store.delete', context.logger);
41
- }
42
- if (context.vectorBackend) {
43
- await (0, index_sync_1.syncVectorIndex)(context.vectorBackend, op.namespace, op.key, undefined, context.logger);
44
- }
45
- }
46
- /** Compute the embedding for a put, honoring `op.index` (false disables it). */
47
- async function resolveEmbedding(context, op, value) {
25
+ async function resolvePassages(context, op, value) {
48
26
  if (op.index === false)
49
27
  return undefined;
50
- return (0, semantic_search_1.embedValue)(context, value, Array.isArray(op.index) ? op.index : undefined);
28
+ return (0, semantic_search_1.embedPassages)(context, value, op.index);
51
29
  }
52
30
  /**
53
- * Store, update, or delete an item (null deletes). The value is encoded
54
- * (optional compression/S3 offload, nonced per call so a failed write can never
55
- * delete the previous payload) and `createdAt` is preserved across updates; a
56
- * computed embedding is sent to a configured `vectorBackend` instead of being
57
- * stored on the item — DynamoDB always holds the canonical item.
31
+ * Store, update or delete an item.
32
+ *
33
+ * Accepts: `op` — parsed; a `ParsedDelete` removes the item, a `ParsedPut` is
34
+ * stored, its value encoded with optional compression and S3 offload under
35
+ * this row's own path, in an object named by this put's own id. `op.index` —
36
+ * `false` stores the item without indexing it and clears any vector it had, an
37
+ * array overrides the configured fields for this put, and absent uses the
38
+ * store's configuration.
39
+ *
40
+ * Returns: nothing. Deleting an item that is not there is not an error.
41
+ *
42
+ * Throws: `VALIDATION` naming `value` for a value that JSON cannot represent —
43
+ * refused at the write rather than stored as a row that can never be read back;
44
+ * `S3_OFFLOAD_FAILED`; whatever the write throws.
45
+ *
46
+ * Guarantees: DynamoDB holds the canonical item — the vector index is synced
47
+ * afterwards and best-effort, so a backend outage never fails a put or leaves a
48
+ * half-written item. `createdAt` survives every update. The superseded payload
49
+ * is deleted only once the new row is committed, and this put's own upload
50
+ * only once a read proves its write did not land. Neither release reads the
51
+ * row first: each put uploads under a key ending in an id of its own, so the
52
+ * object a put uploads is named only by that put's own rows.
58
53
  */
59
54
  async function putItem(context, op) {
60
- (0, validation_1.validateNamespace)(op.namespace);
61
- (0, validation_1.validateKey)(op.key);
62
- const pk = (0, keys_1.partitionKey)(op.namespace);
63
- const sk = (0, keys_1.sortKey)(op.namespace, op.key);
64
- if (op.value === null) {
65
- await deleteStoreItem(context, op, pk, sk);
55
+ if (op.kind === 'delete') {
56
+ await (0, item_write_1.deleteStoreItem)(context, op.address);
66
57
  return;
67
58
  }
59
+ const { namespace, key } = op.address;
68
60
  const value = op.value;
69
61
  const timestamp = (0, clock_1.nowIso)();
70
- const existing = await (0, read_existing_1.readExisting)(context, pk, sk);
71
- const embedding = await resolveEmbedding(context, op, value);
62
+ const existing = await (0, rows_1.readExisting)(context, (0, rows_1.itemRowKey)(op.address));
63
+ // The two indexing modes are exclusive, so only one of them embeds: the row
64
+ // carries a vector per extracted path, while a configured backend takes one
65
+ // vector per item because that is what its `upsert` contract addresses.
66
+ const embedding = await (0, vector_index_1.itemVector)(context, op);
67
+ const embeddings = context.vectorBackend ? undefined : await resolvePassages(context, op, value);
72
68
  const ttlTimestamp = context.ttl ? (0, ttl_1.calculateTtlTimestamp)(context.ttl) : undefined;
73
- const record = await (0, item_mapper_1.buildStoreItem)(context, op.namespace, op.key, value, {
69
+ const record = await (0, rows_1.buildStoreRow)(context, { namespace, key }, value, {
74
70
  createdAt: existing.createdAt ?? timestamp,
75
71
  updatedAt: timestamp,
76
- embedding: context.vectorBackend ? undefined : embedding,
72
+ embeddings,
77
73
  ttlTimestamp,
78
- nonce: (0, node_crypto_1.randomUUID)(),
74
+ rev: (0, node_crypto_1.randomUUID)(),
79
75
  });
80
- await (0, persist_1.persistRecord)(context, record, existing);
81
- if (context.vectorBackend) {
82
- await (0, index_sync_1.syncVectorIndex)(context.vectorBackend, op.namespace, op.key, embedding, context.logger);
83
- }
76
+ await (0, item_write_1.persistRow)(context, record, existing);
77
+ await (0, vector_index_1.syncItemVector)(context, op.address, embedding);
84
78
  }
85
- //# sourceMappingURL=put.js.map