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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/README.md +390 -193
  2. package/dist/{backfill → cjs/backfill}/backfill.d.ts +15 -12
  3. package/dist/cjs/backfill/backfill.js +177 -0
  4. package/dist/{checkpointer → cjs/checkpointer}/actions/delete-thread.d.ts +1 -1
  5. package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
  6. package/dist/{checkpointer → cjs/checkpointer}/actions/get-tuple.d.ts +4 -3
  7. package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
  8. package/dist/{checkpointer → cjs/checkpointer}/actions/list.d.ts +7 -4
  9. package/dist/cjs/checkpointer/actions/list.js +70 -0
  10. package/dist/{checkpointer → cjs/checkpointer}/actions/put-writes.d.ts +8 -6
  11. package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
  12. package/dist/{checkpointer → cjs/checkpointer}/actions/put.d.ts +21 -15
  13. package/dist/cjs/checkpointer/actions/put.js +79 -0
  14. package/dist/{checkpointer → cjs/checkpointer}/internal/delta-history.d.ts +38 -26
  15. package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
  16. package/dist/{checkpointer → cjs/checkpointer}/internal/listing.d.ts +4 -4
  17. package/dist/cjs/checkpointer/internal/listing.js +104 -0
  18. package/dist/{checkpointer → cjs/checkpointer}/internal/parse.d.ts +51 -15
  19. package/dist/cjs/checkpointer/internal/parse.js +184 -0
  20. package/dist/{checkpointer → cjs/checkpointer}/internal/pending-writes.d.ts +64 -25
  21. package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
  22. package/dist/{checkpointer → cjs/checkpointer}/internal/read.d.ts +15 -10
  23. package/dist/cjs/checkpointer/internal/read.js +132 -0
  24. package/dist/{checkpointer → cjs/checkpointer}/internal/rows.d.ts +94 -21
  25. package/dist/cjs/checkpointer/internal/rows.js +356 -0
  26. package/dist/{checkpointer → cjs/checkpointer}/internal/setup.d.ts +13 -20
  27. package/dist/cjs/checkpointer/internal/setup.js +25 -0
  28. package/dist/{checkpointer → cjs/checkpointer}/saver.d.ts +72 -36
  29. package/dist/cjs/checkpointer/saver.js +56 -0
  30. package/dist/{checkpointer → cjs/checkpointer}/types.d.ts +1 -1
  31. package/dist/cjs/checkpointer/types.js +2 -0
  32. package/dist/{factory → cjs/factory}/factory.d.ts +25 -20
  33. package/dist/cjs/factory/factory.js +137 -0
  34. package/dist/{factory → cjs/factory}/types.d.ts +12 -12
  35. package/dist/cjs/factory/types.js +2 -0
  36. package/dist/{history → cjs/history}/actions/add-messages.d.ts +18 -10
  37. package/dist/cjs/history/actions/add-messages.js +17 -0
  38. package/dist/{history → cjs/history}/actions/clear.d.ts +1 -1
  39. package/dist/cjs/history/actions/clear.js +29 -0
  40. package/dist/{history → cjs/history}/actions/get-messages.d.ts +11 -9
  41. package/dist/cjs/history/actions/get-messages.js +58 -0
  42. package/dist/{history → cjs/history}/actions/list-sessions.d.ts +3 -3
  43. package/dist/cjs/history/actions/list-sessions.js +67 -0
  44. package/dist/{history → cjs/history}/actions/reconcile-count.d.ts +13 -9
  45. package/dist/cjs/history/actions/reconcile-count.js +8 -0
  46. package/dist/{history → cjs/history}/chat-message-history.d.ts +62 -30
  47. package/dist/cjs/history/chat-message-history.js +61 -0
  48. package/dist/{history → cjs/history}/internal/append.d.ts +64 -32
  49. package/dist/cjs/history/internal/append.js +267 -0
  50. package/dist/{history → cjs/history}/internal/message-read.d.ts +3 -3
  51. package/dist/cjs/history/internal/message-read.js +93 -0
  52. package/dist/{history → cjs/history}/internal/parse.d.ts +2 -2
  53. package/dist/cjs/history/internal/parse.js +113 -0
  54. package/dist/{history → cjs/history}/internal/rows.d.ts +11 -10
  55. package/dist/cjs/history/internal/rows.js +96 -0
  56. package/dist/{history → cjs/history}/internal/session.d.ts +41 -22
  57. package/dist/cjs/history/internal/session.js +296 -0
  58. package/dist/{history → cjs/history}/internal/setup.d.ts +2 -2
  59. package/dist/cjs/history/internal/setup.js +60 -0
  60. package/dist/{history → cjs/history}/session-adapter.d.ts +0 -6
  61. package/dist/cjs/history/session-adapter.js +38 -0
  62. package/dist/{history → cjs/history}/types.d.ts +18 -15
  63. package/dist/cjs/history/types.js +2 -0
  64. package/dist/{index.d.ts → cjs/index.d.ts} +27 -27
  65. package/dist/cjs/index.js +25 -0
  66. package/dist/cjs/package.json +1 -0
  67. package/dist/{shared → cjs/shared}/adapter.d.ts +27 -16
  68. package/dist/cjs/shared/adapter.js +70 -0
  69. package/dist/cjs/shared/clock.js +14 -0
  70. package/dist/{shared → cjs/shared}/codec/codec.d.ts +37 -20
  71. package/dist/cjs/shared/codec/codec.js +162 -0
  72. package/dist/{shared → cjs/shared}/codec/compression.d.ts +9 -4
  73. package/dist/cjs/shared/codec/compression.js +45 -0
  74. package/dist/cjs/shared/codec/json-serde.js +58 -0
  75. package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +2 -1
  76. package/dist/cjs/shared/codec/s3/client-types.js +6 -0
  77. package/dist/{shared → cjs/shared}/codec/s3/client.d.ts +25 -7
  78. package/dist/cjs/shared/codec/s3/client.js +78 -0
  79. package/dist/{shared → cjs/shared}/codec/s3/config.d.ts +12 -7
  80. package/dist/cjs/shared/codec/s3/config.js +92 -0
  81. package/dist/{shared → cjs/shared}/codec/s3/lifecycle.d.ts +71 -17
  82. package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
  83. package/dist/{shared → cjs/shared}/codec/s3/offloader.d.ts +42 -29
  84. package/dist/cjs/shared/codec/s3/offloader.js +289 -0
  85. package/dist/cjs/shared/concurrency.js +31 -0
  86. package/dist/{shared → cjs/shared}/dynamodb/abort.d.ts +2 -2
  87. package/dist/cjs/shared/dynamodb/abort.js +16 -0
  88. package/dist/{shared → cjs/shared}/dynamodb/batch-write.d.ts +2 -2
  89. package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
  90. package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
  91. package/dist/{shared → cjs/shared}/dynamodb/client.d.ts +24 -22
  92. package/dist/cjs/shared/dynamodb/client.js +40 -0
  93. package/dist/{shared → cjs/shared}/dynamodb/idempotent-write.d.ts +64 -19
  94. package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
  95. package/dist/{shared → cjs/shared}/dynamodb/paginate.d.ts +2 -2
  96. package/dist/cjs/shared/dynamodb/paginate.js +90 -0
  97. package/dist/{shared → cjs/shared}/dynamodb/partition-delete.d.ts +6 -6
  98. package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
  99. package/dist/{shared → cjs/shared}/dynamodb/recency-index.d.ts +27 -15
  100. package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
  101. package/dist/{shared → cjs/shared}/dynamodb/retry.d.ts +37 -6
  102. package/dist/cjs/shared/dynamodb/retry.js +193 -0
  103. package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
  104. package/dist/cjs/shared/dynamodb/row-size.js +30 -0
  105. package/dist/{shared → cjs/shared}/dynamodb/table-schema.d.ts +27 -18
  106. package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
  107. package/dist/{shared → cjs/shared}/errors/base-error.d.ts +42 -7
  108. package/dist/cjs/shared/errors/base-error.js +73 -0
  109. package/dist/{shared → cjs/shared}/errors/boundary.d.ts +29 -14
  110. package/dist/cjs/shared/errors/boundary.js +61 -0
  111. package/dist/cjs/shared/errors/classify.d.ts +206 -0
  112. package/dist/cjs/shared/errors/classify.js +232 -0
  113. package/dist/{shared → cjs/shared}/errors/error-code.d.ts +17 -10
  114. package/dist/cjs/shared/errors/error-code.js +27 -0
  115. package/dist/{shared → cjs/shared}/errors/errors.d.ts +75 -9
  116. package/dist/cjs/shared/errors/errors.js +123 -0
  117. package/dist/cjs/shared/logging/logger.js +30 -0
  118. package/dist/{shared → cjs/shared}/logging/redaction.d.ts +8 -4
  119. package/dist/cjs/shared/logging/redaction.js +145 -0
  120. package/dist/{shared → cjs/shared}/logging/secret-patterns.d.ts +30 -7
  121. package/dist/cjs/shared/logging/secret-patterns.js +93 -0
  122. package/dist/cjs/shared/logging/truncate.js +31 -0
  123. package/dist/{shared → cjs/shared}/options.d.ts +27 -11
  124. package/dist/cjs/shared/options.js +2 -0
  125. package/dist/cjs/shared/ulid.js +83 -0
  126. package/dist/{shared → cjs/shared}/validation/collaborators.d.ts +21 -2
  127. package/dist/cjs/shared/validation/collaborators.js +79 -0
  128. package/dist/{shared → cjs/shared}/validation/option-shape.d.ts +7 -5
  129. package/dist/cjs/shared/validation/option-shape.js +31 -0
  130. package/dist/{shared → cjs/shared}/validation/options.d.ts +4 -4
  131. package/dist/cjs/shared/validation/options.js +166 -0
  132. package/dist/cjs/shared/validation/primitives.js +114 -0
  133. package/dist/{shared → cjs/shared}/validation/ttl.d.ts +26 -9
  134. package/dist/cjs/shared/validation/ttl.js +52 -0
  135. package/dist/{store → cjs/store}/actions/list-namespaces.d.ts +5 -5
  136. package/dist/cjs/store/actions/list-namespaces.js +92 -0
  137. package/dist/{store → cjs/store}/actions/put.d.ts +11 -4
  138. package/dist/cjs/store/actions/put.js +49 -0
  139. package/dist/{store → cjs/store}/actions/reconcile-vector-index.d.ts +5 -5
  140. package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
  141. package/dist/{store → cjs/store}/actions/search.d.ts +2 -2
  142. package/dist/cjs/store/actions/search.js +26 -0
  143. package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
  144. package/dist/cjs/store/internal/batch-plan.js +32 -0
  145. package/dist/{store → cjs/store}/internal/filter.d.ts +3 -3
  146. package/dist/cjs/store/internal/filter.js +64 -0
  147. package/dist/cjs/store/internal/get-item.d.ts +77 -0
  148. package/dist/cjs/store/internal/get-item.js +58 -0
  149. package/dist/{store → cjs/store}/internal/item-write.d.ts +72 -32
  150. package/dist/cjs/store/internal/item-write.js +181 -0
  151. package/dist/{store → cjs/store}/internal/parse.d.ts +15 -10
  152. package/dist/cjs/store/internal/parse.js +180 -0
  153. package/dist/{store → cjs/store}/internal/rows.d.ts +38 -34
  154. package/dist/cjs/store/internal/rows.js +166 -0
  155. package/dist/{store → cjs/store}/internal/semantic-search.d.ts +2 -2
  156. package/dist/cjs/store/internal/semantic-search.js +211 -0
  157. package/dist/{store → cjs/store}/internal/setup.d.ts +10 -15
  158. package/dist/cjs/store/internal/setup.js +103 -0
  159. package/dist/{store → cjs/store}/internal/table-search.d.ts +5 -5
  160. package/dist/cjs/store/internal/table-search.js +123 -0
  161. package/dist/{store → cjs/store}/internal/vector-index.d.ts +26 -15
  162. package/dist/cjs/store/internal/vector-index.js +269 -0
  163. package/dist/{store → cjs/store}/store.d.ts +82 -39
  164. package/dist/cjs/store/store.js +97 -0
  165. package/dist/{store → cjs/store}/types.d.ts +25 -10
  166. package/dist/cjs/store/types.js +2 -0
  167. package/dist/cjs/store/vector-backend.js +4 -0
  168. package/dist/esm/backfill/backfill.d.ts +171 -0
  169. package/dist/esm/backfill/backfill.js +170 -0
  170. package/dist/{checkpointer/actions/delete-thread.js → esm/checkpointer/actions/delete-thread.d.ts} +4 -26
  171. package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
  172. package/dist/{checkpointer/actions/get-tuple.js → esm/checkpointer/actions/get-tuple.d.ts} +7 -24
  173. package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
  174. package/dist/esm/checkpointer/actions/list.d.ts +55 -0
  175. package/dist/esm/checkpointer/actions/list.js +67 -0
  176. package/dist/{checkpointer/actions/put-writes.js → esm/checkpointer/actions/put-writes.d.ts} +10 -37
  177. package/dist/esm/checkpointer/actions/put-writes.js +18 -0
  178. package/dist/esm/checkpointer/actions/put.d.ts +95 -0
  179. package/dist/esm/checkpointer/actions/put.js +75 -0
  180. package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
  181. package/dist/esm/checkpointer/internal/delta-history.js +126 -0
  182. package/dist/{checkpointer/internal/listing.js → esm/checkpointer/internal/listing.d.ts} +22 -118
  183. package/dist/esm/checkpointer/internal/listing.js +95 -0
  184. package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
  185. package/dist/esm/checkpointer/internal/parse.js +169 -0
  186. package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
  187. package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
  188. package/dist/esm/checkpointer/internal/read.d.ts +135 -0
  189. package/dist/esm/checkpointer/internal/read.js +125 -0
  190. package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
  191. package/dist/esm/checkpointer/internal/rows.js +323 -0
  192. package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
  193. package/dist/esm/checkpointer/internal/setup.js +21 -0
  194. package/dist/{checkpointer/saver.js → esm/checkpointer/saver.d.ts} +84 -87
  195. package/dist/esm/checkpointer/saver.js +52 -0
  196. package/dist/esm/checkpointer/types.d.ts +51 -0
  197. package/dist/esm/checkpointer/types.js +1 -0
  198. package/dist/esm/factory/factory.d.ts +154 -0
  199. package/dist/esm/factory/factory.js +133 -0
  200. package/dist/esm/factory/types.d.ts +76 -0
  201. package/dist/esm/factory/types.js +1 -0
  202. package/dist/{history/actions/add-messages.js → esm/history/actions/add-messages.d.ts} +20 -26
  203. package/dist/esm/history/actions/add-messages.js +14 -0
  204. package/dist/{history/actions/clear.js → esm/history/actions/clear.d.ts} +4 -35
  205. package/dist/esm/history/actions/clear.js +26 -0
  206. package/dist/esm/history/actions/get-messages.d.ts +60 -0
  207. package/dist/esm/history/actions/get-messages.js +55 -0
  208. package/dist/esm/history/actions/list-sessions.d.ts +55 -0
  209. package/dist/esm/history/actions/list-sessions.js +64 -0
  210. package/dist/{history/actions/reconcile-count.js → esm/history/actions/reconcile-count.d.ts} +14 -16
  211. package/dist/esm/history/actions/reconcile-count.js +5 -0
  212. package/dist/{history/chat-message-history.js → esm/history/chat-message-history.d.ts} +76 -87
  213. package/dist/esm/history/chat-message-history.js +57 -0
  214. package/dist/esm/history/internal/append.d.ts +244 -0
  215. package/dist/esm/history/internal/append.js +259 -0
  216. package/dist/esm/history/internal/message-read.d.ts +84 -0
  217. package/dist/esm/history/internal/message-read.js +89 -0
  218. package/dist/esm/history/internal/parse.d.ts +153 -0
  219. package/dist/esm/history/internal/parse.js +105 -0
  220. package/dist/{history/internal/rows.js → esm/history/internal/rows.d.ts} +58 -112
  221. package/dist/esm/history/internal/rows.js +83 -0
  222. package/dist/esm/history/internal/session.d.ts +350 -0
  223. package/dist/esm/history/internal/session.js +285 -0
  224. package/dist/esm/history/internal/setup.d.ts +64 -0
  225. package/dist/esm/history/internal/setup.js +56 -0
  226. package/dist/{history/session-adapter.js → esm/history/session-adapter.d.ts} +25 -39
  227. package/dist/esm/history/session-adapter.js +34 -0
  228. package/dist/esm/history/types.d.ts +102 -0
  229. package/dist/esm/history/types.js +1 -0
  230. package/dist/esm/index.d.ts +53 -0
  231. package/dist/esm/index.js +10 -0
  232. package/dist/esm/shared/adapter.d.ts +146 -0
  233. package/dist/esm/shared/adapter.js +65 -0
  234. package/dist/{shared/clock.js → esm/shared/clock.d.ts} +3 -14
  235. package/dist/esm/shared/clock.js +9 -0
  236. package/dist/esm/shared/codec/codec.d.ts +336 -0
  237. package/dist/esm/shared/codec/codec.js +150 -0
  238. package/dist/esm/shared/codec/compression.d.ts +66 -0
  239. package/dist/esm/shared/codec/compression.js +40 -0
  240. package/dist/esm/shared/codec/json-serde.d.ts +80 -0
  241. package/dist/esm/shared/codec/json-serde.js +54 -0
  242. package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
  243. package/dist/esm/shared/codec/s3/client-types.js +3 -0
  244. package/dist/esm/shared/codec/s3/client.d.ts +63 -0
  245. package/dist/esm/shared/codec/s3/client.js +40 -0
  246. package/dist/{shared/codec/s3/config.js → esm/shared/codec/s3/config.d.ts} +45 -93
  247. package/dist/esm/shared/codec/s3/config.js +79 -0
  248. package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
  249. package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
  250. package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
  251. package/dist/esm/shared/codec/s3/offloader.js +278 -0
  252. package/dist/{shared/concurrency.js → esm/shared/concurrency.d.ts} +2 -37
  253. package/dist/esm/shared/concurrency.js +27 -0
  254. package/dist/{shared/dynamodb/abort.js → esm/shared/dynamodb/abort.d.ts} +4 -16
  255. package/dist/esm/shared/dynamodb/abort.js +12 -0
  256. package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
  257. package/dist/esm/shared/dynamodb/batch-write.js +74 -0
  258. package/dist/{shared/dynamodb/cancellation.js → esm/shared/dynamodb/cancellation.d.ts} +25 -53
  259. package/dist/esm/shared/dynamodb/cancellation.js +30 -0
  260. package/dist/{shared/dynamodb/client.js → esm/shared/dynamodb/client.d.ts} +74 -64
  261. package/dist/esm/shared/dynamodb/client.js +35 -0
  262. package/dist/{shared/dynamodb/idempotent-write.js → esm/shared/dynamodb/idempotent-write.d.ts} +172 -169
  263. package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
  264. package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
  265. package/dist/esm/shared/dynamodb/paginate.js +84 -0
  266. package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
  267. package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
  268. package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
  269. package/dist/esm/shared/dynamodb/recency-index.js +136 -0
  270. package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
  271. package/dist/esm/shared/dynamodb/retry.js +180 -0
  272. package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
  273. package/dist/esm/shared/dynamodb/row-size.js +26 -0
  274. package/dist/{shared/dynamodb/table-schema.js → esm/shared/dynamodb/table-schema.d.ts} +57 -67
  275. package/dist/esm/shared/dynamodb/table-schema.js +43 -0
  276. package/dist/esm/shared/errors/base-error.d.ts +231 -0
  277. package/dist/esm/shared/errors/base-error.js +64 -0
  278. package/dist/esm/shared/errors/boundary.d.ts +86 -0
  279. package/dist/esm/shared/errors/boundary.js +54 -0
  280. package/dist/esm/shared/errors/classify.d.ts +206 -0
  281. package/dist/esm/shared/errors/classify.js +220 -0
  282. package/dist/{shared/errors/error-code.js → esm/shared/errors/error-code.d.ts} +39 -43
  283. package/dist/esm/shared/errors/error-code.js +24 -0
  284. package/dist/{shared/errors/errors.js → esm/shared/errors/errors.d.ts} +92 -98
  285. package/dist/esm/shared/errors/errors.js +110 -0
  286. package/dist/{shared/logging/logger.js → esm/shared/logging/logger.d.ts} +22 -52
  287. package/dist/esm/shared/logging/logger.js +25 -0
  288. package/dist/esm/shared/logging/redaction.d.ts +123 -0
  289. package/dist/esm/shared/logging/redaction.js +140 -0
  290. package/dist/{shared/logging/secret-patterns.js → esm/shared/logging/secret-patterns.d.ts} +46 -87
  291. package/dist/esm/shared/logging/secret-patterns.js +83 -0
  292. package/dist/{shared/logging/truncate.js → esm/shared/logging/truncate.d.ts} +6 -40
  293. package/dist/esm/shared/logging/truncate.js +25 -0
  294. package/dist/esm/shared/options.d.ts +100 -0
  295. package/dist/esm/shared/options.js +1 -0
  296. package/dist/{shared/ulid.js → esm/shared/ulid.d.ts} +4 -84
  297. package/dist/esm/shared/ulid.js +77 -0
  298. package/dist/{shared/validation/collaborators.js → esm/shared/validation/collaborators.d.ts} +37 -65
  299. package/dist/esm/shared/validation/collaborators.js +70 -0
  300. package/dist/{shared/validation/option-shape.js → esm/shared/validation/option-shape.d.ts} +14 -36
  301. package/dist/esm/shared/validation/option-shape.js +24 -0
  302. package/dist/esm/shared/validation/options.d.ts +145 -0
  303. package/dist/esm/shared/validation/options.js +156 -0
  304. package/dist/{shared/validation/primitives.js → esm/shared/validation/primitives.d.ts} +30 -125
  305. package/dist/esm/shared/validation/primitives.js +100 -0
  306. package/dist/esm/shared/validation/ttl.d.ts +94 -0
  307. package/dist/esm/shared/validation/ttl.js +46 -0
  308. package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
  309. package/dist/esm/store/actions/list-namespaces.js +86 -0
  310. package/dist/esm/store/actions/put.d.ts +43 -0
  311. package/dist/esm/store/actions/put.js +46 -0
  312. package/dist/{store/actions/reconcile-vector-index.js → esm/store/actions/reconcile-vector-index.d.ts} +8 -16
  313. package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
  314. package/dist/esm/store/actions/search.d.ts +38 -0
  315. package/dist/esm/store/actions/search.js +23 -0
  316. package/dist/esm/store/internal/batch-plan.d.ts +56 -0
  317. package/dist/esm/store/internal/batch-plan.js +28 -0
  318. package/dist/esm/store/internal/filter.d.ts +43 -0
  319. package/dist/esm/store/internal/filter.js +60 -0
  320. package/dist/esm/store/internal/get-item.d.ts +77 -0
  321. package/dist/esm/store/internal/get-item.js +54 -0
  322. package/dist/esm/store/internal/item-write.d.ts +270 -0
  323. package/dist/esm/store/internal/item-write.js +173 -0
  324. package/dist/esm/store/internal/parse.d.ts +230 -0
  325. package/dist/esm/store/internal/parse.js +169 -0
  326. package/dist/{store/internal/rows.js → esm/store/internal/rows.d.ts} +111 -199
  327. package/dist/esm/store/internal/rows.js +147 -0
  328. package/dist/esm/store/internal/semantic-search.d.ts +168 -0
  329. package/dist/esm/store/internal/semantic-search.js +200 -0
  330. package/dist/esm/store/internal/setup.d.ts +96 -0
  331. package/dist/esm/store/internal/setup.js +98 -0
  332. package/dist/esm/store/internal/table-search.d.ts +100 -0
  333. package/dist/esm/store/internal/table-search.js +119 -0
  334. package/dist/esm/store/internal/vector-index.d.ts +258 -0
  335. package/dist/esm/store/internal/vector-index.js +256 -0
  336. package/dist/{store/store.js → esm/store/store.d.ts} +99 -133
  337. package/dist/esm/store/store.js +93 -0
  338. package/dist/esm/store/types.d.ts +111 -0
  339. package/dist/esm/store/types.js +1 -0
  340. package/dist/esm/store/vector-backend.d.ts +104 -0
  341. package/dist/esm/store/vector-backend.js +1 -0
  342. package/package.json +50 -44
  343. package/dist/backfill/backfill.js +0 -393
  344. package/dist/checkpointer/actions/list.js +0 -142
  345. package/dist/checkpointer/actions/put.js +0 -195
  346. package/dist/checkpointer/internal/delta-history.js +0 -252
  347. package/dist/checkpointer/internal/parse.js +0 -372
  348. package/dist/checkpointer/internal/pending-writes.js +0 -588
  349. package/dist/checkpointer/internal/read.js +0 -264
  350. package/dist/checkpointer/internal/rows.js +0 -834
  351. package/dist/checkpointer/internal/setup.js +0 -72
  352. package/dist/checkpointer/types.js +0 -12
  353. package/dist/factory/factory.js +0 -266
  354. package/dist/factory/types.js +0 -10
  355. package/dist/history/actions/get-messages.js +0 -141
  356. package/dist/history/actions/list-sessions.js +0 -156
  357. package/dist/history/internal/append.js +0 -500
  358. package/dist/history/internal/message-read.js +0 -204
  359. package/dist/history/internal/parse.js +0 -252
  360. package/dist/history/internal/session.js +0 -628
  361. package/dist/history/internal/setup.js +0 -106
  362. package/dist/history/types.js +0 -12
  363. package/dist/index.js +0 -51
  364. package/dist/shared/adapter.js +0 -143
  365. package/dist/shared/codec/codec.js +0 -441
  366. package/dist/shared/codec/compression.js +0 -89
  367. package/dist/shared/codec/json-serde.js +0 -191
  368. package/dist/shared/codec/s3/client-types.js +0 -26
  369. package/dist/shared/codec/s3/client.js +0 -97
  370. package/dist/shared/codec/s3/lifecycle.js +0 -355
  371. package/dist/shared/codec/s3/offloader.js +0 -658
  372. package/dist/shared/dynamodb/batch-write.js +0 -173
  373. package/dist/shared/dynamodb/paginate.js +0 -188
  374. package/dist/shared/dynamodb/partition-delete.js +0 -340
  375. package/dist/shared/dynamodb/recency-index.js +0 -377
  376. package/dist/shared/dynamodb/retry.js +0 -463
  377. package/dist/shared/errors/base-error.js +0 -174
  378. package/dist/shared/errors/boundary.js +0 -143
  379. package/dist/shared/errors/classify.d.ts +0 -97
  380. package/dist/shared/errors/classify.js +0 -257
  381. package/dist/shared/logging/redaction.js +0 -316
  382. package/dist/shared/options.js +0 -11
  383. package/dist/shared/validation/options.js +0 -328
  384. package/dist/shared/validation/ttl.js +0 -132
  385. package/dist/store/actions/list-namespaces.js +0 -197
  386. package/dist/store/actions/put.js +0 -78
  387. package/dist/store/actions/search.js +0 -66
  388. package/dist/store/internal/batch-plan.d.ts +0 -26
  389. package/dist/store/internal/batch-plan.js +0 -109
  390. package/dist/store/internal/filter.js +0 -137
  391. package/dist/store/internal/get-item.d.ts +0 -45
  392. package/dist/store/internal/get-item.js +0 -115
  393. package/dist/store/internal/item-write.js +0 -463
  394. package/dist/store/internal/parse.js +0 -350
  395. package/dist/store/internal/semantic-search.js +0 -389
  396. package/dist/store/internal/setup.js +0 -223
  397. package/dist/store/internal/table-search.js +0 -213
  398. package/dist/store/internal/vector-index.js +0 -546
  399. package/dist/store/types.js +0 -15
  400. package/dist/store/vector-backend.js +0 -17
  401. /package/dist/{shared → cjs/shared}/clock.d.ts +0 -0
  402. /package/dist/{shared → cjs/shared}/codec/json-serde.d.ts +0 -0
  403. /package/dist/{shared → cjs/shared}/concurrency.d.ts +0 -0
  404. /package/dist/{shared → cjs/shared}/dynamodb/cancellation.d.ts +0 -0
  405. /package/dist/{shared → cjs/shared}/logging/logger.d.ts +0 -0
  406. /package/dist/{shared → cjs/shared}/logging/truncate.d.ts +0 -0
  407. /package/dist/{shared → cjs/shared}/ulid.d.ts +0 -0
  408. /package/dist/{shared → cjs/shared}/validation/primitives.d.ts +0 -0
  409. /package/dist/{store → cjs/store}/vector-backend.d.ts +0 -0
