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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/README.md +1820 -290
  2. package/dist/cjs/backfill/backfill.d.ts +171 -0
  3. package/dist/cjs/backfill/backfill.js +177 -0
  4. package/dist/cjs/checkpointer/actions/delete-thread.d.ts +50 -0
  5. package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
  6. package/dist/cjs/checkpointer/actions/get-tuple.d.ts +36 -0
  7. package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
  8. package/dist/cjs/checkpointer/actions/list.d.ts +55 -0
  9. package/dist/cjs/checkpointer/actions/list.js +70 -0
  10. package/dist/cjs/checkpointer/actions/put-writes.d.ts +49 -0
  11. package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
  12. package/dist/cjs/checkpointer/actions/put.d.ts +95 -0
  13. package/dist/cjs/checkpointer/actions/put.js +79 -0
  14. package/dist/cjs/checkpointer/internal/delta-history.d.ts +124 -0
  15. package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
  16. package/dist/cjs/checkpointer/internal/listing.d.ts +149 -0
  17. package/dist/cjs/checkpointer/internal/listing.js +104 -0
  18. package/dist/cjs/checkpointer/internal/parse.d.ts +298 -0
  19. package/dist/cjs/checkpointer/internal/parse.js +184 -0
  20. package/dist/cjs/checkpointer/internal/pending-writes.d.ts +314 -0
  21. package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
  22. package/dist/cjs/checkpointer/internal/read.d.ts +135 -0
  23. package/dist/cjs/checkpointer/internal/read.js +132 -0
  24. package/dist/cjs/checkpointer/internal/rows.d.ts +644 -0
  25. package/dist/cjs/checkpointer/internal/rows.js +356 -0
  26. package/dist/cjs/checkpointer/internal/setup.d.ts +47 -0
  27. package/dist/cjs/checkpointer/internal/setup.js +25 -0
  28. package/dist/cjs/checkpointer/saver.d.ts +306 -0
  29. package/dist/cjs/checkpointer/saver.js +56 -0
  30. package/dist/cjs/checkpointer/types.d.ts +51 -0
  31. package/dist/cjs/factory/factory.d.ts +154 -0
  32. package/dist/cjs/factory/factory.js +137 -0
  33. package/dist/{factory → cjs/factory}/types.d.ts +33 -14
  34. package/dist/cjs/history/actions/add-messages.d.ts +51 -0
  35. package/dist/cjs/history/actions/add-messages.js +17 -0
  36. package/dist/cjs/history/actions/clear.d.ts +52 -0
  37. package/dist/cjs/history/actions/clear.js +29 -0
  38. package/dist/cjs/history/actions/get-messages.d.ts +60 -0
  39. package/dist/cjs/history/actions/get-messages.js +58 -0
  40. package/dist/cjs/history/actions/list-sessions.d.ts +55 -0
  41. package/dist/cjs/history/actions/list-sessions.js +67 -0
  42. package/dist/cjs/history/actions/reconcile-count.d.ts +49 -0
  43. package/dist/cjs/history/actions/reconcile-count.js +8 -0
  44. package/dist/cjs/history/chat-message-history.d.ts +267 -0
  45. package/dist/cjs/history/chat-message-history.js +61 -0
  46. package/dist/cjs/history/internal/append.d.ts +244 -0
  47. package/dist/cjs/history/internal/append.js +267 -0
  48. package/dist/cjs/history/internal/message-read.d.ts +84 -0
  49. package/dist/cjs/history/internal/message-read.js +93 -0
  50. package/dist/cjs/history/internal/parse.d.ts +153 -0
  51. package/dist/cjs/history/internal/parse.js +113 -0
  52. package/dist/cjs/history/internal/rows.d.ts +196 -0
  53. package/dist/cjs/history/internal/rows.js +96 -0
  54. package/dist/cjs/history/internal/session.d.ts +350 -0
  55. package/dist/cjs/history/internal/session.js +296 -0
  56. package/dist/cjs/history/internal/setup.d.ts +64 -0
  57. package/dist/cjs/history/internal/setup.js +60 -0
  58. package/dist/cjs/history/session-adapter.d.ts +112 -0
  59. package/dist/cjs/history/session-adapter.js +38 -0
  60. package/dist/cjs/history/types.d.ts +102 -0
  61. package/dist/cjs/index.d.ts +53 -0
  62. package/dist/cjs/index.js +25 -0
  63. package/dist/cjs/package.json +1 -0
  64. package/dist/cjs/shared/adapter.d.ts +146 -0
  65. package/dist/cjs/shared/adapter.js +70 -0
  66. package/dist/cjs/shared/clock.d.ts +52 -0
  67. package/dist/cjs/shared/clock.js +14 -0
  68. package/dist/cjs/shared/codec/codec.d.ts +336 -0
  69. package/dist/cjs/shared/codec/codec.js +162 -0
  70. package/dist/cjs/shared/codec/compression.d.ts +66 -0
  71. package/dist/cjs/shared/codec/compression.js +45 -0
  72. package/dist/cjs/shared/codec/json-serde.d.ts +80 -0
  73. package/dist/cjs/shared/codec/json-serde.js +58 -0
  74. package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +22 -2
  75. package/dist/{shared → cjs/shared}/codec/s3/client-types.js +0 -1
  76. package/dist/cjs/shared/codec/s3/client.d.ts +63 -0
  77. package/dist/cjs/shared/codec/s3/client.js +78 -0
  78. package/dist/cjs/shared/codec/s3/config.d.ts +260 -0
  79. package/dist/cjs/shared/codec/s3/config.js +92 -0
  80. package/dist/cjs/shared/codec/s3/lifecycle.d.ts +220 -0
  81. package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
  82. package/dist/cjs/shared/codec/s3/offloader.d.ts +428 -0
  83. package/dist/cjs/shared/codec/s3/offloader.js +289 -0
  84. package/dist/cjs/shared/concurrency.d.ts +43 -0
  85. package/dist/{shared → cjs/shared}/concurrency.js +10 -9
  86. package/dist/cjs/shared/dynamodb/abort.d.ts +47 -0
  87. package/dist/cjs/shared/dynamodb/abort.js +16 -0
  88. package/dist/cjs/shared/dynamodb/batch-write.d.ts +86 -0
  89. package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
  90. package/dist/cjs/shared/dynamodb/cancellation.d.ts +124 -0
  91. package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
  92. package/dist/cjs/shared/dynamodb/client.d.ts +177 -0
  93. package/dist/{shared → cjs/shared}/dynamodb/client.js +12 -14
  94. package/dist/cjs/shared/dynamodb/idempotent-write.d.ts +596 -0
  95. package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
  96. package/dist/cjs/shared/dynamodb/paginate.d.ts +111 -0
  97. package/dist/cjs/shared/dynamodb/paginate.js +90 -0
  98. package/dist/cjs/shared/dynamodb/partition-delete.d.ts +204 -0
  99. package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
  100. package/dist/cjs/shared/dynamodb/recency-index.d.ts +243 -0
  101. package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
  102. package/dist/cjs/shared/dynamodb/retry.d.ts +317 -0
  103. package/dist/cjs/shared/dynamodb/retry.js +193 -0
  104. package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
  105. package/dist/cjs/shared/dynamodb/row-size.js +30 -0
  106. package/dist/cjs/shared/dynamodb/table-schema.d.ts +199 -0
  107. package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
  108. package/dist/cjs/shared/errors/base-error.d.ts +231 -0
  109. package/dist/cjs/shared/errors/base-error.js +73 -0
  110. package/dist/cjs/shared/errors/boundary.d.ts +86 -0
  111. package/dist/cjs/shared/errors/boundary.js +61 -0
  112. package/dist/cjs/shared/errors/classify.d.ts +206 -0
  113. package/dist/cjs/shared/errors/classify.js +232 -0
  114. package/dist/cjs/shared/errors/error-code.d.ts +95 -0
  115. package/dist/{shared → cjs/shared}/errors/error-code.js +12 -2
  116. package/dist/cjs/shared/errors/errors.d.ts +233 -0
  117. package/dist/cjs/shared/errors/errors.js +123 -0
  118. package/dist/cjs/shared/logging/logger.d.ts +80 -0
  119. package/dist/cjs/shared/logging/logger.js +30 -0
  120. package/dist/cjs/shared/logging/redaction.d.ts +123 -0
  121. package/dist/cjs/shared/logging/redaction.js +145 -0
  122. package/dist/cjs/shared/logging/secret-patterns.d.ts +227 -0
  123. package/dist/cjs/shared/logging/secret-patterns.js +93 -0
  124. package/dist/cjs/shared/logging/truncate.d.ts +197 -0
  125. package/dist/cjs/shared/logging/truncate.js +31 -0
  126. package/dist/cjs/shared/options.d.ts +100 -0
  127. package/dist/cjs/shared/ulid.d.ts +80 -0
  128. package/dist/{shared → cjs/shared}/ulid.js +7 -21
  129. package/dist/cjs/shared/validation/collaborators.d.ts +160 -0
  130. package/dist/cjs/shared/validation/collaborators.js +79 -0
  131. package/dist/cjs/shared/validation/option-shape.d.ts +91 -0
  132. package/dist/cjs/shared/validation/option-shape.js +31 -0
  133. package/dist/cjs/shared/validation/options.d.ts +145 -0
  134. package/dist/cjs/shared/validation/options.js +166 -0
  135. package/dist/cjs/shared/validation/primitives.d.ts +292 -0
  136. package/dist/cjs/shared/validation/primitives.js +114 -0
  137. package/dist/cjs/shared/validation/ttl.d.ts +94 -0
  138. package/dist/cjs/shared/validation/ttl.js +52 -0
  139. package/dist/cjs/store/actions/list-namespaces.d.ts +79 -0
  140. package/dist/cjs/store/actions/list-namespaces.js +92 -0
  141. package/dist/cjs/store/actions/put.d.ts +43 -0
  142. package/dist/cjs/store/actions/put.js +49 -0
  143. package/dist/cjs/store/actions/reconcile-vector-index.d.ts +38 -0
  144. package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
  145. package/dist/cjs/store/actions/search.d.ts +38 -0
  146. package/dist/cjs/store/actions/search.js +26 -0
  147. package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
  148. package/dist/cjs/store/internal/batch-plan.js +32 -0
  149. package/dist/cjs/store/internal/filter.d.ts +43 -0
  150. package/dist/cjs/store/internal/filter.js +64 -0
  151. package/dist/cjs/store/internal/get-item.d.ts +77 -0
  152. package/dist/cjs/store/internal/get-item.js +58 -0
  153. package/dist/cjs/store/internal/item-write.d.ts +270 -0
  154. package/dist/cjs/store/internal/item-write.js +181 -0
  155. package/dist/cjs/store/internal/parse.d.ts +230 -0
  156. package/dist/cjs/store/internal/parse.js +180 -0
  157. package/dist/cjs/store/internal/rows.d.ts +359 -0
  158. package/dist/cjs/store/internal/rows.js +166 -0
  159. package/dist/cjs/store/internal/semantic-search.d.ts +168 -0
  160. package/dist/{store/internal/text-path.js → cjs/store/internal/semantic-search.js} +92 -28
  161. package/dist/cjs/store/internal/setup.d.ts +96 -0
  162. package/dist/cjs/store/internal/setup.js +103 -0
  163. package/dist/cjs/store/internal/table-search.d.ts +100 -0
  164. package/dist/cjs/store/internal/table-search.js +123 -0
  165. package/dist/cjs/store/internal/vector-index.d.ts +258 -0
  166. package/dist/cjs/store/internal/vector-index.js +269 -0
  167. package/dist/cjs/store/store.d.ts +329 -0
  168. package/dist/cjs/store/store.js +97 -0
  169. package/dist/cjs/store/types.d.ts +111 -0
  170. package/dist/cjs/store/vector-backend.d.ts +104 -0
  171. package/dist/cjs/store/vector-backend.js +4 -0
  172. package/dist/esm/backfill/backfill.d.ts +171 -0
  173. package/dist/esm/backfill/backfill.js +170 -0
  174. package/dist/esm/checkpointer/actions/delete-thread.d.ts +50 -0
  175. package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
  176. package/dist/esm/checkpointer/actions/get-tuple.d.ts +36 -0
  177. package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
  178. package/dist/esm/checkpointer/actions/list.d.ts +55 -0
  179. package/dist/esm/checkpointer/actions/list.js +67 -0
  180. package/dist/esm/checkpointer/actions/put-writes.d.ts +49 -0
  181. package/dist/esm/checkpointer/actions/put-writes.js +18 -0
  182. package/dist/esm/checkpointer/actions/put.d.ts +95 -0
  183. package/dist/esm/checkpointer/actions/put.js +75 -0
  184. package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
  185. package/dist/esm/checkpointer/internal/delta-history.js +126 -0
  186. package/dist/esm/checkpointer/internal/listing.d.ts +149 -0
  187. package/dist/esm/checkpointer/internal/listing.js +95 -0
  188. package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
  189. package/dist/esm/checkpointer/internal/parse.js +169 -0
  190. package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
  191. package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
  192. package/dist/esm/checkpointer/internal/read.d.ts +135 -0
  193. package/dist/esm/checkpointer/internal/read.js +125 -0
  194. package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
  195. package/dist/esm/checkpointer/internal/rows.js +323 -0
  196. package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
  197. package/dist/esm/checkpointer/internal/setup.js +21 -0
  198. package/dist/esm/checkpointer/saver.d.ts +306 -0
  199. package/dist/esm/checkpointer/saver.js +52 -0
  200. package/dist/esm/checkpointer/types.d.ts +51 -0
  201. package/dist/esm/checkpointer/types.js +1 -0
  202. package/dist/esm/factory/factory.d.ts +154 -0
  203. package/dist/esm/factory/factory.js +133 -0
  204. package/dist/esm/factory/types.d.ts +76 -0
  205. package/dist/esm/factory/types.js +1 -0
  206. package/dist/esm/history/actions/add-messages.d.ts +51 -0
  207. package/dist/esm/history/actions/add-messages.js +14 -0
  208. package/dist/esm/history/actions/clear.d.ts +52 -0
  209. package/dist/esm/history/actions/clear.js +26 -0
  210. package/dist/esm/history/actions/get-messages.d.ts +60 -0
  211. package/dist/esm/history/actions/get-messages.js +55 -0
  212. package/dist/esm/history/actions/list-sessions.d.ts +55 -0
  213. package/dist/esm/history/actions/list-sessions.js +64 -0
  214. package/dist/esm/history/actions/reconcile-count.d.ts +49 -0
  215. package/dist/esm/history/actions/reconcile-count.js +5 -0
  216. package/dist/esm/history/chat-message-history.d.ts +267 -0
  217. package/dist/esm/history/chat-message-history.js +57 -0
  218. package/dist/esm/history/internal/append.d.ts +244 -0
  219. package/dist/esm/history/internal/append.js +259 -0
  220. package/dist/esm/history/internal/message-read.d.ts +84 -0
  221. package/dist/esm/history/internal/message-read.js +89 -0
  222. package/dist/esm/history/internal/parse.d.ts +153 -0
  223. package/dist/esm/history/internal/parse.js +105 -0
  224. package/dist/esm/history/internal/rows.d.ts +196 -0
  225. package/dist/esm/history/internal/rows.js +83 -0
  226. package/dist/esm/history/internal/session.d.ts +350 -0
  227. package/dist/esm/history/internal/session.js +285 -0
  228. package/dist/esm/history/internal/setup.d.ts +64 -0
  229. package/dist/esm/history/internal/setup.js +56 -0
  230. package/dist/esm/history/session-adapter.d.ts +112 -0
  231. package/dist/esm/history/session-adapter.js +34 -0
  232. package/dist/esm/history/types.d.ts +102 -0
  233. package/dist/esm/history/types.js +1 -0
  234. package/dist/esm/index.d.ts +53 -0
  235. package/dist/esm/index.js +10 -0
  236. package/dist/esm/shared/adapter.d.ts +146 -0
  237. package/dist/esm/shared/adapter.js +65 -0
  238. package/dist/esm/shared/clock.d.ts +52 -0
  239. package/dist/esm/shared/clock.js +9 -0
  240. package/dist/esm/shared/codec/codec.d.ts +336 -0
  241. package/dist/esm/shared/codec/codec.js +150 -0
  242. package/dist/esm/shared/codec/compression.d.ts +66 -0
  243. package/dist/esm/shared/codec/compression.js +40 -0
  244. package/dist/esm/shared/codec/json-serde.d.ts +80 -0
  245. package/dist/esm/shared/codec/json-serde.js +54 -0
  246. package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
  247. package/dist/esm/shared/codec/s3/client-types.js +3 -0
  248. package/dist/esm/shared/codec/s3/client.d.ts +63 -0
  249. package/dist/esm/shared/codec/s3/client.js +40 -0
  250. package/dist/esm/shared/codec/s3/config.d.ts +260 -0
  251. package/dist/esm/shared/codec/s3/config.js +79 -0
  252. package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
  253. package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
  254. package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
  255. package/dist/esm/shared/codec/s3/offloader.js +278 -0
  256. package/dist/esm/shared/concurrency.d.ts +43 -0
  257. package/dist/esm/shared/concurrency.js +27 -0
  258. package/dist/esm/shared/dynamodb/abort.d.ts +47 -0
  259. package/dist/esm/shared/dynamodb/abort.js +12 -0
  260. package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
  261. package/dist/esm/shared/dynamodb/batch-write.js +74 -0
  262. package/dist/esm/shared/dynamodb/cancellation.d.ts +124 -0
  263. package/dist/esm/shared/dynamodb/cancellation.js +30 -0
  264. package/dist/esm/shared/dynamodb/client.d.ts +177 -0
  265. package/dist/esm/shared/dynamodb/client.js +35 -0
  266. package/dist/esm/shared/dynamodb/idempotent-write.d.ts +596 -0
  267. package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
  268. package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
  269. package/dist/esm/shared/dynamodb/paginate.js +84 -0
  270. package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
  271. package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
  272. package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
  273. package/dist/esm/shared/dynamodb/recency-index.js +136 -0
  274. package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
  275. package/dist/esm/shared/dynamodb/retry.js +180 -0
  276. package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
  277. package/dist/esm/shared/dynamodb/row-size.js +26 -0
  278. package/dist/esm/shared/dynamodb/table-schema.d.ts +199 -0
  279. package/dist/esm/shared/dynamodb/table-schema.js +43 -0
  280. package/dist/esm/shared/errors/base-error.d.ts +231 -0
  281. package/dist/esm/shared/errors/base-error.js +64 -0
  282. package/dist/esm/shared/errors/boundary.d.ts +86 -0
  283. package/dist/esm/shared/errors/boundary.js +54 -0
  284. package/dist/esm/shared/errors/classify.d.ts +206 -0
  285. package/dist/esm/shared/errors/classify.js +220 -0
  286. package/dist/esm/shared/errors/error-code.d.ts +95 -0
  287. package/dist/esm/shared/errors/error-code.js +24 -0
  288. package/dist/esm/shared/errors/errors.d.ts +233 -0
  289. package/dist/esm/shared/errors/errors.js +110 -0
  290. package/dist/esm/shared/logging/logger.d.ts +80 -0
  291. package/dist/esm/shared/logging/logger.js +25 -0
  292. package/dist/esm/shared/logging/redaction.d.ts +123 -0
  293. package/dist/esm/shared/logging/redaction.js +140 -0
  294. package/dist/esm/shared/logging/secret-patterns.d.ts +227 -0
  295. package/dist/esm/shared/logging/secret-patterns.js +83 -0
  296. package/dist/esm/shared/logging/truncate.d.ts +197 -0
  297. package/dist/esm/shared/logging/truncate.js +25 -0
  298. package/dist/esm/shared/options.d.ts +100 -0
  299. package/dist/esm/shared/options.js +1 -0
  300. package/dist/esm/shared/ulid.d.ts +80 -0
  301. package/dist/esm/shared/ulid.js +77 -0
  302. package/dist/esm/shared/validation/collaborators.d.ts +160 -0
  303. package/dist/esm/shared/validation/collaborators.js +70 -0
  304. package/dist/esm/shared/validation/option-shape.d.ts +91 -0
  305. package/dist/esm/shared/validation/option-shape.js +24 -0
  306. package/dist/esm/shared/validation/options.d.ts +145 -0
  307. package/dist/esm/shared/validation/options.js +156 -0
  308. package/dist/esm/shared/validation/primitives.d.ts +292 -0
  309. package/dist/esm/shared/validation/primitives.js +100 -0
  310. package/dist/esm/shared/validation/ttl.d.ts +94 -0
  311. package/dist/esm/shared/validation/ttl.js +46 -0
  312. package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
  313. package/dist/esm/store/actions/list-namespaces.js +86 -0
  314. package/dist/esm/store/actions/put.d.ts +43 -0
  315. package/dist/esm/store/actions/put.js +46 -0
  316. package/dist/esm/store/actions/reconcile-vector-index.d.ts +38 -0
  317. package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
  318. package/dist/esm/store/actions/search.d.ts +38 -0
  319. package/dist/esm/store/actions/search.js +23 -0
  320. package/dist/esm/store/internal/batch-plan.d.ts +56 -0
  321. package/dist/esm/store/internal/batch-plan.js +28 -0
  322. package/dist/esm/store/internal/filter.d.ts +43 -0
  323. package/dist/esm/store/internal/filter.js +60 -0
  324. package/dist/esm/store/internal/get-item.d.ts +77 -0
  325. package/dist/esm/store/internal/get-item.js +54 -0
  326. package/dist/esm/store/internal/item-write.d.ts +270 -0
  327. package/dist/esm/store/internal/item-write.js +173 -0
  328. package/dist/esm/store/internal/parse.d.ts +230 -0
  329. package/dist/esm/store/internal/parse.js +169 -0
  330. package/dist/esm/store/internal/rows.d.ts +359 -0
  331. package/dist/esm/store/internal/rows.js +147 -0
  332. package/dist/esm/store/internal/semantic-search.d.ts +168 -0
  333. package/dist/esm/store/internal/semantic-search.js +200 -0
  334. package/dist/esm/store/internal/setup.d.ts +96 -0
  335. package/dist/esm/store/internal/setup.js +98 -0
  336. package/dist/esm/store/internal/table-search.d.ts +100 -0
  337. package/dist/esm/store/internal/table-search.js +119 -0
  338. package/dist/esm/store/internal/vector-index.d.ts +258 -0
  339. package/dist/esm/store/internal/vector-index.js +256 -0
  340. package/dist/esm/store/store.d.ts +329 -0
  341. package/dist/esm/store/store.js +93 -0
  342. package/dist/esm/store/types.d.ts +111 -0
  343. package/dist/esm/store/types.js +1 -0
  344. package/dist/esm/store/vector-backend.d.ts +104 -0
  345. package/dist/esm/store/vector-backend.js +1 -0
  346. package/package.json +68 -46
  347. package/dist/checkpointer/actions/delete-thread.d.ts +0 -10
  348. package/dist/checkpointer/actions/delete-thread.js +0 -38
  349. package/dist/checkpointer/actions/get-tuple.d.ts +0 -11
  350. package/dist/checkpointer/actions/get-tuple.js +0 -25
  351. package/dist/checkpointer/actions/list.d.ts +0 -20
  352. package/dist/checkpointer/actions/list.js +0 -113
  353. package/dist/checkpointer/actions/put-writes.d.ts +0 -15
  354. package/dist/checkpointer/actions/put-writes.js +0 -62
  355. package/dist/checkpointer/actions/put.d.ts +0 -17
  356. package/dist/checkpointer/actions/put.js +0 -73
  357. package/dist/checkpointer/internal/assemble.d.ts +0 -17
  358. package/dist/checkpointer/internal/assemble.js +0 -38
  359. package/dist/checkpointer/internal/checkpoint-write-verify.d.ts +0 -24
  360. package/dist/checkpointer/internal/checkpoint-write-verify.js +0 -67
  361. package/dist/checkpointer/internal/configurable.d.ts +0 -12
  362. package/dist/checkpointer/internal/configurable.js +0 -24
  363. package/dist/checkpointer/internal/fetch.d.ts +0 -19
  364. package/dist/checkpointer/internal/fetch.js +0 -88
  365. package/dist/checkpointer/internal/filter-match.d.ts +0 -13
  366. package/dist/checkpointer/internal/filter-match.js +0 -15
  367. package/dist/checkpointer/internal/item-reader.d.ts +0 -66
  368. package/dist/checkpointer/internal/item-reader.js +0 -113
  369. package/dist/checkpointer/internal/item-writer.d.ts +0 -35
  370. package/dist/checkpointer/internal/item-writer.js +0 -107
  371. package/dist/checkpointer/internal/keys.d.ts +0 -41
  372. package/dist/checkpointer/internal/keys.js +0 -117
  373. package/dist/checkpointer/internal/list-scope.d.ts +0 -61
  374. package/dist/checkpointer/internal/list-scope.js +0 -108
  375. package/dist/checkpointer/internal/pending-sends.d.ts +0 -13
  376. package/dist/checkpointer/internal/pending-sends.js +0 -29
  377. package/dist/checkpointer/internal/query.d.ts +0 -21
  378. package/dist/checkpointer/internal/query.js +0 -42
  379. package/dist/checkpointer/internal/regular-write.d.ts +0 -28
  380. package/dist/checkpointer/internal/regular-write.js +0 -66
  381. package/dist/checkpointer/internal/setup.d.ts +0 -33
  382. package/dist/checkpointer/internal/setup.js +0 -38
  383. package/dist/checkpointer/internal/special-write-cas.d.ts +0 -29
  384. package/dist/checkpointer/internal/special-write-cas.js +0 -104
  385. package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -23
  386. package/dist/checkpointer/internal/special-write-cleanup.js +0 -50
  387. package/dist/checkpointer/internal/special-write-verify.d.ts +0 -53
  388. package/dist/checkpointer/internal/special-write-verify.js +0 -80
  389. package/dist/checkpointer/internal/stored-channels.d.ts +0 -31
  390. package/dist/checkpointer/internal/stored-channels.js +0 -70
  391. package/dist/checkpointer/internal/validation.d.ts +0 -18
  392. package/dist/checkpointer/internal/validation.js +0 -40
  393. package/dist/checkpointer/internal/write-guard.d.ts +0 -20
  394. package/dist/checkpointer/internal/write-guard.js +0 -48
  395. package/dist/checkpointer/internal/write-index.d.ts +0 -36
  396. package/dist/checkpointer/internal/write-index.js +0 -41
  397. package/dist/checkpointer/saver.d.ts +0 -70
  398. package/dist/checkpointer/saver.js +0 -105
  399. package/dist/checkpointer/types.d.ts +0 -58
  400. package/dist/factory/factory.d.ts +0 -40
  401. package/dist/factory/factory.js +0 -87
  402. package/dist/history/actions/add-messages.d.ts +0 -15
  403. package/dist/history/actions/add-messages.js +0 -77
  404. package/dist/history/actions/clear.d.ts +0 -10
  405. package/dist/history/actions/clear.js +0 -34
  406. package/dist/history/actions/get-messages.d.ts +0 -17
  407. package/dist/history/actions/get-messages.js +0 -79
  408. package/dist/history/actions/list-sessions.d.ts +0 -13
  409. package/dist/history/actions/list-sessions.js +0 -53
  410. package/dist/history/actions/reconcile-count.d.ts +0 -12
  411. package/dist/history/actions/reconcile-count.js +0 -64
  412. package/dist/history/chat-message-history.d.ts +0 -73
  413. package/dist/history/chat-message-history.js +0 -111
  414. package/dist/history/internal/append-saga.d.ts +0 -25
  415. package/dist/history/internal/append-saga.js +0 -79
  416. package/dist/history/internal/compensation.d.ts +0 -25
  417. package/dist/history/internal/compensation.js +0 -92
  418. package/dist/history/internal/item-mapper.d.ts +0 -9
  419. package/dist/history/internal/item-mapper.js +0 -27
  420. package/dist/history/internal/keys.d.ts +0 -16
  421. package/dist/history/internal/keys.js +0 -48
  422. package/dist/history/internal/message-chunker.d.ts +0 -13
  423. package/dist/history/internal/message-chunker.js +0 -67
  424. package/dist/history/internal/message-transaction.d.ts +0 -25
  425. package/dist/history/internal/message-transaction.js +0 -61
  426. package/dist/history/internal/message-window.d.ts +0 -17
  427. package/dist/history/internal/message-window.js +0 -49
  428. package/dist/history/internal/query.d.ts +0 -23
  429. package/dist/history/internal/query.js +0 -39
  430. package/dist/history/internal/session-count.d.ts +0 -47
  431. package/dist/history/internal/session-count.js +0 -115
  432. package/dist/history/internal/session-title.d.ts +0 -19
  433. package/dist/history/internal/session-title.js +0 -43
  434. package/dist/history/internal/session-update.d.ts +0 -27
  435. package/dist/history/internal/session-update.js +0 -69
  436. package/dist/history/internal/setup.d.ts +0 -31
  437. package/dist/history/internal/setup.js +0 -43
  438. package/dist/history/internal/title-generator.d.ts +0 -12
  439. package/dist/history/internal/title-generator.js +0 -41
  440. package/dist/history/internal/ttl-anchor.d.ts +0 -24
  441. package/dist/history/internal/ttl-anchor.js +0 -38
  442. package/dist/history/internal/validation.d.ts +0 -25
  443. package/dist/history/internal/validation.js +0 -53
  444. package/dist/history/session-adapter.d.ts +0 -29
  445. package/dist/history/session-adapter.js +0 -35
  446. package/dist/history/types.d.ts +0 -69
  447. package/dist/index.d.ts +0 -29
  448. package/dist/index.js +0 -32
  449. package/dist/shared/clock.d.ts +0 -8
  450. package/dist/shared/clock.js +0 -16
  451. package/dist/shared/codec/codec.d.ts +0 -53
  452. package/dist/shared/codec/codec.js +0 -66
  453. package/dist/shared/codec/compression.d.ts +0 -24
  454. package/dist/shared/codec/compression.js +0 -48
  455. package/dist/shared/codec/descriptor-keys.d.ts +0 -12
  456. package/dist/shared/codec/descriptor-keys.js +0 -14
  457. package/dist/shared/codec/encode.d.ts +0 -13
  458. package/dist/shared/codec/encode.js +0 -43
  459. package/dist/shared/codec/json-serde.d.ts +0 -7
  460. package/dist/shared/codec/json-serde.js +0 -17
  461. package/dist/shared/codec/payload-loss.d.ts +0 -12
  462. package/dist/shared/codec/payload-loss.js +0 -38
  463. package/dist/shared/codec/s3/adapter-config.d.ts +0 -13
  464. package/dist/shared/codec/s3/adapter-config.js +0 -22
  465. package/dist/shared/codec/s3/bounded-body.d.ts +0 -14
  466. package/dist/shared/codec/s3/bounded-body.js +0 -47
  467. package/dist/shared/codec/s3/client.d.ts +0 -18
  468. package/dist/shared/codec/s3/client.js +0 -46
  469. package/dist/shared/codec/s3/config.d.ts +0 -51
  470. package/dist/shared/codec/s3/config.js +0 -58
  471. package/dist/shared/codec/s3/delete.d.ts +0 -7
  472. package/dist/shared/codec/s3/delete.js +0 -28
  473. package/dist/shared/codec/s3/key-scope.d.ts +0 -23
  474. package/dist/shared/codec/s3/key-scope.js +0 -44
  475. package/dist/shared/codec/s3/lifecycle.d.ts +0 -14
  476. package/dist/shared/codec/s3/lifecycle.js +0 -63
  477. package/dist/shared/codec/s3/offloader.d.ts +0 -44
  478. package/dist/shared/codec/s3/offloader.js +0 -118
  479. package/dist/shared/codec/s3/orphans.d.ts +0 -23
  480. package/dist/shared/codec/s3/orphans.js +0 -71
  481. package/dist/shared/codec/s3/read-write.d.ts +0 -18
  482. package/dist/shared/codec/s3/read-write.js +0 -51
  483. package/dist/shared/codec/s3/retry.d.ts +0 -5
  484. package/dist/shared/codec/s3/retry.js +0 -22
  485. package/dist/shared/concurrency.d.ts +0 -6
  486. package/dist/shared/constants.d.ts +0 -112
  487. package/dist/shared/constants.js +0 -115
  488. package/dist/shared/dynamodb/abort.d.ts +0 -9
  489. package/dist/shared/dynamodb/abort.js +0 -27
  490. package/dist/shared/dynamodb/backoff.d.ts +0 -15
  491. package/dist/shared/dynamodb/backoff.js +0 -48
  492. package/dist/shared/dynamodb/batch-write.d.ts +0 -22
  493. package/dist/shared/dynamodb/batch-write.js +0 -53
  494. package/dist/shared/dynamodb/cancellation.d.ts +0 -6
  495. package/dist/shared/dynamodb/cancellation.js +0 -7
  496. package/dist/shared/dynamodb/client.d.ts +0 -28
  497. package/dist/shared/dynamodb/conditional-put.d.ts +0 -67
  498. package/dist/shared/dynamodb/conditional-put.js +0 -76
  499. package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -21
  500. package/dist/shared/dynamodb/drain-unprocessed.js +0 -43
  501. package/dist/shared/dynamodb/expiry.d.ts +0 -16
  502. package/dist/shared/dynamodb/expiry.js +0 -29
  503. package/dist/shared/dynamodb/paginate-core.d.ts +0 -24
  504. package/dist/shared/dynamodb/paginate-core.js +0 -82
  505. package/dist/shared/dynamodb/paginate.d.ts +0 -14
  506. package/dist/shared/dynamodb/paginate.js +0 -19
  507. package/dist/shared/dynamodb/partition-delete.d.ts +0 -39
  508. package/dist/shared/dynamodb/partition-delete.js +0 -71
  509. package/dist/shared/dynamodb/retry-classifier.d.ts +0 -17
  510. package/dist/shared/dynamodb/retry-classifier.js +0 -118
  511. package/dist/shared/dynamodb/retry-policy.d.ts +0 -26
  512. package/dist/shared/dynamodb/retry-policy.js +0 -22
  513. package/dist/shared/dynamodb/retry.d.ts +0 -31
  514. package/dist/shared/dynamodb/retry.js +0 -57
  515. package/dist/shared/dynamodb/scan.d.ts +0 -14
  516. package/dist/shared/dynamodb/scan.js +0 -19
  517. package/dist/shared/dynamodb/types.d.ts +0 -23
  518. package/dist/shared/errors/base-error.d.ts +0 -30
  519. package/dist/shared/errors/base-error.js +0 -27
  520. package/dist/shared/errors/boundary.d.ts +0 -18
  521. package/dist/shared/errors/boundary.js +0 -46
  522. package/dist/shared/errors/error-code.d.ts +0 -13
  523. package/dist/shared/errors/errors.d.ts +0 -68
  524. package/dist/shared/errors/errors.js +0 -114
  525. package/dist/shared/errors/upstream-error.d.ts +0 -16
  526. package/dist/shared/errors/upstream-error.js +0 -27
  527. package/dist/shared/errors/wrap-error.d.ts +0 -7
  528. package/dist/shared/errors/wrap-error.js +0 -15
  529. package/dist/shared/logging/logger.d.ts +0 -18
  530. package/dist/shared/logging/logger.js +0 -15
  531. package/dist/shared/logging/redaction-walk.d.ts +0 -23
  532. package/dist/shared/logging/redaction-walk.js +0 -112
  533. package/dist/shared/logging/redaction.d.ts +0 -39
  534. package/dist/shared/logging/redaction.js +0 -75
  535. package/dist/shared/logging/secret-patterns.d.ts +0 -92
  536. package/dist/shared/logging/secret-patterns.js +0 -133
  537. package/dist/shared/options.d.ts +0 -37
  538. package/dist/shared/ulid.d.ts +0 -23
  539. package/dist/shared/validation/options.d.ts +0 -8
  540. package/dist/shared/validation/options.js +0 -90
  541. package/dist/shared/validation/primitives.d.ts +0 -29
  542. package/dist/shared/validation/primitives.js +0 -82
  543. package/dist/shared/validation/ttl.d.ts +0 -28
  544. package/dist/shared/validation/ttl.js +0 -52
  545. package/dist/store/actions/get.d.ts +0 -13
  546. package/dist/store/actions/get.js +0 -73
  547. package/dist/store/actions/list-namespaces.d.ts +0 -8
  548. package/dist/store/actions/list-namespaces.js +0 -59
  549. package/dist/store/actions/put.d.ts +0 -10
  550. package/dist/store/actions/put.js +0 -96
  551. package/dist/store/actions/reconcile-vector-index.d.ts +0 -18
  552. package/dist/store/actions/reconcile-vector-index.js +0 -26
  553. package/dist/store/actions/search.d.ts +0 -9
  554. package/dist/store/actions/search.js +0 -34
  555. package/dist/store/internal/backend-search.d.ts +0 -4
  556. package/dist/store/internal/backend-search.js +0 -74
  557. package/dist/store/internal/batch-plan.d.ts +0 -11
  558. package/dist/store/internal/batch-plan.js +0 -52
  559. package/dist/store/internal/candidates.d.ts +0 -23
  560. package/dist/store/internal/candidates.js +0 -94
  561. package/dist/store/internal/filter.d.ts +0 -9
  562. package/dist/store/internal/filter.js +0 -85
  563. package/dist/store/internal/index-reconcile.d.ts +0 -21
  564. package/dist/store/internal/index-reconcile.js +0 -118
  565. package/dist/store/internal/index-sync.d.ts +0 -10
  566. package/dist/store/internal/index-sync.js +0 -25
  567. package/dist/store/internal/item-mapper.d.ts +0 -27
  568. package/dist/store/internal/item-mapper.js +0 -61
  569. package/dist/store/internal/keys.d.ts +0 -17
  570. package/dist/store/internal/keys.js +0 -41
  571. package/dist/store/internal/namespace-match.d.ts +0 -11
  572. package/dist/store/internal/namespace-match.js +0 -40
  573. package/dist/store/internal/option-validation.d.ts +0 -13
  574. package/dist/store/internal/option-validation.js +0 -77
  575. package/dist/store/internal/overwrite-swap.d.ts +0 -32
  576. package/dist/store/internal/overwrite-swap.js +0 -68
  577. package/dist/store/internal/persist.d.ts +0 -28
  578. package/dist/store/internal/persist.js +0 -64
  579. package/dist/store/internal/query.d.ts +0 -11
  580. package/dist/store/internal/query.js +0 -48
  581. package/dist/store/internal/ranker.d.ts +0 -18
  582. package/dist/store/internal/ranker.js +0 -39
  583. package/dist/store/internal/read-existing.d.ts +0 -23
  584. package/dist/store/internal/read-existing.js +0 -41
  585. package/dist/store/internal/score-direction.d.ts +0 -31
  586. package/dist/store/internal/score-direction.js +0 -38
  587. package/dist/store/internal/search-filter.d.ts +0 -3
  588. package/dist/store/internal/search-filter.js +0 -10
  589. package/dist/store/internal/semantic-search.d.ts +0 -34
  590. package/dist/store/internal/semantic-search.js +0 -87
  591. package/dist/store/internal/setup.d.ts +0 -36
  592. package/dist/store/internal/setup.js +0 -40
  593. package/dist/store/internal/text-path.d.ts +0 -17
  594. package/dist/store/internal/validation.d.ts +0 -18
  595. package/dist/store/internal/validation.js +0 -51
  596. package/dist/store/internal/write-verify.d.ts +0 -42
  597. package/dist/store/internal/write-verify.js +0 -71
  598. package/dist/store/store.d.ts +0 -61
  599. package/dist/store/store.js +0 -107
  600. package/dist/store/types.d.ts +0 -50
  601. package/dist/store/types.js +0 -2
  602. package/dist/store/vector-backend.d.ts +0 -43
  603. package/dist/store/vector-backend.js +0 -2
  604. /package/dist/{checkpointer → cjs/checkpointer}/types.js +0 -0
  605. /package/dist/{factory → cjs/factory}/types.js +0 -0
  606. /package/dist/{history → cjs/history}/types.js +0 -0
  607. /package/dist/{shared → cjs/shared}/options.js +0 -0
  608. /package/dist/{shared/dynamodb → cjs/store}/types.js +0 -0