@@ -6,10 +6,10 @@
6
6
  * their bounds, before an adapter builds anything, so a misconfiguration
7
7
  * surfaces at construction rather than on the first call.
8
8
  */
9
- import type { CompressionConfig } from '../codec/compression';
10
- import { type S3OffloadConfig } from '../codec/s3/config';
11
- import type { RetryPolicy } from '../dynamodb/retry';
12
- import type { BaseAdapterOptions, CodecOptions } from '../options';
9
+ import type { CompressionConfig } from '../codec/compression.js';
10
+ import { type S3OffloadConfig } from '../codec/s3/config.js';
11
+ import type { RetryPolicy } from '../dynamodb/retry.js';
12
+ import type { BaseAdapterOptions, CodecOptions } from '../options.js';
13
13
  /**
14
14
  * Largest `s3.maxDownloadBytes`/`compression.maxDecompressedBytes` an adapter
15
15
  * accepts (512 MiB): both hold one buffer fully resident while it is read or
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_READ_CONCURRENCY = exports.MAX_RETRY_DELAY_MS = exports.MAX_RETRY_ATTEMPTS = exports.MAX_PAYLOAD_BUFFER_BYTES = void 0;
4
+ exports.assertTableName = assertTableName;
5
+ exports.assertClientChoice = assertClientChoice;
6
+ exports.assertRetryBounds = assertRetryBounds;
7
+ exports.assertRetryPolicy = assertRetryPolicy;
8
+ exports.assertBaseAdapterOptions = assertBaseAdapterOptions;
9
+ exports.assertCompression = assertCompression;
10
+ exports.assertS3 = assertS3;
11
+ const codec_js_1 = require("../codec/codec.js");
12
+ const config_js_1 = require("../codec/s3/config.js");
13
+ const offloader_js_1 = require("../codec/s3/offloader.js");
14
+ const recency_index_js_1 = require("../dynamodb/recency-index.js");
15
+ const errors_js_1 = require("../errors/errors.js");
16
+ const option_shape_js_1 = require("./option-shape.js");
17
+ const primitives_js_1 = require("./primitives.js");
18
+ const ttl_js_1 = require("./ttl.js");
19
+ const TABLE_NAME_PATTERN = /^[A-Za-z0-9_.-]{3,255}$/;
20
+ exports.MAX_PAYLOAD_BUFFER_BYTES = 512 * 1024 * 1024;
21
+ exports.MAX_RETRY_ATTEMPTS = 100;
22
+ exports.MAX_RETRY_DELAY_MS = 60_000;
23
+ exports.MAX_READ_CONCURRENCY = 128;
24
+ const RETRY_KEYS = (0, option_shape_js_1.allKeysOf)({
25
+ maxAttempts: 'maxAttempts',
26
+ baseDelayMs: 'baseDelayMs',
27
+ maxDelayMs: 'maxDelayMs',
28
+ });
29
+ function assertTableName(tableName) {
30
+ if (typeof tableName !== 'string' || !TABLE_NAME_PATTERN.test(tableName)) {
31
+ throw (0, errors_js_1.validationError)('tableName must be 3-255 characters from [A-Za-z0-9_.-], as DynamoDB requires', 'tableName');
32
+ }
33
+ }
34
+ function assertClientChoice(options) {
35
+ if (options.client &&
36
+ (options.clientConfig !== undefined || options.createClient !== undefined)) {
37
+ throw (0, errors_js_1.validationError)('provide either `client` or `clientConfig`/`createClient`, not both: an injected client ' +
38
+ 'is used as-is and the configuration would be silently ignored', 'client');
39
+ }
40
+ if (options.clientConfig !== undefined)
41
+ (0, option_shape_js_1.assertObjectShape)(options.clientConfig, 'clientConfig');
42
+ }
43
+ function assertRetryBounds(policy) {
44
+ if (policy.maxAttempts !== undefined) {
45
+ (0, primitives_js_1.assertInteger)(policy.maxAttempts, 'retry.maxAttempts', { min: 1, max: exports.MAX_RETRY_ATTEMPTS });
46
+ }
47
+ if (policy.baseDelayMs !== undefined) {
48
+ (0, primitives_js_1.assertInteger)(policy.baseDelayMs, 'retry.baseDelayMs', { min: 1, max: exports.MAX_RETRY_DELAY_MS });
49
+ }
50
+ if (policy.maxDelayMs !== undefined) {
51
+ (0, primitives_js_1.assertInteger)(policy.maxDelayMs, 'retry.maxDelayMs', {
52
+ min: policy.baseDelayMs ?? 1,
53
+ max: exports.MAX_RETRY_DELAY_MS,
54
+ });
55
+ }
56
+ }
57
+ function assertRetryPolicy(policy) {
58
+ (0, option_shape_js_1.assertShape)(policy, RETRY_KEYS, 'retry');
59
+ assertRetryBounds(policy);
60
+ }
61
+ function assertRecencyIndex(options) {
62
+ if (options.indexShards !== undefined) {
63
+ (0, primitives_js_1.assertInteger)(options.indexShards, 'indexShards', { min: 1, max: recency_index_js_1.MAX_INDEX_SHARDS });
64
+ }
65
+ if (options.indexName !== undefined)
66
+ (0, primitives_js_1.assertNonEmptyString)(options.indexName, 'indexName');
67
+ }
68
+ function assertBaseAdapterOptions(options) {
69
+ if (typeof options !== 'object' || options === null) {
70
+ throw (0, errors_js_1.validationError)('options must be an object naming at least a tableName', 'options');
71
+ }
72
+ assertTableName(options.tableName);
73
+ assertClientChoice(options);
74
+ if (options.ttl !== undefined)
75
+ (0, ttl_js_1.resolveTtlSeconds)(options.ttl);
76
+ if (options.retry !== undefined)
77
+ assertRetryPolicy(options.retry);
78
+ if (options.compression !== undefined)
79
+ assertCompression(options.compression);
80
+ if (options.s3 !== undefined)
81
+ assertS3(options.s3);
82
+ if (options.readConcurrency !== undefined) {
83
+ (0, primitives_js_1.assertInteger)(options.readConcurrency, 'readConcurrency', {
84
+ min: 1,
85
+ max: exports.MAX_READ_CONCURRENCY,
86
+ });
87
+ }
88
+ assertRecencyIndex(options);
89
+ }
90
+ const SSE_ALGORITHMS = ['AES256', 'aws:kms', 'aws:kms:dsse'];
91
+ const COMPRESSION_KEYS = (0, option_shape_js_1.allKeysOf)({
92
+ enabled: 'enabled',
93
+ level: 'level',
94
+ minSizeBytes: 'minSizeBytes',
95
+ maxDecompressedBytes: 'maxDecompressedBytes',
96
+ });
97
+ const S3_KEYS = (0, option_shape_js_1.allKeysOf)({
98
+ bucketName: 'bucketName',
99
+ keyPrefix: 'keyPrefix',
100
+ thresholdBytes: 'thresholdBytes',
101
+ serverSideEncryption: 'serverSideEncryption',
102
+ sseKmsKeyId: 'sseKmsKeyId',
103
+ maxDownloadBytes: 'maxDownloadBytes',
104
+ clientConfig: 'clientConfig',
105
+ createS3Client: 'createS3Client',
106
+ });
107
+ function assertCompression(config) {
108
+ (0, option_shape_js_1.assertShape)(config, COMPRESSION_KEYS, 'compression');
109
+ if (typeof config.enabled !== 'boolean') {
110
+ throw (0, errors_js_1.validationError)('compression.enabled must be a boolean', 'compression.enabled');
111
+ }
112
+ if (config.level !== undefined) {
113
+ (0, primitives_js_1.assertInteger)(config.level, 'compression.level', { min: 0, max: 9 });
114
+ }
115
+ if (config.minSizeBytes !== undefined) {
116
+ (0, primitives_js_1.assertInteger)(config.minSizeBytes, 'compression.minSizeBytes', {
117
+ min: 0,
118
+ max: exports.MAX_PAYLOAD_BUFFER_BYTES,
119
+ });
120
+ }
121
+ if (config.maxDecompressedBytes !== undefined) {
122
+ (0, primitives_js_1.assertInteger)(config.maxDecompressedBytes, 'compression.maxDecompressedBytes', {
123
+ min: 1,
124
+ max: exports.MAX_PAYLOAD_BUFFER_BYTES,
125
+ });
126
+ }
127
+ }
128
+ function assertS3Encryption(config) {
129
+ if (config.serverSideEncryption !== undefined &&
130
+ !SSE_ALGORITHMS.includes(config.serverSideEncryption)) {
131
+ throw (0, errors_js_1.validationError)(`s3.serverSideEncryption must be one of ${SSE_ALGORITHMS.join(', ')}`, 's3.serverSideEncryption');
132
+ }
133
+ if (config.sseKmsKeyId !== undefined) {
134
+ (0, primitives_js_1.assertNonEmptyString)(config.sseKmsKeyId, 's3.sseKmsKeyId');
135
+ }
136
+ }
137
+ function assertS3(config) {
138
+ (0, option_shape_js_1.assertShape)(config, S3_KEYS, 's3');
139
+ (0, primitives_js_1.assertNonEmptyString)(config.bucketName, 's3.bucketName');
140
+ if (config.clientConfig !== undefined)
141
+ (0, option_shape_js_1.assertObjectShape)(config.clientConfig, 's3.clientConfig');
142
+ if (config.thresholdBytes !== undefined) {
143
+ (0, primitives_js_1.assertInteger)(config.thresholdBytes, 's3.thresholdBytes', {
144
+ min: 1,
145
+ max: codec_js_1.MAX_INLINE_PAYLOAD_BYTES,
146
+ });
147
+ }
148
+ if (config.keyPrefix !== undefined)
149
+ (0, config_js_1.assertScopedKeyPrefix)(config.keyPrefix);
150
+ if (config.maxDownloadBytes !== undefined) {
151
+ (0, primitives_js_1.assertInteger)(config.maxDownloadBytes, 's3.maxDownloadBytes', {
152
+ min: 1,
153
+ max: exports.MAX_PAYLOAD_BUFFER_BYTES,
154
+ });
155
+ }
156
+ const threshold = config.thresholdBytes ?? offloader_js_1.DEFAULT_S3_THRESHOLD_BYTES;
157
+ const downloadable = config.maxDownloadBytes ?? offloader_js_1.DEFAULT_MAX_S3_DOWNLOAD_BYTES;
158
+ if (downloadable < threshold) {
159
+ throw (0, errors_js_1.validationError)(`s3.maxDownloadBytes (${downloadable}) must be at least s3.thresholdBytes (${threshold}): ` +
160
+ 'every offloaded payload is at least the threshold, so none could be read back', 's3.maxDownloadBytes');
161
+ }
162
+ assertS3Encryption(config);
163
+ if (config.createS3Client !== undefined && typeof config.createS3Client !== 'function') {
164
+ throw (0, errors_js_1.validationError)('s3.createS3Client must be a function', 's3.createS3Client');
165
+ }
166
+ }
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_PAGE_LIMIT = void 0;
4
+ exports.parseString = parseString;
5
+ exports.assertNonEmptyString = assertNonEmptyString;
6
+ exports.parseInteger = parseInteger;
7
+ exports.assertInteger = assertInteger;
8
+ exports.parseLimit = parseLimit;
9
+ exports.parseStringArray = parseStringArray;
10
+ exports.assertStringArray = assertStringArray;
11
+ exports.assertNoControlChars = assertNoControlChars;
12
+ exports.assertWellFormed = assertWellFormed;
13
+ exports.parseKeySegment = parseKeySegment;
14
+ exports.parseIdentifier = parseIdentifier;
15
+ const errors_js_1 = require("../errors/errors.js");
16
+ exports.MAX_PAGE_LIMIT = 10_000;
17
+ function parseString(value, field) {
18
+ if (typeof value !== 'string') {
19
+ throw (0, errors_js_1.validationError)(`${field} must be a string`, field);
20
+ }
21
+ return value;
22
+ }
23
+ function parseNonBlankString(value, field) {
24
+ const text = parseString(value, field);
25
+ if (text.trim().length === 0) {
26
+ throw (0, errors_js_1.validationError)(`${field} must be a non-empty string (whitespace-only counts as empty)`, field);
27
+ }
28
+ return text;
29
+ }
30
+ function assertNonEmptyString(value, field) {
31
+ parseNonBlankString(value, field);
32
+ }
33
+ function assertMaxBytes(value, field, maxBytes) {
34
+ parseString(value, field);
35
+ const bytes = Buffer.byteLength(value, 'utf8');
36
+ if (bytes > maxBytes) {
37
+ throw (0, errors_js_1.validationError)(`${field} must be at most ${maxBytes} bytes of UTF-8 (received ${bytes})`, field);
38
+ }
39
+ }
40
+ function parseInteger(value, field, bounds = {}) {
41
+ if (typeof value !== 'number' || !Number.isInteger(value)) {
42
+ throw (0, errors_js_1.validationError)(`${field} must be an integer`, field);
43
+ }
44
+ if (bounds.min !== undefined && value < bounds.min) {
45
+ throw (0, errors_js_1.validationError)(`${field} must be >= ${bounds.min}`, field);
46
+ }
47
+ if (bounds.max !== undefined && value > bounds.max) {
48
+ throw (0, errors_js_1.validationError)(`${field} must be <= ${bounds.max}`, field);
49
+ }
50
+ return value;
51
+ }
52
+ function assertInteger(value, field, bounds = {}) {
53
+ parseInteger(value, field, bounds);
54
+ }
55
+ function parseLimit(value, min) {
56
+ return parseInteger(value, 'limit', { min, max: exports.MAX_PAGE_LIMIT });
57
+ }
58
+ function parseStringElement(item, field, index) {
59
+ if (typeof item !== 'string') {
60
+ throw (0, errors_js_1.validationError)(`${field}[${index}] must be a string`, field);
61
+ }
62
+ return item;
63
+ }
64
+ function parseStringArray(value, field) {
65
+ if (!Array.isArray(value)) {
66
+ throw (0, errors_js_1.validationError)(`${field} must be an array of strings`, field);
67
+ }
68
+ const result = [];
69
+ for (let index = 0; index < value.length; index += 1) {
70
+ result.push(parseStringElement(value[index], field, index));
71
+ }
72
+ return result;
73
+ }
74
+ function assertStringArray(value, field) {
75
+ parseStringArray(value, field);
76
+ }
77
+ function hasControlChar(value) {
78
+ for (let i = 0; i < value.length; i++) {
79
+ const code = value.charCodeAt(i);
80
+ if (code <= 0x1f || (code >= 0x7f && code <= 0x9f))
81
+ return true;
82
+ }
83
+ return false;
84
+ }
85
+ function assertNoControlChars(value, field) {
86
+ parseString(value, field);
87
+ if (hasControlChar(value)) {
88
+ throw (0, errors_js_1.validationError)(`${field} must not contain control characters`, field);
89
+ }
90
+ }
91
+ function assertWellFormed(value, field) {
92
+ parseString(value, field);
93
+ if (!value.isWellFormed()) {
94
+ throw (0, errors_js_1.validationError)(`${field} must be well-formed UTF-16 (it contains an unpaired surrogate, which does not ` +
95
+ 'survive encoding to UTF-8)', field);
96
+ }
97
+ }
98
+ function assertNoSeparator(value, separator, field) {
99
+ parseString(value, field);
100
+ if (value.includes(separator)) {
101
+ throw (0, errors_js_1.validationError)(`${field} must not contain the reserved "${separator}" separator`, field);
102
+ }
103
+ }
104
+ function parseKeySegment(value, separator, field, maxBytes) {
105
+ const text = parseString(value, field);
106
+ assertMaxBytes(text, field, maxBytes);
107
+ assertNoSeparator(text, separator, field);
108
+ assertNoControlChars(text, field);
109
+ assertWellFormed(text, field);
110
+ return text;
111
+ }
112
+ function parseIdentifier(value, separator, field, maxBytes) {
113
+ return parseKeySegment(parseNonBlankString(value, field), separator, field, maxBytes);
114
+ }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * A caller gives days or seconds. The one-unit rule, the five-year cap, the
5
5
  * epoch second DynamoDB's TTL attribute takes, and the S3 lifecycle days that
6
- * keep an offloaded object alive past its row's sweep lag are all derived
6
+ * keep an offloaded object from expiring before its row are all derived
7
7
  * here, so the two spellings of the `ttl` option are accepted or rejected
8
8
  * alike and no reader re-derives one unit from the other itself. A stored
9
9
  * row's own epoch-second `ttl` is converted to milliseconds for `Date` where
@@ -14,9 +14,14 @@ export declare const MAX_TTL_DAYS: number;
14
14
  /** Maximum TTL expressed in seconds: the same five years as {@link MAX_TTL_DAYS}. */