@@ -0,0 +1,153 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { unmarshall } from '@aws-sdk/util-dynamodb';
3
+ import { nowMs } from '../clock.js';
4
+ import { PayloadLocation } from '../codec/codec.js';
5
+ import { hasErrorCode } from '../errors/base-error.js';
6
+ import { classifyAwsError, mayStillBeInFlight } from '../errors/classify.js';
7
+ import { ErrorCode } from '../errors/error-code.js';
8
+ import { retryBudgetMayStillLand } from '../errors/errors.js';
9
+ import { isAbortError } from './abort.js';
10
+ import { conditionalCheckFailure } from './cancellation.js';
11
+ import { MAX_WRITE_LIFETIME_MS, withDynamoDBRetry, retryFor } from './retry.js';
12
+ import { PARTITION_KEY_ATTRIBUTE } from './table-schema.js';
13
+ export function referencesS3Object(descriptor) {
14
+ return descriptor.location === PayloadLocation.S3;
15
+ }
16
+ export async function transactIdempotently(deps, actions, options = {}) {
17
+ const input = { TransactItems: actions, ClientRequestToken: randomUUID() };
18
+ const deadlineAt = nowMs() + MAX_WRITE_LIFETIME_MS;
19
+ await withDynamoDBRetry((request) => deps.client.transactWrite(input, request), {
20
+ ...retryFor(deps, options.signal),
21
+ ...(options.minAttempts === undefined
22
+ ? {}
23
+ : { maxAttempts: Math.max(options.minAttempts, deps.retry?.maxAttempts ?? 0) }),
24
+ ...(options.rng === undefined ? {} : { rng: options.rng }),
25
+ deadlineAt,
26
+ });
27
+ }
28
+ export async function putIdempotently(deps, row, guard, signal) {
29
+ await transactIdempotently(deps, [{ Put: { TableName: deps.tableName, Item: row, ...guard } }], {
30
+ signal,
31
+ });
32
+ }
33
+ export async function deleteIdempotently(deps, key, guard, signal) {
34
+ await transactIdempotently(deps, [{ Delete: { TableName: deps.tableName, Key: key, ...guard } }], { signal });
35
+ }
36
+ export async function commitRow(deps, row, payload, options = {}) {
37
+ if (referencesS3Object(payload)) {
38
+ await putIdempotently(deps, row, options.guard, options.signal);
39
+ return;
40
+ }
41
+ await withDynamoDBRetry((request) => deps.client.put({ TableName: deps.tableName, Item: row, ...options.guard }, request), retryFor(deps, options.signal));
42
+ }
43
+ export const OVERWRITE_CAS_MAX_ATTEMPTS = 3;
44
+ const RETURN_REJECTED_ROW = { ReturnValuesOnConditionCheckFailure: 'ALL_OLD' };
45
+ export function revisionGuard(attribute, observed) {
46
+ if (!observed.exists)
47
+ return {
48
+ ...RETURN_REJECTED_ROW,
49
+ ConditionExpression: `attribute_not_exists(${PARTITION_KEY_ATTRIBUTE})`,
50
+ };
51
+ if (observed.revision === undefined) {
52
+ return {
53
+ ...RETURN_REJECTED_ROW,
54
+ ConditionExpression: 'attribute_not_exists(#rev)',
55
+ ExpressionAttributeNames: { '#rev': attribute },
56
+ };
57
+ }
58
+ return {
59
+ ...RETURN_REJECTED_ROW,
60
+ ConditionExpression: '#rev = :rev',
61
+ ExpressionAttributeNames: { '#rev': attribute },
62
+ ExpressionAttributeValues: { ':rev': observed.revision },
63
+ };
64
+ }
65
+ export const WRITE_ID_ATTRIBUTE = 'writeId';
66
+ export function writeIdGuard(attribute, id, field) {
67
+ const names = { '#pin': attribute };
68
+ if (field !== undefined)
69
+ names['#field'] = field;
70
+ return {
71
+ ...RETURN_REJECTED_ROW,
72
+ ConditionExpression: field === undefined ? '#pin = :pin' : '#pin.#field = :pin',
73
+ ExpressionAttributeNames: names,
74
+ ExpressionAttributeValues: { ':pin': id },
75
+ };
76
+ }
77
+ export function isConditionalCheckFailed(error) {
78
+ return classifyAwsError(error) === ErrorCode.CONDITION_CONFLICT;
79
+ }
80
+ export function rejectedRow(error) {
81
+ const attached = error.Item;
82
+ const raw = attached ?? conditionalCheckFailure(error)?.Item;
83
+ return raw === undefined ? undefined : unmarshall(raw);
84
+ }
85
+ export function offloadedKey(descriptor) {
86
+ return descriptor?.location === PayloadLocation.S3 ? descriptor.s3Key : undefined;
87
+ }
88
+ export function identityOf(probe, row) {
89
+ if (probe.kind === 'attribute')
90
+ return row?.[probe.attribute];
91
+ return offloadedKey(row?.[probe.attribute]);
92
+ }
93
+ export function verdictFor(probe, row) {
94
+ return identityOf(probe, row) === probe.expected ? 'landed' : 'not-landed';
95
+ }
96
+ export function mayStillLand(failure) {
97
+ if (isAbortError(failure) || retryBudgetMayStillLand(failure))
98
+ return true;
99
+ if (hasErrorCode(failure, ErrorCode.RETRY_EXHAUSTED)) {
100
+ return mayStillBeInFlight(failure.cause);
101
+ }
102
+ return mayStillBeInFlight(failure);
103
+ }
104
+ export function settledVerdict(verdict, failure) {
105
+ return verdict === 'not-landed' && mayStillLand(failure) ? 'unverified' : verdict;
106
+ }
107
+ function projectionOf(read) {
108
+ const nested = read.descriptors ?? [];
109
+ const whole = [read.attribute, ...(read.also ?? [])].filter((name) => !nested.includes(name));
110
+ const names = {};
111
+ const paths = [];
112
+ whole.forEach((name, index) => {
113
+ names[`#a${index}`] = name;
114
+ paths.push(`#a${index}`);
115
+ });
116
+ nested.forEach((name, index) => {
117
+ names[`#d${index}`] = name;
118
+ paths.push(`#d${index}.#loc`, `#d${index}.#s3k`);
119
+ });
120
+ if (nested.length > 0)
121
+ Object.assign(names, { '#loc': 'location', '#s3k': 's3Key' });
122
+ return { expression: paths.join(', '), names };
123
+ }
124
+ export async function readRow(deps, read) {
125
+ const { expression, names } = projectionOf(read);
126
+ const result = await withDynamoDBRetry((request) => deps.client.get({
127
+ TableName: deps.tableName,
128
+ Key: read.key,
129
+ ConsistentRead: true,
130
+ ProjectionExpression: expression,
131
+ ExpressionAttributeNames: names,
132
+ }, request), deps.retry);
133
+ return result.Item;
134
+ }
135
+ export async function verifyRow(deps, probe) {
136
+ if (probe.expected === undefined)
137
+ return { verdict: 'not-landed' };
138
+ try {
139
+ const row = await readRow(deps, probe);
140
+ return { verdict: verdictFor(probe, row), row };
141
+ }
142
+ catch {
143
+ return { verdict: 'unverified' };
144
+ }
145
+ }
146
+ export async function isRowAbsent(deps, key) {
147
+ try {
148
+ return (await readRow(deps, { key, attribute: PARTITION_KEY_ATTRIBUTE })) === undefined;
149
+ }
150
+ catch {
151
+ return false;
152
+ }
153
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Hides that a Query or a Scan is many pages.
3
+ *
4
+ * A read receives rows one at a time and never sees a page boundary. How many
5
+ * rows and pages it may collect before it refuses with `RESULT_TRUNCATED`
6
+ * rather than truncating silently, how a read that stopped exactly at its row
7
+ * cap probes whether anything remained, and where cancellation is checked
8
+ * between pages are decided here, the same way for a Query and a Scan.
9
+ */
10
+ import type { QueryCommandInput, ScanCommandInput } from '@aws-sdk/lib-dynamodb';
11
+ import type { DynamoDBDocumentLike, AttributeMap } from './client.js';
12
+ import { type RetryOptions } from './retry.js';
13
+ /** Hard cap on query-pagination loop iterations (runaway-loop guard). */
14
+ export declare const MAX_LOOP_ITERATIONS = 1000;
15
+ /** Hard cap on rows collected into memory across a paginated query. */
16
+ export declare const MAX_TOTAL_ROWS_IN_MEMORY = 10000;
17
+ /**
18
+ * Raw rows a single `listCheckpoints` call may pull before it warns. The read
19
+ * itself is deliberately unbounded: capping it would count raw rows rather
20
+ * than filter-matched ones, so a caller asking for a handful of rare matches
21
+ * over a large thread would get a hard error instead of the true answer. The
22
+ * warning gives the operational signal without that wrong error.
23
+ *
24
+ * Its own literal, deliberately: this is the point at which a scan is worth
25
+ * telling an operator about, which is independent of
26
+ * {@link MAX_TOTAL_ROWS_IN_MEMORY}'s hard collection cap. Aliasing the two —
27
+ * so one reused the other's literal — would let retuning the memory cap
28
+ * silently move the warning threshold too, for constants that answer
29
+ * unrelated questions, and would make knip report the pair as a duplicate
30
+ * export.
31
+ */
32
+ export declare const LIST_SCAN_WARN_THRESHOLD = 10000;
33
+ /** Options for {@link paginateQuery}. */
34
+ export interface PaginateOptions extends PaginateCoreOptions {
35
+ client: DynamoDBDocumentLike;
36
+ params: QueryCommandInput;
37
+ }
38
+ /**
39
+ * Every row a Query returns, across all its pages.
40
+ *
41
+ * Accepts: `params` — the Query input; `ExclusiveStartKey` is set per page and
42
+ * anything the caller put there is replaced. `retry` and `signal` are applied
43
+ * to each page read, `maxItems` / `maxIterations` to the walk (see
44
+ * {@link paginatePages}).
45
+ *
46
+ * Returns: an async generator over the rows, following `LastEvaluatedKey`
47
+ * until it is absent. A page carrying no `Items` is an empty page, not the end.
48
+ *
49
+ * Throws: whatever the page read throws, plus the caps and abort behaviour of
50
+ * {@link paginatePages}.
51
+ */
52
+ export declare function paginateQuery(options: PaginateOptions): AsyncGenerator<AttributeMap>;
53
+ /** One page of results plus the key to resume from (undefined when exhausted). */
54
+ export interface PageResult {
55
+ items: AttributeMap[];
56
+ lastKey: AttributeMap | undefined;
57
+ }
58
+ /** Options shared by the paginators built on {@link paginatePages}. */
59
+ export interface PaginateCoreOptions {
60
+ /** The adapter's retry options, applied to every page read. */
61
+ retry?: RetryOptions;
62
+ signal?: AbortSignal;
63
+ maxItems?: number;
64
+ maxIterations?: number;
65
+ }
66
+ /**
67
+ * Drive a paged DynamoDB read to completion, yielding each item.
68
+ *
69
+ * Accepts: `fetchPage` — performs one page read from a start key.
70
+ * `options.maxItems` — how many items may be yielded, default
71
+ * {@link MAX_TOTAL_ROWS_IN_MEMORY}. `options.maxIterations` — how many page
72
+ * reads may be issued, default {@link MAX_LOOP_ITERATIONS}; the probe below is
73
+ * charged against it too. Both accept `Infinity` to read to true completion
74
+ * (deletes do), and both must otherwise be at least 1 — an accepted cap of 0
75
+ * would yield one item before noticing. `options.signal` — checked before every
76
+ * fetch. `options.retry` is the page reader's own concern.
77
+ *
78
+ * Returns: an async generator over the items, continuing past empty pages.
79
+ *
80
+ * Throws: `VALIDATION` naming `maxItems` or `maxIterations` for a cap below
81
+ * 1; `ABORTED` when the signal is already aborted at a page boundary; and
82
+ * `RESULT_TRUNCATED` when a cap is reached while data actually
83
+ * remains — a partial result is never returned silently.
84
+ *
85
+ * Guarantees: reaching `maxItems` on the last item of a page is not by itself a
86
+ * truncation. DynamoDB returns a `LastEvaluatedKey` whenever it stopped
87
+ * *evaluating* at the 1 MB boundary, whether or not a later item passes the
88
+ * filter, so the remaining keys are followed until one carries an item
89
+ * (truncated) or they run out (the result was complete).
90
+ */
91
+ export declare function paginatePages(fetchPage: (startKey: AttributeMap | undefined) => Promise<PageResult>, options?: PaginateCoreOptions): AsyncGenerator<AttributeMap>;
92
+ /** Options for {@link paginateScan}. */
93
+ export interface ScanOptions extends PaginateCoreOptions {
94
+ client: DynamoDBDocumentLike;
95
+ params: ScanCommandInput;
96
+ }
97
+ /**
98
+ * Every item a Scan returns, across all its pages.
99
+ *
100
+ * Accepts: as {@link paginateQuery}; only the request differs.
101
+ *
102
+ * Returns: as {@link paginateQuery} — an async generator over the items, which
103
+ * a consumer may abandon early to stop reading.
104
+ *
105
+ * Throws: as {@link paginateQuery}.
106
+ *
107
+ * A `Scan` reads every row of the table before filtering, so the four reads
108
+ * allowed to call this are fixed and guarded; `test/static/guards/scan-sites.ts`
109
+ * lists them and states the rule they follow.
110
+ */
111
+ export declare function paginateScan(options: ScanOptions): AsyncGenerator<AttributeMap>;
@@ -0,0 +1,84 @@
1
+ import { resultTruncatedError, validationError } from '../errors/errors.js';
2
+ import { abortErrorFrom } from './abort.js';
3
+ import { withDynamoDBRetry } from './retry.js';
4
+ export const MAX_LOOP_ITERATIONS = 1000;
5
+ export const MAX_TOTAL_ROWS_IN_MEMORY = 10000;
6
+ export const LIST_SCAN_WARN_THRESHOLD = 10000;
7
+ export function paginateQuery(options) {
8
+ return paginatePages(async (startKey) => {
9
+ const page = await withDynamoDBRetry((request) => options.client.query({ ...options.params, ExclusiveStartKey: startKey }, request), { ...options.retry, signal: options.signal });
10
+ return {
11
+ items: page.Items ?? [],
12
+ lastKey: page.LastEvaluatedKey,
13
+ };
14
+ }, options);
15
+ }
16
+ async function readPage(reader, startKey) {
17
+ if (reader.iterations >= reader.maxIterations) {
18
+ throw resultTruncatedError('maxIterations', reader.maxIterations);
19
+ }
20
+ if (reader.signal?.aborted)
21
+ throw abortErrorFrom(reader.signal);
22
+ reader.iterations += 1;
23
+ return reader.fetchPage(startKey);
24
+ }
25
+ function* yieldPageRows(page, state, maxItems) {
26
+ for (let index = 0; index < page.items.length; index++) {
27
+ yield page.items[index];
28
+ state.yielded += 1;
29
+ if (state.yielded >= maxItems) {
30
+ if (index < page.items.length - 1)
31
+ throw resultTruncatedError('maxItems', maxItems);
32
+ return 'capped';
33
+ }
34
+ }
35
+ return 'exhausted';
36
+ }
37
+ async function dataRemains(reader, startKey) {
38
+ let key = startKey;
39
+ while (key !== undefined) {
40
+ const page = await readPage(reader, key);
41
+ if (page.items.length > 0)
42
+ return true;
43
+ key = page.lastKey;
44
+ }
45
+ return false;
46
+ }
47
+ function assertPositiveCap(value, field) {
48
+ if (!(value >= 1)) {
49
+ throw validationError(`${field} must be at least 1 (pass Infinity to read to completion)`, field);
50
+ }
51
+ return value;
52
+ }
53
+ export async function* paginatePages(fetchPage, options = {}) {
54
+ const maxItems = assertPositiveCap(options.maxItems ?? MAX_TOTAL_ROWS_IN_MEMORY, 'maxItems');
55
+ const reader = {
56
+ fetchPage,
57
+ maxIterations: assertPositiveCap(options.maxIterations ?? MAX_LOOP_ITERATIONS, 'maxIterations'),
58
+ iterations: 0,
59
+ signal: options.signal,
60
+ };
61
+ const state = { yielded: 0 };
62
+ let startKey;
63
+ for (;;) {
64
+ const page = await readPage(reader, startKey);
65
+ const outcome = yield* yieldPageRows(page, state, maxItems);
66
+ if (outcome === 'capped') {
67
+ if (await dataRemains(reader, page.lastKey))
68
+ throw resultTruncatedError('maxItems', maxItems);
69
+ return;
70
+ }
71
+ startKey = page.lastKey;
72
+ if (startKey === undefined)
73
+ return;
74
+ }
75
+ }
76
+ export function paginateScan(options) {
77
+ return paginatePages(async (startKey) => {
78
+ const page = await withDynamoDBRetry((request) => options.client.scan({ ...options.params, ExclusiveStartKey: startKey }, request), { ...options.retry, signal: options.signal });
79
+ return {
80
+ items: page.Items ?? [],
81
+ lastKey: page.LastEvaluatedKey,
82
+ };
83
+ }, options);
84
+ }
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Hides deleting exactly the rows of a partition that a read observed.
3
+ *
4
+ * A partition on a shared table can hold another adapter's rows, and a row can
5
+ * be rewritten between the read and the delete. A foreign row is left in place,
6
+ * each delete is pinned to the write id the read saw so a rewritten row
7
+ * survives, the rows of a unit are skipped once one of them is refused, and an
8
+ * object is released only once the row naming it is confirmed gone.
9
+ */
10
+ import type { QueryCommandInput } from '@aws-sdk/lib-dynamodb';
11
+ import { type PayloadDescriptor, type DescriptorRef } from '../codec/codec.js';
12
+ import { type S3Offloader } from '../codec/s3/offloader.js';
13
+ import type { Logger } from '../logging/logger.js';
14
+ import type { DynamoDBDocumentLike, AttributeMap } from './client.js';
15
+ import { type RevisionGuard } from './idempotent-write.js';
16
+ import { type RetryOptions } from './retry.js';
17
+ /**
18
+ * Conditional row deletes a partition-wide delete keeps in flight. Pinning a
19
+ * row on the write that produced it costs one request per row where a batch
20
+ * carried twenty-five, so issuing them one at a time would have paid a round
21
+ * trip per row; eight at once gives most of that back while keeping a
22
+ * partition of any size from opening a socket per row. A fixed value rather
23
+ * than a caller option: this is a maintenance path, and it has no other knob.
24
+ *
25
+ * Its own literal at the same value as `DEFAULT_READ_CONCURRENCY`
26
+ * (`src/shared/concurrency.ts`), not an alias of it — aliasing two limits
27
+ * would move one whenever the other is retuned (see
28
+ * `LIST_SCAN_WARN_THRESHOLD` (`src/shared/dynamodb/paginate.ts`)).
29
+ */
30
+ export declare const DELETE_CONCURRENCY = 8;
31
+ /**
32
+ * One offloaded payload a row references, named by the attribute holding it.
33
+ * The name is not decoration: the row is pinned through a document path over
34
+ * that attribute, and a refused row's objects must stay where they are.
35
+ */
36
+ export interface NamedDescriptor {
37
+ attribute: string;
38
+ descriptor: PayloadDescriptor;
39
+ }
40
+ /**
41
+ * One row attribute read as a named descriptor, which is the only way this
42
+ * library fills a {@link NamedDescriptor}.
43
+ *
44
+ * Accepts: `row` — a row the partition read returned, whose attributes this
45
+ * library did not necessarily write. `attribute` — the name the payload would
46
+ * be held under.
47
+ *
48
+ * Returns: the named descriptor, or nothing when the row carries no usable one
49
+ * there. An absent attribute and one holding `null` are the same answer,
50
+ * because neither names a payload: the row contributes no id to pin on and no
51
+ * object to release. Narrowing here rather than at each caller is what keeps
52
+ * `descriptor` the non-null thing the type claims — a `null` cast into the
53
+ * array by a caller reached `pinFor`, which reads a write id off it.
54
+ *
55
+ * Throws: nothing.
56
+ */
57
+ export declare function namedDescriptor(row: AttributeMap, attribute: string): NamedDescriptor | undefined;
58
+ /** Collaborators and per-adapter policy for one partition-wide delete. */
59
+ export interface PartitionDeleteOptions {
60
+ client: DynamoDBDocumentLike;
61
+ tableName: string;
62
+ params: QueryCommandInput;
63
+ logger: Logger;
64
+ /** The adapter's retry options for the page reads and the row deletes. */
65
+ retry?: RetryOptions;
66
+ /** Aborting it stops the read between pages and rejects with an `ABORTED` error. */
67
+ signal?: AbortSignal;
68
+ offloader?: S3Offloader;
69
+ /** Label for log lines and S3-cleanup diagnostics, e.g. `deleteThread`. */
70
+ operation: string;
71
+ /**
72
+ * True when a sort key belongs to the calling adapter. A partition query
73
+ * carries no sort-key condition, so without this a shared-table partition
74
+ * holding a foreign row would have that row deleted too.
75
+ */
76
+ ownsSortKey: (sortKey: string) => boolean;
77
+ /**
78
+ * The offloaded payload descriptors a row references, each named by its
79
+ * attribute, and each read off the row with {@link namedDescriptor} so that
80
+ * an attribute holding `null` yields no entry rather than an unusable one.
81
+ */
82
+ descriptorsOf: (row: AttributeMap) => NamedDescriptor[];
83
+ /**
84
+ * Top-level attribute carrying a row's per-write id, for the row kinds that
85
+ * have one. Preferred over a descriptor's own id where it exists: it needs no
86
+ * document path, and it is the same attribute the writer already pins on.
87
+ */
88
+ idAttribute?: string;
89
+ /**
90
+ * The logical unit a row belongs to. A unit's rows are written together but
91
+ * deleted one by one, so a refusal on an earlier one has to suppress the
92
+ * rest; an adapter whose rows form no unit supplies nothing.
93
+ */
94
+ unitOf?: (row: AttributeMap) => string;
95
+ /**
96
+ * The row kind bounding a flush. Rows arrive kind by kind, so flushing when
97
+ * the kind changes is what settles a refusal before the rows it must suppress
98
+ * are issued.
99
+ */
100
+ kindOf?: (row: AttributeMap) => string;
101
+ /** The partition's own leading S3 key parts; objects outside their path are never deleted. */
102
+ scope: readonly string[];
103
+ }
104
+ /**
105
+ * Delete exactly the rows of one partition that this adapter's read observed.
106
+ *
107
+ * Accepts: `params` — the partition query, which carries no sort-key
108
+ * condition. `ownsSortKey` — decides per row; a row it rejects is left in
109
+ * place and reported at `warn`, which is what keeps a shared table's other
110
+ * adapters intact. `descriptorsOf` — the offloaded payloads a row references,
111
+ * each named by the attribute holding it. `idAttribute`, `unitOf` and `kindOf`
112
+ * — the per-write id, the unit and the kind boundary, for an adapter whose
113
+ * rows have them. `scope` — the partition's own leading S3 key parts; an object
114
+ * outside their path is never deleted. `signal` — stops the read between pages.
115
+ *
116
+ * Returns: how many rows were deleted, not counting the ones left in place.
117
+ *
118
+ * Throws: `ABORTED` when the signal fires, whether between pages or during
119
+ * a row's delete, unwrapped and with no further row issued — a cancel is not a
120
+ * delete that half-landed. Otherwise `BATCH_WRITE_INCOMPLETE` when
121
+ * a row's delete fails, carrying what did succeed across every earlier flush.
122
+ * S3 cleanup never throws, whatever it finds.
123
+ *
124
+ * Guarantees: every delete is pinned on the per-write id the read observed, so
125
+ * a row rewritten after that read is left in place and reported rather than
126
+ * erased with the object it names. A row observed carrying no id is deleted
127
+ * unconditionally, as it was before the pin existed. The read is deliberately
128
+ * uncapped (`maxItems` and `maxIterations` are `Infinity`), so a partition of
129
+ * any size is deleted to completion rather than truncated at the in-memory page
130
+ * caps — memory stays bounded because rows are flushed in batches of
131
+ * {@link BATCH_WRITE_MAX} and never accumulated. The carry-forward depends on
132
+ * the scan being **ascending**, which is the default the partition queries rely
133
+ * on: a kind's rows are settled before the next kind's are issued, so a refusal
134
+ * suppresses the rest of its unit. A failure part-way keeps the rows already
135
+ * deleted; this is a single pass over a quiescent partition, not a transaction.
136
+ */
137
+ export declare function deletePartitionRows(options: PartitionDeleteOptions): Promise<number>;
138
+ /** One row a pass has read and means to delete. */
139
+ export interface PendingDelete {
140
+ key: AttributeMap;
141
+ /** The pin the read's observation supports; absent for a row that carried no id. */
142
+ guard?: RevisionGuard;
143
+ /** The objects this row names, released only if the row is confirmed gone. */
144
+ descriptors: DescriptorRef[];
145
+ /** The logical unit the row belongs to, when the caller names one. */
146
+ unit?: string;
147
+ }
148
+ /**
149
+ * What one flush needs, narrowed from the caller's options rather than taking
150
+ * the options interface itself, so the seam between the pass and its flush
151
+ * stays as small as what crosses it.
152
+ */
153
+ export interface FlushDeps {
154
+ client: DynamoDBDocumentLike;
155
+ tableName: string;
156
+ logger: Logger;
157
+ /** Names the pass in every log line, e.g. `deleteThread`. */
158
+ operation: string;
159
+ /** The partition's own leading S3 key parts; an object outside them is never deleted. */
160
+ scope: readonly string[];
161
+ /** The adapter's retry options, which already carry the caller's abort signal. */
162
+ retry?: RetryOptions;
163
+ offloader?: S3Offloader;
164
+ }
165
+ /** What one flush settled, folded into the pass's running totals by its caller. */
166
+ export interface FlushTally {
167
+ deleted: number;
168
+ refused: number;
169
+ /** The units of the refused rows, so a later row of the same unit can be skipped. */
170
+ refusedUnits: string[];
171
+ failures: Error[];
172
+ /** The descriptors of the rows confirmed gone, and only those. */
173
+ released: DescriptorRef[];
174
+ }
175
+ /**
176
+ * Delete a buffer of rows, each pinned on what the read observed of it, then
177
+ * release the objects of the rows that are confirmed gone.
178
+ *
179
+ * Accepts: `deps` — the client, the table, and the logging, retry and offload
180
+ * collaborators of the pass this flush belongs to. `rows` — the buffer,
181
+ * each row carrying its key, its pin and the objects it names.
182
+ *
183
+ * Returns: the tally — rows deleted, rows refused and the units they belonged
184
+ * to, the failures, and the descriptors released.
185
+ *
186
+ * Throws: nothing. Every failure stops the flush from starting further rows and
187
+ * is handed back in `failures` for the caller to end the pass with — the
188
+ * delete's own rejection, and equally a throw from decoding a rejection's
189
+ * attached row or from the caller's logger, neither of which is this pass's to
190
+ * absorb. A refusal never stops anything. S3 cleanup never throws either
191
+ * ({@link cleanUpS3Orphans}).
192
+ *
193
+ * Guarantees: an empty `failures` means every row of the buffer was settled.
194
+ * The flush cannot both lose a failure and hand back a clean tally, which is
195
+ * what let a pass log a deleted thread over a partition it had mostly left
196
+ * alone. At most {@link DELETE_CONCURRENCY} requests are in flight. There
197
+ * is one request per row - that is the price of a condition, which a batch
198
+ * write silently ignores - but they cost a bounded number of sequential rounds
199
+ * rather than one per row, and a partition of any size cannot open a socket
200
+ * per row. A row the pin
201
+ * turned away is left exactly as the racing writer left it, and nothing it
202
+ * names is released — a live row still names those objects.
203
+ */
204
+ export declare function flushPendingDeletes(deps: FlushDeps, rows: readonly PendingDelete[]): Promise<FlushTally>;