15
15
  export declare const MAX_TTL_SECONDS: number;
16
16
  /**
17
- * Extra days an S3 lifecycle rule adds over the TTL it backs. DynamoDB's TTL
18
- * sweep can lag up to ~48 h past the `ttl` timestamp; the offloaded object
19
- * must outlive its row, never the other way round.
17
+ * Extra days an S3 lifecycle rule adds over the TTL it backs, so the offloaded
18
+ * object is never removed before the row that names it expires, never the
19
+ * other way round. The rule expires an object by age, at or after creation +
20
+ * ceil(ttl) + this margin, which is at or after the `ttl` of any row naming
21
+ * it, so DynamoDB's physical-deletion lag (typically within a few days of the
22
+ * `ttl`, with no fixed bound:
23
+ * https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html)
24
+ * does not matter. The margin is headroom, not a bound on that lag.
20
25
  */
21
26
  export declare const S3_LIFECYCLE_SWEEP_MARGIN_DAYS = 2;
22
27
  /** Time-to-live expressed in whole days or whole seconds. */
@@ -68,10 +73,22 @@ export declare function calculateTtlTimestamp(ttl: TtlOption, now?: () => number
68
73
  *
69
74
  * Throws: whatever {@link resolveTtlSeconds} throws.
70
75
  *
71
- * Guarantees: the object outlives the row that points at it. S3 expires an
72
- * object at the first midnight UTC at least `Days` after creation, while
73
- * DynamoDB may keep an expired item for up to 48 hours past its `ttl`
74
- * (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html);
75
- * the margin covers that lag, which a bare `{ days: N }` did not.
76
+ * Guarantees: the object outlives the row that points at it, for every row
77
+ * written under the `ttl` this rule was computed from. S3 expires an object at
78
+ * the first midnight UTC at least `Days` after creation, while DynamoDB
79
+ * deletes an expired item typically within a few days of its `ttl`, with no
80
+ * fixed bound
81
+ * (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html).
82
+ * Every row naming the object carries a `ttl` no later than its creation plus
83
+ * `ttl`, so the object, expiring at or after that, is not removed before its
84
+ * row expires; readers hide a metadata, store or history row by its own `ttl`,
85
+ * and serve a checkpoint's payload and pending-write rows only while its
86
+ * metadata row is live. The margin is headroom, not a bound on the lag.
87
+ *
88
+ * The rule expires by age every object under its prefix, including objects
89
+ * named by rows written under an earlier `ttl`. After a rule is rewritten for
90
+ * a smaller `ttl`, the guarantee therefore holds only once every row written
91
+ * under the old, longer value has expired; until then such a row can outlive
92
+ * its object. Rewriting it for a larger `ttl` keeps the guarantee.
76
93
  */
77
94
  export declare function lifecycleExpirationDays(ttl: TtlOption): number;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS = exports.MAX_TTL_SECONDS = exports.MAX_TTL_DAYS = void 0;
4
+ exports.resolveTtlSeconds = resolveTtlSeconds;
5
+ exports.calculateTtlTimestamp = calculateTtlTimestamp;
6
+ exports.lifecycleExpirationDays = lifecycleExpirationDays;
7
+ const errors_js_1 = require("../errors/errors.js");
8
+ const option_shape_js_1 = require("./option-shape.js");
9
+ const primitives_js_1 = require("./primitives.js");
10
+ const SECONDS_PER_DAY = 24 * 60 * 60;
11
+ exports.MAX_TTL_DAYS = 365 * 5;
12
+ exports.MAX_TTL_SECONDS = exports.MAX_TTL_DAYS * 24 * 60 * 60;
13
+ exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS = 2;
14
+ const TTL_KEYS = (0, option_shape_js_1.allKeysOf)({
15
+ days: 'days',
16
+ seconds: 'seconds',
17
+ });
18
+ function assertWithinCap(value, field, max) {
19
+ (0, primitives_js_1.assertInteger)(value, field, { min: 1 });
20
+ if (value > max) {
21
+ throw (0, errors_js_1.validationError)(`${field} must be <= ${max} (five years)`, field);
22
+ }
23
+ }
24
+ function assertOneUnit(ttl) {
25
+ if (typeof ttl !== 'object' || ttl === null) {
26
+ throw (0, errors_js_1.validationError)('ttl must be an object: { days } or { seconds }', 'ttl');
27
+ }
28
+ (0, option_shape_js_1.assertShape)(ttl, TTL_KEYS, 'ttl');
29
+ const days = 'days' in ttl;
30
+ const seconds = 'seconds' in ttl;
31
+ if (days && seconds) {
32
+ throw (0, errors_js_1.validationError)('ttl must specify either ttl.days or ttl.seconds, not both', 'ttl');
33
+ }
34
+ if (!days && !seconds) {
35
+ throw (0, errors_js_1.validationError)('ttl must specify either ttl.days or ttl.seconds', 'ttl');
36
+ }
37
+ }
38
+ function resolveTtlSeconds(ttl) {
39
+ assertOneUnit(ttl);
40
+ if ('days' in ttl) {
41
+ assertWithinCap(ttl.days, 'ttl.days', exports.MAX_TTL_DAYS);
42
+ return ttl.days * SECONDS_PER_DAY;
43
+ }
44
+ assertWithinCap(ttl.seconds, 'ttl.seconds', exports.MAX_TTL_SECONDS);
45
+ return ttl.seconds;
46
+ }
47
+ function calculateTtlTimestamp(ttl, now = Date.now) {
48
+ return Math.floor(now() / 1000) + resolveTtlSeconds(ttl);
49
+ }
50
+ function lifecycleExpirationDays(ttl) {
51
+ return Math.ceil(resolveTtlSeconds(ttl) / SECONDS_PER_DAY) + exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS;
52
+ }
@@ -8,8 +8,8 @@
8
8
  * paging by `offset` gets the same order on every call and every host.
9
9
  */
10
10
  import type { MatchCondition } from '@langchain/langgraph-checkpoint';
11
- import type { ParsedList } from '../internal/parse';
12
- import type { StoreContext } from '../internal/setup';
11
+ import type { ParsedList } from '../internal/parse.js';
12
+ import type { StoreContext } from '../internal/setup.js';
13
13
  /**
14
14
  * Whether `namespace` satisfies one match condition. `condition.matchType` is
15
15
  * `'prefix'` or `'suffix'`, already refused otherwise by the parser that built
@@ -67,9 +67,9 @@ export declare function prefixRoot(conditions?: MatchCondition[]): string[];
67
67
  *
68
68
  * Returns: the namespaces, sorted, then `limit` of them from `offset`.
69
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.
70
+ * Throws: `RESULT_TRUNCATED` when `maxScanItems` or `maxIterations` is
71
+ * reached while rows remain, so a partial listing is never returned as a
72
+ * complete one; `FORMAT_UNSUPPORTED` for a store item a newer release wrote.
73
73
  *
74
74
  * Guarantees: every live row is read — the answer is about which namespaces
75
75
  * exist, and paging over it must not depend on which rows were read first. That
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matchNamespace = matchNamespace;
4
+ exports.truncateDepth = truncateDepth;
5
+ exports.prefixRoot = prefixRoot;
6
+ exports.listNamespaces = listNamespaces;
7
+ const clock_js_1 = require("../../shared/clock.js");
8
+ const paginate_js_1 = require("../../shared/dynamodb/paginate.js");
9
+ const table_schema_js_1 = require("../../shared/dynamodb/table-schema.js");
10
+ const rows_js_1 = require("../internal/rows.js");
11
+ const WILDCARD = '*';
12
+ function segmentMatches(actual, path) {
13
+ return path.every((element, index) => element === WILDCARD || element === actual[index]);
14
+ }
15
+ function matchNamespace(namespace, condition) {
16
+ const { matchType, path } = condition;
17
+ if (path.length > namespace.length)
18
+ return false;
19
+ const slice = matchType === 'prefix'
20
+ ? namespace.slice(0, path.length)
21
+ : namespace.slice(namespace.length - path.length);
22
+ return segmentMatches(slice, path);
23
+ }
24
+ function truncateDepth(namespace, maxDepth) {
25
+ return maxDepth === undefined ? namespace : namespace.slice(0, maxDepth);
26
+ }
27
+ function prefixRoot(conditions) {
28
+ const prefixCondition = conditions?.find((condition) => condition.matchType === 'prefix');
29
+ if (!prefixCondition)
30
+ return [];
31
+ const root = [];
32
+ for (const element of prefixCondition.path) {
33
+ if (element === WILDCARD)
34
+ break;
35
+ root.push(element);
36
+ }
37
+ return root;
38
+ }
39
+ function namespaceSource(context, op, now) {
40
+ const root = prefixRoot(op.matchConditions);
41
+ if (root.length > 0) {
42
+ return (0, paginate_js_1.paginateQuery)({
43
+ retry: context.retry,
44
+ client: context.client,
45
+ params: (0, table_schema_js_1.withoutExpired)((0, rows_js_1.projectKeys)((0, rows_js_1.scopedQuery)(context.tableName, root)), now),
46
+ maxItems: context.maxScanItems,
47
+ maxIterations: context.maxIterations,
48
+ });
49
+ }
50
+ return (0, paginate_js_1.paginateScan)({
51
+ retry: context.retry,
52
+ client: context.client,
53
+ params: (0, table_schema_js_1.withoutExpired)((0, rows_js_1.projectKeys)((0, rows_js_1.storeScan)(context.tableName)), now),
54
+ maxItems: context.maxScanItems,
55
+ maxIterations: context.maxIterations,
56
+ });
57
+ }
58
+ const NAMESPACE_COLLATOR = new Intl.Collator('en');
59
+ const REFERENCE_JOIN = ':';
60
+ function compareNamespaces(a, b) {
61
+ const collated = NAMESPACE_COLLATOR.compare(a.join(REFERENCE_JOIN), b.join(REFERENCE_JOIN));
62
+ if (collated !== 0)
63
+ return collated;
64
+ const left = a.join(table_schema_js_1.KEY_SEPARATOR);
65
+ const right = b.join(table_schema_js_1.KEY_SEPARATOR);
66
+ return left < right ? -1 : Number(left > right);
67
+ }
68
+ async function listNamespaces(context, op) {
69
+ if (op.limit === 0)
70
+ return [];
71
+ const now = (0, clock_js_1.nowSeconds)();
72
+ const seen = new Set();
73
+ const namespaces = [];
74
+ for await (const raw of namespaceSource(context, op, now)) {
75
+ const record = (0, rows_js_1.parseStoreRow)(raw);
76
+ if (!record || (0, table_schema_js_1.isExpiredRow)(record, now))
77
+ continue;
78
+ const namespace = record.namespace;
79
+ if (op.matchConditions &&
80
+ !op.matchConditions.every((condition) => matchNamespace(namespace, condition))) {
81
+ continue;
82
+ }
83
+ const truncated = truncateDepth(namespace, op.maxDepth);
84
+ const dedupeKey = truncated.join(table_schema_js_1.KEY_SEPARATOR);
85
+ if (seen.has(dedupeKey))
86
+ continue;
87
+ seen.add(dedupeKey);
88
+ namespaces.push(truncated);
89
+ }
90
+ namespaces.sort(compareNamespaces);
91
+ return namespaces.slice(op.offset, op.offset + op.limit);
92
+ }
@@ -7,8 +7,8 @@
7
7
  * A `null` value takes the delete path instead. A caller hands over an item;
8
8
  * that the table commits first and the vector copy follows is decided here.
9
9
  */
10
- import type { ParsedDelete, ParsedPut } from '../internal/parse';
11
- import type { StoreContext } from '../internal/setup';
10
+ import type { ParsedDelete, ParsedPut } from '../internal/parse.js';
11
+ import type { StoreContext } from '../internal/setup.js';
12
12
  /**
13
13
  * Store, update or delete an item.
14
14
  *
@@ -22,12 +22,19 @@ import type { StoreContext } from '../internal/setup';
22
22
  * Returns: nothing. Deleting an item that is not there is not an error.
23
23
  *
24
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;
25
+ * refused at the write rather than stored as a row that can never be read
26
+ * back — or naming `payload` for one too large to store inline without `s3`,
27
+ * or, once offloaded, larger than `s3.maxDownloadBytes`; `VALIDATION` again,
28
+ * naming `index` or `value`, for the built row — payload plus its inline
29
+ * vectors — over DynamoDB's 400 KB item limit, naming `index` when the
30
+ * vectors are what pushed it over, checked before anything is written;
26
31
  * `S3_OFFLOAD_FAILED`; whatever the write throws.
27
32
  *
28
33
  * Guarantees: DynamoDB holds the canonical item — the vector index is synced
29
34
  * 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
35
+ * half-written item. `createdAt` survives every update of a live item; a put
36
+ * over a row that has expired but not yet been swept is a creation, since no
37
+ * reader could still see that item. The superseded payload
31
38
  * is deleted only once the new row is committed, and this put's own upload
32
39
  * only once a read proves its write did not land. Neither release reads the
33
40
  * row first: each put uploads under a key ending in an id of its own, so the
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.putItem = putItem;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const clock_js_1 = require("../../shared/clock.js");
6
+ const ttl_js_1 = require("../../shared/validation/ttl.js");
7
+ const item_write_js_1 = require("../internal/item-write.js");
8
+ const rows_js_1 = require("../internal/rows.js");
9
+ const semantic_search_js_1 = require("../internal/semantic-search.js");
10
+ const vector_index_js_1 = require("../internal/vector-index.js");
11
+ async function resolvePassages(context, op, value) {
12
+ if (op.index === false)
13
+ return undefined;
14
+ return (0, semantic_search_js_1.embedPassages)(context, value, op.index);
15
+ }
16
+ async function putItem(context, op) {
17
+ if (op.kind === 'delete') {
18
+ await (0, item_write_js_1.deleteStoreItem)(context, op.address);
19
+ return;
20
+ }
21
+ const { namespace, key } = op.address;
22
+ const value = op.value;
23
+ const timestamp = (0, clock_js_1.nowIso)();
24
+ const existing = await (0, rows_js_1.readExisting)(context, (0, rows_js_1.itemRowKey)(op.address));
25
+ const embedding = await (0, vector_index_js_1.itemVector)(context, op);
26
+ const embeddings = context.vectorBackend ? undefined : await resolvePassages(context, op, value);
27
+ const ttlTimestamp = context.ttl ? (0, ttl_js_1.calculateTtlTimestamp)(context.ttl) : undefined;
28
+ const record = await (0, rows_js_1.buildStoreRow)(context, { namespace, key }, value, {
29
+ createdAt: (0, rows_js_1.isLiveRow)(existing) ? (existing.createdAt ?? timestamp) : timestamp,
30
+ updatedAt: timestamp,
31
+ embeddings,
32
+ ttlTimestamp,
33
+ rev: (0, node_crypto_1.randomUUID)(),
34
+ });
35
+ await (0, item_write_js_1.persistRow)(context, record, existing);
36
+ await syncVectorWhileCurrent(context, op.address, record, embedding);
37
+ }
38
+ async function syncVectorWhileCurrent(context, address, record, embedding) {
39
+ if (context.vectorBackend === undefined)
40
+ return;
41
+ if ((await (0, item_write_js_1.verifyWriteLanded)(context, record)) !== 'landed') {
42
+ context.logger.info('store.put: left the vector index to the write that superseded this put', {
43
+ namespace: address.namespace,
44
+ key: address.key,
45
+ });
46
+ return;
47
+ }
48
+ await (0, vector_index_js_1.syncItemVector)(context, address, embedding);
49
+ }
@@ -7,8 +7,8 @@
7
7
  * is then made to agree with the table belongs to the vector index, so the
8
8
  * store's method knows neither half.
9
9
  */
10
- import type { StoreContext } from '../internal/setup';
11
- import type { VectorReconcileResult } from '../types';
10
+ import type { StoreContext } from '../internal/setup.js';
11
+ import type { VectorReconcileResult } from '../types.js';
12
12
  /**
13
13
  * Repair the vector backend against the canonical DynamoDB items under
14
14
  * `namespacePrefix`: re-push every live embedding, and — when the backend
@@ -24,9 +24,9 @@ import type { VectorReconcileResult } from '../types';
24
24
  * Throws: `VALIDATION` naming `namespacePrefix` or `namespacePrefix element`
25
25
  * for an empty or malformed prefix, as `search` names it, and `vectorBackend`
26
26
  * when the store has no index or backend to reconcile;
27
- * `RESULT_TRUNCATED` past `maxScanItems`, since repairing from a
28
- * partial view would prune live vectors; whatever the reads, the embeddings
29
- * model and the backend throw.
27
+ * `RESULT_TRUNCATED` past `maxScanItems` or `maxIterations`, since repairing
28
+ * from a partial view would prune live vectors; whatever the reads, the
29
+ * embeddings model and the backend throw.
30
30
  *
31
31
  * Guarantees: re-embeds with the store's configured fields, so a per-put
32
32
  * `index` field override is not reproduced — a reconcile makes the backend
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reconcileVectorIndex = reconcileVectorIndex;
4
+ const errors_js_1 = require("../../shared/errors/errors.js");
5
+ const parse_js_1 = require("../internal/parse.js");
6
+ const vector_index_js_1 = require("../internal/vector-index.js");
7
+ async function reconcileVectorIndex(context, namespacePrefix, options = {}) {
8
+ const prefix = (0, parse_js_1.parseNamespace)(namespacePrefix, 'namespacePrefix');
9
+ if (!(0, vector_index_js_1.hasVectorBackend)(context)) {
10
+ throw (0, errors_js_1.validationError)('reconcileVectorIndex requires a configured index and vectorBackend', 'vectorBackend');
11
+ }
12
+ return (0, vector_index_js_1.reconcileVectors)(context, prefix, options.signal);
13
+ }
@@ -8,8 +8,8 @@
8
8
  * of page whichever path ran, scored exactly when a query could be ranked.
9
9
  */
10
10
  import type { SearchItem } from '@langchain/langgraph-checkpoint';
11
- import type { ParsedSearch } from '../internal/parse';
12
- import type { StoreContext } from '../internal/setup';
11
+ import type { ParsedSearch } from '../internal/parse.js';
12
+ import type { StoreContext } from '../internal/setup.js';
13
13
  /**
14
14
  * Search items under a namespace prefix: metadata filtering plus optional
15
15
  * semantic ranking.